delorie.com/archives/browse.cgi   search  
Mail Archives: geda-user/2020/04/03/08:59:58

X-Authentication-Warning: delorie.com: mail set sender to geda-user-bounces using -f
X-Recipient: geda-user AT delorie DOT com
X-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=gmail.com; s=20161025;
h=mime-version:references:in-reply-to:from:date:message-id:subject:to;
bh=OLOLPqKbYcEsY7fKs7NjcwakJlJC2SmwzrZJMco4eLQ=;
b=nO6o26+jsvxjj6yPnXEuhJ+I4A+hIRTwE5H05YHMN/iFjkR8LCWPorFGYhFg0yEr1V
4GGDYp/HKgSewOtTFGI59ftmhK+nqBotmaJNp4gPmB+XXgsWGz0utB4gq3/SNOat1JIX
jPbuBOhJUpmnjXbuwCm+vdhWlZRtndEYBBwah1MiCt6CZsaD21cTQ22p0rp1pDrdV28Q
LelXBk4DfMGr+QRYDNw37PN2IHR0M1wr3cuUWzm4KnHqprihJV07mDKRY0f7lAzNEsuN
lM7NbaE+JKgMM3Bk274Mis9qXcYJYY8ljXcBQHXCcN03gNFxVVJ0Tm0pT81hSCfxLQSt
Pc7Q==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=1e100.net; s=20161025;
h=x-gm-message-state:mime-version:references:in-reply-to:from:date
:message-id:subject:to;
bh=OLOLPqKbYcEsY7fKs7NjcwakJlJC2SmwzrZJMco4eLQ=;
b=DiJhHFt/UgdWBHTUDS9pjG48Z3pW6og1C8P4HAeMlR005I7sqDoVGn53E2nsC/OV//
sXigo9C4MxTAxoq6S8bTJd/QkVOPqBnHOGJIq49YF4l/VItUsOjykYznBQqm4zuBls6I
fklu6N/PCm0wH8PRFxYA2CJiPmzod8LsgDVBxs8gaFMGhv2u1jOkKYuPs6RSN1aVuJxI
C96CWqr9N2fWraYrTrl2H3zgjAAdnamtYQw0O9OnaqjXWsjB9wo6IKMIqU4qxsoCHaay
PTOs5kKIWhjaSe/LA/unpqL68mpmTqrxOs7rXeV80GlexwXiXkTG74vj6ticzRQtzpCL
3w1w==
X-Gm-Message-State: AGi0PuZ61S3FAEL+1XPKgxQv+GapCRLdKuN9fXMWEwGB8sZY/APKERX1
NEUsMUHaf6+iUW6JW2q/eBF32z8m8uqS4uA6VuQA47/C
X-Google-Smtp-Source: APiQypKjEhgx4/ACiM+SaqiKvu3USfZ5OT6YSQN32PNFFZYkdnqLsL7FbV3QK8EpYiKLRpNxBvhVREFycpwwLKMms2c=
X-Received: by 2002:a25:9907:: with SMTP id z7mr14618798ybn.94.1585917461412;
Fri, 03 Apr 2020 05:37:41 -0700 (PDT)
MIME-Version: 1.0
References: <CAC4O8c96R8=xDVFdheZ0tv3__Kk8_PTrq9-eJD3Utg=V7nje5Q AT mail DOT gmail DOT com>
<alpine DOT DEB DOT 2 DOT 00 DOT 2003160458240 DOT 2358 AT igor2priv>
In-Reply-To: <alpine.DEB.2.00.2003160458240.2358@igor2priv>
From: "Britton Kerin (britton DOT kerin AT gmail DOT com) [via geda-user AT delorie DOT com]" <geda-user AT delorie DOT com>
Date: Fri, 3 Apr 2020 04:37:30 -0800
Message-ID: <CAC4O8c9baAQTW4bqaHLWJ=395oQfqwc6ySO2kAGD3YM5Au-nhg@mail.gmail.com>
Subject: [geda-user] Fwd: [pcb-rnd] connectivity bug -> fullpoly again
To: geda-user AT delorie DOT com
Reply-To: geda-user AT delorie DOT com

--000000000000ee602805a2622e65
Content-Type: text/plain; charset="UTF-8"

I recently hit a polygon bug that caused connectivity errors.  I reported it
here previously.  I tried pcb-rnd and it had same problem.  Igor debugged it as
shown in the below message.

He makes a convincing case that fullypoly is just broken.  The pcb manual
should at least mention this issue, and probably the feature should at least
draw some kind of warning (maybe like some other things where you get a DRC
error warning you about the potential for pcb itself to get confused).

Britton

---------- Forwarded message ---------
From: <gedau AT igor2 DOT repo DOT hu>
Date: Sun, Mar 15, 2020 at 9:07 PM
Subject: Re: [pcb-rnd] connectivity bug -> fullpoly again
To: <pcb-rnd AT list DOT repo DOT hu>


Hi Britton,

On Sun, 15 Mar 2020, Britton Kerin wrote:

>Stitched polygons are probably the culprit as usual, but I have no
>idea how.  Somehow adding one trace in one place (the big fat one
>above the 2x3 header near the middle of the board) causes connectivity
>to be missed elsewhere.  I've attached screenshots showing
>connectivity ok and missed, and .pcb files (pcb format) also.
>
>pcb version 4.2.0 exhibits the same behavior.

Thanks, managed to narrow it down.

Attached is the minimal test case that causes the problem, which is
clearly caused by the legacy "full poly" setting. Do a {c f} on the thick
line segment on the top and/or the top side of the poly - there will be no
connection.

The reason is simple: a known limitation of the code which turns into a
rendering bug that is called the "fullpoly setting". When doing a
connectivity walk of the data, you can take it as a normal search
algorithm on a graph. Nodes of the graph are board objects, e.g. lines or
polygons, edges are whether they overlap geometrically in our 2.5d space
or not.

In this graph a node is either marked (as galvanically connected) or not.
There are no split nodes that are marked partly, e.g. through all edges
going out to a specific direction of the node but not through other edges.
The same, speaking in the geometry domain: a board object is either
connected or not, there's no object that can have multiple parts, some
parts connected, others not.

And that's where the full poly troll comes in: if you cut your polygon in
half, like you did on your board with the thick line, you create two
disconnected islands. Those should be handled as separate connectivity
nodes in the graph, while they are really the very same object. This
causes a lot of trouble.

Now we have two independent bugs about this:

bug#1: if you {c f} on either half of the cut polygon in my example
file, you sill see the other half is marked too. This is clearly wrong, as
there's no connection between the two parts. But we can't do that, because
the whole polygon is a single object, a single node in the above graph.
This is not something we want to fix, we rather want to get rid of the
fullpoly flag, because in its current form it's just a bad idea (see
below at section V).

bug#2: there's always a 'first island', which is the only island for the
non-fullpoly polygon (which is the largest area island in that case). In
the fullpoly case, there may be further islands. Most of the code, like
the connectivity code will unfortunately look only for the first islandd
(which can be considered as a bug we want to fix).

Ok, the bright side now:

I. Quick workaround on the sepcific case

1. Go over the poly at 90mm;49mm

2. Right click, edit flags

3. untick the full polygon flag

4. draw a new polygon on the now removed upper section

(Of course with this you will have the same problem again when you cut
another polygon of yours in half - since all your polygons seem to have
the full poly flag)

II. Quick workaround, generic, CLI

1. execute this action to select all affected polygons:

query(select, @.p.flag.fullpoly == 1)

2. remove the fullpoly flag from all selected objects at once using the
following action:

propset(selection, p/flags/fullpoly, 0)

3. draw new polygons to patch the gaps

III. Quick workaround, generic, GUI

1. use the advanced search from the menu or pressing {s s}

2. click on the 'E' button of the first expression (labelled <edit me>)

3. in the tree, open the flag subtree on the bottom, select fullpoly, then
'==' the middle and '1' on the right

4. click ok, the expr edit dialog closes and you get back the advanced
search dialog with the expresison of II/1 filled in and action combo box
set to 'select'. Click on 'apply' and it will execute the expression.

5. execute the propedit action; this will bring up an aggregated list of
properties of all selected objects

6. navigate to p/flags/fullpoly in the tree on the left, this will show
the current value on the right (checkbox ticked in)

7. untick the checkbox on the right and click 'apply' -> this will unify
the fullpoly flag on all currently selected object to false. You should
see the result immediately both in the propedit dialog and on your board.

8. just like II/3.: draw missing polys to patch the gaps.

(8 steps... Sorry, the CLI is always more efficient than the GUI, hehe)

IV. long term solution, user side

Do not ever use the fullpoly flag. That simple. That feature is and always
has been just broken b design. A typical feature that leaked in over the
decades and looked like a good idea first but caused a lot of trouble
later. The guy who implemented it probably didn't really think over all
consequences in all parts of the code, but focused on how it was possible
in the poly code. So the result is that the poly code and rendering
handles it properly but pretty much everything else breaks on it.

Plus if any user wants to write an user script dealing with board data,
there's a 99% chance he will forget about multi-island full-polys. So it's
hardwired in the system that we will just have more and more of bugs like
these.

Your top layer is already a patchwork of polygons. You have 40 polygons
just on that onbe layer already. A few extra polygons after removing
fullpoly won't really make a diff.


V. long temr solution, developer side

The fullpoly flag is a dangerous thing that should not be used by users
and should be removed from the code. In fact I should just remove it
imediately - except that I can't because it would break compatibility with
the obsolete pcb format....

So the plan is this:

1. I will code an extended object, probably called pour, that will take
over the role of the fullpoly flag. It will be somewhat similar to the
full poly thing, except that it will really create and maintain separate
polygon objects for the islands, removing a huge complication from the
code (by allowing all parts of the code to assume one object is one
object). With this, you will get about the same functionality as with full
poly today, except it won't suffer from bug#1 or bug#2

2. I also have plans about a minor data model upgrade to support
polygon-side clearance values; this would help us a lot in compatibility
to EDA tools that really matter on the market (eagle and kicad) as it
would help us reproduce their global or "zone" based clearance mechanism.
I already know how to do this cheap and without breaking any compatibility
with our current data model.

3. In the same time I will mark the fullpoly flag deprecated. This means
whenever pcb-rnd meets it, a warning will be thrown and a link to 'how to
switch to the pour extended object' will be included.

4. independently of the above effort, I will look at whether I canfix
bug#2 for cheap. If yes, I will probably do that. But since I absolutely
do not want to fix bug#1 because of the simpler plans on the pour
extended object, the outcome of bug#2 decision will not affect the above
3.

(I am going to add this plan to the feature deprecation page)

Best regards,

Igor2

--000000000000ee602805a2622e65
Content-Type: text/plain; charset="US-ASCII"; name="fullpoly.lht"
Content-Disposition: attachment; filename="fullpoly.lht"
Content-Transfer-Encoding: base64
Content-ID: <1714006de89da8a80e51>
X-Attachment-Id: 1714006de89da8a80e51

aGE6cGNiLXJuZC1ib2FyZC12NiB7DQoNCiBsaTpzdHlsZXMgew0KICAgaGE6U2lnbmFsIHsNCiAg
ICBkaWFtZXRlciA9IDIuMG1tDQogICAgdGV4dF9zY2FsZSA9IDANCiAgICB0ZXh0X3RoaWNrID0g
MC4wDQogICAgdGhpY2tuZXNzID0gMTAuMG1pbA0KICAgIGhvbGUgPSAzMS41bWlsDQogICAgY2xl
YXJhbmNlID0gMjAuMG1pbA0KICAgfQ0KICAgaGE6UG93ZXIgew0KICAgIGRpYW1ldGVyID0gMi4y
bW0NCiAgICB0ZXh0X3NjYWxlID0gMA0KICAgIHRleHRfdGhpY2sgPSAwLjANCiAgICB0aGlja25l
c3MgPSAyMC4wbWlsDQogICAgaG9sZSA9IDEuMG1tDQogICAgY2xlYXJhbmNlID0gMjAuMG1pbA0K
ICAgfQ0KICAgaGE6RmF0IHsNCiAgICBkaWFtZXRlciA9IDEzNy44bWlsDQogICAgdGV4dF9zY2Fs
ZSA9IDANCiAgICB0ZXh0X3RoaWNrID0gMC4wDQogICAgdGhpY2tuZXNzID0gODAuMG1pbA0KICAg
IGhvbGUgPSA0Ny4yNG1pbA0KICAgIGNsZWFyYW5jZSA9IDI1LjBtaWwNCiAgIH0NCiAgIGhhOlNp
Zy10aWdodCB7DQogICAgZGlhbWV0ZXIgPSA2NC4wbWlsDQogICAgdGV4dF9zY2FsZSA9IDANCiAg
ICB0ZXh0X3RoaWNrID0gMC4wDQogICAgdGhpY2tuZXNzID0gMTAuMG1pbA0KICAgIGhvbGUgPSAz
MS41bWlsDQogICAgY2xlYXJhbmNlID0gMTIuMG1pbA0KICAgfQ0KIH0NCg0KIGhhOm1ldGEgew0K
ICAgaGE6c2l6ZSB7DQogICAgdGhlcm1hbF9zY2FsZSA9IDAuNTAwMDAwDQogICAgeCA9IDc3NS4w
bWlsDQogICAgeSA9IDEuOWluDQogICB9DQogICBoYTpncmlkIHsNCiAgICBzcGFjaW5nID0gMjUu
MG1pbA0KICAgIG9mZnNfeCA9IDAuMA0KICAgIG9mZnNfeSA9IDAuMA0KICAgfQ0KIH0NCg0KIGhh
OmRhdGEgew0KICBsaTpwYWRzdGFja19wcm90b3R5cGVzIHsNCiAgfQ0KDQogICBsaTpvYmplY3Rz
IHsNCiAgIH0NCiAgIGxpOmxheWVycyB7DQoNCiAgICBoYTp0b3Atc2lnIHsNCiAgICAgbGlkPTAN
CiAgICAgZ3JvdXA9Mw0KICAgICBoYTpjb21iaW5pbmcgeyAgICAgfQ0KDQogICAgICBoYTphdHRy
aWJ1dGVzIHsNCiAgICAgICAge3BjYi1ybmQ6OmtleTo6dmlzfT17PEtleT5sOyBTaGlmdDxLZXk+
dH0NCiAgICAgICAge3BjYi1ybmQ6OmtleTo6c2VsZWN0fT17PEtleT5sOyA8S2V5PnR9DQogICAg
ICB9DQoNCiAgICAgIGxpOm9iamVjdHMgew0KICAgICAgIGhhOmxpbmUuMTAgew0KICAgICAgICB4
MT03NS4wbWlsOyB5MT0xMDAwLjBtaWw7IHgyPTcwMC4wbWlsOyB5Mj0xMDAwLjBtaWw7IHRoaWNr
bmVzcz0xMC4wbWlsOyBjbGVhcmFuY2U9NDAuMG1pbDsNCiAgICAgICAgaGE6ZmxhZ3Mgew0KICAg
ICAgICAgY2xlYXJsaW5lPTENCiAgICAgICAgfQ0KICAgICAgIH0NCiAgICAgICBoYTpsaW5lLjEz
IHsNCiAgICAgICAgeDE9MzUwLjBtaWw7IHkxPTM3NS4wbWlsOyB4Mj0zNTAuMG1pbDsgeTI9MTAw
LjBtaWw7IHRoaWNrbmVzcz04MC4wbWlsOyBjbGVhcmFuY2U9NTAuMG1pbDsNCiAgICAgICB9DQog
ICAgICAgaGE6cG9seWdvbi41IHsgY2xlYXJhbmNlPTQwLjBtaWw7DQogICAgICAgIGxpOmdlb21l
dHJ5IHsNCiAgICAgICAgICB0YTpjb250b3VyIHsNCiAgICAgICAgICAgeyAxNTAuMG1pbDsgMzAw
LjBtaWwgfQ0KICAgICAgICAgICB7IDUwMC4wbWlsOyAzMDAuMG1pbCB9DQogICAgICAgICAgIHsg
NTAwLjBtaWw7IDQ2Ljk5bW0gfQ0KICAgICAgICAgICB7IDE1MC4wbWlsOyA0Ni45OW1tIH0NCiAg
ICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBoYTpmbGFncyB7DQogICAgICAgICBmdWxs
cG9seT0xDQogICAgICAgICBjbGVhcnBvbHk9MQ0KICAgICAgICB9DQogICAgICAgfQ0KICAgICAg
fQ0KICAgICAgY29sb3IgPSB7IzhiMjMyM30NCiAgICB9DQoNCiAgICBoYTpib3R0b20tc2lnIHsN
CiAgICAgbGlkPTENCiAgICAgZ3JvdXA9MTANCiAgICAgaGE6Y29tYmluaW5nIHsgICAgIH0NCg0K
ICAgICAgaGE6YXR0cmlidXRlcyB7DQogICAgICAgIHtwY2Itcm5kOjprZXk6OnZpc309ezxLZXk+
bDsgU2hpZnQ8S2V5PmJ9DQogICAgICAgIHtwY2Itcm5kOjprZXk6OnNlbGVjdH09ezxLZXk+bDsg
PEtleT5ifQ0KICAgICAgfQ0KDQogICAgICBsaTpvYmplY3RzIHsNCiAgICAgIH0NCiAgICAgIGNv
bG9yID0geyMzYTVmY2R9DQogICAgfQ0KDQogICAgaGE6dG9wLWduZCB7DQogICAgIGxpZD0yDQog
ICAgIGdyb3VwPTMNCiAgICAgaGE6Y29tYmluaW5nIHsgICAgIH0NCg0KICAgICAgbGk6b2JqZWN0
cyB7DQogICAgICB9DQogICAgICBjb2xvciA9IHsjMTA0ZThifQ0KICAgIH0NCg0KICAgIGhhOmJv
dHRvbS1nbmQgew0KICAgICBsaWQ9Mw0KICAgICBncm91cD0xMA0KICAgICBoYTpjb21iaW5pbmcg
eyAgICAgfQ0KDQogICAgICBsaTpvYmplY3RzIHsNCiAgICAgIH0NCiAgICAgIGNvbG9yID0geyNj
ZDM3MDB9DQogICAgfQ0KDQogICAgaGE6aW50LXNpZzIgew0KICAgICBsaWQ9NA0KICAgICBncm91
cD03DQogICAgIGhhOmNvbWJpbmluZyB7ICAgICB9DQoNCiAgICAgIGhhOmF0dHJpYnV0ZXMgew0K
ICAgICAgICB7cGNiLXJuZDo6a2V5Ojp2aXN9PXs8S2V5Pmw7IFNoaWZ0PEtleT5pfQ0KICAgICAg
ICB7cGNiLXJuZDo6a2V5OjpzZWxlY3R9PXs8S2V5Pmw7IDxLZXk+aX0NCiAgICAgIH0NCg0KICAg
ICAgbGk6b2JqZWN0cyB7DQogICAgICB9DQogICAgICBjb2xvciA9IHsjNTQ4YjU0fQ0KICAgIH0N
Cg0KICAgIGhhOmludC1zaWcxIHsNCiAgICAgbGlkPTUNCiAgICAgZ3JvdXA9NQ0KICAgICBoYTpj
b21iaW5pbmcgeyAgICAgfQ0KDQogICAgICBoYTphdHRyaWJ1dGVzIHsNCiAgICAgICAge3BjYi1y
bmQ6OmtleTo6dmlzfT17PEtleT5sOyBTaGlmdDxLZXk+b30NCiAgICAgICAge3BjYi1ybmQ6Omtl
eTo6c2VsZWN0fT17PEtleT5sOyA8S2V5Pm99DQogICAgICB9DQoNCiAgICAgIGxpOm9iamVjdHMg
ew0KICAgICAgfQ0KICAgICAgY29sb3IgPSB7IzhiNzM1NX0NCiAgICB9DQoNCiAgICBoYTpvdXRs
aW5lIHsNCiAgICAgbGlkPTYNCiAgICAgZ3JvdXA9OQ0KICAgICBoYTpjb21iaW5pbmcgeyAgICAg
fQ0KDQogICAgICBsaTpvYmplY3RzIHsNCiAgICAgIH0NCiAgICAgIGNvbG9yID0geyMwMDg2OGJ9
DQogICAgfQ0KDQogICAgaGE6Ym90dG9tLXNpbGsgew0KICAgICBsaWQ9Nw0KICAgICBncm91cD0x
Mg0KICAgICBoYTpjb21iaW5pbmcgeyBhdXRvPTE7ICAgICB9DQoNCiAgICAgIGhhOmF0dHJpYnV0
ZXMgew0KICAgICAgICB7cGNiLXJuZDo6a2V5Ojp2aXN9PXs8S2V5Pmw7IFNoaWZ0PEtleT54fQ0K
ICAgICAgICB7cGNiLXJuZDo6a2V5OjpzZWxlY3R9PXs8S2V5Pmw7IDxLZXk+eH0NCiAgICAgIH0N
Cg0KICAgICAgbGk6b2JqZWN0cyB7DQogICAgICB9DQogICAgICBjb2xvciA9IHsjMDAwMDAwfQ0K
ICAgIH0NCg0KICAgIGhhOnRvcC1zaWxrIHsNCiAgICAgbGlkPTgNCiAgICAgZ3JvdXA9MQ0KICAg
ICBoYTpjb21iaW5pbmcgeyBhdXRvPTE7ICAgICB9DQoNCiAgICAgIGhhOmF0dHJpYnV0ZXMgew0K
ICAgICAgICB7cGNiLXJuZDo6a2V5Ojp2aXN9PXs8S2V5Pmw7IFNoaWZ0PEtleT5zfQ0KICAgICAg
ICB7cGNiLXJuZDo6a2V5OjpzZWxlY3R9PXs8S2V5Pmw7IDxLZXk+c30NCiAgICAgIH0NCg0KICAg
ICAgbGk6b2JqZWN0cyB7DQogICAgICB9DQogICAgICBjb2xvciA9IHsjMDAwMDAwfQ0KICAgIH0N
Cg0KICAgIGhhOnRvcC1wYXN0ZSB7DQogICAgIGxpZD05DQogICAgIGdyb3VwPTANCiAgICAgaGE6
Y29tYmluaW5nIHsgYXV0bz0xOyAgICAgfQ0KDQogICAgICBsaTpvYmplY3RzIHsNCiAgICAgIH0N
CiAgICAgIGNvbG9yID0geyNjZDAwY2R9DQogICAgfQ0KDQogICAgaGE6dG9wLW1hc2sgew0KICAg
ICBsaWQ9MTANCiAgICAgZ3JvdXA9Mg0KICAgICBoYTpjb21iaW5pbmcgeyBzdWI9MTsgYXV0bz0x
OyAgICAgfQ0KDQogICAgICBsaTpvYmplY3RzIHsNCiAgICAgIH0NCiAgICAgIGNvbG9yID0geyNm
ZjAwMDB9DQogICAgfQ0KDQogICAgaGE6Ym90dG9tLW1hc2sgew0KICAgICBsaWQ9MTENCiAgICAg
Z3JvdXA9MTENCiAgICAgaGE6Y29tYmluaW5nIHsgc3ViPTE7IGF1dG89MTsgICAgIH0NCg0KICAg
ICAgbGk6b2JqZWN0cyB7DQogICAgICB9DQogICAgICBjb2xvciA9IHsjZmYwMDAwfQ0KICAgIH0N
Cg0KICAgIGhhOmJvdHRvbS1wYXN0ZSB7DQogICAgIGxpZD0xMg0KICAgICBncm91cD0xMw0KICAg
ICBoYTpjb21iaW5pbmcgeyBhdXRvPTE7ICAgICB9DQoNCiAgICAgIGxpOm9iamVjdHMgew0KICAg
ICAgfQ0KICAgICAgY29sb3IgPSB7I2NkMDBjZH0NCiAgICB9DQoNCiAgICBoYTpzbG90LXBsYXRl
ZCB7DQogICAgIGxpZD0xMw0KICAgICBncm91cD0xNA0KICAgICBoYTpjb21iaW5pbmcgeyBhdXRv
PTE7ICAgICB9DQoNCiAgICAgIGxpOm9iamVjdHMgew0KICAgICAgfQ0KICAgICAgY29sb3IgPSB7
IzhiNzM1NX0NCiAgICB9DQoNCiAgICBoYTpzbG90LXVucGxhdGVkIHsNCiAgICAgbGlkPTE0DQog
ICAgIGdyb3VwPTE1DQogICAgIGhhOmNvbWJpbmluZyB7IGF1dG89MTsgICAgIH0NCg0KICAgICAg
bGk6b2JqZWN0cyB7DQogICAgICB9DQogICAgICBjb2xvciA9IHsjMDA4NjhifQ0KICAgIH0NCg0K
ICAgIGhhOnRvcC1hc3N5IHsNCiAgICAgbGlkPTE1DQogICAgIGdyb3VwPTE2DQogICAgIGhhOmNv
bWJpbmluZyB7ICAgICB9DQoNCiAgICAgIGxpOm9iamVjdHMgew0KICAgICAgfQ0KICAgICAgY29s
b3IgPSB7IzQ0NDQ0NH0NCiAgICB9DQoNCiAgICBoYTpib3QtYXNzeSB7DQogICAgIGxpZD0xNg0K
ICAgICBncm91cD0xNw0KICAgICBoYTpjb21iaW5pbmcgeyAgICAgfQ0KDQogICAgICBsaTpvYmpl
Y3RzIHsNCiAgICAgIH0NCiAgICAgIGNvbG9yID0geyM0NDQ0NDR9DQogICAgfQ0KDQogICAgaGE6
ZmFiIHsNCiAgICAgbGlkPTE3DQogICAgIGdyb3VwPTE4DQogICAgIGhhOmNvbWJpbmluZyB7IGF1
dG89MTsgICAgIH0NCg0KICAgICAgbGk6b2JqZWN0cyB7DQogICAgICB9DQogICAgICBjb2xvciA9
IHsjMjIyMjIyfQ0KICAgIH0NCiAgIH0NCiB9DQogaGE6bGF5ZXJfc3RhY2sgew0KICBsaTpncm91
cHMgew0KICAgaGE6MCB7DQogICAgbmFtZSA9IHRvcF9wYXN0ZQ0KICAgIGhhOnR5cGUgeyB0b3A9
MTsgcGFzdGU9MTsgICAgfQ0KICAgIGxpOmxheWVycyB7IDk7ICAgIH0NCiAgIH0NCiAgIGhhOjEg
ew0KICAgIG5hbWUgPSB0b3Bfc2lsaw0KICAgIGhhOnR5cGUgeyBzaWxrPTE7IHRvcD0xOyAgICB9
DQogICAgbGk6bGF5ZXJzIHsgODsgICAgfQ0KICAgfQ0KICAgaGE6MiB7DQogICAgbmFtZSA9IHRv
cF9tYXNrDQogICAgaGE6dHlwZSB7IHRvcD0xOyBtYXNrPTE7ICAgIH0NCiAgICBsaTpsYXllcnMg
eyAxMDsgICAgfQ0KICAgfQ0KICAgaGE6MyB7DQogICAgbmFtZSA9IHRvcF9jb3BwZXINCiAgICBo
YTp0eXBlIHsgY29wcGVyPTE7IHRvcD0xOyAgICB9DQogICAgbGk6bGF5ZXJzIHsgMDsgMjsgICAg
fQ0KICAgfQ0KICAgaGE6NCB7DQogICAgbmFtZSA9IGdycF80DQogICAgaGE6dHlwZSB7IHN1YnN0
cmF0ZT0xOyBpbnRlcm49MTsgICAgfQ0KICAgIGxpOmxheWVycyB7ICAgIH0NCiAgICBoYTphdHRy
aWJ1dGVzIHsNCiAgICAgdGhpY2tuZXNzPXswLjczNzVtbSB9DQogICAgfQ0KICAgfQ0KICAgaGE6
NSB7DQogICAgbmFtZSA9IEludGVybg0KICAgIGhhOnR5cGUgeyBjb3BwZXI9MTsgaW50ZXJuPTE7
ICAgIH0NCiAgICBsaTpsYXllcnMgeyA1OyAgICB9DQogICB9DQogICBoYTo2IHsNCiAgICBuYW1l
ID0gZ3JwXzYNCiAgICBoYTp0eXBlIHsgc3Vic3RyYXRlPTE7IGludGVybj0xOyAgICB9DQogICAg
bGk6bGF5ZXJzIHsgICAgfQ0KICAgIGhhOmF0dHJpYnV0ZXMgew0KICAgICB0aGlja25lc3M9ezAu
MTI1bW0gfQ0KICAgIH0NCiAgIH0NCiAgIGhhOjcgew0KICAgIG5hbWUgPSBJbnRlcm4NCiAgICBo
YTp0eXBlIHsgY29wcGVyPTE7IGludGVybj0xOyAgICB9DQogICAgbGk6bGF5ZXJzIHsgNDsgICAg
fQ0KICAgfQ0KICAgaGE6OCB7DQogICAgbmFtZSA9IGdycF84DQogICAgaGE6dHlwZSB7IHN1YnN0
cmF0ZT0xOyBpbnRlcm49MTsgICAgfQ0KICAgIGxpOmxheWVycyB7ICAgIH0NCiAgICBoYTphdHRy
aWJ1dGVzIHsNCiAgICAgdGhpY2tuZXNzPXswLjczNzVtbSB9DQogICAgfQ0KICAgfQ0KICAgaGE6
OSB7DQogICAgbmFtZSA9IGdsb2JhbF9vdXRsaW5lDQogICAgaGE6dHlwZSB7IGJvdW5kYXJ5PTE7
ICAgIH0NCiAgICBsaTpsYXllcnMgeyA2OyAgICB9DQogICAgcHVycG9zZSA9IHVyb3V0ZQ0KICAg
fQ0KICAgaGE6MTAgew0KICAgIG5hbWUgPSBib3R0b21fY29wcGVyDQogICAgaGE6dHlwZSB7IGJv
dHRvbT0xOyBjb3BwZXI9MTsgICAgfQ0KICAgIGxpOmxheWVycyB7IDE7IDM7ICAgIH0NCiAgIH0N
CiAgIGhhOjExIHsNCiAgICBuYW1lID0gYm90dG9tX21hc2sNCiAgICBoYTp0eXBlIHsgYm90dG9t
PTE7IG1hc2s9MTsgICAgfQ0KICAgIGxpOmxheWVycyB7IDExOyAgICB9DQogICB9DQogICBoYTox
MiB7DQogICAgbmFtZSA9IGJvdHRvbV9zaWxrDQogICAgaGE6dHlwZSB7IHNpbGs9MTsgYm90dG9t
PTE7ICAgIH0NCiAgICBsaTpsYXllcnMgeyA3OyAgICB9DQogICB9DQogICBoYToxMyB7DQogICAg
bmFtZSA9IGJvdHRvbV9wYXN0ZQ0KICAgIGhhOnR5cGUgeyBib3R0b209MTsgcGFzdGU9MTsgICAg
fQ0KICAgIGxpOmxheWVycyB7IDEyOyAgICB9DQogICB9DQogICBoYToxNCB7DQogICAgbmFtZSA9
IHBtZWNoDQogICAgaGE6dHlwZSB7IG1lY2g9MTsgICAgfQ0KICAgIGxpOmxheWVycyB7IDEzOyAg
ICB9DQogICAgcHVycG9zZSA9IHByb3V0ZQ0KICAgfQ0KICAgaGE6MTUgew0KICAgIG5hbWUgPSB1
bWVjaA0KICAgIGhhOnR5cGUgeyBtZWNoPTE7ICAgIH0NCiAgICBsaTpsYXllcnMgeyAxNDsgICAg
fQ0KICAgIHB1cnBvc2UgPSB1cm91dGUNCiAgIH0NCiAgIGhhOjE2IHsNCiAgICBuYW1lID0gdG9w
X2Fzc3kNCiAgICBoYTp0eXBlIHsgdG9wPTE7IGRvYz0xOyAgICB9DQogICAgbGk6bGF5ZXJzIHsg
MTU7ICAgIH0NCiAgICBoYTphdHRyaWJ1dGVzIHsNCiAgICAgaW5pdC1pbnZpcz0xDQogICAgfQ0K
ICAgIHB1cnBvc2UgPSBhc3N5DQogICB9DQogICBoYToxNyB7DQogICAgbmFtZSA9IGJvdF9hc3N5
DQogICAgaGE6dHlwZSB7IGJvdHRvbT0xOyBkb2M9MTsgICAgfQ0KICAgIGxpOmxheWVycyB7IDE2
OyAgICB9DQogICAgaGE6YXR0cmlidXRlcyB7DQogICAgIGluaXQtaW52aXM9MQ0KICAgIH0NCiAg
ICBwdXJwb3NlID0gYXNzeQ0KICAgfQ0KICAgaGE6MTggew0KICAgIG5hbWUgPSBmYWINCiAgICBo
YTp0eXBlIHsgdG9wPTE7IGRvYz0xOyAgICB9DQogICAgbGk6bGF5ZXJzIHsgMTc7ICAgIH0NCiAg
ICBoYTphdHRyaWJ1dGVzIHsNCiAgICAgaW5pdC1pbnZpcz0xDQogICAgfQ0KICAgIHB1cnBvc2Ug
PSBmYWINCiAgIH0NCiAgfQ0KIH0NCiBsaTpwY2Itcm5kLWNvbmYtdjEgew0KICBoYTpvdmVyd3Jp
dGUgew0KICAgaGE6ZGVzaWduIHsNCiAgICB0ZXh0X2ZvbnRfaWQgPSAwDQogICAgdGV4dF9zY2Fs
ZSA9IDEwMA0KICAgIHZpYV90aGlja25lc3MgPSAxMzcuODAgbWlsDQogICAgdmlhX2RyaWxsaW5n
X2hvbGUgPSA0Ny4yNCBtaWwNCiAgICB0ZXh0X3RoaWNrbmVzcyA9IDANCiAgICBsaW5lX3RoaWNr
bmVzcyA9IDgwLjAwIG1pbA0KICAgIGNsZWFyYW5jZSA9IDI1LjAwIG1pbA0KICAgfQ0KICAgaGE6
ZWRpdG9yIHsNCiAgIH0NCiAgfQ0KIH0NCn0NCg==
--000000000000ee602805a2622e65--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019