From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-43167.protonmail.ch (mail-43167.protonmail.ch [185.70.43.167]) by mail.trvmpradio.com (Postfix) with ESMTP id 17DDC8127C for ; Thu, 23 Jul 2026 17:35:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com; s=protonmail3; t=1784828129; x=1785087329; bh=iNnhDuB1Xg5gfAKUAO6y82DV84Q1FVbTkTN7zPwXhWs=; h=Date:To:From:Subject:Message-ID:Feedback-ID:From:To:Cc:Date: Subject:Reply-To:Feedback-ID:Message-ID:BIMI-Selector; b=bqUyJtGCWxA9ODYvrgyYV9VLv6s/tZmrFDfLiOd8SYWwz5MrGm4Xxckyr6XMT28s1 4eGWQ14oPiiy/UltW+2pmKGAk2cSGhHSehcqEWNi9/0g/QXzP45R6iioiflmqiW1Cq 1OUsuQqhdPw6sdn10hZQJ7dnN4UdIKRt+mjlXSRdb1H20wMyy5LTWT/oqsu9y9Cewo oxFxvPexRChyUQBCpDELE6xuGaDXIvY+N7WHIzMng90lRaWg/G4pNUGXm9kv+uvmrE 3reZgjgaNTfSS/MZey8YSJry7swlPA2y14sMTiUMqZpV4JGECVbdJRXcOy0uaw38v8 UOeUknITeTj5A== Date: Thu, 23 Jul 2026 17:35:23 +0000 To: "mises-devel@lists.trvmpradio.com" From: kaguya3311 Subject: [ANNOUNCE] mises v0.40.0: dup, dup2 and pipe Message-ID: Feedback-ID: 163699918:user:proton X-Pm-Message-ID: 08830f2ef11a200a2fae9772898792c1e7113e0b MIME-Version: 1.0 Content-Type: multipart/signed; protocol="application/pgp-signature"; micalg=pgp-sha512; boundary="------415342c3e9c7bf3cbbf70be8d984f1860cf7a9f54ca8dc13eeff8d4ccf564510"; charset=utf-8 This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --------415342c3e9c7bf3cbbf70be8d984f1860cf7a9f54ca8dc13eeff8d4ccf564510 Content-Type: multipart/mixed;boundary=---------------------866eaf01d34f4b09b05376659ed525a5 -----------------------866eaf01d34f4b09b05376659ed525a5 Content-Type: multipart/alternative;boundary=---------------------1efebce1b4f985542049c8cf99efc508 -----------------------1efebce1b4f985542049c8cf99efc508 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain;charset=utf-8 Mises v0.40.0 is tagged. It adds the three descriptor syscalls thatredirec= tion is made of, which finishes the kernel side of `>` and `|`. Since v0.39 an fd has been a counted reference to an open file description, and a child inherits its parent's whole table across spawn. What was still missing was any way for the parent to change what a number *means* before it spawns, and any description that is a channel between two processes rather than a file. =C2=A0 0x50 dup(fd) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0-> new= fd =C2=A0 second name, lowest free fd =C2=A0 0x51 dup2(oldfd, newfd) =C2=A0 -> newfd =C2=A0 second name at a cho= sen fd =C2=A0 0x52 pipe(fds_ptr, flags) -> 0 =C2=A0 =C2=A0 =C2=A0 [read_fd, write= _fd], two LE u32 These open a new 0x50..=3D0x5F "descriptor" band rather than spending the file band's last three numbers. The narrow reason is that 0x10..=3D0x1F had exactly three left and link(2) still wants one. The real reason is that none of these takes a path: they operate on the fd table and on open file descriptions, which is a different kind of object -- the same argument the mount band and the system-control band each made. The file band was going to overflow regardless, since lseek, fstat, fcntl, ftruncate, ioctl and poll are all fd-shaped and path-free; those are reserved in the new band. The ABI is append-only, so this was settled before any code was written. dup is literally the existing Tables::link. dup2 is the same with a caller-chosen fd, plus a release of what it displaced -- a real close, flush included. Two orderings in it are load-bearing: the new reference is taken before the displaced one is dropped, and old =3D=3D new returns early having closed nothing but still validating. Get either wrong and dup2 destroys the fd it was asked to preserve. A pipe lives in a new kern::pipe, which is a second leaf lock that the fd layer never nests under: retiring a pipe end wakes the scheduler, so every close path extracts the dying description under the fd lock, drop the guard, and only then retires it. A pipe's readers/writers count DESCRIPTIONS, not fds, which is the whole of end-of-file -- a dup2 or a spawn adds an fd to an existing description and moves neither count. Buffered bytes drain before EOF is reported. A write with no reader is EPIPE; there is no SIGPIPE to send. Userland can now deadlock the machine, which is new. A parent that waits for a child blocked on a pipe nobody drains is the classic pipeline mistake and Mises now has it, for the same reason POSIX does. Tested by user/pipetest and tests/pipe.rs. The probe re-launches itself with a role operand so writer and reader are one binary; the children write to fd 1 and mention no pipe, and the parent re-emits what it read back out *framed*, so "arrived through the pipe" and "went straight to the terminal" are two different strings -- which lets the test require the raw form to be absent. It moves 12 KiB through a 4 KiB pipe with both ends blocking. Six bug-injections were run against it. Three were worth writing down: =C2=A0 - A dup2(fd, fd) check on stderr proves nothing. fds 0/1/2 share on= e =C2=A0 =C2=A0 description, so a close-then-link dup2 drops it from three =C2=A0 =C2=A0 references to two and the fd keeps working by accident. Conf= irmed =C2=A0 =C2=A0 by running the injection with both forms present. =C2=A0 - A leaked pipe is invisible to every behavioural assertion. One =C2=A0 =C2=A0 whose end counts are right but which is never freed reads, w= rites, =C2=A0 =C2=A0 blocks and reports EOF perfectly. Only a count() hook sees t= he page =C2=A0 =C2=A0 it pins each time. =C2=A0 - The drive-loop bound had to be sized from the measured healthy co= st =C2=A0 =C2=A0 (4 spins). At the neighbouring tests' 50,000,000 the deadloc= k =C2=A0 =C2=A0 injection became a 60-second QEMU timeout with no output; at =C2=A0 =C2=A0 200,000 it fails a named assertion in under a second. Rationale, alternatives and invariants: ADR-0051. `>` and `|` are now entirely user/sh's work, with no further kernel change. There is no O_CLOEXEC yet, so a pipeline must spawn its writer first and drain before it waits; both are documented. Suite: 357 [ok] across 58 test binaries (60 Running lines), 0 failed, 0 warnings. =C2=A0 =C2=A0 =C2=A0 =C2=A0 kaguya -----------------------1efebce1b4f985542049c8cf99efc508 Content-Type: multipart/related;boundary=---------------------d82a905f85d0bb5885a63945f2c06262 -----------------------d82a905f85d0bb5885a63945f2c06262 Content-Type: text/html;charset=utf-8 Content-Transfer-Encoding: base64 PGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE0 cHg7Ij48c3Bhbj5NaXNlcyB2MC40MC4wIGlzIHRhZ2dlZC4gSXQgYWRkcyB0aGUgdGhyZWUgZGVz Y3JpcHRvciBzeXNjYWxscyB0aGF0PC9zcGFuPjxkaXY+PHNwYW4+cmVkaXJlY3Rpb24gaXMgbWFk ZSBvZiwgd2hpY2ggZmluaXNoZXMgdGhlIGtlcm5lbCBzaWRlIG9mIGAmZ3Q7YCBhbmQgYHxgLjwv c3Bhbj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PjxzcGFuPlNpbmNlIHYwLjM5IGFuIGZkIGhh cyBiZWVuIGEgY291bnRlZCByZWZlcmVuY2UgdG8gYW4gb3BlbiBmaWxlPC9zcGFuPjwvZGl2Pjxk aXY+PHNwYW4+ZGVzY3JpcHRpb24sIGFuZCBhIGNoaWxkIGluaGVyaXRzIGl0cyBwYXJlbnQncyB3 aG9sZSB0YWJsZSBhY3Jvc3M8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj5zcGF3bi4gV2hhdCB3YXMg c3RpbGwgbWlzc2luZyB3YXMgYW55IHdheSBmb3IgdGhlIHBhcmVudCB0byBjaGFuZ2U8L3NwYW4+ PC9kaXY+PGRpdj48c3Bhbj53aGF0IGEgbnVtYmVyICptZWFucyogYmVmb3JlIGl0IHNwYXducywg YW5kIGFueSBkZXNjcmlwdGlvbiB0aGF0IGlzIGE8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj5jaGFu bmVsIGJldHdlZW4gdHdvIHByb2Nlc3NlcyByYXRoZXIgdGhhbiBhIGZpbGUuPC9zcGFuPjwvZGl2 PjxkaXY+PGJyPjwvZGl2PjxkaXY+PHNwYW4+Jm5ic3A7IDB4NTAgZHVwKGZkKSAmbmJzcDsgJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDstJmd0OyBuZXdmZCAmbmJzcDsg c2Vjb25kIG5hbWUsIGxvd2VzdCBmcmVlIGZkPC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+Jm5ic3A7 IDB4NTEgZHVwMihvbGRmZCwgbmV3ZmQpICZuYnNwOyAtJmd0OyBuZXdmZCAmbmJzcDsgc2Vjb25k IG5hbWUgYXQgYSBjaG9zZW4gZmQ8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj4mbmJzcDsgMHg1MiBw aXBlKGZkc19wdHIsIGZsYWdzKSAtJmd0OyAwICZuYnNwOyAmbmJzcDsgJm5ic3A7IFtyZWFkX2Zk LCB3cml0ZV9mZF0sIHR3byBMRSB1MzI8L3NwYW4+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj48 c3Bhbj5UaGVzZSBvcGVuIGEgbmV3IDB4NTAuLj0weDVGICJkZXNjcmlwdG9yIiBiYW5kIHJhdGhl ciB0aGFuIHNwZW5kaW5nIHRoZTwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPmZpbGUgYmFuZCdzIGxh c3QgdGhyZWUgbnVtYmVycy4gVGhlIG5hcnJvdyByZWFzb24gaXMgdGhhdCAweDEwLi49MHgxRjwv c3Bhbj48L2Rpdj48ZGl2PjxzcGFuPmhhZCBleGFjdGx5IHRocmVlIGxlZnQgYW5kIGxpbmsoMikg c3RpbGwgd2FudHMgb25lLiBUaGUgcmVhbCByZWFzb24gaXM8L3NwYW4+PC9kaXY+PGRpdj48c3Bh bj50aGF0IG5vbmUgb2YgdGhlc2UgdGFrZXMgYSBwYXRoOiB0aGV5IG9wZXJhdGUgb24gdGhlIGZk IHRhYmxlIGFuZCBvbjwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPm9wZW4gZmlsZSBkZXNjcmlwdGlv bnMsIHdoaWNoIGlzIGEgZGlmZmVyZW50IGtpbmQgb2Ygb2JqZWN0IC0tIHRoZSBzYW1lPC9zcGFu PjwvZGl2PjxkaXY+PHNwYW4+YXJndW1lbnQgdGhlIG1vdW50IGJhbmQgYW5kIHRoZSBzeXN0ZW0t Y29udHJvbCBiYW5kIGVhY2ggbWFkZS4gVGhlIGZpbGU8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj5i YW5kIHdhcyBnb2luZyB0byBvdmVyZmxvdyByZWdhcmRsZXNzLCBzaW5jZSBsc2VlaywgZnN0YXQs IGZjbnRsLDwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPmZ0cnVuY2F0ZSwgaW9jdGwgYW5kIHBvbGwg YXJlIGFsbCBmZC1zaGFwZWQgYW5kIHBhdGgtZnJlZTsgdGhvc2UgYXJlPC9zcGFuPjwvZGl2Pjxk aXY+PHNwYW4+cmVzZXJ2ZWQgaW4gdGhlIG5ldyBiYW5kLiBUaGUgQUJJIGlzIGFwcGVuZC1vbmx5 LCBzbyB0aGlzIHdhcyBzZXR0bGVkPC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+YmVmb3JlIGFueSBj b2RlIHdhcyB3cml0dGVuLjwvc3Bhbj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PjxzcGFuPmR1 cCBpcyBsaXRlcmFsbHkgdGhlIGV4aXN0aW5nIFRhYmxlczo6bGluay4gZHVwMiBpcyB0aGUgc2Ft ZSB3aXRoIGE8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj5jYWxsZXItY2hvc2VuIGZkLCBwbHVzIGEg cmVsZWFzZSBvZiB3aGF0IGl0IGRpc3BsYWNlZCAtLSBhIHJlYWwgY2xvc2UsPC9zcGFuPjwvZGl2 PjxkaXY+PHNwYW4+Zmx1c2ggaW5jbHVkZWQuIFR3byBvcmRlcmluZ3MgaW4gaXQgYXJlIGxvYWQt YmVhcmluZzogdGhlIG5ldyByZWZlcmVuY2U8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj5pcyB0YWtl biBiZWZvcmUgdGhlIGRpc3BsYWNlZCBvbmUgaXMgZHJvcHBlZCwgYW5kIG9sZCA9PSBuZXcgcmV0 dXJuczwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPmVhcmx5IGhhdmluZyBjbG9zZWQgbm90aGluZyBi dXQgc3RpbGwgdmFsaWRhdGluZy4gR2V0IGVpdGhlciB3cm9uZyBhbmQ8L3NwYW4+PC9kaXY+PGRp dj48c3Bhbj5kdXAyIGRlc3Ryb3lzIHRoZSBmZCBpdCB3YXMgYXNrZWQgdG8gcHJlc2VydmUuPC9z cGFuPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+PHNwYW4+QSBwaXBlIGxpdmVzIGluIGEgbmV3 IGtlcm46OnBpcGUsIHdoaWNoIGlzIGEgc2Vjb25kIGxlYWYgbG9jayB0aGF0IHRoZTwvc3Bhbj48 L2Rpdj48ZGl2PjxzcGFuPmZkIGxheWVyIG5ldmVyIG5lc3RzIHVuZGVyOiByZXRpcmluZyBhIHBp cGUgZW5kIHdha2VzIHRoZSBzY2hlZHVsZXIsIHNvPC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+ZXZl cnkgY2xvc2UgcGF0aCBleHRyYWN0cyB0aGUgZHlpbmcgZGVzY3JpcHRpb24gdW5kZXIgdGhlIGZk IGxvY2ssIGRyb3A8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj50aGUgZ3VhcmQsIGFuZCBvbmx5IHRo ZW4gcmV0aXJlcyBpdC4gQSBwaXBlJ3MgcmVhZGVycy93cml0ZXJzIGNvdW50PC9zcGFuPjwvZGl2 PjxkaXY+PHNwYW4+REVTQ1JJUFRJT05TLCBub3QgZmRzLCB3aGljaCBpcyB0aGUgd2hvbGUgb2Yg ZW5kLW9mLWZpbGUgLS0gYSBkdXAyIG9yIGE8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj5zcGF3biBh ZGRzIGFuIGZkIHRvIGFuIGV4aXN0aW5nIGRlc2NyaXB0aW9uIGFuZCBtb3ZlcyBuZWl0aGVyIGNv dW50Ljwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPkJ1ZmZlcmVkIGJ5dGVzIGRyYWluIGJlZm9yZSBF T0YgaXMgcmVwb3J0ZWQuIEEgd3JpdGUgd2l0aCBubyByZWFkZXIgaXM8L3NwYW4+PC9kaXY+PGRp dj48c3Bhbj5FUElQRTsgdGhlcmUgaXMgbm8gU0lHUElQRSB0byBzZW5kLjwvc3Bhbj48L2Rpdj48 ZGl2Pjxicj48L2Rpdj48ZGl2PjxzcGFuPlVzZXJsYW5kIGNhbiBub3cgZGVhZGxvY2sgdGhlIG1h Y2hpbmUsIHdoaWNoIGlzIG5ldy4gQSBwYXJlbnQgdGhhdCB3YWl0czwvc3Bhbj48L2Rpdj48ZGl2 PjxzcGFuPmZvciBhIGNoaWxkIGJsb2NrZWQgb24gYSBwaXBlIG5vYm9keSBkcmFpbnMgaXMgdGhl IGNsYXNzaWMgcGlwZWxpbmU8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj5taXN0YWtlIGFuZCBNaXNl cyBub3cgaGFzIGl0LCBmb3IgdGhlIHNhbWUgcmVhc29uIFBPU0lYIGRvZXMuPC9zcGFuPjwvZGl2 PjxkaXY+PGJyPjwvZGl2PjxkaXY+PHNwYW4+VGVzdGVkIGJ5IHVzZXIvcGlwZXRlc3QgYW5kIHRl c3RzL3BpcGUucnMuIFRoZSBwcm9iZSByZS1sYXVuY2hlcyBpdHNlbGY8L3NwYW4+PC9kaXY+PGRp dj48c3Bhbj53aXRoIGEgcm9sZSBvcGVyYW5kIHNvIHdyaXRlciBhbmQgcmVhZGVyIGFyZSBvbmUg YmluYXJ5OyB0aGUgY2hpbGRyZW48L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj53cml0ZSB0byBmZCAx IGFuZCBtZW50aW9uIG5vIHBpcGUsIGFuZCB0aGUgcGFyZW50IHJlLWVtaXRzIHdoYXQgaXQgcmVh ZDwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPmJhY2sgb3V0ICpmcmFtZWQqLCBzbyAiYXJyaXZlZCB0 aHJvdWdoIHRoZSBwaXBlIiBhbmQgIndlbnQgc3RyYWlnaHQgdG88L3NwYW4+PC9kaXY+PGRpdj48 c3Bhbj50aGUgdGVybWluYWwiIGFyZSB0d28gZGlmZmVyZW50IHN0cmluZ3MgLS0gd2hpY2ggbGV0 cyB0aGUgdGVzdCByZXF1aXJlPC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+dGhlIHJhdyBmb3JtIHRv IGJlIGFic2VudC4gSXQgbW92ZXMgMTIgS2lCIHRocm91Z2ggYSA0IEtpQiBwaXBlIHdpdGg8L3Nw YW4+PC9kaXY+PGRpdj48c3Bhbj5ib3RoIGVuZHMgYmxvY2tpbmcuPC9zcGFuPjwvZGl2PjxkaXY+ PGJyPjwvZGl2PjxkaXY+PHNwYW4+U2l4IGJ1Zy1pbmplY3Rpb25zIHdlcmUgcnVuIGFnYWluc3Qg aXQuIFRocmVlIHdlcmUgd29ydGggd3JpdGluZyBkb3duOjwvc3Bhbj48L2Rpdj48ZGl2Pjxicj48 L2Rpdj48ZGl2PjxzcGFuPiZuYnNwOyAtIEEgZHVwMihmZCwgZmQpIGNoZWNrIG9uIHN0ZGVyciBw cm92ZXMgbm90aGluZy4gZmRzIDAvMS8yIHNoYXJlIG9uZTwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFu PiZuYnNwOyAmbmJzcDsgZGVzY3JpcHRpb24sIHNvIGEgY2xvc2UtdGhlbi1saW5rIGR1cDIgZHJv cHMgaXQgZnJvbSB0aHJlZTwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPiZuYnNwOyAmbmJzcDsgcmVm ZXJlbmNlcyB0byB0d28gYW5kIHRoZSBmZCBrZWVwcyB3b3JraW5nIGJ5IGFjY2lkZW50LiBDb25m aXJtZWQ8L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj4mbmJzcDsgJm5ic3A7IGJ5IHJ1bm5pbmcgdGhl IGluamVjdGlvbiB3aXRoIGJvdGggZm9ybXMgcHJlc2VudC48L3NwYW4+PC9kaXY+PGRpdj48YnI+ PC9kaXY+PGRpdj48c3Bhbj4mbmJzcDsgLSBBIGxlYWtlZCBwaXBlIGlzIGludmlzaWJsZSB0byBl dmVyeSBiZWhhdmlvdXJhbCBhc3NlcnRpb24uIE9uZTwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPiZu YnNwOyAmbmJzcDsgd2hvc2UgZW5kIGNvdW50cyBhcmUgcmlnaHQgYnV0IHdoaWNoIGlzIG5ldmVy IGZyZWVkIHJlYWRzLCB3cml0ZXMsPC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+Jm5ic3A7ICZuYnNw OyBibG9ja3MgYW5kIHJlcG9ydHMgRU9GIHBlcmZlY3RseS4gT25seSBhIGNvdW50KCkgaG9vayBz ZWVzIHRoZSBwYWdlPC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+Jm5ic3A7ICZuYnNwOyBpdCBwaW5z IGVhY2ggdGltZS48L3NwYW4+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj48c3Bhbj4mbmJzcDsg LSBUaGUgZHJpdmUtbG9vcCBib3VuZCBoYWQgdG8gYmUgc2l6ZWQgZnJvbSB0aGUgbWVhc3VyZWQg aGVhbHRoeSBjb3N0PC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+Jm5ic3A7ICZuYnNwOyAoNCBzcGlu cykuIEF0IHRoZSBuZWlnaGJvdXJpbmcgdGVzdHMnIDUwLDAwMCwwMDAgdGhlIGRlYWRsb2NrPC9z cGFuPjwvZGl2PjxkaXY+PHNwYW4+Jm5ic3A7ICZuYnNwOyBpbmplY3Rpb24gYmVjYW1lIGEgNjAt c2Vjb25kIFFFTVUgdGltZW91dCB3aXRoIG5vIG91dHB1dDsgYXQ8L3NwYW4+PC9kaXY+PGRpdj48 c3Bhbj4mbmJzcDsgJm5ic3A7IDIwMCwwMDAgaXQgZmFpbHMgYSBuYW1lZCBhc3NlcnRpb24gaW4g dW5kZXIgYSBzZWNvbmQuPC9zcGFuPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+PHNwYW4+UmF0 aW9uYWxlLCBhbHRlcm5hdGl2ZXMgYW5kIGludmFyaWFudHM6IEFEUi0wMDUxLjwvc3Bhbj48L2Rp dj48ZGl2Pjxicj48L2Rpdj48ZGl2PjxzcGFuPmAmZ3Q7YCBhbmQgYHxgIGFyZSBub3cgZW50aXJl bHkgdXNlci9zaCdzIHdvcmssIHdpdGggbm8gZnVydGhlciBrZXJuZWw8L3NwYW4+PC9kaXY+PGRp dj48c3Bhbj5jaGFuZ2UuIFRoZXJlIGlzIG5vIE9fQ0xPRVhFQyB5ZXQsIHNvIGEgcGlwZWxpbmUg bXVzdCBzcGF3biBpdHMgd3JpdGVyPC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+Zmlyc3QgYW5kIGRy YWluIGJlZm9yZSBpdCB3YWl0czsgYm90aCBhcmUgZG9jdW1lbnRlZC48L3NwYW4+PC9kaXY+PGRp dj48YnI+PC9kaXY+PGRpdj48c3Bhbj5TdWl0ZTogMzU3IFtva10gYWNyb3NzIDU4IHRlc3QgYmlu YXJpZXMgKDYwIFJ1bm5pbmcgbGluZXMpLCAwIGZhaWxlZCw8L3NwYW4+PC9kaXY+PHNwYW4+MCB3 YXJuaW5ncy48L3NwYW4+PGJyPjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OiBBcmlhbCwg c2Fucy1zZXJpZjsgZm9udC1zaXplOiAxNHB4OyI+PGJyPjwvZGl2Pgo8ZGl2IHN0eWxlPSJmb250 LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTRweDsiIGNsYXNzPSJwcm90 b25tYWlsX3NpZ25hdHVyZV9ibG9jayI+CiAgICA8ZGl2IGNsYXNzPSJwcm90b25tYWlsX3NpZ25h dHVyZV9ibG9jay11c2VyIj4KICAgICAgICA8ZGl2IHN0eWxlPSJmb250LWZhbWlseTogQXJpYWws IHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTRweDsgY29sb3I6IHJnYigwLCAwLCAwKTsgYmFja2dy b3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOyI+PGJyPjwvZGl2PjxkaXYgc3R5bGU9ImZv bnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogcmdi KDAsIDAsIDApOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7Ij48c3Bhbj4m bmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsga2FndXlhPC9zcGFuPjwvZGl2PjwvZGl2Pgo8L2Rp dj4K -----------------------d82a905f85d0bb5885a63945f2c06262-- -----------------------1efebce1b4f985542049c8cf99efc508-- -----------------------866eaf01d34f4b09b05376659ed525a5 Content-Type: application/pgp-keys; filename="publickey - vpshinomiya@protonmail.com - 0x09BF9D29.asc"; name="publickey - vpshinomiya@protonmail.com - 0x09BF9D29.asc" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="publickey - vpshinomiya@protonmail.com - 0x09BF9D29.asc"; name="publickey - vpshinomiya@protonmail.com - 0x09BF9D29.asc" LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCgp4ak1FYVBGR1N4WUpLd1lCQkFI YVJ3OEJBUWRBakd2YjVNUzUyZXlvNTZTUVF5QnBSZlo0anlKeC9hcWEKeHhtQ1pFajVPS2ZOTjNa d2MyaHBibTl0YVhsaFFIQnliM1J2Ym0xaGFXd3VZMjl0SUR4MmNITm9hVzV2CmJXbDVZVUJ3Y205 MGIyNXRZV2xzTG1OdmJUN0N3QkVFRXhZS0FJTUZnbWp4UmtzREN3a0hDUkFrZjQxOApaekJKMFVV VUFBQUFBQUFjQUNCellXeDBRRzV2ZEdGMGFXOXVjeTV2Y0dWdWNHZHdhbk11YjNKbmZYUisKMm0w VFZVUkp3aFJKQ1ZPM0NhVys5WmxnZGRpSEhGOWthOWcxeTJvREZRb0lCQllBQWdFQ0dRRUNtd01D CkhnRVdJUVFKdjUwcEk5SENlR3haa1Jna2Y0MThaekJKMFFBQWE0WUEvaS94LytNeFVrWVU1ZFgr Q21CVApDZW50YzIxSTRtL0ZVQWNmVm1BL2s2ak5BUDk1QXpCcjBkeml3bElhWGhwRFhzN01STVUw bmlYQi9BQmIKUHBab3dCcTBDYzQ0QkdqeFJrc1NDaXNHQVFRQmwxVUJCUUVCQjBCTjRvSDNBWmdu empzSC9yV1BQV1pCClZaaWdXYXBzTWIrckNoVjRDbUVmYkFNQkNBZkN2Z1FZRmdvQWNBV0NhUEZH U3drUUpIK05mR2N3U2RGRgpGQUFBQUFBQUhBQWdjMkZzZEVCdWIzUmhkR2x2Ym5NdWIzQmxibkJu Y0dwekxtOXlad2trSDFDZlVWY0EKREpvWkxkTWtFV2VIYytQUmpHY0hDTkhzUEJuS05zOFNBcHNN RmlFRUNiK2RLU1BSd25oc1daRVlKSCtOCmZHY3dTZEVBQUxtVUFQMFZjZ1JCWE0wa1VUdCswcXM0 Y0N0Z29WT3dCUW0zcUQxWExXcHJsN1Q5SEFEKwpMZVBYU3RpU1liL0VzRjdQTFVXREozMjVtL3U1 Vlh0aGx5Ni9VeVB6SGdvPQo9dTM3awotLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0t Cg== -----------------------866eaf01d34f4b09b05376659ed525a5-- --------415342c3e9c7bf3cbbf70be8d984f1860cf7a9f54ca8dc13eeff8d4ccf564510 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: ProtonMail wrsEARYKAG0FgmpiUM0JECR/jXxnMEnRRRQAAAAAABwAIHNhbHRAbm90YXRp b25zLm9wZW5wZ3Bqcy5vcmfgUXHLK67SwtS4AVMzDlVLwcylDWCf1BjipABM 6164uBYhBAm/nSkj0cJ4bFmRGCR/jXxnMEnRAADa2QD/TWkcFGImN1TCe+AU NapTVO8NNv2LdySzxYjcdTgp1bkA/0wBzaY2kbCV/t4WKafmX9ft9DW8iHfR BhBAyUx4UR0L =V+WQ -----END PGP SIGNATURE----- --------415342c3e9c7bf3cbbf70be8d984f1860cf7a9f54ca8dc13eeff8d4ccf564510--