ZGlmZiAtLWdpdCBhL2xpYnMvZnVuY3Rpb24vZG9jL0phbWZpbGUudjIgYi9saWJzL2Z1bmN0aW9uL2RvYy9KYW1maWxlLnYyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZWUxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Z1bmN0aW9uL2RvYy9KYW1maWxlLnYyCkBAIC0wLDAgKzEsMTYgQEAKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDIgRG91Z2xhcyBHcmVnb3IgPGRvdWcuZ3JlZ29yIC1hdC0gZ21haWwuY29tPgorICAKKyMgICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorIyAgIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKK3Byb2plY3QgYm9vc3QvZG9jIDsKK2ltcG9ydCBib29zdGJvb2sgOiBib29zdGJvb2sgOworCitib29zdGJvb2sgZnVuY3Rpb24tZG9jIAorICAgIDogCisgICAgZnVuY3Rpb24ueG1sIAorICAgIDoKKyAgICAgICAgPHhzbDpwYXJhbT5ib29zdC5yb290PS4uLy4uLy4uLy4uCisgICAgICAgIDxmb3JtYXQ+cGRmOjx4c2w6cGFyYW0+Ym9vc3QudXJsLnByZWZpeD1odHRwOi8vd3d3LmJvb3N0Lm9yZy9kb2MvbGlicy9yZWxlYXNlL2RvYy9odG1sCisgICAgOworCmRpZmYgLS1naXQgYS9saWJzL2Z1bmN0aW9uL2RvYy9mYXEueG1sIGIvbGlicy9mdW5jdGlvbi9kb2MvZmFxLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWM1OTYxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9mdW5jdGlvbi9kb2MvZmFxLnhtbApAQCAtMCwwICsxLDE2MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgIENvcHlyaWdodCAoYykgMjAwMiBEb3VnbGFzIEdyZWdvciA8ZG91Zy5ncmVnb3IgLWF0LSBnbWFpbC5jb20+CisgIAorICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICAtLT4KKzwhRE9DVFlQRSBsaWJyYXJ5IFBVQkxJQyAiLS8vQm9vc3QvL0RURCBCb29zdEJvb2sgWE1MIFYxLjAvL0VOIgorICAiaHR0cDovL3d3dy5ib29zdC5vcmcvdG9vbHMvYm9vc3Rib29rL2R0ZC9ib29zdGJvb2suZHRkIj4KKzxzZWN0aW9uIGlkPSJmdW5jdGlvbi5mYXEiIGxhc3QtcmV2aXNpb249IiREYXRlOiAyMDA2LTExLTAzIDExOjQxOjEwIC0wODAwIChGcmksIDAzIE5vdiAyMDA2KSAkIj4KKyAgPHRpdGxlPkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC90aXRsZT4KKworPHFhbmRhc2V0PgorICA8cWFuZGFlbnRyeT4KKyAgICA8cXVlc3Rpb24+PHBhcmE+V2h5IGNhbid0IEkgY29tcGFyZQorICAgIDxjbGFzc25hbWU+Ym9vc3Q6OmZ1bmN0aW9uPC9jbGFzc25hbWU+IG9iamVjdHMgd2l0aAorICAgIDxjb2RlPm9wZXJhdG9yPT08L2NvZGU+IG9yCisgICAgPGNvZGU+b3BlcmF0b3IhPTwvY29kZT4/PC9wYXJhPjwvcXVlc3Rpb24+CisKKyAgICA8YW5zd2VyPgorICAgICAgPHBhcmE+Q29tcGFyaXNvbiBiZXR3ZWVuIDxjbGFzc25hbWU+Ym9vc3Q6OmZ1bmN0aW9uPC9jbGFzc25hbWU+CisgICAgICBvYmplY3RzIGNhbm5vdCBiZSBpbXBsZW1lbnRlZCAid2VsbCIsIGFuZCB0aGVyZWZvcmUgd2lsbCBub3QgYmUKKyAgICAgIGltcGxlbWVudGVkLiBUaGUgdHlwaWNhbCBzZW1hbnRpY3MgcmVxdWVzdGVkIGZvciA8Y29kZT5mID09CisgICAgICBnPC9jb2RlPiBnaXZlbiA8Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbjwvY2xhc3NuYW1lPiBvYmplY3RzCisgICAgICA8Y29kZT5mPC9jb2RlPiBhbmQgPGNvZGU+ZzwvY29kZT4gYXJlOjwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+SWYgPGNvZGU+ZjwvY29kZT4gYW5kIDxjb2RlPmc8L2NvZGU+CisgICAgICAgICAgc3RvcmUgZnVuY3Rpb24gb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlLCB1c2UgdGhhdCB0eXBlJ3MKKyAgICAgICAgICA8Y29kZT5vcGVyYXRvcj09PC9jb2RlPiB0byBjb21wYXJlCisgICAgICAgICAgdGhlbS48L3NpbXBhcmE+PC9saXN0aXRlbT4gCisKKyAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+SWYgPGNvZGU+ZjwvY29kZT4gYW5kIDxjb2RlPmc8L2NvZGU+CisgICAgICAgICAgc3RvcmUgZnVuY3Rpb24gb2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMsIHJldHVybgorICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPi48L3NpbXBhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICA8cGFyYT5UaGUgcHJvYmxlbSBvY2N1cnMgd2hlbiB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0cworICAgICAgc3RvcmVkIGJ5IGJvdGggPGNvZGU+ZjwvY29kZT4gYW5kIDxjb2RlPmc8L2NvZGU+IGRvZXNuJ3QgaGF2ZSBhbgorICAgICAgPGNvZGU+b3BlcmF0b3I9PTwvY29kZT46IHdlIHdvdWxkIGxpa2UgdGhlIGV4cHJlc3Npb24gPGNvZGU+ZiA9PQorICAgICAgZzwvY29kZT4gdG8gZmFpbCB0byBjb21waWxlLCBhcyBvY2N1cnMgd2l0aCwgZS5nLiwgdGhlIHN0YW5kYXJkCisgICAgICBjb250YWluZXJzLiBIb3dldmVyLCB0aGlzIGlzIG5vdCBpbXBsZW1lbnRhYmxlIGZvcgorICAgICAgPGNsYXNzbmFtZT5ib29zdDo6ZnVuY3Rpb248L2NsYXNzbmFtZT4gYmVjYXVzZSBpdCBuZWNlc3NhcmlseQorICAgICAgImVyYXNlcyIgc29tZSB0eXBlIGluZm9ybWF0aW9uIGFmdGVyIGl0IGhhcyBiZWVuIGFzc2lnbmVkIGEKKyAgICAgIGZ1bmN0aW9uIG9iamVjdCwgc28gaXQgY2Fubm90IHRyeSB0byBjYWxsCisgICAgICA8Y29kZT5vcGVyYXRvcj09PC9jb2RlPiBsYXRlcjogaXQgbXVzdCBlaXRoZXIgZmluZCBhIHdheSB0byBjYWxsCisgICAgICA8Y29kZT5vcGVyYXRvcj09PC9jb2RlPiBub3csIG9yIGl0IHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBjYWxsIGl0CisgICAgICBsYXRlci4gTm90ZSwgZm9yIGluc3RhbmNlLCB3aGF0IGhhcHBlbnMgaWYgeW91IHRyeSB0byBwdXQgYQorICAgICAgPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlIGludG8gYQorICAgICAgPGNsYXNzbmFtZT5ib29zdDo6ZnVuY3Rpb248L2NsYXNzbmFtZT4gb2JqZWN0OiB5b3Ugd2lsbCBnZXQgYW4KKyAgICAgIGVycm9yIGF0IHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yIG9yIGNvbnN0cnVjdG9yLCBub3QgaW4KKyAgICAgIDxjb2RlPm9wZXJhdG9yKCk8L2NvZGU+LCBiZWNhdXNlIHRoZSBmdW5jdGlvbi1jYWxsIGV4cHJlc3Npb24KKyAgICAgIG11c3QgYmUgYm91bmQgaW4gdGhlIGNvbnN0cnVjdG9yIG9yIGFzc2lnbm1lbnQgb3BlcmF0b3IuPC9wYXJhPgorCisgICAgICA8cGFyYT5UaGUgbW9zdCBwcm9taXNpbmcgYXBwcm9hY2ggaXMgdG8gZmluZCBhIG1ldGhvZCBvZgorICAgICAgZGV0ZXJtaW5pbmcgaWYgPGNvZGU+b3BlcmF0b3I9PTwvY29kZT4gY2FuIGJlIGNhbGxlZCBmb3IgYQorICAgICAgcGFydGljdWxhciB0eXBlLCBhbmQgdGhlbiBzdXBwb3J0aW5nIGl0IG9ubHkgd2hlbiBpdCBpcworICAgICAgYXZhaWxhYmxlOyBpbiBvdGhlciBzaXR1YXRpb25zLCBhbiBleGNlcHRpb24gd291bGQgYmUKKyAgICAgIHRocm93bi4gSG93ZXZlciwgdG8gZGF0ZSB0aGVyZSBpcyBubyBrbm93biB3YXkgdG8gZGV0ZWN0IGlmIGFuCisgICAgICBhcmJpdHJhcnkgb3BlcmF0b3IgZXhwcmVzc2lvbiA8Y29kZT5mID09IGc8L2NvZGU+IGlzIHN1aXRhYmx5CisgICAgICBkZWZpbmVkLiBUaGUgYmVzdCBzb2x1dGlvbiBrbm93biBoYXMgdGhlIGZvbGxvd2luZyB1bmRlc2lyYWJsZQorICAgICAgcXVhbGl0aWVzOjwvcGFyYT4KKworICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+RmFpbHMgYXQgY29tcGlsZS10aW1lIGZvciBvYmplY3RzIHdoZXJlCisgICAgICAgIDxjb2RlPm9wZXJhdG9yPT08L2NvZGU+IGlzIG5vdCBhY2Nlc3NpYmxlIChlLmcuLCBiZWNhdXNlIGl0IGlzCisgICAgICAgIDxjb2RlPnByaXZhdGU8L2NvZGU+KS48L3NpbXBhcmE+PC9saXN0aXRlbT4KKworICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+RmFpbHMgYXQgY29tcGlsZS10aW1lIGlmIGNhbGxpbmcKKyAgICAgICAgPGNvZGU+b3BlcmF0b3I9PTwvY29kZT4gaXMgYW1iaWd1b3VzLjwvc2ltcGFyYT48L2xpc3RpdGVtPgorCisgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT5BcHBlYXJzIHRvIGJlIGNvcnJlY3QgaWYgdGhlCisgICAgICAgIDxjb2RlPm9wZXJhdG9yPT08L2NvZGU+IGRlY2xhcmF0aW9uIGlzIGNvcnJlY3QsIGV2ZW4gdGhvdWdoCisgICAgICAgIDxjb2RlPm9wZXJhdG9yPT08L2NvZGU+IG1heSBub3QgY29tcGlsZS48L3NpbXBhcmE+PC9saXN0aXRlbT4KKyAgICAgIDwvb3JkZXJlZGxpc3Q+CisKKyAgICAgIDxwYXJhPkFsbCBvZiB0aGVzZSBwcm9ibGVtcyB0cmFuc2xhdGUgaW50byBmYWlsdXJlcyBpbiB0aGUKKyAgICAgIDxjbGFzc25hbWU+Ym9vc3Q6OmZ1bmN0aW9uPC9jbGFzc25hbWU+IGNvbnN0cnVjdG9ycyBvcgorICAgICAgYXNzaWdubWVudCBvcGVyYXRvciwgPGVtcGhhc2lzPmV2ZW4gaWYgdGhlIHVzZXIgbmV2ZXIgaW52b2tlcworICAgICAgb3BlcmF0b3I9PTwvZW1waGFzaXM+LiBXZSBjYW4ndCBkbyB0aGF0IHRvIHVzZXJzLjwvcGFyYT4KKworICAgICAgPHBhcmE+VGhlIG90aGVyIG9wdGlvbiBpcyB0byBwbGFjZSB0aGUgYnVyZGVuIG9uIHVzZXJzIHRoYXQgd2FudAorICAgICAgdG8gdXNlIDxjb2RlPm9wZXJhdG9yPT08L2NvZGU+LCBlLmcuLCBieSBwcm92aWRpbmcgYW4KKyAgICAgIDxjb2RlPmlzX2VxdWFsaXR5X2NvbXBhcmFibGU8L2NvZGU+IHRyYWl0IHRoZXkgbWF5CisgICAgICBzcGVjaWFsaXplLiBUaGlzIGlzIGEgd29ya2FibGUgc29sdXRpb24sIGJ1dCBpcyBkYW5nZXJvdXMgaW4KKyAgICAgIHByYWN0aWNlLCBiZWNhdXNlIGZvcmdldHRpbmcgdG8gc3BlY2lhbGl6ZSB0aGUgdHJhaXQgd2lsbCByZXN1bHQKKyAgICAgIGluIHVuZXhwZWN0ZWQgZXhjZXB0aW9ucyBiZWluZyB0aHJvd24gZnJvbQorICAgICAgPGNsYXNzbmFtZT5ib29zdDo6ZnVuY3Rpb248L2NsYXNzbmFtZT4ncworICAgICAgPGNvZGU+b3BlcmF0b3I9PTwvY29kZT4uIFRoaXMgZXNzZW50aWFsbHkgbmVnYXRlcyB0aGUgdXNlZnVsbmVzcworICAgICAgb2YgPGNvZGU+b3BlcmF0b3I9PTwvY29kZT4gaW4gdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgbW9zdAorICAgICAgZGVzaXJlZDogbXVsdGl0YXJnZXQgY2FsbGJhY2tzLiBUaGUKKyAgICAgIDxsaWJyYXJ5bmFtZT5TaWduYWxzPC9saWJyYXJ5bmFtZT4gbGlicmFyeSBoYXMgYSB3YXkgYXJvdW5kCisgICAgICB0aGlzLjwvcGFyYT4KKyAgICA8L2Fuc3dlcj4KKyAgPC9xYW5kYWVudHJ5PgorCisgIDxxYW5kYWVudHJ5PgorICAgIDxxdWVzdGlvbj48cGFyYT5JIHNlZSB2b2lkIHBvaW50ZXJzOyBpcyB0aGlzIFttZXNzXSB0eXBlIHNhZmU/PC9wYXJhPjwvcXVlc3Rpb24+CisgICAgPGFuc3dlcj4KKzxwYXJhPlllcywgPGNvbXB1dGVyb3V0cHV0PmJvb3N0OjpmdW5jdGlvbjwvY29tcHV0ZXJvdXRwdXQ+IGlzIHR5cGUKK3NhZmUgZXZlbiB0aG91Z2ggaXQgdXNlcyB2b2lkIHBvaW50ZXJzIGFuZCBwb2ludGVycyB0byBmdW5jdGlvbnMKK3JldHVybmluZyB2b2lkIGFuZCB0YWtpbmcgbm8gYXJndW1lbnRzLiBFc3NlbnRpYWxseSwgYWxsIHR5cGUKK2luZm9ybWF0aW9uIGlzIGVuY29kZWQgaW4gdGhlIGZ1bmN0aW9ucyB0aGF0IG1hbmFnZSBhbmQgaW52b2tlCitmdW5jdGlvbiBwb2ludGVycyBhbmQgZnVuY3Rpb24gb2JqZWN0cy4gT25seSB0aGVzZSBmdW5jdGlvbnMgYXJlCitpbnN0YW50aWF0ZWQgd2l0aCB0aGUgZXhhY3QgdHlwZSB0aGF0IGlzIHBvaW50ZWQgdG8gYnkgdGhlIHZvaWQKK3BvaW50ZXIgb3IgcG9pbnRlciB0byB2b2lkIGZ1bmN0aW9uLiBUaGUgcmVhc29uIHRoYXQgYm90aCBhcmUgcmVxdWlyZWQKK2lzIHRoYXQgb25lIG1heSBjYXN0IGJldHdlZW4gdm9pZCBwb2ludGVycyBhbmQgb2JqZWN0IHBvaW50ZXJzIHNhZmVseQorb3IgYmV0d2VlbiBkaWZmZXJlbnQgdHlwZXMgb2YgZnVuY3Rpb24gcG9pbnRlcnMgKHByb3ZpZGVkIHlvdSBkb24ndAoraW52b2tlIGEgZnVuY3Rpb24gcG9pbnRlciB3aXRoIHRoZSB3cm9uZyB0eXBlKS4gIDwvcGFyYT4KKyAgICA8L2Fuc3dlcj4KKyAgPC9xYW5kYWVudHJ5PgorCisgIDxxYW5kYWVudHJ5PgorICAgIDxxdWVzdGlvbj48cGFyYT5XaHkgYXJlIHRoZXJlIHdvcmthcm91bmRzIGZvciB2b2lkIHJldHVybnM/IEMrKyBhbGxvd3MgdGhlbSE8L3BhcmE+PC9xdWVzdGlvbj4KKyAgICA8YW5zd2VyPjxwYXJhPlZvaWQgcmV0dXJucyBhcmUgcGVybWl0dGVkIGJ5IHRoZSBDKysgc3RhbmRhcmQsIGFzIGluIHRoaXMgY29kZSBzbmlwcGV0OgorPHByb2dyYW1saXN0aW5nPnZvaWQgZigpOwordm9pZCBnKCkgeyByZXR1cm4gZigpOyB9PC9wcm9ncmFtbGlzdGluZz4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4gVGhpcyBpcyBhIHZhbGlkIHVzYWdlIG9mIDxjb21wdXRlcm91dHB1dD5ib29zdDo6ZnVuY3Rpb248L2NvbXB1dGVyb3V0cHV0PiBiZWNhdXNlIHZvaWQgcmV0dXJucyBhcmUgbm90IHVzZWQuIFdpdGggdm9pZCByZXR1cm5zLCB3ZSB3b3VsZCBhdHRlbXB0aW5nIHRvIGNvbXBpbGUgaWxsLWZvcm1lZCBjb2RlIHNpbWlsYXIgdG86Cis8cHJvZ3JhbWxpc3Rpbmc+aW50IGYoKTsKK3ZvaWQgZygpIHsgcmV0dXJuIGYoKTsgfTwvcHJvZ3JhbWxpc3Rpbmc+Cis8L3BhcmE+CisKKzxwYXJhPiBJbiBlc3NlbmNlLCBub3QgdXNpbmcgdm9pZCByZXR1cm5zIGFsbG93cworPGNvbXB1dGVyb3V0cHV0PmJvb3N0OjpmdW5jdGlvbjwvY29tcHV0ZXJvdXRwdXQ+IHRvIHN3YWxsb3cgYSByZXR1cm4gdmFsdWUuIFRoaXMgaXMKK2NvbnNpc3RlbnQgd2l0aCBhbGxvd2luZyB0aGUgdXNlciB0byBhc3NpZ24gYW5kIGludm9rZSBmdW5jdGlvbnMgYW5kCitmdW5jdGlvbiBvYmplY3RzIHdpdGggcGFyYW1ldGVycyB0aGF0IGRvbid0IGV4YWN0bHkgbWF0Y2guPC9wYXJhPgorCisgICAgPC9hbnN3ZXI+CisgIDwvcWFuZGFlbnRyeT4KKworICA8cWFuZGFlbnRyeT4KKyAgICA8cXVlc3Rpb24+PHBhcmE+V2h5IChmdW5jdGlvbikgY2xvbmluZz88L3BhcmE+PC9xdWVzdGlvbj4KKyAgICA8YW5zd2VyPgorICAgICAgPHBhcmE+SW4gTm92ZW1iZXIgYW5kIERlY2VtYmVyIG9mIDIwMDAsIHRoZSBpc3N1ZSBvZiBjbG9uaW5nCisgICAgICB2cy4gcmVmZXJlbmNlIGNvdW50aW5nIHdhcyBkZWJhdGVkIGF0IGxlbmd0aCBhbmQgaXQgd2FzIGRlY2lkZWQKKyAgICAgIHRoYXQgY2xvbmluZyBnYXZlIG1vcmUgcHJlZGljdGFibGUgc2VtYW50aWNzLiBJIHdvbid0IHJlaGFzaCB0aGUKKyAgICAgIGRpc2N1c3Npb24gaGVyZSwgYnV0IGlmIGl0IGNsb25pbmcgaXMgaW5jb3JyZWN0IGZvciBhIHBhcnRpY3VsYXIKKyAgICAgIGFwcGxpY2F0aW9uIGEgcmVmZXJlbmNlLWNvdW50aW5nIGFsbG9jYXRvciBjb3VsZCBiZSB1c2VkLjwvcGFyYT4KKyAgICA8L2Fuc3dlcj4KKyAgPC9xYW5kYWVudHJ5PgorCisgIDxxYW5kYWVudHJ5PgorICAgIDxxdWVzdGlvbj48cGFyYT5Ib3cgbXVjaCBvdmVyaGVhZCBkb2VzIGEgY2FsbCB0aHJvdWdoIDxjb2RlPjxjbGFzc25hbWU+Ym9vc3Q6OmZ1bmN0aW9uPC9jbGFzc25hbWU+PC9jb2RlPiBpbmN1cj88L3BhcmE+PC9xdWVzdGlvbj4KKyAgICA8YW5zd2VyPgorICAgICAgPHBhcmE+VGhlIGNvc3Qgb2YgPGNvZGU+Ym9vc3Q6OmZ1bmN0aW9uPC9jb2RlPiBjYW4gYmUgcmVhc29uYWJseQorICAgICAgY29uc2lzdGVudGx5IG1lYXN1cmVkIGF0IGFyb3VuZCAyMG5zICsvLSAxMCBucyBvbiBhIG1vZGVybiA+MkdIegorICAgICAgcGxhdGZvcm0gdmVyc3VzIGRpcmVjdGx5IGlubGluaW5nIHRoZSBjb2RlLjwvcGFyYT4KKworICAgICAgPHBhcmE+SG93ZXZlciwgdGhlIHBlcmZvcm1hbmNlIG9mIHlvdXIgYXBwbGljYXRpb24gbWF5IGJlbmVmaXQKKyAgICAgIGZyb20gb3IgYmUgZGlzYWR2YW50YWdlZCBieSA8Y29kZT5ib29zdDo6ZnVuY3Rpb248L2NvZGU+CisgICAgICBkZXBlbmRpbmcgb24gaG93IHlvdXIgQysrIG9wdGltaXNlciBvcHRpbWlzZXMuICBTaW1pbGFyIHRvIGEKKyAgICAgIHN0YW5kYXJkIGZ1bmN0aW9uIHBvaW50ZXIsIGRpZmZlcmVuY2VzIG9mIG9yZGVyIG9mIDEwJSBoYXZlIGJlZW4KKyAgICAgIG5vdGVkIHRvIHRoZSBiZW5lZml0IG9yIGRpc2FkdmFudGFnZSBvZiB1c2luZworICAgICAgPGNvZGU+Ym9vc3Q6OmZ1bmN0aW9uPC9jb2RlPiB0byBjYWxsIGEgZnVuY3Rpb24gdGhhdCBjb250YWlucyBhCisgICAgICB0aWdodCBsb29wIGRlcGVuZGluZyBvbiB5b3VyIGNvbXBpbGF0aW9uIGNpcmN1bXN0YW5jZXMuPC9wYXJhPgorICAgICAKKyAgICAgIDxwYXJhPltBbnN3ZXIgcHJvdmlkZWQgYnkgTWF0dCBIdXJkLiBTZWUgPHVsaW5rIHVybD0iaHR0cDovL2FydGljbGUuZ21hbmUub3JnL2dtYW5lLmNvbXAubGliLmJvb3N0LmRldmVsLzMzMjc4Ii8+XTwvcGFyYT4KKyAgICA8L2Fuc3dlcj4KKyAgPC9xYW5kYWVudHJ5PgorPC9xYW5kYXNldD4gCisKKzwvc2VjdGlvbj4KZGlmZiAtLWdpdCBhL2xpYnMvZnVuY3Rpb24vZG9jL2Z1bmN0aW9uLnhtbCBiL2xpYnMvZnVuY3Rpb24vZG9jL2Z1bmN0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2YyOWZjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9mdW5jdGlvbi9kb2MvZnVuY3Rpb24ueG1sCkBAIC0wLDAgKzEsNjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IURPQ1RZUEUgbGlicmFyeSBQVUJMSUMgIi0vL0Jvb3N0Ly9EVEQgQm9vc3RCb29rIFhNTCBWMS4wLy9FTiIKKyAgImh0dHA6Ly93d3cuYm9vc3Qub3JnL3Rvb2xzL2Jvb3N0Ym9vay9kdGQvYm9vc3Rib29rLmR0ZCI+Cis8bGlicmFyeSBuYW1lPSJGdW5jdGlvbiIgZGlybmFtZT0iZnVuY3Rpb24iIGlkPSJmdW5jdGlvbiIgCisgICAgICAgICBsYXN0LXJldmlzaW9uPSIkRGF0ZTogMjAwNC0wNy0yNCAxOTo1OTozMCAtMDcwMCAoU2F0LCAyNCBKdWwgMjAwNCkgJCIgCisgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+Cis8bGlicmFyeWluZm8+CisgIDxhdXRob3I+CisgICAgPGZpcnN0bmFtZT5Eb3VnbGFzPC9maXJzdG5hbWU+CisgICAgPHN1cm5hbWU+R3JlZ29yPC9zdXJuYW1lPgorICAgIDxlbWFpbD5kZ3JlZ29yIC1hdC0gY3MuaW5kaWFuYS5lZHU8L2VtYWlsPgorICA8L2F1dGhvcj4KKworICA8Y29weXJpZ2h0PgorICAgIDx5ZWFyPjIwMDE8L3llYXI+CisgICAgPHllYXI+MjAwMjwveWVhcj4KKyAgICA8eWVhcj4yMDAzPC95ZWFyPgorICAgIDx5ZWFyPjIwMDQ8L3llYXI+CisgICAgPGhvbGRlcj5Eb3VnbGFzIEdyZWdvcjwvaG9sZGVyPgorICA8L2NvcHlyaWdodD4KKworICA8bGVnYWxub3RpY2U+CisgICAgPHBhcmE+VXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdAorICAgIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlCisgICAgPGZpbGVuYW1lPkxJQ0VOU0VfMV8wLnR4dDwvZmlsZW5hbWU+IG9yIGNvcHkgYXQgPHVsaW5rCisgICAgdXJsPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQiPmh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dDwvdWxpbms+KTwvcGFyYT4KKyAgPC9sZWdhbG5vdGljZT4KKworICA8bGlicmFyeXB1cnBvc2U+RnVuY3Rpb24gb2JqZWN0IHdyYXBwZXJzIGZvciBkZWZlcnJlZCBjYWxscyBvciBjYWxsYmFja3M8L2xpYnJhcnlwdXJwb3NlPgorICA8bGlicmFyeWNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5OmhpZ2hlci1vcmRlciIvPgorPC9saWJyYXJ5aW5mbz4KKworPHRpdGxlPkJvb3N0LkZ1bmN0aW9uPC90aXRsZT4KKworPHNlY3Rpb24gaWQ9ImZ1bmN0aW9uLmludHJvIj4KKzx0aXRsZT5JbnRyb2R1Y3Rpb248L3RpdGxlPiAKKzxwYXJhPlRoZSBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5IGNvbnRhaW5zIGEgZmFtaWx5IG9mIGNsYXNzIHRlbXBsYXRlcwordGhhdCBhcmUgZnVuY3Rpb24gb2JqZWN0IHdyYXBwZXJzLiBUaGUgbm90aW9uIGlzIHNpbWlsYXIgdG8gYQorZ2VuZXJhbGl6ZWQgY2FsbGJhY2suIEl0IHNoYXJlcyBmZWF0dXJlcyB3aXRoIGZ1bmN0aW9uIHBvaW50ZXJzIGluCit0aGF0IGJvdGggZGVmaW5lIGEgY2FsbCBpbnRlcmZhY2UgKGUuZy4sIGEgZnVuY3Rpb24gdGFraW5nIHR3byBpbnRlZ2VyCithcmd1bWVudHMgYW5kIHJldHVybmluZyBhIGZsb2F0aW5nLXBvaW50IHZhbHVlKSB0aHJvdWdoIHdoaWNoIHNvbWUKK2ltcGxlbWVudGF0aW9uIGNhbiBiZSBjYWxsZWQsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBpbnZva2VkCittYXkgY2hhbmdlIHRocm91Z2hvdXQgdGhlIGNvdXJzZSBvZiB0aGUgcHJvZ3JhbS48L3BhcmE+CisKKzxwYXJhPiBHZW5lcmFsbHksIGFueSBwbGFjZSBpbiB3aGljaCBhIGZ1bmN0aW9uIHBvaW50ZXIgd291bGQgYmUgdXNlZAordG8gZGVmZXIgYSBjYWxsIG9yIG1ha2UgYSBjYWxsYmFjaywgQm9vc3QuRnVuY3Rpb24gY2FuIGJlIHVzZWQgaW5zdGVhZAordG8gYWxsb3cgdGhlIHVzZXIgZ3JlYXRlciBmbGV4aWJpbGl0eSBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCit0YXJnZXQuIFRhcmdldHMgY2FuIGJlIGFueSAnY29tcGF0aWJsZScgZnVuY3Rpb24gb2JqZWN0IChvciBmdW5jdGlvbgorcG9pbnRlciksIG1lYW5pbmcgdGhhdCB0aGUgYXJndW1lbnRzIHRvIHRoZSBpbnRlcmZhY2UgZGVzaWduYXRlZCBieQorQm9vc3QuRnVuY3Rpb24gY2FuIGJlIGNvbnZlcnRlZCB0byB0aGUgYXJndW1lbnRzIG9mIHRoZSB0YXJnZXQKK2Z1bmN0aW9uIG9iamVjdC48L3BhcmE+Cis8L3NlY3Rpb24+CisKKzx4aTppbmNsdWRlIGhyZWY9Imhpc3RvcnkueG1sIi8+Cis8eGk6aW5jbHVkZSBocmVmPSJ0dXRvcmlhbC54bWwiLz4KKzx4aTppbmNsdWRlIGhyZWY9InJlZmVyZW5jZS54bWwiLz4KKzx4aTppbmNsdWRlIGhyZWY9ImZhcS54bWwiLz4KKzx4aTppbmNsdWRlIGhyZWY9Im1pc2MueG1sIi8+Cis8eGk6aW5jbHVkZSBocmVmPSJ0ZXN0cy54bWwiLz4KKworPC9saWJyYXJ5PgpkaWZmIC0tZ2l0IGEvbGlicy9mdW5jdGlvbi9kb2MvaGlzdG9yeS54bWwgYi9saWJzL2Z1bmN0aW9uL2RvYy9oaXN0b3J5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2YxM2UyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9mdW5jdGlvbi9kb2MvaGlzdG9yeS54bWwKQEAgLTAsMCArMSwxNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgICBDb3B5cmlnaHQgKGMpIDIwMDIgRG91Z2xhcyBHcmVnb3IgPGRvdWcuZ3JlZ29yIC1hdC0gZ21haWwuY29tPgorICAKKyAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAgIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyAgIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAgLS0+Cis8IURPQ1RZUEUgbGlicmFyeSBQVUJMSUMgIi0vL0Jvb3N0Ly9EVEQgQm9vc3RCb29rIFhNTCBWMS4wLy9FTiIKKyAgImh0dHA6Ly93d3cuYm9vc3Qub3JnL3Rvb2xzL2Jvb3N0Ym9vay9kdGQvYm9vc3Rib29rLmR0ZCI+Cis8c2VjdGlvbiBpZD0iZnVuY3Rpb24uaGlzdG9yeSIgbGFzdC1yZXZpc2lvbj0iJERhdGU6IDIwMTMtMDYtMTUgMDA6MDY6MjYgLTA3MDAgKFNhdCwgMTUgSnVuIDIwMTMpICQiPgorICA8dGl0bGU+SGlzdG9yeSAmYW1wOyBDb21wYXRpYmlsaXR5IE5vdGVzPC90aXRsZT4KKworPGl0ZW1pemVkbGlzdCBzcGFjaW5nPSJjb21wYWN0Ij4KKworICA8bGlzdGl0ZW0+PHBhcmE+PGJvbGQ+VmVyc2lvbiAxLjUyLjA8L2JvbGQ+OiA8L3BhcmE+CisgICAgPGl0ZW1pemVkbGlzdCBzcGFjaW5nPSJjb21wYWN0Ij4KKyAgICAgIDxsaXN0aXRlbT48cGFyYT5Nb3ZlIGNvbnN0cnVjdG9ycyBhbmQgbW92ZSBhc3NpZ25tZW50IAorICAgICAgb3BlcmF0b3JzIGFkZGVkIChvbmx5IGZvciBjb21waWxlcnMgd2l0aCBDKysxMSBydmFsdWUgCisgICAgICByZWZlcmVuY2VzIHN1cHBvcnQpLiBPcmlnaW5hbCBwYXRjaAorICAgICAgY29udHJpYnV0ZWQgYnkgQW50b255IFBvbHVraGluLjwvcGFyYT48L2xpc3RpdGVtPgorICAgIDwvaXRlbWl6ZWRsaXN0PgorICA8L2xpc3RpdGVtPgorCisgIDxsaXN0aXRlbT48cGFyYT48Ym9sZD5WZXJzaW9uIDEuMzcuMDwvYm9sZD46IDwvcGFyYT4KKyAgICA8aXRlbWl6ZWRsaXN0IHNwYWNpbmc9ImNvbXBhY3QiPgorICAgICAgPGxpc3RpdGVtPjxwYXJhPkltcHJvdmVkIHRoZSBwZXJmb3JtYW5jZSBvZiBCb29zdC5GdW5jdGlvbidzCisgICAgICBzd2FwKCkgb3BlcmF0aW9uIGZvciBsYXJnZSBmdW5jdGlvbiBvYmplY3RzLiBPcmlnaW5hbCBwYXRjaAorICAgICAgY29udHJpYnV0ZWQgYnkgTmllbHMgRGVra2VyLjwvcGFyYT48L2xpc3RpdGVtPgorCisgICAgICA8bGlzdGl0ZW0+PHBhcmE+QWRkZWQgYSBuZXcgaGVhZGVyICZsdDtib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90eXBlb2YuaHBwJmd0OyB0aGF0IHByb3ZpZGVzIHN1cHBvcnQgZm9yIHVzaW5nIHRoZSBCb29zdC5UeXBlb2YgbGlicmFyeSBvbiBCb29zdC5GdW5jdGlvbiBvYmplY3RzLjwvcGFyYT48L2xpc3RpdGVtPgorCisgICAgICA8bGlzdGl0ZW0+PHBhcmE+QWRkZWQgYSBuZXcgaGVhZGVyICZsdDtib29zdC9mdW5jdGlvbi9mdW5jdGlvbl9md2QuaHBwJmd0OyB0aGF0IHByb3ZpZGVzIHN1cHBvcnQgZm9yIHVzaW5nIHRoZSBCb29zdC5UeXBlb2YgbGlicmFyeSBvbiBCb29zdC5GdW5jdGlvbiBvYmplY3RzLjwvcGFyYT48L2xpc3RpdGVtPgorCisgICAgICA8bGlzdGl0ZW0+PHBhcmE+VGhlIDxtZXRob2RuYW1lIGFsdD0iYm9vc3Q6OmZ1bmN0aW9uOjp0YXJnZXQiPnRhcmdldDwvbWV0aG9kbmFtZT4oKQorICAgICAgZnVuY3Rpb24gbm93IHJlc3BlY3RzIHRoZSBjdi1xdWFsaWZpZXJzIG9mIGZ1bmN0aW9uIG9iamVjdHMKKyAgICAgIHN0b3JlZCBieSByZWZlcmVuY2UKKyAgICAgICh1c2luZyA8Y2xhc3NuYW1lPmJvb3N0OjpyZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPiksIHN1Y2gKKyAgICAgIHRoYXQgYSByZWZlcmVuY2UgdG8gYSA8Y29kZT5jb25zdDwvY29kZT4gZnVuY3Rpb24gb2JqZWN0IGNhbm5vdAorICAgICAgYmUgYWNjZXNzZWQgYXMgYSByZWZlcmVuY2UgdG8gYSBub24tPGNvZGU+Y29uc3Q8L2NvZGU+IGZ1bmN0aW9uCisgICAgICBvYmplY3QuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgPC9pdGVtaXplZGxpc3Q+CisgIDwvbGlzdGl0ZW0+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxib2xkPlZlcnNpb24gMS4zNi4wPC9ib2xkPjogPC9wYXJhPgorICAgIDxpdGVtaXplZGxpc3Qgc3BhY2luZz0iY29tcGFjdCI+CisgICAgICA8bGlzdGl0ZW0+PHBhcmE+Qm9vc3QuRnVuY3Rpb24gbm93IGltcGxlbWVudHMgYWxsb2NhdG9yIHN1cHBvcnQKKyAgICAgIGluIHRoZSBzYW1lIHdheSB0aGF0IGlzIGlzIHByb3ZpZGVkIGluIEMrKzB4LCBiYXNlZCBvbiBDKysKKyAgICAgIGNvbW1pdHRlZQorICAgICAgcHJvcG9zYWwgPHVsaW5rIHVybD0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9wYXBlcnMvMjAwNy9uMjMwOC5odG1sIj5OMjMwODwvdWxpbms+LiBUaGlzCisgICAgICBjaGFuZ2UgcmVtb3ZlcyB0aGUgPGNvbXB1dGVyb3V0cHV0PkFsbG9jYXRvcjwvY29tcHV0ZXJvdXRwdXQ+CisgICAgICB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YgPGNsYXNzbmFtZT5ib29zdDo6ZnVuY3Rpb248L2NsYXNzbmFtZT4gaW4KKyAgICAgIGZhdm9yIG9mIGEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhbiBhcmd1bWVudC4gV2hpbGUgdGhpcyBpcyBhCisgICAgICBiYWNrd2FyZC1pbmNvbXBhdGlibGUgY2hhbmdlLCBpdCBpcyBsaWtlbHkgdG8gYWZmZWN0IG9ubHkgYSBmZXcKKyAgICAgIHVzZXJzLiBUaGlzIGNoYW5nZSB0byBGdW5jdGlvbiB3YXMgY29udHJpYnV0ZWQgYnkgRW1pbAorICAgICAgRG90Y2hldnNraSwgd2hpY2ggYWxzbyBhdXRob3JlZCB0aGUgY29ycmVzcG9uZGluZyBDKysgY29tbWl0dGVlCisgICAgICBwcm9wb3NhbC48L3BhcmE+PC9saXN0aXRlbT4KKyAgICA8L2l0ZW1pemVkbGlzdD4KKyAgPC9saXN0aXRlbT4KKworICA8bGlzdGl0ZW0+PHBhcmE+PGJvbGQ+VmVyc2lvbiAxLjM0LjA8L2JvbGQ+OiA8L3BhcmE+IAorICAgIDxpdGVtaXplZGxpc3Qgc3BhY2luZz0iY29tcGFjdCI+CisgICAgICA8bGlzdGl0ZW0+PHBhcmE+Qm9vc3QuRnVuY3Rpb24gbm93IGltcGxlbWVudHMgYSBzbWFsbCBidWZmZXIgb3B0aW1pemF0aW9uLCB3aGljaCBjYW4gZHJhc3RpY2FsbHkgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugd2hlbiBjb3B5aW5nIG9yIGNvbnN0cnVjdGlvbiBCb29zdC5GdW5jdGlvbiBvYmplY3RzIHN0b3Jpbmcgc21hbGwgZnVuY3Rpb24gb2JqZWN0cy4gRm9yIGluc3RhbmNlLCA8Y29kZT5iaW5kKCZhbXA7WDpmb28sICZhbXA7eCwgXzEsIF8yKTwvY29kZT4gcmVxdWlyZXMgbm8gaGVhcCBhbGxvY2F0aW9uIHdoZW4gcGxhY2VkIGludG8gYSBCb29zdC5GdW5jdGlvbiBvYmplY3QuIE5vdGUgdGhhdCBzb21lIGV4Y2VwdGlvbi1zYWZldHkgZ3VhcmFudGVlcyBoYXZlIGNoYW5nZWQ6IGFzc2lnbm1lbnQgcHJvdmlkZXMgdGhlIGJhc2ljIGV4Y2VwdGlvbiBndWFyYW50ZWUgYW5kIDxjb2RlPnN3YXAoKTwvY29kZT4gbWF5IHRocm93LjwvcGFyYT48L2xpc3RpdGVtPgorICAgIDwvaXRlbWl6ZWRsaXN0PgorICA8L2xpc3RpdGVtPgorCisgIDxsaXN0aXRlbT48cGFyYT48Ym9sZD5WZXJzaW9uIDEuMzAuMDwvYm9sZD46IDwvcGFyYT4gCisgICAgPGl0ZW1pemVkbGlzdCBzcGFjaW5nPSJjb21wYWN0Ij4KKyAgICAgIDxsaXN0aXRlbT48cGFyYT5BbGwgZmVhdHVyZXMgZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEuMjkuMCBoYXZlCisgICAgICBiZWVuIHJlbW92ZWQgZnJvbSBCb29zdC5GdW5jdGlvbi48L3BhcmE+PC9saXN0aXRlbT4KKyAKKyAgICAgIDxsaXN0aXRlbT48cGFyYT48Y29kZT48Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbjwvY2xhc3NuYW1lPjwvY29kZT4KKyAgICAgIGFuZCA8Y29kZT48Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbk48L2NsYXNzbmFtZT48L2NvZGU+IG9iamVjdHMKKyAgICAgIGNhbiBiZSBhc3NpZ25lZCB0byAwIChzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byBjYWxsaW5nCisgICAgICA8Y29kZT48bWV0aG9kbmFtZQorICAgICAgYWx0PSJib29zdDo6ZnVuY3Rpb246OmNsZWFyIj5jbGVhcjwvbWV0aG9kbmFtZT4oKTwvY29kZT4pIGFuZAorICAgICAgY29tcGFyZWQgYWdhaW5zdCAwIChzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byBjYWxsaW5nCisgICAgICA8Y29kZT48bWV0aG9kbmFtZQorICAgICAgYWx0PSJib29zdDo6ZnVuY3Rpb246OmVtcHR5Ij5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4pLjwvcGFyYT48L2xpc3RpdGVtPgorCisgICAgICA8bGlzdGl0ZW0+PHBhcmE+VGhlIEJvb3N0LkZ1bmN0aW9uIGNvZGUgaXMgbm93IGdlbmVyYXRlZAorICAgICAgZW50aXJlbHkgYnkgdGhlIDxsaWJyYXJ5bmFtZT5QcmVwcm9jZXNzb3I8L2xpYnJhcnluYW1lPiBsaWJyYXJ5LAorICAgICAgc28gaXQgaXMgbm93IHBvc3NpYmxlIHRvIGdlbmVyYXRlCisgICAgICA8Y29kZT48Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbjwvY2xhc3NuYW1lPjwvY29kZT4gYW5kCisgICAgICA8Y29kZT48Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbk48L2NsYXNzbmFtZT48L2NvZGU+IGNsYXNzCisgICAgICB0ZW1wbGF0ZXMgZm9yIGFueSBudW1iZXIgb2YgYXJndW1lbnRzLjwvcGFyYT48L2xpc3RpdGVtPgorCisgICAgICA8bGlzdGl0ZW0+PHBhcmE+VGhlCisgICAgICA8Y2xhc3NuYW1lPmJvb3N0OjpiYWRfZnVuY3Rpb25fY2FsbDwvY2xhc3NuYW1lPiBleGNlcHRpb24gY2xhc3MKKyAgICAgIHdhcyBpbnRyb2R1Y2VkLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgPC9pdGVtaXplZGxpc3Q+CisgIDwvbGlzdGl0ZW0+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxib2xkPlZlcnNpb24gMS4yOS4wPC9ib2xkPjoKKyAgQm9vc3QuRnVuY3Rpb24gaGFzIGJlZW4gcGFydGlhbGx5IHJlZGVzaWduZWQgdG8gbWluaW1pemUgdGhlCisgIGludGVyZmFjZSBhbmQgbWFrZSBpdCBjbGVhbmVyLiBTZXZlcmFsIHNlbGRvbS0gb3IgbmV2ZXItdXNlZAorICBmZWF0dXJlcyBvZiB0aGUgb2xkZXIgQm9vc3QuRnVuY3Rpb24gaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwKKyAgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUuIEhlcmUgaXMgYSBsaXN0IG9mIGZlYXR1cmVzIHRoYXQgaGF2ZQorICBiZWVuIGRlcHJlY2F0ZWQsIHRoZSBsaWtlbHkgaW1wYWN0IG9mIHRoZSBkZXByZWNhdGlvbnMsIGFuZCBob3cgdG8KKyAgYWRqdXN0IHlvdXIgY29kZToKKworPGl0ZW1pemVkbGlzdCBzcGFjaW5nPSJjb21wYWN0Ij4KKyAgPGxpc3RpdGVtPjxwYXJhPlRoZSA8Y29tcHV0ZXJvdXRwdXQ+Ym9vc3Q6OmZ1bmN0aW9uPC9jb21wdXRlcm91dHB1dD4gY2xhc3MgdGVtcGxhdGUgc3ludGF4IGhhcworICBjaGFuZ2VkLiBUaGUgb2xkIHN5bnRheCwgZS5nLiwgPGNvbXB1dGVyb3V0cHV0PmJvb3N0OjpmdW5jdGlvbiZsdDtpbnQsIGZsb2F0LAorICBkb3VibGUsIHN0ZDo6c3RyaW5nJmd0OzwvY29tcHV0ZXJvdXRwdXQ+LCBoYXMgYmVlbiBjaGFuZ2VkIHRvIGEgbW9yZSBuYXR1cmFsCisgIHN5bnRheCA8Y29tcHV0ZXJvdXRwdXQ+Ym9vc3Q6OmZ1bmN0aW9uJmx0O2ludCAoZmxvYXQsIGRvdWJsZSwKKyAgc3RkOjpzdHJpbmcpJmd0OzwvY29tcHV0ZXJvdXRwdXQ+LCB3aGVyZSBhbGwgcmV0dXJuIGFuZCBhcmd1bWVudCB0eXBlcyBhcmUKKyAgZW5jb2RlZCBpbiBhIHNpbmdsZSBmdW5jdGlvbiB0eXBlIHBhcmFtZXRlci4gQW55IG90aGVyIHRlbXBsYXRlCisgIHBhcmFtZXRlcnMgKGUuZy4sIHRoZSA8Y29tcHV0ZXJvdXRwdXQ+QWxsb2NhdG9yPC9jb21wdXRlcm91dHB1dD4pIGZvbGxvdyB0aGlzIHNpbmdsZQorICBwYXJhbWV0ZXIuPC9wYXJhPgorCisgIDxwYXJhPiBUaGUgcmVzb2x1dGlvbiB0byB0aGlzIGNoYW5nZSBkZXBlbmRzIG9uIHRoZQorICBhYmlsaXRpZXMgb2YgeW91ciBjb21waWxlcjogaWYgeW91ciBjb21waWxlciBzdXBwb3J0cyB0ZW1wbGF0ZQorICBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGFuZCBjYW4gcGFyc2UgZnVuY3Rpb24gdHlwZXMgKG1vc3QgZG8pLCBtb2RpZnkgCisgIHlvdXIgY29kZSB0byB1c2UgdGhlIG5ld2VyCisgIHN5bnRheCAocHJlZmVyYWJsZSkgb3IgZGlyZWN0bHkgdXNlIG9uZSBvZiB0aGUKKyAgPGNvbXB1dGVyb3V0cHV0PmZ1bmN0aW9uTjwvY29tcHV0ZXJvdXRwdXQ+IGNsYXNzZXMgd2hvc2Ugc3ludGF4IGhhcyBub3QKKyAgY2hhbmdlZC4gSWYgeW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IHRlbXBsYXRlIHBhcnRpYWwKKyAgc3BlY2lhbGl6YXRpb24gb3IgZnVuY3Rpb24gdHlwZXMsIHlvdSBtdXN0IHRha2UgdGhlIGxhdHRlciBvcHRpb24gYW5kIAorICB1c2UgdGhlIG51bWJlcmVkIEJvb3N0LkZ1bmN0aW9uIGNsYXNzZXMuIFRoaXMgb3B0aW9uIG1lcmVseSByZXF1aXJlcyAKKyAgY2hhbmdpbmcgdHlwZXMgc3VjaCBhcyA8Y29tcHV0ZXJvdXRwdXQ+Ym9vc3Q6OmZ1bmN0aW9uJmx0O3ZvaWQsIGludCwgaW50Jmd0OzwvY29tcHV0ZXJvdXRwdXQ+CisgIHRvIDxjb21wdXRlcm91dHB1dD5ib29zdDo6ZnVuY3Rpb24yJmx0O3ZvaWQsIGludCwgaW50Jmd0OzwvY29tcHV0ZXJvdXRwdXQ+IChhZGRpbmcgdGhlIG51bWJlciBvZgorICBmdW5jdGlvbiBhcmd1bWVudHMgdG8gdGhlIGVuZCBvZiB0aGUgY2xhc3MgbmFtZSkuPC9wYXJhPgorCisgIDxwYXJhPiBTdXBwb3J0IGZvciB0aGUgb2xkIHN5bnRheCB3aXRoIHRoZQorICA8Y29tcHV0ZXJvdXRwdXQ+Ym9vc3Q6OmZ1bmN0aW9uPC9jb21wdXRlcm91dHB1dD4gY2xhc3MgdGVtcGxhdGUgd2lsbCBwZXJzaXN0IGZvciBhIHNob3J0CisgIHdoaWxlLCBidXQgd2lsbCBldmVudHVhbGx5IGJlIHJlbW92ZWQgc28gdGhhdCB3ZSBjYW4gcHJvdmlkZSBiZXR0ZXIKKyAgZXJyb3IgbWVzc2FnZXMgYW5kIGxpbmsgY29tcGF0aWJpbGl0eS4gPC9wYXJhPjwvbGlzdGl0ZW0+IAorCisgIDxsaXN0aXRlbT48cGFyYT5UaGUgaW52b2NhdGlvbgorICBwb2xpY3kgdGVtcGxhdGUgcGFyYW1ldGVyICg8Y29tcHV0ZXJvdXRwdXQ+UG9saWN5PC9jb21wdXRlcm91dHB1dD4pIGhhcyBiZWVuIGRlcHJlY2F0ZWQKKyAgYW5kIHdpbGwgYmUgcmVtb3ZlZC4gVGhlcmUgaXMgbm8gZGlyZWN0IGVxdWl2YWxlbnQgdG8gdGhpcyByYXJlbHkKKyAgdXNlZCBmZWF0dXJlLjwvcGFyYT48L2xpc3RpdGVtPiAKKworICA8bGlzdGl0ZW0+PHBhcmE+VGhlIG1peGluIHRlbXBsYXRlIHBhcmFtZXRlcgorICAoPGNvbXB1dGVyb3V0cHV0Pk1peGluPC9jb21wdXRlcm91dHB1dD4pIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZC4gVGhlcmUKKyAgaXMgbm90IGRpcmVjdCBlcXVpdmFsZW50IHRvIHRoaXMgcmFyZWx5IHVzZWQgZmVhdHVyZS48L3BhcmE+PC9saXN0aXRlbT4gCisKKyAgPGxpc3RpdGVtPjxwYXJhPlRoZQorICA8Y29tcHV0ZXJvdXRwdXQ+c2V0PC9jb21wdXRlcm91dHB1dD4gbWV0aG9kcyBoYXZlIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZQorICByZW1vdmVkLiBVc2UgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IgaW5zdGVhZC48L3BhcmE+PC9saXN0aXRlbT4KKzwvaXRlbWl6ZWRsaXN0PgorPC9wYXJhPgorPC9saXN0aXRlbT4KKzwvaXRlbWl6ZWRsaXN0PgorPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvbGlicy9mdW5jdGlvbi9kb2MvbWlzYy54bWwgYi9saWJzL2Z1bmN0aW9uL2RvYy9taXNjLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGY0ZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9mdW5jdGlvbi9kb2MvbWlzYy54bWwKQEAgLTAsMCArMSw3MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgIENvcHlyaWdodCAoYykgMjAwMiBEb3VnbGFzIEdyZWdvciA8ZG91Zy5ncmVnb3IgLWF0LSBnbWFpbC5jb20+CisgIAorICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICAtLT4KKzwhRE9DVFlQRSBsaWJyYXJ5IFBVQkxJQyAiLS8vQm9vc3QvL0RURCBCb29zdEJvb2sgWE1MIFYxLjAvL0VOIgorICAiaHR0cDovL3d3dy5ib29zdC5vcmcvdG9vbHMvYm9vc3Rib29rL2R0ZC9ib29zdGJvb2suZHRkIj4KKzxzZWN0aW9uIGlkPSJmdW5jdGlvbi5taXNjIiBsYXN0LXJldmlzaW9uPSIkRGF0ZTogMjAwOC0wNy0xNCAxMTozMjoyOSAtMDcwMCAoTW9uLCAxNCBKdWwgMjAwOCkgJCI+CisgIDx0aXRsZT5NaXNjZWxsYW5lb3VzIE5vdGVzPC90aXRsZT4KKworICA8c2VjdGlvbj4KKyAgICA8dGl0bGU+Qm9vc3QuRnVuY3Rpb24gdnMuIEZ1bmN0aW9uIFBvaW50ZXJzPC90aXRsZT4KKzxwYXJhPkJvb3N0LkZ1bmN0aW9uIGhhcyBzZXZlcmFsIGFkdmFudGFnZXMgb3ZlciBmdW5jdGlvbiBwb2ludGVycywgbmFtZWx5OgorCis8aXRlbWl6ZWRsaXN0IHNwYWNpbmc9ImNvbXBhY3QiPgorICAgPGxpc3RpdGVtPjxwYXJhPkJvb3N0LkZ1bmN0aW9uIGFsbG93cyBhcmJpdHJhcnkgY29tcGF0aWJsZSBmdW5jdGlvbiBvYmplY3RzIHRvIGJlIHRhcmdldHMgKGluc3RlYWQgb2YgcmVxdWlyaW5nIGFuIGV4YWN0IGZ1bmN0aW9uIHNpZ25hdHVyZSkuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICA8bGlzdGl0ZW0+PHBhcmE+Qm9vc3QuRnVuY3Rpb24gbWF5IGJlIHVzZWQgd2l0aCBhcmd1bWVudC1iaW5kaW5nIGFuZCBvdGhlciBmdW5jdGlvbiBvYmplY3QgY29uc3RydWN0aW9uIGxpYnJhcmllcy48L3BhcmE+PC9saXN0aXRlbT4KKyAgIDxsaXN0aXRlbT48cGFyYT5Cb29zdC5GdW5jdGlvbiBoYXMgcHJlZGljdGlibGUgYmVoYXZpb3Igd2hlbiBhbiBlbXB0eSBmdW5jdGlvbiBvYmplY3QgaXMgY2FsbGVkLiA8L3BhcmE+PC9saXN0aXRlbT4KKzwvaXRlbWl6ZWRsaXN0PjwvcGFyYT4KKworPHBhcmE+IEFuZCwgb2YgY291cnNlLCBmdW5jdGlvbiBwb2ludGVycyBoYXZlIHNldmVyYWwgYWR2YW50YWdlcyBvdmVyIEJvb3N0LkZ1bmN0aW9uOgorCis8aXRlbWl6ZWRsaXN0IHNwYWNpbmc9ImNvbXBhY3QiPgorICAgIDxsaXN0aXRlbT48cGFyYT4gRnVuY3Rpb24gcG9pbnRlcnMgYXJlIHNtYWxsZXIgKHRoZSBzaXplIG9mIG9uZSBwb2ludGVyIGluc3RlYWQgb2YgZm91ciBvciBtb3JlKSA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICA8bGlzdGl0ZW0+PHBhcmE+IEZ1bmN0aW9uIHBvaW50ZXJzIGFyZSBmYXN0ZXIgKEJvb3N0LkZ1bmN0aW9uIG1heSByZXF1aXJlIHR3byBjYWxscyB0aHJvdWdoIGZ1bmN0aW9uIHBvaW50ZXJzKSA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICA8bGlzdGl0ZW0+PHBhcmE+IEZ1bmN0aW9uIHBvaW50ZXJzIGFyZSBiYWNrd2FyZC1jb21wYXRpYmxlIHdpdGggQyBsaWJyYXJpZXMuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgPGxpc3RpdGVtPjxwYXJhPiBNb3JlIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2VzLiA8L3BhcmE+PC9saXN0aXRlbT4KKzwvaXRlbWl6ZWRsaXN0PgorPC9wYXJhPgorICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24+CisgICAgPHRpdGxlPlBlcmZvcm1hbmNlPC90aXRsZT4KKworPHNlY3Rpb24+CisgIDx0aXRsZT5GdW5jdGlvbiBvYmplY3Qgd3JhcHBlciBzaXplPC90aXRsZT4KKyAgPHBhcmE+IEZ1bmN0aW9uIG9iamVjdCB3cmFwcGVycyB3aWxsIGJlIHRoZSBzaXplIG9mIGEgc3RydWN0IGNvbnRhaW5pbmcgYSBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlciBhbmQgdHdvIGRhdGEgcG9pbnRlcnMuIFRoZSBhY3R1YWwgc2l6ZSBjYW4gdmFyeSBzaWduaWZpY2FudGx5IGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBwbGF0Zm9ybTsgb24gMzItYml0IE1hYyBPUyBYIHdpdGggR0NDLCB0aGlzIGFtb3VudHMgdG8gMTYgYnl0ZXMsIHdoaWxlIGl0IGlzIDMyIGJ5dGVzIFdpbmRvd3Mgd2l0aCBWaXN1YWwgQysrLiBBZGRpdGlvbmFsbHksIHRoZSBmdW5jdGlvbiBvYmplY3QgdGFyZ2V0IG1heSBiZSBhbGxvY2F0ZWQgb24gdGhlIGhlYXAsIGlmIGl0IGNhbm5vdCBiZSBwbGFjZWQgaW50byB0aGUgc21hbGwtb2JqZWN0IGJ1ZmZlciBpbiB0aGUgPGNvZGU+Ym9vc3Q6OmZ1bmN0aW9uPC9jb2RlPiBvYmplY3QuPC9wYXJhPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbj4KKyAgPHRpdGxlPkNvcHlpbmcgZWZmaWNpZW5jeTwvdGl0bGU+CisgIDxwYXJhPiBDb3B5aW5nIGZ1bmN0aW9uIG9iamVjdCB3cmFwcGVycyBtYXkgcmVxdWlyZSBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgYSBjb3B5IG9mIHRoZSBmdW5jdGlvbiBvYmplY3QgdGFyZ2V0LiBUaGUgZGVmYXVsdCBhbGxvY2F0b3IgbWF5IGJlIHJlcGxhY2VkIHdpdGggYSBmYXN0ZXIgY3VzdG9tIGFsbG9jYXRvciBvciBvbmUgbWF5IGNob29zZSB0byBhbGxvdyB0aGUgZnVuY3Rpb24gb2JqZWN0IHdyYXBwZXJzIHRvIG9ubHkgc3RvcmUgZnVuY3Rpb24gb2JqZWN0IHRhcmdldHMgYnkgcmVmZXJlbmNlICh1c2luZyA8Y29tcHV0ZXJvdXRwdXQ+cmVmPC9jb21wdXRlcm91dHB1dD4pIGlmIHRoZSBjb3N0IG9mIHRoaXMgY2xvbmluZyBiZWNvbWVzIHByb2hpYml0aXZlLiBTbWFsbCBmdW5jdGlvbiBvYmplY3RzIGNhbiBiZSBzdG9yZWQgd2l0aGluIHRoZSA8Y29kZT5ib29zdDo6ZnVuY3Rpb248L2NvZGU+IG9iamVjdCBpdHNlbGYsIGltcHJvdmluZyBjb3B5aW5nIGVmZmljaWVuY3kuPC9wYXJhPgorIDwvc2VjdGlvbj4KKworPHNlY3Rpb24+CisgIDx0aXRsZT5JbnZvY2F0aW9uIGVmZmljaWVuY3k8L3RpdGxlPgorPHBhcmE+IFdpdGggYSBwcm9wZXJseSBpbmxpbmluZyBjb21waWxlciwgYW4gaW52b2NhdGlvbiBvZiBhIGZ1bmN0aW9uIG9iamVjdCByZXF1aXJlcyBvbmUgY2FsbCB0aHJvdWdoIGEgZnVuY3Rpb24gcG9pbnRlci4gSWYgdGhlIGNhbGwgaXMgdG8gYSBmcmVlIGZ1bmN0aW9uIHBvaW50ZXIsIGFuIGFkZGl0aW9uYWwgY2FsbCBtdXN0IGJlIG1hZGUgdG8gdGhhdCBmdW5jdGlvbiBwb2ludGVyICh1bmxlc3MgdGhlIGNvbXBpbGVyIGhhcyB2ZXJ5IHBvd2VyZnVsIGludGVycHJvY2VkdXJhbCBhbmFseXNpcykuPC9wYXJhPgorICA8L3NlY3Rpb24+Cis8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24+CisgICAgPHRpdGxlPkNvbWJhdHRpbmcgdmlydHVhbCBmdW5jdGlvbiAiYmxvYXQiPC90aXRsZT4KKzxwYXJhPiBUaGUgdXNlIG9mIHZpcnR1YWwgZnVuY3Rpb25zIHRlbmRzIHRvIGNhdXNlICdjb2RlIGJsb2F0JyBvbiBtYW55IGNvbXBpbGVycy4gV2hlbiBhIGNsYXNzIGNvbnRhaW5zIGEgdmlydHVhbCBmdW5jdGlvbiwgaXQgaXMgbmVjZXNzYXJ5IHRvIGVtaXQgYW4gYWRkaXRpb25hbCBmdW5jdGlvbiB0aGF0IGNsYXNzaWZpZXMgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4gSXQgaGFzIGJlZW4gb3VyIGV4cGVyaWVuY2UgdGhhdCB0aGVzZSBhdXhpbGlhcnkgZnVuY3Rpb25zIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBleGVjdXRhYmxlIHNpZ25pZmljYW50bHkgd2hlbiBtYW55IDxjb21wdXRlcm91dHB1dD5ib29zdDo6ZnVuY3Rpb248L2NvbXB1dGVyb3V0cHV0PiBvYmplY3RzIGFyZSB1c2VkLiA8L3BhcmE+CisKKzxwYXJhPiBJbiBCb29zdC5GdW5jdGlvbiwgYW4gYWx0ZXJuYXRpdmUgYnV0IGVxdWl2YWxlbnQgYXBwcm9hY2ggd2FzIHRha2VuIHVzaW5nIGZyZWUgZnVuY3Rpb25zIGluc3RlYWQgb2YgdmlydHVhbCBmdW5jdGlvbnMuIFRoZSBCb29zdC5GdW5jdGlvbiBvYmplY3QgZXNzZW50aWFsbHkgaG9sZHMgdHdvIHBvaW50ZXJzIHRvIG1ha2UgYSB2YWxpZCB0YXJnZXQgY2FsbDogYSB2b2lkIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIG9iamVjdCBpdCBjb250YWlucyBhbmQgYSB2b2lkIHBvaW50ZXIgdG8gYW4gImludm9rZXIiIHRoYXQgY2FuIGNhbGwgdGhlIGZ1bmN0aW9uIG9iamVjdCwgZ2l2ZW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXIuIFRoaXMgaW52b2tlciBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSBjb252ZXJzaW9ucyBCb29zdC5GdW5jdGlvbiBwcm92aWRlcy4gQSB0aGlyZCBwb2ludGVyIHBvaW50cyB0byBhIGZyZWUgZnVuY3Rpb24gY2FsbGVkIHRoZSAibWFuYWdlciIsIHdoaWNoIGhhbmRsZXMgdGhlIGNsb25pbmcgYW5kIGRlc3RydWN0aW9uIG9mIGZ1bmN0aW9uIG9iamVjdHMuIFRoZSBzY2hlbWUgaXMgdHlwZXNhZmUgYmVjYXVzZSB0aGUgb25seSBmdW5jdGlvbnMgdGhhdCBhY3R1YWxseSBoYW5kbGUgdGhlIGZ1bmN0aW9uIG9iamVjdCwgdGhlIGludm9rZXIgYW5kIHRoZSBtYW5hZ2VyLCBhcmUgaW5zdGFudGlhdGVkIGdpdmVuIHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QsIHNvIHRoZXkgY2FuIHNhZmVseSBjYXN0IHRoZSBpbmNvbWluZyB2b2lkIHBvaW50ZXIgKHRoZSBmdW5jdGlvbiBvYmplY3QgcG9pbnRlcikgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUuPC9wYXJhPgorICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24+CisgICAgPHRpdGxlPkFja25vd2xlZGdlbWVudHM8L3RpdGxlPiAKKworICAgIDxwYXJhPiBNYW55IHBlb3BsZSB3ZXJlIGludm9sdmVkIGluIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhpcworICAgIGxpYnJhcnkuIFdpbGxpYW0gS2VtcGYsIEplc3NlIEpvbmVzIGFuZCBLYXJsIE5lbHNvbiB3ZXJlIGFsbAorICAgIGV4dHJlbWVseSBoZWxwZnVsIGluIGlzb2xhdGluZyBhbiBpbnRlcmZhY2UgYW5kIHNjb3BlIGZvciB0aGUKKyAgICBsaWJyYXJ5LiBKb2huIE1hZGRvY2sgbWFuYWdlZCB0aGUgZm9ybWFsIHJldmlldywgYW5kIG1hbnkKKyAgICByZXZpZXdlcnMgZ2F2ZSBleGNlbGxlbnQgY29tbWVudHMgb24gaW50ZXJmYWNlLCBpbXBsZW1lbnRhdGlvbiwKKyAgICBhbmQgZG9jdW1lbnRhdGlvbi4gUGV0ZXIgRGltb3YgbGVkIHVzIHRvIHRoZSBmdW5jdGlvbgorICAgIGRlY2xhcmF0b3ItYmFzZWQgc3ludGF4LjwvcGFyYT4KKyAgPC9zZWN0aW9uPgorPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvbGlicy9mdW5jdGlvbi9kb2MvcmVmZXJlbmNlLnhtbCBiL2xpYnMvZnVuY3Rpb24vZG9jL3JlZmVyZW5jZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdjOTE0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvZnVuY3Rpb24vZG9jL3JlZmVyZW5jZS54bWwKQEAgLTAsMCArMSw5OTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgICBDb3B5cmlnaHQgKGMpIDIwMDIgRG91Z2xhcyBHcmVnb3IgPGRvdWcuZ3JlZ29yIC1hdC0gZ21haWwuY29tPgorICAKKyAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAgIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyAgIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAgLS0+Cis8IURPQ1RZUEUgbGlicmFyeSBQVUJMSUMgIi0vL0Jvb3N0Ly9EVEQgQm9vc3RCb29rIFhNTCBWMS4wLy9FTiIKKyAgImh0dHA6Ly93d3cuYm9vc3Qub3JnL3Rvb2xzL2Jvb3N0Ym9vay9kdGQvYm9vc3Rib29rLmR0ZCI+CisKKzxsaWJyYXJ5LXJlZmVyZW5jZSBpZD0iZnVuY3Rpb24ucmVmZXJlbmNlIiBsYXN0LXJldmlzaW9uPSIkRGF0ZTogMjAxMy0wNi0xNSAwMDowNjoyNiAtMDcwMCAoU2F0LCAxNSBKdW4gMjAxMykgJCI+CisKKzxzZWN0aW9uIGlkPSJmdW5jdGlvbi5kZWZpbml0aW9ucyI+CisgIDx0aXRsZT5EZWZpbml0aW9uczwvdGl0bGU+Cis8cGFyYT4KKyAgPGl0ZW1pemVkbGlzdD4KKyAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT5BIGZ1bmN0aW9uIG9iamVjdCA8Y29tcHV0ZXJvdXRwdXQ+ZjwvY29tcHV0ZXJvdXRwdXQ+IGlzCisgICAgICA8ZW1waGFzaXM+Y29tcGF0aWJsZTwvZW1waGFzaXM+IGlmIGZvciB0aGUgZ2l2ZW4gc2V0IG9mIGFyZ3VtZW50CisgICAgICB0eXBlcyA8Y29tcHV0ZXJvdXRwdXQ+QXJnMTwvY29tcHV0ZXJvdXRwdXQ+LAorICAgICAgPGNvbXB1dGVyb3V0cHV0PkFyZzI8L2NvbXB1dGVyb3V0cHV0PiwgLi4uLAorICAgICAgPGNvbXB1dGVyb3V0cHV0PkFyZ048L2NvbXB1dGVyb3V0cHV0PiBhbmQgYQorICAgICAgcmV0dXJuIHR5cGUgPGNvbXB1dGVyb3V0cHV0PlJlc3VsdFR5cGU8L2NvbXB1dGVyb3V0cHV0PiwgdGhlCisgICAgICBhcHByb3ByaWF0ZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgd2VsbC1mb3JtZWQ6Cis8cHJvZ3JhbWxpc3Rpbmc+CisgIDxlbXBoYXNpcz4vLyBpZiBSZXN1bHRUeXBlIGlzIG5vdCA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+dm9pZDwvZW1waGFzaXM+PC9lbXBoYXNpcz4KKyAgUmVzdWx0VHlwZSBmb28oQXJnMSBhcmcxLCBBcmcyIGFyZzIsIC4uLiwgQXJnPGVtcGhhc2lzPk48L2VtcGhhc2lzPiBhcmc8ZW1waGFzaXM+TjwvZW1waGFzaXM+KQorICB7CisgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPnJldHVybjwvZW1waGFzaXM+IGYoYXJnMSwgYXJnMiwgLi4uLCBhcmc8ZW1waGFzaXM+TjwvZW1waGFzaXM+KTsKKyAgfQorCisgIDxlbXBoYXNpcz4vLyBpZiBSZXN1bHRUeXBlIGlzIDxlbXBoYXNpcyByb2xlPSJib2xkIj52b2lkPC9lbXBoYXNpcz48L2VtcGhhc2lzPgorICBSZXN1bHRUeXBlIGZvbyhBcmcxIGFyZzEsIEFyZzIgYXJnMiwgLi4uLCBBcmc8ZW1waGFzaXM+TjwvZW1waGFzaXM+IGFyZzxlbXBoYXNpcz5OPC9lbXBoYXNpcz4pCisgIHsKKyAgICBmKGFyZzEsIGFyZzIsIC4uLiwgYXJnPGVtcGhhc2lzPk48L2VtcGhhc2lzPik7CisgIH0KKzwvcHJvZ3JhbWxpc3Rpbmc+PC9wYXJhPgorCisgICAgICA8cGFyYT4gQSBzcGVjaWFsIHByb3Zpc2lvbiBpcyBtYWRlIGZvciBwb2ludGVycyB0byBtZW1iZXIKKyAgICAgIGZ1bmN0aW9ucy4gVGhvdWdoIHRoZXkgYXJlIG5vdCBmdW5jdGlvbiBvYmplY3RzLCBCb29zdC5GdW5jdGlvbgorICAgICAgd2lsbCBhZGFwdCB0aGVtIGludGVybmFsbHkgdG8gZnVuY3Rpb24gb2JqZWN0cy4gVGhpcyByZXF1aXJlcworICAgICAgdGhhdCBhIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIG9mIHRoZSBmb3JtIDxjb2RlPlIKKyAgICAgIChYOjoqbWYpKEFyZzEsIEFyZzIsIC4uLiwgQXJnTikKKyAgICAgIGN2LXF1YWxzPC9jb2RlPiBiZSBhZGFwdGVkIHRvIGEKKyAgICAgIGZ1bmN0aW9uIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbCBvcGVyYXRvcgorICAgICAgb3ZlcmxvYWRzOgorPHByb2dyYW1saXN0aW5nPgorICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+dGVtcGxhdGU8L2VtcGhhc2lzPiZsdDs8ZW1waGFzaXMgcm9sZT0iYm9sZCI+dHlwZW5hbWUgUDwvZW1waGFzaXM+Jmd0OworICBSIDxlbXBoYXNpcyByb2xlPSJib2xkIj5vcGVyYXRvcjwvZW1waGFzaXM+KCkoPGVtcGhhc2lzPmN2LXF1YWxzPC9lbXBoYXNpcz4gUCZhbXA7IHgsIEFyZzEgYXJnMSwgQXJnMiBhcmcyLCAuLi4sIEFyZzxlbXBoYXNpcz5OPC9lbXBoYXNpcz4gYXJnPGVtcGhhc2lzPk48L2VtcGhhc2lzPikgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPmNvbnN0PC9lbXBoYXNpcz4KKyAgeworICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj5yZXR1cm48L2VtcGhhc2lzPiAoKngpLiptZihhcmcxLCBhcmcyLCAuLi4sIGFyZzxlbXBoYXNpcz5OPC9lbXBoYXNpcz4pOworICB9Cis8L3Byb2dyYW1saXN0aW5nPgorPC9wYXJhPgorICAgIDwvbGlzdGl0ZW0+CisgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+QSBmdW5jdGlvbiBvYmplY3QgPGNvZGU+ZjwvY29kZT4gb2YKKyAgICAgIHR5cGUgPGNvZGU+RjwvY29kZT4gaXMKKyAgICAgIDxlbXBoYXNpcz5zdGF0ZWxlc3M8L2VtcGhhc2lzPiBpZiBpdCBpcyBhIGZ1bmN0aW9uIHBvaW50ZXIgb3IgaWYKKyAgICAgIDxjb2RlPjxjbGFzc25hbWU+Ym9vc3Q6OmlzX3N0YXRlbGVzczwvY2xhc3NuYW1lPiZsdDtGJmd0OzwvY29kZT4KKyAgICAgIGlzIHRydWUuIFRoZSBjb25zdHJ1Y3Rpb24gb2Ygb3IgY29weSB0byBhIEJvb3N0LkZ1bmN0aW9uIG9iamVjdAorICAgICAgZnJvbSBhIHN0YXRlbGVzcyBmdW5jdGlvbiBvYmplY3Qgd2lsbCBub3QgY2F1c2UgZXhjZXB0aW9ucyB0byBiZQorICAgICAgdGhyb3duIGFuZCB3aWxsIG5vdCBhbGxvY2F0ZSBhbnkgc3RvcmFnZS4KKyAgICAgIDwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICA8L2l0ZW1pemVkbGlzdD4KKzwvcGFyYT4KKzwvc2VjdGlvbj4KKworPGhlYWRlciBuYW1lPSJib29zdC9mdW5jdGlvbi5ocHAiPgorPG5hbWVzcGFjZSBuYW1lPSJib29zdCI+CisgIDxjbGFzcyBuYW1lPSJiYWRfZnVuY3Rpb25fY2FsbCI+CisgICAgPGluaGVyaXQgYWNjZXNzPSJwdWJsaWMiPjxjbGFzc25hbWU+c3RkOjpydW50aW1lX2Vycm9yPC9jbGFzc25hbWU+PC9pbmhlcml0PgorICAgIDxwdXJwb3NlPkFuIGV4Y2VwdGlvbiB0eXBlIHRocm93biB3aGVuIGFuIGluc3RhbmNlIG9mIGEgPGNvZGU+ZnVuY3Rpb248L2NvZGU+IG9iamVjdCBpcyBlbXB0eSB3aGVuIGludm9rZWQuPC9wdXJwb3NlPgorICAgIDxjb25zdHJ1Y3Rvcj4KKyAgICAgIDxlZmZlY3RzPjxzaW1wYXJhPkNvbnN0cnVjdHMgYSA8Y29kZT48Y2xhc3NuYW1lPmJhZF9mdW5jdGlvbl9jYWxsPC9jbGFzc25hbWU+PC9jb2RlPiBleGNlcHRpb24gb2JqZWN0Ljwvc2ltcGFyYT48L2VmZmVjdHM+CisgICAgPC9jb25zdHJ1Y3Rvcj4KKyAgPC9jbGFzcz4KKworICA8Y2xhc3MgbmFtZT0iZnVuY3Rpb25fYmFzZSI+CisgICAgPHB1cnBvc2U+VGhlIGNvbW1vbiBiYXNlIGNsYXNzIGZvciBhbGwgQm9vc3QuRnVuY3Rpb24KKyAgICBvYmplY3RzLiBPYmplY3RzIG9mIHR5cGUgZnVuY3Rpb25fYmFzZSBtYXkgbm90IGJlIGNyZWF0ZWQKKyAgICBkaXJlY3RseS48L3B1cnBvc2U+CisKKyAgICA8bWV0aG9kLWdyb3VwIG5hbWU9ImNhcGFjaXR5Ij4KKyAgICAgIDxtZXRob2QgbmFtZT0iZW1wdHkiIGN2PSJjb25zdCI+CisgICAgICAgIDx0eXBlPmJvb2w8L3R5cGU+CisgICAgICAgIDxyZXR1cm5zPjxzaW1wYXJhPjxjb2RlPmZhbHNlPC9jb2RlPiBpZiA8Y29kZT50aGlzPC9jb2RlPiBoYXMgYSB0YXJnZXQsIGFuZCA8Y29kZT50cnVlPC9jb2RlPiBvdGhlcndpc2UuPC9zaW1wYXJhPjwvcmV0dXJucz4KKyAgICAgICAgPHRocm93cz48c2ltcGFyYT5XaWxsIG5vdCB0aHJvdy48L3NpbXBhcmE+PC90aHJvd3M+CisgICAgICA8L21ldGhvZD4KKyAgICA8L21ldGhvZC1ncm91cD4KKworICAgIDxtZXRob2QtZ3JvdXAgbmFtZT0idGFyZ2V0IGFjY2VzcyI+CisgICAgICA8b3ZlcmxvYWRlZC1tZXRob2QgbmFtZT0idGFyZ2V0Ij4KKyAgICAgICAgPHNpZ25hdHVyZT4KKyAgICAgICAgICA8dGVtcGxhdGU+IAorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkZ1bmN0b3IiLz4KKyAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgIDx0eXBlPkZ1bmN0b3IqPC90eXBlPgorICAgICAgICA8L3NpZ25hdHVyZT4KKyAgICAgICAgPHNpZ25hdHVyZSBjdj0iY29uc3QiPgorICAgICAgICAgIDx0ZW1wbGF0ZT4gCisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+Y29uc3QgRnVuY3Rvcio8L3R5cGU+CisgICAgICAgIDwvc2lnbmF0dXJlPgorCisgICAgICAgIDxyZXR1cm5zPjxzaW1wYXJhPklmIDxjb2RlPnRoaXM8L2NvZGU+IHN0b3JlcyBhIHRhcmdldCBvZiB0eXBlCisgICAgICAgIDxjb2RlPkZ1bmN0b3I8L2NvZGU+LCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZQorICAgICAgICB0YXJnZXQuIE90aGVyd2lzZSwgcmV0dXJucyB0aGUgTlVMTAorICAgICAgICBwb2ludGVyLjwvc2ltcGFyYT48L3JldHVybnM+CisKKyAgICAgICAgPHRocm93cz48c2ltcGFyYT5XaWxsIG5vdCB0aHJvdy48L3NpbXBhcmE+PC90aHJvd3M+CisgICAgICA8L292ZXJsb2FkZWQtbWV0aG9kPgorCisgICAgICA8bWV0aG9kIG5hbWU9ImNvbnRhaW5zIiBjdj0iY29uc3QiPgorICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkZ1bmN0b3IiLz4KKyAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgPHR5cGU+Ym9vbDwvdHlwZT4KKyAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj4KKyAgICAgICAgICA8cGFyYW10eXBlPmNvbnN0IEZ1bmN0b3ImYW1wOzwvcGFyYW10eXBlPgorICAgICAgICA8L3BhcmFtZXRlcj4KKyAgICAgICAgPHJldHVybnM+PHNpbXBhcmE+PGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+dGhpcy0mZ3Q7PG1ldGhvZG5hbWU+dGFyZ2V0PC9tZXRob2RuYW1lPiZsdDtGdW5jdG9yJmd0OygpPC9jb2RlPiBpcyBub24tTlVMTCBhbmQgPGNvZGU+PGZ1bmN0aW9ubmFtZT5mdW5jdGlvbl9lcXVhbDwvZnVuY3Rpb25uYW1lPigqKHRoaXMtJmd0O3RhcmdldCZsdDtGdW5jdG9yJmd0OygpKSwgZik8L2NvZGU+PC9zaW1wYXJhPjwvcmV0dXJucz4KKyAKKyAgICAgIDwvbWV0aG9kPgorCisgICAgICA8bWV0aG9kIG5hbWU9InRhcmdldF90eXBlIiBjdj0iY29uc3QiPgorICAgICAgICA8dHlwZT5jb25zdCBzdGQ6OnR5cGVfaW5mbyZhbXA7PC90eXBlPgorICAgICAgICA8cmV0dXJucz48c2ltcGFyYT48Y29kZT50eXBlaWQ8L2NvZGU+IG9mIHRoZSB0YXJnZXQgZnVuY3Rpb24gb2JqZWN0LCBvciA8Y29kZT50eXBlaWQodm9pZCk8L2NvZGU+IGlmIDxjb2RlPnRoaXMtJmd0OzxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPi48L3NpbXBhcmE+PC9yZXR1cm5zPgorICAgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93Ljwvc2ltcGFyYT48L3Rocm93cz4KKyAgICAgIDwvbWV0aG9kPgorICAgIDwvbWV0aG9kLWdyb3VwPgorICA8L2NsYXNzPgorCisgIDxjbGFzcyBuYW1lPSJmdW5jdGlvbk4iPgorICAgIDx0ZW1wbGF0ZT4KKyAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJSIi8+CisgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVDEiLz4KKyAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUMiIvPgorICAgICAgPHRlbXBsYXRlLXZhcmFyZ3MvPgorICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlROIi8+CisgICAgPC90ZW1wbGF0ZT4KKworICAgIDxpbmhlcml0IGFjY2Vzcz0icHVibGljIj48Y2xhc3NuYW1lPmZ1bmN0aW9uX2Jhc2U8L2NsYXNzbmFtZT48L2luaGVyaXQ+CisKKyAgICA8cHVycG9zZT5BIHNldCBvZiBnZW5lcmFsaXplZCBmdW5jdGlvbiBwb2ludGVycyB0aGF0IGNhbiBiZSB1c2VkIGZvciBjYWxsYmFja3Mgb3Igd3JhcHBpbmcgZnVuY3Rpb24gb2JqZWN0cy48L3B1cnBvc2U+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICA8cGFyYT5DbGFzcyB0ZW1wbGF0ZSA8Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiBpcworICAgICAgYWN0dWFsbHkgYSBmYW1pbHkgb2YgcmVsYXRlZCBjbGFzc2VzIDxjbGFzc25hbWUKKyAgICAgIGFsdD0iZnVuY3Rpb25OIj5mdW5jdGlvbjA8L2NsYXNzbmFtZT4sIDxjbGFzc25hbWUKKyAgICAgIGFsdD0iZnVuY3Rpb25OIj5mdW5jdGlvbjE8L2NsYXNzbmFtZT4sIGV0Yy4sIHVwIHRvIHNvbWUKKyAgICAgIGltcGxlbWVudGF0aW9uLWRlZmluZWQgbWF4aW11bS4gSW4gdGhpcyBjb250ZXh0LCA8Y29kZT5OPC9jb2RlPgorICAgICAgcmVmZXJzIHRvIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycy48L3BhcmE+CisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDx0eXBlZGVmIG5hbWU9InJlc3VsdF90eXBlIj48dHlwZT5SPC90eXBlPjwvdHlwZWRlZj4KKyAgICA8dHlwZWRlZiBuYW1lPSJhcmd1bWVudF90eXBlIj4KKyAgICAgIDx0eXBlPlQxPC90eXBlPjxwdXJwb3NlPklmIE4gPT0gMTwvcHVycG9zZT4KKyAgICA8L3R5cGVkZWY+CisgICAgPHR5cGVkZWYgbmFtZT0iZmlyc3RfYXJndW1lbnRfdHlwZSI+CisgICAgICA8dHlwZT5UMTwvdHlwZT4KKyAgICAgIDxwdXJwb3NlPklmIE4gPT0gMjwvcHVycG9zZT4KKyAgICA8L3R5cGVkZWY+CisgICAgPHR5cGVkZWYgbmFtZT0ic2Vjb25kX2FyZ3VtZW50X3R5cGUiPgorICAgICAgPHR5cGU+VDI8L3R5cGU+CisgICAgICA8cHVycG9zZT5JZiBOID09IDI8L3B1cnBvc2U+CisgICAgPC90eXBlZGVmPgorICAgIDx0eXBlZGVmIG5hbWU9ImFyZzFfdHlwZSI+PHR5cGU+VDE8L3R5cGU+PC90eXBlZGVmPgorICAgIDx0eXBlZGVmIG5hbWU9ImFyZzJfdHlwZSI+PHR5cGU+VDI8L3R5cGU+PC90eXBlZGVmPgorICAgIDx0eXBlZGVmIG5hbWU9Ii4uLiI+PHR5cGUvPjwvdHlwZWRlZj4KKyAgICA8dHlwZWRlZiBuYW1lPSJhcmdOX3R5cGUiPjx0eXBlPlROPC90eXBlPjwvdHlwZWRlZj4KKworICAgIDxzdGF0aWMtY29uc3RhbnQgbmFtZT0iYXJpdHkiPgorICAgICAgPHR5cGU+aW50PC90eXBlPgorICAgICAgPGRlZmF1bHQ+TjwvZGVmYXVsdD4KKyAgICA8L3N0YXRpYy1jb25zdGFudD4KKworICAgIDxzdHJ1Y3QgbmFtZT0ic2lnIj4KKyAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkFyZ3MiLz4KKyAgICAgIDwvdGVtcGxhdGU+CisKKyAgICAgIDxwdXJwb3NlPgorICAgICAgICA8c2ltcGFyYT48bGlicmFyeW5hbWU+TGFtYmRhPC9saWJyYXJ5bmFtZT4gbGlicmFyeSBzdXBwb3J0PC9zaW1wYXJhPgorICAgICAgPC9wdXJwb3NlPgorCisgICAgICA8dHlwZWRlZiBuYW1lPSJ0eXBlIj48dHlwZT5yZXN1bHRfdHlwZTwvdHlwZT48L3R5cGVkZWY+CisgICAgPC9zdHJ1Y3Q+CisKKyAgICA8Y29uc3RydWN0b3I+CisgICAgICA8cG9zdGNvbmRpdGlvbnM+PHNpbXBhcmE+PGNvZGU+dGhpcy0mZ3Q7PG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvZGU+PC9zaW1wYXJhPjwvcG9zdGNvbmRpdGlvbnM+CisgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93Ljwvc2ltcGFyYT48L3Rocm93cz4KKyAgICA8L2NvbnN0cnVjdG9yPgorCisgICAgPGNvbnN0cnVjdG9yPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj4KKyAgICAgICAgPHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiZhbXA7PC9wYXJhbXR5cGU+CisgICAgICA8L3BhcmFtZXRlcj4KKyAgICAgIDxwb3N0Y29uZGl0aW9ucz48c2ltcGFyYT5Db250YWlucyBhIGNvcHkgb2YgdGhlIDxjb2RlPmY8L2NvZGU+J3MgdGFyZ2V0LCBpZiBpdCBoYXMgb25lLCBvciBpcyBlbXB0eSBpZiA8Y29kZT5mLjxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPi48L3NpbXBhcmE+PC9wb3N0Y29uZGl0aW9ucz4KKyAgICAgIDx0aHJvd3M+PHNpbXBhcmE+V2lsbCBub3QgdGhyb3cgdW5sZXNzIGNvcHlpbmcgdGhlIHRhcmdldCBvZiA8Y29kZT5mPC9jb2RlPiB0aHJvd3MuPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgIDwvY29uc3RydWN0b3I+CisKKyAgICA8Y29uc3RydWN0b3I+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPgorICAgICAgICA8cGFyYW10eXBlPjxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+JmFtcDsmYW1wOzwvcGFyYW10eXBlPgorICAgICAgPC9wYXJhbWV0ZXI+CisgICAgICA8cmVxdWlyZXM+PHNpbXBhcmE+QysrMTEgY29tcGF0aWJsZSBjb21waWxlci48L3NpbXBhcmE+PC9yZXF1aXJlcz4KKyAgICAgIDxwb3N0Y29uZGl0aW9ucz48c2ltcGFyYT5Nb3ZlcyB0aGUgdmFsdWUgZnJvbSA8Y29kZT5mPC9jb2RlPiB0byA8Y29kZT4qdGhpczwvY29kZT4uIElmIHRoZSBhcmd1bWVudCBoYXMgaXRzIGZ1bmN0aW9uIG9iamVjdCBhbGxvY2F0ZWQgb24gdGhlIGhlYXAsIGl0cyBidWZmZXIgd2lsbCBiZSBhc3NpZ25lZCB0byA8Y29kZT4qdGhpczwvY29kZT4gbGVhdmluZyBhcmd1bWVudCBlbXB0eS48L3NpbXBhcmE+PC9wb3N0Y29uZGl0aW9ucz4KKyAgICAgIDx0aHJvd3M+PHNpbXBhcmE+V2lsbCBub3QgdGhyb3cgdW5sZXNzIGFyZ3VtZW50IGhhcyBpdHMgZnVuY3Rpb24gb2JqZWN0IGFsbG9jYXRlZCBub3Qgb24gdGhlIGhlYXAgYW5kIGNvcHlpbmcgdGhlIHRhcmdldCBvZiA8Y29kZT5mPC9jb2RlPiB0aHJvd3MuPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgIDwvY29uc3RydWN0b3I+CisgICAgCisgICAgPGNvbnN0cnVjdG9yPgorICAgICAgPHRlbXBsYXRlPgorICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRiIvPgorICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+PHBhcmFtdHlwZT5GPC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICA8cmVxdWlyZXM+PHNpbXBhcmE+RiBpcyBhIGZ1bmN0aW9uIG9iamVjdCBDYWxsYWJsZSBmcm9tIDxjb2RlPnRoaXM8L2NvZGU+Ljwvc2ltcGFyYT48L3JlcXVpcmVzPgorICAgICAgPHBvc3Rjb25kaXRpb25zPjxzaW1wYXJhPjxjb2RlPip0aGlzPC9jb2RlPiB0YXJnZXRzIGEgY29weSBvZiA8Y29kZT5mPC9jb2RlPiBpZiA8Y29kZT5mPC9jb2RlPiBpcyBub25lbXB0eSwgb3IgPGNvZGU+dGhpcy0mZ3Q7PG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvZGU+IGlmIDxjb2RlPmY8L2NvZGU+IGlzIGVtcHR5Ljwvc2ltcGFyYT48L3Bvc3Rjb25kaXRpb25zPgorICAgIDwvY29uc3RydWN0b3I+CisKKyAgICA8Y29uc3RydWN0b3I+CisgICAgICA8dGVtcGxhdGU+CisgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGIi8+CisgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJBbGxvY2F0b3IiLz4KKyAgICAgIDwvdGVtcGxhdGU+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPjxwYXJhbXR5cGU+RjwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJhbGxvYyI+PHBhcmFtdHlwZT5BbGxvY2F0b3I8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgIDxyZXF1aXJlcz48c2ltcGFyYT5GIGlzIGEgZnVuY3Rpb24gb2JqZWN0IENhbGxhYmxlIGZyb20gPGNvZGU+dGhpczwvY29kZT4sIEFsbG9jYXRvciBpcyBhbiBhbGxvY2F0b3IuIFRoZSBjb3B5IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIG9mIEFsbG9jYXRvciBzaGFsbCBub3QgdGhyb3cuPC9zaW1wYXJhPjwvcmVxdWlyZXM+CisgICAgICA8cG9zdGNvbmRpdGlvbnM+PHNpbXBhcmE+PGNvZGU+KnRoaXM8L2NvZGU+IHRhcmdldHMgYSBjb3B5IG9mIDxjb2RlPmY8L2NvZGU+IGlmIDxjb2RlPmY8L2NvZGU+IGlzIG5vbmVtcHR5LCBvciA8Y29kZT50aGlzLSZndDs8bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4gaWYgPGNvZGU+ZjwvY29kZT4gaXMgZW1wdHkuPC9zaW1wYXJhPjwvcG9zdGNvbmRpdGlvbnM+CisKKyAgICAgIDxlZmZlY3RzPjxzaW1wYXJhPklmIG1lbW9yeSBhbGxvY2F0aW9uIGlzIHJlcXVpcmVkLCB0aGUgZ2l2ZW4gYWxsb2NhdG9yIChvciBhIGNvcHkgb2YgaXQpIHdpbGwgYmUgdXNlZCB0byBhbGxvY2F0ZSB0aGF0IG1lbW9yeS48L3NpbXBhcmE+PC9lZmZlY3RzPgorICAgIDwvY29uc3RydWN0b3I+CisKKyAgICA8ZGVzdHJ1Y3Rvcj4KKyAgICAgIDxlZmZlY3RzPjxzaW1wYXJhPklmIDxjb2RlPiF0aGlzLSZndDs8bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4sIGRlc3Ryb3lzIHRoZSB0YXJnZXQgb2YgdGhpcy48L3NpbXBhcmE+PC9lZmZlY3RzPgorCisgICAgPC9kZXN0cnVjdG9yPgorCisgICAgPGNvcHktYXNzaWdubWVudD4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+CisgICAgICAgIDxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4mYW1wOzwvcGFyYW10eXBlPgorICAgICAgPC9wYXJhbWV0ZXI+CisgICAgICA8cG9zdGNvbmRpdGlvbnM+PHNpbXBhcmE+SWYgY29weSBjb25zdHJ1Y3Rpb24gZG9lcyBub3QgdGhyb3csIDxjb2RlPip0aGlzPC9jb2RlPiB0YXJnZXRzIGEgY29weSBvZiA8Y29kZT5mPC9jb2RlPidzIHRhcmdldCwgaWYgaXQgaGFzIG9uZSwgb3IgaXMgZW1wdHkgaWYgPGNvZGU+Zi48bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4uIElmIGNvcHkgY29uc3RydWN0aW9uIGRvZXMgdGhyb3csIDxjb2RlPnRoaXMtJmd0OzxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPi48L3NpbXBhcmE+PC9wb3N0Y29uZGl0aW9ucz4KKyAgICA8L2NvcHktYXNzaWdubWVudD4KKyAgICAKKyAgICA8Y29weS1hc3NpZ25tZW50PgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj4KKyAgICAgICAgPHBhcmFtdHlwZT48Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiZhbXA7JmFtcDs8L3BhcmFtdHlwZT4KKyAgICAgIDwvcGFyYW1ldGVyPgorICAgICAgPHJlcXVpcmVzPjxzaW1wYXJhPkMrKzExIGNvbXBhdGlibGUgY29tcGlsZXIuPC9zaW1wYXJhPjwvcmVxdWlyZXM+CisgICAgICA8cG9zdGNvbmRpdGlvbnM+PHNpbXBhcmE+TW92ZXMgdGhlIHZhbHVlIGZyb20gPGNvZGU+ZjwvY29kZT4gdG8gPGNvZGU+KnRoaXM8L2NvZGU+LiBJZiB0aGUgYXJndW1lbnQgaGFzIGl0cyBmdW5jdGlvbiBvYmplY3QgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLCBpdHMgYnVmZmVyIHdpbGwgYmUgYXNzaWduZWQgdG8gPGNvZGU+KnRoaXM8L2NvZGU+IGxlYXZpbmcgYXJndW1lbnQgZW1wdHkuPC9zaW1wYXJhPjwvcG9zdGNvbmRpdGlvbnM+CisgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93IHVubGVzcyBhcmd1bWVudCBoYXMgaXRzIGZ1bmN0aW9uIG9iamVjdCBhbGxvY2F0ZWQgbm90IG9uIHRoZSBoZWFwIGFuZCBjb3B5aW5nIHRoZSB0YXJnZXQgb2YgPGNvZGU+ZjwvY29kZT4gdGhyb3dzLjwvc2ltcGFyYT48L3Rocm93cz4KKyAgICA8L2NvcHktYXNzaWdubWVudD4KKworICAgIDxtZXRob2QtZ3JvdXAgbmFtZT0ibW9kaWZpZXJzIj4KKyAgICAgIDxtZXRob2QgbmFtZT0ic3dhcCI+CisgICAgICAgIDx0eXBlPnZvaWQ8L3R5cGU+CisgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+PHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDxlZmZlY3RzPjxzaW1wYXJhPkludGVyY2hhbmdlcyB0aGUgdGFyZ2V0cyBvZiA8Y29kZT4qdGhpczwvY29kZT4gYW5kIDxjb2RlPmY8L2NvZGU+Ljwvc2ltcGFyYT48L2VmZmVjdHM+CisgICAgICA8L21ldGhvZD4KKworICAgICAgPG1ldGhvZCBuYW1lPSJjbGVhciI+CisgICAgICAgIDx0eXBlPnZvaWQ8L3R5cGU+CisgICAgICAgIDxwb3N0Y29uZGl0aW9ucz48c2ltcGFyYT50aGlzLSZndDs8bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvc2ltcGFyYT48L3Bvc3Rjb25kaXRpb25zPgorICAgICAgPC9tZXRob2Q+CisgICAgPC9tZXRob2QtZ3JvdXA+CisKKyAgICA8bWV0aG9kLWdyb3VwIG5hbWU9ImNhcGFjaXR5Ij4KKyAgICAgIDxtZXRob2QgbmFtZT0iZW1wdHkiIGN2PSJjb25zdCI+CisgICAgICAgIDx0eXBlPmJvb2w8L3R5cGU+CisgICAgICAgIDxyZXR1cm5zPjxzaW1wYXJhPjxjb2RlPmZhbHNlPC9jb2RlPiBpZiA8Y29kZT50aGlzPC9jb2RlPiBoYXMgYSB0YXJnZXQsIGFuZCA8Y29kZT50cnVlPC9jb2RlPiBvdGhlcndpc2UuPC9zaW1wYXJhPjwvcmV0dXJucz4KKyAgICAgICAgPHRocm93cz48c2ltcGFyYT5XaWxsIG5vdCB0aHJvdy48L3NpbXBhcmE+PC90aHJvd3M+CisgICAgICA8L21ldGhvZD4KKworICAgICAgPG1ldGhvZCBuYW1lPSJjb252ZXJzaW9uLW9wZXJhdG9yIiBjdj0iY29uc3QiPgorICAgICAgICA8dHlwZT5zYWZlX2Jvb2w8L3R5cGU+CisgICAgICAgIDxyZXR1cm5zPjxzaW1wYXJhPkEgPGNvZGU+c2FmZV9ib29sPC9jb2RlPiB0aGF0IGV2YWx1YXRlcyA8Y29kZT5mYWxzZTwvY29kZT4gaW4gYSBib29sZWFuIGNvbnRleHQgd2hlbiA8Y29kZT50aGlzLSZndDs8bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4sIGFuZCA8Y29kZT50cnVlPC9jb2RlPiBvdGhlcndpc2UuPC9zaW1wYXJhPjwvcmV0dXJucz4KKyAgICAgICAgPHRocm93cz48c2ltcGFyYT5XaWxsIG5vdCB0aHJvdy48L3NpbXBhcmE+PC90aHJvd3M+CisgICAgICA8L21ldGhvZD4KKworICAgICAgPG1ldGhvZCBuYW1lPSJvcGVyYXRvciEiIGN2PSJjb25zdCI+CisgICAgICAgIDx0eXBlPmJvb2w8L3R5cGU+CisgICAgICAgIDxyZXR1cm5zPjxzaW1wYXJhPjxjb2RlPnRoaXMtJmd0OzxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPjwvc2ltcGFyYT48L3JldHVybnM+CisgICAgICAgIDx0aHJvd3M+PHNpbXBhcmE+V2lsbCBub3QgdGhyb3cuPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgICAgPC9tZXRob2Q+CisgICAgPC9tZXRob2QtZ3JvdXA+CisKKyAgICA8bWV0aG9kLWdyb3VwIG5hbWU9InRhcmdldCBhY2Nlc3MiPgorICAgICAgPG92ZXJsb2FkZWQtbWV0aG9kIG5hbWU9InRhcmdldCI+CisgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgPHRlbXBsYXRlPiAKKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGdW5jdG9yIi8+CisgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8dHlwZT5GdW5jdG9yKjwvdHlwZT4KKyAgICAgICAgPC9zaWduYXR1cmU+CisgICAgICAgIDxzaWduYXR1cmUgY3Y9ImNvbnN0Ij4KKyAgICAgICAgICA8dGVtcGxhdGU+IAorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkZ1bmN0b3IiLz4KKyAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgIDx0eXBlPmNvbnN0IEZ1bmN0b3IqPC90eXBlPgorICAgICAgICA8L3NpZ25hdHVyZT4KKworICAgICAgICA8cmV0dXJucz48c2ltcGFyYT5JZiA8Y29kZT50aGlzPC9jb2RlPiBzdG9yZXMgYSB0YXJnZXQgb2YgdHlwZQorICAgICAgICA8Y29kZT5GdW5jdG9yPC9jb2RlPiwgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgICAgICAgdGFyZ2V0LiBPdGhlcndpc2UsIHJldHVybnMgdGhlIE5VTEwKKyAgICAgICAgcG9pbnRlci48L3NpbXBhcmE+PC9yZXR1cm5zPgorCisgICAgICAgIDx0aHJvd3M+PHNpbXBhcmE+V2lsbCBub3QgdGhyb3cuPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgICAgPC9vdmVybG9hZGVkLW1ldGhvZD4KKworICAgICAgPG1ldGhvZCBuYW1lPSJjb250YWlucyIgY3Y9ImNvbnN0Ij4KKyAgICAgICAgPHRlbXBsYXRlPgorICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGdW5jdG9yIi8+CisgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgIDx0eXBlPmJvb2w8L3R5cGU+CisgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+CisgICAgICAgICAgPHBhcmFtdHlwZT5jb25zdCBGdW5jdG9yJmFtcDs8L3BhcmFtdHlwZT4KKyAgICAgICAgPC9wYXJhbWV0ZXI+CisgICAgICAgIDxyZXR1cm5zPjxzaW1wYXJhPjxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPnRoaXMtJmd0OzxtZXRob2RuYW1lPnRhcmdldDwvbWV0aG9kbmFtZT4mbHQ7RnVuY3RvciZndDsoKTwvY29kZT4gaXMgbm9uLU5VTEwgYW5kIDxjb2RlPjxmdW5jdGlvbm5hbWU+ZnVuY3Rpb25fZXF1YWw8L2Z1bmN0aW9ubmFtZT4oKih0aGlzLSZndDt0YXJnZXQmbHQ7RnVuY3RvciZndDsoKSksIGYpPC9jb2RlPjwvc2ltcGFyYT48L3JldHVybnM+CisgCisgICAgICA8L21ldGhvZD4KKworICAgICAgPG1ldGhvZCBuYW1lPSJ0YXJnZXRfdHlwZSIgY3Y9ImNvbnN0Ij4KKyAgICAgICAgPHR5cGU+Y29uc3Qgc3RkOjp0eXBlX2luZm8mYW1wOzwvdHlwZT4KKyAgICAgICAgPHJldHVybnM+PHNpbXBhcmE+PGNvZGU+dHlwZWlkPC9jb2RlPiBvZiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIG9iamVjdCwgb3IgPGNvZGU+dHlwZWlkKHZvaWQpPC9jb2RlPiBpZiA8Y29kZT50aGlzLSZndDs8bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4uPC9zaW1wYXJhPjwvcmV0dXJucz4KKyAgICAgICAgPHRocm93cz48c2ltcGFyYT5XaWxsIG5vdCB0aHJvdy48L3NpbXBhcmE+PC90aHJvd3M+CisgICAgICA8L21ldGhvZD4KKworICAgIDwvbWV0aG9kLWdyb3VwPgorCisgICAgPG1ldGhvZC1ncm91cCBuYW1lPSJpbnZvY2F0aW9uIj4KKyAgICAgIDxtZXRob2QgbmFtZT0ib3BlcmF0b3IoKSIgY3Y9ImNvbnN0Ij4KKyAgICAgICAgPHR5cGU+cmVzdWx0X3R5cGU8L3R5cGU+CisgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iYTEiPjxwYXJhbXR5cGU+YXJnMV90eXBlPC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iYTIiPjxwYXJhbXR5cGU+YXJnMl90eXBlPC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDxwYXJhbWV0ZXI+PHBhcmFtdHlwZT4uLi48L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJhTiI+PHBhcmFtdHlwZT5hcmdOX3R5cGU8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPGVmZmVjdHM+PHNpbXBhcmE+PGNvZGU+ZihhMSwgYTIsIC4uLiwgYU4pPC9jb2RlPiwgd2hlcmUgPGNvZGU+ZjwvY29kZT4gaXMgdGhlIHRhcmdldCBvZiA8Y29kZT4qdGhpczwvY29kZT4uPC9zaW1wYXJhPjwvZWZmZWN0cz4KKyAgICAgICAgPHJldHVybnM+PHNpbXBhcmE+aWYgPGNvZGU+UjwvY29kZT4gaXMgPGNvZGU+dm9pZDwvY29kZT4sIG5vdGhpbmcgaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSwgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY2FsbCB0byA8Y29kZT5mPC9jb2RlPiBpcyByZXR1cm5lZC48L3NpbXBhcmE+PC9yZXR1cm5zPgorICAgICAgICA8dGhyb3dzPjxzaW1wYXJhPjxjb2RlPjxjbGFzc25hbWU+YmFkX2Z1bmN0aW9uX2NhbGw8L2NsYXNzbmFtZT48L2NvZGU+IGlmIDxjb2RlPnRoaXMtJmd0OzxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPi4gT3RoZXJ3aXNlLCBtYXkgdGhyb3VnaCBhbnkgZXhjZXB0aW9uIHRocm93biBieSB0aGUgdGFyZ2V0IGZ1bmN0aW9uIDxjb2RlPmY8L2NvZGU+Ljwvc2ltcGFyYT48L3Rocm93cz4KKyAgICAgIDwvbWV0aG9kPgorICAgIDwvbWV0aG9kLWdyb3VwPgorCisgICAgPGZyZWUtZnVuY3Rpb24tZ3JvdXAgbmFtZT0ic3BlY2lhbGl6ZWQgYWxnb3JpdGhtcyI+CisgICAgICA8ZnVuY3Rpb24gbmFtZT0ic3dhcCI+CisgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVDEiLz4KKyAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVDIiLz4KKyAgICAgICAgICA8dGVtcGxhdGUtdmFyYXJncy8+CisgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlROIi8+CisgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgIDx0eXBlPnZvaWQ8L3R5cGU+CisgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZjEiPjxwYXJhbXR5cGU+PGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4mbHQ7VDEsIFQyLCAuLi4sIFROJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZjIiPjxwYXJhbXR5cGU+PGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4mbHQ7VDEsIFQyLCAuLi4sIFROJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDxlZmZlY3RzPjxzaW1wYXJhPjxjb2RlPmYxLjxtZXRob2RuYW1lPnN3YXA8L21ldGhvZG5hbWU+KGYyKTwvY29kZT48L3NpbXBhcmE+PC9lZmZlY3RzPgorICAgICAgPC9mdW5jdGlvbj4KKyAgICA8L2ZyZWUtZnVuY3Rpb24tZ3JvdXA+CisKKyAgICA8ZnJlZS1mdW5jdGlvbi1ncm91cCBuYW1lPSJjb21wYXJpc29uIG9wZXJhdG9ycyI+CisgICAgICA8b3ZlcmxvYWRlZC1mdW5jdGlvbiBuYW1lPSJvcGVyYXRvcj09Ij4KKyAgICAgICAgPHNpZ25hdHVyZT4KKyAgICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVDEiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUMiIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXZhcmFyZ3MvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlROIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+Ym9vbDwvdHlwZT4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4mbHQ7VDEsIFQyLCAuLi4sIFROJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJnIj48cGFyYW10eXBlPkZ1bmN0b3I8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPC9zaWduYXR1cmU+CisgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgPHRlbXBsYXRlPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlQxIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVDIiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS12YXJhcmdzLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUTiIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkZ1bmN0b3IiLz4KKyAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgIDx0eXBlPmJvb2w8L3R5cGU+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJnIj48cGFyYW10eXBlPkZ1bmN0b3I8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4mbHQ7VDEsIFQyLCAuLi4sIFROJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDwvc2lnbmF0dXJlPiAgICAgICAgCisgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgPHRlbXBsYXRlPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlQxIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVDIiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS12YXJhcmdzLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUTiIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkZ1bmN0b3IiLz4KKyAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgIDx0eXBlPmJvb2w8L3R5cGU+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj48cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+Jmx0O1QxLCBUMiwgLi4uLCBUTiZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZyI+PHBhcmFtdHlwZT48Y2xhc3NuYW1lPnJlZmVyZW5jZV93cmFwcGVyPC9jbGFzc25hbWU+Jmx0O0Z1bmN0b3ImZ3Q7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDwvc2lnbmF0dXJlPgorICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUMSIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlQyIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdmFyYXJncy8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVE4iLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGdW5jdG9yIi8+CisgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8dHlwZT5ib29sPC90eXBlPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZyI+PHBhcmFtdHlwZT48Y2xhc3NuYW1lPnJlZmVyZW5jZV93cmFwcGVyPC9jbGFzc25hbWU+Jmx0O0Z1bmN0b3ImZ3Q7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj48cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+Jmx0O1QxLCBUMiwgLi4uLCBUTiZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8L3NpZ25hdHVyZT4gICAgICAgIAorICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUMSIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlQyIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdmFyYXJncy8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVE4iLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJVMSIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlUyIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdmFyYXJncy8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVU4iLz4KKyAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgIDx0eXBlPnZvaWQ8L3R5cGU+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmMSI+PHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiZsdDtUMSwgVDIsIC4uLiwgVE4mZ3Q7JmFtcDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYyIj48cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+Jmx0O1UxLCBVMiwgLi4uLCBVTiZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8L3NpZ25hdHVyZT4KKworICAgICAgICA8cmV0dXJucz48c2ltcGFyYT5UcnVlIHdoZW4gPGNvZGU+ZjwvY29kZT4gc3RvcmVzIGFuIG9iamVjdCBvZgorICAgICAgICB0eXBlIDxjb2RlPkZ1bmN0b3I8L2NvZGU+IGFuZCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFwcGxpZXM6CisgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKworICAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPjxjb2RlPmc8L2NvZGU+IGlzIG9mIHR5cGUKKyAgICAgICAgICAgIDxjb2RlPjxjbGFzc25hbWU+cmVmZXJlbmNlX3dyYXBwZXI8L2NsYXNzbmFtZT4mbHQ7RnVuY3RvciZndDs8L2NvZGU+CisgICAgICAgICAgICBhbmQgPGNvZGU+Zi50YXJnZXQmbHQ7RnVuY3RvciZndDsoKSA9PSBnLjxtZXRob2RuYW1lCisgICAgICAgICAgICBhbHQ9InJlZmVyZW5jZV93cmFwcGVyOjpnZXRfcG9pbnRlciI+Z2V0X3BvaW50ZXI8L21ldGhvZG5hbWU+KCk8L2NvZGU+Ljwvc2ltcGFyYT48L2xpc3RpdGVtPgorCisgICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+PGNvZGU+ZzwvY29kZT4gaXMgbm90IG9mIHR5cGUKKyAgICAgICAgICAgIDxjb2RlPjxjbGFzc25hbWU+cmVmZXJlbmNlX3dyYXBwZXI8L2NsYXNzbmFtZT4mbHQ7RnVuY3RvciZndDs8L2NvZGU+CisgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgIDxjb2RlPjxmdW5jdGlvbm5hbWU+ZnVuY3Rpb25fZXF1YWw8L2Z1bmN0aW9ubmFtZT4oKihmLnRhcmdldCZsdDtGdW5jdG9yJmd0OygpKSwKKyAgICAgICAgICAgIGcpPC9jb2RlPi48L3NpbXBhcmE+PC9saXN0aXRlbT4KKworICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDwvc2ltcGFyYT48L3JldHVybnM+CisKKyAgICAgICAgPG5vdGVzPjxzaW1wYXJhPjxjb2RlPjxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+PC9jb2RlPgorICAgICAgICBvYmplY3RzIGFyZSBub3QKKyAgICAgICAgPGNvbmNlcHRuYW1lPkVxdWFsaXR5Q29tcGFyYWJsZTwvY29uY2VwdG5hbWU+Ljwvc2ltcGFyYT48L25vdGVzPgorCisgICAgICAgIDxyYXRpb25hbGU+PHNpbXBhcmE+VGhlIDxjb2RlPnNhZmVfYm9vbDwvY29kZT4gY29udmVyc2lvbgorICAgICAgICBvcGVucyBhIGxvb3Bob2xlIHdoZXJlYnkgdHdvIDxjb2RlPmZ1bmN0aW9uTjwvY29kZT4KKyAgICAgICAgaW5zdGFuY2VzIGNhbiBiZSBjb21wYXJlZCB2aWEgPGNvZGU+PT08L2NvZGU+LCBhbHRob3VnaCB0aGlzCisgICAgICAgIGlzIG5vdCBmZWFzaWJsZSB0byBpbXBsZW1lbnQuIFRoZSB1bmRlZmluZWQgPGNvZGU+dm9pZAorICAgICAgICBvcGVyYXRvcj09PC9jb2RlPiBjbG9zZXMgdGhlIGxvb3Bob2xlIGFuZCBlbnN1cmVzIGEKKyAgICAgICAgY29tcGlsZS10aW1lIG9yIGxpbmstdGltZSBlcnJvci48L3NpbXBhcmE+PC9yYXRpb25hbGU+CisgICAgICA8L292ZXJsb2FkZWQtZnVuY3Rpb24+CisKKyAgICAgIDxvdmVybG9hZGVkLWZ1bmN0aW9uIG5hbWU9Im9wZXJhdG9yIT0iPgorICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUMSIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlQyIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdmFyYXJncy8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVE4iLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGdW5jdG9yIi8+CisgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8dHlwZT5ib29sPC90eXBlPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+PHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiZsdDtUMSwgVDIsIC4uLiwgVE4mZ3Q7JmFtcDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImciPjxwYXJhbXR5cGU+RnVuY3RvcjwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8L3NpZ25hdHVyZT4KKyAgICAgICAgPHNpZ25hdHVyZT4KKyAgICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVDEiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUMiIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXZhcmFyZ3MvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlROIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+Ym9vbDwvdHlwZT4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImciPjxwYXJhbXR5cGU+RnVuY3RvcjwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+PHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiZsdDtUMSwgVDIsIC4uLiwgVE4mZ3Q7JmFtcDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPC9zaWduYXR1cmU+ICAgICAgICAKKyAgICAgICAgPHNpZ25hdHVyZT4KKyAgICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVDEiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUMiIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXZhcmFyZ3MvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlROIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+Ym9vbDwvdHlwZT4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4mbHQ7VDEsIFQyLCAuLi4sIFROJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJnIj48cGFyYW10eXBlPjxjbGFzc25hbWU+cmVmZXJlbmNlX3dyYXBwZXI8L2NsYXNzbmFtZT4mbHQ7RnVuY3RvciZndDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPC9zaWduYXR1cmU+CisgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgPHRlbXBsYXRlPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlQxIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVDIiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS12YXJhcmdzLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUTiIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkZ1bmN0b3IiLz4KKyAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgIDx0eXBlPmJvb2w8L3R5cGU+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJnIj48cGFyYW10eXBlPjxjbGFzc25hbWU+cmVmZXJlbmNlX3dyYXBwZXI8L2NsYXNzbmFtZT4mbHQ7RnVuY3RvciZndDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4mbHQ7VDEsIFQyLCAuLi4sIFROJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDwvc2lnbmF0dXJlPiAgICAgICAgCisgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgPHRlbXBsYXRlPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlQxIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVDIiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS12YXJhcmdzLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUTiIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlUxIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVTIiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS12YXJhcmdzLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJVTiIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+dm9pZDwvdHlwZT4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYxIj48cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+Jmx0O1QxLCBUMiwgLi4uLCBUTiZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZjIiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4mbHQ7VTEsIFUyLCAuLi4sIFVOJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDwvc2lnbmF0dXJlPgorCisgICAgICAgIDxyZXR1cm5zPjxzaW1wYXJhPlRydWUgd2hlbiA8Y29kZT5mPC9jb2RlPiBkb2VzIG5vdCBzdG9yZSBhbgorICAgICAgICBvYmplY3Qgb2YgdHlwZSA8Y29kZT5GdW5jdG9yPC9jb2RlPiBvciBpdCBzdG9yZXMgYW4gb2JqZWN0IG9mCisgICAgICAgIHR5cGUgPGNvZGU+RnVuY3RvcjwvY29kZT4gYW5kIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICAgICAgYXBwbGllczoKKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+PGNvZGU+ZzwvY29kZT4gaXMgb2YgdHlwZQorICAgICAgICAgICAgPGNvZGU+PGNsYXNzbmFtZT5yZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPiZsdDtGdW5jdG9yJmd0OzwvY29kZT4KKyAgICAgICAgICAgIGFuZCA8Y29kZT5mLnRhcmdldCZsdDtGdW5jdG9yJmd0OygpICE9IGcuPG1ldGhvZG5hbWUKKyAgICAgICAgICAgIGFsdD0icmVmZXJlbmNlX3dyYXBwZXI6OmdldF9wb2ludGVyIj5nZXRfcG9pbnRlcjwvbWV0aG9kbmFtZT4oKTwvY29kZT4uPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT48Y29kZT5nPC9jb2RlPiBpcyBub3Qgb2YgdHlwZQorICAgICAgICAgICAgPGNvZGU+PGNsYXNzbmFtZT5yZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPiZsdDtGdW5jdG9yJmd0OzwvY29kZT4KKyAgICAgICAgICAgIGFuZCA8Y29kZT4hPGZ1bmN0aW9ubmFtZT5mdW5jdGlvbl9lcXVhbDwvZnVuY3Rpb25uYW1lPigqKGYudGFyZ2V0Jmx0O0Z1bmN0b3ImZ3Q7KCkpLCBnKTwvY29kZT4uPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisKKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8L3NpbXBhcmE+PC9yZXR1cm5zPgorCisgICAgICAgIDxub3Rlcz48c2ltcGFyYT48Y29kZT48Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPjwvY29kZT4KKyAgICAgICAgb2JqZWN0cyBhcmUgbm90CisgICAgICAgIDxjb25jZXB0bmFtZT5FcXVhbGl0eUNvbXBhcmFibGU8L2NvbmNlcHRuYW1lPi48L3NpbXBhcmE+PC9ub3Rlcz4KKworICAgICAgICA8cmF0aW9uYWxlPjxzaW1wYXJhPlRoZSA8Y29kZT5zYWZlX2Jvb2w8L2NvZGU+IGNvbnZlcnNpb24KKyAgICAgICAgb3BlbnMgYSBsb29waG9sZSB3aGVyZWJ5IHR3byA8Y29kZT5mdW5jdGlvbk48L2NvZGU+CisgICAgICAgIGluc3RhbmNlcyBjYW4gYmUgY29tcGFyZWQgdmlhIDxjb2RlPiE9PC9jb2RlPiwgYWx0aG91Z2ggdGhpcworICAgICAgICBpcyBub3QgZmVhc2libGUgdG8gaW1wbGVtZW50LiBUaGUgdW5kZWZpbmVkIDxjb2RlPnZvaWQKKyAgICAgICAgb3BlcmF0b3IhPTwvY29kZT4gY2xvc2VzIHRoZSBsb29waG9sZSBhbmQgZW5zdXJlcyBhCisgICAgICAgIGNvbXBpbGUtdGltZSBvciBsaW5rLXRpbWUgZXJyb3IuPC9zaW1wYXJhPjwvcmF0aW9uYWxlPgorICAgICAgPC9vdmVybG9hZGVkLWZ1bmN0aW9uPgorICAgIDwvZnJlZS1mdW5jdGlvbi1ncm91cD4KKyAgPC9jbGFzcz4KKworICA8Y2xhc3MgbmFtZT0iZnVuY3Rpb24iPgorICAgIDx0ZW1wbGF0ZT4KKyAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJTaWduYXR1cmUiPgorICAgICAgICA8cHVycG9zZT5GdW5jdGlvbiB0eXBlIFIgKFQxLCBUMiwgLi4uLCBUTik8L3B1cnBvc2U+CisgICAgICA8L3RlbXBsYXRlLXR5cGUtcGFyYW1ldGVyPgorICAgIDwvdGVtcGxhdGU+CisgICAgPGluaGVyaXQgYWNjZXNzPSJwdWJsaWMiPjxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+Jmx0O1IsIFQxLCBUMiwgLi4uLCBUTiZndDs8L2luaGVyaXQ+CisKKyAgICA8cHVycG9zZT5BIGdlbmVyYWxpemVkIGZ1bmN0aW9uIHBvaW50ZXIgdGhhdCBjYW4gYmUgdXNlZCBmb3IKKyAgICBjYWxsYmFja3Mgb3Igd3JhcHBpbmcgZnVuY3Rpb24gb2JqZWN0cy48L3B1cnBvc2U+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICA8cGFyYT5DbGFzcyB0ZW1wbGF0ZSA8Y2xhc3NuYW1lPmZ1bmN0aW9uPC9jbGFzc25hbWU+IGlzIGEgdGhpbgorICAgICAgd3JhcHBlciBhcm91bmQgdGhlIG51bWJlcmVkIGNsYXNzIHRlbXBsYXRlcyA8Y2xhc3NuYW1lCisgICAgICBhbHQ9ImZ1bmN0aW9uTiI+ZnVuY3Rpb24wPC9jbGFzc25hbWU+LCA8Y2xhc3NuYW1lCisgICAgICBhbHQ9ImZ1bmN0aW9uTiI+ZnVuY3Rpb24xPC9jbGFzc25hbWU+LCBldGMuIEl0IGFjY2VwdHMgYQorICAgICAgZnVuY3Rpb24gdHlwZSB3aXRoIE4gYXJndW1lbnRzIGFuZCB3aWxsIHdpbGwgZGVyaXZlIGZyb20KKyAgICAgIDxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+IGluc3RhbnRpYXRlZCB3aXRoIHRoZSBhcmd1bWVudHMKKyAgICAgIGl0IHJlY2VpdmVzLjwvcGFyYT4KKworICAgICAgPHBhcmE+VGhlIHNlbWFudGljcyBvZiBhbGwgb3BlcmF0aW9ucyBpbiBjbGFzcyB0ZW1wbGF0ZQorICAgICAgPGNsYXNzbmFtZT5mdW5jdGlvbjwvY2xhc3NuYW1lPiBhcmUgZXF1aXZhbGVudCB0byB0aGF0IG9mIHRoZQorICAgICAgdW5kZXJseWluZyA8Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiBvYmplY3QsIGFsdGhvdWdoCisgICAgICBhZGRpdGlvbmFsIG1lbWJlciBmdW5jdGlvbnMgYXJlIHJlcXVpcmVkIHRvIGFsbG93IHByb3BlciBjb3B5CisgICAgICBjb25zdHJ1Y3Rpb24gYW5kIGNvcHkgYXNzaWdubWVudCBvZiBmdW5jdGlvbiBvYmplY3RzLjwvcGFyYT4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPHR5cGVkZWYgbmFtZT0icmVzdWx0X3R5cGUiPjx0eXBlPlI8L3R5cGU+PC90eXBlZGVmPgorICAgIDx0eXBlZGVmIG5hbWU9ImFyZ3VtZW50X3R5cGUiPgorICAgICAgPHR5cGU+VDE8L3R5cGU+PHB1cnBvc2U+SWYgTiA9PSAxPC9wdXJwb3NlPgorICAgIDwvdHlwZWRlZj4KKyAgICA8dHlwZWRlZiBuYW1lPSJmaXJzdF9hcmd1bWVudF90eXBlIj4KKyAgICAgIDx0eXBlPlQxPC90eXBlPgorICAgICAgPHB1cnBvc2U+SWYgTiA9PSAyPC9wdXJwb3NlPgorICAgIDwvdHlwZWRlZj4KKyAgICA8dHlwZWRlZiBuYW1lPSJzZWNvbmRfYXJndW1lbnRfdHlwZSI+CisgICAgICA8dHlwZT5UMjwvdHlwZT4KKyAgICAgIDxwdXJwb3NlPklmIE4gPT0gMjwvcHVycG9zZT4KKyAgICA8L3R5cGVkZWY+CisgICAgPHR5cGVkZWYgbmFtZT0iYXJnMV90eXBlIj48dHlwZT5UMTwvdHlwZT48L3R5cGVkZWY+CisgICAgPHR5cGVkZWYgbmFtZT0iYXJnMl90eXBlIj48dHlwZT5UMjwvdHlwZT48L3R5cGVkZWY+CisgICAgPHR5cGVkZWYgbmFtZT0iLi4uIj48dHlwZS8+PC90eXBlZGVmPgorICAgIDx0eXBlZGVmIG5hbWU9ImFyZ05fdHlwZSI+PHR5cGU+VE48L3R5cGU+PC90eXBlZGVmPgorCisgICAgPHN0YXRpYy1jb25zdGFudCBuYW1lPSJhcml0eSI+CisgICAgICA8dHlwZT5pbnQ8L3R5cGU+CisgICAgICA8ZGVmYXVsdD5OPC9kZWZhdWx0PgorICAgIDwvc3RhdGljLWNvbnN0YW50PgorCisgICAgPHN0cnVjdCBuYW1lPSJzaWciPgorICAgICAgPHRlbXBsYXRlPgorICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iQXJncyIvPgorICAgICAgPC90ZW1wbGF0ZT4KKworICAgICAgPHB1cnBvc2U+CisgICAgICAgIDxzaW1wYXJhPjxsaWJyYXJ5bmFtZT5MYW1iZGE8L2xpYnJhcnluYW1lPiBsaWJyYXJ5IHN1cHBvcnQ8L3NpbXBhcmE+CisgICAgICA8L3B1cnBvc2U+CisKKyAgICAgIDx0eXBlZGVmIG5hbWU9InR5cGUiPjx0eXBlPnJlc3VsdF90eXBlPC90eXBlPjwvdHlwZWRlZj4KKyAgICA8L3N0cnVjdD4KKworICAgIDxjb25zdHJ1Y3Rvcj4KKyAgICAgIDxwb3N0Y29uZGl0aW9ucz48c2ltcGFyYT48Y29kZT50aGlzLSZndDs8bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT48L3NpbXBhcmE+PC9wb3N0Y29uZGl0aW9ucz4KKyAgICAgIDx0aHJvd3M+PHNpbXBhcmE+V2lsbCBub3QgdGhyb3cuPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgIDwvY29uc3RydWN0b3I+CisKKyAgICA8Y29uc3RydWN0b3I+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPgorICAgICAgICA8cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+JmFtcDs8L3BhcmFtdHlwZT4KKyAgICAgIDwvcGFyYW1ldGVyPgorICAgICAgPHBvc3Rjb25kaXRpb25zPjxzaW1wYXJhPkNvbnRhaW5zIGEgY29weSBvZiB0aGUgPGNvZGU+ZjwvY29kZT4ncyB0YXJnZXQsIGlmIGl0IGhhcyBvbmUsIG9yIGlzIGVtcHR5IGlmIDxjb2RlPmYuPG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvZGU+Ljwvc2ltcGFyYT48L3Bvc3Rjb25kaXRpb25zPgorICAgICAgPHRocm93cz48c2ltcGFyYT5XaWxsIG5vdCB0aHJvdyB1bmxlc3MgY29weWluZyB0aGUgdGFyZ2V0IG9mIDxjb2RlPmY8L2NvZGU+IHRocm93cy48L3NpbXBhcmE+PC90aHJvd3M+CisgICAgPC9jb25zdHJ1Y3Rvcj4KKyAgICAgICAgCisgICAgPGNvbnN0cnVjdG9yPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj4KKyAgICAgICAgPHBhcmFtdHlwZT48Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiZhbXA7JmFtcDs8L3BhcmFtdHlwZT4KKyAgICAgIDwvcGFyYW1ldGVyPgorICAgICAgPHJlcXVpcmVzPjxzaW1wYXJhPkMrKzExIGNvbXBhdGlibGUgY29tcGlsZXIuPC9zaW1wYXJhPjwvcmVxdWlyZXM+CisgICAgICA8cG9zdGNvbmRpdGlvbnM+PHNpbXBhcmE+TW92ZXMgdGhlIHZhbHVlIGZyb20gPGNvZGU+ZjwvY29kZT4gdG8gPGNvZGU+KnRoaXM8L2NvZGU+LiBJZiB0aGUgYXJndW1lbnQgaGFzIGl0cyBmdW5jdGlvbiBvYmplY3QgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLCBpdHMgYnVmZmVyIHdpbGwgYmUgYXNzaWduZWQgdG8gPGNvZGU+KnRoaXM8L2NvZGU+IGxlYXZpbmcgYXJndW1lbnQgZW1wdHkuPC9zaW1wYXJhPjwvcG9zdGNvbmRpdGlvbnM+CisgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93IHVubGVzcyBhcmd1bWVudCBoYXMgaXRzIGZ1bmN0aW9uIG9iamVjdCBhbGxvY2F0ZWQgbm90IG9uIHRoZSBoZWFwIGFuZCBjb3B5aW5nIHRoZSB0YXJnZXQgb2YgPGNvZGU+ZjwvY29kZT4gdGhyb3dzLjwvc2ltcGFyYT48L3Rocm93cz4KKyAgICA8L2NvbnN0cnVjdG9yPgorICAgIAorICAgIDxjb25zdHJ1Y3Rvcj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+CisgICAgICAgIDxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbjwvY2xhc3NuYW1lPiZhbXA7PC9wYXJhbXR5cGU+CisgICAgICA8L3BhcmFtZXRlcj4KKyAgICAgIDxwb3N0Y29uZGl0aW9ucz48c2ltcGFyYT5Db250YWlucyBhIGNvcHkgb2YgdGhlIDxjb2RlPmY8L2NvZGU+J3MgdGFyZ2V0LCBpZiBpdCBoYXMgb25lLCBvciBpcyBlbXB0eSBpZiA8Y29kZT5mLjxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPi48L3NpbXBhcmE+PC9wb3N0Y29uZGl0aW9ucz4KKyAgICAgIDx0aHJvd3M+PHNpbXBhcmE+V2lsbCBub3QgdGhyb3cgdW5sZXNzIGNvcHlpbmcgdGhlIHRhcmdldCBvZiA8Y29kZT5mPC9jb2RlPiB0aHJvd3MuPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgIDwvY29uc3RydWN0b3I+CisKKyAgICA8Y29uc3RydWN0b3I+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPgorICAgICAgICA8cGFyYW10eXBlPjxjbGFzc25hbWU+ZnVuY3Rpb248L2NsYXNzbmFtZT4mYW1wOyZhbXA7PC9wYXJhbXR5cGU+CisgICAgICA8L3BhcmFtZXRlcj4KKyAgICAgIDxyZXF1aXJlcz48c2ltcGFyYT5DKysxMSBjb21wYXRpYmxlIGNvbXBpbGVyLjwvc2ltcGFyYT48L3JlcXVpcmVzPgorICAgICAgPHBvc3Rjb25kaXRpb25zPjxzaW1wYXJhPk1vdmVzIHRoZSB2YWx1ZSBmcm9tIDxjb2RlPmY8L2NvZGU+IHRvIDxjb2RlPip0aGlzPC9jb2RlPi4gSWYgdGhlIGFyZ3VtZW50IGhhcyBpdHMgZnVuY3Rpb24gb2JqZWN0IGFsbG9jYXRlZCBvbiB0aGUgaGVhcCwgaXRzIGJ1ZmZlciB3aWxsIGJlIGFzc2lnbmVkIHRvIDxjb2RlPip0aGlzPC9jb2RlPiBsZWF2aW5nIGFyZ3VtZW50IGVtcHR5Ljwvc2ltcGFyYT48L3Bvc3Rjb25kaXRpb25zPgorICAgICAgPHRocm93cz48c2ltcGFyYT5XaWxsIG5vdCB0aHJvdyB1bmxlc3MgYXJndW1lbnQgaGFzIGl0cyBmdW5jdGlvbiBvYmplY3QgYWxsb2NhdGVkIG5vdCBvbiB0aGUgaGVhcCBhbmQgY29weWluZyB0aGUgdGFyZ2V0IG9mIDxjb2RlPmY8L2NvZGU+IHRocm93cy48L3NpbXBhcmE+PC90aHJvd3M+CisgICAgPC9jb25zdHJ1Y3Rvcj4KKyAgICAKKyAgICA8Y29uc3RydWN0b3I+CisgICAgICA8dGVtcGxhdGU+CisgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGIi8+CisgICAgICA8L3RlbXBsYXRlPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj48cGFyYW10eXBlPkY8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgIDxyZXF1aXJlcz48c2ltcGFyYT5GIGlzIGEgZnVuY3Rpb24gb2JqZWN0IENhbGxhYmxlIGZyb20gPGNvZGU+dGhpczwvY29kZT4uPC9zaW1wYXJhPjwvcmVxdWlyZXM+CisgICAgICA8cG9zdGNvbmRpdGlvbnM+PHNpbXBhcmE+PGNvZGU+KnRoaXM8L2NvZGU+IHRhcmdldHMgYSBjb3B5IG9mIDxjb2RlPmY8L2NvZGU+IGlmIDxjb2RlPmY8L2NvZGU+IGlzIG5vbmVtcHR5LCBvciA8Y29kZT50aGlzLSZndDs8bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4gaWYgPGNvZGU+ZjwvY29kZT4gaXMgZW1wdHkuPC9zaW1wYXJhPjwvcG9zdGNvbmRpdGlvbnM+CisgICAgPC9jb25zdHJ1Y3Rvcj4KKworICAgIDxjb25zdHJ1Y3Rvcj4KKyAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkYiLz4KKyAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkFsbG9jYXRvciIvPgorICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+PHBhcmFtdHlwZT5GPC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImFsbG9jIj48cGFyYW10eXBlPkFsbG9jYXRvcjwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgPHJlcXVpcmVzPjxzaW1wYXJhPkYgaXMgYSBmdW5jdGlvbiBvYmplY3QgQ2FsbGFibGUgZnJvbSA8Y29kZT50aGlzPC9jb2RlPiwgQWxsb2NhdG9yIGlzIGFuIGFsbG9jYXRvci4gVGhlIGNvcHkgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3Igb2YgQWxsb2NhdG9yIHNoYWxsIG5vdCB0aHJvdy48L3NpbXBhcmE+PC9yZXF1aXJlcz4KKyAgICAgIDxwb3N0Y29uZGl0aW9ucz48c2ltcGFyYT48Y29kZT4qdGhpczwvY29kZT4gdGFyZ2V0cyBhIGNvcHkgb2YgPGNvZGU+ZjwvY29kZT4gaWYgPGNvZGU+ZjwvY29kZT4gaXMgbm9uZW1wdHksIG9yIDxjb2RlPnRoaXMtJmd0OzxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPiBpZiA8Y29kZT5mPC9jb2RlPiBpcyBlbXB0eS48L3NpbXBhcmE+PC9wb3N0Y29uZGl0aW9ucz4KKworICAgICAgPGVmZmVjdHM+PHNpbXBhcmE+SWYgbWVtb3J5IGFsbG9jYXRpb24gaXMgcmVxdWlyZWQsIHRoZSBnaXZlbiBhbGxvY2F0b3IgKG9yIGEgY29weSBvZiBpdCkgd2lsbCBiZSB1c2VkIHRvIGFsbG9jYXRlIHRoYXQgbWVtb3J5Ljwvc2ltcGFyYT48L2VmZmVjdHM+CisgICAgPC9jb25zdHJ1Y3Rvcj4KKworICAgIDxkZXN0cnVjdG9yPgorICAgICAgPGVmZmVjdHM+PHNpbXBhcmE+SWYgPGNvZGU+IXRoaXMtJmd0OzxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPiwgZGVzdHJveXMgdGhlIHRhcmdldCBvZiA8Y29kZT50aGlzPC9jb2RlPi48L3NpbXBhcmE+PC9lZmZlY3RzPgorCisgICAgPC9kZXN0cnVjdG9yPgorCisgICAgPGNvcHktYXNzaWdubWVudD4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+CisgICAgICAgIDxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4mYW1wOzwvcGFyYW10eXBlPgorICAgICAgPC9wYXJhbWV0ZXI+CisgICAgICA8cG9zdGNvbmRpdGlvbnM+PHNpbXBhcmE+SWYgY29weSBjb25zdHJ1Y3Rpb24gZG9lcyBub3QgdGhyb3csIDxjb2RlPip0aGlzPC9jb2RlPiB0YXJnZXRzIGEgY29weSBvZiA8Y29kZT5mPC9jb2RlPidzIHRhcmdldCwgaWYgaXQgaGFzIG9uZSwgb3IgaXMgZW1wdHkgaWYgPGNvZGU+Zi48bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4uIElmIGNvcHkgY29uc3RydWN0aW9uIGRvZXMgdGhyb3csIDxjb2RlPnRoaXMtJmd0OzxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPi48L3NpbXBhcmE+PC9wb3N0Y29uZGl0aW9ucz4KKyAgICA8L2NvcHktYXNzaWdubWVudD4KKyAgICAKKyAgICA8Y29weS1hc3NpZ25tZW50PgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj4KKyAgICAgICAgPHBhcmFtdHlwZT48Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiZhbXA7JmFtcDs8L3BhcmFtdHlwZT4KKyAgICAgIDwvcGFyYW1ldGVyPgorICAgICAgPHJlcXVpcmVzPjxzaW1wYXJhPkMrKzExIGNvbXBhdGlibGUgY29tcGlsZXIuPC9zaW1wYXJhPjwvcmVxdWlyZXM+CisgICAgICA8cG9zdGNvbmRpdGlvbnM+PHNpbXBhcmE+TW92ZXMgdGhlIHZhbHVlIGZyb20gPGNvZGU+ZjwvY29kZT4gdG8gPGNvZGU+KnRoaXM8L2NvZGU+LiBJZiB0aGUgYXJndW1lbnQgaGFzIGl0cyBmdW5jdGlvbiBvYmplY3QgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLCBpdHMgYnVmZmVyIHdpbGwgYmUgYXNzaWduZWQgdG8gPGNvZGU+KnRoaXM8L2NvZGU+IGxlYXZpbmcgYXJndW1lbnQgZW1wdHkuPC9zaW1wYXJhPjwvcG9zdGNvbmRpdGlvbnM+CisgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93IHVubGVzcyBhcmd1bWVudCBoYXMgaXRzIGZ1bmN0aW9uIG9iamVjdCBhbGxvY2F0ZWQgbm90IG9uIHRoZSBoZWFwIGFuZCBjb3B5aW5nIHRoZSB0YXJnZXQgb2YgPGNvZGU+ZjwvY29kZT4gdGhyb3dzLjwvc2ltcGFyYT48L3Rocm93cz4KKyAgICA8L2NvcHktYXNzaWdubWVudD4KKworICAgIDxjb3B5LWFzc2lnbm1lbnQ+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPgorICAgICAgICA8cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb248L2NsYXNzbmFtZT4mYW1wOzwvcGFyYW10eXBlPgorICAgICAgPC9wYXJhbWV0ZXI+CisgICAgICA8cG9zdGNvbmRpdGlvbnM+PHNpbXBhcmE+SWYgY29weSBjb25zdHJ1Y3Rpb24gb2YgdGhlIHRhcmdldCBvZiA8Y29kZT5mPC9jb2RlPiBkb2VzIG5vdCB0aHJvdywgPGNvZGU+KnRoaXM8L2NvZGU+IHRhcmdldHMgYSBjb3B5IG9mIDxjb2RlPmY8L2NvZGU+J3MgdGFyZ2V0LCBpZiBpdCBoYXMgb25lLCBvciBpcyBlbXB0eSBpZiA8Y29kZT5mLjxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPi4gPC9zaW1wYXJhPjwvcG9zdGNvbmRpdGlvbnM+CisgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93IHdoZW4gdGhlIHRhcmdldCBvZiA8Y29kZT5mPC9jb2RlPiBpcyBhIHN0YXRlbGVzcyBmdW5jdGlvbiBvYmplY3Qgb3IgYSByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uIG9iamVjdC4gSWYgY29weSBjb25zdHJ1Y3Rpb24gZG9lcyB0aHJvdywgPGNvZGU+dGhpcy0mZ3Q7PG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvZGU+Ljwvc2ltcGFyYT48L3Rocm93cz4KKyAgICA8L2NvcHktYXNzaWdubWVudD4KKyAgICAKKyAgICA8Y29weS1hc3NpZ25tZW50PgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj4KKyAgICAgICAgPHBhcmFtdHlwZT48Y2xhc3NuYW1lPmZ1bmN0aW9uPC9jbGFzc25hbWU+JmFtcDsmYW1wOzwvcGFyYW10eXBlPgorICAgICAgPC9wYXJhbWV0ZXI+CisgICAgICA8cmVxdWlyZXM+PHNpbXBhcmE+QysrMTEgY29tcGF0aWJsZSBjb21waWxlci48L3NpbXBhcmE+PC9yZXF1aXJlcz4KKyAgICAgIDxwb3N0Y29uZGl0aW9ucz48c2ltcGFyYT5Nb3ZlcyB0aGUgdmFsdWUgZnJvbSA8Y29kZT5mPC9jb2RlPiB0byA8Y29kZT4qdGhpczwvY29kZT4uIElmIHRoZSBhcmd1bWVudCBoYXMgaXRzIGZ1bmN0aW9uIG9iamVjdCBhbGxvY2F0ZWQgb24gdGhlIGhlYXAsIGl0cyBidWZmZXIgd2lsbCBiZSBhc3NpZ25lZCB0byA8Y29kZT4qdGhpczwvY29kZT4gbGVhdmluZyBhcmd1bWVudCBlbXB0eS48L3NpbXBhcmE+PC9wb3N0Y29uZGl0aW9ucz4KKyAgICAgIDx0aHJvd3M+PHNpbXBhcmE+V2lsbCBub3QgdGhyb3cgdW5sZXNzIGFyZ3VtZW50IGhhcyBpdHMgZnVuY3Rpb24gb2JqZWN0IGFsbG9jYXRlZCBub3Qgb24gdGhlIGhlYXAgYW5kIGNvcHlpbmcgdGhlIHRhcmdldCBvZiA8Y29kZT5mPC9jb2RlPiB0aHJvd3MuPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgIDwvY29weS1hc3NpZ25tZW50PgorCisgICAgPG1ldGhvZC1ncm91cCBuYW1lPSJtb2RpZmllcnMiPgorICAgICAgPG1ldGhvZCBuYW1lPSJzd2FwIj4KKyAgICAgICAgPHR5cGU+dm9pZDwvdHlwZT4KKyAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj48cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb248L2NsYXNzbmFtZT4mYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8ZWZmZWN0cz48c2ltcGFyYT5JbnRlcmNoYW5nZXMgdGhlIHRhcmdldHMgb2YgPGNvZGU+KnRoaXM8L2NvZGU+IGFuZCA8Y29kZT5mPC9jb2RlPi48L3NpbXBhcmE+PC9lZmZlY3RzPgorICAgICAgPC9tZXRob2Q+CisKKyAgICAgIDxtZXRob2QgbmFtZT0iY2xlYXIiPgorICAgICAgICA8dHlwZT52b2lkPC90eXBlPgorICAgICAgICA8cG9zdGNvbmRpdGlvbnM+PHNpbXBhcmE+PGNvZGU+dGhpcy0mZ3Q7PG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvZGU+PC9zaW1wYXJhPjwvcG9zdGNvbmRpdGlvbnM+CisgICAgICAgIDx0aHJvd3M+PHNpbXBhcmE+V2lsbCBub3QgdGhyb3cuPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgICAgPC9tZXRob2Q+CisgICAgPC9tZXRob2QtZ3JvdXA+CisKKyAgICA8bWV0aG9kLWdyb3VwIG5hbWU9ImNhcGFjaXR5Ij4KKyAgICAgIDxtZXRob2QgbmFtZT0iZW1wdHkiIGN2PSJjb25zdCI+CisgICAgICAgIDx0eXBlPmJvb2w8L3R5cGU+CisgICAgICAgIDxyZXR1cm5zPjxzaW1wYXJhPjxjb2RlPmZhbHNlPC9jb2RlPiBpZiA8Y29kZT50aGlzPC9jb2RlPiBoYXMgYSB0YXJnZXQsIGFuZCA8Y29kZT50cnVlPC9jb2RlPiBvdGhlcndpc2UuPC9zaW1wYXJhPjwvcmV0dXJucz4KKyAgICAgICAgPHRocm93cz48c2ltcGFyYT5XaWxsIG5vdCB0aHJvdy48L3NpbXBhcmE+PC90aHJvd3M+CisgICAgICA8L21ldGhvZD4KKworICAgICAgPG1ldGhvZCBuYW1lPSJjb252ZXJzaW9uLW9wZXJhdG9yIiBjdj0iY29uc3QiPgorICAgICAgICA8dHlwZT5zYWZlX2Jvb2w8L3R5cGU+CisgICAgICAgIDxyZXR1cm5zPjxzaW1wYXJhPkEgPGNvZGU+c2FmZV9ib29sPC9jb2RlPiB0aGF0IGV2YWx1YXRlcyA8Y29kZT5mYWxzZTwvY29kZT4gaW4gYSBib29sZWFuIGNvbnRleHQgd2hlbiA8Y29kZT50aGlzLSZndDs8bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4sIGFuZCA8Y29kZT50cnVlPC9jb2RlPiBvdGhlcndpc2UuPC9zaW1wYXJhPjwvcmV0dXJucz4KKyAgICAgICAgPHRocm93cz48c2ltcGFyYT5XaWxsIG5vdCB0aHJvdy48L3NpbXBhcmE+PC90aHJvd3M+CisgICAgICA8L21ldGhvZD4KKworICAgICAgPG1ldGhvZCBuYW1lPSJvcGVyYXRvciEiIGN2PSJjb25zdCI+CisgICAgICAgIDx0eXBlPmJvb2w8L3R5cGU+CisgICAgICAgIDxyZXR1cm5zPjxzaW1wYXJhPjxjb2RlPnRoaXMtJmd0OzxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPjwvc2ltcGFyYT48L3JldHVybnM+CisgICAgICAgIDx0aHJvd3M+PHNpbXBhcmE+V2lsbCBub3QgdGhyb3cuPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgICAgPC9tZXRob2Q+CisgICAgPC9tZXRob2QtZ3JvdXA+CisKKyAgICA8bWV0aG9kLWdyb3VwIG5hbWU9InRhcmdldCBhY2Nlc3MiPgorICAgICAgPG92ZXJsb2FkZWQtbWV0aG9kIG5hbWU9InRhcmdldCI+CisgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgPHRlbXBsYXRlPiAKKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGdW5jdG9yIi8+CisgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8dHlwZT5GdW5jdG9yKjwvdHlwZT4KKyAgICAgICAgPC9zaWduYXR1cmU+CisgICAgICAgIDxzaWduYXR1cmUgY3Y9ImNvbnN0Ij4KKyAgICAgICAgICA8dGVtcGxhdGU+IAorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkZ1bmN0b3IiLz4KKyAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgIDx0eXBlPmNvbnN0IEZ1bmN0b3IqPC90eXBlPgorICAgICAgICA8L3NpZ25hdHVyZT4KKworICAgICAgICA8cmV0dXJucz48c2ltcGFyYT5JZiA8Y29kZT50aGlzPC9jb2RlPiBzdG9yZXMgYSB0YXJnZXQgb2YgdHlwZQorICAgICAgICA8Y29kZT5GdW5jdG9yPC9jb2RlPiwgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgICAgICAgdGFyZ2V0LiBPdGhlcndpc2UsIHJldHVybnMgdGhlIE5VTEwKKyAgICAgICAgcG9pbnRlci48L3NpbXBhcmE+PC9yZXR1cm5zPgorICAgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93Ljwvc2ltcGFyYT48L3Rocm93cz4KKyAgICAgIDwvb3ZlcmxvYWRlZC1tZXRob2Q+CisKKyAgICAgIDxtZXRob2QgbmFtZT0iY29udGFpbnMiIGN2PSJjb25zdCI+CisgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICA8dHlwZT5ib29sPC90eXBlPgorICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPgorICAgICAgICAgIDxwYXJhbXR5cGU+Y29uc3QgRnVuY3RvciZhbXA7PC9wYXJhbXR5cGU+CisgICAgICAgIDwvcGFyYW1ldGVyPgorICAgICAgICA8cmV0dXJucz48c2ltcGFyYT48Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT50aGlzLSZndDs8bWV0aG9kbmFtZT50YXJnZXQ8L21ldGhvZG5hbWU+Jmx0O0Z1bmN0b3ImZ3Q7KCk8L2NvZGU+IGlzIG5vbi1OVUxMIGFuZCA8Y29kZT48ZnVuY3Rpb25uYW1lPmZ1bmN0aW9uX2VxdWFsPC9mdW5jdGlvbm5hbWU+KCoodGhpcy0mZ3Q7dGFyZ2V0Jmx0O0Z1bmN0b3ImZ3Q7KCkpLCBmKTwvY29kZT48L3NpbXBhcmE+PC9yZXR1cm5zPgorIAorICAgICAgPC9tZXRob2Q+CisKKyAgICAgIDxtZXRob2QgbmFtZT0idGFyZ2V0X3R5cGUiIGN2PSJjb25zdCI+CisgICAgICAgIDx0eXBlPmNvbnN0IHN0ZDo6dHlwZV9pbmZvJmFtcDs8L3R5cGU+CisgICAgICAgIDxyZXR1cm5zPjxzaW1wYXJhPjxjb2RlPnR5cGVpZDwvY29kZT4gb2YgdGhlIHRhcmdldCBmdW5jdGlvbiBvYmplY3QsIG9yIDxjb2RlPnR5cGVpZCh2b2lkKTwvY29kZT4gaWYgPGNvZGU+dGhpcy0mZ3Q7PG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvZGU+Ljwvc2ltcGFyYT48L3JldHVybnM+CisgICAgICAgIDx0aHJvd3M+PHNpbXBhcmE+V2lsbCBub3QgdGhyb3cuPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgICAgPC9tZXRob2Q+CisgICAgPC9tZXRob2QtZ3JvdXA+CisKKyAgICA8bWV0aG9kLWdyb3VwIG5hbWU9Imludm9jYXRpb24iPgorICAgICAgPG1ldGhvZCBuYW1lPSJvcGVyYXRvcigpIiBjdj0iY29uc3QiPgorICAgICAgICA8dHlwZT5yZXN1bHRfdHlwZTwvdHlwZT4KKyAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJhMSI+PHBhcmFtdHlwZT5hcmcxX3R5cGU8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJhMiI+PHBhcmFtdHlwZT5hcmcyX3R5cGU8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPHBhcmFtZXRlcj48cGFyYW10eXBlPi4uLjwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImFOIj48cGFyYW10eXBlPmFyZ05fdHlwZTwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8ZWZmZWN0cz48c2ltcGFyYT48Y29kZT5mKGExLCBhMiwgLi4uLCBhTik8L2NvZGU+LCB3aGVyZSA8Y29kZT5mPC9jb2RlPiBpcyB0aGUgdGFyZ2V0IG9mIDxjb2RlPip0aGlzPC9jb2RlPi48L3NpbXBhcmE+PC9lZmZlY3RzPgorICAgICAgICA8cmV0dXJucz48c2ltcGFyYT5pZiA8Y29kZT5SPC9jb2RlPiBpcyA8Y29kZT52b2lkPC9jb2RlPiwgbm90aGluZyBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBjYWxsIHRvIDxjb2RlPmY8L2NvZGU+IGlzIHJldHVybmVkLjwvc2ltcGFyYT48L3JldHVybnM+CisgICAgICAgIDx0aHJvd3M+PHNpbXBhcmE+PGNvZGU+PGNsYXNzbmFtZT5iYWRfZnVuY3Rpb25fY2FsbDwvY2xhc3NuYW1lPjwvY29kZT4gaWYgPGNvZGU+dGhpcy0mZ3Q7PG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvZGU+LiBPdGhlcndpc2UsIG1heSB0aHJvdWdoIGFueSBleGNlcHRpb24gdGhyb3duIGJ5IHRoZSB0YXJnZXQgZnVuY3Rpb24gPGNvZGU+ZjwvY29kZT4uPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgICAgPC9tZXRob2Q+CisgICAgPC9tZXRob2QtZ3JvdXA+CisKKyAgICA8ZnJlZS1mdW5jdGlvbi1ncm91cCBuYW1lPSJzcGVjaWFsaXplZCBhbGdvcml0aG1zIj4KKyAgICAgIDxmdW5jdGlvbiBuYW1lPSJzd2FwIj4KKyAgICAgICAgPHRlbXBsYXRlPgorICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJTaWduYXR1cmUiLz4KKyAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgPHR5cGU+dm9pZDwvdHlwZT4KKyAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmMSI+PHBhcmFtdHlwZT48Y2xhc3NuYW1lPmZ1bmN0aW9uPC9jbGFzc25hbWU+Jmx0O1NpZ25hdHVyZSZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYyIj48cGFyYW10eXBlPjxjbGFzc25hbWU+ZnVuY3Rpb248L2NsYXNzbmFtZT4mbHQ7U2lnbmF0dXJlJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDxlZmZlY3RzPjxzaW1wYXJhPjxjb2RlPmYxLjxtZXRob2RuYW1lPnN3YXA8L21ldGhvZG5hbWU+KGYyKTwvY29kZT48L3NpbXBhcmE+PC9lZmZlY3RzPgorICAgICAgPC9mdW5jdGlvbj4KKyAgICA8L2ZyZWUtZnVuY3Rpb24tZ3JvdXA+CisKKyAgICA8ZnJlZS1mdW5jdGlvbi1ncm91cCBuYW1lPSJjb21wYXJpc29uIG9wZXJhdG9ycyI+CisgICAgICA8b3ZlcmxvYWRlZC1mdW5jdGlvbiBuYW1lPSJvcGVyYXRvcj09Ij4KKyAgICAgICAgPHNpZ25hdHVyZT4KKyAgICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iU2lnbmF0dXJlIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+Ym9vbDwvdHlwZT4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbjwvY2xhc3NuYW1lPiZsdDtTaWduYXR1cmUmZ3Q7JmFtcDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImciPjxwYXJhbXR5cGU+RnVuY3RvcjwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8L3NpZ25hdHVyZT4KKyAgICAgICAgPHNpZ25hdHVyZT4KKyAgICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iU2lnbmF0dXJlIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+Ym9vbDwvdHlwZT4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImciPjxwYXJhbXR5cGU+RnVuY3RvcjwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+PHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uPC9jbGFzc25hbWU+Jmx0O1NpZ25hdHVyZSZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8L3NpZ25hdHVyZT4gICAgICAgIAorICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJTaWduYXR1cmUiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGdW5jdG9yIi8+CisgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8dHlwZT5ib29sPC90eXBlPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+PHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uPC9jbGFzc25hbWU+Jmx0O1NpZ25hdHVyZSZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZyI+PHBhcmFtdHlwZT48Y2xhc3NuYW1lPnJlZmVyZW5jZV93cmFwcGVyPC9jbGFzc25hbWU+Jmx0O0Z1bmN0b3ImZ3Q7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDwvc2lnbmF0dXJlPgorICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJTaWduYXR1cmUiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGdW5jdG9yIi8+CisgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8dHlwZT5ib29sPC90eXBlPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZyI+PHBhcmFtdHlwZT48Y2xhc3NuYW1lPnJlZmVyZW5jZV93cmFwcGVyPC9jbGFzc25hbWU+Jmx0O0Z1bmN0b3ImZ3Q7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj48cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb248L2NsYXNzbmFtZT4mbHQ7U2lnbmF0dXJlJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDwvc2lnbmF0dXJlPiAgICAgICAgCisgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgPHRlbXBsYXRlPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlNpZ25hdHVyZTEiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJTaWduYXR1cmUyIi8+CisgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8dHlwZT52b2lkPC90eXBlPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZjEiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbjwvY2xhc3NuYW1lPiZsdDtTaWduYXR1cmUxJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmMiI+PHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uPC9jbGFzc25hbWU+Jmx0O1NpZ25hdHVyZTImZ3Q7JmFtcDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPC9zaWduYXR1cmU+CisKKyAgICAgICAgPHJldHVybnM+PHNpbXBhcmE+VHJ1ZSB3aGVuIDxjb2RlPmY8L2NvZGU+IHN0b3JlcyBhbiBvYmplY3Qgb2YKKyAgICAgICAgdHlwZSA8Y29kZT5GdW5jdG9yPC9jb2RlPiBhbmQgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcHBsaWVzOgorICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT48Y29kZT5nPC9jb2RlPiBpcyBvZiB0eXBlCisgICAgICAgICAgICA8Y29kZT48Y2xhc3NuYW1lPnJlZmVyZW5jZV93cmFwcGVyPC9jbGFzc25hbWU+Jmx0O0Z1bmN0b3ImZ3Q7PC9jb2RlPgorICAgICAgICAgICAgYW5kIDxjb2RlPmYudGFyZ2V0Jmx0O0Z1bmN0b3ImZ3Q7KCkgPT0gZy48bWV0aG9kbmFtZQorICAgICAgICAgICAgYWx0PSJyZWZlcmVuY2Vfd3JhcHBlcjo6Z2V0X3BvaW50ZXIiPmdldF9wb2ludGVyPC9tZXRob2RuYW1lPigpPC9jb2RlPi48L3NpbXBhcmE+PC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPjxjb2RlPmc8L2NvZGU+IGlzIG5vdCBvZiB0eXBlCisgICAgICAgICAgICA8Y29kZT48Y2xhc3NuYW1lPnJlZmVyZW5jZV93cmFwcGVyPC9jbGFzc25hbWU+Jmx0O0Z1bmN0b3ImZ3Q7PC9jb2RlPgorICAgICAgICAgICAgYW5kIDxjb2RlPjxmdW5jdGlvbm5hbWU+ZnVuY3Rpb25fZXF1YWxzPC9mdW5jdGlvbm5hbWU+KCooZi50YXJnZXQmbHQ7RnVuY3RvciZndDsoKSksIGcpPC9jb2RlPi48L3NpbXBhcmE+PC9saXN0aXRlbT4KKworICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDwvc2ltcGFyYT48L3JldHVybnM+CisKKyAgICAgICAgPG5vdGVzPjxzaW1wYXJhPjxjb2RlPjxjbGFzc25hbWU+ZnVuY3Rpb248L2NsYXNzbmFtZT48L2NvZGU+CisgICAgICAgIG9iamVjdHMgYXJlIG5vdAorICAgICAgICA8Y29uY2VwdG5hbWU+RXF1YWxpdHlDb21wYXJhYmxlPC9jb25jZXB0bmFtZT4uPC9zaW1wYXJhPjwvbm90ZXM+CisKKyAgICAgICAgPHJhdGlvbmFsZT48c2ltcGFyYT5UaGUgPGNvZGU+c2FmZV9ib29sPC9jb2RlPiBjb252ZXJzaW9uCisgICAgICAgIG9wZW5zIGEgbG9vcGhvbGUgd2hlcmVieSB0d28gPGNvZGU+ZnVuY3Rpb248L2NvZGU+CisgICAgICAgIGluc3RhbmNlcyBjYW4gYmUgY29tcGFyZWQgdmlhIDxjb2RlPj09PC9jb2RlPiwgYWx0aG91Z2ggdGhpcworICAgICAgICBpcyBub3QgZmVhc2libGUgdG8gaW1wbGVtZW50LiBUaGUgdW5kZWZpbmVkIDxjb2RlPnZvaWQKKyAgICAgICAgb3BlcmF0b3I9PTwvY29kZT4gY2xvc2VzIHRoZSBsb29waG9sZSBhbmQgZW5zdXJlcyBhCisgICAgICAgIGNvbXBpbGUtdGltZSBvciBsaW5rLXRpbWUgZXJyb3IuPC9zaW1wYXJhPjwvcmF0aW9uYWxlPgorICAgICAgPC9vdmVybG9hZGVkLWZ1bmN0aW9uPgorCisgICAgICA8b3ZlcmxvYWRlZC1mdW5jdGlvbiBuYW1lPSJvcGVyYXRvciE9Ij4KKyAgICAgICAgPHNpZ25hdHVyZT4KKyAgICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iU2lnbmF0dXJlIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+Ym9vbDwvdHlwZT4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbjwvY2xhc3NuYW1lPiZsdDtTaWduYXR1cmUmZ3Q7JmFtcDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImciPjxwYXJhbXR5cGU+RnVuY3RvcjwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8L3NpZ25hdHVyZT4KKyAgICAgICAgPHNpZ25hdHVyZT4KKyAgICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iU2lnbmF0dXJlIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+Ym9vbDwvdHlwZT4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImciPjxwYXJhbXR5cGU+RnVuY3RvcjwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+PHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uPC9jbGFzc25hbWU+Jmx0O1NpZ25hdHVyZSZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8L3NpZ25hdHVyZT4gICAgICAgIAorICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJTaWduYXR1cmUiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGdW5jdG9yIi8+CisgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8dHlwZT5ib29sPC90eXBlPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+PHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uPC9jbGFzc25hbWU+Jmx0O1NpZ25hdHVyZSZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZyI+PHBhcmFtdHlwZT48Y2xhc3NuYW1lPnJlZmVyZW5jZV93cmFwcGVyPC9jbGFzc25hbWU+Jmx0O0Z1bmN0b3ImZ3Q7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDwvc2lnbmF0dXJlPgorICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJTaWduYXR1cmUiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGdW5jdG9yIi8+CisgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8dHlwZT5ib29sPC90eXBlPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZyI+PHBhcmFtdHlwZT48Y2xhc3NuYW1lPnJlZmVyZW5jZV93cmFwcGVyPC9jbGFzc25hbWU+Jmx0O0Z1bmN0b3ImZ3Q7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj48cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb248L2NsYXNzbmFtZT4mbHQ7U2lnbmF0dXJlJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDwvc2lnbmF0dXJlPiAgICAgICAgCisgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgPHRlbXBsYXRlPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlNpZ25hdHVyZTEiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJTaWduYXR1cmUyIi8+CisgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8dHlwZT52b2lkPC90eXBlPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZjEiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbjwvY2xhc3NuYW1lPiZsdDtTaWduYXR1cmUxJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmMiI+PHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uPC9jbGFzc25hbWU+Jmx0O1NpZ25hdHVyZTImZ3Q7JmFtcDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPC9zaWduYXR1cmU+CisKKyAgICAgICAgPHJldHVybnM+PHNpbXBhcmE+VHJ1ZSB3aGVuIDxjb2RlPmY8L2NvZGU+IGRvZXMgbm90IHN0b3JlIGFuCisgICAgICAgIG9iamVjdCBvZiB0eXBlIDxjb2RlPkZ1bmN0b3I8L2NvZGU+IG9yIGl0IHN0b3JlcyBhbiBvYmplY3Qgb2YKKyAgICAgICAgdHlwZSA8Y29kZT5GdW5jdG9yPC9jb2RlPiBhbmQgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgICAgICBhcHBsaWVzOgorICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT48Y29kZT5nPC9jb2RlPiBpcyBvZiB0eXBlCisgICAgICAgICAgICA8Y29kZT48Y2xhc3NuYW1lPnJlZmVyZW5jZV93cmFwcGVyPC9jbGFzc25hbWU+Jmx0O0Z1bmN0b3ImZ3Q7PC9jb2RlPgorICAgICAgICAgICAgYW5kIDxjb2RlPmYudGFyZ2V0Jmx0O0Z1bmN0b3ImZ3Q7KCkgIT0gZy48bWV0aG9kbmFtZQorICAgICAgICAgICAgYWx0PSJyZWZlcmVuY2Vfd3JhcHBlcjo6Z2V0X3BvaW50ZXIiPmdldF9wb2ludGVyPC9tZXRob2RuYW1lPigpPC9jb2RlPi48L3NpbXBhcmE+PC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPjxjb2RlPmc8L2NvZGU+IGlzIG5vdCBvZiB0eXBlCisgICAgICAgICAgICA8Y29kZT48Y2xhc3NuYW1lPnJlZmVyZW5jZV93cmFwcGVyPC9jbGFzc25hbWU+Jmx0O0Z1bmN0b3ImZ3Q7PC9jb2RlPgorICAgICAgICAgICAgYW5kIDxjb2RlPiE8ZnVuY3Rpb25uYW1lPmZ1bmN0aW9uX2VxdWFsczwvZnVuY3Rpb25uYW1lPigqKGYudGFyZ2V0Jmx0O0Z1bmN0b3ImZ3Q7KCkpLCBnKTwvY29kZT4uPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisKKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8L3NpbXBhcmE+PC9yZXR1cm5zPgorCisgICAgICAgIDxub3Rlcz48c2ltcGFyYT48Y29kZT48Y2xhc3NuYW1lPmZ1bmN0aW9uPC9jbGFzc25hbWU+PC9jb2RlPgorICAgICAgICBvYmplY3RzIGFyZSBub3QKKyAgICAgICAgPGNvbmNlcHRuYW1lPkVxdWFsaXR5Q29tcGFyYWJsZTwvY29uY2VwdG5hbWU+Ljwvc2ltcGFyYT48L25vdGVzPgorCisgICAgICAgIDxyYXRpb25hbGU+PHNpbXBhcmE+VGhlIDxjb2RlPnNhZmVfYm9vbDwvY29kZT4gY29udmVyc2lvbgorICAgICAgICBvcGVucyBhIGxvb3Bob2xlIHdoZXJlYnkgdHdvIDxjb2RlPmZ1bmN0aW9uPC9jb2RlPgorICAgICAgICBpbnN0YW5jZXMgY2FuIGJlIGNvbXBhcmVkIHZpYSA8Y29kZT4hPTwvY29kZT4sIGFsdGhvdWdoIHRoaXMKKyAgICAgICAgaXMgbm90IGZlYXNpYmxlIHRvIGltcGxlbWVudC4gVGhlIHVuZGVmaW5lZCA8Y29kZT52b2lkCisgICAgICAgIG9wZXJhdG9yIT08L2NvZGU+IGNsb3NlcyB0aGUgbG9vcGhvbGUgYW5kIGVuc3VyZXMgYQorICAgICAgICBjb21waWxlLXRpbWUgb3IgbGluay10aW1lIGVycm9yLjwvc2ltcGFyYT48L3JhdGlvbmFsZT4KKyAgICAgIDwvb3ZlcmxvYWRlZC1mdW5jdGlvbj4KKyAgICA8L2ZyZWUtZnVuY3Rpb24tZ3JvdXA+CisgIDwvY2xhc3M+Cis8L25hbWVzcGFjZT4KKzwvaGVhZGVyPgorCis8aGVhZGVyIG5hbWU9ImJvb3N0L2Z1bmN0aW9uX2VxdWFsLmhwcCI+CisgIDxuYW1lc3BhY2UgbmFtZT0iYm9vc3QiPgorICA8ZnVuY3Rpb24gbmFtZT0iZnVuY3Rpb25fZXF1YWwiPgorICAgIDx0ZW1wbGF0ZT4KKyAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGIi8+CisgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRyIvPgorICAgIDwvdGVtcGxhdGU+CisgICAgPHR5cGU+Ym9vbDwvdHlwZT4KKyAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPgorICAgICAgPHBhcmFtdHlwZT5jb25zdCBGJmFtcDs8L3BhcmFtdHlwZT4KKyAgICA8L3BhcmFtZXRlcj4KKyAgICA8cGFyYW1ldGVyIG5hbWU9ImciPgorICAgICAgPHBhcmFtdHlwZT5jb25zdCBHJmFtcDs8L3BhcmFtdHlwZT4KKyAgICA8L3BhcmFtZXRlcj4KKyAgICA8cHVycG9zZT48c2ltcGFyYT5Db21wYXJlIHR3byBmdW5jdGlvbiBvYmplY3RzIGZvciBlcXVhbGl0eS48L3NpbXBhcmE+PC9wdXJwb3NlPgorICAgIDxyZXR1cm5zPjxzaW1wYXJhPjxjb2RlPmYgPT0gZzwvY29kZT4uPC9zaW1wYXJhPjwvcmV0dXJucz4KKyAgICA8dGhyb3dzPjxzaW1wYXJhPk9ubHkgaWYgPGNvZGU+ZiA9PSBnPC9jb2RlPiB0aHJvd3MuPC9zaW1wYXJhPjwvdGhyb3dzPgorICA8L2Z1bmN0aW9uPgorICA8L25hbWVzcGFjZT4KKzwvaGVhZGVyPgorPC9saWJyYXJ5LXJlZmVyZW5jZT4KZGlmZiAtLWdpdCBhL2xpYnMvZnVuY3Rpb24vZG9jL3Rlc3RzLnhtbCBiL2xpYnMvZnVuY3Rpb24vZG9jL3Rlc3RzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGQ4YjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9mdW5jdGlvbi9kb2MvdGVzdHMueG1sCkBAIC0wLDAgKzEsMjU4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICAgQ29weXJpZ2h0IChjKSAyMDAyIERvdWdsYXMgR3JlZ29yIDxkb3VnLmdyZWdvciAtYXQtIGdtYWlsLmNvbT4KKyAgCisgICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgICAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisgICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgIC0tPgorPCFET0NUWVBFIGxpYnJhcnkgUFVCTElDICItLy9Cb29zdC8vRFREIEJvb3N0Qm9vayBYTUwgVjEuMC8vRU4iCisgICJodHRwOi8vd3d3LmJvb3N0Lm9yZy90b29scy9ib29zdGJvb2svZHRkL2Jvb3N0Ym9vay5kdGQiPgorPHRlc3RzdWl0ZSBpZD0iZnVuY3Rpb24udGVzdHN1aXRlIiBsYXN0LXJldmlzaW9uPSIkRGF0ZTogMjAwNi0xMS0wMyAxMTo0MToxMCAtMDgwMCAoRnJpLCAwMyBOb3YgMjAwNikgJCI+CisgIDxydW4tdGVzdCBmaWxlbmFtZT0iZnVuY3Rpb25fdGVzdC5jcHAiIG5hbWU9ImxpYl9mdW5jdGlvbl90ZXN0Ij4KKyAgICA8cHVycG9zZT48cGFyYT5UZXN0IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIDxjbGFzc25hbWU+Ym9vc3Q6OmZ1bmN0aW9uPC9jbGFzc25hbWU+IGNsYXNzIHRlbXBsYXRlLjwvcGFyYT48L3B1cnBvc2U+CisgICAgPGlmLWZhaWxzPjxwYXJhPlRoZSA8Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbjwvY2xhc3NuYW1lPiBjbGFzcyB0ZW1wbGF0ZSBtYXkgbm90IGJlIHVzYWJsZSBvbiB5b3VyIGNvbXBpbGVyLiBIb3dldmVyLCB0aGUgbGlicmFyeSBtYXkgc3RpbGwgYmUgdXNhYmxlIHZpYSB0aGUgPGNsYXNzbmFtZT5ib29zdDo6ZnVuY3Rpb25OPC9jbGFzc25hbWU+IGNsYXNzIHRlbXBsYXRlcy48L3BhcmE+PC9pZi1mYWlscz4KKyAgPC9ydW4tdGVzdD4KKworICA8cnVuLXRlc3QgZmlsZW5hbWU9ImZ1bmN0aW9uX25fdGVzdC5jcHAiPgorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3QgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgPGNsYXNzbmFtZT5ib29zdDo6ZnVuY3Rpb25OPC9jbGFzc25hbWU+IGNsYXNzIHRlbXBsYXRlcy48L3BhcmE+PC9wdXJwb3NlPgorICA8L3J1bi10ZXN0PgorCisgIDxydW4tdGVzdCBmaWxlbmFtZT0iYWxsb2NhdG9yX3Rlc3QuY3BwIj4KKyAgICA8cHVycG9zZT48cGFyYT5UZXN0IHRoZSB1c2Ugb2YgY3VzdG9tIGFsbG9jYXRvcnMuPC9wYXJhPjwvcHVycG9zZT4KKyAgICA8aWYtZmFpbHM+PHBhcmE+QWxsb2NhdG9ycyBhcmUgaWdub3JlZCBieSB0aGUgaW1wbGVtZW50YXRpb24uPC9wYXJhPjwvaWYtZmFpbHM+CisgIDwvcnVuLXRlc3Q+CisKKyAgPHJ1bi10ZXN0IGZpbGVuYW1lPSJzdGF0ZWxlc3NfdGVzdC5jcHAiPgorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3QgdGhlIG9wdGltaXphdGlvbiBvZiBzdGF0ZWxlc3MgZnVuY3Rpb24gb2JqZWN0cyBpbiB0aGUgQm9vc3QuRnVuY3Rpb24gbGlicmFyeS48L3BhcmE+PC9wdXJwb3NlPgorICAgIDxpZi1mYWlscz48cGFyYT5UaGUgZXhjZXB0aW9uLXNhZmV0eSBhbmQgcGVyZm9ybWFuY2UgZ3VhcmFudGVlcyBnaXZlbiBmb3Igc3RhdGVsZXNzIGZ1bmN0aW9uIG9iamVjdHMgbWF5IG5vdCBiZSBtZXQgYnkgdGhlIGltcGxlbWVudGF0aW9uLjwvcGFyYT48L2lmLWZhaWxzPgorICA8L3J1bi10ZXN0PgorCisgIDxydW4tdGVzdCBmaWxlbmFtZT0ibGFtYmRhX3Rlc3QuY3BwIj4KKyAgICA8cHVycG9zZT48cGFyYT5UZXN0IHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIEJvb3N0LkZ1bmN0aW9uIGFuZCBCb29zdC5MYW1iZGEuPC9wYXJhPjwvcHVycG9zZT4KKyAgICA8aWYtZmFpbHM+PHBhcmE+RWl0aGVyIEJvb3N0LkxhbWJkYSBkb2VzIG5vdCB3b3JrIG9uIHRoZSBwbGF0Zm9ybSwgb3IgQm9vc3QuRnVuY3Rpb24gY2Fubm90IHNhZmVseSBiZSBhcHBsaWVkIHdpdGhvdXQgdGhlIHVzZSBvZiA8ZnVuY3Rpb25uYW1lPmJvb3N0Ojp1bmxhbWJkYTwvZnVuY3Rpb25uYW1lPi48L3BhcmE+PC9pZi1mYWlscz4KKyAgPC9ydW4tdGVzdD4KKworICA8cnVuLXRlc3QgZmlsZW5hbWU9ImNvbnRhaW5zX3Rlc3QuY3BwIj4KKyAgICA8cHVycG9zZT48cGFyYT5UZXN0IHRoZSBvcGVyYXRpb24gb2YgdGhlCisgICAgPGNvZGU+PG1ldGhvZG5hbWU+dGFyZ2V0PC9tZXRob2RuYW1lPjwvY29kZT4gbWVtYmVyIGZ1bmN0aW9uIGFuZCB0aGUKKyAgICBlcXVhbGl0eSBvcGVyYXRvcnMuPC9wYXJhPjwvcHVycG9zZT4KKyAgPC9ydW4tdGVzdD4KKworICA8Y29tcGlsZS1mYWlsLXRlc3QgZmlsZW5hbWU9ImZ1bmN0aW9uX3Rlc3RfZmFpbDEuY3BwIj4KKyAgICA8cHVycG9zZT48cGFyYT5UZXN0IHRoZSAoaW5jb3JyZWN0ISkgdXNlIG9mIGNvbXBhcmlzb25zIGJldHdlZW4gQm9vc3QuRnVuY3Rpb24gZnVuY3Rpb24gb2JqZWN0cy48L3BhcmE+PC9wdXJwb3NlPgorICAgIDxpZi1mYWlscz48cGFyYT5JbnR1aXRpdmUgKGJ1dCBpbmNvcnJlY3QhKSBjb2RlIG1heSBjb21waWxlIGFuZCB3aWxsIGdpdmUgbWVhbmluZ2xlc3MgcmVzdWx0cy48L3BhcmE+PC9pZi1mYWlscz4KKyAgPC9jb21waWxlLWZhaWwtdGVzdD4KKworICA8Y29tcGlsZS1mYWlsLXRlc3QgZmlsZW5hbWU9ImZ1bmN0aW9uX3Rlc3RfZmFpbDIuY3BwIj4KKyAgICA8cHVycG9zZT48cGFyYT5UZXN0IHRoZSB1c2Ugb2YgYW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9uIG9iamVjdCB3aXRoIEJvb3N0LkZ1bmN0aW9uPC9wYXJhPjwvcHVycG9zZT4KKyAgICA8aWYtZmFpbHM+PHBhcmE+SW5jb3JyZWN0IGNvZGUgbWF5IGNvbXBpbGUgKHdpdGggcG90ZW50aWFsbHkgdW5leHBlY3RlZCByZXN1bHRzKS48L3BhcmE+PC9pZi1mYWlscz4KKyAgPC9jb21waWxlLWZhaWwtdGVzdD4KKworICA8Y29tcGlsZS10ZXN0IGZpbGVuYW1lPSJmdW5jdGlvbl8zMC5jcHAiPgorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3QgdGhlIGdlbmVyYXRpb24gb2YgYSBCb29zdC5GdW5jdGlvbiBmdW5jdGlvbiBvYmplY3QgYWRhcHRvciBhY2NlcHRpbmcgMzAgYXJndW1lbnRzLjwvcGFyYT48L3B1cnBvc2U+CisgICAgPGlmLWZhaWxzPjxwYXJhPlRoZSBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5IG1heSB3b3JrIGZvciBmdW5jdGlvbiBvYmplY3QgYWRhcHRvcnMgb2YgdXAgdG8gMTAgcGFyYW1ldGVycywgYnV0IHdpbGwgYmUgdW5hYmxlIHRvIGdlbmVyYXRlIGFkYXB0b3JzIGZvciBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHBhcmFtZXRlcnMuIEZhaWx1cmUgb2Z0ZW4gaW5kaWNhdGVzIGFuIGVycm9yIGluIHRoZSBjb21waWxlcidzIHByZXByb2Nlc3Nvci48L3BhcmE+PC9pZi1mYWlscz4KKyAgPC9jb21waWxlLXRlc3Q+IAorCisgIDxydW4tdGVzdCBmaWxlbmFtZT0iZnVuY3Rpb25fYXJpdGhfY3h4OTguY3BwIj4KKyAgICA8c291cmNlPgorICAgIDwhW0NEQVRBWworI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KK11dPgorCis8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5tdWxfaW50cyIvPgorPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwuaW50X2RpdiIvPgorCitpbnQgbWFpbigpCit7CisgICAgPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwuYXJpdGguY3h4OTgiLz4KKyAgICA8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC51c2VfaW50X2RpdiIvPgorICAgIDxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLmNhbGxfaW50X2RpdiIvPgorICAgIDxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLmNoZWNrX2VtcHR5Ii8+CisgICAgPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwuY2xlYXIiLz4KKyAgICA8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC51c2VfbXVsX2ludHMiLz4KKyAgCisgICAgcmV0dXJuIDA7Cit9Cis8L3NvdXJjZT4KKyAgICA8cHVycG9zZT48cGFyYT5UZXN0IHRoZSBmaXJzdCB0dXRvcmlhbCBleGFtcGxlLjwvcGFyYT48L3B1cnBvc2U+CisgIDwvcnVuLXRlc3Q+CisKKyAgPHJ1bi10ZXN0IGZpbGVuYW1lPSJmdW5jdGlvbl9hcml0aF9wb3J0YWJsZS5jcHAiPgorICAgIDxzb3VyY2U+CisgICAgPCFbQ0RBVEFbCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorXV0+Cis8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5tdWxfaW50cyIvPgorPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwuaW50X2RpdiIvPgoraW50IG1haW4oKQoreworICAgIDxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLmFyaXRoLnBvcnRhYmxlIi8+CisgICAgPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwudXNlX2ludF9kaXYiLz4KKyAgICA8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5jYWxsX2ludF9kaXYiLz4KKyAgICA8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5jaGVja19lbXB0eSIvPgorICAgIDxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLmNsZWFyIi8+CisgICAgPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwudXNlX211bF9pbnRzIi8+CisKKyAgICByZXR1cm4gMDsKK30KKzwvc291cmNlPgorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3QgdGhlIGZpcnN0IHR1dG9yaWFsIGV4YW1wbGUuPC9wYXJhPjwvcHVycG9zZT4KKyAgPC9ydW4tdGVzdD4KKworICA8cnVuLXRlc3QgZmlsZW5hbWU9InN1bV9hdmdfY3h4OTguY3BwIj4KKyAgICA8c291cmNlPgorICAgIDwhW0NEQVRBWworI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KK11dPgorPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwuc3VtX2F2ZyIvPgoraW50IG1haW4oKQoreworICAgIDxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLnN1bV9hdmdfZGVjbC5jeHg5OCIvPgorICAgIDxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLnVzZV9zdW1fYXZnIi8+CisKKyAgICByZXR1cm4gMDsKK30KKzwvc291cmNlPgorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3QgdGhlIHNlY29uZCB0dXRvcmlhbCBleGFtcGxlLjwvcGFyYT48L3B1cnBvc2U+CisgIDwvcnVuLXRlc3Q+CisKKyAgPHJ1bi10ZXN0IGZpbGVuYW1lPSJzdW1fYXZnX3BvcnRhYmxlLmNwcCI+CisgICAgPHNvdXJjZT4KKyAgICA8IVtDREFUQVsKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CitdXT4KKzxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLnN1bV9hdmciLz4KK2ludCBtYWluKCkKK3sKKyAgICA8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5zdW1fYXZnX2RlY2wucG9ydGFibGUiLz4KKyAgICA8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC51c2Vfc3VtX2F2ZyIvPgorCisgICAgcmV0dXJuIDA7Cit9Cis8L3NvdXJjZT4KKyAgICA8cHVycG9zZT48cGFyYT5UZXN0IHRoZSBzZWNvbmQgdHV0b3JpYWwgZXhhbXBsZS48L3BhcmE+PC9wdXJwb3NlPgorICA8L3J1bi10ZXN0PgorCisgIDxydW4tdGVzdCBmaWxlbmFtZT0ibWVtX2Z1bl9jeHg5OC5jcHAiPgorICAgIDxzb3VyY2U+CisgICAgPCFbQ0RBVEFbCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CitdXT4KKzxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLlgiLz4KK2ludCBYOjpmb28oaW50IHgpIHsgcmV0dXJuIC14OyB9CisKK2ludCBtYWluKCkKK3sKKyAgICA8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5tZW1fZnVuLmN4eDk4Ii8+CisKKyAgICByZXR1cm4gMDsKK30KKzwvc291cmNlPiAgICAKKyAgICA8cHVycG9zZT48cGFyYT5UZXN0IG1lbWJlciBmdW5jdGlvbiBleGFtcGxlIGZyb20gdHV0b3JpYWwuPC9wYXJhPjwvcHVycG9zZT4KKyAgPC9ydW4tdGVzdD4KKworICA8cnVuLXRlc3QgZmlsZW5hbWU9Im1lbV9mdW5fcG9ydGFibGUuY3BwIj4KKyAgICA8c291cmNlPgorICAgIDwhW0NEQVRBWworI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorXV0+Cis8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5YIi8+CitpbnQgWDo6Zm9vKGludCB4KSB7IHJldHVybiAteDsgfQorCitpbnQgbWFpbigpCit7CisgICAgPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwubWVtX2Z1bi5wb3J0YWJsZSIvPgorCisgICAgcmV0dXJuIDA7Cit9Cis8L3NvdXJjZT4gICAgCisgICAgPHB1cnBvc2U+PHBhcmE+VGVzdCBtZW1iZXIgZnVuY3Rpb24gZXhhbXBsZSBmcm9tIHR1dG9yaWFsLjwvcGFyYT48L3B1cnBvc2U+CisgIDwvcnVuLXRlc3Q+CisKKyAgPHJ1bi10ZXN0IGZpbGVuYW1lPSJzdGRfYmluZF9jeHg5OC5jcHAiPgorICAgIDxzb3VyY2U+CisgICAgPCFbQ0RBVEFbCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CitdXT4KKzxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLlgiLz4KK2ludCBYOjpmb28oaW50IHgpIHsgcmV0dXJuIC14OyB9CisKK2ludCBtYWluKCkKK3sKKyAgICA8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5zdGRfYmluZC5jeHg5OCIvPgorCisgICAgcmV0dXJuIDA7Cit9Cis8L3NvdXJjZT4KKyAgICA8cHVycG9zZT48cGFyYT5UZXN0IHN0YW5kYXJkIGJpbmRlcnMgZXhhbXBsZSBmcm9tIHR1dG9yaWFsLjwvcGFyYT48L3B1cnBvc2U+CisgIDwvcnVuLXRlc3Q+CisKKyAgPHJ1bi10ZXN0IGZpbGVuYW1lPSJzdGRfYmluZF9wb3J0YWJsZS5jcHAiPgorICAgIDxzb3VyY2U+CisgICAgPCFbQ0RBVEFbCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CitdXT4KKzxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLlgiLz4KK2ludCBYOjpmb28oaW50IHgpIHsgcmV0dXJuIC14OyB9CisKK2ludCBtYWluKCkKK3sKKyAgICA8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5zdGRfYmluZC5wb3J0YWJsZSIvPgorCisgICAgcmV0dXJuIDA7Cit9Cis8L3NvdXJjZT4KKyAgICA8cHVycG9zZT48cGFyYT5UZXN0IHN0YW5kYXJkIGJpbmRlcnMgZXhhbXBsZSBmcm9tIHR1dG9yaWFsLjwvcGFyYT48L3B1cnBvc2U+CisgIDwvcnVuLXRlc3Q+CisKKyAgPHJ1bi10ZXN0IGZpbGVuYW1lPSJmdW5jdGlvbl9yZWZfY3h4OTguY3BwIj4KKyAgICA8c291cmNlPgorPCFbQ0RBVEFbCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorXV0+CisKK3N0cnVjdCBzdGF0ZWZ1bF90eXBlIHsgaW50IG9wZXJhdG9yKCkoaW50KSBjb25zdCB7IHJldHVybiAwOyB9IH07CisKK2ludCBtYWluKCkKK3sKKyAgPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwucmVmLmN4eDk4Ii8+CisKKyAgICByZXR1cm4gMDsKK30KKzwvc291cmNlPgorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3QgPGZ1bmN0aW9ubmFtZT5ib29zdDo6cmVmPC9mdW5jdGlvbm5hbWU+IGV4YW1wbGUgZnJvbSB0dXRvcmlhbC48L3BhcmE+PC9wdXJwb3NlPgorICA8L3J1bi10ZXN0PgorCisgIDxydW4tdGVzdCBmaWxlbmFtZT0iZnVuY3Rpb25fcmVmX3BvcnRhYmxlLmNwcCI+CisgICAgPHNvdXJjZT4KKzwhW0NEQVRBWworI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KK11dPgorCitzdHJ1Y3Qgc3RhdGVmdWxfdHlwZSB7IGludCBvcGVyYXRvcigpKGludCkgY29uc3QgeyByZXR1cm4gMDsgfSB9OworCitpbnQgbWFpbigpCit7CisgIDxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLnJlZi5wb3J0YWJsZSIvPgorCisgICAgcmV0dXJuIDA7Cit9Cis8L3NvdXJjZT4KKyAgICA8cHVycG9zZT48cGFyYT5UZXN0IDxmdW5jdGlvbm5hbWU+Ym9vc3Q6OnJlZjwvZnVuY3Rpb25uYW1lPiBleGFtcGxlIGZyb20gdHV0b3JpYWwuPC9wYXJhPjwvcHVycG9zZT4KKyAgPC9ydW4tdGVzdD4KKzwvdGVzdHN1aXRlPgpkaWZmIC0tZ2l0IGEvbGlicy9mdW5jdGlvbi9kb2MvdHV0b3JpYWwueG1sIGIvbGlicy9mdW5jdGlvbi9kb2MvdHV0b3JpYWwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MjljM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Z1bmN0aW9uL2RvYy90dXRvcmlhbC54bWwKQEAgLTAsMCArMSwzNjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgICBDb3B5cmlnaHQgKGMpIDIwMDIgRG91Z2xhcyBHcmVnb3IgPGRvdWcuZ3JlZ29yIC1hdC0gZ21haWwuY29tPgorICAKKyAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAgIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyAgIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAgLS0+Cis8IURPQ1RZUEUgbGlicmFyeSBQVUJMSUMgIi0vL0Jvb3N0Ly9EVEQgQm9vc3RCb29rIFhNTCBWMS4wLy9FTiIKKyAgImh0dHA6Ly93d3cuYm9vc3Qub3JnL3Rvb2xzL2Jvb3N0Ym9vay9kdGQvYm9vc3Rib29rLmR0ZCI+Cis8c2VjdGlvbiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIgaWQ9ImZ1bmN0aW9uLnR1dG9yaWFsIgorICAgICAgICAgbGFzdC1yZXZpc2lvbj0iJERhdGU6IDIwMDktMDctMTIgMDk6MTM6MzUgLTA3MDAgKFN1biwgMTIgSnVsIDIwMDkpICQiPgorPHRpdGxlPlR1dG9yaWFsPC90aXRsZT4KKworPHVzaW5nLW5hbWVzcGFjZSBuYW1lPSJib29zdCIvPgorCis8cGFyYT4gQm9vc3QuRnVuY3Rpb24gaGFzIHR3byBzeW50YWN0aWNhbCBmb3JtczogdGhlIHByZWZlcnJlZCBmb3JtCithbmQgdGhlIHBvcnRhYmxlIGZvcm0uIFRoZSBwcmVmZXJyZWQgZm9ybSBmaXRzIG1vcmUgY2xvc2VseSB3aXRoIHRoZQorQysrIGxhbmd1YWdlIGFuZCByZWR1Y2VzIHRoZSBudW1iZXIgb2Ygc2VwYXJhdGUgdGVtcGxhdGUgcGFyYW1ldGVycwordGhhdCBuZWVkIHRvIGJlIGNvbnNpZGVyZWQsIG9mdGVuIGltcHJvdmluZyByZWFkYWJpbGl0eTsgaG93ZXZlciwgdGhlCitwcmVmZXJyZWQgZm9ybSBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXMgZHVlIHRvIGNvbXBpbGVyCitidWdzLiBUaGUgY29tcGF0aWJsZSBmb3JtIHdpbGwgd29yayBvbiBhbGwgY29tcGlsZXJzIHN1cHBvcnRlZCBieQorQm9vc3QuRnVuY3Rpb24uIENvbnN1bHQgdGhlIHRhYmxlIGJlbG93IHRvIGRldGVybWluZSB3aGljaCBzeW50YWN0aWMKK2Zvcm0gdG8gdXNlIGZvciB5b3VyIGNvbXBpbGVyLgorCisgIDxpbmZvcm1hbHRhYmxlPgorICAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiPgorICAgICAgPHRoZWFkPgorICAgICAgICA8cm93PgorICAgICAgICAgIDxlbnRyeT5QcmVmZXJyZWQgc3ludGF4PC9lbnRyeT4KKyAgICAgICAgICA8ZW50cnk+UG9ydGFibGUgc3ludGF4PC9lbnRyeT4KKyAgICAgICAgPC9yb3c+CisgICAgICA8L3RoZWFkPgorICAgICAgPHRib2R5PgorICAgICAgICA8cm93PgorICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Qgc3BhY2luZz0iY29tcGFjdCI+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT5HTlUgQysrIDIuOTUueCwgMy4wLnggYW5kIGxhdGVyIHZlcnNpb25zPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT5Db21lYXUgQysrIDQuMi40NS4yPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT5TR0kgTUlQU3BybyA3LjMuMDwvc2ltcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+SW50ZWwgQysrIDUuMCwgNi4wPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT5Db21wYXEncyBjeHggNi4yPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisJICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPk1pY3Jvc29mdCBWaXN1YWwgQysrIDcuMSBhbmQgbGF0ZXIgdmVyc2lvbnM8L3NpbXBhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdCBzcGFjaW5nPSJjb21wYWN0Ij4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPjxlbXBoYXNpcz5BbnkgY29tcGlsZXIgc3VwcG9ydGluZyB0aGUgcHJlZmVycmVkIHN5bnRheDwvZW1waGFzaXM+PC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT5NaWNyb3NvZnQgVmlzdWFsIEMrKyA2LjAsIDcuMDwvc2ltcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+Qm9ybGFuZCBDKysgNS41LjE8L3NpbXBhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPlN1biBXb3JrU2hvcCA2IHVwZGF0ZSAyIEMrKyA1LjM8L3NpbXBhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPk1ldHJvd2Vya3MgQ29kZVdhcnJpb3IgOC4xPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8L2VudHJ5PgorICAgICAgICA8L3Jvdz4KKyAgICAgIDwvdGJvZHk+CisgICAgPC90Z3JvdXA+CisgIDwvaW5mb3JtYWx0YWJsZT4KKworPC9wYXJhPgorCis8cGFyYT4gSWYgeW91ciBjb21waWxlciBkb2VzIG5vdCBhcHBlYXIgaW4gdGhpcyBsaXN0LCBwbGVhc2UgdHJ5IHRoZSBwcmVmZXJyZWQgc3ludGF4IGFuZCByZXBvcnQgeW91ciByZXN1bHRzIHRvIHRoZSBCb29zdCBsaXN0IHNvIHRoYXQgd2UgY2FuIGtlZXAgdGhpcyB0YWJsZSB1cC10by1kYXRlLjwvcGFyYT4KKworPHVzaW5nLWNsYXNzIG5hbWU9ImJvb3N0OjpmdW5jdGlvbiIvPgorCis8c2VjdGlvbj4KKzx0aXRsZT5CYXNpYyBVc2FnZTwvdGl0bGU+IDxwYXJhPiBBIGZ1bmN0aW9uIHdyYXBwZXIgaXMgZGVmaW5lZCBzaW1wbHkKK2J5IGluc3RhbnRpYXRpbmcgdGhlIDxjb21wdXRlcm91dHB1dD5mdW5jdGlvbjwvY29tcHV0ZXJvdXRwdXQ+IGNsYXNzCit0ZW1wbGF0ZSB3aXRoIHRoZSBkZXNpcmVkIHJldHVybiB0eXBlIGFuZCBhcmd1bWVudCB0eXBlcywgZm9ybXVsYXRlZAorYXMgYSBDKysgZnVuY3Rpb24gdHlwZS4gQW55IG51bWJlciBvZiBhcmd1bWVudHMgbWF5IGJlIHN1cHBsaWVkLCB1cCB0bworc29tZSBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGxpbWl0ICgxMCBpcyB0aGUgZGVmYXVsdCBtYXhpbXVtKS4gVGhlCitmb2xsb3dpbmcgZGVjbGFyZXMgYSBmdW5jdGlvbiBvYmplY3Qgd3JhcHBlcgorPGNvbXB1dGVyb3V0cHV0PmY8L2NvbXB1dGVyb3V0cHV0PiB0aGF0IHRha2VzIHR3bworPGNvbXB1dGVyb3V0cHV0PmludDwvY29tcHV0ZXJvdXRwdXQ+IHBhcmFtZXRlcnMgYW5kIHJldHVybnMgYQorPGNvbXB1dGVyb3V0cHV0PmZsb2F0PC9jb21wdXRlcm91dHB1dD46CisKKyAgPGluZm9ybWFsdGFibGU+CisgICAgPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCI+CisgICAgICA8dGhlYWQ+CisgICAgICAgIDxyb3c+CisgICAgICAgICAgPGVudHJ5PlByZWZlcnJlZCBzeW50YXg8L2VudHJ5PgorICAgICAgICAgIDxlbnRyeT5Qb3J0YWJsZSBzeW50YXg8L2VudHJ5PgorICAgICAgICA8L3Jvdz4KKyAgICAgIDwvdGhlYWQ+CisgICAgICA8dGJvZHk+CisgICAgICAgIDxyb3c+CisgICAgICAgICAgPGVudHJ5PgorPHByb2dyYW1saXN0aW5nIG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLmFyaXRoLmN4eDk4Ij48Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbjwvY2xhc3NuYW1lPiZsdDtmbG9hdCAoaW50IHgsIGludCB5KSZndDsgZjs8L3Byb2dyYW1saXN0aW5nPgorPC9lbnRyeT4KKzxlbnRyeT4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5hcml0aC5wb3J0YWJsZSI+PGNsYXNzbmFtZSBhbHQ9ImZ1bmN0aW9uTiI+Ym9vc3Q6OmZ1bmN0aW9uMjwvY2xhc3NuYW1lPiZsdDtmbG9hdCwgaW50LCBpbnQmZ3Q7IGY7PC9wcm9ncmFtbGlzdGluZz4KKzwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgIDwvdGJvZHk+CisgICAgICA8L3Rncm91cD4KKyAgICA8L2luZm9ybWFsdGFibGU+Cis8L3BhcmE+CisKKzxwYXJhPiBCeSBkZWZhdWx0LCBmdW5jdGlvbiBvYmplY3Qgd3JhcHBlcnMgYXJlIGVtcHR5LCBzbyB3ZSBjYW4gY3JlYXRlIGEgCitmdW5jdGlvbiBvYmplY3QgdG8gYXNzaWduIHRvIDxjb21wdXRlcm91dHB1dD5mPC9jb21wdXRlcm91dHB1dD46CisKKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5pbnRfZGl2Ij5zdHJ1Y3QgaW50X2RpdiB7IAorICBmbG9hdCBvcGVyYXRvcigpKGludCB4LCBpbnQgeSkgY29uc3QgeyByZXR1cm4gKChmbG9hdCl4KS95OyB9OyAKK307PC9wcm9ncmFtbGlzdGluZz4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC51c2VfaW50X2RpdiI+ZiA9IGludF9kaXYoKTs8L3Byb2dyYW1saXN0aW5nPgorPC9wYXJhPgorCis8cGFyYT4gTm93IHdlIGNhbiB1c2UgPGNvbXB1dGVyb3V0cHV0PmY8L2NvbXB1dGVyb3V0cHV0PiB0byBleGVjdXRlCit0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QKKzxjb21wdXRlcm91dHB1dD5pbnRfZGl2PC9jb21wdXRlcm91dHB1dD46CisKKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5jYWxsX2ludF9kaXYiPnN0ZDo6Y291dCAmbHQ7Jmx0OyBmKDUsIDMpICZsdDsmbHQ7IHN0ZDo6ZW5kbDs8L3Byb2dyYW1saXN0aW5nPgorPC9wYXJhPgorCis8cGFyYT4gV2UgYXJlIGZyZWUgdG8gYXNzaWduIGFueSBjb21wYXRpYmxlIGZ1bmN0aW9uIG9iamVjdCB0bworPGNvbXB1dGVyb3V0cHV0PmY8L2NvbXB1dGVyb3V0cHV0Pi4gSWYKKzxjb21wdXRlcm91dHB1dD5pbnRfZGl2PC9jb21wdXRlcm91dHB1dD4gaGFkIGJlZW4gZGVjbGFyZWQgdG8gdGFrZSB0d28KKzxjb21wdXRlcm91dHB1dD5sb25nPC9jb21wdXRlcm91dHB1dD4gb3BlcmFuZHMsIHRoZSBpbXBsaWNpdAorY29udmVyc2lvbnMgd291bGQgaGF2ZSBiZWVuIGFwcGxpZWQgdG8gdGhlIGFyZ3VtZW50cyB3aXRob3V0IGFueSB1c2VyCitpbnRlcmZlcmVuY2UuIFRoZSBvbmx5IGxpbWl0IG9uIHRoZSB0eXBlcyBvZiBhcmd1bWVudHMgaXMgdGhhdCB0aGV5IGJlCitDb3B5Q29uc3RydWN0aWJsZSwgc28gd2UgY2FuIGV2ZW4gdXNlIHJlZmVyZW5jZXMgYW5kIGFycmF5czoKKworICA8aW5mb3JtYWx0YWJsZT4KKyAgICA8dGdyb3VwIGNvbHM9IjEiIGFsaWduPSJsZWZ0Ij4KKyAgICAgIDx0aGVhZD48cm93PjxlbnRyeT5QcmVmZXJyZWQgc3ludGF4PC9lbnRyeT48L3Jvdz48L3RoZWFkPgorICAgICAgPHRib2R5PgorICAgICAgICA8cm93PgorICAgICAgICAgIDxlbnRyeT4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5zdW1fYXZnX2RlY2wuY3h4OTgiPjxjbGFzc25hbWU+Ym9vc3Q6OmZ1bmN0aW9uPC9jbGFzc25hbWU+Jmx0O3ZvaWQgKGludCB2YWx1ZXNbXSwgaW50IG4sIGludCZhbXA7IHN1bSwgZmxvYXQmYW1wOyBhdmcpJmd0OyBzdW1fYXZnOzwvcHJvZ3JhbWxpc3Rpbmc+Cis8L2VudHJ5PgorICAgICAgICA8L3Jvdz4KKyAgICAgIDwvdGJvZHk+CisgICAgPC90Z3JvdXA+IAorICA8L2luZm9ybWFsdGFibGU+CisgIDxpbmZvcm1hbHRhYmxlPgorICAgIDx0Z3JvdXAgY29scz0iMSIgYWxpZ249ImxlZnQiPgorICAgICAgPHRoZWFkPjxyb3c+PGVudHJ5PlBvcnRhYmxlIHN5bnRheDwvZW50cnk+PC9yb3c+PC90aGVhZD4KKyAgICAgIDx0Ym9keT4KKyAgICAgICAgPHJvdz4KKzxlbnRyeT4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5zdW1fYXZnX2RlY2wucG9ydGFibGUiPjxjbGFzc25hbWUgYWx0PSJmdW5jdGlvbk4iPmJvb3N0OjpmdW5jdGlvbjQ8L2NsYXNzbmFtZT4mbHQ7dm9pZCwgaW50KiwgaW50LCBpbnQmYW1wOywgZmxvYXQmYW1wOyZndDsgc3VtX2F2Zzs8L3Byb2dyYW1saXN0aW5nPgorPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgPC90Ym9keT4KKyAgICAgIDwvdGdyb3VwPgorICAgIDwvaW5mb3JtYWx0YWJsZT4KKworPHByb2dyYW1saXN0aW5nIG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLnN1bV9hdmciPnZvaWQgZG9fc3VtX2F2ZyhpbnQgdmFsdWVzW10sIGludCBuLCBpbnQmYW1wOyBzdW0sIGZsb2F0JmFtcDsgYXZnKQoreworICBzdW0gPSAwOworICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IG47IGkrKykKKyAgICBzdW0gKz0gdmFsdWVzW2ldOworICBhdmcgPSAoZmxvYXQpc3VtIC8gbjsKK308L3Byb2dyYW1saXN0aW5nPgorCisKKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC51c2Vfc3VtX2F2ZyI+c3VtX2F2ZyA9ICZhbXA7ZG9fc3VtX2F2Zzs8L3Byb2dyYW1saXN0aW5nPgorPC9wYXJhPgorCis8cGFyYT4gSW52b2tpbmcgYSBmdW5jdGlvbiBvYmplY3Qgd3JhcHBlciB0aGF0IGRvZXMgbm90IGFjdHVhbGx5Citjb250YWluIGEgZnVuY3Rpb24gb2JqZWN0IGlzIGEgcHJlY29uZGl0aW9uIHZpb2xhdGlvbiwgbXVjaCBsaWtlCit0cnlpbmcgdG8gY2FsbCB0aHJvdWdoIGEgbnVsbCBmdW5jdGlvbiBwb2ludGVyLCBhbmQgd2lsbCB0aHJvdyBhIDxjbGFzc25hbWU+YmFkX2Z1bmN0aW9uX2NhbGw8L2NsYXNzbmFtZT4gZXhjZXB0aW9uKS4gV2UgY2FuIGNoZWNrIGZvciBhbgorZW1wdHkgZnVuY3Rpb24gb2JqZWN0IHdyYXBwZXIgYnkgdXNpbmcgaXQgaW4gYSBib29sZWFuIGNvbnRleHQgKGl0IGV2YWx1YXRlcyA8Y29tcHV0ZXJvdXRwdXQ+dHJ1ZTwvY29tcHV0ZXJvdXRwdXQ+IGlmIHRoZSB3cmFwcGVyIGlzIG5vdCBlbXB0eSkgb3IgY29tcGFyZSBpdCBhZ2FpbnN0IDxjb21wdXRlcm91dHB1dD4wPC9jb21wdXRlcm91dHB1dD4uIEZvciBpbnN0YW5jZToKKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5jaGVja19lbXB0eSI+aWYgKGYpCisgIHN0ZDo6Y291dCAmbHQ7Jmx0OyBmKDUsIDMpICZsdDsmbHQ7IHN0ZDo6ZW5kbDsKK2Vsc2UKKyAgc3RkOjpjb3V0ICZsdDsmbHQ7ICJmIGhhcyBubyB0YXJnZXQsIHNvIGl0IGlzIHVuc2FmZSB0byBjYWxsIiAmbHQ7Jmx0OyBzdGQ6OmVuZGw7PC9wcm9ncmFtbGlzdGluZz4KKzwvcGFyYT4KKworPHBhcmE+IEFsdGVybmF0aXZlbHksCis8Y29tcHV0ZXJvdXRwdXQ+PG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvbXB1dGVyb3V0cHV0PgorbWV0aG9kIHdpbGwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSB3cmFwcGVyIGlzIGVtcHR5LiAgPC9wYXJhPgorCis8cGFyYT4gRmluYWxseSwgd2UgY2FuIGNsZWFyIG91dCBhIGZ1bmN0aW9uIHRhcmdldCBieSBhc3NpZ25pbmcgaXQgdG8gPGNvbXB1dGVyb3V0cHV0PjA8L2NvbXB1dGVyb3V0cHV0PiBvciBieSBjYWxsaW5nIHRoZSA8Y29tcHV0ZXJvdXRwdXQ+PG1ldGhvZG5hbWU+Y2xlYXI8L21ldGhvZG5hbWU+KCk8L2NvbXB1dGVyb3V0cHV0PiBtZW1iZXIgZnVuY3Rpb24sIGUuZy4sIAorPHByb2dyYW1saXN0aW5nIG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLmNsZWFyIj5mID0gMDs8L3Byb2dyYW1saXN0aW5nPgorPC9wYXJhPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uPgorICA8dGl0bGU+RnJlZSBmdW5jdGlvbnM8L3RpdGxlPgorPHBhcmE+IEZyZWUgZnVuY3Rpb24gcG9pbnRlcnMgY2FuIGJlIGNvbnNpZGVyZWQgc2luZ2xldG9uIGZ1bmN0aW9uIG9iamVjdHMgd2l0aCBjb25zdCBmdW5jdGlvbiBjYWxsIG9wZXJhdG9ycywgYW5kIGNhbiB0aGVyZWZvcmUgYmUgZGlyZWN0bHkgdXNlZCB3aXRoIHRoZSBmdW5jdGlvbiBvYmplY3Qgd3JhcHBlcnM6IAorPHByb2dyYW1saXN0aW5nIG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLm11bF9pbnRzIj5mbG9hdCBtdWxfaW50cyhpbnQgeCwgaW50IHkpIHsgcmV0dXJuICgoZmxvYXQpeCkgKiB5OyB9PC9wcm9ncmFtbGlzdGluZz4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC51c2VfbXVsX2ludHMiPmYgPSAmYW1wO211bF9pbnRzOzwvcHJvZ3JhbWxpc3Rpbmc+Cis8L3BhcmE+CisKKzxwYXJhPiBOb3RlIHRoYXQgdGhlIDxjb21wdXRlcm91dHB1dD4mYW1wOzwvY29tcHV0ZXJvdXRwdXQ+IGlzbid0IHJlYWxseSBuZWNlc3NhcnkgdW5sZXNzIHlvdSBoYXBwZW4gdG8gYmUgdXNpbmcgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbiA2LiA8L3BhcmE+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uPgorICA8dGl0bGU+TWVtYmVyIGZ1bmN0aW9uczwvdGl0bGU+CisKKzxwYXJhPiBJbiBtYW55IHN5c3RlbXMsIGNhbGxiYWNrcyBvZnRlbiBjYWxsIHRvIG1lbWJlciBmdW5jdGlvbnMgb2YgYQorcGFydGljdWxhciBvYmplY3QuIFRoaXMgaXMgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgImFyZ3VtZW50IGJpbmRpbmciLAorYW5kIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgQm9vc3QuRnVuY3Rpb24uIFRoZSB1c2Ugb2YgbWVtYmVyIGZ1bmN0aW9ucworZGlyZWN0bHksIGhvd2V2ZXIsIGlzIHN1cHBvcnRlZCwgc28gdGhlIGZvbGxvd2luZyBjb2RlIGlzIHZhbGlkOgorCis8cHJvZ3JhbWxpc3RpbmcgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwuWCI+c3RydWN0IFggeworICBpbnQgZm9vKGludCk7Cit9OzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgPGluZm9ybWFsdGFibGU+CisgICAgPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCI+CisgICAgICA8dGhlYWQ+CisgICAgICAgIDxyb3c+CisgICAgICAgICAgPGVudHJ5PlByZWZlcnJlZCBzeW50YXg8L2VudHJ5PgorICAgICAgICAgIDxlbnRyeT5Qb3J0YWJsZSBzeW50YXg8L2VudHJ5PgorICAgICAgICA8L3Jvdz4KKyAgICAgIDwvdGhlYWQ+CisgICAgICA8dGJvZHk+CisgICAgICAgIDxyb3c+CisgICAgICAgICAgPGVudHJ5PgorPHByb2dyYW1saXN0aW5nIG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLm1lbV9mdW4uY3h4OTgiPjxjbGFzc25hbWU+Ym9vc3Q6OmZ1bmN0aW9uPC9jbGFzc25hbWU+Jmx0O2ludCAoWCosIGludCkmZ3Q7IGY7CisKK2YgPSAmYW1wO1g6OmZvbzsKKyAgCitYIHg7CitmKCZhbXA7eCwgNSk7PC9wcm9ncmFtbGlzdGluZz4KKzwvZW50cnk+Cis8ZW50cnk+Cis8cHJvZ3JhbWxpc3RpbmcgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwubWVtX2Z1bi5wb3J0YWJsZSI+PGNsYXNzbmFtZSBhbHQ9ImZ1bmN0aW9uTiI+Ym9vc3Q6OmZ1bmN0aW9uMjwvY2xhc3NuYW1lPiZsdDtpbnQsIFgqLCBpbnQmZ3Q7IGY7CisKK2YgPSAmYW1wO1g6OmZvbzsKKyAgCitYIHg7CitmKCZhbXA7eCwgNSk7PC9wcm9ncmFtbGlzdGluZz4KKzwvZW50cnk+Cis8L3Jvdz4KKzwvdGJvZHk+Cis8L3Rncm91cD4KKzwvaW5mb3JtYWx0YWJsZT4KKzwvcGFyYT4KKworPHBhcmE+IFNldmVyYWwgbGlicmFyaWVzIGV4aXN0IHRoYXQgc3VwcG9ydCBhcmd1bWVudCBiaW5kaW5nLiBUaHJlZSBzdWNoIGxpYnJhcmllcyBhcmUgc3VtbWFyaXplZCBiZWxvdzoKKzxpdGVtaXplZGxpc3Q+CisgIDxsaXN0aXRlbT4gPHBhcmE+PGxpYnJhcnluYW1lPkJpbmQ8L2xpYnJhcnluYW1lPi4gVGhpcyBsaWJyYXJ5IGFsbG93cyBiaW5kaW5nIG9mCisgIGFyZ3VtZW50cyBmb3IgYW55IGZ1bmN0aW9uIG9iamVjdC4gSXQgaXMgbGlnaHR3ZWlnaHQgYW5kIHZlcnkKKyAgcG9ydGFibGUuPC9wYXJhPjwvbGlzdGl0ZW0+CisKKyAgPGxpc3RpdGVtPiA8cGFyYT5UaGUgQysrIFN0YW5kYXJkIGxpYnJhcnkuIFVzaW5nCisgIDxjb21wdXRlcm91dHB1dD5zdGQ6OmJpbmQxc3Q8L2NvbXB1dGVyb3V0cHV0PiBhbmQKKyAgPGNvbXB1dGVyb3V0cHV0PnN0ZDo6bWVtX2Z1bjwvY29tcHV0ZXJvdXRwdXQ+IHRvZ2V0aGVyIG9uZSBjYW4gYmluZAorICB0aGUgb2JqZWN0IG9mIGEgcG9pbnRlci10by1tZW1iZXIgZnVuY3Rpb24gZm9yIHVzZSB3aXRoCisgIEJvb3N0LkZ1bmN0aW9uOgorCisgIDxpbmZvcm1hbHRhYmxlPgorICAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiPgorICAgICAgPHRoZWFkPgorICAgICAgICA8cm93PgorICAgICAgICAgIDxlbnRyeT5QcmVmZXJyZWQgc3ludGF4PC9lbnRyeT4KKyAgICAgICAgICA8ZW50cnk+UG9ydGFibGUgc3ludGF4PC9lbnRyeT4KKyAgICAgICAgPC9yb3c+CisgICAgICA8L3RoZWFkPgorICAgICAgPHRib2R5PgorICAgICAgICA8cm93PgorICAgICAgICAgIDxlbnRyeT4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5zdGRfYmluZC5jeHg5OCI+ICA8Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbjwvY2xhc3NuYW1lPiZsdDtpbnQgKGludCkmZ3Q7IGY7CitYIHg7CitmID0gc3RkOjpiaW5kMXN0KAorICAgICAgc3RkOjptZW1fZnVuKCZhbXA7WDo6Zm9vKSwgJmFtcDt4KTsKK2YoNSk7IC8vIENhbGwgeC5mb28oNSk8L3Byb2dyYW1saXN0aW5nPgorPC9lbnRyeT4KKzxlbnRyeT4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5zdGRfYmluZC5wb3J0YWJsZSI+ICA8Y2xhc3NuYW1lIGFsdD0iZnVuY3Rpb25OIj5ib29zdDo6ZnVuY3Rpb24xPC9jbGFzc25hbWU+Jmx0O2ludCwgaW50Jmd0OyBmOworWCB4OworZiA9IHN0ZDo6YmluZDFzdCgKKyAgICAgIHN0ZDo6bWVtX2Z1bigmYW1wO1g6OmZvbyksICZhbXA7eCk7CitmKDUpOyAvLyBDYWxsIHguZm9vKDUpPC9wcm9ncmFtbGlzdGluZz4KKzwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgIDwvdGJvZHk+CisgICAgICA8L3Rncm91cD4KKyAgICA8L2luZm9ybWFsdGFibGU+Cis8L3BhcmE+Cis8L2xpc3RpdGVtPgorCisgIDxsaXN0aXRlbT48cGFyYT5UaGUgPGxpYnJhcnluYW1lPkxhbWJkYTwvbGlicmFyeW5hbWU+IGxpYnJhcnkuIFRoaXMgbGlicmFyeSBwcm92aWRlcyBhIHBvd2VyZnVsIGNvbXBvc2l0aW9uIG1lY2hhbmlzbSB0byBjb25zdHJ1Y3QgZnVuY3Rpb24gb2JqZWN0cyB0aGF0IHVzZXMgdmVyeSBuYXR1cmFsIEMrKyBzeW50YXguIExhbWJkYSByZXF1aXJlcyBhIGNvbXBpbGVyIHRoYXQgaXMgcmVhc29uYWJseSBjb25mb3JtYW50IHRvIHRoZSBDKysgc3RhbmRhcmQuIDwvcGFyYT48L2xpc3RpdGVtPgorPC9pdGVtaXplZGxpc3Q+Cis8L3BhcmE+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24+CisgIDx0aXRsZT5SZWZlcmVuY2VzIHRvIEZ1bmN0aW9uIE9iamVjdHM8L3RpdGxlPiA8cGFyYT4gSW4gc29tZSBjYXNlcyBpdCBpcworICBleHBlbnNpdmUgKG9yIHNlbWFudGljYWxseSBpbmNvcnJlY3QpIHRvIGhhdmUgQm9vc3QuRnVuY3Rpb24gY2xvbmUgYQorICBmdW5jdGlvbiBvYmplY3QuIEluIHN1Y2ggY2FzZXMsIGl0IGlzIHBvc3NpYmxlIHRvIHJlcXVlc3QgdGhhdAorICBCb29zdC5GdW5jdGlvbiBrZWVwIG9ubHkgYSByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbCBmdW5jdGlvbgorICBvYmplY3QuIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgPGNvbXB1dGVyb3V0cHV0PnJlZjwvY29tcHV0ZXJvdXRwdXQ+CisgIGFuZCA8Y29tcHV0ZXJvdXRwdXQ+Y3JlZjwvY29tcHV0ZXJvdXRwdXQ+IGZ1bmN0aW9ucyB0byB3cmFwIGEKKyAgcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24gb2JqZWN0OgorCisgIDxpbmZvcm1hbHRhYmxlPgorICAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiPgorICAgICAgPHRoZWFkPgorICAgICAgICA8cm93PgorICAgICAgICAgIDxlbnRyeT5QcmVmZXJyZWQgc3ludGF4PC9lbnRyeT4KKyAgICAgICAgICA8ZW50cnk+UG9ydGFibGUgc3ludGF4PC9lbnRyeT4KKyAgICAgICAgPC9yb3c+CisgICAgICA8L3RoZWFkPgorICAgICAgPHRib2R5PgorICAgICAgICA8cm93PgorICAgICAgICAgIDxlbnRyeT4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5yZWYuY3h4OTgiPnN0YXRlZnVsX3R5cGUgYV9mdW5jdGlvbl9vYmplY3Q7Cis8Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbjwvY2xhc3NuYW1lPiZsdDtpbnQgKGludCkmZ3Q7IGY7CitmID0gPGZ1bmN0aW9ubmFtZT5ib29zdDo6cmVmPC9mdW5jdGlvbm5hbWU+KGFfZnVuY3Rpb25fb2JqZWN0KTsKKworPGNsYXNzbmFtZT5ib29zdDo6ZnVuY3Rpb248L2NsYXNzbmFtZT4mbHQ7aW50IChpbnQpJmd0OyBmMihmKTs8L3Byb2dyYW1saXN0aW5nPgorPC9lbnRyeT4KKzxlbnRyeT4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5yZWYucG9ydGFibGUiPnN0YXRlZnVsX3R5cGUgYV9mdW5jdGlvbl9vYmplY3Q7Cis8Y2xhc3NuYW1lIGFsdD0iZnVuY3Rpb25OIj5ib29zdDo6ZnVuY3Rpb24xPC9jbGFzc25hbWU+Jmx0O2ludCwgaW50Jmd0OyBmOworZiA9IDxmdW5jdGlvbm5hbWU+Ym9vc3Q6OnJlZjwvZnVuY3Rpb25uYW1lPihhX2Z1bmN0aW9uX29iamVjdCk7CisKKzxjbGFzc25hbWUgYWx0PSJmdW5jdGlvbk4iPmJvb3N0OjpmdW5jdGlvbjE8L2NsYXNzbmFtZT4mbHQ7aW50LCBpbnQmZ3Q7IGYyKGYpOzwvcHJvZ3JhbWxpc3Rpbmc+Cis8L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICA8L3Rib2R5PgorICAgICAgPC90Z3JvdXA+CisgICAgPC9pbmZvcm1hbHRhYmxlPgorPC9wYXJhPgorCis8cGFyYT4gSGVyZSwgPGNvbXB1dGVyb3V0cHV0PmY8L2NvbXB1dGVyb3V0cHV0PiB3aWxsIG5vdCBtYWtlIGEgY29weQorb2YgPGNvbXB1dGVyb3V0cHV0PmFfZnVuY3Rpb25fb2JqZWN0PC9jb21wdXRlcm91dHB1dD4sIG5vciB3aWxsCis8Y29tcHV0ZXJvdXRwdXQ+ZjI8L2NvbXB1dGVyb3V0cHV0PiB3aGVuIGl0IGlzIHRhcmdldGVkIHRvCis8Y29tcHV0ZXJvdXRwdXQ+ZjwvY29tcHV0ZXJvdXRwdXQ+J3MgcmVmZXJlbmNlIHRvCis8Y29tcHV0ZXJvdXRwdXQ+YV9mdW5jdGlvbl9vYmplY3Q8L2NvbXB1dGVyb3V0cHV0Pi4gQWRkaXRpb25hbGx5LCB3aGVuCit1c2luZyByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uIG9iamVjdHMsIEJvb3N0LkZ1bmN0aW9uIHdpbGwgbm90IHRocm93CitleGNlcHRpb25zIGR1cmluZyBhc3NpZ25tZW50IG9yIGNvbnN0cnVjdGlvbi4KKzwvcGFyYT4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24+CisgIDx0aXRsZT5Db21wYXJpbmcgQm9vc3QuRnVuY3Rpb24gZnVuY3Rpb24gb2JqZWN0czwvdGl0bGU+CisKKyAgPHBhcmE+RnVuY3Rpb24gb2JqZWN0IHdyYXBwZXJzIGNhbiBiZSBjb21wYXJlZCB2aWEgPGNvZGU+PT08L2NvZGU+CisgIG9yIDxjb2RlPiE9PC9jb2RlPiBhZ2FpbnN0IGFueSBmdW5jdGlvbiBvYmplY3QgdGhhdCBjYW4gYmUgc3RvcmVkCisgIHdpdGhpbiB0aGUgd3JhcHBlci4gSWYgdGhlIGZ1bmN0aW9uIG9iamVjdCB3cmFwcGVyIGNvbnRhaW5zIGEKKyAgZnVuY3Rpb24gb2JqZWN0IG9mIHRoYXQgdHlwZSwgaXQgd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0IHRoZSBnaXZlbgorICBmdW5jdGlvbiBvYmplY3QgKHdoaWNoIG11c3QgYmUgZWl0aGVyIGJlCisgIDxjb25jZXB0bmFtZT5FcXVhbGl0eUNvbXBhcmFibGU8L2NvbmNlcHRuYW1lPiBvciBoYXZlIGFuIG92ZXJsb2FkZWQgPGZ1bmN0aW9ubmFtZT5ib29zdDo6ZnVuY3Rpb25fZXF1YWw8L2Z1bmN0aW9ubmFtZT4pLiBGb3IgaW5zdGFuY2U6PC9wYXJhPgorICAKKyAgPHByb2dyYW1saXN0aW5nIG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLmNvbXBhcmUiPmludCBjb21wdXRlX3dpdGhfWChYKiwgaW50KTsKKworZiA9ICZhbXA7WDo6Zm9vOworYXNzZXJ0KGYgPT0gJmFtcDtYOjpmb28pOworYXNzZXJ0KCZhbXA7Y29tcHV0ZV93aXRoX1ggIT0gZik7PC9wcm9ncmFtbGlzdGluZz4KKworICAgPHBhcmE+V2hlbiBjb21wYXJpbmcgYWdhaW5zdCBhbiBpbnN0YW5jZSBvZgorICAgPGNvZGU+PGNsYXNzbmFtZT5yZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPjwvY29kZT4sIHRoZSBhZGRyZXNzCisgICBvZiB0aGUgb2JqZWN0IGluIHRoZQorICAgPGNvZGU+PGNsYXNzbmFtZT5yZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPjwvY29kZT4gaXMgY29tcGFyZWQKKyAgIGFnYWluc3QgdGhlIGFkZHJlc3Mgb2YgdGhlIG9iamVjdCBzdG9yZWQgYnkgdGhlIGZ1bmN0aW9uIG9iamVjdAorICAgd3JhcHBlcjo8L3BhcmE+CisKKyAgPHByb2dyYW1saXN0aW5nIG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLmNvbXBhcmUtcmVmIj5hX3N0YXRlZnVsX29iamVjdCBzbzEsIHNvMjsKK2YgPSA8ZnVuY3Rpb25uYW1lPmJvb3N0OjpyZWY8L2Z1bmN0aW9ubmFtZT4oc28xKTsKK2Fzc2VydChmID09IDxmdW5jdGlvbm5hbWU+Ym9vc3Q6OnJlZjwvZnVuY3Rpb25uYW1lPihzbzEpKTsKK2Fzc2VydChmID09IHNvMSk7IDxlbXBoYXNpcz4vLyBPbmx5IGlmIGFfc3RhdGVmdWxfb2JqZWN0IGlzIDxjb25jZXB0bmFtZT5FcXVhbGl0eUNvbXBhcmFibGU8L2NvbmNlcHRuYW1lPjwvZW1waGFzaXM+Cithc3NlcnQoZiAhPSA8ZnVuY3Rpb25uYW1lPmJvb3N0OjpyZWY8L2Z1bmN0aW9ubmFtZT4oc28yKSk7PC9wcm9ncmFtbGlzdGluZz4KKworPC9zZWN0aW9uPgorCis8L3NlY3Rpb24+CisKZGlmZiAtLWdpdCBhL2xpYnMvZnVuY3Rpb24vZXhhbXBsZS9iaW5kMXN0LmNwcCBiL2xpYnMvZnVuY3Rpb24vZXhhbXBsZS9iaW5kMXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGZjNjhhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9mdW5jdGlvbi9leGFtcGxlL2JpbmQxc3QuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkgZXhhbXBsZXMKKworLy8gIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDAxLTIwMDMuIFVzZSwgbW9kaWZpY2F0aW9uIGFuZAorLy8gIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uCisvLyAgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworc3RydWN0IFggeworICBYKGludCB2YWwpIDogdmFsdWUodmFsKSB7fQorCisgIGludCBmb28oaW50IHgpIHsgcmV0dXJuIHggKiB2YWx1ZTsgfQorCisgIGludCB2YWx1ZTsKK307CisKKworaW50CittYWluKCkKK3sKKyAgbmRuYm9vc3Q6OmZ1bmN0aW9uPGludCAoaW50KT4gZjsKKyAgWCB4KDcpOworICBmID0gc3RkOjpiaW5kMXN0KHN0ZDo6bWVtX2Z1bigmWDo6Zm9vKSwgJngpOworCisgIHN0ZDo6Y291dCA8PCBmKDUpIDw8IHN0ZDo6ZW5kbDsgLy8gQ2FsbCB4LmZvbyg1KQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvZnVuY3Rpb24vZXhhbXBsZS9pbnRfZGl2LmNwcCBiL2xpYnMvZnVuY3Rpb24vZXhhbXBsZS9pbnRfZGl2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTkxZjU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9mdW5jdGlvbi9leGFtcGxlL2ludF9kaXYuY3BwCkBAIC0wLDAgKzEsMjYgQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkgZXhhbXBsZXMKKworLy8gIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDAxLTIwMDMuIFVzZSwgbW9kaWZpY2F0aW9uIGFuZAorLy8gIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uCisvLyAgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisKK3N0cnVjdCBpbnRfZGl2IHsKKyAgZmxvYXQgb3BlcmF0b3IoKShpbnQgeCwgaW50IHkpIGNvbnN0IHsgcmV0dXJuICgoZmxvYXQpeCkveTsgfTsKK307CisKK2ludAorbWFpbigpCit7CisgIG5kbmJvb3N0OjpmdW5jdGlvbjxmbG9hdCAoaW50LCBpbnQpPiBmOworICBmID0gaW50X2RpdigpOworCisgIHN0ZDo6Y291dCA8PCBmKDUsIDMpIDw8IHN0ZDo6ZW5kbDsgLy8gMS42NjY2NworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9mdW5jdGlvbi9leGFtcGxlL3N1bV9hdmcuY3BwIGIvbGlicy9mdW5jdGlvbi9leGFtcGxlL3N1bV9hdmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4OGYzODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Z1bmN0aW9uL2V4YW1wbGUvc3VtX2F2Zy5jcHAKQEAgLTAsMCArMSwzOCBAQAorLy8gQm9vc3QuRnVuY3Rpb24gbGlicmFyeSBleGFtcGxlcworCisvLyAgQ29weXJpZ2h0IERvdWdsYXMgR3JlZ29yIDIwMDEtMjAwMy4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKwordm9pZCBkb19zdW1fYXZnKGludCB2YWx1ZXNbXSwgaW50IG4sIGludCYgc3VtLCBmbG9hdCYgYXZnKQoreworICBzdW0gPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICBzdW0gKz0gdmFsdWVzW2ldOworICBhdmcgPSAoZmxvYXQpc3VtIC8gbjsKK30KKworaW50CittYWluKCkKK3sKKyAgLy8gVGhlIHNlY29uZCBwYXJhbWV0ZXIgc2hvdWxkIGJlIGludFtdLCBidXQgc29tZSBjb21waWxlcnMgKGUuZy4sIEdDQykKKyAgLy8gY29tcGxhaW4gYWJvdXQgdGhpcworICBuZG5ib29zdDo6ZnVuY3Rpb248dm9pZCAoaW50KiwgaW50LCBpbnQmLCBmbG9hdCYpPiBzdW1fYXZnOworCisgIHN1bV9hdmcgPSAmZG9fc3VtX2F2ZzsKKworICBpbnQgdmFsdWVzWzVdID0geyAxLCAxLCAyLCAzLCA1IH07CisgIGludCBzdW07CisgIGZsb2F0IGF2ZzsKKyAgc3VtX2F2Zyh2YWx1ZXMsIDUsIHN1bSwgYXZnKTsKKworICBzdGQ6OmNvdXQgPDwgInN1bSA9ICIgPDwgc3VtIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJhdmcgPSAiIDw8IGF2ZyA8PCBzdGQ6OmVuZGw7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9mdW5jdGlvbi9pbmRleC5odG1sIGIvbGlicy9mdW5jdGlvbi9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZDQwZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Z1bmN0aW9uL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwyMCBAQAorPGh0bWw+Cis8IS0tCisgICBDb3B5cmlnaHQgKGMpIDIwMDIgRG91Z2xhcyBHcmVnb3IgPGRvdWcuZ3JlZ29yIC1hdC0gZ21haWwuY29tPgorICAKKyAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAgIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyAgIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAgLS0+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7IFVSTD0uLi8uLi9kb2MvaHRtbC9mdW5jdGlvbi5odG1sIj4KKzwvaGVhZD4KKzxib2R5PgorQXV0b21hdGljIHJlZGlyZWN0aW9uIGZhaWxlZCwgcGxlYXNlIGdvIHRvCis8YSBocmVmPSIuLi8uLi9kb2MvaHRtbC9mdW5jdGlvbi5odG1sIj4uLi8uLi9kb2MvaHRtbC9mdW5jdGlvbi5odG1sPC9hPiAmbmJzcDs8aHI+Cis8cD6pIENvcHlyaWdodCBCZW1hbiBEYXdlcywgMjAwMTwvcD4KKzxwPkRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgCitmaWxlIDxhIGhyZWY9Ii4uLy4uL0xJQ0VOU0VfMV8wLnR4dCI+TElDRU5TRV8xXzAudHh0PC9hPiBvciBjb3B5IAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Ij53d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dDwvYT4pPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYnMvZnVuY3Rpb24vdGVzdC9KYW1maWxlLnYyIGIvbGlicy9mdW5jdGlvbi90ZXN0L0phbWZpbGUudjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU0ZGZlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvZnVuY3Rpb24vdGVzdC9KYW1maWxlLnYyCkBAIC0wLDAgKzEsNjcgQEAKKyMgRnVuY3Rpb24gbGlicmFyeQorCisjIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDAxLTIwMDMuIFVzZSwgbW9kaWZpY2F0aW9uIGFuZAorIyBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbgorIyAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyMgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcvCisKK3Byb2plY3QKKyAgICA6IHJlcXVpcmVtZW50cyA8dG9vbHNldD5tc3ZjOjxhc3luY2gtZXhjZXB0aW9ucz5vbgorICAgIDogc291cmNlLWxvY2F0aW9uICQoQk9PU1RfUk9PVCkKKyAgICA7CisKKyMgYnJpbmcgaW4gcnVsZXMgZm9yIHRlc3RpbmcKK2ltcG9ydCB0ZXN0aW5nIDsKKworeworCisgIHRlc3Qtc3VpdGUgZnVuY3Rpb24KKyAgICA6IAorICBbIHJ1biBsaWJzL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fdGVzdC5jcHAgOiAgOiAgOiAgOiBsaWJfZnVuY3Rpb25fdGVzdCBdCisKKyAgWyBydW4gbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX25fdGVzdC5jcHAgOiAgOiAgOiAgOiAgXQorCisgIFsgcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9hbGxvY2F0b3JfdGVzdC5jcHAgLi4vLi4vLi4vbGlicy90ZXN0L2J1aWxkLy9uZG5ib29zdF90ZXN0X2V4ZWNfbW9uaXRvciA6ICA6ICA6ICA6ICBdCisKKyAgWyBydW4gbGlicy9mdW5jdGlvbi90ZXN0L3N0YXRlbGVzc190ZXN0LmNwcCAuLi8uLi8uLi9saWJzL3Rlc3QvYnVpbGQvL25kbmJvb3N0X3Rlc3RfZXhlY19tb25pdG9yIDogIDogIDogIDogIF0KKworICBbIHJ1biBsaWJzL2Z1bmN0aW9uL3Rlc3QvbGFtYmRhX3Rlc3QuY3BwIC4uLy4uLy4uL2xpYnMvdGVzdC9idWlsZC8vbmRuYm9vc3RfdGVzdF9leGVjX21vbml0b3IgOiAgOiAgOiAgOiAgXQorCisgIFsgY29tcGlsZS1mYWlsIGxpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl90ZXN0X2ZhaWwxLmNwcCA6ICA6ICA6ICA6ICBdCisKKyAgWyBjb21waWxlLWZhaWwgbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3Rlc3RfZmFpbDIuY3BwIDogIDogIDogIDogIF0KKworICBbIGNvbXBpbGUgbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uXzMwLmNwcCA6ICA6ICA6ICA6ICBdIAorCisgIFsgcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9hcml0aF9jeHg5OC5jcHAgOiAgOiAgOiAgOiAgXQorCisgIFsgcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9hcml0aF9wb3J0YWJsZS5jcHAgOiAgOiAgOiAgOiAgXQorCisgIFsgcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9zdW1fYXZnX2N4eDk4LmNwcCA6ICA6ICA6ICA6ICBdCisKKyAgWyBydW4gbGlicy9mdW5jdGlvbi90ZXN0L3N1bV9hdmdfcG9ydGFibGUuY3BwIDogIDogIDogIDogIF0KKworICBbIHJ1biBsaWJzL2Z1bmN0aW9uL3Rlc3QvbWVtX2Z1bl9jeHg5OC5jcHAgOiAgOiAgOiAgOiAgXQorCisgIFsgcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9tZW1fZnVuX3BvcnRhYmxlLmNwcCA6ICA6ICA6ICA6ICBdCisKKyAgWyBydW4gbGlicy9mdW5jdGlvbi90ZXN0L3N0ZF9iaW5kX2N4eDk4LmNwcCA6ICA6ICA6ICA6ICBdCisKKyAgWyBydW4gbGlicy9mdW5jdGlvbi90ZXN0L3N0ZF9iaW5kX3BvcnRhYmxlLmNwcCA6ICA6ICA6ICA6ICBdCisKKyAgWyBydW4gbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3JlZl9jeHg5OC5jcHAgOiAgOiAgOiAgOiAgXQorCisgIFsgcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9yZWZfcG9ydGFibGUuY3BwIDogIDogIDogIDogIF0KKyAgCisgIFsgcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9jb250YWluc190ZXN0LmNwcCA6IDogOiA6IF0KKyAgIAorICBbIHJ1biBsaWJzL2Z1bmN0aW9uL3Rlc3QvY29udGFpbnMyX3Rlc3QuY3BwIDogOiA6IDogXQorICAgCisgIFsgcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9ub3Rocm93X3N3YXAuY3BwIDogIDogIDogIDogIF0KKworICBbIGNvbXBpbGUgbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3R5cGVvZl90ZXN0LmNwcCBdCisgOworfQorICAgICAgCmRpZmYgLS1naXQgYS9saWJzL2Z1bmN0aW9uL3Rlc3QvYWxsb2NhdG9yX3Rlc3QuY3BwIGIvbGlicy9mdW5jdGlvbi90ZXN0L2FsbG9jYXRvcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTkxZTZiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9mdW5jdGlvbi90ZXN0L2FsbG9jYXRvcl90ZXN0LmNwcApAQCAtMCwwICsxLDEzNyBAQAorLy8gQm9vc3QuRnVuY3Rpb24gbGlicmFyeQorCisvLyAgQ29weXJpZ2h0IERvdWdsYXMgR3JlZ29yIDIwMDEtMjAwMy4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvbWluaW1hbC5ocHA+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBuZG5ib29zdDsKKworc3RhdGljIGludCBhbGxvY19jb3VudCA9IDA7CitzdGF0aWMgaW50IGRlYWxsb2NfY291bnQgPSAwOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGNvdW50aW5nX2FsbG9jYXRvciA6IHB1YmxpYyBzdGQ6OmFsbG9jYXRvcjxUPgoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICBzdHJ1Y3QgcmViaW5kCisgIHsKKyAgICB0eXBlZGVmIGNvdW50aW5nX2FsbG9jYXRvcjxVPiBvdGhlcjsKKyAgfTsKKworICBjb3VudGluZ19hbGxvY2F0b3IoKQorICB7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICBjb3VudGluZ19hbGxvY2F0b3IoIGNvdW50aW5nX2FsbG9jYXRvcjxVPiApCisgIHsKKyAgfQorCisgIFQqIGFsbG9jYXRlKHN0ZDo6c2l6ZV90IG4pCisgIHsKKyAgICBhbGxvY19jb3VudCsrOworICAgIHJldHVybiBzdGQ6OmFsbG9jYXRvcjxUPjo6YWxsb2NhdGUobik7CisgIH0KKworICB2b2lkIGRlYWxsb2NhdGUoVCogcCwgc3RkOjpzaXplX3QgbikKKyAgeworICAgIGRlYWxsb2NfY291bnQrKzsKKyAgICBzdGQ6OmFsbG9jYXRvcjxUPjo6ZGVhbGxvY2F0ZShwLCBuKTsKKyAgfQorfTsKKworc3RydWN0IGVuYWJsZV9zbWFsbF9vYmplY3Rfb3B0aW1pemF0aW9uCit7Cit9OworCitzdHJ1Y3QgZGlzYWJsZV9zbWFsbF9vYmplY3Rfb3B0aW1pemF0aW9uCit7CisgIGludCB1bnVzZWRfc3RhdGVfZGF0YVszMl07Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgYmFzZT4KK3N0cnVjdCBwbHVzX2ludDogYmFzZQoreworICBpbnQgb3BlcmF0b3IoKShpbnQgeCwgaW50IHkpIGNvbnN0IHsgcmV0dXJuIHggKyB5OyB9Cit9OworCitzdGF0aWMgaW50IGRvX21pbnVzKGludCB4LCBpbnQgeSkgeyByZXR1cm4geC15OyB9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBiYXNlPgorc3RydWN0IERvTm90aGluZzogYmFzZQoreworICB2b2lkIG9wZXJhdG9yKCkoKSBjb25zdCB7fQorfTsKKworc3RhdGljIHZvaWQgZG9fbm90aGluZygpIHt9CisKK2ludAordGVzdF9tYWluKGludCwgY2hhcipbXSkKK3sKKyAgZnVuY3Rpb24yPGludCwgaW50LCBpbnQ+IGY7CisgIGYuYXNzaWduKCBwbHVzX2ludDxkaXNhYmxlX3NtYWxsX29iamVjdF9vcHRpbWl6YXRpb24+KCksIGNvdW50aW5nX2FsbG9jYXRvcjxpbnQ+KCkgKTsKKyAgZi5jbGVhcigpOworICBCT09TVF9DSEVDSyhhbGxvY19jb3VudCA9PSAxKTsKKyAgQk9PU1RfQ0hFQ0soZGVhbGxvY19jb3VudCA9PSAxKTsKKyAgYWxsb2NfY291bnQgPSAwOworICBkZWFsbG9jX2NvdW50ID0gMDsKKyAgZi5hc3NpZ24oIHBsdXNfaW50PGVuYWJsZV9zbWFsbF9vYmplY3Rfb3B0aW1pemF0aW9uPigpLCBjb3VudGluZ19hbGxvY2F0b3I8aW50PigpICk7CisgIGYuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0soYWxsb2NfY291bnQgPT0gMCk7CisgIEJPT1NUX0NIRUNLKGRlYWxsb2NfY291bnQgPT0gMCk7CisgIGYuYXNzaWduKCBwbHVzX2ludDxkaXNhYmxlX3NtYWxsX29iamVjdF9vcHRpbWl6YXRpb24+KCksIHN0ZDo6YWxsb2NhdG9yPGludD4oKSApOworICBmLmNsZWFyKCk7CisgIGYuYXNzaWduKCBwbHVzX2ludDxlbmFibGVfc21hbGxfb2JqZWN0X29wdGltaXphdGlvbj4oKSwgc3RkOjphbGxvY2F0b3I8aW50PigpICk7CisgIGYuY2xlYXIoKTsKKworICBhbGxvY19jb3VudCA9IDA7CisgIGRlYWxsb2NfY291bnQgPSAwOworICBmLmFzc2lnbiggJmRvX21pbnVzLCBjb3VudGluZ19hbGxvY2F0b3I8aW50PigpICk7CisgIGYuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0soYWxsb2NfY291bnQgPT0gMCk7CisgIEJPT1NUX0NIRUNLKGRlYWxsb2NfY291bnQgPT0gMCk7CisgIGYuYXNzaWduKCAmZG9fbWludXMsIHN0ZDo6YWxsb2NhdG9yPGludD4oKSApOworICBmLmNsZWFyKCk7CisKKyAgZnVuY3Rpb24wPHZvaWQ+IGZ2OworICBhbGxvY19jb3VudCA9IDA7CisgIGRlYWxsb2NfY291bnQgPSAwOworICBmdi5hc3NpZ24oIERvTm90aGluZzxkaXNhYmxlX3NtYWxsX29iamVjdF9vcHRpbWl6YXRpb24+KCksIGNvdW50aW5nX2FsbG9jYXRvcjxpbnQ+KCkgKTsKKyAgZnYuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0soYWxsb2NfY291bnQgPT0gMSk7CisgIEJPT1NUX0NIRUNLKGRlYWxsb2NfY291bnQgPT0gMSk7CisgIGFsbG9jX2NvdW50ID0gMDsKKyAgZGVhbGxvY19jb3VudCA9IDA7CisgIGZ2LmFzc2lnbiggRG9Ob3RoaW5nPGVuYWJsZV9zbWFsbF9vYmplY3Rfb3B0aW1pemF0aW9uPigpLCBjb3VudGluZ19hbGxvY2F0b3I8aW50PigpICk7CisgIGZ2LmNsZWFyKCk7CisgIEJPT1NUX0NIRUNLKGFsbG9jX2NvdW50ID09IDApOworICBCT09TVF9DSEVDSyhkZWFsbG9jX2NvdW50ID09IDApOworICBmdi5hc3NpZ24oIERvTm90aGluZzxkaXNhYmxlX3NtYWxsX29iamVjdF9vcHRpbWl6YXRpb24+KCksIHN0ZDo6YWxsb2NhdG9yPGludD4oKSApOworICBmdi5jbGVhcigpOworICBmdi5hc3NpZ24oIERvTm90aGluZzxlbmFibGVfc21hbGxfb2JqZWN0X29wdGltaXphdGlvbj4oKSwgc3RkOjphbGxvY2F0b3I8aW50PigpICk7CisgIGZ2LmNsZWFyKCk7CisKKyAgYWxsb2NfY291bnQgPSAwOworICBkZWFsbG9jX2NvdW50ID0gMDsKKyAgZnYuYXNzaWduKCAmZG9fbm90aGluZywgY291bnRpbmdfYWxsb2NhdG9yPGludD4oKSApOworICBmdi5jbGVhcigpOworICBCT09TVF9DSEVDSyhhbGxvY19jb3VudCA9PSAwKTsKKyAgQk9PU1RfQ0hFQ0soZGVhbGxvY19jb3VudCA9PSAwKTsKKyAgZnYuYXNzaWduKCAmZG9fbm90aGluZywgc3RkOjphbGxvY2F0b3I8aW50PigpICk7CisgIGZ2LmNsZWFyKCk7CisgIAorICBmdW5jdGlvbjA8dm9pZD4gZnYyOworICBmdi5hc3NpZ24oJmRvX25vdGhpbmcsIHN0ZDo6YWxsb2NhdG9yPGludD4oKSApOworICBmdjIuYXNzaWduKGZ2LCBzdGQ6OmFsbG9jYXRvcjxpbnQ+KCkgKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvZnVuY3Rpb24vdGVzdC9jb250YWluczJfdGVzdC5jcHAgYi9saWJzL2Z1bmN0aW9uL3Rlc3QvY29udGFpbnMyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjdlYjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Z1bmN0aW9uL3Rlc3QvY29udGFpbnMyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsODggQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKworLy8gIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDA0LgorLy8gIENvcHlyaWdodCAyMDA1IFBldGVyIERpbW92CisKKy8vICBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8KKy8vICB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisvLyAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC9kZXRhaWwvbGlnaHR3ZWlnaHRfdGVzdC5ocHA+CisKK3N0YXRpYyBpbnQgZm9ydHlfdHdvKCkKK3sKKyAgICByZXR1cm4gNDI7Cit9CisKK3N0cnVjdCBTZXZlbnRlZW4KK3sKKyAgICBpbnQgb3BlcmF0b3IoKSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gMTc7CisgICAgfQorfTsKKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNldmVudGVlbiYsIGNvbnN0IFNldmVudGVlbiYpCit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0cnVjdCBSZXR1cm5JbnQKK3sKKyAgICBleHBsaWNpdCBSZXR1cm5JbnQoaW50IHZhbHVlKSA6IHZhbHVlKHZhbHVlKQorICAgIHsKKyAgICB9CisKKyAgICBpbnQgb3BlcmF0b3IoKSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgaW50IHZhbHVlOworfTsKKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJldHVybkludCYgeCwgY29uc3QgUmV0dXJuSW50JiB5KQoreworICAgIHJldHVybiB4LnZhbHVlID09IHkudmFsdWU7Cit9CisKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBSZXR1cm5JbnQmIHgsIGNvbnN0IFJldHVybkludCYgeSkKK3sKKyAgICByZXR1cm4geC52YWx1ZSAhPSB5LnZhbHVlOworfQorCitpbnQgbWFpbigpCit7CisgICAgbmRuYm9vc3Q6OmZ1bmN0aW9uMDxpbnQ+IGZuOworCisgICAgZm4gPSAmZm9ydHlfdHdvOworCisgICAgQk9PU1RfVEVTVCggZm4oKSA9PSA0MiApOworCisgICAgQk9PU1RfVEVTVCggZm4uY29udGFpbnMoJmZvcnR5X3R3bykgKTsKKyAgICBCT09TVF9URVNUKCAhZm4uY29udGFpbnMoIFNldmVudGVlbigpICkgKTsKKyAgICBCT09TVF9URVNUKCAhZm4uY29udGFpbnMoIFJldHVybkludCgwKSApICk7CisgICAgQk9PU1RfVEVTVCggIWZuLmNvbnRhaW5zKCBSZXR1cm5JbnQoMTIpICkgKTsKKworICAgIGZuID0gU2V2ZW50ZWVuKCk7CisKKyAgICBCT09TVF9URVNUKCBmbigpID09IDE3ICk7CisKKyAgICBCT09TVF9URVNUKCAhZm4uY29udGFpbnMoICZmb3J0eV90d28gKSApOworICAgIEJPT1NUX1RFU1QoIGZuLmNvbnRhaW5zKCBTZXZlbnRlZW4oKSApICk7CisgICAgQk9PU1RfVEVTVCggIWZuLmNvbnRhaW5zKCBSZXR1cm5JbnQoMCkgKSApOworICAgIEJPT1NUX1RFU1QoICFmbi5jb250YWlucyggUmV0dXJuSW50KDEyKSApICk7CisKKyAgICBmbiA9IFJldHVybkludCgxMik7CisKKyAgICBCT09TVF9URVNUKCBmbigpID09IDEyICk7CisKKyAgICBCT09TVF9URVNUKCAhZm4uY29udGFpbnMoICZmb3J0eV90d28gKSApOworICAgIEJPT1NUX1RFU1QoICFmbi5jb250YWlucyggU2V2ZW50ZWVuKCkgKSApOworICAgIEJPT1NUX1RFU1QoICFmbi5jb250YWlucyggUmV0dXJuSW50KDApICkgKTsKKyAgICBCT09TVF9URVNUKCBmbi5jb250YWlucyggUmV0dXJuSW50KDEyKSApICk7CisKKyAgICByZXR1cm4gbmRuYm9vc3Q6OnJlcG9ydF9lcnJvcnMoKTsKK30KZGlmZiAtLWdpdCBhL2xpYnMvZnVuY3Rpb24vdGVzdC9jb250YWluc190ZXN0LmNwcCBiL2xpYnMvZnVuY3Rpb24vdGVzdC9jb250YWluc190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmVhNzE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9mdW5jdGlvbi90ZXN0L2NvbnRhaW5zX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMjM1IEBACisvLyBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5CisKKy8vICBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwNC4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L21pbmltYWwuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC9yZWYuaHBwPgorCitzdGF0aWMgaW50IGZvcnR5X3R3bygpIHsgcmV0dXJuIDQyOyB9CisKK3N0cnVjdCBTZXZlbnRlZW4KK3sKKyAgaW50IG9wZXJhdG9yKCkoKSBjb25zdCB7IHJldHVybiAxNzsgfQorfTsKKworc3RydWN0IFJldHVybkludAoreworICBleHBsaWNpdCBSZXR1cm5JbnQoaW50IHZhbHVlKSA6IHZhbHVlKHZhbHVlKSB7fQorCisgIGludCBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0KKworICBpbnQgdmFsdWU7Cit9OworCitib29sIG9wZXJhdG9yPT0oY29uc3QgUmV0dXJuSW50JiB4LCBjb25zdCBSZXR1cm5JbnQmIHkpCit7IHJldHVybiB4LnZhbHVlID09IHkudmFsdWU7IH0KKworYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJldHVybkludCYgeCwgY29uc3QgUmV0dXJuSW50JiB5KQoreyByZXR1cm4geC52YWx1ZSAhPSB5LnZhbHVlOyB9CisKK25hbWVzcGFjZSBjb250YWluX3Rlc3QgeworCitzdHJ1Y3QgUmV0dXJuSW50RkUKK3sKKyAgZXhwbGljaXQgUmV0dXJuSW50RkUoaW50IHZhbHVlKSA6IHZhbHVlKHZhbHVlKSB7fQorCisgIGludCBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0KKworICBpbnQgdmFsdWU7Cit9OworCit9CisKKyNpZm5kZWYgQk9PU1RfTk9fQVJHVU1FTlRfREVQRU5ERU5UX0xPT0tVUAorCituYW1lc3BhY2UgY29udGFpbl90ZXN0IHsKKyMgaWZuZGVmIEJPT1NUX05PX0ZVTkNUSU9OX1RFTVBMQVRFX09SREVSSU5HCitib29sIGZ1bmN0aW9uX2VxdWFsKGNvbnN0IFJldHVybkludEZFJiB4LCBjb25zdCBSZXR1cm5JbnRGRSYgeSkKK3sgcmV0dXJuIHgudmFsdWUgPT0geS52YWx1ZTsgfQorIyBlbHNlCitib29sIGZ1bmN0aW9uX2VxdWFsX2ltcGwoY29uc3QgUmV0dXJuSW50RkUmIHgsIGNvbnN0IFJldHVybkludEZFJiB5LCBpbnQpCit7IHJldHVybiB4LnZhbHVlID09IHkudmFsdWU7IH0KKyMgZW5kaWYgLy8gI2lmbmRlZiBCT09TVF9OT19GVU5DVElPTl9URU1QTEFURV9PUkRFUklORworfQorI2Vsc2UgLy8gQk9PU1RfTk9fQVJHVU1FTlRfREVQRU5ERU5UX0xPT0tVUAorbmFtZXNwYWNlIG5kbmJvb3N0IHsKKyMgaWZuZGVmIEJPT1NUX05PX0ZVTkNUSU9OX1RFTVBMQVRFX09SREVSSU5HCitib29sIAorZnVuY3Rpb25fZXF1YWwoY29uc3QgY29udGFpbl90ZXN0OjpSZXR1cm5JbnRGRSYgeCwgCisgICAgICAgICAgICAgICBjb25zdCBjb250YWluX3Rlc3Q6OlJldHVybkludEZFJiB5KQoreyByZXR1cm4geC52YWx1ZSA9PSB5LnZhbHVlOyB9CisjIGVsc2UKK2Jvb2wgCitmdW5jdGlvbl9lcXVhbF9pbXBsKGNvbnN0IGNvbnRhaW5fdGVzdDo6UmV0dXJuSW50RkUmIHgsIAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluX3Rlc3Q6OlJldHVybkludEZFJiB5LCBpbnQpCit7IHJldHVybiB4LnZhbHVlID09IHkudmFsdWU7IH0KKyMgZW5kaWYKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB0YXJnZXRfdGVzdCgpCit7CisgIG5kbmJvb3N0OjpmdW5jdGlvbjA8aW50PiBmOworCisgIGYgPSAmZm9ydHlfdHdvOworICBCT09TVF9DSEVDSygqZi50YXJnZXQ8aW50ICgqKSgpPigpID09ICZmb3J0eV90d28pOworICBCT09TVF9DSEVDSyghZi50YXJnZXQ8U2V2ZW50ZWVuPigpKTsKKworICBmID0gU2V2ZW50ZWVuKCk7CisgIEJPT1NUX0NIRUNLKCFmLnRhcmdldDxpbnQgKCopKCk+KCkpOworICBCT09TVF9DSEVDSyhmLnRhcmdldDxTZXZlbnRlZW4+KCkpOworCisgIFNldmVudGVlbiB0aGlzX3NldmVudGVlbjsKKyAgZiA9IG5kbmJvb3N0OjpyZWYodGhpc19zZXZlbnRlZW4pOworICBCT09TVF9DSEVDSyghZi50YXJnZXQ8aW50ICgqKSgpPigpKTsKKyAgQk9PU1RfQ0hFQ0soZi50YXJnZXQ8U2V2ZW50ZWVuPigpKTsKKyAgQk9PU1RfQ0hFQ0soZi50YXJnZXQ8U2V2ZW50ZWVuPigpID09ICZ0aGlzX3NldmVudGVlbik7CisKKyAgY29uc3QgU2V2ZW50ZWVuIGNvbnN0X3NldmVudGVlbiA9IHRoaXNfc2V2ZW50ZWVuOworICBmID0gbmRuYm9vc3Q6OnJlZihjb25zdF9zZXZlbnRlZW4pOworICBCT09TVF9DSEVDSyghZi50YXJnZXQ8aW50ICgqKSgpPigpKTsKKyAgQk9PU1RfQ0hFQ0soZi50YXJnZXQ8Y29uc3QgU2V2ZW50ZWVuPigpKTsKKyAgQk9PU1RfQ0hFQ0soZi50YXJnZXQ8Y29uc3QgU2V2ZW50ZWVuPigpID09ICZjb25zdF9zZXZlbnRlZW4pOworICBCT09TVF9DSEVDSyhmLnRhcmdldDxjb25zdCB2b2xhdGlsZSBTZXZlbnRlZW4+KCkpOworICBCT09TVF9DSEVDSyghZi50YXJnZXQ8U2V2ZW50ZWVuPigpKTsKKyAgQk9PU1RfQ0hFQ0soIWYudGFyZ2V0PHZvbGF0aWxlIFNldmVudGVlbj4oKSk7Cit9CisKK3N0YXRpYyB2b2lkIGVxdWFsX3Rlc3QoKQoreworICBuZG5ib29zdDo6ZnVuY3Rpb24wPGludD4gZjsKKworICBmID0gJmZvcnR5X3R3bzsKKyAgQk9PU1RfQ0hFQ0soZiA9PSAmZm9ydHlfdHdvKTsKKyAgQk9PU1RfQ0hFQ0soZiAhPSBSZXR1cm5JbnQoMTcpKTsKKyNpZiAhKGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPD0gMykKKyAgQk9PU1RfQ0hFQ0soJmZvcnR5X3R3byA9PSBmKTsKKyAgQk9PU1RfQ0hFQ0soUmV0dXJuSW50KDE3KSAhPSBmKTsKKyNlbmRpZgorCisgIEJPT1NUX0NIRUNLKGYuY29udGFpbnMoJmZvcnR5X3R3bykpOworCisgIGYgPSBSZXR1cm5JbnQoMTcpOworICBCT09TVF9DSEVDSyhmICE9ICZmb3J0eV90d28pOworICBCT09TVF9DSEVDSyhmID09IFJldHVybkludCgxNykpOworICBCT09TVF9DSEVDSyhmICE9IFJldHVybkludCgxNikpOworI2lmICEoZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA8PSAzKQorICBCT09TVF9DSEVDSygmZm9ydHlfdHdvICE9IGYpOworICBCT09TVF9DSEVDSyhSZXR1cm5JbnQoMTcpID09IGYpOworICBCT09TVF9DSEVDSyhSZXR1cm5JbnQoMTYpICE9IGYpOworI2VuZGlmCisKKyAgQk9PU1RfQ0hFQ0soZi5jb250YWlucyhSZXR1cm5JbnQoMTcpKSk7CisKKyAgZiA9IGNvbnRhaW5fdGVzdDo6UmV0dXJuSW50RkUoMTcpOworICBCT09TVF9DSEVDSyhmICE9ICZmb3J0eV90d28pOworICBCT09TVF9DSEVDSyhmID09IGNvbnRhaW5fdGVzdDo6UmV0dXJuSW50RkUoMTcpKTsKKyAgQk9PU1RfQ0hFQ0soZiAhPSBjb250YWluX3Rlc3Q6OlJldHVybkludEZFKDE2KSk7CisjaWYgIShkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fIDw9IDMpCisgIEJPT1NUX0NIRUNLKCZmb3J0eV90d28gIT0gZik7CisgIEJPT1NUX0NIRUNLKGNvbnRhaW5fdGVzdDo6UmV0dXJuSW50RkUoMTcpID09IGYpOworICBCT09TVF9DSEVDSyhjb250YWluX3Rlc3Q6OlJldHVybkludEZFKDE2KSAhPSBmKTsKKyNlbmRpZgorCisgIEJPT1NUX0NIRUNLKGYuY29udGFpbnMoY29udGFpbl90ZXN0OjpSZXR1cm5JbnRGRSgxNykpKTsKKworI2lmICFkZWZpbmVkKEJPT1NUX0ZVTkNUSU9OX05PX0ZVTkNUSU9OX1RZUEVfU1lOVEFYKQorICBuZG5ib29zdDo6ZnVuY3Rpb248aW50KHZvaWQpPiBnOworCisgIGcgPSAmZm9ydHlfdHdvOworICBCT09TVF9DSEVDSyhnID09ICZmb3J0eV90d28pOworICBCT09TVF9DSEVDSyhnICE9IFJldHVybkludCgxNykpOworIyAgaWYgIShkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fIDw9IDMpCisgIEJPT1NUX0NIRUNLKCZmb3J0eV90d28gPT0gZyk7CisgIEJPT1NUX0NIRUNLKFJldHVybkludCgxNykgIT0gZyk7CisjICBlbmRpZgorCisgIGcgPSBSZXR1cm5JbnQoMTcpOworICBCT09TVF9DSEVDSyhnICE9ICZmb3J0eV90d28pOworICBCT09TVF9DSEVDSyhnID09IFJldHVybkludCgxNykpOworICBCT09TVF9DSEVDSyhnICE9IFJldHVybkludCgxNikpOworIyAgaWYgIShkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fIDw9IDMpCisgIEJPT1NUX0NIRUNLKCZmb3J0eV90d28gIT0gZyk7CisgIEJPT1NUX0NIRUNLKFJldHVybkludCgxNykgPT0gZyk7CisgIEJPT1NUX0NIRUNLKFJldHVybkludCgxNikgIT0gZyk7CisjICBlbmRpZgorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHJlZl9lcXVhbF90ZXN0KCkKK3sKKyAgeworICAgIFJldHVybkludCByaSgxNyk7CisgICAgbmRuYm9vc3Q6OmZ1bmN0aW9uMDxpbnQ+IGYgPSBuZG5ib29zdDo6cmVmKHJpKTsKKworICAgIC8vIFJlZmVyZW5jZXMgYW5kIHZhbHVlcyBhcmUgZXF1YWwKKyAgICBCT09TVF9DSEVDSyhmID09IG5kbmJvb3N0OjpyZWYocmkpKTsKKyAgICBCT09TVF9DSEVDSyhmID09IHJpKTsKKyAgICBCT09TVF9DSEVDSyhuZG5ib29zdDo6cmVmKHJpKSA9PSBmKTsKKyAgICBCT09TVF9DSEVDSyghKGYgIT0gbmRuYm9vc3Q6OnJlZihyaSkpKTsKKyAgICBCT09TVF9DSEVDSyghKGYgIT0gcmkpKTsKKyAgICBCT09TVF9DSEVDSyghKG5kbmJvb3N0OjpyZWYocmkpICE9IGYpKTsKKyNpZiAhKGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPD0gMykKKyAgICBCT09TVF9DSEVDSyhyaSA9PSBmKTsKKyAgICBCT09TVF9DSEVDSyghKHJpICE9IGYpKTsKKyNlbmRpZgorCisgICAgLy8gVmFsdWVzIGVxdWFsLCByZWZlcmVuY2VzIGluZXF1YWwKKyAgICBSZXR1cm5JbnQgcmkyKDE3KTsKKyAgICBCT09TVF9DSEVDSyhmID09IHJpMik7CisgICAgQk9PU1RfQ0hFQ0soZiAhPSBuZG5ib29zdDo6cmVmKHJpMikpOworICAgIEJPT1NUX0NIRUNLKG5kbmJvb3N0OjpyZWYocmkyKSAhPSBmKTsKKyAgICBCT09TVF9DSEVDSyghKGYgIT0gcmkyKSk7CisgICAgQk9PU1RfQ0hFQ0soIShmID09IG5kbmJvb3N0OjpyZWYocmkyKSkpOworICAgIEJPT1NUX0NIRUNLKCEobmRuYm9vc3Q6OnJlZihyaTIpID09IGYpKTsKKyNpZiAhKGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPD0gMykKKyAgICBCT09TVF9DSEVDSyhyaTIgPT0gZik7CisgICAgQk9PU1RfQ0hFQ0soIShyaTIgIT0gZikpOworI2VuZGlmIAorICB9CisKKyNpZiAhZGVmaW5lZChCT09TVF9GVU5DVElPTl9OT19GVU5DVElPTl9UWVBFX1NZTlRBWCkKKyAgeworICAgIFJldHVybkludCByaSgxNyk7CisgICAgbmRuYm9vc3Q6OmZ1bmN0aW9uPGludCh2b2lkKT4gZiA9IG5kbmJvb3N0OjpyZWYocmkpOworCisgICAgLy8gUmVmZXJlbmNlcyBhbmQgdmFsdWVzIGFyZSBlcXVhbAorICAgIEJPT1NUX0NIRUNLKGYgPT0gbmRuYm9vc3Q6OnJlZihyaSkpOworICAgIEJPT1NUX0NIRUNLKGYgPT0gcmkpOworICAgIEJPT1NUX0NIRUNLKG5kbmJvb3N0OjpyZWYocmkpID09IGYpOworICAgIEJPT1NUX0NIRUNLKCEoZiAhPSBuZG5ib29zdDo6cmVmKHJpKSkpOworICAgIEJPT1NUX0NIRUNLKCEoZiAhPSByaSkpOworICAgIEJPT1NUX0NIRUNLKCEobmRuYm9vc3Q6OnJlZihyaSkgIT0gZikpOworIyAgaWYgIShkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fIDw9IDMpCisgICAgQk9PU1RfQ0hFQ0socmkgPT0gZik7CisgICAgQk9PU1RfQ0hFQ0soIShyaSAhPSBmKSk7CisjICBlbmRpZgorCisgICAgLy8gVmFsdWVzIGVxdWFsLCByZWZlcmVuY2VzIGluZXF1YWwKKyAgICBSZXR1cm5JbnQgcmkyKDE3KTsKKyAgICBCT09TVF9DSEVDSyhmID09IHJpMik7CisgICAgQk9PU1RfQ0hFQ0soZiAhPSBuZG5ib29zdDo6cmVmKHJpMikpOworICAgIEJPT1NUX0NIRUNLKG5kbmJvb3N0OjpyZWYocmkyKSAhPSBmKTsKKyAgICBCT09TVF9DSEVDSyghKGYgIT0gcmkyKSk7CisgICAgQk9PU1RfQ0hFQ0soIShmID09IG5kbmJvb3N0OjpyZWYocmkyKSkpOworICAgIEJPT1NUX0NIRUNLKCEobmRuYm9vc3Q6OnJlZihyaTIpID09IGYpKTsKKyMgIGlmICEoZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA8PSAzKQorICAgIEJPT1NUX0NIRUNLKHJpMiA9PSBmKTsKKyAgICBCT09TVF9DSEVDSyghKHJpMiAhPSBmKSk7CisjICBlbmRpZgorICB9CisjZW5kaWYKK30KKworaW50IHRlc3RfbWFpbihpbnQsIGNoYXIqW10pCit7CisgIHRhcmdldF90ZXN0KCk7CisgIGVxdWFsX3Rlc3QoKTsKKyAgcmVmX2VxdWFsX3Rlc3QoKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl8zMC5jcHAgYi9saWJzL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fMzAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OGI0MjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fMzAuY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKworLy8gIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDAyLTIwMDMuIFVzZSwgbW9kaWZpY2F0aW9uIGFuZAorLy8gIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uCisvLyAgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisKKy8vIE1ha2Ugc3VyZSB3ZSBkb24ndCB0cnkgdG8gcmVkZWZpbmUgZnVuY3Rpb24yCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb24yLmhwcD4KKworLy8gRGVmaW5lIGFsbCBCb29zdC5GdW5jdGlvbiBjbGFzcyB0ZW1wbGF0ZXMgdXAgdG8gMzAgYXJndW1lbnRzCisjZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTIDMwCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorCitpbnQgbWFpbigpCit7CisgIG5kbmJvb3N0OjpmdW5jdGlvbjA8ZmxvYXQ+IGYwOworCisgIG5kbmJvb3N0OjpmdW5jdGlvbjMwPGZsb2F0LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsCisgICAgICAgICAgICAgICAgICAgIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwKKyAgICAgICAgICAgICAgICAgICAgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50PiBmMzA7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX2FyaXRoX2N4eDk4LmNwcCBiL2xpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9hcml0aF9jeHg5OC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VmMWYwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9hcml0aF9jeHg5OC5jcHAKQEAgLTAsMCArMSwzNCBAQAorLy8gRnVuY3Rpb24gbGlicmFyeQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBEb3VnbGFzIEdyZWdvcgorCisvLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIAorLy8gTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgCisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpIAorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnLworCisgICAgCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisKK2Zsb2F0IG11bF9pbnRzKGludCB4LCBpbnQgeSkgeyByZXR1cm4gKChmbG9hdCl4KSAqIHk7IH0KK3N0cnVjdCBpbnRfZGl2IHsgCisgIGZsb2F0IG9wZXJhdG9yKCkoaW50IHgsIGludCB5KSBjb25zdCB7IHJldHVybiAoKGZsb2F0KXgpL3k7IH07IAorfTsKKworaW50IG1haW4oKQoreworICAgIG5kbmJvb3N0OjpmdW5jdGlvbjxmbG9hdCAoaW50IHgsIGludCB5KT4gZjsKKyAgICBmID0gaW50X2RpdigpOworICAgIHN0ZDo6Y291dCA8PCBmKDUsIDMpIDw8IHN0ZDo6ZW5kbDsKKyAgICBpZiAoZikKKyAgc3RkOjpjb3V0IDw8IGYoNSwgMykgPDwgc3RkOjplbmRsOworZWxzZQorICBzdGQ6OmNvdXQgPDwgImYgaGFzIG5vIHRhcmdldCwgc28gaXQgaXMgdW5zYWZlIHRvIGNhbGwiIDw8IHN0ZDo6ZW5kbDsKKyAgICBmID0gMDsKKyAgICBmID0gJm11bF9pbnRzOworICAKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9hcml0aF9wb3J0YWJsZS5jcHAgYi9saWJzL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fYXJpdGhfcG9ydGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZWJjYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fYXJpdGhfcG9ydGFibGUuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKy8vIEZ1bmN0aW9uIGxpYnJhcnkKKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgRG91Z2xhcyBHcmVnb3IKKworLy8gVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSAKKy8vIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KSAKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy8KKworICAgIAorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworZmxvYXQgbXVsX2ludHMoaW50IHgsIGludCB5KSB7IHJldHVybiAoKGZsb2F0KXgpICogeTsgfQorc3RydWN0IGludF9kaXYgeyAKKyAgZmxvYXQgb3BlcmF0b3IoKShpbnQgeCwgaW50IHkpIGNvbnN0IHsgcmV0dXJuICgoZmxvYXQpeCkveTsgfTsgCit9OworaW50IG1haW4oKQoreworICAgIG5kbmJvb3N0OjpmdW5jdGlvbjI8ZmxvYXQsIGludCwgaW50PiBmOworICAgIGYgPSBpbnRfZGl2KCk7CisgICAgc3RkOjpjb3V0IDw8IGYoNSwgMykgPDwgc3RkOjplbmRsOworICAgIGlmIChmKQorICBzdGQ6OmNvdXQgPDwgZig1LCAzKSA8PCBzdGQ6OmVuZGw7CitlbHNlCisgIHN0ZDo6Y291dCA8PCAiZiBoYXMgbm8gdGFyZ2V0LCBzbyBpdCBpcyB1bnNhZmUgdG8gY2FsbCIgPDwgc3RkOjplbmRsOworICAgIGYgPSAwOworICAgIGYgPSAmbXVsX2ludHM7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9uX3Rlc3QuY3BwIGIvbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX25fdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiNGJmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9uX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNjk3IEBACisvLyBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5CisKKy8vICBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwMS0yMDAzLiBVc2UsIG1vZGlmaWNhdGlvbiBhbmQKKy8vICBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbgorLy8gIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZworCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9taW5pbWFsLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN0cmluZz4KKwordXNpbmcgbmFtZXNwYWNlIG5kbmJvb3N0OwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6Om5lZ2F0ZTsKKworaW50IGdsb2JhbF9pbnQ7CisKK3N0cnVjdCB3cml0ZV9maXZlX29iaiB7IHZvaWQgb3BlcmF0b3IoKSgpIGNvbnN0IHsgZ2xvYmFsX2ludCA9IDU7IH0gfTsKK3N0cnVjdCB3cml0ZV90aHJlZV9vYmogeyBpbnQgb3BlcmF0b3IoKSgpIGNvbnN0IHsgZ2xvYmFsX2ludCA9IDM7IHJldHVybiA3OyB9fTsKK3N0YXRpYyB2b2lkIHdyaXRlX2ZpdmUoKSB7IGdsb2JhbF9pbnQgPSA1OyB9CitzdGF0aWMgdm9pZCB3cml0ZV90aHJlZSgpIHsgZ2xvYmFsX2ludCA9IDM7IH0KK3N0cnVjdCBnZW5lcmF0ZV9maXZlX29iaiB7IGludCBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gNTsgfSB9Oworc3RydWN0IGdlbmVyYXRlX3RocmVlX29iaiB7IGludCBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gMzsgfSB9Oworc3RhdGljIGludCBnZW5lcmF0ZV9maXZlKCkgeyByZXR1cm4gNTsgfQorc3RhdGljIGludCBnZW5lcmF0ZV90aHJlZSgpIHsgcmV0dXJuIDM7IH0KK3N0YXRpYyBzdHJpbmcgaWRlbnRpdHlfc3RyKGNvbnN0IHN0cmluZyYgcykgeyByZXR1cm4gczsgfQorc3RhdGljIHN0cmluZyBzdHJpbmdfY2F0KGNvbnN0IHN0cmluZyYgczEsIGNvbnN0IHN0cmluZyYgczIpIHsgcmV0dXJuIHMxK3MyOyB9CitzdGF0aWMgaW50IHN1bV9pbnRzKGludCB4LCBpbnQgeSkgeyByZXR1cm4geCt5OyB9CisKK3N0cnVjdCB3cml0ZV9jb25zdF8xX25vbmNvbnN0XzIKK3sKKyAgdm9pZCBvcGVyYXRvcigpKCkgeyBnbG9iYWxfaW50ID0gMjsgfQorICB2b2lkIG9wZXJhdG9yKCkoKSBjb25zdCB7IGdsb2JhbF9pbnQgPSAxOyB9Cit9OworCitzdHJ1Y3QgYWRkX3RvX29iagoreworICBhZGRfdG9fb2JqKGludCB2KSA6IHZhbHVlKHYpIHt9CisKKyAgaW50IG9wZXJhdG9yKCkoaW50IHgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlICsgeDsgfQorCisgIGludCB2YWx1ZTsKK307CisKK3N0YXRpYyB2b2lkCit0ZXN0X3plcm9fYXJncygpCit7CisgIHR5cGVkZWYgZnVuY3Rpb24wPHZvaWQ+IGZ1bmNfdm9pZF90eXBlOworCisgIHdyaXRlX2ZpdmVfb2JqIGZpdmUgPSB3cml0ZV9maXZlX29iaigpOyAvLyBJbml0aWFsaXphdGlvbiBmb3IgQm9ybGFuZCBDKysgNS41CisgIHdyaXRlX3RocmVlX29iaiB0aHJlZSA9IHdyaXRlX3RocmVlX29iaigpOyAvLyBEaXR0bworCisgIC8vIERlZmF1bHQgY29uc3RydWN0aW9uCisgIGZ1bmNfdm9pZF90eXBlIHYxOworICBCT09TVF9DSEVDSyh2MS5lbXB0eSgpKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGFuIGVtcHR5IGZ1bmN0aW9uCisgIHYxID0gZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXYxLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24gb2YgYSBmdW5jdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBjbGVhcigpIG1ldGhvZAorICB2MS5jbGVhcigpOworICBCT09TVF9DSEVDSyghdjEpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYW4gZW1wdHkgZnVuY3Rpb24KKyAgdjEgPSB0aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXYxLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24gYW5kIHNlbGYtYXNzaWdubWVudAorICBnbG9iYWxfaW50ID0gMDsKKyAgdjEgPSB2MTsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uCisgIHYxID0gZml2ZTsKKworICAvLyBJbnZvY2F0aW9uIGFuZCBzZWxmLWFzc2lnbm1lbnQKKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYxID0gKHYxKTsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBjbGVhcgorICB2MSA9IDA7CisgIEJPT1NUX0NIRUNLKHYxLmVtcHR5KCkpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYW4gZW1wdHkgZnVuY3Rpb24gZnJvbSBhIGZyZWUgZnVuY3Rpb24KKyAgdjEgPSAmd3JpdGVfZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXYxLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYxKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2MSA9ICZ3cml0ZV90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXYxLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYxKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gQXNzaWdubWVudAorICB2MSA9IGZpdmU7CisgIEJPT1NUX0NIRUNLKCF2MS5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBub24tZW1wdHkgZnVuY3Rpb24gZnJvbSBhIGZyZWUgZnVuY3Rpb24KKyAgdjEgPSB3cml0ZV90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXYxLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYxKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gQ29uc3RydWN0aW9uIGZyb20gYW5vdGhlciBmdW5jdGlvbiAodGhhdCBpcyBlbXB0eSkKKyAgdjEuY2xlYXIoKTsKKyAgZnVuY192b2lkX3R5cGUgdjIodjEpOworICBCT09TVF9DSEVDSyghdjI/IHRydWUgOiBmYWxzZSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbgorICB2MiA9IHRocmVlOworICBCT09TVF9DSEVDSyghdjIuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjIoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uCisgIHYyID0gKGZpdmUpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgdjIuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0sodjIuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2MiA9ICgmd3JpdGVfZml2ZSk7CisgIEJPT1NUX0NIRUNLKHYyPyB0cnVlIDogZmFsc2UpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2MiA9ICZ3cml0ZV90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXYyLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gU3dhcHBpbmcKKyAgdjEgPSBmaXZlOworICBzd2FwKHYxLCB2Mik7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisgIHYxKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisgIHN3YXAodjEsIHYyKTsKKyAgdjEuY2xlYXIoKTsKKworICAvLyBBc3NpZ25tZW50CisgIHYyID0gZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXYyLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2MiA9ICZ3cml0ZV90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXYyLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIGZ1bmN0aW9uIGZyb20gYW4gZW1wdHkgZnVuY3Rpb24KKyAgdjIgPSB2MTsKKyAgQk9PU1RfQ0hFQ0sodjIuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIGZ1bmN0aW9uIGZyb20gYSBmdW5jdGlvbiB3aXRoIGEgZnVuY3RvcgorICB2MSA9IHRocmVlOworICB2MiA9IHYxOworICBCT09TVF9DSEVDSyghdjEuZW1wdHkoKSk7CisgIEJPT1NUX0NIRUNLKCF2Mi5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworICBnbG9iYWxfaW50ID0gMDsKKyAgdjIoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ24gdG8gYSBmdW5jdGlvbiBmcm9tIGEgZnVuY3Rpb24gd2l0aCBhIGZ1bmN0aW9uCisgIHYyID0gJndyaXRlX2ZpdmU7CisgIHYxID0gdjI7CisgIEJPT1NUX0NIRUNLKCF2MS5lbXB0eSgpKTsKKyAgQk9PU1RfQ0hFQ0soIXYyLmVtcHR5KCkpOworICBnbG9iYWxfaW50ID0gMDsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQ29uc3RydWN0IGEgZnVuY3Rpb24gZ2l2ZW4gYW5vdGhlciBmdW5jdGlvbiBjb250YWluaW5nIGEgZnVuY3Rpb24KKyAgZnVuY192b2lkX3R5cGUgdjModjEpOworCisgIC8vIEludm9jYXRpb24gb2YgYSBmdW5jdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjMoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBjbGVhcigpIG1ldGhvZAorICB2My5jbGVhcigpOworICBCT09TVF9DSEVDSyghdjM/IHRydWUgOiBmYWxzZSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbgorICB2MyA9IHRocmVlOworICBCT09TVF9DSEVDSyghdjMuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjMoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uCisgIHYzID0gZml2ZTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MygpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIGNsZWFyKCkKKyAgdjMuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0sodjMuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2MyA9ICZ3cml0ZV9maXZlOworICBCT09TVF9DSEVDSyghdjMuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjMoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uIGZyb20gYSBmcmVlIGZ1bmN0aW9uCisgIHYzID0gJndyaXRlX3RocmVlOworICBCT09TVF9DSEVDSyghdjMuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjMoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50CisgIHYzID0gZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXYzLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYzKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQ29uc3RydWN0aW9uIG9mIGEgZnVuY3Rpb24gZnJvbSBhIGZ1bmN0aW9uIGNvbnRhaW5pbmcgYSBmdW5jdG9yCisgIGZ1bmNfdm9pZF90eXBlIHY0KHYzKTsKKworICAvLyBJbnZvY2F0aW9uIG9mIGEgZnVuY3Rpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY0KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gY2xlYXIoKSBtZXRob2QKKyAgdjQuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0sodjQuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbgorICB2NCA9IHRocmVlOworICBCT09TVF9DSEVDSyghdjQuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjQoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uCisgIHY0ID0gZml2ZTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NCgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIGNsZWFyKCkKKyAgdjQuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0sodjQuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2NCA9ICZ3cml0ZV9maXZlOworICBCT09TVF9DSEVDSyghdjQuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjQoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uIGZyb20gYSBmcmVlIGZ1bmN0aW9uCisgIHY0ID0gJndyaXRlX3RocmVlOworICBCT09TVF9DSEVDSyghdjQuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjQoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50CisgIHY0ID0gZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXY0LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY0KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQ29uc3RydWN0aW9uIG9mIGEgZnVuY3Rpb24gZnJvbSBhIGZ1bmN0b3IKKyAgZnVuY192b2lkX3R5cGUgdjUoZml2ZSk7CisKKyAgLy8gSW52b2NhdGlvbiBvZiBhIGZ1bmN0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIGNsZWFyKCkgbWV0aG9kCisgIHY1LmNsZWFyKCk7CisgIEJPT1NUX0NIRUNLKHY1LmVtcHR5KCkpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYW4gZW1wdHkgZnVuY3Rpb24KKyAgdjUgPSB0aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXY1LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY1KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbgorICB2NSA9IGZpdmU7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjUoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBjbGVhcigpCisgIHY1LmNsZWFyKCk7CisgIEJPT1NUX0NIRUNLKHY1LmVtcHR5KCkpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYW4gZW1wdHkgZnVuY3Rpb24gZnJvbSBhIGZyZWUgZnVuY3Rpb24KKyAgdjUgPSAmd3JpdGVfZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXY1LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY1KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2NSA9ICZ3cml0ZV90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXY1LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY1KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gQXNzaWdubWVudAorICB2NSA9IGZpdmU7CisgIEJPT1NUX0NIRUNLKCF2NS5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIENvbnN0cnVjdGlvbiBvZiBhIGZ1bmN0aW9uIGZyb20gYSBmdW5jdGlvbgorICBmdW5jX3ZvaWRfdHlwZSB2Nigmd3JpdGVfZml2ZSk7CisKKyAgLy8gSW52b2NhdGlvbiBvZiBhIGZ1bmN0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NigpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIGNsZWFyKCkgbWV0aG9kCisgIHY2LmNsZWFyKCk7CisgIEJPT1NUX0NIRUNLKHY2LmVtcHR5KCkpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYW4gZW1wdHkgZnVuY3Rpb24KKyAgdjYgPSB0aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXY2LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY2KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbgorICB2NiA9IGZpdmU7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjYoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBjbGVhcigpCisgIHY2LmNsZWFyKCk7CisgIEJPT1NUX0NIRUNLKHY2LmVtcHR5KCkpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYW4gZW1wdHkgZnVuY3Rpb24gZnJvbSBhIGZyZWUgZnVuY3Rpb24KKyAgdjYgPSAmd3JpdGVfZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXY2LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY2KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2NiA9ICZ3cml0ZV90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXY2LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY2KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gQXNzaWdubWVudAorICB2NiA9IGZpdmU7CisgIEJPT1NUX0NIRUNLKCF2Ni5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NigpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIENvbnN0IHZzLiBub24tY29uc3QKKyAgLy8gSW5pdGlhbGl6YXRpb24gZm9yIEJvcmxhbmQgQysrIDUuNQorICB3cml0ZV9jb25zdF8xX25vbmNvbnN0XzIgb25lX29yX3R3byA9IHdyaXRlX2NvbnN0XzFfbm9uY29uc3RfMigpOyAKKyAgY29uc3QgZnVuY3Rpb24wPHZvaWQ+IHY3KG9uZV9vcl90d28pOworICBmdW5jdGlvbjA8dm9pZD4gdjgob25lX29yX3R3byk7CisKKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY3KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMik7CisKKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY4KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMik7CisKKyAgLy8gVGVzdCBjb25zdHJ1Y3Rpb24gZnJvbSAwIGFuZCBjb21wYXJpc29uIHRvIDAKKyAgZnVuY192b2lkX3R5cGUgdjkoMCk7CisgIEJPT1NUX0NIRUNLKHY5ID09IDApOworIyBpZiAhZGVmaW5lZChfX1NVTlBST19DQykgfHwgX19TVU5QUk9fQ0MgPiAweDU0MCB8fCBkZWZpbmVkKEJPT1NUX1NUUklDVF9DT05GSUcpCisgIEJPT1NUX0NIRUNLKDAgPT0gdjkpOworI2Vsc2UKKyAgQk9PU1RfQ0hFQ0sodjkuZW1wdHkoKSk7CisjZW5kaWYKKworICAvLyBUZXN0IHJldHVybiB2YWx1ZXMKKyAgdHlwZWRlZiBmdW5jdGlvbjA8aW50PiBmdW5jX2ludF90eXBlOworICAvLyBJbml0aWFsaXphdGlvbiBmb3IgQm9ybGFuZCBDKysgNS41CisgIGdlbmVyYXRlX2ZpdmVfb2JqIGdlbl9maXZlID0gZ2VuZXJhdGVfZml2ZV9vYmooKTsKKyAgZ2VuZXJhdGVfdGhyZWVfb2JqIGdlbl90aHJlZSA9IGdlbmVyYXRlX3RocmVlX29iaigpOworICBmdW5jX2ludF90eXBlIGkwKGdlbl9maXZlKTsKKworICBCT09TVF9DSEVDSyhpMCgpID09IDUpOworICBpMCA9IGdlbl90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soaTAoKSA9PSAzKTsKKyAgaTAgPSAmZ2VuZXJhdGVfZml2ZTsKKyAgQk9PU1RfQ0hFQ0soaTAoKSA9PSA1KTsKKyAgaTAgPSAmZ2VuZXJhdGVfdGhyZWU7CisgIEJPT1NUX0NIRUNLKGkwKCkgPT0gMyk7CisgIEJPT1NUX0NIRUNLKGkwPyB0cnVlIDogZmFsc2UpOworICBpMC5jbGVhcigpOworICBCT09TVF9DSEVDSyghaTA/IHRydWUgOiBmYWxzZSk7CisKKyAgLy8gVGVzdCByZXR1cm4gdmFsdWVzIHdpdGggY29tcGF0aWJsZSB0eXBlcworICB0eXBlZGVmIGZ1bmN0aW9uMDxsb25nPiBmdW5jX2xvbmdfdHlwZTsKKyAgZnVuY19sb25nX3R5cGUgaTEoZ2VuX2ZpdmUpOworCisgIEJPT1NUX0NIRUNLKGkxKCkgPT0gNSk7CisgIGkxID0gZ2VuX3RocmVlOworICBCT09TVF9DSEVDSyhpMSgpID09IDMpOworICBpMSA9ICZnZW5lcmF0ZV9maXZlOworICBCT09TVF9DSEVDSyhpMSgpID09IDUpOworICBpMSA9ICZnZW5lcmF0ZV90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soaTEoKSA9PSAzKTsKKyAgQk9PU1RfQ0hFQ0soaTE/IHRydWUgOiBmYWxzZSk7CisgIGkxLmNsZWFyKCk7CisgIEJPT1NUX0NIRUNLKCFpMT8gdHJ1ZSA6IGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfb25lX2FyZygpCit7CisgIG5lZ2F0ZTxpbnQ+IG5lZyA9IG5lZ2F0ZTxpbnQ+KCk7IC8vIEluaXRpYWxpemF0aW9uIGZvciBCb3JsYW5kIEMrKyA1LjUKKworICBmdW5jdGlvbjE8aW50LCBpbnQ+IGYxKG5lZyk7CisgIEJPT1NUX0NIRUNLKGYxKDUpID09IC01KTsKKworICBmdW5jdGlvbjE8c3RyaW5nLCBzdHJpbmc+IGlkKCZpZGVudGl0eV9zdHIpOworICBCT09TVF9DSEVDSyhpZCgic3RyIikgPT0gInN0ciIpOworCisgIGZ1bmN0aW9uMTxzdGQ6OnN0cmluZywgY29uc3QgY2hhcio+IGlkMigmaWRlbnRpdHlfc3RyKTsKKyAgQk9PU1RfQ0hFQ0soaWQyKCJmb28iKSA9PSAiZm9vIik7CisKKyAgYWRkX3RvX29iaiBhZGRfdG8oNSk7CisgIGZ1bmN0aW9uMTxpbnQsIGludD4gZjIoYWRkX3RvKTsKKyAgQk9PU1RfQ0hFQ0soZjIoMykgPT0gOCk7CisKKyAgY29uc3QgZnVuY3Rpb24xPGludCwgaW50PiBjZjIoYWRkX3RvKTsKKyAgQk9PU1RfQ0hFQ0soY2YyKDMpID09IDgpOworfQorCitzdGF0aWMgdm9pZAordGVzdF90d29fYXJncygpCit7CisgIGZ1bmN0aW9uMjxzdHJpbmcsIGNvbnN0IHN0cmluZyYsIGNvbnN0IHN0cmluZyY+IGNhdCgmc3RyaW5nX2NhdCk7CisgIEJPT1NUX0NIRUNLKGNhdCgic3RyIiwgImluZyIpID09ICJzdHJpbmciKTsKKworICBmdW5jdGlvbjI8aW50LCBzaG9ydCwgc2hvcnQ+IHN1bSgmc3VtX2ludHMpOworICBCT09TVF9DSEVDSyhzdW0oMiwgMykgPT0gNSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2VtcHRpbmVzcygpCit7CisgIGZ1bmN0aW9uMDxmbG9hdD4gZjE7CisgIEJPT1NUX0NIRUNLKGYxLmVtcHR5KCkpOworCisgIGZ1bmN0aW9uMDxmbG9hdD4gZjI7CisgIGYyID0gZjE7CisgIEJPT1NUX0NIRUNLKGYyLmVtcHR5KCkpOworCisgIGZ1bmN0aW9uMDxkb3VibGU+IGYzOworICBmMyA9IGYyOworICBCT09TVF9DSEVDSyhmMy5lbXB0eSgpKTsKK30KKworc3RydWN0IFggeworICBYKGludCB2KSA6IHZhbHVlKHYpIHt9CisKKyAgaW50IHR3aWNlKCkgY29uc3QgeyByZXR1cm4gMip2YWx1ZTsgfQorICBpbnQgcGx1cyhpbnQgdikgeyByZXR1cm4gdmFsdWUgKyB2OyB9CisKKyAgaW50IHZhbHVlOworfTsKKworc3RhdGljIHZvaWQKK3Rlc3RfbWVtYmVyX2Z1bmN0aW9ucygpCit7CisKKyAgbmRuYm9vc3Q6OmZ1bmN0aW9uMTxpbnQsIFgqPiBmMSgmWDo6dHdpY2UpOworCisgIFggb25lKDEpOworICBYIGZpdmUoNSk7CisKKyAgQk9PU1RfQ0hFQ0soZjEoJm9uZSkgPT0gMik7CisgIEJPT1NUX0NIRUNLKGYxKCZmaXZlKSA9PSAxMCk7CisKKyAgbmRuYm9vc3Q6OmZ1bmN0aW9uMTxpbnQsIFgqPiBmMV8yOworICBmMV8yID0gJlg6OnR3aWNlOworCisgIEJPT1NUX0NIRUNLKGYxXzIoJm9uZSkgPT0gMik7CisgIEJPT1NUX0NIRUNLKGYxXzIoJmZpdmUpID09IDEwKTsKKworICBuZG5ib29zdDo6ZnVuY3Rpb24yPGludCwgWCYsIGludD4gZjIoJlg6OnBsdXMpOworICBCT09TVF9DSEVDSyhmMihvbmUsIDMpID09IDQpOworICBCT09TVF9DSEVDSyhmMihmaXZlLCA0KSA9PSA5KTsKK30KKworc3RydWN0IGFkZF93aXRoX3Rocm93X29uX2NvcHkgeworICBpbnQgb3BlcmF0b3IoKShpbnQgeCwgaW50IHkpIGNvbnN0IHsgcmV0dXJuIHgreTsgfQorCisgIGFkZF93aXRoX3Rocm93X29uX2NvcHkoKSB7fQorCisgIGFkZF93aXRoX3Rocm93X29uX2NvcHkoY29uc3QgYWRkX3dpdGhfdGhyb3dfb25fY29weSYpCisgIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIkJ1dCB0aGlzIENBTidUIHRocm93Iik7CisgIH0KKworICBhZGRfd2l0aF90aHJvd19vbl9jb3B5JiBvcGVyYXRvcj0oY29uc3QgYWRkX3dpdGhfdGhyb3dfb25fY29weSYpCisgIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIkJ1dCB0aGlzIENBTidUIHRocm93Iik7CisgIH0KK307CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlZigpCit7CisgIGFkZF93aXRoX3Rocm93X29uX2NvcHkgYXRjOworICB0cnkgeworICAgIG5kbmJvb3N0OjpmdW5jdGlvbjI8aW50LCBpbnQsIGludD4gZihyZWYoYXRjKSk7CisgICAgQk9PU1RfQ0hFQ0soZigxLCAzKSA9PSA0KTsKKyAgfQorICBjYXRjaChzdGQ6OnJ1bnRpbWVfZXJyb3IgZSkgeworICAgIEJPT1NUX0VSUk9SKCJOb250aHJvd2luZyBjb25zdHJ1Y3RvciB0aHJldyBhbiBleGNlcHRpb24iKTsKKyAgfQorfQorCitzdGF0aWMgdW5zaWduZWQgY29uc3RydWN0aW9uX2NvdW50ID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBkZXN0cnVjdGlvbl9jb3VudCA9IDA7CisKK3N0cnVjdCBNeVNtYWxsRnVuY3RvciB7CisgIE15U21hbGxGdW5jdG9yKCkgeyArK2NvbnN0cnVjdGlvbl9jb3VudDsgfQorICBNeVNtYWxsRnVuY3Rvcihjb25zdCBNeVNtYWxsRnVuY3RvciAmKSB7ICsrY29uc3RydWN0aW9uX2NvdW50OyB9CisgIH5NeVNtYWxsRnVuY3RvcigpIHsgKytkZXN0cnVjdGlvbl9jb3VudDsgfQorICBpbnQgb3BlcmF0b3IoKSgpIHsgcmV0dXJuIDA7IH0KKyB9OworCitzdHJ1Y3QgTXlMYXJnZUZ1bmN0b3IgeworICBNeUxhcmdlRnVuY3RvcigpIHsgKytjb25zdHJ1Y3Rpb25fY291bnQ7IH0KKyAgTXlMYXJnZUZ1bmN0b3IoY29uc3QgTXlMYXJnZUZ1bmN0b3IgJikgeyArK2NvbnN0cnVjdGlvbl9jb3VudDsgfQorICB+TXlMYXJnZUZ1bmN0b3IoKSB7ICsrZGVzdHJ1Y3Rpb25fY291bnQ7IH0KKyAgaW50IG9wZXJhdG9yKCkoKSB7IHJldHVybiAwOyB9CisKKyAgZmxvYXQgZGF0YVsxMjhdOworIH07CisKK3ZvaWQgdGVzdF9jb25zdHJ1Y3RfZGVzdHJveV9jb3VudCgpCit7CisgIHsKKyAgICBuZG5ib29zdDo6ZnVuY3Rpb24wPGludD4gZjsKKyAgICBuZG5ib29zdDo6ZnVuY3Rpb24wPGludD4gZzsKKyAgICBmID0gTXlTbWFsbEZ1bmN0b3IoKTsKKyAgICBnID0gTXlTbWFsbEZ1bmN0b3IoKTsKKyAgICBmLnN3YXAoZyk7CisgIH0KKworICAvLyBNeVNtYWxsRnVuY3RvciBvYmplY3RzIHNob3VsZCBiZSBjb25zdHJ1Y3RlZCBhcyBtYW55IHRpbWVzIGFzCisgIC8vIHRoZXkgYXJlIGRlc3Ryb3llZC4KKyAgQk9PU1RfQ0hFQ0soY29uc3RydWN0aW9uX2NvdW50ID09IGRlc3RydWN0aW9uX2NvdW50KTsKKyAKKyAgY29uc3RydWN0aW9uX2NvdW50ID0gMDsKKyAgZGVzdHJ1Y3Rpb25fY291bnQgPSAwOworICB7CisgICAgbmRuYm9vc3Q6OmZ1bmN0aW9uMDxpbnQ+IGY7CisgICAgbmRuYm9vc3Q6OmZ1bmN0aW9uMDxpbnQ+IGc7CisgICAgZiA9IE15TGFyZ2VGdW5jdG9yKCk7CisgICAgZyA9IE15TGFyZ2VGdW5jdG9yKCk7CisgICAgZi5zd2FwKGcpOworICAgfQorCisgICAvLyBNeUxhcmdlRnVuY3RvciBvYmplY3RzIHNob3VsZCBiZSBjb25zdHJ1Y3RlZCBhcyBtYW55IHRpbWVzIGFzCisgICAvLyB0aGV5IGFyZSBkZXN0cm95ZWQuCisgICBCT09TVF9DSEVDSyhjb25zdHJ1Y3Rpb25fY291bnQgPT0gZGVzdHJ1Y3Rpb25fY291bnQpOworfQorCitpbnQgdGVzdF9tYWluKGludCwgY2hhciogW10pCit7CisgIHRlc3RfemVyb19hcmdzKCk7CisgIHRlc3Rfb25lX2FyZygpOworICB0ZXN0X3R3b19hcmdzKCk7CisgIHRlc3RfZW1wdGluZXNzKCk7CisgIHRlc3RfbWVtYmVyX2Z1bmN0aW9ucygpOworICB0ZXN0X3JlZigpOworICB0ZXN0X2NvbnN0cnVjdF9kZXN0cm95X2NvdW50KCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3JlZl9jeHg5OC5jcHAgYi9saWJzL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fcmVmX2N4eDk4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDc5YzlkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3JlZl9jeHg5OC5jcHAKQEAgLTAsMCArMSwyNyBAQAorLy8gRnVuY3Rpb24gbGlicmFyeQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBEb3VnbGFzIEdyZWdvcgorCisvLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIAorLy8gTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgCisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpIAorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnLworCisKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKworc3RydWN0IHN0YXRlZnVsX3R5cGUgeyBpbnQgb3BlcmF0b3IoKShpbnQpIGNvbnN0IHsgcmV0dXJuIDA7IH0gfTsKKworaW50IG1haW4oKQoreworICAgIHN0YXRlZnVsX3R5cGUgYV9mdW5jdGlvbl9vYmplY3Q7CisgIG5kbmJvb3N0OjpmdW5jdGlvbjxpbnQgKGludCk+IGY7CisgIGYgPSBuZG5ib29zdDo6cmVmKGFfZnVuY3Rpb25fb2JqZWN0KTsKKworICBuZG5ib29zdDo6ZnVuY3Rpb248aW50IChpbnQpPiBmMihmKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3JlZl9wb3J0YWJsZS5jcHAgYi9saWJzL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fcmVmX3BvcnRhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWM4NGEyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3JlZl9wb3J0YWJsZS5jcHAKQEAgLTAsMCArMSwyNyBAQAorLy8gRnVuY3Rpb24gbGlicmFyeQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBEb3VnbGFzIEdyZWdvcgorCisvLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIAorLy8gTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgCisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpIAorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnLworCisKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKworc3RydWN0IHN0YXRlZnVsX3R5cGUgeyBpbnQgb3BlcmF0b3IoKShpbnQpIGNvbnN0IHsgcmV0dXJuIDA7IH0gfTsKKworaW50IG1haW4oKQoreworICAgIHN0YXRlZnVsX3R5cGUgYV9mdW5jdGlvbl9vYmplY3Q7CisgIG5kbmJvb3N0OjpmdW5jdGlvbjE8aW50LCBpbnQ+IGY7CisgIGYgPSBuZG5ib29zdDo6cmVmKGFfZnVuY3Rpb25fb2JqZWN0KTsKKworICBuZG5ib29zdDo6ZnVuY3Rpb24xPGludCwgaW50PiBmMihmKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3Rlc3QuY3BwIGIvbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYzdjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fdGVzdC5jcHAKQEAgLTAsMCArMSw3OTggQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKworLy8gIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDAxLTIwMDMuIFVzZSwgbW9kaWZpY2F0aW9uIGFuZAorLy8gIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uCisvLyAgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L21pbmltYWwuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCit1c2luZyBuZG5ib29zdDo6ZnVuY3Rpb247Cit1c2luZyBzdGQ6OnN0cmluZzsKKworaW50IGdsb2JhbF9pbnQ7CisKK3N0cnVjdCB3cml0ZV9maXZlX29iaiB7IHZvaWQgb3BlcmF0b3IoKSgpIGNvbnN0IHsgZ2xvYmFsX2ludCA9IDU7IH0gfTsKK3N0cnVjdCB3cml0ZV90aHJlZV9vYmogeyBpbnQgb3BlcmF0b3IoKSgpIGNvbnN0IHsgZ2xvYmFsX2ludCA9IDM7IHJldHVybiA3OyB9fTsKK3N0YXRpYyB2b2lkIHdyaXRlX2ZpdmUoKSB7IGdsb2JhbF9pbnQgPSA1OyB9CitzdGF0aWMgdm9pZCB3cml0ZV90aHJlZSgpIHsgZ2xvYmFsX2ludCA9IDM7IH0KK3N0cnVjdCBnZW5lcmF0ZV9maXZlX29iaiB7IGludCBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gNTsgfSB9Oworc3RydWN0IGdlbmVyYXRlX3RocmVlX29iaiB7IGludCBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gMzsgfSB9Oworc3RhdGljIGludCBnZW5lcmF0ZV9maXZlKCkgeyByZXR1cm4gNTsgfQorc3RhdGljIGludCBnZW5lcmF0ZV90aHJlZSgpIHsgcmV0dXJuIDM7IH0KK3N0YXRpYyBzdHJpbmcgaWRlbnRpdHlfc3RyKGNvbnN0IHN0cmluZyYgcykgeyByZXR1cm4gczsgfQorc3RhdGljIHN0cmluZyBzdHJpbmdfY2F0KGNvbnN0IHN0cmluZyYgczEsIGNvbnN0IHN0cmluZyYgczIpIHsgcmV0dXJuIHMxK3MyOyB9CitzdGF0aWMgaW50IHN1bV9pbnRzKGludCB4LCBpbnQgeSkgeyByZXR1cm4geCt5OyB9CisKK3N0cnVjdCB3cml0ZV9jb25zdF8xX25vbmNvbnN0XzIKK3sKKyAgdm9pZCBvcGVyYXRvcigpKCkgeyBnbG9iYWxfaW50ID0gMjsgfQorICB2b2lkIG9wZXJhdG9yKCkoKSBjb25zdCB7IGdsb2JhbF9pbnQgPSAxOyB9Cit9OworCitzdHJ1Y3QgYWRkX3RvX29iagoreworICBhZGRfdG9fb2JqKGludCB2KSA6IHZhbHVlKHYpIHt9CisKKyAgaW50IG9wZXJhdG9yKCkoaW50IHgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlICsgeDsgfQorCisgIGludCB2YWx1ZTsKK307CisKK3N0YXRpYyB2b2lkCit0ZXN0X3plcm9fYXJncygpCit7CisgIHR5cGVkZWYgZnVuY3Rpb248dm9pZCAoKT4gZnVuY192b2lkX3R5cGU7CisKKyAgd3JpdGVfZml2ZV9vYmogZml2ZTsKKyAgd3JpdGVfdGhyZWVfb2JqIHRocmVlOworCisgIC8vIERlZmF1bHQgY29uc3RydWN0aW9uCisgIGZ1bmNfdm9pZF90eXBlIHYxOworICBCT09TVF9DSEVDSyh2MS5lbXB0eSgpKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGFuIGVtcHR5IGZ1bmN0aW9uCisgIHYxID0gZml2ZTsKKyAgQk9PU1RfQ0hFQ0sodjEgIT0gMCk7CisKKyAgLy8gSW52b2NhdGlvbiBvZiBhIGZ1bmN0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIGNsZWFyKCkgbWV0aG9kCisgIHYxLmNsZWFyKCk7CisgIEJPT1NUX0NIRUNLKHYxID09IDApOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYW4gZW1wdHkgZnVuY3Rpb24KKyAgdjEgPSB0aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXYxLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24gYW5kIHNlbGYtYXNzaWdubWVudAorICBnbG9iYWxfaW50ID0gMDsKKyAgdjEgPSB2MTsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uCisgIHYxID0gZml2ZTsKKworICAvLyBJbnZvY2F0aW9uIGFuZCBzZWxmLWFzc2lnbm1lbnQKKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYxID0gKHYxKTsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBjbGVhcgorICB2MSA9IDA7CisgIEJPT1NUX0NIRUNLKDAgPT0gdjEpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYW4gZW1wdHkgZnVuY3Rpb24gZnJvbSBhIGZyZWUgZnVuY3Rpb24KKyAgdjEgPSBCT09TVF9GVU5DVElPTl9UQVJHRVRfRklYKCYpIHdyaXRlX2ZpdmU7CisgIEJPT1NUX0NIRUNLKDAgIT0gdjEpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYxKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2MSA9IEJPT1NUX0ZVTkNUSU9OX1RBUkdFVF9GSVgoJikgd3JpdGVfdGhyZWU7CisgIEJPT1NUX0NIRUNLKCF2MS5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworCisgIC8vIEFzc2lnbm1lbnQKKyAgdjEgPSBmaXZlOworICBCT09TVF9DSEVDSyghdjEuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uIGZyb20gYSBmcmVlIGZ1bmN0aW9uCisgIHYxID0gJndyaXRlX3RocmVlOworICBCT09TVF9DSEVDSyghdjEuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBDb25zdHJ1Y3Rpb24gZnJvbSBhbm90aGVyIGZ1bmN0aW9uICh0aGF0IGlzIGVtcHR5KQorICB2MS5jbGVhcigpOworICBmdW5jX3ZvaWRfdHlwZSB2Mih2MSk7CisgIEJPT1NUX0NIRUNLKCF2Mj8gdHJ1ZSA6IGZhbHNlKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGFuIGVtcHR5IGZ1bmN0aW9uCisgIHYyID0gdGhyZWU7CisgIEJPT1NUX0NIRUNLKCF2Mi5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MigpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBub24tZW1wdHkgZnVuY3Rpb24KKyAgdjIgPSAoZml2ZSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjIoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICB2Mi5jbGVhcigpOworICBCT09TVF9DSEVDSyh2Mi5lbXB0eSgpKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGFuIGVtcHR5IGZ1bmN0aW9uIGZyb20gYSBmcmVlIGZ1bmN0aW9uCisgIHYyID0gKEJPT1NUX0ZVTkNUSU9OX1RBUkdFVF9GSVgoJikgd3JpdGVfZml2ZSk7CisgIEJPT1NUX0NIRUNLKHYyPyB0cnVlIDogZmFsc2UpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2MiA9IEJPT1NUX0ZVTkNUSU9OX1RBUkdFVF9GSVgoJikgd3JpdGVfdGhyZWU7CisgIEJPT1NUX0NIRUNLKCF2Mi5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MigpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworCisgIC8vIFN3YXBwaW5nCisgIHYxID0gZml2ZTsKKyAgc3dhcCh2MSwgdjIpOworICB2MigpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworICB2MSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworICBzd2FwKHYxLCB2Mik7CisgIHYxLmNsZWFyKCk7CisKKyAgLy8gQXNzaWdubWVudAorICB2MiA9IGZpdmU7CisgIEJPT1NUX0NIRUNLKCF2Mi5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MigpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBub24tZW1wdHkgZnVuY3Rpb24gZnJvbSBhIGZyZWUgZnVuY3Rpb24KKyAgdjIgPSAmd3JpdGVfdGhyZWU7CisgIEJPT1NUX0NIRUNLKCF2Mi5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MigpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBmdW5jdGlvbiBmcm9tIGFuIGVtcHR5IGZ1bmN0aW9uCisgIHYyID0gdjE7CisgIEJPT1NUX0NIRUNLKHYyLmVtcHR5KCkpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBmdW5jdGlvbiBmcm9tIGEgZnVuY3Rpb24gd2l0aCBhIGZ1bmN0b3IKKyAgdjEgPSB0aHJlZTsKKyAgdjIgPSB2MTsKKyAgQk9PU1RfQ0hFQ0soIXYxLmVtcHR5KCkpOworICBCT09TVF9DSEVDSyghdjIuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gQXNzaWduIHRvIGEgZnVuY3Rpb24gZnJvbSBhIGZ1bmN0aW9uIHdpdGggYSBmdW5jdGlvbgorICB2MiA9IEJPT1NUX0ZVTkNUSU9OX1RBUkdFVF9GSVgoJikgd3JpdGVfZml2ZTsKKyAgdjEgPSB2MjsKKyAgQk9PU1RfQ0hFQ0soIXYxLmVtcHR5KCkpOworICBCT09TVF9DSEVDSyghdjIuZW1wdHkoKSk7CisgIGdsb2JhbF9pbnQgPSAwOworICB2MSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworICBnbG9iYWxfaW50ID0gMDsKKyAgdjIoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBDb25zdHJ1Y3QgYSBmdW5jdGlvbiBnaXZlbiBhbm90aGVyIGZ1bmN0aW9uIGNvbnRhaW5pbmcgYSBmdW5jdGlvbgorICBmdW5jX3ZvaWRfdHlwZSB2Myh2MSk7CisKKyAgLy8gSW52b2NhdGlvbiBvZiBhIGZ1bmN0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MygpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIGNsZWFyKCkgbWV0aG9kCisgIHYzLmNsZWFyKCk7CisgIEJPT1NUX0NIRUNLKCF2Mz8gdHJ1ZSA6IGZhbHNlKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGFuIGVtcHR5IGZ1bmN0aW9uCisgIHYzID0gdGhyZWU7CisgIEJPT1NUX0NIRUNLKCF2My5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MygpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBub24tZW1wdHkgZnVuY3Rpb24KKyAgdjMgPSBmaXZlOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYzKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gY2xlYXIoKQorICB2My5jbGVhcigpOworICBCT09TVF9DSEVDSyh2My5lbXB0eSgpKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGFuIGVtcHR5IGZ1bmN0aW9uIGZyb20gYSBmcmVlIGZ1bmN0aW9uCisgIHYzID0gJndyaXRlX2ZpdmU7CisgIEJPT1NUX0NIRUNLKCF2My5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MygpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBub24tZW1wdHkgZnVuY3Rpb24gZnJvbSBhIGZyZWUgZnVuY3Rpb24KKyAgdjMgPSAmd3JpdGVfdGhyZWU7CisgIEJPT1NUX0NIRUNLKCF2My5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MygpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworCisgIC8vIEFzc2lnbm1lbnQKKyAgdjMgPSBmaXZlOworICBCT09TVF9DSEVDSyghdjMuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjMoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBDb25zdHJ1Y3Rpb24gb2YgYSBmdW5jdGlvbiBmcm9tIGEgZnVuY3Rpb24gY29udGFpbmluZyBhIGZ1bmN0b3IKKyAgZnVuY192b2lkX3R5cGUgdjQodjMpOworCisgIC8vIEludm9jYXRpb24gb2YgYSBmdW5jdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjQoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBjbGVhcigpIG1ldGhvZAorICB2NC5jbGVhcigpOworICBCT09TVF9DSEVDSyh2NC5lbXB0eSgpKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGFuIGVtcHR5IGZ1bmN0aW9uCisgIHY0ID0gdGhyZWU7CisgIEJPT1NUX0NIRUNLKCF2NC5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NCgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBub24tZW1wdHkgZnVuY3Rpb24KKyAgdjQgPSBmaXZlOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY0KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gY2xlYXIoKQorICB2NC5jbGVhcigpOworICBCT09TVF9DSEVDSyh2NC5lbXB0eSgpKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGFuIGVtcHR5IGZ1bmN0aW9uIGZyb20gYSBmcmVlIGZ1bmN0aW9uCisgIHY0ID0gJndyaXRlX2ZpdmU7CisgIEJPT1NUX0NIRUNLKCF2NC5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NCgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBub24tZW1wdHkgZnVuY3Rpb24gZnJvbSBhIGZyZWUgZnVuY3Rpb24KKyAgdjQgPSAmd3JpdGVfdGhyZWU7CisgIEJPT1NUX0NIRUNLKCF2NC5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NCgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworCisgIC8vIEFzc2lnbm1lbnQKKyAgdjQgPSBmaXZlOworICBCT09TVF9DSEVDSyghdjQuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjQoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBDb25zdHJ1Y3Rpb24gb2YgYSBmdW5jdGlvbiBmcm9tIGEgZnVuY3RvcgorICBmdW5jX3ZvaWRfdHlwZSB2NShmaXZlKTsKKworICAvLyBJbnZvY2F0aW9uIG9mIGEgZnVuY3Rpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY1KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gY2xlYXIoKSBtZXRob2QKKyAgdjUuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0sodjUuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbgorICB2NSA9IHRocmVlOworICBCT09TVF9DSEVDSyghdjUuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjUoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uCisgIHY1ID0gZml2ZTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIGNsZWFyKCkKKyAgdjUuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0sodjUuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2NSA9ICZ3cml0ZV9maXZlOworICBCT09TVF9DSEVDSyghdjUuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjUoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uIGZyb20gYSBmcmVlIGZ1bmN0aW9uCisgIHY1ID0gJndyaXRlX3RocmVlOworICBCT09TVF9DSEVDSyghdjUuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjUoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50CisgIHY1ID0gZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXY1LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY1KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQ29uc3RydWN0aW9uIG9mIGEgZnVuY3Rpb24gZnJvbSBhIGZ1bmN0aW9uCisgIGZ1bmNfdm9pZF90eXBlIHY2KCZ3cml0ZV9maXZlKTsKKworICAvLyBJbnZvY2F0aW9uIG9mIGEgZnVuY3Rpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY2KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gY2xlYXIoKSBtZXRob2QKKyAgdjYuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0sodjYuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbgorICB2NiA9IHRocmVlOworICBCT09TVF9DSEVDSyghdjYuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjYoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uCisgIHY2ID0gZml2ZTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NigpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIGNsZWFyKCkKKyAgdjYuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0sodjYuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2NiA9ICZ3cml0ZV9maXZlOworICBCT09TVF9DSEVDSyghdjYuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjYoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uIGZyb20gYSBmcmVlIGZ1bmN0aW9uCisgIHY2ID0gJndyaXRlX3RocmVlOworICBCT09TVF9DSEVDSyghdjYuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjYoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50CisgIHY2ID0gZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXY2LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY2KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQ29uc3QgdnMuIG5vbi1jb25zdAorICB3cml0ZV9jb25zdF8xX25vbmNvbnN0XzIgb25lX29yX3R3bzsKKyAgY29uc3QgZnVuY3Rpb248dm9pZCAoKT4gdjcob25lX29yX3R3byk7CisgIGZ1bmN0aW9uPHZvaWQgKCk+IHY4KG9uZV9vcl90d28pOworCisgIGdsb2JhbF9pbnQgPSAwOworICB2NygpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDIpOworCisgIGdsb2JhbF9pbnQgPSAwOworICB2OCgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDIpOworCisgIC8vIFRlc3QgY29uc3RydWN0aW9uIGZyb20gMCBhbmQgY29tcGFyaXNvbiB0byAwCisgIGZ1bmNfdm9pZF90eXBlIHY5KDApOworICBCT09TVF9DSEVDSyh2OSA9PSAwKTsKKyAgQk9PU1RfQ0hFQ0soMCA9PSB2OSk7CisKKyAgLy8gVGVzdCByZXR1cm4gdmFsdWVzCisgIHR5cGVkZWYgZnVuY3Rpb248aW50ICgpPiBmdW5jX2ludF90eXBlOworICBnZW5lcmF0ZV9maXZlX29iaiBnZW5fZml2ZTsKKyAgZ2VuZXJhdGVfdGhyZWVfb2JqIGdlbl90aHJlZTsKKworICBmdW5jX2ludF90eXBlIGkwKGdlbl9maXZlKTsKKworICBCT09TVF9DSEVDSyhpMCgpID09IDUpOworICBpMCA9IGdlbl90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soaTAoKSA9PSAzKTsKKyAgaTAgPSAmZ2VuZXJhdGVfZml2ZTsKKyAgQk9PU1RfQ0hFQ0soaTAoKSA9PSA1KTsKKyAgaTAgPSAmZ2VuZXJhdGVfdGhyZWU7CisgIEJPT1NUX0NIRUNLKGkwKCkgPT0gMyk7CisgIEJPT1NUX0NIRUNLKGkwPyB0cnVlIDogZmFsc2UpOworICBpMC5jbGVhcigpOworICBCT09TVF9DSEVDSyghaTA/IHRydWUgOiBmYWxzZSk7CisKKyAgLy8gVGVzdCByZXR1cm4gdmFsdWVzIHdpdGggY29tcGF0aWJsZSB0eXBlcworICB0eXBlZGVmIGZ1bmN0aW9uPGxvbmcgKCk+IGZ1bmNfbG9uZ190eXBlOworICBmdW5jX2xvbmdfdHlwZSBpMShnZW5fZml2ZSk7CisKKyAgQk9PU1RfQ0hFQ0soaTEoKSA9PSA1KTsKKyAgaTEgPSBnZW5fdGhyZWU7CisgIEJPT1NUX0NIRUNLKGkxKCkgPT0gMyk7CisgIGkxID0gJmdlbmVyYXRlX2ZpdmU7CisgIEJPT1NUX0NIRUNLKGkxKCkgPT0gNSk7CisgIGkxID0gJmdlbmVyYXRlX3RocmVlOworICBCT09TVF9DSEVDSyhpMSgpID09IDMpOworICBCT09TVF9DSEVDSyhpMT8gdHJ1ZSA6IGZhbHNlKTsKKyAgaTEuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0soIWkxPyB0cnVlIDogZmFsc2UpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9vbmVfYXJnKCkKK3sKKyAgc3RkOjpuZWdhdGU8aW50PiBuZWc7CisKKyAgZnVuY3Rpb248aW50IChpbnQpPiBmMShuZWcpOworICBCT09TVF9DSEVDSyhmMSg1KSA9PSAtNSk7CisKKyAgZnVuY3Rpb248c3RyaW5nIChzdHJpbmcpPiBpZCgmaWRlbnRpdHlfc3RyKTsKKyAgQk9PU1RfQ0hFQ0soaWQoInN0ciIpID09ICJzdHIiKTsKKworICBmdW5jdGlvbjxzdHJpbmcgKGNvbnN0IGNoYXIqKT4gaWQyKCZpZGVudGl0eV9zdHIpOworICBCT09TVF9DSEVDSyhpZDIoImZvbyIpID09ICJmb28iKTsKKworICBhZGRfdG9fb2JqIGFkZF90byg1KTsKKyAgZnVuY3Rpb248aW50IChpbnQpPiBmMihhZGRfdG8pOworICBCT09TVF9DSEVDSyhmMigzKSA9PSA4KTsKKworICBjb25zdCBmdW5jdGlvbjxpbnQgKGludCk+IGNmMihhZGRfdG8pOworICBCT09TVF9DSEVDSyhjZjIoMykgPT0gOCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3R3b19hcmdzKCkKK3sKKyAgZnVuY3Rpb248c3RyaW5nIChjb25zdCBzdHJpbmcmLCBjb25zdCBzdHJpbmcmKT4gY2F0KCZzdHJpbmdfY2F0KTsKKyAgQk9PU1RfQ0hFQ0soY2F0KCJzdHIiLCAiaW5nIikgPT0gInN0cmluZyIpOworCisgIGZ1bmN0aW9uPGludCAoc2hvcnQsIHNob3J0KT4gc3VtKCZzdW1faW50cyk7CisgIEJPT1NUX0NIRUNLKHN1bSgyLCAzKSA9PSA1KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfZW1wdGluZXNzKCkKK3sKKyAgZnVuY3Rpb248ZmxvYXQgKCk+IGYxOworICBCT09TVF9DSEVDSyhmMS5lbXB0eSgpKTsKKworICBmdW5jdGlvbjxmbG9hdCAoKT4gZjI7CisgIGYyID0gZjE7CisgIEJPT1NUX0NIRUNLKGYyLmVtcHR5KCkpOworCisgIGZ1bmN0aW9uPGRvdWJsZSAoKT4gZjM7CisgIGYzID0gZjI7CisgIEJPT1NUX0NIRUNLKGYzLmVtcHR5KCkpOworfQorCitzdHJ1Y3QgWCB7CisgIFgoaW50IHYpIDogdmFsdWUodikge30KKworICBpbnQgdHdpY2UoKSBjb25zdCB7IHJldHVybiAyKnZhbHVlOyB9CisgIGludCBwbHVzKGludCB2KSB7IHJldHVybiB2YWx1ZSArIHY7IH0KKworICBpbnQgdmFsdWU7Cit9OworCitzdGF0aWMgdm9pZAordGVzdF9tZW1iZXJfZnVuY3Rpb25zKCkKK3sKKyAgbmRuYm9vc3Q6OmZ1bmN0aW9uPGludCAoWCopPiBmMSgmWDo6dHdpY2UpOworCisgIFggb25lKDEpOworICBYIGZpdmUoNSk7CisKKyAgQk9PU1RfQ0hFQ0soZjEoJm9uZSkgPT0gMik7CisgIEJPT1NUX0NIRUNLKGYxKCZmaXZlKSA9PSAxMCk7CisKKyAgbmRuYm9vc3Q6OmZ1bmN0aW9uPGludCAoWCopPiBmMV8yOworICBmMV8yID0gJlg6OnR3aWNlOworCisgIEJPT1NUX0NIRUNLKGYxXzIoJm9uZSkgPT0gMik7CisgIEJPT1NUX0NIRUNLKGYxXzIoJmZpdmUpID09IDEwKTsKKworICBuZG5ib29zdDo6ZnVuY3Rpb248aW50IChYJiwgaW50KT4gZjIoJlg6OnBsdXMpOworICBCT09TVF9DSEVDSyhmMihvbmUsIDMpID09IDQpOworICBCT09TVF9DSEVDSyhmMihmaXZlLCA0KSA9PSA5KTsKK30KKworc3RydWN0IGFkZF93aXRoX3Rocm93X29uX2NvcHkgeworICBpbnQgb3BlcmF0b3IoKShpbnQgeCwgaW50IHkpIGNvbnN0IHsgcmV0dXJuIHgreTsgfQorCisgIGFkZF93aXRoX3Rocm93X29uX2NvcHkoKSB7fQorCisgIGFkZF93aXRoX3Rocm93X29uX2NvcHkoY29uc3QgYWRkX3dpdGhfdGhyb3dfb25fY29weSYpCisgIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIkJ1dCB0aGlzIENBTidUIHRocm93Iik7CisgIH0KKworICBhZGRfd2l0aF90aHJvd19vbl9jb3B5JiBvcGVyYXRvcj0oY29uc3QgYWRkX3dpdGhfdGhyb3dfb25fY29weSYpCisgIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIkJ1dCB0aGlzIENBTidUIHRocm93Iik7CisgIH0KK307CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlZigpCit7CisgIGFkZF93aXRoX3Rocm93X29uX2NvcHkgYXRjOworICB0cnkgeworICAgIG5kbmJvb3N0OjpmdW5jdGlvbjxpbnQgKGludCwgaW50KT4gZihuZG5ib29zdDo6cmVmKGF0YykpOworICAgIEJPT1NUX0NIRUNLKGYoMSwgMykgPT0gNCk7CisgIH0KKyAgY2F0Y2goc3RkOjpydW50aW1lX2Vycm9yIGUpIHsKKyAgICBCT09TVF9FUlJPUigiTm9udGhyb3dpbmcgY29uc3RydWN0b3IgdGhyZXcgYW4gZXhjZXB0aW9uIik7CisgIH0KK30KKworc3RhdGljIHZvaWQgZHVtbXkoKSB7fQorCitzdGF0aWMgdm9pZCB0ZXN0X2VtcHR5X3JlZigpCit7CisgIG5kbmJvb3N0OjpmdW5jdGlvbjx2b2lkKCk+IGYxOworICBuZG5ib29zdDo6ZnVuY3Rpb248dm9pZCgpPiBmMihuZG5ib29zdDo6cmVmKGYxKSk7CisKKyAgdHJ5IHsKKyAgICBmMigpOworICAgIEJPT1NUX0VSUk9SKCJFeGNlcHRpb24gZGlkbid0IHRocm93IGZvciByZWZlcmVuY2UgdG8gZW1wdHkgZnVuY3Rpb24uIik7CisgIH0KKyAgY2F0Y2goc3RkOjpydW50aW1lX2Vycm9yIGUpIHt9CisKKyAgZjEgPSBkdW1teTsKKworICB0cnkgeworICAgIGYyKCk7CisgIH0KKyAgY2F0Y2goc3RkOjpydW50aW1lX2Vycm9yIGUpIHsKKyAgICBCT09TVF9FUlJPUigiRXJyb3IgY2FsbGluZyByZWZlcmVuY2VkIGZ1bmN0aW9uLiIpOworICB9Cit9CisKKworc3RhdGljIHZvaWQgdGVzdF9leGNlcHRpb24oKQoreworICBuZG5ib29zdDo6ZnVuY3Rpb248aW50IChpbnQsIGludCk+IGY7CisgIHRyeSB7CisgICAgZig1LCA0KTsKKyAgICBCT09TVF9DSEVDSyhmYWxzZSk7CisgIH0KKyAgY2F0Y2gobmRuYm9vc3Q6OmJhZF9mdW5jdGlvbl9jYWxsKSB7CisgICAgLy8gb2theQorICB9Cit9CisKK3R5cGVkZWYgbmRuYm9vc3Q6OmZ1bmN0aW9uPCB2b2lkICogKHZvaWQgKiByZWFkZXIpID4gcmVhZGVyX3R5cGU7Cit0eXBlZGVmIHN0ZDo6cGFpcjxpbnQsIHJlYWRlcl90eXBlPiBtYXBwZWRfdHlwZTsKKworc3RhdGljIHZvaWQgdGVzdF9pbXBsaWNpdCgpCit7CisgIG1hcHBlZF90eXBlIG07CisgIG0gPSBtYXBwZWRfdHlwZSgpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2NhbGxfb2JqKG5kbmJvb3N0OjpmdW5jdGlvbjxpbnQgKGludCwgaW50KT4gZikKK3sKKyAgQk9PU1RfQ0hFQ0soIWYuZW1wdHkoKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfY2FsbF9jcmVmKGNvbnN0IG5kbmJvb3N0OjpmdW5jdGlvbjxpbnQgKGludCwgaW50KT4mIGYpCit7CisgIEJPT1NUX0NIRUNLKCFmLmVtcHR5KCkpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2NhbGwoKQoreworICB0ZXN0X2NhbGxfb2JqKHN0ZDo6cGx1czxpbnQ+KCkpOworICB0ZXN0X2NhbGxfY3JlZihzdGQ6OnBsdXM8aW50PigpKTsKK30KKworc3RydWN0IGJpZ19hZ2dyZWdhdGluZ19zdHJ1Y3R1cmUgeworICBpbnQgZGlzYWJsZV9zbWFsbF9vYmplY3RzX29wdGltaXphdGlvbnNbMzJdOworICAgIAorICBiaWdfYWdncmVnYXRpbmdfc3RydWN0dXJlKCkKKyAgeworICAgICsrIGdsb2JhbF9pbnQ7CisgIH0KKyAgICAKKyAgYmlnX2FnZ3JlZ2F0aW5nX3N0cnVjdHVyZShjb25zdCBiaWdfYWdncmVnYXRpbmdfc3RydWN0dXJlJikKKyAgeworICAgICsrIGdsb2JhbF9pbnQ7CisgIH0KKworICB+YmlnX2FnZ3JlZ2F0aW5nX3N0cnVjdHVyZSgpCisgIHsKKyAgICAtLSBnbG9iYWxfaW50OworICB9CisgICAgCisgIHZvaWQgb3BlcmF0b3IoKSgpIAorICB7CisgICAgKysgZ2xvYmFsX2ludDsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IoKShpbnQpIAorICB7CisgICAgKysgZ2xvYmFsX2ludDsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIEZ1bmN0aW9uVD4KK3N0YXRpYyB2b2lkIHRlc3RfbW92ZV9zZW1hbnRpY3MoKSAKK3sKKyAgdHlwZWRlZiBGdW5jdGlvblQgZjFfdHlwZTsKKworICBiaWdfYWdncmVnYXRpbmdfc3RydWN0dXJlIG9iajsKKyAgCisgIGYxX3R5cGUgZjEgPSBvYmo7CisgIGdsb2JhbF9pbnQgPSAwOworICBmMSgpOworICAKKyAgQk9PU1RfQ0hFQ0soIWYxLmVtcHR5KCkpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDEpOworICAKKyNpZm5kZWYgQk9PU1RfTk9fQ1hYMTFfUlZBTFVFX1JFRkVSRU5DRVMKKyAgLy8gVGVzdGluZyBydmFsdWUgY29uc3RydWN0b3JzCisgIGYxX3R5cGUgZjIoc3RhdGljX2Nhc3Q8ZjFfdHlwZSYmPihmMSkpOworICBCT09TVF9DSEVDSyhmMS5lbXB0eSgpKTsKKyAgQk9PU1RfQ0hFQ0soIWYyLmVtcHR5KCkpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDEpOworICBmMigpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDIpOworICAKKyAgZjFfdHlwZSBmMyhzdGF0aWNfY2FzdDxmMV90eXBlJiY+KGYyKSk7CisgIEJPT1NUX0NIRUNLKGYxLmVtcHR5KCkpOworICBCT09TVF9DSEVDSyhmMi5lbXB0eSgpKTsKKyAgQk9PU1RfQ0hFQ0soIWYzLmVtcHR5KCkpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDIpOworICBmMygpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworICAgIAorICAvLyBUZXN0aW5nIG1vdmUgYXNzaWdubWVudAorICBmMV90eXBlIGY0OworICBCT09TVF9DSEVDSyhmNC5lbXB0eSgpKTsKKyAgZjQgPSBzdGF0aWNfY2FzdDxmMV90eXBlJiY+KGYzKTsKKyAgQk9PU1RfQ0hFQ0soZjEuZW1wdHkoKSk7CisgIEJPT1NUX0NIRUNLKGYyLmVtcHR5KCkpOworICBCT09TVF9DSEVDSyhmMy5lbXB0eSgpKTsKKyAgQk9PU1RfQ0hFQ0soIWY0LmVtcHR5KCkpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworICBmNCgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDQpOworICAKKyAgLy8gVGVzdGluZyBzZWxmIG1vdmUgYXNzaWdubWVudAorICBmNCA9IHN0YXRpY19jYXN0PGYxX3R5cGUmJj4oZjQpOworICBCT09TVF9DSEVDSyghZjQuZW1wdHkoKSk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNCk7CisKKyAgLy8gVGVzdGluZywgdGhhdCBubyBtZW1vcnkgbGVha2VkIHdoZW4gYXNzaWduaW5nIHRvIG5vbmVtcHR5IGZ1bmN0aW9uCisgIGY0ID0gb2JqOworICBCT09TVF9DSEVDSyghZjQuZW1wdHkoKSk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNCk7CisgIGYxX3R5cGUgZjUgPSBvYmo7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisgIGY0ID0gc3RhdGljX2Nhc3Q8ZjFfdHlwZSYmPihmNSk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNCk7CisgIAorI2VuZGlmICAKK30KKworaW50IHRlc3RfbWFpbihpbnQsIGNoYXIqIFtdKQoreworICB0ZXN0X3plcm9fYXJncygpOworICB0ZXN0X29uZV9hcmcoKTsKKyAgdGVzdF90d29fYXJncygpOworICB0ZXN0X2VtcHRpbmVzcygpOworICB0ZXN0X21lbWJlcl9mdW5jdGlvbnMoKTsKKyAgdGVzdF9yZWYoKTsKKyAgdGVzdF9lbXB0eV9yZWYoKTsKKyAgdGVzdF9leGNlcHRpb24oKTsKKyAgdGVzdF9pbXBsaWNpdCgpOworICB0ZXN0X2NhbGwoKTsKKyAgdGVzdF9tb3ZlX3NlbWFudGljczxmdW5jdGlvbjx2b2lkKCk+ID4oKTsKKyAgdGVzdF9tb3ZlX3NlbWFudGljczxuZG5ib29zdDo6ZnVuY3Rpb24wPHZvaWQ+ID4oKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl90ZXN0X2ZhaWwxLmNwcCBiL2xpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl90ZXN0X2ZhaWwxLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWZjODA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3Rlc3RfZmFpbDEuY3BwCkBAIC0wLDAgKzEsMjggQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKworLy8gIENvcHlyaWdodCAoQykgRG91Z2xhcyBHcmVnb3IgMjAwMS0yMDA1LiBVc2UsIG1vZGlmaWNhdGlvbiBhbmQKKy8vICBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbgorLy8gIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZworCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9taW5pbWFsLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgbmRuYm9vc3Q7CisKK2ludAordGVzdF9tYWluKGludCwgY2hhcipbXSkKK3sKKyAgZnVuY3Rpb24wPGludD4gZjE7CisgIGZ1bmN0aW9uMDxpbnQ+IGYyOworCisgIGlmIChmMSA9PSBmMikgeworICB9CisKKyAgQk9PU1RfRVJST1IoIlRoaXMgc2hvdWxkIG5vdCBoYXZlIGNvbXBpbGVkLiIpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3Rlc3RfZmFpbDIuY3BwIGIvbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3Rlc3RfZmFpbDIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNGMwNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fdGVzdF9mYWlsMi5jcHAKQEAgLTAsMCArMSwyNyBAQAorLy8gQm9vc3QuRnVuY3Rpb24gbGlicmFyeQorCisvLyAgQ29weXJpZ2h0IChDKSBEb3VnbGFzIEdyZWdvciAyMDAxLTIwMDUuIFVzZSwgbW9kaWZpY2F0aW9uIGFuZAorLy8gIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uCisvLyAgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L21pbmltYWwuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBuZG5ib29zdDsKKworc3RhdGljIGludCBiYWRfZm4oZmxvYXQgZikgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihmKTsgfQorCitpbnQKK3Rlc3RfbWFpbihpbnQsIGNoYXIqW10pCit7CisgIGZ1bmN0aW9uMDxpbnQ+IGYxOworICBmMSA9IGJhZF9mbjsKKworICBCT09TVF9FUlJPUigiVGhpcyBzaG91bGQgbm90IGhhdmUgY29tcGlsZWQuIik7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJzL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fdHlwZW9mX3Rlc3QuY3BwIGIvbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3R5cGVvZl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQwZDlkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3R5cGVvZl90ZXN0LmNwcApAQCAtMCwwICsxLDE4IEBACisvLyBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5CisKKy8vICBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwOC4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90eXBlb2YuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlb2YvdHlwZW9mLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc19zYW1lLmhwcD4KKyNpbmNsdWRlIDxib29zdC9zdGF0aWNfYXNzZXJ0LmhwcD4KKwordm9pZCBmKG5kbmJvb3N0OjpmdW5jdGlvbjA8dm9pZD4gZiwgbmRuYm9vc3Q6OmZ1bmN0aW9uMDx2b2lkPiBnKQoreworICBCT09TVF9TVEFUSUNfQVNTRVJUKChuZG5ib29zdDo6aXNfc2FtZTxuZG5ib29zdDo6ZnVuY3Rpb24wPHZvaWQ+LCBCT09TVF9UWVBFT0YoZiA9IGcpPjo6dmFsdWUpKTsKK30KZGlmZiAtLWdpdCBhL2xpYnMvZnVuY3Rpb24vdGVzdC9sYW1iZGFfdGVzdC5jcHAgYi9saWJzL2Z1bmN0aW9uL3Rlc3QvbGFtYmRhX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MjgxZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Z1bmN0aW9uL3Rlc3QvbGFtYmRhX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKworLy8gIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDAyLTIwMDMuIFVzZSwgbW9kaWZpY2F0aW9uIGFuZAorLy8gIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uCisvLyAgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxjc3RkbGliPgorCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9taW5pbWFsLmhwcD4KKyNpbmNsdWRlIDxib29zdC9sYW1iZGEvbGFtYmRhLmhwcD4KKyNpbmNsdWRlIDxib29zdC9sYW1iZGEvYmluZC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorCitzdGF0aWMgdW5zaWduZWQKK2Z1bmNfaW1wbChpbnQgYXJnMSwgYm9vbCBhcmcyLCBkb3VibGUgYXJnMykKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgcmV0dXJuIGFicyAoc3RhdGljX2Nhc3Q8aW50PigoYXJnMiA/IGFyZzEgOiAyICogYXJnMSkgKiBhcmczKSk7Cit9CisKK2ludCB0ZXN0X21haW4oaW50LCBjaGFyKltdKQoreworICB1c2luZyBuZG5ib29zdDo6ZnVuY3Rpb247CisgIHVzaW5nIG5hbWVzcGFjZSBuZG5ib29zdDo6bGFtYmRhOworCisgIGZ1bmN0aW9uIDx1bnNpZ25lZChib29sLCBkb3VibGUpPiBmMSA9IGJpbmQoZnVuY19pbXBsLCAxNSwgXzEsIF8yKTsKKyAgZnVuY3Rpb24gPHVuc2lnbmVkKGRvdWJsZSk+ICAgICAgIGYyID0gbmRuYm9vc3Q6OmxhbWJkYTo6YmluZChmMSwgZmFsc2UsIF8xKTsKKyAgZnVuY3Rpb24gPHVuc2lnbmVkKCk+ICAgICAgICAgICAgIGYzID0gbmRuYm9vc3Q6OmxhbWJkYTo6YmluZChmMiwgNC4wKTsKKworICBmMygpOworCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9saWJzL2Z1bmN0aW9uL3Rlc3QvbWVtX2Z1bl9jeHg5OC5jcHAgYi9saWJzL2Z1bmN0aW9uL3Rlc3QvbWVtX2Z1bl9jeHg5OC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1YmFhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvZnVuY3Rpb24vdGVzdC9tZW1fZnVuX2N4eDk4LmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBGdW5jdGlvbiBsaWJyYXJ5CisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIERvdWdsYXMgR3JlZ29yCisKKy8vIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgCisvLyBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCAKKy8vIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkgCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcvCisKKyAgICAKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZGV0YWlsL2xpZ2h0d2VpZ2h0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK3N0cnVjdCBYIHsKKyAgaW50IGZvbyhpbnQpOworICBzdGQ6Om9zdHJlYW0mIGZvbzIoc3RkOjpvc3RyZWFtJikgY29uc3Q7Cit9OworaW50IFg6OmZvbyhpbnQgeCkgeyByZXR1cm4gLXg7IH0KK3N0ZDo6b3N0cmVhbSYgWDo6Zm9vMihzdGQ6Om9zdHJlYW0mIHgpIGNvbnN0IHsgcmV0dXJuIHg7IH0KKworaW50IG1haW4oKQoreworICAgIG5kbmJvb3N0OjpmdW5jdGlvbjxpbnQgKFgqLCBpbnQpPiBmOworICAgIG5kbmJvb3N0OjpmdW5jdGlvbjxzdGQ6Om9zdHJlYW0mIChYKiwgc3RkOjpvc3RyZWFtJik+IGYyOworCisgICAgZiA9ICZYOjpmb287CisgICAgZjIgPSAmWDo6Zm9vMjsKKworICAgIFggeDsKKyAgICBCT09TVF9URVNUKGYoJngsIDUpID09IC01KTsKKyAgICBCT09TVF9URVNUKGYyKCZ4LCBuZG5ib29zdDo6cmVmKHN0ZDo6Y291dCkpID09IHN0ZDo6Y291dCk7CisKKyAgICByZXR1cm4gOjpuZG5ib29zdDo6cmVwb3J0X2Vycm9ycygpOworfQpkaWZmIC0tZ2l0IGEvbGlicy9mdW5jdGlvbi90ZXN0L21lbV9mdW5fcG9ydGFibGUuY3BwIGIvbGlicy9mdW5jdGlvbi90ZXN0L21lbV9mdW5fcG9ydGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOGY3NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Z1bmN0aW9uL3Rlc3QvbWVtX2Z1bl9wb3J0YWJsZS5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gRnVuY3Rpb24gbGlicmFyeQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBEb3VnbGFzIEdyZWdvcgorCisvLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIAorLy8gTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgCisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpIAorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnLworCisgICAgCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2RldGFpbC9saWdodHdlaWdodF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCitzdHJ1Y3QgWCB7CisgIGludCBmb28oaW50KTsKKyAgc3RkOjpvc3RyZWFtJiBmb28yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0OworfTsKK2ludCBYOjpmb28oaW50IHgpIHsgcmV0dXJuIC14OyB9CitzdGQ6Om9zdHJlYW0mIFg6OmZvbzIoc3RkOjpvc3RyZWFtJiB4KSBjb25zdCB7IHJldHVybiB4OyB9CisKK2ludCBtYWluKCkKK3sKKyAgICBuZG5ib29zdDo6ZnVuY3Rpb24yPGludCwgWCosIGludD4gZjsKKyAgICBuZG5ib29zdDo6ZnVuY3Rpb24yPHN0ZDo6b3N0cmVhbSYsIFgqLCBzdGQ6Om9zdHJlYW0mPiBmMjsKKworICAgIGYgPSAmWDo6Zm9vOworICAgIGYyID0gJlg6OmZvbzI7CisKKyAgICBYIHg7CisgICAgQk9PU1RfVEVTVChmKCZ4LCA1KSA9PSAtNSk7CisgICAgQk9PU1RfVEVTVChmMigmeCwgbmRuYm9vc3Q6OnJlZihzdGQ6OmNvdXQpKSA9PSBzdGQ6OmNvdXQpOworCisgICAgcmV0dXJuIDo6bmRuYm9vc3Q6OnJlcG9ydF9lcnJvcnMoKTsKK30KZGlmZiAtLWdpdCBhL2xpYnMvZnVuY3Rpb24vdGVzdC9ub3Rocm93X3N3YXAuY3BwIGIvbGlicy9mdW5jdGlvbi90ZXN0L25vdGhyb3dfc3dhcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4ZDA1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvZnVuY3Rpb24vdGVzdC9ub3Rocm93X3N3YXAuY3BwCkBAIC0wLDAgKzEsNjAgQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKworLy8gIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDA4LiBVc2UsIG1vZGlmaWNhdGlvbiBhbmQKKy8vICBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbgorLy8gIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZworCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9taW5pbWFsLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisKK3N0cnVjdCB0cmllZF90b19jb3B5IHsgfTsKKworc3RydWN0IE1heWJlVGhyb3dPbkNvcHkgeworICBNYXliZVRocm93T25Db3B5KGludCB2YWx1ZSA9IDApIDogdmFsdWUodmFsdWUpIHsgfQorCisgIE1heWJlVGhyb3dPbkNvcHkoY29uc3QgTWF5YmVUaHJvd09uQ29weSYgb3RoZXIpIDogdmFsdWUob3RoZXIudmFsdWUpIHsKKyAgICBpZiAodGhyb3dPbkNvcHkpCisgICAgICB0aHJvdyB0cmllZF90b19jb3B5KCk7CisgIH0KKworICBNYXliZVRocm93T25Db3B5JiBvcGVyYXRvcj0oY29uc3QgTWF5YmVUaHJvd09uQ29weSYgb3RoZXIpIHsKKyAgICBpZiAodGhyb3dPbkNvcHkpCisgICAgICB0aHJvdyB0cmllZF90b19jb3B5KCk7CisgICAgdmFsdWUgPSBvdGhlci52YWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbnQgb3BlcmF0b3IoKSgpIHsgcmV0dXJuIHZhbHVlOyB9CisKKyAgaW50IHZhbHVlOworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoaXMgZnVuY3Rpb24gb2JqZWN0IGRvZXNuJ3QgdHJpZ2dlciB0aGUKKyAgLy8gc21hbGwtb2JqZWN0IG9wdGltaXphdGlvbiBpbiBGdW5jdGlvbi4KKyAgZmxvYXQgcGFkZGluZ1sxMDBdOworCisgIHN0YXRpYyBib29sIHRocm93T25Db3B5OworfTsKKworYm9vbCBNYXliZVRocm93T25Db3B5Ojp0aHJvd09uQ29weSA9IGZhbHNlOworCitpbnQgdGVzdF9tYWluKGludCwgY2hhciogW10pCit7CisgIG5kbmJvb3N0OjpmdW5jdGlvbjA8aW50PiBmOworICBuZG5ib29zdDo6ZnVuY3Rpb24wPGludD4gZzsKKworICBNYXliZVRocm93T25Db3B5Ojp0aHJvd09uQ29weSA9IGZhbHNlOworICBmID0gTWF5YmVUaHJvd09uQ29weSgxKTsKKyAgZyA9IE1heWJlVGhyb3dPbkNvcHkoMik7CisgIEJPT1NUX0NIRUNLKGYoKSA9PSAxKTsKKyAgQk9PU1RfQ0hFQ0soZygpID09IDIpOworCisgIE1heWJlVGhyb3dPbkNvcHk6OnRocm93T25Db3B5ID0gdHJ1ZTsKKyAgZi5zd2FwKGcpOworICBCT09TVF9DSEVDSyhmKCkgPT0gMik7CisgIEJPT1NUX0NIRUNLKGcoKSA9PSAxKTsKKyAgCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9mdW5jdGlvbi90ZXN0L3JlZ3Jlc3Npb24uY2ZnIGIvbGlicy9mdW5jdGlvbi90ZXN0L3JlZ3Jlc3Npb24uY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNDQyNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Z1bmN0aW9uL3Rlc3QvcmVncmVzc2lvbi5jZmcKQEAgLTAsMCArMSwxNCBAQAorLy8gQm9vc3QuRnVuY3Rpb24gcmVncmVzc2lvbiB0ZXN0IGNvbmZpZ3VyYXRpb24gZmlsZQorCisvLyBGcm9tIHRoZSBib29zdC9zdGF0dXMgZGlyZWN0b3J5LCBydW4KKy8vIC4vcmVncmVzc2lvbiAtLXRlc3RzIC4uL2xpYnMvZnVuY3Rpb24vdGVzdC9yZWdyZXNzaW9uLmNmZyAtbyBmdW5jdGlvbi5odG1sCisKKworcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9hbGxvY2F0b3JfdGVzdC5jcHAKK3J1biBsaWJzL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fbl90ZXN0LmNwcAorcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl90ZXN0LmNwcAorY29tcGlsZS1mYWlsIGxpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl90ZXN0X2ZhaWwxLmNwcAorY29tcGlsZS1mYWlsIGxpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl90ZXN0X2ZhaWwyLmNwcAorcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9taXhpbl90ZXN0LmNwcAorcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9wb2xpY3lfdGVzdC5jcHAKK3J1biBsaWJzL2Z1bmN0aW9uL3Rlc3Qvc3RhdGVsZXNzX3Rlc3QuY3BwCmRpZmYgLS1naXQgYS9saWJzL2Z1bmN0aW9uL3Rlc3Qvc3RhdGVsZXNzX3Rlc3QuY3BwIGIvbGlicy9mdW5jdGlvbi90ZXN0L3N0YXRlbGVzc190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzY3YzdkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9mdW5jdGlvbi90ZXN0L3N0YXRlbGVzc190ZXN0LmNwcApAQCAtMCwwICsxLDM4IEBACisvLyBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5CisKKy8vICBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwMS0yMDAzLiBVc2UsIG1vZGlmaWNhdGlvbiBhbmQKKy8vICBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbgorLy8gIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZworCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9taW5pbWFsLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCitzdHJ1Y3Qgc3RhdGVsZXNzX2ludGVnZXJfYWRkIHsKKyAgaW50IG9wZXJhdG9yKCkoaW50IHgsIGludCB5KSBjb25zdCB7IHJldHVybiB4K3k7IH0KKworICB2b2lkKiBvcGVyYXRvciBuZXcoc3RkOjpzaXplX3QpCisgIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNhbm5vdCBhbGxvY2F0ZSBhIHN0YXRlbGVzc19pbnRlZ2VyX2FkZCIpOworICB9CisKKyAgdm9pZCogb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90LCB2b2lkKiBwKQorICB7CisgICAgcmV0dXJuIHA7CisgIH0KKworICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKikgdGhyb3coKQorICB7CisgIH0KK307CisKK2ludCB0ZXN0X21haW4oaW50LCBjaGFyKltdKQoreworICBuZG5ib29zdDo6ZnVuY3Rpb24yPGludCwgaW50LCBpbnQ+IGY7CisgIGYgPSBzdGF0ZWxlc3NfaW50ZWdlcl9hZGQoKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvZnVuY3Rpb24vdGVzdC9zdGRfYmluZF9jeHg5OC5jcHAgYi9saWJzL2Z1bmN0aW9uL3Rlc3Qvc3RkX2JpbmRfY3h4OTguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYTNjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Z1bmN0aW9uL3Rlc3Qvc3RkX2JpbmRfY3h4OTguY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIEZ1bmN0aW9uIGxpYnJhcnkKKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgRG91Z2xhcyBHcmVnb3IKKworLy8gVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSAKKy8vIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KSAKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy8KKworICAgIAorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCitzdHJ1Y3QgWCB7CisgIGludCBmb28oaW50KTsKK307CitpbnQgWDo6Zm9vKGludCB4KSB7IHJldHVybiAteDsgfQorCitpbnQgbWFpbigpCit7CisgICAgICBuZG5ib29zdDo6ZnVuY3Rpb248aW50IChpbnQpPiBmOworICBYIHg7CisgIGYgPSBzdGQ6OmJpbmQxc3QoCisgICAgICAgIHN0ZDo6bWVtX2Z1bigmWDo6Zm9vKSwgJngpOworICBmKDUpOyAvLyBDYWxsIHguZm9vKDUpCisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvZnVuY3Rpb24vdGVzdC9zdGRfYmluZF9wb3J0YWJsZS5jcHAgYi9saWJzL2Z1bmN0aW9uL3Rlc3Qvc3RkX2JpbmRfcG9ydGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhY2E3NDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Z1bmN0aW9uL3Rlc3Qvc3RkX2JpbmRfcG9ydGFibGUuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIEZ1bmN0aW9uIGxpYnJhcnkKKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgRG91Z2xhcyBHcmVnb3IKKworLy8gVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSAKKy8vIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KSAKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy8KKworICAgIAorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCitzdHJ1Y3QgWCB7CisgIGludCBmb28oaW50KTsKK307CitpbnQgWDo6Zm9vKGludCB4KSB7IHJldHVybiAteDsgfQorCitpbnQgbWFpbigpCit7CisgICAgICBuZG5ib29zdDo6ZnVuY3Rpb24xPGludCwgaW50PiBmOworICBYIHg7CisgIGYgPSBzdGQ6OmJpbmQxc3QoCisgICAgICAgIHN0ZDo6bWVtX2Z1bigmWDo6Zm9vKSwgJngpOworICBmKDUpOyAvLyBDYWxsIHguZm9vKDUpCisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvZnVuY3Rpb24vdGVzdC9zdW1fYXZnX2N4eDk4LmNwcCBiL2xpYnMvZnVuY3Rpb24vdGVzdC9zdW1fYXZnX2N4eDk4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDlkNGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9mdW5jdGlvbi90ZXN0L3N1bV9hdmdfY3h4OTguY3BwCkBAIC0wLDAgKzEsMjggQEAKKy8vIEZ1bmN0aW9uIGxpYnJhcnkKKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgRG91Z2xhcyBHcmVnb3IKKworLy8gVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSAKKy8vIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KSAKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy8KKworICAgIAorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordm9pZCBkb19zdW1fYXZnKGludCB2YWx1ZXNbXSwgaW50IG4sIGludCYgc3VtLCBmbG9hdCYgYXZnKQoreworICBzdW0gPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICBzdW0gKz0gdmFsdWVzW2ldOworICBhdmcgPSAoZmxvYXQpc3VtIC8gbjsKK30KK2ludCBtYWluKCkKK3sKKyAgICBuZG5ib29zdDo6ZnVuY3Rpb248dm9pZCAoaW50IHZhbHVlc1tdLCBpbnQgbiwgaW50JiBzdW0sIGZsb2F0JiBhdmcpPiBzdW1fYXZnOworICAgIHN1bV9hdmcgPSAmZG9fc3VtX2F2ZzsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9mdW5jdGlvbi90ZXN0L3N1bV9hdmdfcG9ydGFibGUuY3BwIGIvbGlicy9mdW5jdGlvbi90ZXN0L3N1bV9hdmdfcG9ydGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZGU4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Z1bmN0aW9uL3Rlc3Qvc3VtX2F2Z19wb3J0YWJsZS5jcHAKQEAgLTAsMCArMSwyOCBAQAorLy8gRnVuY3Rpb24gbGlicmFyeQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBEb3VnbGFzIEdyZWdvcgorCisvLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIAorLy8gTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgCisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpIAorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnLworCisgICAgCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit2b2lkIGRvX3N1bV9hdmcoaW50IHZhbHVlc1tdLCBpbnQgbiwgaW50JiBzdW0sIGZsb2F0JiBhdmcpCit7CisgIHN1bSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHN1bSArPSB2YWx1ZXNbaV07CisgIGF2ZyA9IChmbG9hdClzdW0gLyBuOworfQoraW50IG1haW4oKQoreworICAgIG5kbmJvb3N0OjpmdW5jdGlvbjQ8dm9pZCwgaW50KiwgaW50LCBpbnQmLCBmbG9hdCY+IHN1bV9hdmc7CisgICAgc3VtX2F2ZyA9ICZkb19zdW1fYXZnOworCisgICAgcmV0dXJuIDA7Cit9Cg==