[ruby-core:121636] [Ruby Feature#21262] Proposal: `Ractor::Port`
From:
"tenderlovemaking (Aaron Patterson) via ruby-core" <ruby-core@...>
Date:
2025-04-11 18:52:24 UTC
List:
ruby-core #121636
SXNzdWUgIzIxMjYyIGhhcyBiZWVuIHVwZGF0ZWQgYnkgdGVuZGVybG92ZW1ha2luZyAoQWFyb24g UGF0dGVyc29uKS4NCg0KDQprbzEgKEtvaWNoaSBTYXNhZGEpIHdyb3RlIGluICNub3RlLTU6DQo+ ID4gVGhlIHByb2JsZW0gd2l0aCB0aGUgYWJvdmUgY29kZSBpcyB0aGF0IHRoZSBjb25zdW1lciBS YWN0b3Igd2lsbCBzdGFydmUgdW50aWwgZmluZF93b3JrIHJldHVybnMuDQo+IA0KPiBJIHRoaW5r IGl0IGlzIHNhbWUgb24geW91ciB0aHJlYWQrcXVldWUgZXhhbXBsZS4gQW0gSSBtaXNzaW5nIHNv bWV0aGluZz8NCg0KSXMgaXQ/ICBJbiBteSB0aHJlYWQrcXVldWUgZXhhbXBsZSwgdGhlcmUgaXMg bm90aGluZyBibG9ja2luZyB0aGUgcHJvZHVjZXIgdGhyZWFkIGZyb20gYWRkaW5nIHdvcmsgdG8g dGhlIHdvcmsgcXVldWU6DQoNCmBgYHJ1YnkNClRocmVhZC5uZXcgZG8NCiAgbG9vcCBkbw0KICAg IHF1ZXVlIDw8IGZpbmRfd29yaw0KICBlbmQNCmVuZA0KYGBgDQoNCldpdGggdGhlIFJhY3RvciBl eGFtcGxlLCB3ZSBkb24ndCBgZmluZF93b3JrYCB1bnRpbCBhIFJhY3RvciBpcyByZWFkeSB0byB0 YWtlIHdvcms6DQoNCmBgYA0KbG9vcCBkbw0KICAjIEJsb2NrZWQgaGVyZSB1bnRpbCBjb25zdW1l ciBpcyByZWFkeSwgYnV0IHdlIGNvdWxkIGJlIGV4ZWN1dGluZyBgZmluZF93b3JrYCB3aGlsZSB3 YWl0aW5nIGZvciBjb25zdW1lciB0byBiZSByZWFkeQ0KICBjb250cm9sX3BvcnQucmVjZWl2ZSA9 PiBbOnJlYWR5LCBjb25zdW1lcl0NCiAgDQogICMgQ29uc3VtZXIgc3RhcnZlcyB1bnRpbCBgZmlu ZF93b3JrYCBjb21wbGV0ZXMNCiAgY29uc3VtZXIgPDwgZmluZF93b3JrDQplbmQNCmBgYA0KDQo+ ID4gQWRkaXRpb25hbGx5LCB3ZSdyZSBub3QgYWJsZSB0byAiZmluZCB3b3JrIiBpbiBwYXJhbGxl bCB3aXRoIHRoZSBjb25zdW1lciB0aHJlYWRzLg0KPiANCj4gV2h5IGRvbid0IHlvdSB1c2UgcmFj dG9yIHRvIHJ1biAiZmluZCB3b3JrIiBpZiB5b3Ugd2FudCB0byBydW4gaW4gcGFyYWxsZWwgd2l0 aCB0aGUgbWFpbiBSYWN0b3I/DQoNCkhvdyB3b3VsZCB0aGUgUmFjdG9yIHJ1bm5pbmcgImZpbmQg d29yayIgY29tbXVuaWNhdGUgdGhlIHdvcmsgdG8gdGhlIGNvbnN1bWVycz8NCiANCj4gTWF5YmUg aXQgaXMgZWFzeSB0byBkaXNjdXNzIHdpdGggZ29vZCBleGFtcGxlcy4NCg0KU29ycnksIEkgdGhv dWdodCBteSBleGFtcGxlIGlzIGNsZWFyLiAgSSdsbCB0cnkgdG8gbWFrZSBhIHJ1bm5pbmcgcHJv Z3JhbSB0byBkZW1vbnN0cmF0ZS4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQ0KRmVhdHVyZSAjMjEyNjI6IFByb3Bvc2FsOiBgUmFjdG9yOjpQb3J0YA0KaHR0cHM6 Ly9idWdzLnJ1YnktbGFuZy5vcmcvaXNzdWVzLzIxMjYyI2NoYW5nZS0xMTI2OTANCg0KKiBBdXRo b3I6IGtvMSAoS29pY2hpIFNhc2FkYSkNCiogU3RhdHVzOiBBc3NpZ25lZA0KKiBBc3NpZ25lZTog a28xIChLb2ljaGkgU2FzYWRhKQ0KKiBUYXJnZXQgdmVyc2lvbjogMy41DQotLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIFByb3Bvc2FsOiBgUmFjdG9yOjpQb3J0YA0K DQpJbiBjb25jdXJyZW50IFJ1YnkgYXBwbGljYXRpb25zIHVzaW5nIFJhY3RvcnMsIHNhZmVseSBh bmQgZWZmaWNpZW50bHkgY29tbXVuaWNhdGluZyByZXN1bHRzIGJldHdlZW4gUmFjdG9ycyBpcyBh IGNvbW1vbiBjaGFsbGVuZ2UuIFdlIHByb3Bvc2UgYFJhY3Rvcjo6UG9ydGAgYXMgYSBsaWdodHdl aWdodCwgc2FmZSwgYW5kIGVyZ29ub21pYyBhYnN0cmFjdGlvbiB0byBzaW1wbGlmeSBjb21tdW5p Y2F0aW9uIHBhdHRlcm5zLCBlc3BlY2lhbGx5IGluIHJlcXVlc3QtcmVzcG9uc2UgbW9kZWxzLg0K DQpgYGBydWJ5DQojIHVzYWdlIGV4YW1wbGUNCg0KcG9ydCA9IFJhY3Rvcjo6UG9ydC5uZXcNCg0K UmFjdG9yLm5ldyBwb3J0IGRvIHxwb3J0fA0KICBwb3J0IDw8IDQyDQogIHBvcnQgPDwgNDMNCmVu ZA0KDQojIFN1Y2Nlc3M6IHdhaXQgZm9yIHNlbmRpbmcNCnBvcnQucmVjZWl2ZSAjPT4gNDINCg0K UmFjdG9yLm5ldyBwb3J0IGRvIHxwb3J0fA0KICBwb3J0LnJlY2VpdmUgIyBFcnJvcjogb25seSB0 aGUgY3JlYXRvciBSYWN0b3IgY2FuIHJlY2VpdmUgZnJvbSB0aGlzIHBvcnQuDQplbmQNCg0KcG9y dC5yZWNlaXZlICM9PiA0Mw0KYGBgDQoNClRoaXMgaXMgYSBzaW1pbGFyIGNvbmNlcHQgdG8gWyJD aGFubmVsIl0oaHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcvaXNzdWVzLzIxMTIxKSwgYnV0IGl0 IGlzIHRpZ2h0bHkgY291cGxlZCB3aXRoIHRoZSBjcmVhdG9yIFJhY3RvciBhbmQgbm8gb3RoZXIg UmFjdG9ycyBjYW4gcmVjZWl2ZSBhbnl0aGluZyBmcm9tIHRoYXQgcG9ydC4NCg0KSW4gdGhhdCBz ZW5zZSwgaXQgaXMgY29uY2VwdHVhbGx5IGNsb3NlciB0byBhIHNvY2tldCBmaWxlIGRlc2NyaXB0 b3IgKGUuZy4sIGEgZGVzdGluYXRpb24gYW5kIHBvcnQgbnVtYmVyIHBhaXIgaW4gVENQL0lQKS4N Cg0KV2UgY2FuIGltcGxlbWVudCBgUG9ydGAgd2l0aCBgUmFjdG9yLnJlY2VpdmVfaWZgIGxpa2Ug dGhpczoNCg0KYGBgcnVieQ0KY2xhc3MgUmFjdG9yOjpQb3J0DQogIGRlZiBpbml0aWFsaXplDQog ICAgQHIgPSBSYWN0b3IuY3VycmVudA0KICAgIEB0YWcgPSBnZW5pZCgpDQogIGVuZA0KDQogIGRl ZiBzZW5kIG9iag0KICAgIEByIDw8IFtAdGFnLCBvYmpdDQogIGVuZA0KDQogIGRlZiByZWNlaXZl DQogICAgcmFpc2UgdW5sZXNzIEByID09IFJhY3Rvci5jdXJyZW50DQoNCiAgICBSYWN0b3IucmVj ZWl2ZV9pZiBkbyB8KHRhZywgcmVzdWx0KQ0KICAgICAgaWYgdGFnID09IEB0YWcNCiAgICAgICAg cmV0dXJuIHJlc3VsdA0KICAgICAgZW5kDQogICAgZW5kDQogIGVuZA0KZW5kDQpgYGANCg0KV2l0 aCBgUmFjdG9yOjpQb3J0YCwgd2UgY2FuIGRlcHJlY2F0ZSBgUmFjdG9yLnJlY2VpdmVfaWZgLCBg UmFjdG9yLnlpZWxkYCwgYW5kIGBSYWN0b3IjdGFrZWAuIFBvcnRzIGFjdCBhcyBjbGVhciwgc2Vs Zi1jb250YWluZWQgZW5kcG9pbnRzIGZvciBtZXNzYWdlIHBhc3NpbmcsIHdoaWNoIG1ha2VzIHRo ZXNlIG9sZGVyIHByaW1pdGl2ZXMgcmVkdW5kYW50LiBGdXJ0aGVybW9yZSwgUG9ydC1iYXNlZCBj b21tdW5pY2F0aW9uIGlzIHNpZ25pZmljYW50bHkgZWFzaWVyIHRvIGltcGxlbWVudCBhbmQgcmVh c29uIGFib3V04oCUZXNwZWNpYWxseSB3aGVuIGNvbnNpZGVyaW5nIHN5bmNocm9uaXphdGlvbiBj aGFsbGVuZ2VzIGFyb3VuZCBgUmFjdG9yLnNlbGVjdGAgYW5kIHJlbmRlenZvdXMgc2VtYW50aWNz Lg0KDQojIyBCYWNrZ3JvdW5kOiBMaW1pdGF0aW9ucyBvZiBjdXJyZW50IGNvbW11bmljYXRpb24g cGF0dGVybnMNCg0KTGV0J3MgZGlzY3VzcyBob3cgdG8gbWFrZSBzZXJ2ZXItbGlrZSBzZXJ2aWNl IHJhY3RvcnMuDQoNCiMjIyBObyByZXNwb25zZSBzZXJ2ZXINCg0KV2UgY2FuIG1ha2Ugc2VydmVy LWxpa2UgUmFjdG9ycyBsaWtlIHRoaXM6DQoNCmBgYHJ1YnkNCiMgRVgxDQoNCmRlZiBmaWIobikg PSBuID4gMSA6IGZpYihuLTIpICsgZmliKG4tMSkgOiAxDQoNCiMgQSByYWN0b3IgY2FsY3VsYXRl IGZpYihuKQ0KZmliX3NydiA9IFJhY3Rvci5uZXcgZG8NCiAgd2hpbGUgdHJ1ZQ0KICAgIHBhcmFt ID0gUmFjdG9yLnJlY2VpdmUNCiAgICByZXN1bHQgPSBmaWIocGFyYW0pDQogIGVuZA0KZW5kDQoN CmZpYl9zcnYgPDwgMTANCmBgYA0KDQpJbiB0aGlzIGNhc2UsIHRoZSBtYWluIFJhY3RvciByZXF1 ZXN0cyBgZmliX3NydmAgdG8gY2FsY3VsYXRlIGBmaWIoMTApYC4NCkhvd2V2ZXIsIGN1cnJlbnRs eSwgdGhlcmUgaXMgbm8gd2F5IHRvIHJldHJpZXZlIHRoZSByZXN1bHQuDQoNCiMjIyBSZXR1cm4g dmFsdWUgdG8gdGhlIHNlbmRlciByYWN0b3INCg0KVGhlcmUgYXJlIHNldmVyYWwgcG9zc2libGUg YXBwcm9hY2hlcy4NCg0KRmlyc3QsIHdlIGNhbiBzZW5kIHRoZSBzZW5kZXIgUmFjdG9yIGFsb25n IHdpdGggdGhlIHBhcmFtZXRlciwgYW5kIGFzayB0aGUgc2VydmVyIHRvIHNlbmQgdGhlIHJlc3Vs dCBiYWNrIHRvIHRoZSBzZW5kZXIuDQoNCmBgYHJ1YnkNCiMgRVgyDQoNCmZpYl9zcnYgPSBSYWN0 b3IubmV3IGRvDQogIHdoaWxlIHRydWUNCiAgICBwYXJhbSwgc2VuZGVyID0gUmFjdG9yLnJlY2Vp dmUNCiAgICByZXN1bHQgPSBmaWIocGFyYW0pDQogICAgc2VuZGVyIDw8IHJlc3VsdA0KICBlbmQN CmVuZA0KDQpmaWJfc3J2IDw8IFsxMCwgUmFjdG9yLmN1cnJlbnRdDQoNCmRvX3NvbWVfd29yaygp DQoNClJhY3Rvci5yZWNlaXZlICM9PiBmaWIoMTApDQpgYGANCg0KVGhpcyBhcHByb2FjaCB3b3Jr cyB3ZWxsIGluIHNpbXBsZSBjYXNlcy4NCg0KSG93ZXZlciwgd2l0aCBFWDIsIGhhbmRsaW5nIG11 bHRpcGxlIGNvbmN1cnJlbnQgcmVzcG9uc2VzIGJlY29tZXMgZGlmZmljdWx0LiBUaGUgcmVzdWx0 cyBhcmUgcHVzaGVkIGludG8gdGhlIHNhbWUgbWFpbGJveCwgYW5kIHNpbmNlIGBSYWN0b3IucmVj ZWl2ZWAgcmV0cmlldmVzIG1lc3NhZ2VzIHdpdGhvdXQgZGlzY3JpbWluYXRpbmcgdGhlIHNvdXJj ZSwgaXQncyB1bmNsZWFyIHdoaWNoIHNlcnZlciByZXR1cm5lZCB3aGljaCByZXN1bHQuDQoNCmBg YHJ1YnkNCiMgRVgzDQoNCmRlZiBmYWN0KG4pID0gbiA+IDEgOiBmYWN0KG4tMSkgKiBuDQoNCmZp Yl9zcnYgPSBSYWN0b3IubmV3IGRvDQogIHdoaWxlIHRydWUNCiAgICBwYXJhbSwgc2VuZGVyID0g UmFjdG9yLnJlY2VpdmUNCiAgICByZXN1bHQgPSBmaWIocGFyYW0pDQogICAgc2VuZGVyIDw8IHJl c3VsdA0KICBlbmQNCmVuZA0KDQpmYWN0X3NydiA9IFJhY3Rvci5uZXcgZG8NCiAgd2hpbGUgdHJ1 ZQ0KICAgIHBhcmFtLCBzZW5kZXIgPSBSYWN0b3IucmVjZWl2ZQ0KICAgIHJlc3VsdCA9IGZhY3Qo cGFyYW0pDQogICAgc2VuZGVyIDw8IHJlc3VsdA0KICBlbmQNCmVuZA0KDQoNCmZpYl9zcnYgPDwg WzEwLCBSYWN0b3IuY3VycmVudF0NCmZpYl9zcnYgPDwgWzIwLCBSYWN0b3IuY3VycmVudF0NCmZh Y3Rfc3J2IDw8IFsxMCwgUmFjdG9yLmN1cnJlbnRdDQpmYWN0X3NydiA8PCBbMjAsIFJhY3Rvci5j dXJyZW50XQ0KDQpkb19zb21lX3dvcmsoKQ0KDQpSYWN0b3IucmVjZWl2ZQ0KIz0+IGZpYigxMCkg b3IgZmFjdCgxMCksIHdoaWNoPw0KIyAgIElmIHRoZSBzZXJ2ZXJzIHVzZXMgUmFjdG9ycyBtb3Jl IChjYWxjdWxhdGUgdGhlbSBpbiBwYXJhbGxlbCksDQojICAgZmliKDIwKSBhbmQgZmFjdCgyMCkg Y2FuIGJlIHJldHVybmVkLg0KYGBgDQoNCkJlY2F1c2UgYFJhY3Rvci5yZWNlaXZlYCByZXRyaWV2 ZXMgYWxsIG1lc3NhZ2VzIGluZGlzY3JpbWluYXRlbHksIGRldmVsb3BlcnMgbXVzdCBhZGQgdGhl aXIgb3duIHRhZ2dpbmcgbG9naWMgdG8gZGlzdGluZ3Vpc2ggcmVzdWx0cy4gV2hpbGUgdGFnZ2lu ZyAoYXMgc2hvd24gaW4gRVg0KSBoZWxwcywgaXQgaW50cm9kdWNlcyBhZGRpdGlvbmFsIGNvbXBs ZXhpdHkgYW5kIGJyaXR0bGVuZXNzLg0KDQojIyMgUmVzcG9uc2VzIHdpdGggcmVxdWVzdCBJRA0K DQpUaGUgZm9sbG93aW5nIGNvZGUgcmV0dXJucyBhIHJlc3VsdCB3aXRoIHJlcXVlc3QgaWQgKGEg cGFpciBvZiB0aGUgbmFtZSBvZiBzZXJ2ZXIgYW5kIGEgcGFyYW1ldGVyKS4NCg0KYGBgcnVieQ0K IyBFWDQNCg0KZmliX3NydiA9IFJhY3Rvci5uZXcgZG8NCiAgd2hpbGUgdHJ1ZQ0KICAgIHBhcmFt LCBzZW5kZXIgPSBSYWN0b3IucmVjZWl2ZQ0KICAgIHJlc3VsdCA9IGZpYihwYXJhbSkNCiAgICBz ZW5kZXIgPDwgW1s6ZmliLCBwYXJhbV0sIHJlc3VsdF0NCiAgZW5kDQplbmQNCg0KZmFjdF9zcnYg PSBSYWN0b3IubmV3IGRvDQogIHdoaWxlIHRydWUNCiAgICBwYXJhbSwgc2VuZGVyID0gUmFjdG9y LnJlY2VpdmUNCiAgICByZXN1bHQgPSBmYWN0KHBhcmFtKQ0KICAgIHNlbmRlciA8PCBbWzpmYWN0 LCBwYXJhbV0sIHJlc3VsdF0NCiAgZW5kDQplbmQNCg0KZmliX3NydiA8PCBbMTAsIFJhY3Rvci5j dXJyZW50XQ0KZmliX3NydiA8PCBbMjAsIFJhY3Rvci5jdXJyZW50XQ0KZmFjdF9zcnYgPDwgWzEw LCBSYWN0b3IuY3VycmVudF0NCmZhY3Rfc3J2IDw8IFsyMCwgUmFjdG9yLmN1cnJlbnRdDQoNCmRv X3NvbWVfd29yaygpDQoNClJhY3Rvci5yZWNlaXZlX2lmIGRvIHxpZCwgcmVzdWx0fA0KICBjYXNl IGlkDQogIGluIFs6ZmliLCBuXQ0KICAgIHAgImZpYigje259KSA9ICN7cmVzdWx0fSINCiAgaW4g WzpmYWN0LCBuXQ0KICAgIHAgImZhY3QoI3tufSkgPSAje3Jlc3VsdH0iDQogIGVuZA0KZW5kDQoN CiMgb3IgaWYgeW91IHdhbnQgdG8gdXNlIHNwZWNpZmljIHJlc3VsdHMsIGxpa2U6DQoNCnAgZmli MjA6ICBSYWN0b3IucmVjZWl2ZV9pZnt8aWQsIHJlc3VsdHwgaWQgPT4gWzpmaWIsIDIwXTsgIHJl c3VsdH0NCnAgZmFjdDEwOiBSYWN0b3IucmVjZWl2ZV9pZnt8aWQsIHJlc3VsdHwgaWQgPT4gWzpm YWN0LCAxMF07IHJlc3VsdH0NCnAgZmFjdDIwOiBSYWN0b3IucmVjZWl2ZV9pZnt8aWQsIHJlc3Vs dHwgaWQgPT4gWzpmYWN0LCAyMF07IHJlc3VsdH0NCnAgZmliMTA6ICBSYWN0b3IucmVjZWl2ZV9p Znt8aWQsIHJlc3VsdHwgaWQgPT4gWzpmaWIsIDEwXTsgIHJlc3VsdH0NCmBgYA0KDQpUaGlzIGFw cHJvYWNoIGNsb3NlbHkgcmVzZW1ibGVzIHBhdHRlcm4gbWF0Y2hpbmcgaW4gRXJsYW5nIG9yIEVs aXhpciwgd2hlcmUgcmVzcG9uc2VzIGFyZSB0YWdnZWQgYW5kIG1hdGNoZWQgc3RydWN0dXJhbGx5 Lg0KDQpIb3dldmVyLCB0aGlzIHNvbHV0aW9uIHN0aWxsIGhhcyBhbiBpc3N1ZTogaWYgYGRvX3Nv bWVfd29yaygpYCB1c2VzIGBSYWN0b3IucmVjZWl2ZWAsIGl0IG1heSBhY2NpZGVudGFsbHkgY29u c3VtZSBhbnkgbWVzc2FnZS4gSW4gb3RoZXIgd29yZHMsIGBSYWN0b3IucmVjZWl2ZWAgY2FuIG9u bHkgYmUgc2FmZWx5IHVzZWQgd2hlbiB5b3UncmUgY2VydGFpbiB0aGF0IG5vIG90aGVyIGNvZGUg aXMgdXNpbmcgaXQuDQoNCihBbm90aGVyIHRyaXZpYWwgaXNzdWUgaXMsIGRpZmZlcmVudCBzZXJ2 ZXJzIGNhbiByZXR1cm4gc2FtZSBpZGVudGl0eSwgbGlrZSBgWzpmYWN0LCBudW1dYCByZXR1cm5l ZCBieSBOZXdzUGFwZXIgc2VydmVyLiBJdCBpcyBjb25mdXNpbmcpLg0KDQoNCiMjIyBVc2luZyBj aGFubmVscw0KDQpUbyBzb2x2ZSB0aGlzIGlzc3VlLCB3ZSBjYW4gbWFrZSBhIGNoYW5uZWwgd2l0 aCBkaWZmZXJlbnQgUmFjdG9ycy4NCg0KQ2hhbm5lbHMgY2FuIGJlIGltcGxlbWVudGVkIHVzaW5n IFJhY3RvcnMsIGFzIGlsbHVzdHJhdGVkIGJlbG93Lg0KDQpgYGBydWJ5DQojIEVYNQ0KDQojIFNl cnZlcnMgYXJlIGNvbXBsZXRlbHkgc2FtZSB0byBFWDMNCg0KZmliX3NydiA9IFJhY3Rvci5uZXcg ZG8NCiAgd2hpbGUgdHJ1ZQ0KICAgIHBhcmFtLCBzZW5kZXIgPSBSYWN0b3IucmVjZWl2ZQ0KICAg IHJlc3VsdCA9IGZpYihwYXJhbSkNCiAgICBzZW5kZXIgPDwgcmVzdWx0DQogIGVuZA0KZW5kDQoN CmZhY3Rfc3J2ID0gUmFjdG9yLm5ldyBkbw0KICB3aGlsZSB0cnVlDQogICAgcGFyYW0sIHNlbmRl ciA9IFJhY3Rvci5yZWNlaXZlDQogICAgcmVzdWx0ID0gZmFjdChwYXJhbSkNCiAgICBzZW5kZXIg PDwgcmVzdWx0DQogIGVuZA0KZW5kDQoNCiMgQ3JlYXRlIGEgbmV3IGNoYW5uZWwgdXNpbmcgYSBS YWN0b3INCmRlZiBuZXdfY2hhbm5lbA0KICBSYWN0b3IubmV3IGRvDQogICAgd2hpbGUgdHJ1ZQ0K ICAgICAgUmFjdG9yLnlpZWxkIFJhY3Rvci5yZWNlaXZlDQogICAgZW5kDQogIGVuZA0KZW5kDQoN Cg0KZmliX3NydiA8PCBbMTAsIGZpYjEwX2NoID0gbmV3X2NoYW5uZWxdDQpmaWJfc3J2IDw8IFsy MCwgZmliMjBfY2ggPSBuZXdfY2hhbm5lbF0NCmZhY3Rfc3J2IDw8IFsxMCwgZmFjdDEwX2NoID0g bmV3X2NoYW5uZWxdDQpmYWN0X3NydiA8PCBbMjAsIGZhY3QyMF9jaCA9IG5ld19jaGFubmVsXQ0K DQpkb19zb21lX3dvcmsoKQ0KDQpwIGZpYjIwOiBmaWIyMF9jaC50YWtlICAgIyB3YWl0IGZvciBm aWIoMjApDQpwIGZhY3QxMDogZmFjdDEwX2NoLnRha2UgIyB3YWl0IGZvciBmYWN0KDEwKQ0KcCBm aWIxMDogZmliMTBfY2gudGFrZSAgICMgd2FpdCBmb3IgZmliKDEwKQ0KcCBmYWN0MjA6IGZhY3Qx MF9jaC50YWtlICMgd2FpdCBmb3IgZmFjdCgyMCkNCg0KIyBvciANCmNocyA9IFtmaWIxMF9jaCwg ZmliMjBfY2gsIGZhY3QxMF9jaCwgZmFjdDIwX2NoXQ0KDQp3aGlsZSAhY2hzLmVtcHR5Pw0KICBj aCwgcmVzdWx0ID0gUmFjdG9yLnNlbGVjdCgqY2hzKSAjIHdhaXQgZm9yIG11bHRpcGxlIGNoYW5u ZWxzDQogIHAgY2gsIHJlc3VsdA0KICBjaHMuZGVsZXRlIGNoDQplbmQNCmBgYA0KDQpDaGFubmVs IGFwcHJvYWNoIHNvbHZlcyB0aGUgaXNzdWUgb2YgRVg0LiBUaGUgYWJvdmUgaW1wbGVtZW50YXRp b24gaW50cm9kdWNlIHNvbWUgb3ZlcmhlYWQgdG8gY3JlYXRlIGNoYW5uZWwgcmFjdG9ycywgYnV0 IHdlIGNhbiBpbnRyb2R1Y2Ugc3BlY2lhbCBpbXBsZW1lbnRhdGlvbiB0byByZWR1Y2UgdGhpcyBS YWN0b3IgY3JlYXRpb24gb3ZlcmhlYWQuDQoNCkhvd2V2ZXIsIGluIHRoZSBBY3RvciBtb2RlbCwg dGhlIGNvbW11bmljYXRpb24gcGF0dGVybiBpcyB0byBzZW5kIGEgbWVzc2FnZSB0byBhIHNwZWNp ZmljIGFjdG9yLiBJbiBjb250cmFzdCwgY2hhbm5lbHMgYXJlIHVzZWQgdG8gc2VuZCBtZXNzYWdl cyB0aHJvdWdoIGEgc2hhcmVkIGNvbmR1aXQsIHdpdGhvdXQgY2FyaW5nIHdoaWNoIHJlY2VpdmVy IChpZiBhbnkpIGhhbmRsZXMgdGhlIG1lc3NhZ2UuIEFsc28sIGNoYW5uZWxzIGNhbiBoYXZlIHNv bWUgb3ZlcmhlYWQsIGFzIGRpc2N1c3NlZCBiZWxvdy4NCg0KIyMjIFN1bW1hcnkgb2YgYmFja2dy b3VuZA0KDQpDdXJyZW50bHksIHdoZW4gaW1wbGVtZW50aW5nIHJlcXVlc3QtcmVzcG9uc2UgcGF0 dGVybnMgd2l0aCBSYWN0b3JzLCBkZXZlbG9wZXJzIGZhY2UgY2hhbGxlbmdlcyBpbiB0cmFja2lu ZyByZXN1bHRzLCBtYW5hZ2luZyBpZGVudGlmaWVycywgYW5kIGF2b2lkaW5nIG1lc3NhZ2UgY29u ZmxpY3RzLiBFeGlzdGluZyBwcmltaXRpdmVzIGxpa2UgYHJlY2VpdmVfaWZgLCBgdGFrZWAsIG9y IGNoYW5uZWxzIGltcGxlbWVudGVkIHdpdGggUmFjdG9ycyBhcmUgZWl0aGVyIGVycm9yLXByb25l IG9yIGluZWZmaWNpZW50Lg0KDQojIyBQcm9wb3NhbA0KDQpJbnRyb2R1Y2UgYFJhY3Rvcjo6UG9y dGAgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gY2hhbm5lbHMuIEl0IGlzIGEgbmF0dXJhbCBleHRlbnNp b24gb2YgdGhlIEFjdG9yIG1vZGVsLiBJbiBmYWN0LCBpdCBpcyB0aGluIHdyYXBwZXIgb2YgY3Vy cmVudCBzZW5kL3JlY2VpdmUgbW9kZWwgYXMgaWxsdXN0cmF0ZWQgYXQgdGhlIHRvcCBvZiB0aGlz IHByb3Bvc2FsLg0KDQpXaXRoIHRoZSBgUmFjdG9yOjpQb3J0YCwgd2UgY2FuIHJld3JpdGUgYWJv dmUgZXhhbXBsZXMgd2l0aCBpdC4NCg0KYGBgcnVieQ0KIyBFWDYNCg0KIyBDb21wbGV0ZWx5IHNh bWUgYXMgRVgzJ3Mgc2VydmVycw0KDQpmaWJfc3J2ID0gUmFjdG9yLm5ldyBkbw0KICB3aGlsZSB0 cnVlDQogICAgcGFyYW0sIHNlbmRlciA9IFJhY3Rvci5yZWNlaXZlDQogICAgcmVzdWx0ID0gZmli KHBhcmFtKQ0KICAgIHNlbmRlciA8PCByZXN1bHQNCiAgZW5kDQplbmQNCg0KZmFjdF9zcnYgPSBS YWN0b3IubmV3IGRvDQogIHdoaWxlIHRydWUNCiAgICBwYXJhbSwgc2VuZGVyID0gUmFjdG9yLnJl Y2VpdmUNCiAgICByZXN1bHQgPSBmYWN0KHBhcmFtKQ0KICAgIHNlbmRlciA8PCByZXN1bHQNCiAg ZW5kDQplbmQNCg0KZmliX3NydiA8PCBbMTAsIGZpYjEwX3BvcnQgPSBSYWN0b3I6OlBvcnQubmV3 XQ0KZmliX3NydiA8PCBbMjAsIGZpYjIwX3BvcnQgPSBSYWN0b3I6OlBvcnQubmV3XQ0KZmFjdF9z cnYgPDwgWzEwLCBmYWN0MTBfcG9ydCA9IFJhY3Rvcjo6UG9ydC5uZXddDQpmYWN0X3NydiA8PCBb MjAsIGZhY3QyMF9wb3J0ID0gUmFjdG9yOjpQb3J0Lm5ld10NCg0KZG9fc29tZV93b3JrKCkNCg0K cCBmaWIxMF9wb3J0LnJlY2VpdmUgIz0+IGZpYigxMCkNCnAgZmliMjBfcG9ydC5yZWNlaXZlICM9 PiBmaWIoMjApDQpwIGZhY3QxMF9wb3J0LnJlY2VpdmUgIz0+IGZhY3QoMTApDQpwIGZhY3QyMF9w b3J0LnJlY2VpdmUgIz0+IGZhY3QoMjApDQoNCiMgb3INCg0KcG9ydHMgPSBbZmliMTBfcG9ydCwg ZmliMjBfcG9ydCwgZmFjdDEwX3BvcnQsIGZhY3QyMF9wb3J0XQ0KDQp3aGlsZSAhcG9ydHMuZW1w dHk/DQogIHBvcnQsIHJlc3VsdCA9IFJhY3Rvci5zZWxlY3QoKnBvcnRzKQ0KICBjYXNlIHBvcnQN CiAgd2hlbiBmaWIxMF9wb3J0DQogICAgcCBmaWIxMDogcmVzdWx0DQogIC4uLg0KICBlbHNlDQog ICAgcmFpc2UgIlRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKEJVRykuIg0KICBlbmQNCg0KICBwb3J0 cy5kZWxldGUocG9ydCkNCmVuZA0KYGBgDQoNCmBSYWN0b3I6OlBvcnRgIHJlc29sdmVzIGtleSBw YWluIHBvaW50cyBpbiBtZXNzYWdlIHBhc3NpbmcgYmV0d2VlbiBSYWN0b3JzOg0KDQoqIEl0IGd1 YXJhbnRlZXMgdGhhdCBpbmNvbWluZyBtZXNzYWdlcyBhcmUgb25seSBkZWxpdmVyZWQgdG8gdGhl IGludGVuZGVkIFJhY3RvciwgcHJldmVudGluZyB0YWcgY29sbGlzaW9ucy4NCiogSXQgZW5hYmxl cyBtZXNzYWdlIHJvdXRpbmcgd2l0aG91dCByZWx5aW5nIG9uIGdsb2JhbCByZWNlaXZlIGJsb2Nr cyAoYFJhY3Rvci5yZWNlaXZlYCksIHdoaWNoIGFyZSBwcm9uZSB0byB1bmludGVuZGVkIGNvbnN1 bXB0aW9uLg0KKiBJdCByZXBsYWNlcyBtb3JlIGNvbXBsZXggcHJpbWl0aXZlcyBsaWtlIGAucmVj ZWl2ZV9pZmAsIGAueWllbGRgLCBhbmQgYCN0YWtlYCB3aXRoIGEgc2ltcGxlciwgY29tcG9zYWJs ZSBhYnN0cmFjdGlvbi4NCiogSXQgbWFwcyBjbGVhbmx5IHRvIHRoZSBBY3RvciBtb2RlbCBzZW1h bnRpY3MgUnVieSBpbnRlbmRzIHRvIHN1cHBvcnQgd2l0aCBSYWN0b3JzLg0KDQpXaGlsZSB0aGUg cGF0dGVybiBsb29rcyBzaW1pbGFyIHRvIHVzaW5nIGNoYW5uZWxzLCB0aGUgc2VtYW50aWNzIGFu ZCBndWFyYW50ZWVzIGFyZSBkaWZmZXJlbnQgaW4gbWVhbmluZ2Z1bCB3YXlzLg0KDQpUaGUgYWR2 YW50YWdlcyBvZiB1c2luZyBQb3J0cyBpbmNsdWRlOg0KDQoqIFNhZmVyIHRoYW4gY2hhbm5lbHMg aW4gcHJhY3RpY2UNCiAgKiBXaGVuIHVzaW5nIGEgUG9ydCwgaWYgYCNzZW5kYCBzdWNjZWVkcywg aXQgbWVhbnMgdGhlIGRlc3RpbmF0aW9uIFJhY3RvciBpcyBzdGlsbCBhbGl2ZSAoaS5lLiwgaXQn cyBydW5uaW5nKS4NCiAgKiBJbiBjb250cmFzdCwgd2l0aCBhIGNoYW5uZWwsIHRoZXJlJ3Mgbm8g Z3VhcmFudGVlIHRoYXQgYW55IFJhY3RvciBpcyBzdGlsbCBhdmFpbGFibGUgdG8gcmVjZWl2ZSBm cm9tIGl0Lg0KICAqIE9mIGNvdXJzZSwgZXZlbiB3aXRoIGEgcG9ydCwgdGhlcmUncyBubyBndWFy YW50ZWUgdGhhdCB0aGUgZGVzdGluYXRpb24gUmFjdG9yIHdpbGwgYWN0dWFsbHkgcHJvY2VzcyB0 aGUgbWVzc2FnZSDigJQgaXQgbWlnaHQgaWdub3JlIGl0Lg0KICAqIEJ1dCBhdCBsZWFzdCB5b3Ug ZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgUmFjdG9yIGhhdmluZyBhbHJlYWR5IHRlcm1p bmF0ZWQgdW5leHBlY3RlZGx5Lg0KICAqIEluIG90aGVyIHdvcmRzLCB1c2luZyBhIHBvcnQgZWxp bWluYXRlcyBvbmUgbWFqb3IgZmFpbHVyZSBjYXNlLCBtYWtpbmcgdGhlIGNvbW11bmljYXRpb24g bW9kZWwgbW9yZSBwcmVkaWN0YWJsZS4NCiAgKiBUaGlzIGlzIG9uZSBvZiB0aGUgcmVhc29ucyB3 aHkgUnVieSB3ZW50IHdpdGggdGhlICJBY3RvciIgbW9kZWwgKGhlbmNlIHRoZSBuYW1lIFJhY3Rv ciksIGluc3RlYWQgb2YgdGhlICJDU1AiIG1vZGVsLg0KKiBGYXN0ZXIgdGhhbiBjaGFubmVscyBp biBib3RoIGNyZWF0aW9uIGFuZCBtZXNzYWdlIHRyYW5zbWlzc2lvbg0KICAqIFdoZW4gY3JlYXRp bmcgYSBjaGFubmVsLCB3ZSBuZWVkIHRvIHByZXBhcmUgYSBjb250YWluZXIgZGF0YSBzdHJ1Y3R1 cmUuIFdoZW4gY3JlYXRpbmcgYSBwb3J0LCBpdCBpcyBsaWdodHdlaWdodCBkYXRhIChhIHBhaXIg b2YgUmFjdG9yIGFuZCBuZXdseSBjcmVhdGVkIElEKS4NCiAgKiBPbiB0aGUgY2hhbm5lbCB0cmFu c21pc3Npb24sIHdlIG5lZWQgY29weWluZyBhIGRhdGEgdG8gY2hhbm5lbCBhbmQgYSBjb3B5aW5n IHRvIHRoZSByZWNlaXZpbmcgcmFjdG9yLiBPbiB0aGUgcG9ydCwgaXQgb25seSBuZWVkcyB0byBj b3B5IGZyb20gdGhlIHNyYyByYWN0b3IgdG8gdGhlIGRzdCByYWN0b3IuIFRoaXMgaXNzdWUgYmVj b21lcyBtb3JlIHNpZ25pZmljYW50IGR1ZSB0byBSYWN0b3ItbG9jYWwgZ2FyYmFnZSBjb2xsZWN0 aW9uIGFuZCBpc29sYXRpb24gb2Ygb2JqZWN0IHNwYWNlcy4NCiogRWFzeSB0byBpbXBsZW1lbnQu IFdlIG9ubHkgbmVlZCB0byBpbXBsZW1lbnQgYFBvcnQjcmVjZWl2ZWAgdG8gc3luY2hyb25pemUg d2l0aCBvdGhlciByYWN0b3JzLg0KICAqIGAjc2VuZC8ucmVjZWl2ZWAgaXMgZWFzeSB0byBpbXBs ZW1lbnQgYmVjYXVzZSB3ZSBvbmx5IG5lZWQgdG8gbG9jayB0aGUgcmVjZWl2aW5nIHJhY3Rvci4N CiAgKiBgLnlpZWxkLyN0YWtlYCBpcyBub3QgZWFzeSB0byBpbXBsZW1lbnQgYmVjYXVzZSB3ZSBu ZWVkIHRvIGxvY2sgdGFraW5nIGFuZCByZWNlaXZpbmcgcmFjdG9ycyBiZWNhdXNlIGl0IGlzIHJl bmRlenZvdXMgc3R5bGUgc3luY2hyb25pemF0aW9uLg0KICAqIGAuc2VsZWN0YCBpcyBESUZGSUNV TFQgdG8gc3VwcG9ydCBjdXJyZW50IHNwZWMuIE5vdyBDSSBpc24ndCBzdGFibGUgeWV0Lg0KICAq IEEgc2ltcGxlciBzcGVjIHJlZHVjZXMgYnVncywgYW5kIG1heWJlIGxlYWRzIHRvIGZhc3RlciBp bXBsZW1lbnRhdGlvbi4NCg0KRGlzYWR2YW50YWdlczoNCg0KMS4gSXQgaXMgbm90IGEgd2VsbC1r bm93biBjb25jZXB0LCBlc3BlY2lhbGx5IGZvciBHbyBsYW5ndWFnZSB1c2Vycy4NCjIuIFdlIG5l ZWQgYWRkaXRpb25hbCBhYnN0cmFjdGlvbiBsaWtlIHByb2R1Y2VyKHMpLWNvbnN1bWVyKHMpIGNv bmN1cnJlbnQgYXBwbGljYXRpb25zLg0KDQpGb3IgKDIpLCBJIHdhbnQgdG8gaW50cm9kdWNlIGFu IGV4YW1wbGUgY29kZS4gV2UgY2FuIHdyaXRlIGEgMS1wcm9kdWNlciwgbXVsdGlwbGUtY29uc3Vt ZXIgcGF0dGVybiB3aXRoIGEgY2hhbm5lbC4NCg0KYGBgcnVieQ0KIyBjaGFubmVsIHZlcnNpb24g b2YgMSBwcm9kdWNlciAmIGNvbnN1bWVycw0KDQpjaCA9IG5ld19jaGFubmVsDQoNClJOID0gMTAg IyBtYWtlIDEwIGNvbnN1bWVycw0KDQpjb25zdW1lcnMgPSBSTi50aW1lcy5tYXAgZG8NCiAgUmFj dG9yLm5ldyBjaCBkbw0KICAgIHdoaWxlIHBhcmFtID0gY2gucmVjZWl2ZQ0KICAgICAgdGFzayhw YXJhbSkNCiAgICBlbmQNCiAgZW5kDQplbmQNCg0KdGFza3MuZWFjaCBkbyB8dGFza3wNCiAgY2gg PDwgdGFzaw0KZW5kDQpgYGANCg0KV2l0aCBQb3J0LCB3ZSBuZWVkIHRvIGludHJvZHVjZSBhIGxv YWQgYmFsYW5jaW5nIG1lY2hhbmlzbToNCg0KYGBgcnVieQ0KIyBQb3J0IHZlcnNpb24gb2YgMSBw cm9kdWNlciAmIGNvbnN1bWVycw0KDQpjb250cm9sX3BvcnQgPSBSYWN0b3I6OlBvcnQubmV3DQpj b25zdW1lcnMgPSBSTi50aW1lcy5tYXAgZG8NCiAgUmFjdG9yLm5ldyBjb250cm9sX3BvcnQgY29u dHJvbF9wb3J0IGRvIHxjb250cm9sX3BvcnR8DQogICAgd2hpbGUgdHJ1ZQ0KICAgICAgY29udHJv bF9wb3J0IDw8IFs6cmVhZHksIFJhY3Rvci5jdXJyZW50XSAjIHJlZ2lzdGVyIC0gcmVhZHkNCiAg ICAgIHBhcmFtID0gUmFjdG9yLnJlY2VpdmUgIyBpdCBhc3N1bWVzIHRhc2sgZG9lc24ndCB1c2Ug UmFjdG9yLnJlY2VpdmUNCiAgICAgIHRhc2socGFyYW0pDQogICAgZW5kDQogIGVuZA0KZW5kDQoN CnRhc2tzLmVhY2ggZG8gfHRhc2t8DQogIGNvbnRyb2xfcG9ydC5yZWNlaXZlID0+IFs6cmVhZHks IGNvbnN1bWVyXQ0KICANCiAgIyBzZW5kIGEgdGFzayB0byBhIHJlYWR5IGNvbnN1bWVyDQogIGNv bnN1bWVyIDw8IHRhc2sNCmVuZA0KYGBgDQoNCk9mIGNvdXJzZSB3ZSBjYW4gbWFrZSBhIGxpYnJh cnkgZm9yIHRoYXQgKGxpa2UgT1RQIG9uIEVybGFuZykuDQoNCiMjIyBEZWZhdWx0IHBvcnQgb2Yg UmFjdG9ycw0KDQpFYWNoIFJhY3RvciBoYXMgYSBkZWZhdWx0IHBvcnQgYW5kIGBSYWN0b3Ijc2Vu ZGAgaXMgZXF1YWwgdG8gYFJhY3Rvci5jdXJyZW50LmRlZmF1bHRfcG9ydCNzZW5kYC4gT2YgY291 cnNlLCBgUmFjdG9yLnJlY2VpdmVgIGlzIGVxdWFsIHRvIGBSYWN0b3IuY3VycmVudC5kZWZhdWx0 X3BvcnQucmVjZWl2ZWAuDQoNCkZvciB0aGUgc2ltcGxlIGNhc2UsIHdlIGNhbiBrZWVwIHRvIHVz ZSBgUmFjdG9yI3NlbmRgIGFuZCBgUmFjdG9yLnJlY2VpdmVgDQoNCiMjIyBEZXByZWNhdGlvbiBv ZiBSYWN0b3IjdGFrZSBhbmQgUmFjdG9yLnlpZWxkDQoNCldpdGggdGhlIFBvcnQgY29uY2VwdCwg d2UgY2FuIGZvY3VzIHNvbGVseSBvbiBzZW5kIGFuZCByZWNlaXZl4oCUdGhhdCBpcywgZGlyZWN0 IG1hbmlwdWxhdGlvbiBvZiBhIFJhY3RvcuKAmXMgbWFpbGJveC4gUG9ydHMgcHJvdmlkZSBhIGNs ZWFuIGFuZCBmdW5jdGlvbmFsIGFsdGVybmF0aXZlIHRvIGBSYWN0b3IjdGFrZWAgYW5kIGBSYWN0 b3IueWllbGRgLCBtYWtpbmcgdGhlbSB1bm5lY2Vzc2FyeSBpbiBtb3N0IHVzZSBjYXNlcy4NCg0K TW9yZW92ZXIsIFBvcnRzIGFyZSBzaWduaWZpY2FudGx5IGVhc2llciB0byBpbXBsZW1lbnQsIGFz IHRoZXkgcmVxdWlyZSBvbmx5IGxvY2tpbmcgdGhlIHJlY2VpdmluZyBSYWN0b3IsIHdoaWxlIHlp ZWxkL3Rha2UgaW52b2x2ZSBjb21wbGV4IHJlbmRlenZvdXMtc3R5bGUgc3luY2hyb25pemF0aW9u LiBCeSByZW1vdmluZyB0aGVzZSBwcmltaXRpdmVzLCB3ZSBjYW4gc2ltcGxpZnkgdGhlIHNwZWNp ZmljYXRpb24gYW5kIHJlZHVjZSBpbXBsZW1lbnRhdGlvbiBjb21wbGV4aXR54oCUZXNwZWNpYWxs eSBhcm91bmQgZmVhdHVyZXMgbGlrZSBgUmFjdG9yLnNlbGVjdGAsIHdoaWNoIGFyZSBub3Rvcmlv dXNseSBoYXJkIHRvIGdldCByaWdodC4NCg0KIyMjIGBSYWN0b3Iuc2VsZWN0YCB3aXRoIHBvcnRz DQoNCldlIHNob3VsZCB3YWl0IGZvciBtdWx0aXBsZSBwb3J0IHNpbXVsdGFuZW91c2x5IHNvIGBS YWN0b3Iuc2VsZWN0KClgIHNob3VsZCBhY2NlcHQgcG9ydHMuIE5vdyBgUmFjdG9yLnNlbGVjdCgp YCBjYW4gYWxzbyByZWNlaXZpbmcgYW5kIHlpZWxkaW5nIHRoZSB2YWx1ZSwgYnV0IGlmIHdlIHJl bW92ZSB0aGUgYCN0YWtlYCBmdW5jdGlvbmFsaXR5LCBgUmFjdG9yLnNlbGVjdGAgb25seSBuZWVk IHRvIHN1cHBvcnQgcG9ydHMuDQoNCiMjIyBXYWl0IGZvciB0ZXJtaW5hdGlvbg0KDQpgUmFjdG9y I3Rha2VgIGlzIGRlc2lnbmVkIGZyb20gYW4gaWRlYSBvZiBnZXR0aW5nIHRlcm1pbmF0aW9uIHJl c3VsdCAobGlrZSBgVGhyZWFkI3ZhbHVlYCkuIEZvciB0aGlzIHB1cnBvc2UsIHdlIGNhbiBpbnRy b2R1Y2UgYFJhY3RvciNqb2luYCBvciBgUmFjdG9yI3ZhbHVlYCBsaWtlIFRocmVhZHMgb3Igd2Ug Y2FuIGtlZXAgdGhlIG5hbWUgYFJhY3RvciN0YWtlYCBmb3IgdGhpcyBwdXJwb3NlLg0KDQpXZSBj YW4gbWFrZSBgUmFjdG9yI2pvaW5gIGFzIGEgZm9sbG93aW5nIHBzZXVkby1jb2RlOg0KDQpgYGBy dWJ5DQpjbGFzcyBSYWN0b3INCiAgZGVmIGpvaW4gIyB3YWl0IGZvciB0aGUgdGVybWluYXRpb24N CiAgICBtb25pdG9yIHBvcnQgPSBQb3J0Lm5ldw0KICAgIHBvcnQucmVjZWl2ZQ0KICBlbnN1cmUN CiAgICBtb25pdG9yIG5pbCAjIHVucmVnaXN0ZXIgLyBpdCBzaG91bGQgYmUgZGlzY3Vzc2VkDQog IGVuZA0KICANCiAgIyB3aGVuIHRoaXMgcmFjdG9yIHRlcm1pbmF0ZXMsIHNlbmQgYSBtZXNzYWdl IHRvIHRoZSByZWdpc3RlcmVkIHBvcnQNCiAgZGVmIG1vbml0b3IgcG9ydA0KICAgIEBtb25pdG9y X3BvcnQgPSBwb3J0DQogIGVuZA0KICANCiAgcHJpdmF0ZSBkZWYgYXRleGl0DQogICAgQG1vbml0 b3JfcG9ydCA8PCB0ZXJtaW5hdGlvbl9tZXNzYWdlDQogIGVuZA0KZW5kDQoNCiMgdGhlcmUgYXJl IHNvbWUgcXVlc3Rpb25zLg0KIyAqIGNhbiB3ZSByZWdpc3RlciBtdWx0aXBsZSBwb3J0cz8NCiMg KiBzaG91bGQgd2Ugc3VwcG9ydCBgI2pvaW5gIGFuZCBgI3ZhbHVlYCBsaWtlIHRocmVhZHM/DQoj ICAgb3Igc2hvdWxkIHdlIHN1cHBvcnQgb25seSBgI2pvaW5gIHRvIHJldHVybiB0aGUgdmFsdWU/ DQojICogb3Iga2VlcCB0aGlzIG5hbWUgYXMgYCN0YWtlYD8NCg0KDQpSYWN0b3IubmV3IGRvDQog IDQyDQplbmQuam9pbiAjPT4gNDIgKG9yIHRydWU/KQ0KYGBgDQoNCkl0IGlzIHZlcnkgc2ltaWxh ciB0byBgbW9uaXRvcmAgaW4gRXJsYW5nIG9yIEVsaXhpci4NCldlIGNhbiBhbHNvIG1ha2UgYSBz dXBlcnZpc29yIGluIEVybGFuZyBsaWtlIHRoYXQ6DQoNCmBgYHJ1YnkNCnN2X3BvcnQgPSBSYWN0 b3I6OlBvcnQubmV3DQoNCnJzID0gTi50aW1lcy5tYXAgZG8NCiAgUmFjdG9yLm5ldyBkbw0KICAg IGRvX3NvbWV0aGluZygpDQogIGVuZC5tb25pdG9yIHN2X3BvcnQNCmVuZA0KDQp3aGlsZSB0ZXJt aW5hdGlvbl9ub3RpY2UgPSBzdl9wb3J0LnJlY2VpdmUNCiAgcCB0ZXJtaW5hdGlvbl9ub3RpY2UN CmVuZA0KDQojIFdpdGggUmFjdG9yI3Rha2UsIHdlIGNhbiB3cml0ZSBzaW1pbGFyIGNvZGUgaWYg dGhlcmUgaXMgbm8gUmFjdG9yLnlpZWxkDQoNCnJzID0gTi50aW1lcy5tYXAgZG8NCiAgUmFjdG9y Lm5ldyBkbw0KICAgIGRvX3NvbWV0aGluZygpDQogIGVuZA0KZW5kDQoNCndoaWxlIHIsIG1zZyA9 IFJhY3Rvci5zZWxlY3QoKnJzKQ0KICBwIFtyLCBtc2ddDQplbmQNCmBgYA0KDQojIyBEaXNjdXNz aW9uDQoNCiMjIyBgc2VuZGAgd2l0aCB0YWcgKHN5bWJvbHMpDQoNCklmIHdlIGZvcmNlIHVzZXJz IHRvIHNlbmQgYSB0YWdnZWQgbWVzc2FnZSBldmVyeSB0aW1lLCB3ZSBjYW4gYWNoaWV2ZSB0aGUg c2FtZSBlZmZlY3QgYXMgUG9ydCBjb25jZXB0LCBiZWNhdXNlIGEgUG9ydCBjYW4gYmUgdGhvdWdo dCBvZiBhcyBhIGNvbWJpbmF0aW9uIG9mIGEgdGFnIGFuZCBhIGRlc3RpbmF0aW9uIFJhY3Rvci4N Cg0KYGBgcnVieQ0KciA9IFJhY3Rvci5uZXcgZG8NCiAgbG9vcCBkbw0KICAgIHRhZywgbXNnID0g UmFjdG9yLnJlY2VpdmUgIyByZXR1cm4gMiB2YWx1ZXMNCiAgICBjYXNlIHRhZw0KICAgIHdoZW4g OlRBRw0KICAgICAgcCBbdGFnLCBtc2ddDQogICAgZWxzZQ0KICAgICAgIyBpZ25vcmUNCiAgICBl bmQNCiAgZW5kDQplbmQNCg0Kci5zZW5kIDpUQUcsIDQyDQpyLnNlbmQgOlRBR0UsIDg0ICMgdGhp cyB0eXBvIGFuZCB0aGUgbWVzc2FnZSBpcyBzaWxlbnRseSBpZ25vcmVkDQpgYGANCg0KSG93ZXZl ciBpdCBoYXMgdHdvIGlzc3VlczoNCg0KKiBJZiB3ZSBtYWtlIGEgdHlwbyBpbiB0YWcgbmFtZSwg dGhlIG1lc3NhZ2Ugd2lsbCBiZSBzaWxlbnRseSBpZ25vcmVkLg0KKiBUaGUgdGFnIG5hbWUgbWF5 IGNvbmZsaWN0IHdpdGggdW5yZWxhdGVkIGNvZGVzIChsaWJyYXJpZXMpDQoNCiMjIyBgUmFjdG9y LnlpZWxkYCBhbmQgYFJhY3RvciN0YWtlYCB3aXRoIGNoYW5uZWwgcmFjdG9yDQoNCklmIHdlIHdh bnQgdG8gbGVhdmUgdGhlIGAueWllbGRgIGFuZCBgI3Rha2VgLCB3ZSBjYW4gZW11bGF0ZSB0aGVt IHdpdGggY2hhbm5lbCByYWN0b3IuDQoNCmBgYHJ1YnkNCmNsYXNzIFJhY3Rvcg0KICBkZWYgaW5p dGlhbGl6ZQ0KICAgIEB5aWVsZF9yYWN0b3IgPSBSYWN0b3IubmV3IGRvDQogICAgICB0YWtlcnMg PSBbXQ0KICAgICAgd2hpbGUgdGFnLCBtc2cgPSBSYWN0b3IucmVjZWl2ZQ0KICAgICAgICBjYXNl IHRhZw0KICAgICAgICB3aGVuIDpyZWdpc3Rlcg0KICAgICAgICAgIEB0YWtlcnMgPDwgbXNnDQog ICAgICAgIHdoZW4gOnVucmVnaXN0ZXINCiAgICAgICAgICBAdGFrZXJzLmRlbGV0ZSBtc2cNCiAg ICAgICAgd2hlbiA6eWllbGQNCiAgICAgICAgICBAdGFrZXJzLnBvcCA8PCBtc2cNCiAgICAgICAg ZW5kDQogICAgICBlbmQNCiAgICBlbmQNCiAgZW5kDQoNCiAgZGVmIHNlbGYueWllbGQgb2JqDQog ICAgQHlpZWxkX3JhY3RvciA8PCBbOnlpZWxkLCBvYmpdDQogIGVuZA0KDQogIGRlZiB0YWtlDQog ICAgQHlpZWxkX3JhY3RvciA8PCBbOnJlZ2lzdGVyLCBwb3J0ID0gUmFjdG9yOjpQb3J0Lm5ld10N CiAgICBwb3J0LnJlY2VpdmUNCiAgZW5zdXJlDQogICAgQHlpZWxkX3JhY3RvciA8PCBbOnVucmVn aXN0ZXIsIHBvcnRdDQogIGVuZA0KZW5kDQpgYGANCg0KIyMjIE9wZW5pbmcgYW5kIGNsb3Npbmcg dGhlIHBvcnQNCg0KVGhpcyBwcm9wb3NhbCBkb2Vzbid0IGNvbnRhaW4gb3BlbmluZyBhbmQgY2xv c2luZyB0aGUgcG9ydCwgYnV0IHdlIGNhbiBkaXNjdXNzIGFib3V0IGl0LiBUbyBpbnRyb2R1Y2Ug dGhpcyBhdHRyaWJ1dGUsIHdlIG5lZWQgdG8gbWFuYWdlIHdoaWNoIHBvcnRzICh0YWdzKSBhcmUg b3BlbmluZy4NCg0KIyMgSW1wbGVtZW50YXRpb24NCg0KTm93IHRoZSBuYXRpdmUgaW1wbGVtZW50 YXRpb24gaXMgbm90IGZpbmlzaGVkLCBidXQgd2UgY2FuIGltcGxlbWVudCBpdCB1c2luZyB0aGUg YFJhY3Rvci5yZWNlaXZlX2lmYCBtZWNoYW5pc20sIHNvIHdlIGVzdGltYXRlIHRoYXQgb25seSBh IGZldyB3ZWVrcyBvZiB3b3JrIGFyZSBuZWVkZWQgdG8gY29tcGxldGUgaXQuDQoNCiMjIFN1bW1h cnkNCg0KVGhpcyBwcm9wb3NhbCBpbnRyb2R1Y2VzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYW5k IGRlcHJlY2F0aW9ucy4NCg0KKiBgUmFjdG9yOjpQb3J0YA0KICAqIGBQb3J0I3NlbmQobXNnKWAg 4oCTIHNlbmRzIGEgbWVzc2FnZSB0byB0aGUgY3JlYXRvciBvZiB0aGUgcG9ydC4NCiAgKiBgUG9y dCNyZWNlaXZlYCDigJMgcmVjZWl2ZXMgYSBtZXNzYWdlIGZyb20gdGhlIHBvcnQuDQogICogQSBw b3J0IGlzIGEgbGlnaHR3ZWlnaHQgZGF0YSBzdHJ1Y3R1cmUgKGEgcGFpciBvZiBhIFJhY3RvciBh bmQgYSB0YWcpLg0KKiBgUmFjdG9yI2pvaW5gIG9yIGBSYWN0b3IjdmFsdWVgIOKAkyB0byB3YWl0 IGZvciBSYWN0b3IgdGVybWluYXRpb24gKGxpa2UgYFRocmVhZCNqb2luYCkNCiogYFJhY3RvciNt b25pdG9yYCDigJMgdG8gb2JzZXJ2ZSB3aGVuIGFub3RoZXIgUmFjdG9yIHRlcm1pbmF0ZXMNCiog RGVwcmVjYXRpb25zOg0KICAqIGBSYWN0b3IjdGFrZWANCiAgKiBgUmFjdG9yLnlpZWxkYA0KICAq IGBSYWN0b3IucmVjZWl2ZV9pZmANCg0KVGhhbmsgeW91IGZvciByZWFkaW5nIHRoaXMgbG9uZyBw cm9wb3NhbC4gSWYgeW91IGhhdmUgYW55IHVzZSBjYXNlcyB0aGF0IGNhbm5vdCBiZSBhZGRyZXNz ZWQgd2l0aCBgUmFjdG9yOjpQb3J0YCwgSSdkIGxvdmUgdG8gaGVhciB0aGVtLg0KDQoNClAuUy4g VGhhbmtzIHRvIG1hbWUgZm9yIHJldmlld2luZyB0aGlzIHByb3Bvc2FsIGFuZCBzdWdnZXN0aW5n IHRoYXQgSSB1c2UgQ2hhdEdQVCB0byBpbXByb3ZlIHRoZSB3cml0aW5nLg0KDQoNCg0KLS0gDQpo dHRwczovL2J1Z3MucnVieS1sYW5nLm9yZy8NCiBfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCiBydWJ5LWNvcmUgbWFpbGluZyBsaXN0IC0tIHJ1YnktY29yZUBt bC5ydWJ5LWxhbmcub3JnCiBUbyB1bnN1YnNjcmliZSBzZW5kIGFuIGVtYWlsIHRvIHJ1YnktY29y ZS1sZWF2ZUBtbC5ydWJ5LWxhbmcub3JnCiBydWJ5LWNvcmUgaW5mbyAtLSBodHRwczovL21sLnJ1 YnktbGFuZy5vcmcvbWFpbG1hbjMvbGlzdHMvcnVieS1jb3JlLm1sLnJ1YnktbGFuZy5vcmcv