From octave-sources-request at bevo dot che dot wisc dot edu Sun Feb 29 08:21:01 2004 Subject: CAT speedup From: Petter Risholm To: "John W. Eaton" cc: octave-sources at bevo dot che dot wisc dot edu Date: Sun, 29 Feb 2004 15:11:15 +0100 (MET) This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime at docserver dot cac dot washington dot edu for more info. ---559023410-851401618-1078063875=:21110 Content-Type: TEXT/PLAIN; charset=US-ASCII hi, I've reimplemented the cat function which has resulted in a considerable speedup. As it is now, it should be comparable to matlab's cat function when it comes to speed. The reason for the speedup comes mainly from elimination of all N-d indexing which was the bottleneck in the old version. This patch also provides horzcat and vertcat. They are currently called horzcat2 and vertcat2 since there already are a couple of .m scripts for doing horzcat and vertcat (I'm pretty sure they are quite a bit slower than my version for N-d concatenation, so I would recommend removing those .m files from the distribution). See attachment for patch. ChangeLog: 2004-02-29 Petter Risholm * mx-inlines.cc (MX_ND_CAT): delete macro. * dNDArray.h, chNDArray.h, CNDArray.h (cat): Change declaration. * dNDArray.cc (NDArray::cat): Change defintion. * chNDArray.cc (charNDArray::cat): Ditto. * CNDArray.cc (ComplexNDArray::cat): Ditto. * Array.h (cat_ra): Change declaration. * Array.cc (cat_ra): Speed up implementation by avoiding N-d indexing. 2004-02-29 Petter Risholm * Cell.h (cat): New function. * Cell.h (Cell::cat): Provide definition. * oct-map.h (cat): New function. * oct-map.cc (Octave_map::cat): Provide definition. * data.cc (Fcat): Speedup implementation. * data.cc (Fhorzcat): New function. * data.cc (Fvertcat): New function. * Array-tc.cc (INSTANTIATE_CAT): Instantiate cat function. Petter Risholm ---559023410-851401618-1078063875=:21110 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=ChangeLog Content-Transfer-Encoding: BASE64 Content-Description: Content-Disposition: attachment; filename=ChangeLog MjAwNC0wMi0yOSAgUGV0dGVyIFJpc2hvbG0gPHJpc2hvbG1AaWRpLm50bnUu bm8+DQoNCgkqIG14LWlubGluZXMuY2MgKE1YX05EX0NBVCk6IGRlbGV0ZSBt YWNyby4NCgkqIGROREFycmF5LmgsIGNoTkRBcnJheS5oLCBDTkRBcnJheS5o IChjYXQpOiBDaGFuZ2UgZGVjbGFyYXRpb24uDQoJKiBkTkRBcnJheS5jYyAo TkRBcnJheTxUPjo6Y2F0KTogQ2hhbmdlIGRlZmludGlvbi4NCgkqIGNoTkRB cnJheS5jYyAoY2hhck5EQXJyYXk8VD46OmNhdCk6IERpdHRvLg0KCSogQ05E QXJyYXkuY2MgKENvbXBsZXhOREFycmF5PFQ+OjpjYXQpOiBEaXR0by4NCgkq IEFycmF5LmggKGNhdF9yYSk6IENoYW5nZSBkZWNsYXJhdGlvbi4NCgkqIEFy cmF5LmNjIChjYXRfcmEpOiANCglTcGVlZCB1cCBpbXBsZW1lbnRhdGlvbiBi eSBhdm9pZGluZyBOLWQgaW5kZXhpbmcuDQoNCjIwMDQtMDItMjkgIFBldHRl ciBSaXNob2xtIDxyaXNob2xtQGlkaS5udG51Lm5vPg0KDQoJKiBDZWxsLmgg KGNhdCk6IE5ldyBmdW5jdGlvbi4NCgkqIENlbGwuaCAoQ2VsbDo6Y2F0KTog UHJvdmlkZSBkZWZpbml0aW9uLg0KCSogb2N0LW1hcC5oIChjYXQpOiBOZXcg ZnVuY3Rpb24uDQoJKiBvY3QtbWFwLmNjIChPY3RhdmVfbWFwOjpjYXQpOiBQ cm92aWRlIGRlZmluaXRpb24uDQoJKiBkYXRhLmNjIChGY2F0KTogU3BlZWR1 cCBpbXBsZW1lbnRhdGlvbi4NCgkqIGRhdGEuY2MgKEZob3J6Y2F0KTogTmV3 IGZ1bmN0aW9uLg0KCSogZGF0YS5jYyAoRnZlcnRjYXQpOiBOZXcgZnVuY3Rp b24uDQoJKiBBcnJheS10Yy5jYyAoSU5TVEFOVElBVEVfQ0FUKTogSW5zdGFu dGlhdGUgY2F0IGZ1bmN0aW9uLg0K ---559023410-851401618-1078063875=:21110 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="cat.src.patch" Content-Transfer-Encoding: BASE64 Content-Description: Content-Disposition: attachment; filename="cat.src.patch" SW5kZXg6IFRFTVBMQVRFLUlOU1QvQXJyYXktdGMuY2MNCj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0NClJDUyBmaWxlOiAvY3ZzL29jdGF2ZS9zcmMvVEVNUExB VEUtSU5TVC9BcnJheS10Yy5jYyx2DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEu MTYNCmRpZmYgLWMgLXAgLXIxLjE2IEFycmF5LXRjLmNjDQoqKiogVEVNUExB VEUtSU5TVC9BcnJheS10Yy5jYwkyMDAzLzExLzI1IDA1OjQxOjM2CTEuMTYN Ci0tLSBURU1QTEFURS1JTlNUL0FycmF5LXRjLmNjCTIwMDQvMDIvMjkgMTM6 NTA6NDkNCioqKioqKioqKioqKioqKiB0ZW1wbGF0ZSBjbGFzcyBBcnJheTxv Y3RhdmVfdmFsdWU+Ow0KKioqIDUxLDU2ICoqKioNCi0tLSA1MSw1OCAtLS0t DQogIA0KICBJTlNUQU5USUFURV9BUlJBWV9BU1NJR04gKG9jdGF2ZV92YWx1 ZSwgb2N0YXZlX3ZhbHVlKTsNCiAgDQorIElOU1RBTlRJQVRFX0NBVCAob2N0 YXZlX3ZhbHVlKTsNCisgDQogIHRlbXBsYXRlIGNsYXNzIEFycmF5MjxvY3Rh dmVfdmFsdWU+Ow0KICANCiAgdGVtcGxhdGUgY2xhc3MgQXJyYXlOPG9jdGF2 ZV92YWx1ZT47DQpJbmRleDogQ2VsbC5jYw0KPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQ0KUkNTIGZpbGU6IC9jdnMvb2N0YXZlL3NyYy9DZWxsLmNjLHYNCnJl dHJpZXZpbmcgcmV2aXNpb24gMS4xMA0KZGlmZiAtYyAtcCAtcjEuMTAgQ2Vs bC5jYw0KKioqIENlbGwuY2MJMjAwMy8xMS8xNSAxMjo1MToyMAkxLjEwDQot LS0gQ2VsbC5jYwkyMDA0LzAyLzI5IDEzOjUwOjQ5DQoqKioqKioqKioqKioq KiogQ2VsbDo6YXNzaWduIChjb25zdCBvY3RhdmVfdmFsdWVfbGlzdCYgaQ0K KioqIDEwMCwxMDUgKioqKg0KLS0tIDEwMCwxMTEgLS0tLQ0KICAgIHJldHVy biAqdGhpczsNCiAgfQ0KICANCisgaW50DQorIENlbGw6OmNhdCAoY29uc3Qg Q2VsbCYgcmFfYXJnLCBpbnQgZGltLCBpbnQgaWlkeCwgaW50IG1vdmUpDQor IHsNCisgICByZXR1cm4gOjpjYXRfcmEgKCp0aGlzLCByYV9hcmcsIGRpbSwg aWlkeCwgbW92ZSk7DQorIH0NCisgDQogIC8qDQogIDs7OyBMb2NhbCBWYXJp YWJsZXM6ICoqKg0KICA7OzsgbW9kZTogQysrICoqKg0KSW5kZXg6IENlbGwu aA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC9jdnMvb2N0 YXZlL3NyYy9DZWxsLmgsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjE3DQpk aWZmIC1jIC1wIC1yMS4xNyBDZWxsLmgNCioqKiBDZWxsLmgJMjAwNC8wMS8y MSAxOTo1NTozNgkxLjE3DQotLS0gQ2VsbC5oCTIwMDQvMDIvMjkgMTM6NTA6 NDkNCioqKioqKioqKioqKioqKiBwdWJsaWM6DQoqKiogOTYsMTAxICoqKioN Ci0tLSA5NiwxMDMgLS0tLQ0KICAgIC8vIFhYWCBGSVhNRSBYWFgNCiAgICBi b29sTWF0cml4IGFueSAoaW50IGRpbSA9IDApIGNvbnN0IHsgcmV0dXJuIGJv b2xNYXRyaXggKCk7IH0NCiAgDQorICAgaW50IGNhdCAoY29uc3QgQ2VsbCYg cmFfYXJnLCBpbnQgZGltLCBpbnQgaWlkeCwgaW50IG1vdmUpOw0KKyANCiAg ICAvLyBYWFggRklYTUUgWFhYDQogICAgYm9vbCBpc190cnVlICh2b2lkKSBj b25zdCB7IHJldHVybiBmYWxzZTsgfQ0KICANCkluZGV4OiBvY3QtbWFwLmgN Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBmaWxlOiAvY3ZzL29jdGF2 ZS9zcmMvb2N0LW1hcC5oLHYNCnJldHJpZXZpbmcgcmV2aXNpb24gMS4zMA0K ZGlmZiAtYyAtcCAtcjEuMzAgb2N0LW1hcC5oDQoqKiogb2N0LW1hcC5oCTIw MDQvMDIvMDYgMDU6NDY6MjIJMS4zMA0KLS0tIG9jdC1tYXAuaAkyMDA0LzAy LzI5IDEzOjUwOjUwDQoqKioqKioqKioqKioqKiogT2N0YXZlX21hcA0KKioq IDExOCwxMjMgKioqKg0KLS0tIDExOCwxMjUgLS0tLQ0KICANCiAgICBpbnQg bnVtZWwgKHZvaWQpIGNvbnN0Ow0KICANCisgICBpbnQgY2F0IChjb25zdCBP Y3RhdmVfbWFwJiByYV9hcmcsIGludCBkaW0sIGludCBpaWR4LCBpbnQgbW92 ZSk7DQorIA0KICAgIE9jdGF2ZV9tYXAmIGFzc2lnbiAoY29uc3Qgb2N0YXZl X3ZhbHVlX2xpc3QmIGlkeCwgY29uc3QgT2N0YXZlX21hcCYgcmhzKTsNCiAg DQogICAgT2N0YXZlX21hcCYgYXNzaWduIChjb25zdCBvY3RhdmVfdmFsdWVf bGlzdCYgaWR4LCBjb25zdCBzdGQ6OnN0cmluZyYgaywNCkluZGV4OiBvY3Qt bWFwLmNjDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL2N2 cy9vY3RhdmUvc3JjL29jdC1tYXAuY2Msdg0KcmV0cmlldmluZyByZXZpc2lv biAxLjMxDQpkaWZmIC1jIC1wIC1yMS4zMSBvY3QtbWFwLmNjDQoqKiogb2N0 LW1hcC5jYwkyMDA0LzAyLzAyIDE4OjMxOjA5CTEuMzENCi0tLSBvY3QtbWFw LmNjCTIwMDQvMDIvMjkgMTM6NTA6NTANCioqKioqKioqKioqKioqKiBPY3Rh dmVfbWFwOjpudW1lbCAodm9pZCkgY29uc3QNCioqKiA4OCw5MyAqKioqDQot LS0gODgsMTAwIC0tLS0NCiAgICByZXR1cm4gcmV0dmFsOw0KICB9DQogIA0K KyBpbnQNCisgT2N0YXZlX21hcDo6Y2F0IChjb25zdCBPY3RhdmVfbWFwJiBy YV9hcmcsIGludCBkaW0sIGludCBpaWR4LCBpbnQgbW92ZSkNCisgew0KKyAg IC8vcmV0dXJuIDo6Y2F0X3JhICgqdGhpcywgcmFfYXJnLCBkaW0sIGlpZHgs IG1vdmUpOw0KKyAgIHJldHVybiAwOw0KKyB9DQorIA0KICBzdGF0aWMgc3Ry aW5nX3ZlY3Rvcg0KICBlcXVpdl9rZXlzIChjb25zdCBPY3RhdmVfbWFwJiBh LCBjb25zdCBPY3RhdmVfbWFwJiBiKQ0KICB7DQpJbmRleDogZGF0YS5jYw0K PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC9jdnMvb2N0YXZl L3NyYy9kYXRhLmNjLHYNCnJldHJpZXZpbmcgcmV2aXNpb24gMS4xMjQNCmRp ZmYgLWMgLXAgLXIxLjEyNCBkYXRhLmNjDQoqKiogZGF0YS5jYwkyMDA0LzAy LzE2IDE1OjIzOjIyCTEuMTI0DQotLS0gZGF0YS5jYwkyMDA0LzAyLzI5IDEz OjUwOjUzDQoqKioqKioqKioqKioqKiogU29mdHdhcmUgRm91bmRhdGlvbiwg NTkgVGVtcGxlIFBsYWNlIC0gUw0KKioqIDQwLDQ1ICoqKioNCi0tLSA0MCw0 NyAtLS0tDQogICNpbmNsdWRlICJ2YXJpYWJsZXMuaCINCiAgI2luY2x1ZGUg Im9jdC1vYmouaCINCiAgI2luY2x1ZGUgInV0aWxzLmgiDQorICNpbmNsdWRl ICJDZWxsLmgiDQorICNpbmNsdWRlICJvY3QtbWFwLmgiDQogIA0KICAjZGVm aW5lIEFOWV9BTEwoRkNOKSBcDQogICBcDQoqKioqKioqKioqKioqKiogY2F0 X2FkZF9kaW1zIChkaW1fdmVjdG9yJiBkdl9uZXcsIGNvbnN0IA0KKioqIDc1 MCw4MjEgKioqKg0KICAgIHJldHVybiB0cnVlOw0KICB9DQogIA0KISBERUZV TiAoY2F0LCBhcmdzLCAsDQohICAgIi0qLSB0ZXhpbmZvIC0qLVxuXA0KISBA ZGVmdHlwZWZuIHtCdWlsdC1pbiBGdW5jdGlvbn0ge30gY2F0IChAdmFye2Rp bX0sIEB2YXJ7YXJyYXkxfSwgQHZhcnthcnJheTJ9LCBAZG90c3t9LCBAdmFy e2FycmF5Tn0pXG5cDQohIFJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBO LWQgYXJyYXkgb2JqZWN0cywgQHZhcnthcnJheTF9LCBAdmFye2FycmF5Mn0s IEBkb3Rze30sIEB2YXJ7YXJyYXlOfSBhbG9uZyBkaW1lbnNpb24gQHZhcntk aW19LlxuXA0KISBcblwNCiEgQGV4YW1wbGVcblwNCiEgQGdyb3VwXG5cDQoh IEEgPSBvbmVzICgyLCAyKTtcblwNCiEgQiA9IHplcm9zICgyLCAyKTtcblwN CiEgY2F0ICgyLCBBLCBCKVxuXA0KISBAcmVzdWx0e30gYW5zID1cblwNCiEg XG5cDQohICAgICAgMSAxIDAgMFxuXA0KISAgICAgIDEgMSAwIDBcblwNCiEg ICAgICAxIDEgMCAwXG5cDQohICAgICAgMSAxIDAgMFxuXA0KISBAZW5kIGdy b3VwXG5cDQohIEBlbmQgZXhhbXBsZVxuXA0KISBcblwNCiEgQWx0ZXJuYXRp dmVseSwgd2UgY2FuIGNvbmNhdGVuYXRlIEB2YXJ7QX0gYW5kIEB2YXJ7Qn0g YWxvbmcgdGhlXG5cDQohIHNlY29uZCBkaW1lbnNpb24gdGhlIGZvbGxvd2lu ZyB3YXk6XG5cDQohIFxuXA0KISBAZXhhbXBsZVxuXA0KISBAZ3JvdXBcblwN CiEgW0EsIEJdLlxuXA0KISBAZW5kIGdyb3VwXG5cDQohIEBlbmQgZXhhbXBs ZVxuXA0KISBcblwNCiEgQHZhcntkaW19IGNhbiBiZSBsYXJnZXIgdGhhbiB0 aGUgZGltZW5zaW9ucyBvZiB0aGUgTi1kIGFycmF5IG9iamVjdHNcblwNCiEg YW5kIHRoZSByZXN1bHQgd2lsbCB0aHVzIGhhdmUgQHZhcntkaW19IGRpbWVu c2lvbnMgYXMgdGhlXG5cDQohIGZvbGxvd2luZyBleGFtcGxlIHNob3dzOlxu XA0KISBAZXhhbXBsZVxuXA0KISBAZ3JvdXBcblwNCiEgY2F0ICg0LCBvbmVz KDIsIDIpLCB6ZXJvcyAoMiwgMikpXG5cDQohIEByZXN1bHR7fSBhbnMgPVxu XA0KISBcblwNCiEgICAgYW5zKDosOiwxLDEpID1cblwNCiEgXG5cDQohICAg ICAgMSAxXG5cDQohICAgICAgMSAxXG5cDQohIFxuXA0KISAgICBhbnMoOiw6 LDEsMikgPVxuXA0KISAgICAgIDAgMFxuXA0KISAgICAgIDAgMFxuXA0KISBA ZW5kIGdyb3VwXG5cDQohIEBlbmQgZXhhbXBsZVxuXA0KISBcblwNCiEgQHNl ZWFsc297aG9yemNhdCBhbmQgdmVydGNhdH1cblwNCiEgQGVuZCBkZWZ0eXBl Zm4iKQ0KICB7DQogICAgb2N0YXZlX3ZhbHVlIHJldHZhbDsNCiEgDQogICAg aW50IGRpbSA9IGFyZ3MoMCkuaW50X3ZhbHVlICgpIC0gMTsNCiAgDQogICAg aWYgKGVycm9yX3N0YXRlKQ0KICAgICAgew0KICAgICAgICBlcnJvciAoImNh dDogZXhwZWN0aW5nIGZpcnN0IGFyZ3VtZW50IHRvIGJlIGEgaW50ZWdlciIp Ow0KICAgICAgICByZXR1cm4gcmV0dmFsOw0KICAgICAgfQ0KISANCiEgICBp ZiAoYXJncy5sZW5ndGggKCkgPiAyICYmIChkaW0gPj0gMCkpDQogICAgICB7 ICAgICAgDQogICAgICAgIGRpbV92ZWN0b3IgIGR2ID0gYXJncygxKS5kaW1z ICgpOw0KISANCiEgICAgICAgLy8gSSBuZWVkIHRvIGxvb2sgaW50byB0aGVz ZSBjb252ZXJzaW9ucy4NCiEgDQogICAgICAgIGZvciAoaW50IGkgPSAyOyBp IDwgYXJncy5sZW5ndGggKCk7IGkrKykNCiAgCXsNCiAgCSAgLy8gYWRkX2Rp bXMgY29uc3RydWN0cyBhIGRpbWVuc2lvbiB2ZWN0b3Igd2hpY2ggaG9sZHMg dGhlDQotLS0gNzUyLDc3NSAtLS0tDQogICAgcmV0dXJuIHRydWU7DQogIH0N CiAgDQohIG9jdGF2ZV92YWx1ZSBkb19jYXQgKGNvbnN0IG9jdGF2ZV92YWx1 ZV9saXN0JiBhcmdzKQ0KICB7DQogICAgb2N0YXZlX3ZhbHVlIHJldHZhbDsN CiEgIA0KICAgIGludCBkaW0gPSBhcmdzKDApLmludF92YWx1ZSAoKSAtIDE7 DQogIA0KKyAgIGludCBuX2FyZ3MgPSBhcmdzLmxlbmd0aCAoKTsNCisgIA0K ICAgIGlmIChlcnJvcl9zdGF0ZSkNCiAgICAgIHsNCiAgICAgICAgZXJyb3Ig KCJjYXQ6IGV4cGVjdGluZyBmaXJzdCBhcmd1bWVudCB0byBiZSBhIGludGVn ZXIiKTsNCiAgICAgICAgcmV0dXJuIHJldHZhbDsNCiAgICAgIH0NCiEgICAN CiEgICBpZiAobl9hcmdzID4gMiAmJiBkaW0gPj0gMCkNCiAgICAgIHsgICAg ICANCiAgICAgICAgZGltX3ZlY3RvciAgZHYgPSBhcmdzKDEpLmRpbXMgKCk7 DQohICAgDQogICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgYXJncy5sZW5n dGggKCk7IGkrKykNCiAgCXsNCiAgCSAgLy8gYWRkX2RpbXMgY29uc3RydWN0 cyBhIGRpbWVuc2lvbiB2ZWN0b3Igd2hpY2ggaG9sZHMgdGhlDQoqKioqKioq KioqKioqKiogY2F0ICg0LCBvbmVzKDIsIDIpLCB6ZXJvcyAoMiwgMikpXG5c DQoqKiogODIzLDk0MiAqKioqDQogIA0KICAJICBpZiAoISBjYXRfYWRkX2Rp bXMgKGR2LCBhcmdzKGkpLmRpbXMgKCksIGRpbSkpDQogIAkgICAgew0KISAJ ICAgICAgLy8gRGltZW5zaW9ucyBkbyBub3QgbWF0Y2guDQogIAkgICAgICBy ZXR1cm4gcmV0dmFsOw0KICAJICAgIH0NCiAgCX0NCiAgDQohICAgICAgIE5E QXJyYXkgY2F0X3JlID0gTkRBcnJheSAoZHYsIDApOw0KICAgICAgICBDb21w bGV4TkRBcnJheSBjYXRfY3g7DQogICAgICAgIGNoYXJOREFycmF5IGNhdF9j aDsNCiAgDQogICAgICAgIC8vIFRoZSBmaW5hbCBhcnJheSBjYW4gYmUgb2Yg dGhyZWUgdHlwZXM6DQotICAgICAgIC8vDQotICAgICAgIC8vICAgICByZSBj eCBjaA0KLSAgICAgICAvLyAtLS0tLS0tLS0tLS0tLQ0KLSAgICAgICAvLyBy ZSB8cmUgY3ggY2gNCi0gICAgICAgLy8gY3ggfGN4IGN4IFgNCi0gICAgICAg Ly8gY2ggfGNoIFggIGNoDQogICAgICAgIC8vDQogICAgICAgIC8vIChYIG1l YW5zIGluY29tcGF0aWJsZSkuDQogIA0KISAgICAgICBlbnVtIHR5cGVzIHsg UkVBTCwgQ09NUExFWCwgQ0hBUiB9IHQgPSBSRUFMOyAgICAgIA0KICANCiEg ICAgICAgLy8gVmFyaWFibGUgd2hpY2ggdGVsbHMgdXMgaG93IG11Y2ggd2Ug aGF2ZSBleHRlbmRlZCB0aGUNCiEgICAgICAgLy8gdmFyaWFibGUgYWxvbmcg dGhlIGRpbSBkaW1lbnNpb24uDQohIA0KISAgICAgICBpbnQgY3Vycl9hZGRf ZGltcyA9IDA7DQohIA0KISAgICAgICAvLyBUZWxscyB1cyB3ZXRoZXIgdGhl IGFycmF5IHdlIGNvbmNhdGVuYXRlZCBoYWQgZmV3ZXIgZGltZW5zaW9ucw0K ISAgICAgICAvLyB0aGFuIGRpbSwgc3VjaCB0aGF0IHdlIG9ubHkgYWRkIG9u ZSBkaW1lbnNpb24gdG8NCiEgICAgICAgLy8gY3Vycl9hZGRfZGltcy4NCiEg DQohICAgICAgIGJvb2wgZXh0ZW5kZWRfZGltcyA9IGZhbHNlOw0KISAgICAg ICANCiEgICAgICAgLy8gU3RhcnQgZmlsbGluZyBpbiB2YWx1ZXMuDQohIA0K ISAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoICgpOyBp KyspDQogIAl7DQohIAkgIG9jdGF2ZV92YWx1ZSB0bXAgPSBhcmdzIChpKTsN CiEgDQohIAkgIGRpbV92ZWN0b3IgZHZfYXJnID0gdG1wLmRpbXMgKCk7DQoh IA0KISAJICAvLyBUaGlzIHZhcmlhYmxlIHRlbGxzIHVzIHdldGhlciB0aGUg dGhlIG5ldyB2YWx1ZSBpcyBoYXMgYQ0KISAJICAvLyBudW1iZXIgb2YgZGlt ZW5zaW9uIGxlc3MgdGhhbiB0aGUgZmluYWwgdmFsdWUuDQogIA0KISAJICBl eHRlbmRlZF9kaW1zID0gZmFsc2U7DQohIAkgIA0KISAJICBpZiAodCA9PSBS RUFMKQ0KICAJICAgIHsNCiEgCSAgICAgIGlmICh0bXAuaXNfY29tcGxleF90 eXBlICgpKQ0KICAJCXsNCiEgCQkgIGNhdF9jeCA9IENvbXBsZXhOREFycmF5 IChjYXRfcmUpOw0KISAJCSAgDQohIAkJICBleHRlbmRlZF9kaW1zID0NCiEg CQkgICAgY2F0X2N4LmNhdCAodG1wLmNvbXBsZXhfYXJyYXlfdmFsdWUgKCks IGRpbSwgY3Vycl9hZGRfZGltcyk7DQohIAkJICANCiEgCQkgIHQgPSBDT01Q TEVYOw0KICAJCX0NCiEgCSAgICAgIGVsc2UgaWYgKHRtcC5pc19zdHJpbmcg KCkpDQogIAkJew0KISAJCSAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gYmUgYWJs ZSB0byBjb252ZXJ0IGEgZE5EQXJyYXkNCiEgCQkgIC8vIHRvIGEgY2hOREFy cmF5Lg0KICANCiEgCQkgIGNhdF9jaCA9IGNoYXJOREFycmF5IChvY3RhdmVf dmFsdWUgKGNhdF9yZSkuY2hhcl9hcnJheV92YWx1ZSAoKSk7DQogIAkJICAN CiEgCQkgIGV4dGVuZGVkX2RpbXMgPQ0KISAJCSAgICBjYXRfY2guY2F0ICh0 bXAuY2hhcl9hcnJheV92YWx1ZSAoKSwgZGltLCBjdXJyX2FkZF9kaW1zKTsN CiAgCQkgIA0KISAJCSAgdCA9IENIQVI7DQogIAkJfQ0KISAJICAgICAgZWxz ZQ0KISAJCWV4dGVuZGVkX2RpbXMgPSANCiEgCQkgIGNhdF9yZS5jYXQgKHRt cC5hcnJheV92YWx1ZSgpLCBkaW0sIGN1cnJfYWRkX2RpbXMpOw0KISAJICAg IH0NCiEgCSAgZWxzZSBpZiAodCA9PSBDT01QTEVYKQ0KISAJICAgIHsNCiEg CSAgICAgIGV4dGVuZGVkX2RpbXMgPSANCiEgCQljYXRfY3guY2F0ICh0bXAu Y29tcGxleF9hcnJheV92YWx1ZSAoKSwgZGltLCBjdXJyX2FkZF9kaW1zKTsN CiEgCSAgICB9DQohIAkgIGVsc2UgaWYgKHQgPT0gQ0hBUikNCiEgCSAgICB7 DQohIAkgICAgICBpZiAodG1wLmlzX2NvbXBsZXhfdHlwZSAoKSkNCiAgCQl7 DQohIAkJICBlcnJvciAoImNhbm5vdCBjb252ZXJ0IGNvbXBsZXggdHlwZSB0 byBjaGFyYWN0ZXIgdHlwZSIpOw0KISAJCSAgcmV0dXJuIHJldHZhbDsNCiEg CQl9DQohIAkgICAgICBlbHNlDQohIAkJZXh0ZW5kZWRfZGltcyA9DQohIAkJ ICBjYXRfY2guY2F0ICh0bXAuY2hhcl9hcnJheV92YWx1ZSAoKSwgZGltLCBj dXJyX2FkZF9kaW1zKTsNCiEgCSAgICB9DQogIAkgIA0KISAJICBpZiAoZXJy b3Jfc3RhdGUpDQohIAkgICAgew0KISAJICAgICAgLy8gV3JvbmcgY29udmVy c2lvbiBpbiB0aGUgbGFzdCBpZiBzdGF0ZW1lbnQuDQohIAkgICAgICByZXR1 cm4gcmV0dmFsOw0KISAJICAgIH0NCiAgDQohIAkgIC8vIEtlZXAgdHJhY2sg b2YgaG93IG1hbnkgZGltZW5zaW9ucyBoYXZlIGJlZW4gYWRkZWQuDQogIA0K ISAJICBpZiAoZXh0ZW5kZWRfZGltcykNCiEgCSAgICBjdXJyX2FkZF9kaW1z Kys7DQohIAkgIGVsc2UNCiEgCSAgICBjdXJyX2FkZF9kaW1zICs9IGR2X2Fy ZyAoZGltKTsNCiAgCX0NCiEgDQogICAgICAgIGlmICh0ID09IFJFQUwpDQog IAlyZXR2YWwgPSBvY3RhdmVfdmFsdWUgKGNhdF9yZSk7DQogICAgICAgIGVs c2UgaWYgKHQgPT0gQ09NUExFWCkNCiAgCXJldHZhbCA9IG9jdGF2ZV92YWx1 ZSAoY2F0X2N4KTsNCiAgICAgICAgZWxzZSBpZiAodCA9PSBDSEFSKQ0KICAJ cmV0dmFsID0gb2N0YXZlX3ZhbHVlIChjYXRfY2gpOw0KICAgICAgfQ0KICAg IGVsc2UNCiAgICAgIHByaW50X3VzYWdlICgiY2F0Iik7DQohIA0KICAgIHJl dHVybiByZXR2YWw7DQogIH0NCiAgDQogIHN0YXRpYyBvY3RhdmVfdmFsdWUN Ci0tLSA3NzcsMTA0NSAtLS0tDQogIA0KICAJICBpZiAoISBjYXRfYWRkX2Rp bXMgKGR2LCBhcmdzKGkpLmRpbXMgKCksIGRpbSkpDQogIAkgICAgew0KISAJ ICAgICAgLy8gRGltZW5zaW9ucyBkbyBub3QgbWF0Y2guIA0KISAJICAgICAg Ly8gY2F0X2FkZF9kaW1zIHByaW50ZWQgYSBlcnJvciBtc2cNCiAgCSAgICAg IHJldHVybiByZXR2YWw7DQogIAkgICAgfQ0KICAJfQ0KICANCiEgICAgICAg TkRBcnJheSBjYXRfcmU7DQogICAgICAgIENvbXBsZXhOREFycmF5IGNhdF9j eDsNCiAgICAgICAgY2hhck5EQXJyYXkgY2F0X2NoOw0KKyAgICAgICBDZWxs IGNhdF9jZWxsOw0KKyAgICAgICBPY3RhdmVfbWFwIGNhdF9tYXA7DQogIA0K ICAgICAgICAvLyBUaGUgZmluYWwgYXJyYXkgY2FuIGJlIG9mIHRocmVlIHR5 cGVzOg0KICAgICAgICAvLw0KKyAgICAgICAvLyAgICAgICByZSBjeCBjaCBj DQorICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0NCisgICAgICAgLy8gcmUg ICB8cmUgY3ggY2ggWA0KKyAgICAgICAvLyBjeCAgIHxjeCBjeCBYICBYDQor ICAgICAgIC8vIGNoICAgfGNoIFggIGNoIFgNCisgICAgICAgLy8gY2VsbCB8 WCAgWCAgWCAgYw0KICAgICAgICAvLyAoWCBtZWFucyBpbmNvbXBhdGlibGUp Lg0KICANCiEgICAgICAgZW51bSB0eXBlcyB7IFJFQUwsIENPTVBMRVgsIENI QVIsIENFTEwsIE1BUH0gdDsgICAgICANCiAgDQohICAgICAgIC8vIEluaXRp YWxpemUgdCB0byByaWdodCB2YWx1ZQ0KISAgICAgICBpZiAoYXJncygxKS5p c19jZWxsICgpKQ0KICAJew0KISAJICB0ID0gQ0VMTDsNCiEgCSAgY2F0X2Nl bGwgPSBDZWxsIChkdik7DQohIAl9DQohICAgICAgIGVsc2UgaWYgKGFyZ3Mo MSkuaXNfbWFwICgpKQ0KISAJew0KISAJICBlcnJvciAoImNvbmNhdGVuYXRp b24gb2Ygc3RydWN0dXJlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIik7DQoh IAkgIHJldHVybiByZXR2YWw7DQohIAkgIC8vIHQgPSBNQVA7DQohIAkgIC8v IGNhdF9tYXAgPSBPY3RhdmVfbWFwIChkdik7DQohIAl9DQohICAgICAgIGVs c2UgDQohIAl7DQohIAkgIHQgPSBSRUFMOw0KISAJICBjYXRfcmUgPSBOREFy cmF5IChkdiwgMCk7DQohIAl9DQohICANCiEgICAgICAgaW50IGlkeCA9IDA7 DQohICAgDQohICAgICAgIGRpbV92ZWN0b3IgZHZfZmlyc3QgPSBhcmdzKDEp LmRpbXMgKCk7DQohICAgICAgIA0KISAgICAgICAvLyBuX21vdmVzIHRlbGxz IHVzIGhvdyBtYW55IHRpbWVzIHdlIG5lZWQgdG8NCiEgICAgICAgLy8gdmlz aXQgZWFjaCBhcmd1bWVudC4NCiEgICAgICAgLy8NCiEgICAgICAgLy8gSWYg d2UgYXJlIGNvbmNhdGVuYXRpbmcgYSAyeDJ4MiBhcnJheSB3aXRoIGEgMngy eDIgYXJyYXkNCiEgICAgICAgLy8gYWxvbmcgdGhlIHNlY29uZCBkaW1lbnNp b25zLCB3ZSBkbyB0d28gaXRlcmF0aW9ucw0KISAgICAgICAvLyB0cm91Z2gg dGhlIGFyZ3VtZW50cyBhbmQgbW92ZSAyeDIgZWxlbWVudHMgZnJvbSBlYWNo DQohICAgICAgIC8vIG9mIHRoZSBhcmd1bWVudHMgaW50byB0aGUgcmVzdWx0 aW5nIGFycmF5IG9uIGVhY2ggaXRlcmF0aW9uLg0KISAgICAgICBpbnQgbl9t b3ZlcyA9IDE7DQogIA0KISAgICAgICBmb3IgKGludCBpID0gZGltICsgMTsg aSA8IGR2X2ZpcnN0Lmxlbmd0aCAoKTsgaSsrKQ0KISAJbl9tb3ZlcyAqPSBk dl9maXJzdChpKTsNCiEgICAgICAgDQohICAgICAgIGZvciAoaW50IG1vdmUg PSAwOyBtb3ZlIDwgbl9tb3ZlcyA7IG1vdmUrKykNCiEgCXsgICAgIA0KISAJ ICBmb3IgKGludCBpID0gMTsgaSA8IG5fYXJnczsgaSsrKQ0KICAJICAgIHsN CiEgCSAgICAgIG9jdGF2ZV92YWx1ZSB0bXAgPSBhcmdzIChpKTsNCiEgDQoh IAkgICAgICBpZiAodCA9PSBNQVApDQogIAkJew0KISAJCSAgZXJyb3IgKCJj b25jYXRlbmF0aW9uIG9mIHN0cnVjdHVyZXMgaXMgbm90IHlldCBpbXBsZW1l bnRlZCIpOw0KISAJCSAgcmV0dXJuIHJldHZhbDsNCiAgCQl9DQohIAkgICAg ICBlbHNlIGlmICh0ID09IENFTEwpDQogIAkJew0KISAJCSAgaWYgKCEgdG1w LmlzX2NlbGwgKCkpDQohIAkJICAgIHsNCiEgCQkgICAgICBlcnJvciAoImNh bm5vdCBjb252ZXJ0IGFyZ3VtZW50IHRvIGNlbGwiKTsNCiEgCQkgICAgICBy ZXR1cm4gcmV0dmFsOw0KISAJCSAgICB9DQohIAkJICBlbHNlDQohIAkJICAg IHsNCiEgCQkJQ2VsbCByYV90bXAgPSBhcmdzKGkpLmNlbGxfdmFsdWUgKCk7 DQohIAkgIA0KISAJCQlpZiAoZXJyb3Jfc3RhdGUpDQohIAkJCSAgcmV0dXJu IHJldHZhbDsNCiAgDQohIAkJCWlkeCA9IGNhdF9jZWxsLmNhdCAocmFfdG1w LCBkaW0sIGlkeCwgbW92ZSk7DQohIAkJICAgIH0NCiEgCQl9DQohIAkgICAg ICBlbHNlIGlmICh0ID09IFJFQUwpDQohIAkJew0KISAJCSAgaWYgKHRtcC5p c19jb21wbGV4X3R5cGUgKCkpDQohIAkJICAgIHsNCiEgCQkgICAgICBjYXRf Y3ggPSBDb21wbGV4TkRBcnJheSAoY2F0X3JlKTsJCSAgDQogIAkJICANCiEg CQkgICAgICBDb21wbGV4TkRBcnJheSByYV90bXAgPSB0bXAuY29tcGxleF9h cnJheV92YWx1ZSAoKTsNCiEgCSAgDQohIAkJICAgICAgaWYgKGVycm9yX3N0 YXRlKQ0KISAJCQlyZXR1cm4gcmV0dmFsOw0KISANCiEgCQkgICAgICBpZHgg PSBjYXRfY3guY2F0IChyYV90bXAsIGRpbSwgaWR4LCBtb3ZlKTsNCiEgDQoh IAkJICAgICAgdCA9IENPTVBMRVg7DQohIAkJICAgIH0NCiEgCQkgIGVsc2Ug aWYgKHRtcC5pc19zdHJpbmcgKCkpDQohIAkJICAgIHsNCiEgCQkgICAgICAv LyBUaGlzIGlzIGEgaGFjayB0byBiZSBhYmxlIHRvIGNvbnZlcnQgYSBkTkRB cnJheQ0KISAJCSAgICAgIC8vIHRvIGEgY2hOREFycmF5Lg0KISANCiEgCQkg ICAgICBjYXRfY2ggPSBjaGFyTkRBcnJheSAob2N0YXZlX3ZhbHVlIChjYXRf cmUpLmNoYXJfYXJyYXlfdmFsdWUgKCkpOwkgIA0KICAJCSAgDQohIAkJICAg ICAgY2hhck5EQXJyYXkgcmFfdG1wID0gdG1wLmNoYXJfYXJyYXlfdmFsdWUg KCk7DQohIAkgIA0KISAJCSAgICAgIGlmIChlcnJvcl9zdGF0ZSkNCiEgCQkJ cmV0dXJuIHJldHZhbDsNCiEgDQohIAkJICAgICAgaWR4ID0gY2F0X2NoLmNh dCAocmFfdG1wLCBkaW0sIGlkeCwgbW92ZSk7DQohIAkNCiEgCQkgICAgICB0 ID0gQ0hBUjsNCiEgCQkgICAgfQ0KISAJCSAgZWxzZSAvL2lmICh0bXAuaXNf cmVhbF90eXBlICgpKQ0KISAJCSAgICB7IA0KISAJCSAgICAgIE5EQXJyYXkg cmFfdG1wID0gdG1wLmFycmF5X3ZhbHVlICgpOw0KISAJDQohIAkJICAgICAg aWYgKGVycm9yX3N0YXRlKQ0KISAJCQlyZXR1cm4gcmV0dmFsOw0KISAJCQ0K ISAJCSAgICAgIGlkeCA9IGNhdF9yZS5jYXQgKHJhX3RtcCwgZGltLCBpZHgs IG1vdmUpOw0KISAJCSAgICB9ICANCiAgCQl9DQohIAkgICAgICBlbHNlIGlm ICh0ID09IENPTVBMRVgpDQogIAkJew0KISAJCSAgQ29tcGxleE5EQXJyYXkg cmFfdG1wID0gdG1wLmNvbXBsZXhfYXJyYXlfdmFsdWUgKCk7DQogIAkgIA0K ISAJCSAgaWYgKGVycm9yX3N0YXRlKQ0KISAJCSAgICByZXR1cm4gcmV0dmFs Ow0KICANCiEgCQkgIGlkeCA9IGNhdF9jeC5jYXQgKHJhX3RtcCwgZGltLCBp ZHgsIG1vdmUpOw0KISAJCX0NCiEgCSAgICAgIGVsc2UgaWYgKHQgPT0gQ0hB UikNCiEgCQl7DQohIAkJICBpZiAodG1wLmlzX2NvbXBsZXhfdHlwZSAoKSkN CiEgCQkgICAgew0KISAJCSAgICAgIGVycm9yICgiY2Fubm90IGNvbnZlcnQg Y29tcGxleCB0eXBlIHRvIGNoYXJhY3RlciB0eXBlIik7DQohIAkJICAgICAg cmV0dXJuIHJldHZhbDsNCiEgCQkgICAgfQ0KISAJCSAgZWxzZQ0KISAJCSAg ICB7DQohIAkJICAgICAgY2hhck5EQXJyYXkgcmFfdG1wID0gdG1wLmNoYXJf YXJyYXlfdmFsdWUgKCk7DQohIAkgIA0KISAJCSAgICAgIGlmIChlcnJvcl9z dGF0ZSkNCiEgCQkJcmV0dXJuIHJldHZhbDsNCiAgDQohIAkJICAgICAgY2F0 X2NoLmNhdCAocmFfdG1wLCBkaW0sIGlkeCwgbW92ZSk7DQohIAkJICAgIH0N CiEgCQl9DQohIAkgICAgfQ0KICAJfQ0KISAgICAgICANCiAgICAgICAgaWYg KHQgPT0gUkVBTCkNCiAgCXJldHZhbCA9IG9jdGF2ZV92YWx1ZSAoY2F0X3Jl KTsNCiAgICAgICAgZWxzZSBpZiAodCA9PSBDT01QTEVYKQ0KICAJcmV0dmFs ID0gb2N0YXZlX3ZhbHVlIChjYXRfY3gpOw0KICAgICAgICBlbHNlIGlmICh0 ID09IENIQVIpDQogIAlyZXR2YWwgPSBvY3RhdmVfdmFsdWUgKGNhdF9jaCk7 DQorICAgICAgIGVsc2UgaWYgKHQgPT0gQ0VMTCkNCisgCXJldHZhbCA9IG9j dGF2ZV92YWx1ZSAoY2F0X2NlbGwpOw0KKyAgICAgICBlbHNlIGlmICh0ID09 IE1BUCkNCisgCXJldHZhbCA9IG9jdGF2ZV92YWx1ZSAoY2F0X21hcCk7DQog ICAgICB9DQogICAgZWxzZQ0KICAgICAgcHJpbnRfdXNhZ2UgKCJjYXQiKTsN CiEgIA0KICAgIHJldHVybiByZXR2YWw7DQorIH0NCisgDQorIERFRlVOICho b3J6Y2F0MiwgYXJncywgLA0KKyAgICItKi0gdGV4aW5mbyAtKi1cblwNCisg QGRlZnR5cGVmbiB7QnVpbHQtaW4gRnVuY3Rpb259IHt9IGhvcnpjYXQgKEB2 YXJ7YXJyYXkxfSwgQHZhcnthcnJheTJ9LCBAZG90c3t9LCBAdmFye2FycmF5 Tn0pXG5cDQorIFJldHVybiB0aGUgaG9yaXpvbnRhbCBjb25jYXRlbmF0aW9u IG9mIE4tZCBhcnJheSBvYmplY3RzLCBAdmFye2FycmF5MX0sIEB2YXJ7YXJy YXkyfSwgQGRvdHN7fSwgQHZhcnthcnJheU59IGFsb25nIGRpbWVuc2lvbiBA dmFye2RpbX0uXG5cDQorIFxuXA0KKyBAc2VlYWxzb3tjYXQgYW5kIHZlcnRj YXR9XG5cDQorIEBlbmQgZGVmdHlwZWZuIikNCisgew0KKyAgIG9jdGF2ZV92 YWx1ZV9saXN0IGFyZ3NfdG1wID0gYXJnczsNCisgICANCisgICBpbnQgZGlt ID0gMjsNCisgICANCisgICBvY3RhdmVfdmFsdWUgZCAoZGltKTsNCisgICAN CisgICBhcmdzX3RtcC5wcmVwZW5kIChkKTsNCisgICANCisgICByZXR1cm4g ZG9fY2F0KGFyZ3NfdG1wKTsNCisgfQ0KKyANCisgREVGVU4gKHZlcnRjYXQy LCBhcmdzLCAsDQorICAgIi0qLSB0ZXhpbmZvIC0qLVxuXA0KKyBAZGVmdHlw ZWZuIHtCdWlsdC1pbiBGdW5jdGlvbn0ge30gdmVydGNhdCAoQHZhcnthcnJh eTF9LCBAdmFye2FycmF5Mn0sIEBkb3Rze30sIEB2YXJ7YXJyYXlOfSlcblwN CisgUmV0dXJuIHRoZSB2ZXJ0aWNhbCBjb25jYXRlbmF0aW9uIG9mIE4tZCBh cnJheSBvYmplY3RzLCBAdmFye2FycmF5MX0sIEB2YXJ7YXJyYXkyfSwgQGRv dHN7fSwgQHZhcnthcnJheU59IGFsb25nIGRpbWVuc2lvbiBAdmFye2RpbX0u XG5cDQorIFxuXA0KKyBAc2VlYWxzb3tjYXQgYW5kIGhvcnpjYXR9XG5cDQor IEBlbmQgZGVmdHlwZWZuIikNCisgew0KKyAgIG9jdGF2ZV92YWx1ZV9saXN0 IGFyZ3NfdG1wID0gYXJnczsNCisgICANCisgICBpbnQgZGltID0gMTsNCisg ICANCisgICBvY3RhdmVfdmFsdWUgZCAoZGltKTsNCisgICANCisgICBhcmdz X3RtcC5wcmVwZW5kIChkKTsNCisgICANCisgICByZXR1cm4gZG9fY2F0KGFy Z3NfdG1wKTsNCisgfQ0KKyANCisgREVGVU4gKGNhdCwgYXJncywgLA0KKyAg ICItKi0gdGV4aW5mbyAtKi1cblwNCisgQGRlZnR5cGVmbiB7QnVpbHQtaW4g RnVuY3Rpb259IHt9IGNhdCAoQHZhcntkaW19LCBAdmFye2FycmF5MX0sIEB2 YXJ7YXJyYXkyfSwgQGRvdHN7fSwgQHZhcnthcnJheU59KVxuXA0KKyBSZXR1 cm4gdGhlIGNvbmNhdGVuYXRpb24gb2YgTi1kIGFycmF5IG9iamVjdHMsIEB2 YXJ7YXJyYXkxfSwgQHZhcnthcnJheTJ9LCBAZG90c3t9LCBAdmFye2FycmF5 Tn0gYWxvbmcgZGltZW5zaW9uIEB2YXJ7ZGltfS5cblwNCisgXG5cDQorIEBl eGFtcGxlXG5cDQorIEBncm91cFxuXA0KKyBBID0gb25lcyAoMiwgMik7XG5c DQorIEIgPSB6ZXJvcyAoMiwgMik7XG5cDQorIGNhdCAoMiwgQSwgQilcblwN CisgQHJlc3VsdHt9IGFucyA9XG5cDQorIFxuXA0KKyAgICAgIDEgMSAwIDBc blwNCisgICAgICAxIDEgMCAwXG5cDQorICAgICAgMSAxIDAgMFxuXA0KKyAg ICAgIDEgMSAwIDBcblwNCisgQGVuZCBncm91cFxuXA0KKyBAZW5kIGV4YW1w bGVcblwNCisgXG5cDQorIEFsdGVybmF0aXZlbHksIHdlIGNhbiBjb25jYXRl bmF0ZSBAdmFye0F9IGFuZCBAdmFye0J9IGFsb25nIHRoZVxuXA0KKyBzZWNv bmQgZGltZW5zaW9uIHRoZSBmb2xsb3dpbmcgd2F5OlxuXA0KKyBcblwNCisg QGV4YW1wbGVcblwNCisgQGdyb3VwXG5cDQorIFtBLCBCXS5cblwNCisgQGVu ZCBncm91cFxuXA0KKyBAZW5kIGV4YW1wbGVcblwNCisgXG5cDQorIEB2YXJ7 ZGltfSBjYW4gYmUgbGFyZ2VyIHRoYW4gdGhlIGRpbWVuc2lvbnMgb2YgdGhl IE4tZCBhcnJheSBvYmplY3RzXG5cDQorIGFuZCB0aGUgcmVzdWx0IHdpbGwg dGh1cyBoYXZlIEB2YXJ7ZGltfSBkaW1lbnNpb25zIGFzIHRoZVxuXA0KKyBm b2xsb3dpbmcgZXhhbXBsZSBzaG93czpcblwNCisgQGV4YW1wbGVcblwNCisg QGdyb3VwXG5cDQorIGNhdCAoNCwgb25lcygyLCAyKSwgemVyb3MgKDIsIDIp KVxuXA0KKyBAcmVzdWx0e30gYW5zID1cblwNCisgXG5cDQorICAgIGFucyg6 LDosMSwxKSA9XG5cDQorIFxuXA0KKyAgICAgIDEgMVxuXA0KKyAgICAgIDEg MVxuXA0KKyBcblwNCisgICAgYW5zKDosOiwxLDIpID1cblwNCisgICAgICAw IDBcblwNCisgICAgICAwIDBcblwNCisgQGVuZCBncm91cFxuXA0KKyBAZW5k IGV4YW1wbGVcblwNCisgXG5cDQorIEBzZWVhbHNve2hvcnpjYXQgYW5kIHZl cnRjYXR9XG5cDQorIEBlbmQgZGVmdHlwZWZuIikNCisgew0KKyAgIHJldHVy biBkb19jYXQoYXJncyk7DQogIH0NCiAgDQogIHN0YXRpYyBvY3RhdmVfdmFs dWUNCg== ---559023410-851401618-1078063875=:21110 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="cat.liboctave.patch" Content-Transfer-Encoding: BASE64 Content-Description: Content-Disposition: attachment; filename="cat.liboctave.patch" SW5kZXg6IG14LWlubGluZXMuY2MNCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N ClJDUyBmaWxlOiAvY3ZzL29jdGF2ZS9saWJvY3RhdmUvbXgtaW5saW5lcy5j Yyx2DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMzENCmRpZmYgLWMgLXAgLXIx LjMxIG14LWlubGluZXMuY2MNCioqKiBteC1pbmxpbmVzLmNjCTIwMDQvMDIv MTYgMDU6MDc6MjMJMS4zMQ0KLS0tIG14LWlubGluZXMuY2MJMjAwNC8wMi8y OSAxMzozOTo0Ng0KKioqKioqKioqKioqKioqIE9QX0RVUF9GQ04gKGNvbmos IG14X2lubGluZV9jb25qX2R1cCwgQ28NCioqKiA2MDcsNjQwICoqKioNCiAg XA0KICAgIHJldHVybiByZXR2YWwNCiAgDQotICNkZWZpbmUgTVhfTkRfQ0FU IFwNCi0gIGJvb2wgcmV0dmFsID0gZmFsc2U7XA0KLSAgXA0KLSAgIGRpbV92 ZWN0b3IgZHYgPSByYV9hcmcuZGltcyAoKTsgXA0KLSAgXA0KLSAgICBBcnJh eTxpbnQ+IHJhX2lkeCAoZHYubGVuZ3RoICgpLCAwKTsgXA0KLSAgXA0KLSAg ICBmb3IgKGludCBpID0gMDsgaSA8IHJhX2FyZy5sZW5ndGggKCk7IGkrKykg XA0KLSAgICAgIHsgXA0KLSAgICAgICAgaWYgKGkgIT0gMCkgXA0KLSAJIGlu Y3JlbWVudF9pbmRleCAocmFfaWR4LCBkdiwgMCk7IFwNCi0gIFwNCi0gICAg ICAgIEFycmF5PGludD4gcmFfaWR4MiA9IHJhX2lkeDsgXA0KLSAgXA0KLSAg ICAgICAgaWYgKGRpbSA+PSByYV9pZHgyLmxlbmd0aCAoKSkgXA0KLSAJIHsg XA0KLSAJICAgcmFfaWR4Mi5yZXNpemVfYW5kX2ZpbGwgKGRpbSArIDEsIDAp OyBcDQotICBcDQotIAkgICByZXR2YWwgPSB0cnVlOyBcDQotIAkgfSBcDQot ICBcDQotICAgICAgICByYV9pZHgyLmVsZW0gKGRpbSkgPSByYV9pZHgyLmVs ZW0gKGRpbSkgKyBhZGRfZGltOyBcDQotICBcDQotICAgICAgICBlbGVtIChy YV9pZHgyKSA9ICByYV9hcmcuZWxlbSAocmFfaWR4KTsgXA0KLSAgICAgIH0g XA0KLSAgXA0KLSAgICByZXR1cm4gcmV0dmFsDQotIA0KICAjZW5kaWYNCiAg DQogIC8qDQotLS0gNjA3LDYxMiAtLS0tDQpJbmRleDogZE5EQXJyYXkuY2MN Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBmaWxlOiAvY3ZzL29jdGF2 ZS9saWJvY3RhdmUvZE5EQXJyYXkuY2Msdg0KcmV0cmlldmluZyByZXZpc2lv biAxLjE2DQpkaWZmIC1jIC1wIC1yMS4xNiBkTkRBcnJheS5jYw0KKioqIGRO REFycmF5LmNjCTIwMDQvMDIvMTcgMTU6MzI6MTMJMS4xNg0KLS0tIGROREFy cmF5LmNjCTIwMDQvMDIvMjkgMTM6Mzk6NDcNCioqKioqKioqKioqKioqKiBO REFycmF5OjpzdW0gKGludCBkaW0pIGNvbnN0DQoqKiogNjU2LDY2NiAqKioq DQogICAgTVhfTkRfUkVBTF9PUF9SRURVQ1RJT04gKCs9IGVsZW0gKGl0ZXJf aWR4KSwgMCk7DQogIH0NCiAgDQohIGJvb2wNCiEgTkRBcnJheTo6Y2F0IChj b25zdCBOREFycmF5JiByYV9hcmcsIGludCBkaW0sIGludCBhZGRfZGltKQ0K ICB7DQohICAgLy8gIE1YX05EX0NBVDsNCiEgICByZXR1cm4gOjpjYXRfcmEg KCp0aGlzLCByYV9hcmcsIGRpbSwgYWRkX2RpbSk7DQogIH0NCiAgDQogIE5E QXJyYXkNCi0tLSA2NTYsNjY1IC0tLS0NCiAgICBNWF9ORF9SRUFMX09QX1JF RFVDVElPTiAoKz0gZWxlbSAoaXRlcl9pZHgpLCAwKTsNCiAgfQ0KICANCiEg aW50DQohIE5EQXJyYXk6OmNhdCAoY29uc3QgTkRBcnJheSYgcmFfYXJnLCBp bnQgZGltLCBpbnQgaWlkeCwgaW50IG1vdmUpDQogIHsNCiEgICByZXR1cm4g OjpjYXRfcmEgKCp0aGlzLCByYV9hcmcsIGRpbSwgaWlkeCwgbW92ZSk7DQog IH0NCiAgDQogIE5EQXJyYXkNCkluZGV4OiBkTkRBcnJheS5oDQo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL2N2cy9vY3RhdmUvbGlib2N0 YXZlL2ROREFycmF5Lmgsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjEzDQpk aWZmIC1jIC1wIC1yMS4xMyBkTkRBcnJheS5oDQoqKiogZE5EQXJyYXkuaAky MDA0LzAyLzE2IDE5OjAyOjMyCTEuMTMNCi0tLSBkTkRBcnJheS5oCTIwMDQv MDIvMjkgMTM6Mzk6NDcNCioqKioqKioqKioqKioqKiBwdWJsaWM6DQoqKiog ODYsOTIgKioqKg0KICAgIE5EQXJyYXkgcHJvZCAoaW50IGRpbSA9IC0xKSBj b25zdDsNCiAgICBOREFycmF5IHN1bSAoaW50IGRpbSA9IC0xKSBjb25zdDsg IA0KICAgIE5EQXJyYXkgc3Vtc3EgKGludCBkaW0gPSAtMSkgY29uc3Q7DQoh ICAgYm9vbCBjYXQgKGNvbnN0IE5EQXJyYXkmIHJhX2FyZywgaW50IGRpbSwg aW50IGFkZF9kaW0pOw0KICAgICAgIA0KICAgIE5EQXJyYXkgYWJzICh2b2lk KSBjb25zdDsNCiAgDQotLS0gODYsOTIgLS0tLQ0KICAgIE5EQXJyYXkgcHJv ZCAoaW50IGRpbSA9IC0xKSBjb25zdDsNCiAgICBOREFycmF5IHN1bSAoaW50 IGRpbSA9IC0xKSBjb25zdDsgIA0KICAgIE5EQXJyYXkgc3Vtc3EgKGludCBk aW0gPSAtMSkgY29uc3Q7DQohICAgaW50IGNhdCAoY29uc3QgTkRBcnJheSYg cmFfYXJnLCBpbnQgZGltLCBpbnQgaWlkeCwgaW50IG1vdmUpOw0KICAgICAg IA0KICAgIE5EQXJyYXkgYWJzICh2b2lkKSBjb25zdDsNCiAgDQpJbmRleDog Y2hOREFycmF5LmgNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBmaWxl OiAvY3ZzL29jdGF2ZS9saWJvY3RhdmUvY2hOREFycmF5Lmgsdg0KcmV0cmll dmluZyByZXZpc2lvbiAxLjYNCmRpZmYgLWMgLXAgLXIxLjYgY2hOREFycmF5 LmgNCioqKiBjaE5EQXJyYXkuaAkyMDA0LzAyLzE2IDA1OjA3OjIzCTEuNg0K LS0tIGNoTkRBcnJheS5oCTIwMDQvMDIvMjkgMTM6Mzk6NDcNCioqKioqKioq KioqKioqKiBwdWJsaWM6DQoqKiogNzEsNzcgKioqKg0KICANCiAgICBib29s TkRBcnJheSBhbGwgKGludCBkaW0gPSAtMSkgY29uc3Q7DQogICAgYm9vbE5E QXJyYXkgYW55IChpbnQgZGltID0gLTEpIGNvbnN0Ow0KISAgIGJvb2wgY2F0 IChjb25zdCBjaGFyTkRBcnJheSYgcmFfYXJnLCBpbnQgZGltLCBpbnQgYWRk X2RpbSk7DQogICANCiAgICBjaGFyTWF0cml4IG1hdHJpeF92YWx1ZSAodm9p ZCkgY29uc3Q7DQogIA0KLS0tIDcxLDc3IC0tLS0NCiAgDQogICAgYm9vbE5E QXJyYXkgYWxsIChpbnQgZGltID0gLTEpIGNvbnN0Ow0KICAgIGJvb2xOREFy cmF5IGFueSAoaW50IGRpbSA9IC0xKSBjb25zdDsNCiEgICBpbnQgY2F0IChj b25zdCBjaGFyTkRBcnJheSYgcmFfYXJnLCBpbnQgZGltLCBpbnQgaWlkeCwg aW50IG1vdmUpOw0KICAgDQogICAgY2hhck1hdHJpeCBtYXRyaXhfdmFsdWUg KHZvaWQpIGNvbnN0Ow0KICANCkluZGV4OiBjaE5EQXJyYXkuY2MNCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0NClJDUyBmaWxlOiAvY3ZzL29jdGF2ZS9saWJv Y3RhdmUvY2hOREFycmF5LmNjLHYNCnJldHJpZXZpbmcgcmV2aXNpb24gMS45 DQpkaWZmIC1jIC1wIC1yMS45IGNoTkRBcnJheS5jYw0KKioqIGNoTkRBcnJh eS5jYwkyMDA0LzAyLzE2IDE2OjIyOjQzCTEuOQ0KLS0tIGNoTkRBcnJheS5j YwkyMDA0LzAyLzI5IDEzOjM5OjQ4DQoqKioqKioqKioqKioqKiogY2hhck5E QXJyYXk6OmFueSAoaW50IGRpbSkgY29uc3QNCioqKiA0OCw1NyAqKioqDQog ICAgTVhfTkRfQU5ZX0FMTF9SRURVQ1RJT04gKE1YX05EX0FOWV9FVkFMIChl bGVtIChpdGVyX2lkeCkgIT0gJyAnKSwgZmFsc2UpOw0KICB9DQogIA0KISBi b29sDQohIGNoYXJOREFycmF5OjpjYXQgKGNvbnN0IGNoYXJOREFycmF5JiBy YV9hcmcsIGludCBkaW0sIGludCBhZGRfZGltKQ0KICB7DQohICAgTVhfTkRf Q0FUOyAgDQogIH0NCiAgDQogIGNoYXJNYXRyaXgNCi0tLSA0OCw1NyAtLS0t DQogICAgTVhfTkRfQU5ZX0FMTF9SRURVQ1RJT04gKE1YX05EX0FOWV9FVkFM IChlbGVtIChpdGVyX2lkeCkgIT0gJyAnKSwgZmFsc2UpOw0KICB9DQogIA0K ISBpbnQNCiEgY2hhck5EQXJyYXk6OmNhdCAoY29uc3QgY2hhck5EQXJyYXkm IHJhX2FyZywgaW50IGRpbSwgaW50IGlpZHgsIGludCBtb3ZlKQ0KICB7DQoh ICAgcmV0dXJuIDo6Y2F0X3JhKCp0aGlzLCByYV9hcmcsIGRpbSwgaWlkeCwg bW92ZSk7ICANCiAgfQ0KICANCiAgY2hhck1hdHJpeA0KSW5kZXg6IENOREFy cmF5LmNjDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL2N2 cy9vY3RhdmUvbGlib2N0YXZlL0NOREFycmF5LmNjLHYNCnJldHJpZXZpbmcg cmV2aXNpb24gMS4xNg0KZGlmZiAtYyAtcCAtcjEuMTYgQ05EQXJyYXkuY2MN CioqKiBDTkRBcnJheS5jYwkyMDA0LzAyLzE3IDE1OjMyOjEzCTEuMTYNCi0t LSBDTkRBcnJheS5jYwkyMDA0LzAyLzI5IDEzOjM5OjQ5DQoqKioqKioqKioq KioqKiogQ29tcGxleE5EQXJyYXk6OnN1bSAoaW50IGRpbSkgY29uc3QNCioq KiA2NzcsNjg2ICoqKioNCiAgICBNWF9ORF9DT01QTEVYX09QX1JFRFVDVElP TiAoKz0gZWxlbSAoaXRlcl9pZHgpLCBDb21wbGV4ICgwLCAwKSk7DQogIH0N CiAgDQohIGJvb2wNCiEgQ29tcGxleE5EQXJyYXk6OmNhdCAoY29uc3QgQ29t cGxleE5EQXJyYXkmIHJhX2FyZywgaW50IGRpbSwgaW50IGFkZF9kaW0pDQog IHsNCiEgICBNWF9ORF9DQVQ7DQogIH0NCiAgDQogIE5EQXJyYXkNCi0tLSA2 NzcsNjg2IC0tLS0NCiAgICBNWF9ORF9DT01QTEVYX09QX1JFRFVDVElPTiAo Kz0gZWxlbSAoaXRlcl9pZHgpLCBDb21wbGV4ICgwLCAwKSk7DQogIH0NCiAg DQohIGludA0KISBDb21wbGV4TkRBcnJheTo6Y2F0IChjb25zdCBDb21wbGV4 TkRBcnJheSYgcmFfYXJnLCBpbnQgZGltLCBpbnQgaWlkeCwgaW50IG1vdmUp DQogIHsNCiEgICByZXR1cm4gOjpjYXRfcmEoKnRoaXMsIHJhX2FyZywgZGlt LCBpaWR4LCBtb3ZlKTsNCiAgfQ0KICANCiAgTkRBcnJheQ0KSW5kZXg6IENO REFycmF5LmgNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBmaWxlOiAv Y3ZzL29jdGF2ZS9saWJvY3RhdmUvQ05EQXJyYXkuaCx2DQpyZXRyaWV2aW5n IHJldmlzaW9uIDEuMTMNCmRpZmYgLWMgLXAgLXIxLjEzIENOREFycmF5LmgN CioqKiBDTkRBcnJheS5oCTIwMDQvMDIvMTYgMTk6MDI6MzIJMS4xMw0KLS0t IENOREFycmF5LmgJMjAwNC8wMi8yOSAxMzozOTo0OQ0KKioqKioqKioqKioq KioqIHB1YmxpYzoNCioqKiA4Nyw5MyAqKioqDQogICAgQ29tcGxleE5EQXJy YXkgcHJvZCAoaW50IGRpbSA9IC0xKSBjb25zdDsNCiAgICBDb21wbGV4TkRB cnJheSBzdW0gKGludCBkaW0gPSAtMSkgY29uc3Q7DQogICAgQ29tcGxleE5E QXJyYXkgc3Vtc3EgKGludCBkaW0gPSAtMSkgY29uc3Q7DQohICAgYm9vbCBj YXQgKGNvbnN0IENvbXBsZXhOREFycmF5JiByYV9hcmcsIGludCBkaW0sIGlu dCBhZGRfZGltKTsNCiAgDQogICAgQ29tcGxleE5EQXJyYXkmIGluc2VydCAo Y29uc3QgTkRBcnJheSYgYSwgaW50IHIsIGludCBjKTsNCiAgICBDb21wbGV4 TkRBcnJheSYgaW5zZXJ0IChjb25zdCBDb21wbGV4TkRBcnJheSYgYSwgaW50 IHIsIGludCBjKTsNCi0tLSA4Nyw5MyAtLS0tDQogICAgQ29tcGxleE5EQXJy YXkgcHJvZCAoaW50IGRpbSA9IC0xKSBjb25zdDsNCiAgICBDb21wbGV4TkRB cnJheSBzdW0gKGludCBkaW0gPSAtMSkgY29uc3Q7DQogICAgQ29tcGxleE5E QXJyYXkgc3Vtc3EgKGludCBkaW0gPSAtMSkgY29uc3Q7DQohICAgaW50IGNh dCAoY29uc3QgQ29tcGxleE5EQXJyYXkmIHJhX2FyZywgaW50IGRpbSwgaW50 IGlpZHgsIGludCBtb3ZlKTsNCiAgDQogICAgQ29tcGxleE5EQXJyYXkmIGlu c2VydCAoY29uc3QgTkRBcnJheSYgYSwgaW50IHIsIGludCBjKTsNCiAgICBD b21wbGV4TkRBcnJheSYgaW5zZXJ0IChjb25zdCBDb21wbGV4TkRBcnJheSYg YSwgaW50IHIsIGludCBjKTsNCkluZGV4OiBBcnJheS5oDQo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09DQpSQ1MgZmlsZTogL2N2cy9vY3RhdmUvbGlib2N0YXZl L0FycmF5Lmgsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjg1DQpkaWZmIC1j IC1wIC1yMS44NSBBcnJheS5oDQoqKiogQXJyYXkuaAkyMDA0LzAyLzE4IDEy OjUyOjIwCTEuODUNCi0tLSBBcnJheS5oCTIwMDQvMDIvMjkgMTM6Mzk6NTAN CioqKioqKioqKioqKioqKiBwdWJsaWM6DQoqKiogNTI2LDUzMyAqKioqDQog IC8vIGRvIHRoYXQgYmVjYXVzZSBvZiBidWdzIGluIGdjYyBwcmlvciB0byAz LjMuDQogIA0KICB0ZW1wbGF0ZSA8Y2xhc3MgVD4NCiEgYm9vbCANCiEgY2F0 X3JhIChBcnJheTxUPiYgcmFfY2F0LCBjb25zdCBBcnJheTxUPiYgcmFfYXJn LCBpbnQgZGltLCBpbnQgYWRkX2RpbSk7DQogIA0KICB0ZW1wbGF0ZSA8Y2xh c3MgTFQsIGNsYXNzIFJUPg0KICAvKiBmcmllbmQgKi8gaW50DQotLS0gNTI2 LDUzMyAtLS0tDQogIC8vIGRvIHRoYXQgYmVjYXVzZSBvZiBidWdzIGluIGdj YyBwcmlvciB0byAzLjMuDQogIA0KICB0ZW1wbGF0ZSA8Y2xhc3MgVD4NCiEg aW50IA0KISBjYXRfcmEgKEFycmF5PFQ+JiByYSwgY29uc3QgQXJyYXk8VD4m IHJhX2FyZywgaW50IGRpbSwgaW50IGlkeCwgaW50IG1vdmUpOw0KICANCiAg dGVtcGxhdGUgPGNsYXNzIExULCBjbGFzcyBSVD4NCiAgLyogZnJpZW5kICov IGludA0KKioqKioqKioqKioqKioqIGFzc2lnbiAoQXJyYXk8TFQ+JiBsaHMs IGNvbnN0IEFycmF5PFJUPiYNCioqKiA1NjUsNTcyICoqKioNCiAgICB0ZW1w bGF0ZSBUIHJlc2l6ZV9maWxsX3ZhbHVlIChjb25zdCBUJik7IFwNCiAgDQog ICNkZWZpbmUgSU5TVEFOVElBVEVfQ0FUKFQpIFwNCiEgICB0ZW1wbGF0ZSBi b29sIGNhdF9yYSAoQXJyYXk8VD4mIHJhX2NhdCwgY29uc3QgQXJyYXk8VD4m IHJhX2FyZywgXA0KISAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlt LCBpbnQgYWRkX2RpbSkNCiAgDQogICNkZWZpbmUgSU5TVEFOVElBVEVfQVJS QVlfQU5EX0FTU0lHTihUKSBcDQogICAgSU5TVEFOVElBVEVfQVJSQVkgKFQp OyBcDQotLS0gNTY1LDU3MiAtLS0tDQogICAgdGVtcGxhdGUgVCByZXNpemVf ZmlsbF92YWx1ZSAoY29uc3QgVCYpOyBcDQogIA0KICAjZGVmaW5lIElOU1RB TlRJQVRFX0NBVChUKSBcDQohICAgdGVtcGxhdGUgaW50IGNhdF9yYSAoQXJy YXk8VD4mIHJhLCBjb25zdCBBcnJheTxUPiYgcmFfYXJnLCBcDQohICAgICAg ICAgICAgICAgICAgICAgICAgIGludCBkaW0sIGludCBpZHgsIGludCBtb3Zl KQ0KICANCiAgI2RlZmluZSBJTlNUQU5USUFURV9BUlJBWV9BTkRfQVNTSUdO KFQpIFwNCiAgICBJTlNUQU5USUFURV9BUlJBWSAoVCk7IFwNCkluZGV4OiBB cnJheS5jYw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC9j dnMvb2N0YXZlL2xpYm9jdGF2ZS9BcnJheS5jYyx2DQpyZXRyaWV2aW5nIHJl dmlzaW9uIDEuMTA2DQpkaWZmIC1jIC1wIC1yMS4xMDYgQXJyYXkuY2MNCioq KiBBcnJheS5jYwkyMDA0LzAyLzIzIDE1OjM1OjAwCTEuMTA2DQotLS0gQXJy YXkuY2MJMjAwNC8wMi8yOSAxMzozOTo1Mw0KKioqKioqKioqKioqKioqIGFz c2lnbk4gKEFycmF5PExUPiYgbGhzLCBjb25zdCBBcnJheTxSVD4NCioqKiAz MDY2LDMxMDAgKioqKg0KICB9DQogIA0KICB0ZW1wbGF0ZSA8Y2xhc3MgVD4N CiEgYm9vbA0KISBjYXRfcmEgKEFycmF5PFQ+JiByYV9jYXQsIGNvbnN0IEFy cmF5PFQ+JiByYV9hcmcsIGludCBkaW0sIGludCBhZGRfZGltKQ0KICB7DQoh ICAgYm9vbCByZXR2YWwgPSBmYWxzZTsNCiEgDQohICAgZGltX3ZlY3RvciBk diA9IHJhX2FyZy5kaW1zICgpOw0KISANCiEgICBBcnJheTxpbnQ+IHJhX2lk eCAoZHYubGVuZ3RoICgpLCAwKTsNCiEgDQohICAgZm9yIChpbnQgaSA9IDA7 IGkgPCByYV9hcmcubGVuZ3RoICgpOyBpKyspDQohICAgICB7DQohICAgICAg IGlmIChpICE9IDApDQohIAlpbmNyZW1lbnRfaW5kZXggKHJhX2lkeCwgZHYp Ow0KISANCiEgICAgICAgQXJyYXk8aW50PiByYV9pZHgyID0gcmFfaWR4Ow0K ISANCiEgICAgICAgaWYgKGRpbSA+PSByYV9pZHgyLmxlbmd0aCAoKSkNCiEg CXsNCiEgCSAgcmFfaWR4Mi5yZXNpemVfYW5kX2ZpbGwgKGRpbSArIDEsIDAp Ow0KISANCiEgCSAgcmV0dmFsID0gdHJ1ZTsNCiEgCX0NCiEgDQohICAgICAg IHJhX2lkeDIoZGltKSA9IHJhX2lkeDIoZGltKSArIGFkZF9kaW07DQohIA0K ISAgICAgICByYV9jYXQocmFfaWR4MikgPSByYV9hcmcocmFfaWR4KTsNCiAg ICAgIH0NCiEgDQohICAgcmV0dXJuIHJldHZhbDsNCiAgfQ0KICANCiAgdGVt cGxhdGUgPGNsYXNzIFQ+DQotLS0gMzA2NiwzMDkzIC0tLS0NCiAgfQ0KICAN CiAgdGVtcGxhdGUgPGNsYXNzIFQ+DQohIGludA0KISBjYXRfcmEgKEFycmF5 PFQ+JiByYSwgY29uc3QgQXJyYXk8VD4mIHJhX2FyZywgaW50IGRpbSwgaW50 IGlkeCwgaW50IG1vdmUpDQogIHsNCiEgICBkaW1fdmVjdG9yIGR2X2FyZyA9 IHJhX2FyZy5kaW1zICgpOyANCiEgICANCiEgICBjb25zdCBUICphcmdfZGF0 YSA9IHJhX2FyZy5kYXRhICgpOw0KISAgIA0KISAgIGludCBudW1lbF90b19t b3ZlID0gZHZfYXJnKDApOw0KISANCiEgICBpbnQgbnVtZWxfYXJnID0gZHZf YXJnLmxlbmd0aCAoKTsNCiEgDQohICAgaW50IGlpX2xpbWl0ID0gZGltKzEg PiBudW1lbF9hcmcgPyBudW1lbF9hcmcgOiBkaW0gKyAxOw0KISAgIA0KISAg IGZvciAoaW50IGlpID0gMTsgaWkgPCBpaV9saW1pdDsgaWkrKykNCiEgICAg IG51bWVsX3RvX21vdmUgKj0gZHZfYXJnKGlpKTsNCiEgDQohICAgZm9yIChp bnQgaiA9IDA7IGogPCBudW1lbF90b19tb3ZlOyBqKyspDQohICAgICB7IA0K ISAgICAgICByYS5lbGVtIChpZHgrKykgPSBhcmdfZGF0YVtudW1lbF90b19t b3ZlICogbW92ZSArIGpdOw0KICAgICAgfQ0KISAgIA0KISAgIHJldHVybiBp ZHg7DQogIH0NCiAgDQogIHRlbXBsYXRlIDxjbGFzcyBUPg0K ---559023410-851401618-1078063875=:21110--