[ruby-core:105686] [Ruby master Feature#18020] Introduce `IO::Buffer` for fiber scheduler.
From:
"ioquatix (Samuel Williams)" <noreply@...>
Date:
2021-10-20 00:50:54 UTC
List:
ruby-core #105686
SXNzdWUgIzE4MDIwIGhhcyBiZWVuIHVwZGF0ZWQgYnkgaW9xdWF0aXggKFNhbXVlbCBXaWxsaWFt cykuCgoKPiBJbiB0aGUgZGVzY3JpcHRpb24ncyBjb2RlLCB0aGVyZSBpcyBsb2NrIGFuZCB1bmxv Y2suIEFyZSB0aG9zZSBzdXBwb3NlZCB0byBiZSB0aHJlYWQtc2FmZT8gSWYgeWVzIEkgdGhpbmsg eW91J2QgbmVlZCB0byBzeW5jaHJvbml6ZSBpbiBhbG1vc3QgZXZlcnkgbWV0aG9kLCBpZiBpdCdz IHBvc3NpYmxlIHRvIGFjY2VzcyB0aGUgYnVmZmVyIHdpdGhvdXQgR1ZMLgoKTm8sIGluc3RhbmNl cyBvZiB0aGlzIGNsYXNzIHNob3VsZCBub3QgYmUgc2hhcmVkIGJldHdlZW4gdGhyZWFkcy4gSG93 ZXZlciwgdGhlcmUgd291bGQgYmUgc29tZSBjYXNlcyB3aGVyZSB0aGlzIG1pZ2h0IGJlIG9rYXks IGUuZy4gaWYgdGhlIGJ1ZmZlciBpcyBpbW11dGFibGUuIFdlIGRlZmluaXRlbHkgd2FudCB0byBh dm9pZCBhbnkga2luZCBvZiBzeW5jaHJvbmlzYXRpb24gb3ZlcmhlYWRzIGZvciBwZXJmb3JtYW5j ZSByZWFzb25zLgoKPiBJIHRoaW5rIGl0J3MgYmV0dGVyIHRvIG9ubHkgYWxsb3cgImxvY2siIG9u IGNyZWF0aW9uLCB0byB0aGVyZSBpcyBubyBkeW5hbWljIGxvY2sgb3IgdW5sb2NrLCB3aGljaCBt YWtlcyBldmVyeXRoaW5nIG1vcmUgY29tcGxleC4KCkEgYnVmZmVyIGNhbiBiZSB1c2VkIGFjcm9z cyBtdWx0aXBsZSBJL08gb3BlcmF0aW9ucyBuZWNlc3NpdGF0aW5nIGxvY2tpbmcgYW5kIHVubG9j a2luZywgbm90IHVubGlrZSB0aGUgYWxyZWFkeSBleGlzdGluZyBpbXBsZW1lbnRhdGlvbiBvbiBg U3RyaW5nYC4gVGhlIHJlYXNvbiBmb3IgdGhpcyBjb21wbGV4aXR5IGlzIHRvIHByZXZlbnQgdXNl ciBlcnJvciBhbmQgdG8gbW9kZWwgdGhlIGZhY3QgdGhhdCB0aGUgT1MgY2FuIHVzZSBhIGJ1ZmZl ciB3aGljaCBtYXkgYmUgZm9yIGEgZHVyYXRpb24gb2YgdGltZSBvdXRzaWRlIG9mIHRoZSBHVkwg YW5kIGl0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aGlsZSBpbiB1c2UgYnkgdGhlIE9TLgoKQWRk aXRpb25hbGx5LCBJJ2QgYXJndWUgdGhhdCBgU3RyaW5nYCBpbXBsZW1lbnRhdGlvbiBpcyB3YXkg bW9yZSBjb21wbGV4IGFuZCBwb29ybHkgdW5kZXJzdG9vZC9kb2N1bWVudGVkLCBhbmQgc28gZmFy IHdlIHNlZW0gaGFwcHkgZm9yIHRoYXQ/IFRoZXJlIGFyZSBkZWZpbml0ZWx5IHNvbWUgdmVyeSBv ZGQgZWRnZSBjYXNlcyB3aGVuIHVzaW5nIFN0cmluZ3MgYXMgYnVmZmVycywgc29tZSBvZiB3aGlj aCBJIGFscmVhZHkgcmVwb3J0ZWQgYW5kIGZpeGVkIGFzIHBvdGVudGlhbCBzZWN1cml0eSBpc3N1 ZXMsIGJvdGggaW4gQ1J1YnkgYW5kIG9uZSBvZiBKUnVieS9UcnVmZmxlUnVieS4KCj4gSW4gZmFj dCwgZG8gd2UgZXZlbiBuZWVkIHJlc2l6YWJsZSBidWZmZXJzPyBJTUhPIHVzaW5nIGFub3RoZXIg YnVmZmVyIHNlZW1zIG11Y2ggY2xlYW5lciBpZiBvbmUgbmVlZHMgdG8gZ3JvdyBpdC4KCkNlbGx1 bG9pZCBpbnRyb2R1Y2VkIGZpeGVkIHNpemUgYnVmZmVycyBhbmQgaXQgd2FzIHZlcnkgaGFyZCB0 byB1c2UgY29ycmVjdGx5LiBJbiB0aGUgZW5kLCBJIGNvdWxkbid0IGV2ZW4gdXNlIGl0IGluIGFz eW5jIGJlY2F1c2UgaXQgd2FzIHNvIGltcHJhY3RpY2FsLiBTbyB5ZXMsIHJlc2l6YWJsZSBidWZm ZXJzIGFyZSBhYnNvbHV0ZWx5IG5lZWRlZCBhbmQgY2FuIGJlIGVmZmljaWVudGx5IGltcGxlbWVu dGVkLCBlaXRoZXIgYnkgbWVtb3J5IG1hcHBpbmcgb3IgY29weWluZyBpbiB0aGUgd29yc3QgY2Fz ZS4gSWYgeW91IGRvbid0IGltcGxlbWVudCB0aGlzLCB0aGUgdXNlciBlbmRzIHVwIGhhdmluZyB0 byBkbyBpdCBieSBoYW5kID0gbW9yZSBidWdzICYgbGVzcyBwZXJmb3JtYW5jZS4KCj4gVGhlIG5l dyBpbnRlcmZhY2UgZmVlbHMgcmVhbGx5IGJpZyBhbmQgaGFyZCB0byB1bmRlcnN0YW5kIGl0IGFz IGEgd2hvbGUuCgpCYXNlZCBvbiBteSBleHBlcmllbmNlIG9mIGBpby5jYCBhbmQgYHN0cmluZy5j YCBJIGNvbXBsZXRlbHkgZGlzYWdyZWUgd2l0aCB0aGlzIGFzc2VydGlvbi4gSSBmZWVsIHRoYXQg dGhpcyBpcyBhIGZhciBzaW1wbGVyLCB3ZWxsIGFic3RyYWN0ZWQsIGlzb2xhdGVkLCByb2J1c3Qg aW50ZXJmYWNlIGZvciBkZWFsaW5nIHdpdGggYmluYXJ5IGRhdGEgaW4gY29uanVuY3Rpb24gd2l0 aCBJTyBpbiBjb21wYXJpc29uIHRvIHdoYXQgd2UgYWxyZWFkeSBoYXZlLiBJIGxpdGVyYWxseSBz cGVudCBsaWtlIGEgbW9udGggdHJ5aW5nIHRvIHJldHJvZml0IHRoZSBhZm9yZW1lbnRpb25lZCBj b2RlIGJ1dCBpdCB3YXMgbGlrZSBhIGEgaG91c2Ugb2YgY2FyZHMuIE1vdmUgb25lIHRoaW5nIGFu ZCB0aGUgZW50aXJlIHRoaW5nIGNvbGxhcHNlcy4gVW5mb3J0dW5hdGVseSB0aGUgUnVieSBgSU9g ICYgYFN0cmluZ2AgY2xhc3MgaXMgcmVhbGx5IG92ZXJsb2FkZWQgYW5kIGhhcyBiZWNvbWUgYSBz aWduaWZpY2FudCBidXJkZW4gdG8gaW1wbGVtZW50aW5nIHByZWRpY3RhYmxlLCBlZmZpY2llbnQg YW5kIHJvYnVzdCBuZXR3b3JrIHByb3RvY29scy4KClRoZSBmdWxsIGltcGxlbWVudGF0aW9uIGlz IGdpdmVuLCBpbmNsdWRpbmcgdGhlIGV4YW1wbGUgdXNhZ2UsIHRlc3RzLCBhbmQgYWxzbyB0aGUg aW1wbGVtZW50YXRpb24gb2YgdGhlIHNjaGVkdWxlciBob29rcy4gQWRkaXRpb25hbGx5LCBhIGZ1 bGwgY29uc3VtZXIgaW1wbGVtZW50YXRpb24gaW4gdGhlIEV2ZW50IGdlbSBpcyBnaXZlbjogaHR0 cHM6Ly9naXRodWIuY29tL3NvY2tldHJ5L2V2ZW50L2Jsb2IvbWFzdGVyL2V4dC9ldmVudC9zZWxl Y3Rvci91cmluZy5jI0wzNTktTDQ1OQoKSWYgeW91IHRoaW5rIHRoZXJlIGlzIHNvbWV0aGluZyB3 cm9uZyB3aXRoIHRoaXMgaW1wbGVtZW50YXRpb24gb3IgdGhhdCBpdCBjYW4gYmUgZ3JlYXRseSBz aW1wbGlmaWVkLCBwbGVhc2UgcHJvcG9zZSBzcGVjaWZpYyBjaGFuZ2VzIHRvIHRoZSBpbXBsZW1l bnRhdGlvbiB0aGF0IGFjaGlldmUgdGhpcyBhbmQgc3RpbGwgbWFpbnRhaW4gc2FmZXR5LCBlZmZp Y2llbmN5LCBwZXJmb3JtYW5jZSwgZXRjLiBJIHdlbGNvbWUgYW55IHN1Y2ggY2hhbmdlcyBhbmQg d291bGQgYmUgbW9zdCBncmF0ZWZ1bCBmb3IgeW91ciBpbnNpZ2h0cyBvbiBzdWNoIGltcHJvdmVt ZW50cy4gWW91J3ZlIGdvdCBhIGZ1bGwgZW5kLXRvIGVuZCBQUiB0byB3b3JrIHdpdGgsIHRoZXJl IGlzIG5vdGhpbmcgbWlzc2luZyBvciB0aGVvcmV0aWNhbCBoZXJlLgoKLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpGZWF0dXJlICMxODAyMDogSW50cm9kdWNlIGBJTzo6 QnVmZmVyYCBmb3IgZmliZXIgc2NoZWR1bGVyLgpodHRwczovL2J1Z3MucnVieS1sYW5nLm9yZy9p c3N1ZXMvMTgwMjAjY2hhbmdlLTk0MTg2CgoqIEF1dGhvcjogaW9xdWF0aXggKFNhbXVlbCBXaWxs aWFtcykKKiBTdGF0dXM6IE9wZW4KKiBQcmlvcml0eTogTm9ybWFsCi0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQWZ0ZXIgY29udGludWluZyB0byBidWlsZCBvdXQgdGhl IGZpYmVyIHNjaGVkdWxlciBpbnRlcmZhY2UgYW5kIHRoZSBzcGVjaWZpYyBob29rcyByZXF1aXJl ZCBmb3IgYGlvX3VyaW5nYCwgSSBmb3VuZCBzb21lIHRyb3VibGUgd2l0aGluIHRoZSBpbXBsZW1l bnRhdGlvbiBvZiBgSU9gLgoKSSBmb3VuZCB0aGF0IGluIHNvbWUgY2FzZXMsIHdlIG5lZWQgdG8g cmVhZCBpbnRvIHRoZSBpbnRlcm5hbCBJTyBidWZmZXJzIGRpcmVjdGx5LiBJIHRyaWVkIGNyZWF0 aW5nIGEgImZha2Ugc3RyaW5nIiBpbiBvcmRlciB0byB0cmFuc2l0IGJhY2sgaW50byB0aGUgUnVi eSBmaWJlciBzY2hlZHVsZXIgaW50ZXJmYWNlIGFuZCB0aGlzIGRpZCB3b3JrIHRvIGEgY2VydGFp biBleHRlbnQsIGJ1dCBJIHdhcyB0b2xkIHdlIGNhbm5vdCBleHBvc2UgZmFrZSBzdHJpbmcgdG8g UnVieSBzY2hlZHVsZXIgaW50ZXJmYWNlLgoKU28sIGFmdGVyIHRoaXMsIGFuZCBtYW55IG90aGVy IGZydXN0cmF0aW9ucyB3aXRoIHVzaW5nIGBTdHJpbmdgIGFzIGEgSU8gYnVmZmVyLCBJIGRlY2lk ZWQgdG8gaW1wbGVtZW50IGEgbG93IGxldmVsIGBJTzo6QnVmZmVyYCBiYXNlZCBvbiBteSBuZWVk cyBmb3IgaGlnaCBwZXJmb3JtYW5jZSBJTywgYW5kIGFzIHBhcnQgb2YgdGhlIGZpYmVyIHNjaGVk dWxlciBpbnRlcmZhY2UuCgpIZXJlIGlzIHJvdWdobHkgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRl ZCBieSB0aGUgc2NoZWR1bGVyIHcuci50LiB0aGUgYnVmZmVyOgoKYGBgcnVieQpjbGFzcyBTY2hl ZHVsZXIKICAjIEBwYXJhbWV0ZXIgYnVmZmVyIFtJTzo6QnVmZmVyXSBCdWZmZXIgZm9yIHJlYWRp bmcgaW50by4KICBkZWYgaW9fcmVhZChpbywgYnVmZmVyLCBsZW5ndGgpCiAgICAjIGltcGxlbWVu dGF0aW9uIHByb3ZpZGVkIGJ5IGByZWFkYCBzeXN0ZW0gY2FsbCwgSU9fVVJJTkdfUkVBRFYsIGV0 Yy4KICBlbmQKCiAgIyBAcGFyYW1ldGVyIGJ1ZmZlciBbSU86OkJ1ZmZlcl0gQnVmZmVyIGZvciB3 cml0aW5nIGZyb20uCiAgZGVmIGlvX3dyaXRlKGlvLCBidWZmZXIsIGxlbmd0aCkKICAgICMgaW1w bGVtZW50YXRpb24gcHJvdmlkZWQgYnkgYHdyaXRlYCBzeXN0ZW0gY2FsbCwgSU9fVVJJTkdfV1JJ VEVWLCBldGMuCiAgZW5kCgogICMgUG90ZW50aWFsIG5ldyBob29rcyAoU29ja2V0I3JlY3Ztc2cs IHNlbmRtc2csIGV0Yyk6CiAgZGVmIGlvX3JlY3Ztc2coaW8sIGJ1ZmZlciwgbGVuZ3RoKQogIGVu ZAplbmQKYGBgCgpJbiByZXZpZXdpbmcgb3RoZXIgbGFuZ3VhZ2UgZGVzaWducywgSSBmb3VuZCB0 aGF0IHRoaXMgZGVzaWduIGlzIHZlcnkgc2ltaWxhciB0byBDcnlzdGFsJ3MgSU8gYnVmZmVyaW5n IHN0cmF0ZWd5LgoKVGhlIHByb3Bvc2VkIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGVub3VnaCBv ZiBhbiBpbnRlcmZhY2UgdG8gaW1wbGVtZW50IGJvdGggbmF0aXZlIHNjaGVkdWxlcnMgYXMgd2Vs bCBhcyBwdXJlIFJ1Ynkgc2NoZWR1bGVycy4gSXQgYWxzbyBwcm92aWRlcyBzb21lIGV4dHJhIGZ1 bmN0aW9uYWxpdHkgZm9yIGludGVycHJldGluZyB0aGUgZGF0YSBpbiB0aGUgYnVmZmVyLiBUaGlz IGlzIG1vc3RseSBmb3IgdGVzdGluZyBhbmQgZXhwZXJpbWVudGF0aW9uLCBhbHRob3VnaCBpdCBt aWdodCBtYWtlIHNlbnNlIHRvIGV4cG9zZSB0aGlzIGludGVyZmFjZSBmb3IgYmluYXJ5IHByb3Rv Y29scyBsaWtlIEhUVFAvMiwgUVVJQywgV2ViU29ja2V0cywgZXRjLgoKIyMgUHJvcG9zZWQgU29s dXRpb24KCldlIGludHJvZHVjZSBuZXcgY2xhc3MgYElPOjpCdWZmZXJgLgoKYGBgcnVieQpjbGFz cyBJTzo6QnVmZmVyCiAgIyBAcmV0dXJucyBbSU86OkJ1ZmZlcl0gQSBidWZmZXIgd2l0aCB0aGUg Y29udGVudHMgb2YgdGhlIHN0cmluZyBkYXRhLgogIGRlZiBzZWxmLmZvcihzdHJpbmcpCiAgZW5k CgogIFBBR0VfU0laRSA9ICMgLi4uIG9wZXJhdGluZyBzeXN0ZW0gcGFnZSBzaXplCgogICMgQHJl dHVybnMgW0lPOjpCdWZmZXJdIEEgYnVmZmVyIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxl IG1hcHBlZCB0byBtZW1vcnkuCiAgZGVmIHNlbGYubWFwKGZpbGUpCiAgZW5kCgogICMgRmxhZ3Mg Zm9yIGJ1ZmZlciBzdGF0ZS4KICBFWFRFUk5BTCA9ICMgVGhlIGJ1ZmZlciBpcyBmcm9tIGV4dGVy bmFsIG1lbW9yeS4KICBJTlRFUk5BTCA9ICMgVGhlIGJ1ZmZlciBpcyBmcm9tIGludGVybmFsIG1l bW9yeSAobWFsbG9jKS4KICBNQVBQRUQgPSAjIFRoZSBidWZmZXIgaXMgZnJvbSBtYXBwZWQgbWVt b3J5IChtbWFwLCBWaXJ0dWFsQWxsb2MsIGV0YykKICBMT0NLRUQgPSAjIFRoZSBidWZmZXIgaXMg bG9ja2VkIGZvciB1c2FnZSAoY2Fubm90IGJlIHJlc2l6ZWQpCiAgUFJJVkFURSA9ICMgVGhlIGJ1 ZmZlciBpcyBtYXBwZWQgYXMgY29weS1vbi13cml0ZS4KICBJTU1VVEFCTEUgPSAjIFRoZSBidWZm ZXIgY2Fubm90IGJlIG1vZGlmaWVkLgoKICAjIEByZXR1cm5zIFtJTzo6QnVmZmVyXSBBIGJ1ZmZl ciB3aXRoIHRoZSBzcGVjaWZpZWQgc2l6ZSwgYWxsb2NhdGVkIGFjY29yZGluZyB0byB0aGUgZ2l2 ZW4gZmxhZ3MuCiAgZGVmIGluaXRpYWxpemUoc2l6ZSwgZmxhZ3MpCiAgZW5kCgogICMgQHJldHVy bnMgW0ludGVncmFsXSBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyCiAgYXR0ciA6c2l6ZQoKICAjIEBy ZXR1cm5zIFtTdHJpbmddIEEgYnJpZWYgc3VtbWFyeSBhbmQgaGV4IGR1bXAgb2YgdGhlIGJ1ZmZl ci4KICBkZWYgaW5zcGVjdAogIGVuZAoKICAjIEByZXR1cm5zIFtTdHJpbmddIEEgYnJpZWYgc3Vt bWFyeSBvZiB0aGUgYnVmZmVyLgogIGRlZiB0b19zCiAgZW5kCgogICMgRmxhZyBwcmVkaWNhdGVz OgogIGRlZiBleHRlcm5hbD8KICBlbmQKCiAgZGVmIGludGVybmFsPwogIGVuZAoKICBkZWYgbWFw cGVkPwogIGVuZAoKICBkZWYgbG9ja2VkPwogIGVuZAoKICBkZWYgaW1tdXRhYmxlPwogIGVuZAoK ICAjIEZsYWdzIGZvciBlbmRpYW4vYnl0ZSBvcmRlcjoKICBMSVRUTEVfRU5ESUFOID0gIyAuLi4K ICBCSUdfRU5ESUFOID0gIyAuLi4KICBIT1NUX0VORElBTiA9ICMgLi4uCiAgTkVUV09SS19FTkRJ QU49ICMgLi4uCgogICMgTG9jayB0aGUgYnVmZmVyIChwcmV2ZW50IHJlc2l6ZSwgdW5tYXAsIGNo YW5nZXMgdG8gYmFzZSBhbmQgc2l6ZSkuCiAgZGVmIGxvY2sKICAgIHJhaXNlICJBbHJlYWR5IGxv Y2tlZCEiIGlmIGZsYWdzICYgTE9DS0VECiAgICAKICAgIGZsYWdzIHw9IExPQ0tFRAogIGVuZAoK ICAjIFVubG9jayB0aGUgYnVmZmVyLgogIGRlZiB1bmxvY2sKICAgIHJhaXNlICJOb3QgbG9ja2Vk ISIgdW5sZXNzIGZsYWdzICYgTE9DS0VECiAgICAKICAgIGZsYWdzIHw9IH5MT0NLRUQKICBlbmQK CiAgLy8gTWFuaXB1bGF0aW9uOgogICMgQHJldHVybnMgW0lPOjpCdWZmZXJdIEEgc2xpY2Ugb2Yg dGhlIGJ1ZmZlcidzIGRhdGEuIERvZXMgbm90IGNvcHkuCiAgZGVmIHNsaWNlKG9mZnNldCwgbGVu Z3RoKQogIGVuZAoKICAjIEByZXR1cm5zIFtTdHJpbmddIEEgYmluYXJ5IHN0cmluZyBzdGFydGlu ZyBhdCBvZmZzZXQsIGxlbmd0aCBieXRlcy4KICBkZWYgdG9fc3RyKG9mZnNldCwgbGVuZ3RoKQog IGVuZAoKICAjIENvcHkgdGhlIHNwZWNpZmllZCBzdHJpbmcgaW50byB0aGUgYnVmZmVyIGF0IHRo ZSBnaXZlbiBvZmZzZXQuCiAgZGVmIGNvcHkoc3RyaW5nLCBvZmZzZXQpCiAgZW5kCgogICMgQ29t cGFyZSB0d28gYnVmZmVycy4KICBkZWYgPD0+KG90aGVyKQogIGVuZAoKICBpbmNsdWRlIENvbXBh cmFibGUKCiAgIyBSZXNpemUgdGhlIGJ1ZmZlciwgcHJlc2VydmluZyB0aGUgZ2l2ZW4gbGVuZ3Ro IChpZiBub24temVybykuCiAgZGVmIHJlc2l6ZShzaXplLCBwcmVzZXJ2ZSA9IDApCiAgZW5kCgog ICMgQ2xlYXIgdGhlIGJ1ZmZlciB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgogIGRlZiBjbGVhcih2 YWx1ZSA9IDAsIG9mZnNldCA9IDAsIGxlbmd0aCA9IChAc2l6ZSAtIG9mZnNldCkpCiAgZW5kCgog ICMgRGF0YSBUeXBlczoKICAjIExvd2VyIGNhc2U6IGxpdHRsZSBlbmRpYW4uCiAgIyBVcHBlciBj YXNlOiBiaWcgZW5kaWFuIChuZXR3b3JrIGVuZGlhbikuCiAgIwogICMgOlU4ICAgICAgICB8IHVu c2lnbmVkIDgtYml0IGludGVnZXIuCiAgIyA6UzggICAgICAgIHwgc2lnbmVkIDgtYml0IGludGVn ZXIuCiAgIwogICMgOnUxNiwgOlUxNiB8IHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyLgogICMgOnMx NiwgOlMxNiB8IHNpZ25lZCAxNi1iaXQgaW50ZWdlci4KICAjCiAgIyA6dTMyLCA6VTMyIHwgdW5z aWduZWQgMzItYml0IGludGVnZXIuCiAgIyA6czMyLCA6UzMyIHwgc2lnbmVkIDMyLWJpdCBpbnRl Z2VyLgogICMKICAjIDp1NjQsIDpVNjQgfCB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlci4KICAjIDpz NjQsIDpTNjQgfCBzaWduZWQgNjQtYml0IGludGVnZXIuCiAgIwogICMgOmYzMiwgOkYzMiB8IDMy LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuCiAgIyA6ZjY0LCA6RjY0IHwgNjQtYml0IGZsb2F0 aW5nIHBvaW50IG51bWJlci4KCiAgIyBHZXQgdGhlIGdpdmVuIGRhdGEgdHlwZSBhdCB0aGUgc3Bl Y2lmaWVkIG9mZnNldC4KICBkZWYgZ2V0KHR5cGUsIG9mZnNldCkKICBlbmQKCiAgIyBTZXQgdGhl IGdpdmVuIHZhbHVlIGFzIHRoZSBzcGVjaWZpZWQgZGF0YSB0eXBlIGF0IHRoZSBzcGVjaWZpZWQg b2Zmc2V0LgogIGRlZiBzZXQodHlwZSwgb2Zmc2V0LCB2YWx1ZSkKICBlbmQKZW5kCmBgYAoKVGhl IEMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgZmV3IGNvbnZlbmllbnQgbWV0aG9kcyBmb3IgYWNjZXNz aW5nIHRoZSB1bmRlcmx5aW5nIGRhdGEgYnVmZmVyOgoKYGBgYwp2b2lkIHJiX2lvX2J1ZmZlcl9n ZXRfbXV0YWJsZShWQUxVRSBzZWxmLCB2b2lkICoqYmFzZSwgc2l6ZV90ICpzaXplKTsKdm9pZCBy Yl9pb19idWZmZXJfZ2V0X2ltbXV0YWJsZShWQUxVRSBzZWxmLCBjb25zdCB2b2lkICoqYmFzZSwg c2l6ZV90ICpzaXplKTsKYGBgCgpJbiB0aGUgZmliZXIgc2NoZWR1bGVyLCBpdCBpcyB1c2VkIGxp a2UgdGhpczoKCmBgYGMKVkFMVUUKcmJfZmliZXJfc2NoZWR1bGVyX2lvX3JlYWRfbWVtb3J5KFZB TFVFIHNjaGVkdWxlciwgVkFMVUUgaW8sIHZvaWQgKmJhc2UsIHNpemVfdCBzaXplLCBzaXplX3Qg bGVuZ3RoKQp7CiAgICBWQUxVRSBidWZmZXIgPSByYl9pb19idWZmZXJfbmV3KGJhc2UsIHNpemUs IFJCX0lPX0JVRkZFUl9MT0NLRUQpOwoKICAgIFZBTFVFIHJlc3VsdCA9IHJiX2ZpYmVyX3NjaGVk dWxlcl9pb19yZWFkKHNjaGVkdWxlciwgaW8sIGJ1ZmZlciwgbGVuZ3RoKTsKCiAgICByYl9pb19i dWZmZXJfZnJlZShidWZmZXIpOwoKICAgIHJldHVybiByZXN1bHQ7Cn0KYGBgCgpUaGlzIGZ1bmN0 aW9uIGlzIGludm9rZWQgZnJvbSBgaW8uY2AgYXQgdmFyaW91cyBwbGFjZXMgdG8gZmlsbCB0aGUg YnVmZmVyLiBXZSBzcGVjaWZpY2FsbHkgdGhlIGAoYmFzZSwgc2l6ZSlgIHR1cGxlLCBhbG9uZyB3 aXRoIGBsZW5ndGhgIHdoaWNoIGlzIHRoZSAqbWluaW11bSogbGVuZ3RoIHJlcXVpcmVkIGFuZCBh c3Npc3RzIHdpdGggZWZmaWNpZW50IG5vbi1ibG9ja2luZyBpbXBsZW1lbnRhdGlvbi4KClRoZSBg dXJpbmcuY2AgaW1wbGVtZW50YXRpb24gaW4gdGhlIGV2ZW50IGdlbSB1c2VzIHRoaXMgaW50ZXJm YWNlIGxpa2Ugc286CgpgYGBjClZBTFVFIEV2ZW50X0JhY2tlbmRfVVJpbmdfaW9fcmVhZChWQUxV RSBzZWxmLCBWQUxVRSBmaWJlciwgVkFMVUUgaW8sIFZBTFVFIGJ1ZmZlciwgVkFMVUUgX2xlbmd0 aCkgewoJc3RydWN0IEV2ZW50X0JhY2tlbmRfVVJpbmcgKmRhdGEgPSBOVUxMOwoJVHlwZWREYXRh X0dldF9TdHJ1Y3Qoc2VsZiwgc3RydWN0IEV2ZW50X0JhY2tlbmRfVVJpbmcsICZFdmVudF9CYWNr ZW5kX1VSaW5nX1R5cGUsIGRhdGEpOwoJCglpbnQgZGVzY3JpcHRvciA9IFJCX05VTTJJTlQocmJf ZnVuY2FsbChpbywgaWRfZmlsZW5vLCAwKSk7CgkKCXZvaWQgKmJhc2U7CglzaXplX3Qgc2l6ZTsK CXJiX2lvX2J1ZmZlcl9nZXRfbXV0YWJsZShidWZmZXIsICZiYXNlLCAmc2l6ZSk7CgkKCXNpemVf dCBvZmZzZXQgPSAwOwoJc2l6ZV90IGxlbmd0aCA9IE5VTTJTSVpFVChfbGVuZ3RoKTsKCQoJd2hp bGUgKGxlbmd0aCA+IDApIHsKCQlzaXplX3QgbWF4aW11bV9zaXplID0gc2l6ZSAtIG9mZnNldDsK CQlpbnQgcmVzdWx0ID0gaW9fcmVhZChkYXRhLCBmaWJlciwgZGVzY3JpcHRvciwgKGNoYXIqKWJh c2Urb2Zmc2V0LCBtYXhpbXVtX3NpemUpOwoJCQoJCWlmIChyZXN1bHQgPT0gMCkgewoJCQlicmVh azsKCQl9IGVsc2UgaWYgKHJlc3VsdCA+IDApIHsKCQkJb2Zmc2V0ICs9IHJlc3VsdDsKCQkJaWYg KChzaXplX3QpcmVzdWx0ID4gbGVuZ3RoKSBicmVhazsKCQkJbGVuZ3RoIC09IHJlc3VsdDsKCQl9 IGVsc2UgaWYgKC1yZXN1bHQgPT0gRUFHQUlOIHx8IC1yZXN1bHQgPT0gRVdPVUxEQkxPQ0spIHsK CQkJRXZlbnRfQmFja2VuZF9VUmluZ19pb193YWl0KHNlbGYsIGZpYmVyLCBpbywgUkJfSU5UMk5V TShSRUFEQUJMRSkpOwoJCX0gZWxzZSB7CgkJCXJiX3N5c2Vycl9mYWlsKC1yZXN1bHQsIHN0cmVy cm9yKC1yZXN1bHQpKTsKCQl9Cgl9CgkKCXJldHVybiBTSVpFVDJOVU0ob2Zmc2V0KTsKfQpgYGAK CiMjIEJ1ZmZlciBBbGxvY2F0aW9uCgpUaGUgTGludXgga2VybmVsIHByb3ZpZGVzIHNvbWUgYWR2 YW5jZWQgbWVjaGFuaXNtcyBmb3IgcmVnaXN0ZXJpbmcgYnVmZmVycyBmb3IgYXN5bmNocm9ub3Vz IEkvTyB0byByZWR1Y2UgcGVyLW9wZXJhdGlvbiBvdmVyaGVhZC4KCj4gVGhlIGlvX3VyaW5nX3Jl Z2lzdGVyKCkgc3lzdGVtIGNhbGwgcmVnaXN0ZXJzIHVzZXIgYnVmZmVycyBvciBmaWxlcyBmb3Ig dXNlIGluIGFuIGlvX3VyaW5nKDcpIGluc3RhbmNlIHJlZmVyZW5jZWQgYnkgZmQuIFJlZ2lzdGVy aW5nIGZpbGVzIG9yIHVzZXIgYnVmZmVycyBhbGxvd3MgdGhlIGtlcm5lbCB0byB0YWtlIGxvbmcg dGVybSByZWZlcmVuY2VzIHRvIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyBvciBjcmVhdGUgbG9u ZyB0ZXJtIG1hcHBpbmdzIG9mIGFwcGxpY2F0aW9uIG1lbW9yeSwgZ3JlYXRseSByZWR1Y2luZyBw ZXItSS9PIG92ZXJoZWFkLgoKV2l0aCBhcHByb3ByaWF0ZSBzdXBwb3J0LCB3ZSBjYW4gdXNlIGBJ T1JJTkdfT1BfUFJPVklERV9CVUZGRVJTYCB0byBlZmZpY2llbnRseSBtYW5hZ2UgYnVmZmVycyBp biBhcHBsaWNhdGlvbnMgd2hpY2ggYXJlIGRlYWxpbmcgd2l0aCBsb3RzIG9mIHNvY2tldHMuIFNl ZSA8aHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvaW8tdXJpbmcvMjAyMDAyMjgyMDMwNTMuMjUwMjMt MS1heGJvZUBrZXJuZWwuZGsvVC8+IGZvciBtb3JlIGRldGFpbHMgYWJvdXQgaG93IGl0IHdvcmtz LiBJJ20gc3RpbGwgZXhwbG9yaW5nIHRoZSBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMgb2YgdGhp cywgYnV0IHRoZSBwcm9wb3NlZCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBzdWZmaWNpZW50IG1l dGEtZGF0YSBmb3IgdXMgdG8gZXhwbG9yZSB0aGlzIGluIHJlYWwgd29ybGQgc2NoZWR1bGVycy4K ClBSOiBodHRwczovL2dpdGh1Yi5jb20vcnVieS9ydWJ5L3B1bGwvNDYyMQoKCgotLSAKaHR0cHM6 Ly9idWdzLnJ1YnktbGFuZy5vcmcvCgpVbnN1YnNjcmliZTogPG1haWx0bzpydWJ5LWNvcmUtcmVx dWVzdEBydWJ5LWxhbmcub3JnP3N1YmplY3Q9dW5zdWJzY3JpYmU+CjxodHRwOi8vbGlzdHMucnVi eS1sYW5nLm9yZy9jZ2ktYmluL21haWxtYW4vb3B0aW9ucy9ydWJ5LWNvcmU+Cg==