[ruby-core:105676] [Ruby master Feature#18020] Introduce `IO::Buffer` for fiber scheduler.
From:
"Eregon (Benoit Daloze)" <noreply@...>
Date:
2021-10-19 10:27:06 UTC
List:
ruby-core #105676
SXNzdWUgIzE4MDIwIGhhcyBiZWVuIHVwZGF0ZWQgYnkgRXJlZ29uIChCZW5vaXQgRGFsb3plKS4K CgpJbiB0aGUgZGVzY3JpcHRpb24ncyBjb2RlLCB0aGVyZSBpcyBgbG9ja2AgYW5kIGB1bmxvY2tg LgpBcmUgdGhvc2Ugc3VwcG9zZWQgdG8gYmUgdGhyZWFkLXNhZmU/IElmIHllcyBJIHRoaW5rIHlv dSdkIG5lZWQgdG8gc3luY2hyb25pemUgaW4gYWxtb3N0IGV2ZXJ5IG1ldGhvZCwgaWYgaXQncyBw b3NzaWJsZSB0byBhY2Nlc3MgdGhlIGJ1ZmZlciB3aXRob3V0IEdWTC4KSSB0aGluayBpdCdzIGJl dHRlciB0byBvbmx5IGFsbG93ICJsb2NrIiBvbiBjcmVhdGlvbiwgdG8gdGhlcmUgaXMgbm8gZHlu YW1pYyBsb2NrIG9yIHVubG9jaywgd2hpY2ggbWFrZXMgZXZlcnl0aGluZyBtb3JlIGNvbXBsZXgu CkluIGZhY3QsIGRvIHdlIGV2ZW4gbmVlZCByZXNpemFibGUgYnVmZmVycz8gSU1ITyB1c2luZyBh bm90aGVyIGJ1ZmZlciBzZWVtcyBtdWNoIGNsZWFuZXIgaWYgb25lIG5lZWRzIHRvIGdyb3cgaXQu CgpUaGUgbmV3IGludGVyZmFjZSBmZWVscyByZWFsbHkgYmlnIGFuZCBoYXJkIHRvIHVuZGVyc3Rh bmQgaXQgYXMgYSB3aG9sZS4KSU1ITyB0aGUgdGhyZWFkLXVuc2FmZSBwYXJ0cyAodGhpcyBhbmQg W3RoYXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9ydWJ5L3J1YnkvcHVsbC80NjIxI2Rpc2N1c3Npb25f cjY2MzM1NTM0OCkpIHNob3VsZCBiZSByZW1vdmVkLCBhbmQgdGhlIGludGVyZmFjZSBzaW1wbGlm aWVkIGFzIG11Y2ggYXMgcG9zc2libGUsIGFuZCB0aGVuIGl0IHdvdWxkIGJlIGEgbG90IGVhc2ll ciB0byByZXZpZXcuCmUuZy4sIGlmIGl0J3MgYSBmaXhlZC1zaXplIGJ1ZmZlciB0aGVuIGl0J3Mg YWxyZWF5ZCBtdWNoIGVhc2llciB0byByZWFzb24gYWJvdXQgdGhhbiBzb21lIElPOjpCdWZmZXIg ZG9pbmcgZXZlcnl0aGluZy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KRmVhdHVyZSAjMTgwMjA6IEludHJvZHVjZSBgSU86OkJ1ZmZlcmAgZm9yIGZpYmVyIHNjaGVk dWxlci4KaHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcvaXNzdWVzLzE4MDIwI2NoYW5nZS05NDE3 NgoKKiBBdXRob3I6IGlvcXVhdGl4IChTYW11ZWwgV2lsbGlhbXMpCiogU3RhdHVzOiBPcGVuCiog UHJpb3JpdHk6IE5vcm1hbAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CkFmdGVyIGNvbnRpbnVpbmcgdG8gYnVpbGQgb3V0IHRoZSBmaWJlciBzY2hlZHVsZXIgaW50ZXJm YWNlIGFuZCB0aGUgc3BlY2lmaWMgaG9va3MgcmVxdWlyZWQgZm9yIGBpb191cmluZ2AsIEkgZm91 bmQgc29tZSB0cm91YmxlIHdpdGhpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgYElPYC4KCkkgZm91 bmQgdGhhdCBpbiBzb21lIGNhc2VzLCB3ZSBuZWVkIHRvIHJlYWQgaW50byB0aGUgaW50ZXJuYWwg SU8gYnVmZmVycyBkaXJlY3RseS4gSSB0cmllZCBjcmVhdGluZyBhICJmYWtlIHN0cmluZyIgaW4g b3JkZXIgdG8gdHJhbnNpdCBiYWNrIGludG8gdGhlIFJ1YnkgZmliZXIgc2NoZWR1bGVyIGludGVy ZmFjZSBhbmQgdGhpcyBkaWQgd29yayB0byBhIGNlcnRhaW4gZXh0ZW50LCBidXQgSSB3YXMgdG9s ZCB3ZSBjYW5ub3QgZXhwb3NlIGZha2Ugc3RyaW5nIHRvIFJ1Ynkgc2NoZWR1bGVyIGludGVyZmFj ZS4KClNvLCBhZnRlciB0aGlzLCBhbmQgbWFueSBvdGhlciBmcnVzdHJhdGlvbnMgd2l0aCB1c2lu ZyBgU3RyaW5nYCBhcyBhIElPIGJ1ZmZlciwgSSBkZWNpZGVkIHRvIGltcGxlbWVudCBhIGxvdyBs ZXZlbCBgSU86OkJ1ZmZlcmAgYmFzZWQgb24gbXkgbmVlZHMgZm9yIGhpZ2ggcGVyZm9ybWFuY2Ug SU8sIGFuZCBhcyBwYXJ0IG9mIHRoZSBmaWJlciBzY2hlZHVsZXIgaW50ZXJmYWNlLgoKSGVyZSBp cyByb3VnaGx5IHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhlIHNjaGVkdWxlciB3LnIu dC4gdGhlIGJ1ZmZlcjoKCmBgYHJ1YnkKY2xhc3MgU2NoZWR1bGVyCiAgIyBAcGFyYW1ldGVyIGJ1 ZmZlciBbSU86OkJ1ZmZlcl0gQnVmZmVyIGZvciByZWFkaW5nIGludG8uCiAgZGVmIGlvX3JlYWQo aW8sIGJ1ZmZlciwgbGVuZ3RoKQogICAgIyBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBgcmVh ZGAgc3lzdGVtIGNhbGwsIElPX1VSSU5HX1JFQURWLCBldGMuCiAgZW5kCgogICMgQHBhcmFtZXRl ciBidWZmZXIgW0lPOjpCdWZmZXJdIEJ1ZmZlciBmb3Igd3JpdGluZyBmcm9tLgogIGRlZiBpb193 cml0ZShpbywgYnVmZmVyLCBsZW5ndGgpCiAgICAjIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5 IGB3cml0ZWAgc3lzdGVtIGNhbGwsIElPX1VSSU5HX1dSSVRFViwgZXRjLgogIGVuZAoKICAjIFBv dGVudGlhbCBuZXcgaG9va3MgKFNvY2tldCNyZWN2bXNnLCBzZW5kbXNnLCBldGMpOgogIGRlZiBp b19yZWN2bXNnKGlvLCBidWZmZXIsIGxlbmd0aCkKICBlbmQKZW5kCmBgYAoKSW4gcmV2aWV3aW5n IG90aGVyIGxhbmd1YWdlIGRlc2lnbnMsIEkgZm91bmQgdGhhdCB0aGlzIGRlc2lnbiBpcyB2ZXJ5 IHNpbWlsYXIgdG8gQ3J5c3RhbCdzIElPIGJ1ZmZlcmluZyBzdHJhdGVneS4KClRoZSBwcm9wb3Nl ZCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBlbm91Z2ggb2YgYW4gaW50ZXJmYWNlIHRvIGltcGxl bWVudCBib3RoIG5hdGl2ZSBzY2hlZHVsZXJzIGFzIHdlbGwgYXMgcHVyZSBSdWJ5IHNjaGVkdWxl cnMuIEl0IGFsc28gcHJvdmlkZXMgc29tZSBleHRyYSBmdW5jdGlvbmFsaXR5IGZvciBpbnRlcnBy ZXRpbmcgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlci4gVGhpcyBpcyBtb3N0bHkgZm9yIHRlc3Rpbmcg YW5kIGV4cGVyaW1lbnRhdGlvbiwgYWx0aG91Z2ggaXQgbWlnaHQgbWFrZSBzZW5zZSB0byBleHBv c2UgdGhpcyBpbnRlcmZhY2UgZm9yIGJpbmFyeSBwcm90b2NvbHMgbGlrZSBIVFRQLzIsIFFVSUMs IFdlYlNvY2tldHMsIGV0Yy4KCiMjIFByb3Bvc2VkIFNvbHV0aW9uCgpXZSBpbnRyb2R1Y2UgbmV3 IGNsYXNzIGBJTzo6QnVmZmVyYC4KCmBgYHJ1YnkKY2xhc3MgSU86OkJ1ZmZlcgogICMgQHJldHVy bnMgW0lPOjpCdWZmZXJdIEEgYnVmZmVyIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcg ZGF0YS4KICBkZWYgc2VsZi5mb3Ioc3RyaW5nKQogIGVuZAoKICBQQUdFX1NJWkUgPSAjIC4uLiBv cGVyYXRpbmcgc3lzdGVtIHBhZ2Ugc2l6ZQoKICAjIEByZXR1cm5zIFtJTzo6QnVmZmVyXSBBIGJ1 ZmZlciB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBtYXBwZWQgdG8gbWVtb3J5LgogIGRl ZiBzZWxmLm1hcChmaWxlKQogIGVuZAoKICAjIEZsYWdzIGZvciBidWZmZXIgc3RhdGUuCiAgRVhU RVJOQUwgPSAjIFRoZSBidWZmZXIgaXMgZnJvbSBleHRlcm5hbCBtZW1vcnkuCiAgSU5URVJOQUwg PSAjIFRoZSBidWZmZXIgaXMgZnJvbSBpbnRlcm5hbCBtZW1vcnkgKG1hbGxvYykuCiAgTUFQUEVE ID0gIyBUaGUgYnVmZmVyIGlzIGZyb20gbWFwcGVkIG1lbW9yeSAobW1hcCwgVmlydHVhbEFsbG9j LCBldGMpCiAgTE9DS0VEID0gIyBUaGUgYnVmZmVyIGlzIGxvY2tlZCBmb3IgdXNhZ2UgKGNhbm5v dCBiZSByZXNpemVkKQogIFBSSVZBVEUgPSAjIFRoZSBidWZmZXIgaXMgbWFwcGVkIGFzIGNvcHkt b24td3JpdGUuCiAgSU1NVVRBQkxFID0gIyBUaGUgYnVmZmVyIGNhbm5vdCBiZSBtb2RpZmllZC4K CiAgIyBAcmV0dXJucyBbSU86OkJ1ZmZlcl0gQSBidWZmZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHNp emUsIGFsbG9jYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGZsYWdzLgogIGRlZiBpbml0aWFs aXplKHNpemUsIGZsYWdzKQogIGVuZAoKICAjIEByZXR1cm5zIFtJbnRlZ3JhbF0gVGhlIHNpemUg b2YgdGhlIGJ1ZmZlcgogIGF0dHIgOnNpemUKCiAgIyBAcmV0dXJucyBbU3RyaW5nXSBBIGJyaWVm IHN1bW1hcnkgYW5kIGhleCBkdW1wIG9mIHRoZSBidWZmZXIuCiAgZGVmIGluc3BlY3QKICBlbmQK CiAgIyBAcmV0dXJucyBbU3RyaW5nXSBBIGJyaWVmIHN1bW1hcnkgb2YgdGhlIGJ1ZmZlci4KICBk ZWYgdG9fcwogIGVuZAoKICAjIEZsYWcgcHJlZGljYXRlczoKICBkZWYgZXh0ZXJuYWw/CiAgZW5k CgogIGRlZiBpbnRlcm5hbD8KICBlbmQKCiAgZGVmIG1hcHBlZD8KICBlbmQKCiAgZGVmIGxvY2tl ZD8KICBlbmQKCiAgZGVmIGltbXV0YWJsZT8KICBlbmQKCiAgIyBGbGFncyBmb3IgZW5kaWFuL2J5 dGUgb3JkZXI6CiAgTElUVExFX0VORElBTiA9ICMgLi4uCiAgQklHX0VORElBTiA9ICMgLi4uCiAg SE9TVF9FTkRJQU4gPSAjIC4uLgogIE5FVFdPUktfRU5ESUFOPSAjIC4uLgoKICAjIExvY2sgdGhl IGJ1ZmZlciAocHJldmVudCByZXNpemUsIHVubWFwLCBjaGFuZ2VzIHRvIGJhc2UgYW5kIHNpemUp LgogIGRlZiBsb2NrCiAgICByYWlzZSAiQWxyZWFkeSBsb2NrZWQhIiBpZiBmbGFncyAmIExPQ0tF RAogICAgCiAgICBmbGFncyB8PSBMT0NLRUQKICBlbmQKCiAgIyBVbmxvY2sgdGhlIGJ1ZmZlci4K ICBkZWYgdW5sb2NrCiAgICByYWlzZSAiTm90IGxvY2tlZCEiIHVubGVzcyBmbGFncyAmIExPQ0tF RAogICAgCiAgICBmbGFncyB8PSB+TE9DS0VECiAgZW5kCgogIC8vIE1hbmlwdWxhdGlvbjoKICAj IEByZXR1cm5zIFtJTzo6QnVmZmVyXSBBIHNsaWNlIG9mIHRoZSBidWZmZXIncyBkYXRhLiBEb2Vz IG5vdCBjb3B5LgogIGRlZiBzbGljZShvZmZzZXQsIGxlbmd0aCkKICBlbmQKCiAgIyBAcmV0dXJu cyBbU3RyaW5nXSBBIGJpbmFyeSBzdHJpbmcgc3RhcnRpbmcgYXQgb2Zmc2V0LCBsZW5ndGggYnl0 ZXMuCiAgZGVmIHRvX3N0cihvZmZzZXQsIGxlbmd0aCkKICBlbmQKCiAgIyBDb3B5IHRoZSBzcGVj aWZpZWQgc3RyaW5nIGludG8gdGhlIGJ1ZmZlciBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LgogIGRlZiBj b3B5KHN0cmluZywgb2Zmc2V0KQogIGVuZAoKICAjIENvbXBhcmUgdHdvIGJ1ZmZlcnMuCiAgZGVm IDw9PihvdGhlcikKICBlbmQKCiAgaW5jbHVkZSBDb21wYXJhYmxlCgogICMgUmVzaXplIHRoZSBi dWZmZXIsIHByZXNlcnZpbmcgdGhlIGdpdmVuIGxlbmd0aCAoaWYgbm9uLXplcm8pLgogIGRlZiBy ZXNpemUoc2l6ZSwgcHJlc2VydmUgPSAwKQogIGVuZAoKICAjIENsZWFyIHRoZSBidWZmZXIgdG8g dGhlIHNwZWNpZmllZCB2YWx1ZS4KICBkZWYgY2xlYXIodmFsdWUgPSAwLCBvZmZzZXQgPSAwLCBs ZW5ndGggPSAoQHNpemUgLSBvZmZzZXQpKQogIGVuZAoKICAjIERhdGEgVHlwZXM6CiAgIyBMb3dl ciBjYXNlOiBsaXR0bGUgZW5kaWFuLgogICMgVXBwZXIgY2FzZTogYmlnIGVuZGlhbiAobmV0d29y ayBlbmRpYW4pLgogICMKICAjIDpVOCAgICAgICAgfCB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VyLgog ICMgOlM4ICAgICAgICB8IHNpZ25lZCA4LWJpdCBpbnRlZ2VyLgogICMKICAjIDp1MTYsIDpVMTYg fCB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlci4KICAjIDpzMTYsIDpTMTYgfCBzaWduZWQgMTYtYml0 IGludGVnZXIuCiAgIwogICMgOnUzMiwgOlUzMiB8IHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLgog ICMgOnMzMiwgOlMzMiB8IHNpZ25lZCAzMi1iaXQgaW50ZWdlci4KICAjCiAgIyA6dTY0LCA6VTY0 IHwgdW5zaWduZWQgNjQtYml0IGludGVnZXIuCiAgIyA6czY0LCA6UzY0IHwgc2lnbmVkIDY0LWJp dCBpbnRlZ2VyLgogICMKICAjIDpmMzIsIDpGMzIgfCAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgbnVt YmVyLgogICMgOmY2NCwgOkY2NCB8IDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuCgogICMg R2V0IHRoZSBnaXZlbiBkYXRhIHR5cGUgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuCiAgZGVmIGdl dCh0eXBlLCBvZmZzZXQpCiAgZW5kCgogICMgU2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyB0aGUgc3Bl Y2lmaWVkIGRhdGEgdHlwZSBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4KICBkZWYgc2V0KHR5cGUs IG9mZnNldCwgdmFsdWUpCiAgZW5kCmVuZApgYGAKClRoZSBDIGludGVyZmFjZSBwcm92aWRlcyBh IGZldyBjb252ZW5pZW50IG1ldGhvZHMgZm9yIGFjY2Vzc2luZyB0aGUgdW5kZXJseWluZyBkYXRh IGJ1ZmZlcjoKCmBgYGMKdm9pZCByYl9pb19idWZmZXJfZ2V0X211dGFibGUoVkFMVUUgc2VsZiwg dm9pZCAqKmJhc2UsIHNpemVfdCAqc2l6ZSk7CnZvaWQgcmJfaW9fYnVmZmVyX2dldF9pbW11dGFi bGUoVkFMVUUgc2VsZiwgY29uc3Qgdm9pZCAqKmJhc2UsIHNpemVfdCAqc2l6ZSk7CmBgYAoKSW4g dGhlIGZpYmVyIHNjaGVkdWxlciwgaXQgaXMgdXNlZCBsaWtlIHRoaXM6CgpgYGBjClZBTFVFCnJi X2ZpYmVyX3NjaGVkdWxlcl9pb19yZWFkX21lbW9yeShWQUxVRSBzY2hlZHVsZXIsIFZBTFVFIGlv LCB2b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGxlbmd0aCkKewogICAgVkFMVUUgYnVm ZmVyID0gcmJfaW9fYnVmZmVyX25ldyhiYXNlLCBzaXplLCBSQl9JT19CVUZGRVJfTE9DS0VEKTsK CiAgICBWQUxVRSByZXN1bHQgPSByYl9maWJlcl9zY2hlZHVsZXJfaW9fcmVhZChzY2hlZHVsZXIs IGlvLCBidWZmZXIsIGxlbmd0aCk7CgogICAgcmJfaW9fYnVmZmVyX2ZyZWUoYnVmZmVyKTsKCiAg ICByZXR1cm4gcmVzdWx0Owp9CmBgYAoKVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGZyb20gYGlv LmNgIGF0IHZhcmlvdXMgcGxhY2VzIHRvIGZpbGwgdGhlIGJ1ZmZlci4gV2Ugc3BlY2lmaWNhbGx5 IHRoZSBgKGJhc2UsIHNpemUpYCB0dXBsZSwgYWxvbmcgd2l0aCBgbGVuZ3RoYCB3aGljaCBpcyB0 aGUgKm1pbmltdW0qIGxlbmd0aCByZXF1aXJlZCBhbmQgYXNzaXN0cyB3aXRoIGVmZmljaWVudCBu b24tYmxvY2tpbmcgaW1wbGVtZW50YXRpb24uCgpUaGUgYHVyaW5nLmNgIGltcGxlbWVudGF0aW9u IGluIHRoZSBldmVudCBnZW0gdXNlcyB0aGlzIGludGVyZmFjZSBsaWtlIHNvOgoKYGBgYwpWQUxV RSBFdmVudF9CYWNrZW5kX1VSaW5nX2lvX3JlYWQoVkFMVUUgc2VsZiwgVkFMVUUgZmliZXIsIFZB TFVFIGlvLCBWQUxVRSBidWZmZXIsIFZBTFVFIF9sZW5ndGgpIHsKCXN0cnVjdCBFdmVudF9CYWNr ZW5kX1VSaW5nICpkYXRhID0gTlVMTDsKCVR5cGVkRGF0YV9HZXRfU3RydWN0KHNlbGYsIHN0cnVj dCBFdmVudF9CYWNrZW5kX1VSaW5nLCAmRXZlbnRfQmFja2VuZF9VUmluZ19UeXBlLCBkYXRhKTsK CQoJaW50IGRlc2NyaXB0b3IgPSBSQl9OVU0ySU5UKHJiX2Z1bmNhbGwoaW8sIGlkX2ZpbGVubywg MCkpOwoJCgl2b2lkICpiYXNlOwoJc2l6ZV90IHNpemU7CglyYl9pb19idWZmZXJfZ2V0X211dGFi bGUoYnVmZmVyLCAmYmFzZSwgJnNpemUpOwoJCglzaXplX3Qgb2Zmc2V0ID0gMDsKCXNpemVfdCBs ZW5ndGggPSBOVU0yU0laRVQoX2xlbmd0aCk7CgkKCXdoaWxlIChsZW5ndGggPiAwKSB7CgkJc2l6 ZV90IG1heGltdW1fc2l6ZSA9IHNpemUgLSBvZmZzZXQ7CgkJaW50IHJlc3VsdCA9IGlvX3JlYWQo ZGF0YSwgZmliZXIsIGRlc2NyaXB0b3IsIChjaGFyKiliYXNlK29mZnNldCwgbWF4aW11bV9zaXpl KTsKCQkKCQlpZiAocmVzdWx0ID09IDApIHsKCQkJYnJlYWs7CgkJfSBlbHNlIGlmIChyZXN1bHQg PiAwKSB7CgkJCW9mZnNldCArPSByZXN1bHQ7CgkJCWlmICgoc2l6ZV90KXJlc3VsdCA+IGxlbmd0 aCkgYnJlYWs7CgkJCWxlbmd0aCAtPSByZXN1bHQ7CgkJfSBlbHNlIGlmICgtcmVzdWx0ID09IEVB R0FJTiB8fCAtcmVzdWx0ID09IEVXT1VMREJMT0NLKSB7CgkJCUV2ZW50X0JhY2tlbmRfVVJpbmdf aW9fd2FpdChzZWxmLCBmaWJlciwgaW8sIFJCX0lOVDJOVU0oUkVBREFCTEUpKTsKCQl9IGVsc2Ug ewoJCQlyYl9zeXNlcnJfZmFpbCgtcmVzdWx0LCBzdHJlcnJvcigtcmVzdWx0KSk7CgkJfQoJfQoJ CglyZXR1cm4gU0laRVQyTlVNKG9mZnNldCk7Cn0KYGBgCgojIyBCdWZmZXIgQWxsb2NhdGlvbgoK VGhlIExpbnV4IGtlcm5lbCBwcm92aWRlcyBzb21lIGFkdmFuY2VkIG1lY2hhbmlzbXMgZm9yIHJl Z2lzdGVyaW5nIGJ1ZmZlcnMgZm9yIGFzeW5jaHJvbm91cyBJL08gdG8gcmVkdWNlIHBlci1vcGVy YXRpb24gb3ZlcmhlYWQuCgo+IFRoZSBpb191cmluZ19yZWdpc3RlcigpIHN5c3RlbSBjYWxsIHJl Z2lzdGVycyB1c2VyIGJ1ZmZlcnMgb3IgZmlsZXMgZm9yIHVzZSBpbiBhbiBpb191cmluZyg3KSBp bnN0YW5jZSByZWZlcmVuY2VkIGJ5IGZkLiBSZWdpc3RlcmluZyBmaWxlcyBvciB1c2VyIGJ1ZmZl cnMgYWxsb3dzIHRoZSBrZXJuZWwgdG8gdGFrZSBsb25nIHRlcm0gcmVmZXJlbmNlcyB0byBpbnRl cm5hbCBkYXRhIHN0cnVjdHVyZXMgb3IgY3JlYXRlIGxvbmcgdGVybSBtYXBwaW5ncyBvZiBhcHBs aWNhdGlvbiBtZW1vcnksIGdyZWF0bHkgcmVkdWNpbmcgcGVyLUkvTyBvdmVyaGVhZC4KCldpdGgg YXBwcm9wcmlhdGUgc3VwcG9ydCwgd2UgY2FuIHVzZSBgSU9SSU5HX09QX1BST1ZJREVfQlVGRkVS U2AgdG8gZWZmaWNpZW50bHkgbWFuYWdlIGJ1ZmZlcnMgaW4gYXBwbGljYXRpb25zIHdoaWNoIGFy ZSBkZWFsaW5nIHdpdGggbG90cyBvZiBzb2NrZXRzLiBTZWUgPGh0dHBzOi8vbG9yZS5rZXJuZWwu b3JnL2lvLXVyaW5nLzIwMjAwMjI4MjAzMDUzLjI1MDIzLTEtYXhib2VAa2VybmVsLmRrL1QvPiBm b3IgbW9yZSBkZXRhaWxzIGFib3V0IGhvdyBpdCB3b3Jrcy4gSSdtIHN0aWxsIGV4cGxvcmluZyB0 aGUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zIG9mIHRoaXMsIGJ1dCB0aGUgcHJvcG9zZWQgaW1w bGVtZW50YXRpb24gcHJvdmlkZXMgc3VmZmljaWVudCBtZXRhLWRhdGEgZm9yIHVzIHRvIGV4cGxv cmUgdGhpcyBpbiByZWFsIHdvcmxkIHNjaGVkdWxlcnMuCgpQUjogaHR0cHM6Ly9naXRodWIuY29t L3J1YnkvcnVieS9wdWxsLzQ2MjEKCgoKLS0gCmh0dHBzOi8vYnVncy5ydWJ5LWxhbmcub3JnLwoK VW5zdWJzY3JpYmU6IDxtYWlsdG86cnVieS1jb3JlLXJlcXVlc3RAcnVieS1sYW5nLm9yZz9zdWJq ZWN0PXVuc3Vic2NyaWJlPgo8aHR0cDovL2xpc3RzLnJ1YnktbGFuZy5vcmcvY2dpLWJpbi9tYWls bWFuL29wdGlvbnMvcnVieS1jb3JlPgo=