ZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3N0ZHR5cGVzLnJzdCBiL0RvYy9saWJyYXJ5L3N0ZHR5cGVzLnJzdAppbmRleCAwMGQ0MjBiLi5iZTY4NGVkIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zdGR0eXBlcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3RkdHlwZXMucnN0CkBAIC00NDcsNiArNDQ3LDQxIEBACiAgICBBIHJpZ2h0IHNoaWZ0IGJ5ICpuKiBiaXRzIGlzIGVxdWl2YWxlbnQgdG8gZGl2aXNpb24gYnkgYGBwb3coMiwgbilgYC4KIAogCitBZGRpdGlvbmFsIE1ldGhvZHMgb24gSW50ZWdlciBUeXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4gbWV0aG9kOjogaW50LmJpdF9sZW5ndGgoKQorLi4gbWV0aG9kOjogbG9uZy5iaXRfbGVuZ3RoKCkKKworICAgIEZvciBhbnkgaW50ZWdlciBgYHhgYCwgYGB4LmJpdF9sZW5ndGgoKWBgIHJldHVybnMgdGhlIG51bWJlciBvZgorICAgIGJpdHMgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCBgYHhgYCBpbiBiaW5hcnksIGV4Y2x1ZGluZyB0aGUgc2lnbgorICAgIGFuZCBhbnkgbGVhZGluZyB6ZXJvczo6CisKKyAgICAgICAgPj4+IG4gPSAzNworICAgICAgICA+Pj4gYmluKG4pCisgICAgICAgICcwYjEwMDEwMScKKyAgICAgICAgPj4+IG4uYml0X2xlbmd0aCgpCisgICAgICAgIDYKKyAgICAgICAgPj4+IG4gPSAtMGIwMDAxMTAxMAorICAgICAgICA+Pj4gbi5iaXRfbGVuZ3RoKCkKKyAgICAgICAgNQorCisgICAgTW9yZSBwcmVjaXNlbHksIGlmIGBgeGBgIGlzIG5vbnplcm8gdGhlbiBgYHguYml0X2xlbmd0aCgpYGAgaXMgdGhlCisgICAgdW5pcXVlIHBvc2l0aXZlIGludGVnZXIgYGBrYGAgc3VjaCB0aGF0IGBgMioqKGstMSkgPD0gYWJzKHgpIDwKKyAgICAyKiprYGAuICBFcXVpdmFsZW50bHksIGBgeC5iaXRfbGVuZ3RoKClgYCBpcyBlcXVhbCB0byBgYDEgKworICAgIGZsb29yKGxvZyh4LCAyKSlgYCBbI11fIC4gSWYgYGB4YGAgaXMgemVybyB0aGVuIGBgeC5iaXRfbGVuZ3RoKClgYAorICAgIGdpdmVzIGBgMGBgLgorCisgICAgRXF1aXZhbGVudCB0bzo6CisKKyAgICAgICAgZGVmIGJpdF9sZW5ndGgoc2VsZik6CisgICAgICAgICAgICAnTnVtYmVyIG9mIGJpdHMgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCBzZWxmIGluIGJpbmFyeS4nCisgICAgICAgICAgICByZXR1cm4gbGVuKGJpbihzZWxmKS5sc3RyaXAoJy0wYicpKQorCisKKyAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAyLjcKKworCiBBZGRpdGlvbmFsIE1ldGhvZHMgb24gRmxvYXQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yNjQ4LDYgKzI2ODMsMTEgQEAKIC4uIFsjXSBBcyBhIGNvbnNlcXVlbmNlLCB0aGUgbGlzdCBgYFsxLCAyXWBgIGlzIGNvbnNpZGVyZWQgZXF1YWwgdG8gYGBbMS4wLCAyLjBdYGAsIGFuZAogICAgc2ltaWxhcmx5IGZvciB0dXBsZXMuCiAKKy4uIFsjXSBCZXdhcmUgb2YgdGhpcyBmb3JtdWxhISAgSXQncyBtYXRoZW1hdGljYWxseSB2YWxpZCwgYnV0IGFzIGEKKyAgIFB5dGhvbiBleHByZXNzaW9uIGl0IHdpbGwgbm90IGdpdmUgY29ycmVjdCByZXN1bHRzIGZvciBhbGwgYGB4YGAsCisgICBhcyBhIGNvbnNlcXVlbmNlIG9mIHRoZSBsaW1pdGVkIHByZWNpc2lvbiBvZiBmbG9hdGluZy1wb2ludAorICAgYXJpdGhtZXRpYy4KKwogLi4gWyNdIFRoZXkgbXVzdCBoYXZlIHNpbmNlIHRoZSBwYXJzZXIgY2FuJ3QgdGVsbCB0aGUgdHlwZSBvZiB0aGUgb3BlcmFuZHMuCiAKIC4uIFsjXSBUbyBmb3JtYXQgb25seSBhIHR1cGxlIHlvdSBzaG91bGQgdGhlcmVmb3JlIHByb3ZpZGUgYSBzaW5nbGV0b24gdHVwbGUgd2hvc2Ugb25seQpkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3LzIuNy5yc3QgYi9Eb2Mvd2hhdHNuZXcvMi43LnJzdAppbmRleCBhOWViMGJhLi42MTA4NGM4IDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvMi43LnJzdAorKysgYi9Eb2Mvd2hhdHNuZXcvMi43LnJzdApAQCAtNjYsNyArNjYsMjMgQEAKIAogU29tZSBzbWFsbGVyIGNoYW5nZXMgbWFkZSB0byB0aGUgY29yZSBQeXRob24gbGFuZ3VhZ2UgYXJlOgogCi0qIExpc3Qgb2YgY2hhbmdlcyB0byBiZSB3cml0dGVuIGhlcmUuCisqIFRoZSA6ZnVuYzpgaW50YCBhbmQgOmZ1bmM6YGxvbmdgIHR5cGVzIGdhaW5lZCBhIGBgYml0X2xlbmd0aGBgCisgIG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIG5lY2Vzc2FyeSB0byByZXByZXNlbnQKKyAgaXRzIGFyZ3VtZW50IGluIGJpbmFyeTo6CisKKyAgICAgID4+PiBuID0gMzcKKyAgICAgID4+PiBiaW4oMzcpCisgICAgICAnMGIxMDAxMDEnCisgICAgICA+Pj4gbi5iaXRfbGVuZ3RoKCkKKyAgICAgIDYKKyAgICAgID4+PiBuID0gMioqMTIzLTEKKyAgICAgID4+PiBuLmJpdF9sZW5ndGgoKQorICAgICAgMTIzCisgICAgICA+Pj4gKG4rMSkuYml0X2xlbmd0aCgpCisgICAgICAxMjQKKworICAoQ29udHJpYnV0ZWQgYnkgRnJlZHJpayBKb2hhbnNzb24gYW5kIFZpY3RvciBTdGlubmVyOyA6aXNzdWU6YDM0MzlgLikKKwogCiAuLiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW50LnB5IGIvTGliL3Rlc3QvdGVzdF9pbnQucHkKaW5kZXggYTJkYzg1Zi4uY2UxOGFkMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbnQucHkKQEAgLTIsNiArMiw3IEBACiAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBoYXZlX3VuaWNvZGUKK2ltcG9ydCBtYXRoCiAKIEwgPSBbCiAgICAgICAgICgnMCcsIDApLApAQCAtMjQwLDYgKzI0MSw0MCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMmJyNDVxYycsIDM1KSwgNDI5NDk2NzI5N0wpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxejE0MXo1JywgMzYpLCA0Mjk0OTY3Mjk3TCkKIAorICAgIGRlZiB0ZXN0X2JpdF9sZW5ndGgoc2VsZik6CisgICAgICAgIHRpbnkgPSAxZS0xMAorICAgICAgICBmb3IgeCBpbiB4cmFuZ2UoLTY1MDAwLCA2NTAwMCk6CisgICAgICAgICAgICBrID0geC5iaXRfbGVuZ3RoKCkKKyAgICAgICAgICAgICMgQ2hlY2sgZXF1aXZhbGVuY2Ugd2l0aCBQeXRob24gdmVyc2lvbgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCBsZW4oYmluKHgpLmxzdHJpcCgnLTBiJykpKQorICAgICAgICAgICAgIyBCZWhhdmlvdXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkb2NzCisgICAgICAgICAgICBpZiB4ICE9IDA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDIqKihrLTEpIDw9IGFicyh4KSA8IDIqKmspCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgMCkKKyAgICAgICAgICAgICMgQWx0ZXJuYXRpdmUgZGVmaW5pdGlvbjogeC5iaXRfbGVuZ3RoKCkgPT0gMSArIGZsb29yKGxvZ18yKHgpKQorICAgICAgICAgICAgaWYgeCAhPSAwOgorICAgICAgICAgICAgICAgICMgV2hlbiB4IGlzIGFuIGV4YWN0IHBvd2VyIG9mIDIsIG51bWVyaWMgZXJyb3JzIGNhbgorICAgICAgICAgICAgICAgICMgY2F1c2UgZmxvb3IobG9nKHgpL2xvZygyKSkgdG8gYmUgb25lIHRvbyBzbWFsbDsgZm9yCisgICAgICAgICAgICAgICAgIyBzbWFsbCB4IHRoaXMgY2FuIGJlIGZpeGVkIGJ5IGFkZGluZyBhIHNtYWxsIHF1YW50aXR5CisgICAgICAgICAgICAgICAgIyB0byB0aGUgcXVvdGllbnQgYmVmb3JlIHRha2luZyB0aGUgZmxvb3IuCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCAxICsgbWF0aC5mbG9vcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGgubG9nKGFicyh4KSkvbWF0aC5sb2coMikgKyB0aW55KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgwKS5iaXRfbGVuZ3RoKCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEpLmJpdF9sZW5ndGgoKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLTEpLmJpdF9sZW5ndGgoKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMikuYml0X2xlbmd0aCgpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgtMikuYml0X2xlbmd0aCgpLCAyKQorICAgICAgICBmb3IgaSBpbiBbMiwgMywgMTUsIDE2LCAxNywgMzEsIDMyLCAzMywgNjMsIDY0XToKKyAgICAgICAgICAgIGEgPSAyKippCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhLTEpLmJpdF9sZW5ndGgoKSwgaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEtYSkuYml0X2xlbmd0aCgpLCBpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSkuYml0X2xlbmd0aCgpLCBpKzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgtYSkuYml0X2xlbmd0aCgpLCBpKzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhKzEpLmJpdF9sZW5ndGgoKSwgaSsxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLWEtMSkuYml0X2xlbmd0aCgpLCBpKzEpCisKICAgICBkZWYgdGVzdF9pbnRjb252ZXJzaW9uKHNlbGYpOgogICAgICAgICAjIFRlc3QgX19pbnRfXygpCiAgICAgICAgIGNsYXNzIENsYXNzaWNNaXNzaW5nTWV0aG9kczoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbG9uZy5weSBiL0xpYi90ZXN0L3Rlc3RfbG9uZy5weQppbmRleCA1YWRkZDJlLi5lNjQ4YzBmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xvbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9sb25nLnB5CkBAIC0zLDYgKzMsNyBAQAogaW1wb3J0IHN5cwogCiBpbXBvcnQgcmFuZG9tCitpbXBvcnQgbWF0aAogCiAjIFVzZWQgZm9yIGxhenkgZm9ybWF0dGluZyBvZiBmYWlsdXJlIG1lc3NhZ2VzCiBjbGFzcyBGcm0ob2JqZWN0KToKQEAgLTc1Miw2ICs3NTMsNDIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgbG9uZywgZmxvYXQoJy1pbmYnKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbG9uZywgZmxvYXQoJ25hbicpKQogCisgICAgZGVmIHRlc3RfYml0X2xlbmd0aChzZWxmKToKKyAgICAgICAgdGlueSA9IDFlLTEwCisgICAgICAgIGZvciB4IGluIHhyYW5nZSgtNjUwMDAsIDY1MDAwKToKKyAgICAgICAgICAgIHggPSBsb25nKHgpCisgICAgICAgICAgICBrID0geC5iaXRfbGVuZ3RoKCkKKyAgICAgICAgICAgICMgQ2hlY2sgZXF1aXZhbGVuY2Ugd2l0aCBQeXRob24gdmVyc2lvbgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCBsZW4oYmluKHgpLmxzdHJpcCgnLTBiJykpKQorICAgICAgICAgICAgIyBCZWhhdmlvdXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkb2NzCisgICAgICAgICAgICBpZiB4ICE9IDA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDIqKihrLTEpIDw9IGFicyh4KSA8IDIqKmspCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgMCkKKyAgICAgICAgICAgICMgQWx0ZXJuYXRpdmUgZGVmaW5pdGlvbjogeC5iaXRfbGVuZ3RoKCkgPT0gMSArIGZsb29yKGxvZ18yKHgpKQorICAgICAgICAgICAgaWYgeCAhPSAwOgorICAgICAgICAgICAgICAgICMgV2hlbiB4IGlzIGFuIGV4YWN0IHBvd2VyIG9mIDIsIG51bWVyaWMgZXJyb3JzIGNhbgorICAgICAgICAgICAgICAgICMgY2F1c2UgZmxvb3IobG9nKHgpL2xvZygyKSkgdG8gYmUgb25lIHRvbyBzbWFsbDsgZm9yCisgICAgICAgICAgICAgICAgIyBzbWFsbCB4IHRoaXMgY2FuIGJlIGZpeGVkIGJ5IGFkZGluZyBhIHNtYWxsIHF1YW50aXR5CisgICAgICAgICAgICAgICAgIyB0byB0aGUgcXVvdGllbnQgYmVmb3JlIHRha2luZyB0aGUgZmxvb3IuCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCAxICsgbWF0aC5mbG9vcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGgubG9nKGFicyh4KSkvbWF0aC5sb2coMikgKyB0aW55KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgwTCkuYml0X2xlbmd0aCgpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgxTCkuYml0X2xlbmd0aCgpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgtMUwpLmJpdF9sZW5ndGgoKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMkwpLmJpdF9sZW5ndGgoKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLTJMKS5iaXRfbGVuZ3RoKCksIDIpCisgICAgICAgIGZvciBpIGluIFsyLCAzLCAxNSwgMTYsIDE3LCAzMSwgMzIsIDMzLCA2MywgNjQsIDIzNF06CisgICAgICAgICAgICBhID0gMkwqKmkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEtMSkuYml0X2xlbmd0aCgpLCBpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMS1hKS5iaXRfbGVuZ3RoKCksIGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhKS5iaXRfbGVuZ3RoKCksIGkrMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKC1hKS5iaXRfbGVuZ3RoKCksIGkrMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGErMSkuYml0X2xlbmd0aCgpLCBpKzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgtYS0xKS5iaXRfbGVuZ3RoKCksIGkrMSkKKworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChMb25nVGVzdCkKIApkaWZmIC0tZ2l0IGEvTWlzYy9BQ0tTIGIvTWlzYy9BQ0tTCmluZGV4IDcyYjE4YzkuLjI2ZTVmMTIgMTAwNjQ0Ci0tLSBhL01pc2MvQUNLUworKysgYi9NaXNjL0FDS1MKQEAgLTM0Myw2ICszNDMsNyBAQAogRmxlbW1pbmcgS2rmciBKZW5zZW4KIEppYmEKIE9yamFuIEpvaGFuc2VuCitGcmVkcmlrIEpvaGFuc3NvbgogR3JlZ29yeSBLLiBKb2huc29uCiBTaW1vbiBKb2huc3RvbgogRXZhbiBKb25lcwpkaWZmIC0tZ2l0IGEvTWlzYy9ORVdTIGIvTWlzYy9ORVdTCmluZGV4IDllNDk5YWUuLjA5YzNjZWIgMTAwNjQ0Ci0tLSBhL01pc2MvTkVXUworKysgYi9NaXNjL05FV1MKQEAgLTEyLDYgKzEyLDggQEAKIENvcmUgYW5kIEJ1aWx0aW5zCiAtLS0tLS0tLS0tLS0tLS0tLQogCistIElzc3VlICMzNDM5OiBBZGQgYSBiaXRfbGVuZ3RoIG1ldGhvZCB0byBpbnQgYW5kIGxvbmcuCisKIC0gSXNzdWUgIzIxODM6IFNpbXBsaWZ5IGFuZCBvcHRpbWl6ZSBieXRlY29kZSBmb3IgbGlzdCBjb21wcmVoZW5zaW9ucy4KICAgT3JpZ2luYWwgcGF0Y2ggYnkgTmVhbCBOb3J3aXR6LgogCmRpZmYgLS1naXQgYS9PYmplY3RzL2ludG9iamVjdC5jIGIvT2JqZWN0cy9pbnRvYmplY3QuYwppbmRleCBlNzNjOTIxLi45YmFlZThlIDEwMDY0NAotLS0gYS9PYmplY3RzL2ludG9iamVjdC5jCisrKyBiL09iamVjdHMvaW50b2JqZWN0LmMKQEAgLTExMzgsNiArMTEzOCw0MCBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBCaXRMZW5ndGhUYWJsZVszMl0gPSB7CisJMCwgMSwgMiwgMiwgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKwk1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1Cit9OworCitzdGF0aWMgUHlPYmplY3QgKgoraW50X2JpdF9sZW5ndGgoUHlJbnRPYmplY3QgKnYpCit7CisJdW5zaWduZWQgbG9uZyBuOworCWxvbmcgciA9IDA7CisKKwlpZiAodi0+b2JfaXZhbCA8IDApCisJCS8qIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2hlbiB2LT5vYl9pdmFsID09IC1MT05HX01BWC0xICovCisJCW4gPSAwVS0odW5zaWduZWQgbG9uZyl2LT5vYl9pdmFsOworCWVsc2UKKwkJbiA9ICh1bnNpZ25lZCBsb25nKXYtPm9iX2l2YWw7CisKKwl3aGlsZSAobiA+PSAzMikgeworCQlyICs9IDY7CisJCW4gPj49IDY7CisJfQorCXIgKz0gKGxvbmcpKEJpdExlbmd0aFRhYmxlW25dKTsKKwlyZXR1cm4gUHlJbnRfRnJvbUxvbmcocik7Cit9CisKK1B5RG9jX1NUUlZBUihpbnRfYml0X2xlbmd0aF9kb2MsCisiaW50LmJpdF9sZW5ndGgoKSAtPiBpbnRcblwKK1xuXAorTnVtYmVyIG9mIGJpdHMgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCBzZWxmIGluIGJpbmFyeS5cblwKKz4+PiBiaW4oMzcpXG5cCisnMGIxMDAxMDEnXG5cCis+Pj4gKDM3KS5iaXRfbGVuZ3RoKClcblwKKzYiKTsKKwogI2lmIDAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfaXNfZmluaXRlKFB5T2JqZWN0ICp2KQpAQCAtMTE0OSw2ICsxMTgzLDggQEAKIHN0YXRpYyBQeU1ldGhvZERlZiBpbnRfbWV0aG9kc1tdID0gewogCXsiY29uanVnYXRlIiwJKFB5Q0Z1bmN0aW9uKWludF9pbnQsCU1FVEhfTk9BUkdTLAogCSAiUmV0dXJucyBzZWxmLCB0aGUgY29tcGxleCBjb25qdWdhdGUgb2YgYW55IGludC4ifSwKKwl7ImJpdF9sZW5ndGgiLCAoUHlDRnVuY3Rpb24paW50X2JpdF9sZW5ndGgsIE1FVEhfTk9BUkdTLAorCSBpbnRfYml0X2xlbmd0aF9kb2N9LAogI2lmIDAKIAl7ImlzX2Zpbml0ZSIsCShQeUNGdW5jdGlvbilpbnRfaXNfZmluaXRlLAlNRVRIX05PQVJHUywKIAkgIlJldHVybnMgYWx3YXlzIFRydWUuIn0sCmRpZmYgLS1naXQgYS9PYmplY3RzL2xvbmdvYmplY3QuYyBiL09iamVjdHMvbG9uZ29iamVjdC5jCmluZGV4IDY1MTMwNjkuLmFkNTU1N2IgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbG9uZ29iamVjdC5jCisrKyBiL09iamVjdHMvbG9uZ29iamVjdC5jCkBAIC0zNDUxLDYgKzM0NTEsNzUgQEAKIAlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKIH0KIAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgQml0TGVuZ3RoVGFibGVbMzJdID0geworCTAsIDEsIDIsIDIsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisJNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNQorfTsKKworc3RhdGljIFB5T2JqZWN0ICoKK2xvbmdfYml0X2xlbmd0aChQeUxvbmdPYmplY3QgKnYpCit7CisJUHlMb25nT2JqZWN0ICpyZXN1bHQsICp4LCAqeTsKKwlQeV9zc2l6ZV90IG5kaWdpdHMsIG1zZF9iaXRzID0gMDsKKwlkaWdpdCBtc2Q7CisKKwlhc3NlcnQodiAhPSBOVUxMKTsKKwlhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKKworCW5kaWdpdHMgPSBBQlMoUHlfU0laRSh2KSk7CisJaWYgKG5kaWdpdHMgPT0gMCkKKwkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKDApOworCisJbXNkID0gdi0+b2JfZGlnaXRbbmRpZ2l0cy0xXTsKKwl3aGlsZSAobXNkID49IDMyKSB7CisJCW1zZF9iaXRzICs9IDY7CisJCW1zZCA+Pj0gNjsKKwl9CisJbXNkX2JpdHMgKz0gKGxvbmcpKEJpdExlbmd0aFRhYmxlW21zZF0pOworCisJaWYgKG5kaWdpdHMgPD0gUFlfU1NJWkVfVF9NQVgvUHlMb25nX1NISUZUKQorCQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoKG5kaWdpdHMtMSkqUHlMb25nX1NISUZUICsgbXNkX2JpdHMpOworCisJLyogZXhwcmVzc2lvbiBhYm92ZSBtYXkgb3ZlcmZsb3c7IHVzZSBQeXRob24gaW50ZWdlcnMgaW5zdGVhZCAqLworCXJlc3VsdCA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbVNzaXplX3QobmRpZ2l0cyAtIDEpOworCWlmIChyZXN1bHQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJeCA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbUxvbmcoUHlMb25nX1NISUZUKTsKKwlpZiAoeCA9PSBOVUxMKQorCQlnb3RvIGVycm9yOworCXkgPSAoUHlMb25nT2JqZWN0ICopbG9uZ19tdWwocmVzdWx0LCB4KTsKKwlQeV9ERUNSRUYoeCk7CisJaWYgKHkgPT0gTlVMTCkKKwkJZ290byBlcnJvcjsKKwlQeV9ERUNSRUYocmVzdWx0KTsKKwlyZXN1bHQgPSB5OworCisJeCA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbUxvbmcobXNkX2JpdHMpOworCWlmICh4ID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisJeSA9IChQeUxvbmdPYmplY3QgKilsb25nX2FkZChyZXN1bHQsIHgpOworCVB5X0RFQ1JFRih4KTsKKwlpZiAoeSA9PSBOVUxMKQorCQlnb3RvIGVycm9yOworCVB5X0RFQ1JFRihyZXN1bHQpOworCXJlc3VsdCA9IHk7CisKKwlyZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworCitlcnJvcjoKKwlQeV9ERUNSRUYocmVzdWx0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworUHlEb2NfU1RSVkFSKGxvbmdfYml0X2xlbmd0aF9kb2MsCisibG9uZy5iaXRfbGVuZ3RoKCkgLT4gaW50IG9yIGxvbmdcblwKK1xuXAorTnVtYmVyIG9mIGJpdHMgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCBzZWxmIGluIGJpbmFyeS5cblwKKz4+PiBiaW4oMzdMKVxuXAorJzBiMTAwMTAxJ1xuXAorPj4+ICgzN0wpLmJpdF9sZW5ndGgoKVxuXAorNiIpOworCiAjaWYgMAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfaXNfZmluaXRlKFB5T2JqZWN0ICp2KQpAQCAtMzQ2Miw2ICszNTMxLDggQEAKIHN0YXRpYyBQeU1ldGhvZERlZiBsb25nX21ldGhvZHNbXSA9IHsKIAl7ImNvbmp1Z2F0ZSIsCShQeUNGdW5jdGlvbilsb25nX2xvbmcsCU1FVEhfTk9BUkdTLAogCSAiUmV0dXJucyBzZWxmLCB0aGUgY29tcGxleCBjb25qdWdhdGUgb2YgYW55IGxvbmcuIn0sCisJeyJiaXRfbGVuZ3RoIiwJKFB5Q0Z1bmN0aW9uKWxvbmdfYml0X2xlbmd0aCwgTUVUSF9OT0FSR1MsCisJIGxvbmdfYml0X2xlbmd0aF9kb2N9LAogI2lmIDAKIAl7ImlzX2Zpbml0ZSIsCShQeUNGdW5jdGlvbilsb25nX2lzX2Zpbml0ZSwJTUVUSF9OT0FSR1MsCiAJICJSZXR1cm5zIGFsd2F5cyBUcnVlLiJ9LAo=