From nobody Sat Aug 2 03:02:24 2025 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4bv70b0kJtz63TTR; Sat, 02 Aug 2025 03:02:39 +0000 (UTC) (envelope-from asomers@gmail.com) Received: from mail-ej1-f48.google.com (mail-ej1-f48.google.com [209.85.218.48]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "WR4" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4bv70Z4SVvz3vGg; Sat, 02 Aug 2025 03:02:38 +0000 (UTC) (envelope-from asomers@gmail.com) Authentication-Results: mx1.freebsd.org; none Received: by mail-ej1-f48.google.com with SMTP id a640c23a62f3a-af91a6b7a06so464757266b.2; Fri, 01 Aug 2025 20:02:38 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1754103757; x=1754708557; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=TcH+slRu8bFf0XMgqSeKAQL99MOOxrB9RCjw7d6iD+A=; b=uqgm8E7kVZTDD11GDOhu1TIv7zLuCx9JpLKhrPo4L+FCzq4V5R69r70cv2FJzNY9nS e+xIbJNbtQdBh5lOIAbOOd2Wysw+daqMUsSyTrrPh9PG2eOofjFf6wPn8kDrSzhXu9xf +4LlfiVJX/Ho8V4mFJNhonJf5p1wInUfxY6FPI5BbnIv7/cyUPxKdkfmqpKBFqyXeAJN x1dyvIH3z6TFOEFnVFjm4F1oPlvOfz0lNCfy4xowMmcklak9iMcQV8U/pQOgiwiZr4+e bptc4rADy7GvWiOo3OkPG/KIp9KG5j6VbQzqLCOJPeqfYE2qytISboIsMXg/WteQZeBv c1+A== X-Forwarded-Encrypted: i=1; AJvYcCUlG8Yra4SHxWl+kqY/d96TVHkwzUixjwYvTOKNEZ5s/UvJ2issUI7yk0R2w9yPpJvCDcEKqWiQJiBtJu5oajUY3Ut+4ug=@freebsd.org, AJvYcCVLT4wUshGSh7+76LbkWeQ/nK2mNlJH1mqGTK+wQGJ3sOQrc2+eVdx0VU1OGq1KSaluwuTGMeshyHQ+eqMknl+fjkkm@freebsd.org, AJvYcCWPyymfH9lN2LcjkBYfTUk2Hq6UwTHAXYGafktZLR4RoMmku7CrXzxl835zpskV+6E/ABfi1g==@freebsd.org X-Gm-Message-State: AOJu0Yydgs0wiEExYk32XSitjYJDElcPiw+U8l+bhT7byrW15FBrhVYn AOFrP9SKl1BRJ7Y6Q+GuTRLr6AyvXV/4Vru+Ow5Tc/uE9XoSDrExVqe88VW4nSzdqkR+mPcJOGs FT3nLQGKlyna0pEZ3xDDPj5Bk+w9RL1c= X-Gm-Gg: ASbGncvqj+t4yNTBg5f088SOCahbTWa9sb+nC71GD1KsCpX+dPcTi765ug47fM50aRS vzy/ZTZ4ELZsOR6yMfFRnRKmgiKdcpAOuG8D3als54xxYYWOU0PrC6ErRLRQOaxKvIeGLX8RMYr D651SzG1zJ2+K8IT22ZRPfWwpwUMPrSai35wm4H07qUN26OKEVs/M/YcUc/z5OPpaIukRFZiCMM AYFQ7s= X-Google-Smtp-Source: AGHT+IHP0Pulv3caViVrgMzAktIUalQ7RNxBHftwZREXMA2ofQCQjxQFXmUVTiJd502eTBBAr5MBBLWV8COAY1gryH8= X-Received: by 2002:a17:907:96ac:b0:ad5:74cd:1824 with SMTP id a640c23a62f3a-af9401877f6mr190965666b.38.1754103756708; Fri, 01 Aug 2025 20:02:36 -0700 (PDT) List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 References: <202507302027.56UKRhb5011315@gitrepo.freebsd.org> <8F928557-328D-46E9-BB53-BDE216693BFC@juniper.net> In-Reply-To: <8F928557-328D-46E9-BB53-BDE216693BFC@juniper.net> From: Alan Somers Date: Fri, 1 Aug 2025 21:02:24 -0600 X-Gm-Features: Ac12FXyegoO5SfVWnPoKySeHtSo9jH6y6ppigJY8OlRwX1uz045W4nFrG-ZJpDE Message-ID: Subject: Re: git: 7b35b4d19630 - main - sockstat: add libxo support To: Phil Shafer Cc: src-committers@freebsd.org, dev-commits-src-all@freebsd.org, dev-commits-src-main@freebsd.org, Damin Rido Content-Type: multipart/alternative; boundary="0000000000005160c5063b591b61" X-Rspamd-Queue-Id: 4bv70Z4SVvz3vGg X-Spamd-Bar: ---- X-Rspamd-Pre-Result: action=no action; module=replies; Message is reply to one we originated X-Spamd-Result: default: False [-4.00 / 15.00]; REPLY(-4.00)[]; ASN(0.00)[asn:15169, ipnet:209.85.128.0/17, country:US] --0000000000005160c5063b591b61 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable CC'ing Damin Rido. I haven't had time to look at all of Phil's observations yet, but I probably will this weekend. On Fri, Aug 1, 2025 at 11:11=E2=80=AFAM Phil Shafer wrot= e: > This looks good. Some issues below: > > On 30 Jul 2025, at 16:27, Alan Somers wrote: > > @@ -1345,65 +1380,104 @@ display_sock(struct sock *s, struct col_widths > *cw, char *buf, size_t bufsize) > > ... > >> + } else if (laddr->address.ss_len =3D=3D 0 && > > + faddr->conn =3D=3D 0 && is_text_style) = { > > + xo_emit(" {:/%-*.*s}", cw->local_addr, > > + cw->local_addr, "(not > connected)"); > > + } else if (is_text_style) { > > + xo_emit(" {:/%-*.*s}", cw->local_addr, > > + cw->local_addr, "??"); > > + } > > These calls are missing a field name; you should have seen warning for > this, something like: > > foo: missing field name: %-*.*s > ?? > > You'll need something like "{:local-address/%*.*s}". > > Please be sure to test with "--libxo:W", which will report many issues. > Also there's "xolint" for checking source code. > I can't trigger any warnings, with any combination of options. Probably I don't have the same type of socket that you do. What kind of socket is triggering warnings for you? > > Longer term, I'd like to make some sort of clang plugin to report > formatting issues at build time. > > > @@ -1436,47 +1510,52 @@ display_sock(struct sock *s, struct col_widths > *cw, char *buf, size_t bufsize) > > s->proto =3D=3D IPPROTO_TCP) { > > switch (s->proto) { > > case IPPROTO_SCTP: > > - printf(" %-*s", > cw->conn_state, > > - > sctp_conn_state(s->state)); > > + xo_emit(" > {:path-state/%-*s}", > > + cw->path_state, > > + sctp_path_state= ( > > + > faddr->state)); > > break; > > Is the change from conn_state to path_state intentional? > > > > + if (xo_get_style(NULL) =3D=3D XO_STYLE_TEXT) { > > + cw =3D (struct col_widths) { > > ... > > Here and elsewhere: when you check for XO_STYLE_TEXT for formatting, > you'll also care about XO_STYLE_HTML and other future styles. I have a > function in libxo that's currently private/static: > > /* > * Indicate if the style is an "encoding" one as opposed to a > "display" one. > */ > static int > xo_style_is_encoding (xo_handle_t *xop) > { > if (xo_style(xop) =3D=3D XO_STYLE_JSON > || xo_style(xop) =3D=3D XO_STYLE_XML > || xo_style(xop) =3D=3D XO_STYLE_SDPARAMS > || xo_style(xop) =3D=3D XO_STYLE_ENCODER) > return TRUE; > return FALSE; > } > > I can make that public, allowing you to say "if > (!xo_style_is_encoding(NULL)) { ... }", but for now, you'll need to > explicitly test for XO_STYLE_HTML. > > > + xo_error( > > +"usage: sockstat [--libxo] [-46ACcfIiLlnqSsUuvw] [-j jid] [-p ports]\n= " > > +" [-P protocols]\n"); > > + exit(1); > > I don't have a real convention for this, but maybe "[--libxo ...]" would > convey that there's content with the option? > > Thanks, > Phil > --0000000000005160c5063b591b61 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdj5DQyYjMzk7aW5nIERhbWluIFJpZG8uwqAgSSBoYXZlbiYjMzk7 dCBoYWQgdGltZSB0byBsb29rIGF0IGFsbCBvZiBQaGlsJiMzOTtzIG9ic2VydmF0aW9ucyB5ZXQs IGJ1dCBJIHByb2JhYmx5IHdpbGwgdGhpcyB3ZWVrZW5kLjwvZGl2PjxkaXY+PGJyPjwvZGl2Pjxk aXYgY2xhc3M9ImdtYWlsX3F1b3RlIGdtYWlsX3F1b3RlX2NvbnRhaW5lciI+PGRpdiBkaXI9Imx0 ciIgY2xhc3M9ImdtYWlsX2F0dHIiPk9uIEZyaSwgQXVnIDEsIDIwMjUgYXQgMTE6MTHigK9BTSBQ aGlsIFNoYWZlciAmbHQ7PGEgaHJlZj0ibWFpbHRvOnBoaWxAanVuaXBlci5uZXQiPnBoaWxAanVu aXBlci5uZXQ8L2E+Jmd0OyB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWls X3F1b3RlIiBzdHlsZT0ibWFyZ2luOjBweCAwcHggMHB4IDAuOGV4O2JvcmRlci1sZWZ0OjFweCBz b2xpZCByZ2IoMjA0LDIwNCwyMDQpO3BhZGRpbmctbGVmdDoxZXgiPlRoaXMgbG9va3MgZ29vZC7C oCBTb21lIGlzc3VlcyBiZWxvdzo8YnI+DQo8YnI+DQpPbiAzMCBKdWwgMjAyNSwgYXQgMTY6Mjcs IEFsYW4gU29tZXJzIHdyb3RlOjxicj4NCiZndDsgQEAgLTEzNDUsNjUgKzEzODAsMTA0IEBAIGRp c3BsYXlfc29jayhzdHJ1Y3Qgc29jayAqcywgc3RydWN0IGNvbF93aWR0aHMgKmN3LCBjaGFyICpi dWYsIHNpemVfdCBidWZzaXplKTxicj4NCiZndDsgLi4uPGJyPg0KJmd0OyZndDsgK8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNlIGlmIChsYWRkci0mZ3Q7YWRkcmVzcy5z c19sZW4gPT0gMCAmYW1wOyZhbXA7PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBmYWRkci0mZ3Q7Y29ubiA9PSAwICZhbXA7JmFtcDsgaXNf dGV4dF9zdHlsZSkgezxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgeG9fZW1pdCgmcXVvdDsgezovJS0qLipzfSZxdW90OywgY3ctJmd0O2xv Y2FsX2FkZHIsPGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjdy0mZ3Q7bG9jYWxfYWRkciwgJnF1b3Q7KG5vdCBjb25u ZWN0ZWQpJnF1b3Q7KTs8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoH0gZWxzZSBpZiAoaXNfdGV4dF9zdHlsZSkgezxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgeG9fZW1pdCgmcXVvdDsgezovJS0qLipz fSZxdW90OywgY3ctJmd0O2xvY2FsX2FkZHIsPGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjdy0mZ3Q7bG9jYWxfYWRk ciwgJnF1b3Q7Pz8mcXVvdDspOzxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgfTxicj4NCjxicj4NClRoZXNlIGNhbGxzIGFyZSBtaXNzaW5nIGEgZmllbGQgbmFt ZTsgeW91IHNob3VsZCBoYXZlIHNlZW4gd2FybmluZyBmb3IgdGhpcywgc29tZXRoaW5nIGxpa2U6 PGJyPg0KPGJyPg0KwqAgZm9vOiBtaXNzaW5nIGZpZWxkIG5hbWU6ICUtKi4qczxicj4NCsKgICZs dDttaXNzaW5nLWZpZWxkLW5hbWUmZ3Q7Pz/CoCDCoCDCoCAmbHQ7L21pc3NpbmctZmllbGQtbmFt ZSZndDs8YnI+DQo8YnI+DQpZb3UmIzM5O2xsIG5lZWQgc29tZXRoaW5nIGxpa2UgJnF1b3Q7ezps b2NhbC1hZGRyZXNzLyUqLipzfSZxdW90Oy48YnI+DQo8YnI+DQpQbGVhc2UgYmUgc3VyZSB0byB0 ZXN0IHdpdGggJnF1b3Q7LS1saWJ4bzpXJnF1b3Q7LCB3aGljaCB3aWxsIHJlcG9ydCBtYW55IGlz c3Vlcy7CoCBBbHNvIHRoZXJlJiMzOTtzICZxdW90O3hvbGludCZxdW90OyBmb3IgY2hlY2tpbmcg c291cmNlIGNvZGUuPGJyPjwvYmxvY2txdW90ZT48ZGl2Pjxicj48L2Rpdj48ZGl2PkkgY2FuJiMz OTt0IHRyaWdnZXIgYW55IHdhcm5pbmdzLCB3aXRoIGFueSBjb21iaW5hdGlvbiBvZiBvcHRpb25z LsKgIFByb2JhYmx5IEkgZG9uJiMzOTt0IGhhdmUgdGhlIHNhbWUgdHlwZSBvZiBzb2NrZXQgdGhh dCB5b3UgZG8uwqAgV2hhdCBraW5kIG9mIHNvY2tldCBpcyB0cmlnZ2VyaW5nIHdhcm5pbmdzIGZv ciB5b3U/PC9kaXY+PGRpdj7CoDwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIg c3R5bGU9Im1hcmdpbjowcHggMHB4IDBweCAwLjhleDtib3JkZXItbGVmdDoxcHggc29saWQgcmdi KDIwNCwyMDQsMjA0KTtwYWRkaW5nLWxlZnQ6MWV4Ij4NCjxicj4NCkxvbmdlciB0ZXJtLCBJJiMz OTtkIGxpa2UgdG8gbWFrZSBzb21lIHNvcnQgb2YgY2xhbmcgcGx1Z2luIHRvIHJlcG9ydCBmb3Jt YXR0aW5nIGlzc3VlcyBhdCBidWlsZCB0aW1lLjxicj4NCjxicj4NCiZndDsgQEAgLTE0MzYsNDcg KzE1MTAsNTIgQEAgZGlzcGxheV9zb2NrKHN0cnVjdCBzb2NrICpzLCBzdHJ1Y3QgY29sX3dpZHRo cyAqY3csIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUpPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcy0mZ3Q7cHJvdG8gPT0g SVBQUk9UT19UQ1ApIHs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzd2l0Y2ggKHMtJmd0O3Byb3RvKSB7PGJyPg0K Jmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgY2FzZSBJUFBST1RPX1NDVFA6PGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBwcmlu dGYoJnF1b3Q7ICUtKnMmcXVvdDssIGN3LSZndDtjb25uX3N0YXRlLDxicj4NCiZndDsgLcKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgc2N0cF9jb25uX3N0YXRlKHMtJmd0O3N0YXRlKSk7PGJyPg0KJmd0OyAr wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqB4b19lbWl0KCZxdW90OyB7OnBhdGgtc3RhdGUvJS0qc30mcXVvdDssPGJy Pg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjdy0mZ3Q7cGF0aF9zdGF0ZSw8YnI+ DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNjdHBfcGF0aF9zdGF0ZSg8YnI+DQom Z3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGZhZGRyLSZndDtzdGF0 ZSkpOzxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzxicj4NCjxicj4NCklzIHRoZSBj aGFuZ2UgZnJvbSBjb25uX3N0YXRlIHRvIHBhdGhfc3RhdGUgaW50ZW50aW9uYWw/PGJyPg0KPGJy Pg0KPGJyPg0KJmd0OyArwqAgwqAgwqAgwqBpZiAoeG9fZ2V0X3N0eWxlKE5VTEwpID09IFhPX1NU WUxFX1RFWFQpIHs8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGN3ID0gKHN0cnVj dCBjb2xfd2lkdGhzKSB7PGJyPg0KJmd0OyAuLi48YnI+DQo8YnI+DQpIZXJlIGFuZCBlbHNld2hl cmU6IHdoZW4geW91IGNoZWNrIGZvciBYT19TVFlMRV9URVhUIGZvciBmb3JtYXR0aW5nLCB5b3Um IzM5O2xsIGFsc28gY2FyZSBhYm91dCBYT19TVFlMRV9IVE1MIGFuZCBvdGhlciBmdXR1cmUgc3R5 bGVzLsKgIEkgaGF2ZSBhIGZ1bmN0aW9uIGluIGxpYnhvIHRoYXQmIzM5O3MgY3VycmVudGx5IHBy aXZhdGUvc3RhdGljOjxicj4NCjxicj4NCsKgIMKgIMKgIMKgIC8qPGJyPg0KwqAgwqAgwqAgwqAg wqAqIEluZGljYXRlIGlmIHRoZSBzdHlsZSBpcyBhbiAmcXVvdDtlbmNvZGluZyZxdW90OyBvbmUg YXMgb3Bwb3NlZCB0byBhICZxdW90O2Rpc3BsYXkmcXVvdDsgb25lLjxicj4NCsKgIMKgIMKgIMKg IMKgKi88YnI+DQrCoCDCoCDCoCDCoCBzdGF0aWMgaW50PGJyPg0KwqAgwqAgwqAgwqAgeG9fc3R5 bGVfaXNfZW5jb2RpbmcgKHhvX2hhbmRsZV90ICp4b3ApPGJyPg0KwqAgwqAgwqAgwqAgezxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIGlmICh4b19zdHlsZSh4b3ApID09IFhPX1NUWUxFX0pTT048YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB8fCB4b19zdHlsZSh4b3ApID09IFhPX1NUWUxFX1hN TDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHx8IHhvX3N0eWxlKHhvcCkgPT0gWE9fU1RZ TEVfU0RQQVJBTVM8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB8fCB4b19zdHlsZSh4b3Ap ID09IFhPX1NUWUxFX0VOQ09ERVIpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJu IFRSVUU7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuIEZBTFNFOzxicj4NCsKgIMKgIMKg IMKgIH08YnI+DQo8YnI+DQpJIGNhbiBtYWtlIHRoYXQgcHVibGljLCBhbGxvd2luZyB5b3UgdG8g c2F5ICZxdW90O2lmICgheG9fc3R5bGVfaXNfZW5jb2RpbmcoTlVMTCkpIHsgLi4uIH0mcXVvdDss IGJ1dCBmb3Igbm93LCB5b3UmIzM5O2xsIG5lZWQgdG8gZXhwbGljaXRseSB0ZXN0IGZvciBYT19T VFlMRV9IVE1MLjxicj4NCjxicj4NCiZndDsgK8KgIMKgIMKgeG9fZXJyb3IoPGJyPg0KJmd0OyAr JnF1b3Q7dXNhZ2U6IHNvY2tzdGF0IFstLWxpYnhvXSBbLTQ2QUNjZklpTGxucVNzVXV2d10gWy1q IGppZF0gWy1wIHBvcnRzXVxuJnF1b3Q7PGJyPg0KJmd0OyArJnF1b3Q7wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgWy1QIHByb3RvY29sc11cbiZxdW90Oyk7PGJyPg0KJmd0OyArwqAgwqAgwqBleGl0 KDEpOzxicj4NCjxicj4NCkkgZG9uJiMzOTt0IGhhdmUgYSByZWFsIGNvbnZlbnRpb24gZm9yIHRo aXMsIGJ1dCBtYXliZSAmcXVvdDtbLS1saWJ4byAuLi5dJnF1b3Q7IHdvdWxkIGNvbnZleSB0aGF0 IHRoZXJlJiMzOTtzIGNvbnRlbnQgd2l0aCB0aGUgb3B0aW9uPzxicj4NCjxicj4NClRoYW5rcyw8 YnI+DQrCoFBoaWw8YnI+DQo8L2Jsb2NrcXVvdGU+PC9kaXY+PC9kaXY+DQo= --0000000000005160c5063b591b61--