Ldfs.hs

Kevin.Backhouse@arm.com Kevin.Backhouse@arm.com
Thu, 28 Aug 2003 13:18:31 +0100


--0__=0FBBE703DFAC206E8f9e8a93df938690918c0FBBE703DFAC206E
Content-type: text/plain; charset=us-ascii

Hi,

I think there is a typo in the definition of the function "tree", in the
module "Ldfs.hs", which is in the demos directory of the hugs distribution.
The original definition is:

tree              :: Bounds -> Forest Vertex -> Graph
tree bnds ts       = buildG bnds (concat (map flat ts))
 where flat (Node v rs) = [ (v, w) | Node w us <- ts ] ++
                          concat (map flat ts)

I think it should be:

tree              :: Bounds -> Forest Vertex -> Graph
tree bnds ts       = buildG bnds (concat (map flat ts))
 where flat (Node v rs) = [ (v, w) | Node w us <- rs ] ++
                          concat (map flat rs)

The difference is that I have changed "ts" to "rs" in the body of the
function "flat".

By the way, I find Ldfs very useful and I think it deserves a place amongst
the libraries. I have attached a modified version of Ldfs that I often use.
It is based on FiniteMap and Set, rather than arrays, because I tend to
find that my graphs do not use integer indices. Of course, this means that
my version is less efficient than the original and does not use LazyST, but
I have never yet had any problems with its performance. Provided that
Professor Launchbury agrees, would it be possible to add it to the
libraries? If some work needs to be done to bring it into line with
existing style guides, then I am happy to do this.

Kevin

(See attached file: Ldfs.hs)

Kevin Backhouse, Software Engineer
ARM Limited
110 Fulbourn Road, Cambridge, CB1 9NJ, UK.
Tel: +44 1223 400601

This e-mail message is intended for the addressee(s) only and may contain
information that is the property of, and/or subject to a confidentiality
agreement between the intended recipient(s), their organisation and/or the
ARM Group of Companies. If you are not an intended recipient of this e-mail
message, you should not read, copy, forward or otherwise distribute or
further disclose the information in it; misuse of the contents of this
e-mail message may violate various laws in your state, country or
jurisdiction. If you have received this e-mail message in error, please
contact the originator of this e-mail message via e-mail and delete all
copies of this message from your computer or network, thank you.


--0__=0FBBE703DFAC206E8f9e8a93df938690918c0FBBE703DFAC206E
Content-type: application/octet-stream; 
	name="Ldfs.hs"
Content-Disposition: attachment; filename="Ldfs.hs"
Content-transfer-encoding: base64

LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBBIHZlcnNpb24gb2YgdGhlIGdyYXBoIGFsZ29yaXRo
bXMgZGVzY3JpYmVkIGluOg0KLS0gDQotLSBgYExhenkgRGVwdGgtRmlyc3QgU2VhcmNoIGFuZCBM
aW5lYXIgR3JhcGggQWxnb3JpdGhtcyBpbiBIYXNrZWxsJycNCi0tICAgYnkgRGF2aWQgS2luZyBh
bmQgSm9obiBMYXVuY2hidXJ5DQotLSANCi0tIEFsc28gaW5jbHVkZWQgaXMgc29tZSBhZGRpdGlv
bmFsIGNvZGUgZm9yIHByaW50aW5nIHRyZWUgc3RydWN0dXJlcyAuLi4NCi0tDQotLSBTdWl0YWJs
ZSBmb3IgdXNlIHdpdGggSHVncyA5OC4NCi0tDQotLSBNb2RpZmllZCBmb3IgdXNlIHdpdGggRmlu
aXRlTWFwIGFuZCBTZXQgYnkgS2V2aW4gQmFja2hvdXNlLg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
DQoNCm1vZHVsZSBMZGZzKCBHcmFwaCwgdmVydGljZXMsIGVkZ2VzLCBvdXRkZWdyZWUsIGJ1aWxk
Rywgc3VjY2Vzc29ycywNCiAgICAgICAgICAgICBwcmVkZWNlc3NvcnMsIGRlcmVmLCB0cmFuc3Bv
c2VHLCByZXZlcnNlRSwgaW5kZWdyZWUsDQoNCiAgICAgICAgICAgICBiYWNrLCBiY2MsIGNvbXBv
bmVudHMsIGNyb3NzLCBmb3J3YXJkLCBwYXRoLA0KICAgICAgICAgICAgIHByZU9yZCwgc2NjLCBz
Y2MnLHNob3dGb3Jlc3QsIHRvcFNvcnQsIHRyZWUgKQ0KDQp3aGVyZQ0KDQppbXBvcnQgRmluaXRl
TWFwDQppbXBvcnQgU2V0DQppbXBvcnQgTGlzdA0KaW1wb3J0IE1heWJlIChmcm9tSnVzdCkNCg0K
LS0gUmVwcmVzZW50aW5nIGdyYXBoczoNCnR5cGUgR3JhcGggdiAgPSBGaW5pdGVNYXAgdiBbdl0N
Cg0KdmVydGljZXMgOjogR3JhcGggdiAtPiBbdl0NCnZlcnRpY2VzICA9IGtleXNGTQ0KDQp0eXBl
IEVkZ2UgdiA9ICh2LCB2KQ0KDQplZGdlcyAgICA6OiBHcmFwaCB2IC0+IFtFZGdlIHZdDQplZGdl
cyBnICAgPSBbICh2LCB3KSB8ICh2LHZzKSA8LSBmbVRvTGlzdCBnLCB3IDwtIHZzIF0NCg0Kb3V0
ZGVncmVlIDo6IEdyYXBoIHYgLT4gRmluaXRlTWFwIHYgSW50DQpvdXRkZWdyZWUgID0gbWFwRk0g
bnVtRWRnZXMNCiAgICAgICAgICAgICB3aGVyZSBudW1FZGdlcyBfIHdzID0gbGVuZ3RoIHdzDQoN
CmJ1aWxkRyA6OiAoT3JkIGEsIE9yZCBiKSA9PiBbKGEsYildIC0+IEZpbml0ZU1hcCBhIFtiXQ0K
YnVpbGRHID0gYWRkTGlzdFRvRk1fQyAoKyspIGVtcHR5Rk0gLiBtYXAgd3JhcA0KICAgICAgICAg
d2hlcmUgd3JhcCAoYSxiKSA9IChhLFtiXSkNCg0Kc3VjY2Vzc29ycyA6OiBPcmQgdiA9PiBHcmFw
aCB2IC0+IHYgLT4gW3ZdDQpzdWNjZXNzb3JzIGcgdiA9IGxvb2t1cFdpdGhEZWZhdWx0Rk0gZyBb
XSB2DQoNCnByZWRlY2Vzc29ycyA6OiBPcmQgdiA9PiBHcmFwaCB2IC0+IHYgLT4gW3ZdDQpwcmVk
ZWNlc3NvcnMgPSBzdWNjZXNzb3JzIC4gdHJhbnNwb3NlRw0KDQpkZXJlZiA6OiBPcmQgdiA9PiBG
aW5pdGVNYXAgdiBhIC0+IHYgLT4gYQ0KZGVyZWYgZm0geCA9IGZyb21KdXN0IChsb29rdXBGTSBm
bSB4KQ0KDQp0cmFuc3Bvc2VHICA6OiBPcmQgdiA9PiBHcmFwaCB2IC0+IEdyYXBoIHYNCnRyYW5z
cG9zZUcgZyA9IGJ1aWxkRyAocmV2ZXJzZUUgZykNCg0KcmV2ZXJzZUUgICAgOjogR3JhcGggdiAt
PiBbRWRnZSB2XQ0KcmV2ZXJzZUUgZyAgID0gWyAodywgdikgfCAodiwgdykgPC0gZWRnZXMgZyBd
DQoNCmluZGVncmVlIDo6IE9yZCB2ID0+IEdyYXBoIHYgLT4gRmluaXRlTWFwIHYgSW50DQppbmRl
Z3JlZSAgPSBvdXRkZWdyZWUgLiB0cmFuc3Bvc2VHDQoNCg0KLS0gRGVwdGgtZmlyc3Qgc2VhcmNo
DQoNCi0tIFNwZWNpZmljYXRpb24gYW5kIGltcGxlbWVudGF0aW9uIG9mIGRlcHRoLWZpcnN0IHNl
YXJjaDoNCg0KZGF0YSBUcmVlIGEgICA9IE5vZGUgYSAoRm9yZXN0IGEpIGRlcml2aW5nIFNob3cN
CnR5cGUgRm9yZXN0IGEgPSBbVHJlZSBhXQ0KDQpkZmYgICAgICAgICAgOjogT3JkIHYgPT4gR3Jh
cGggdiAtPiBGb3Jlc3Qgdg0KZGZmIGcgICAgICAgICA9IGRmcyBnICh2ZXJ0aWNlcyBnKQ0KDQpk
ZnMgICAgICAgICAgOjogT3JkIHYgPT4gR3JhcGggdiAtPiBbdl0gLT4gRm9yZXN0IHYNCmRmcyBn
IHZzICAgICAgPSBwcnVuZSAobWFwIChnZW5lcmF0ZSBnKSB2cykNCg0KZ2VuZXJhdGUgICAgIDo6
IE9yZCB2ID0+IEdyYXBoIHYgLT4gdiAtPiBUcmVlIHYNCmdlbmVyYXRlIGcgdiAgPSBOb2RlIHYg
KG1hcCAoZ2VuZXJhdGUgZykNCiAgICAgICAgICAgICAgICAgICAgICAgKGxvb2t1cFdpdGhEZWZh
dWx0Rk0gZyBbXSB2KSkNCg0KcHJ1bmUgICAgICAgIDo6IE9yZCB2ID0+IEZvcmVzdCB2IC0+IEZv
cmVzdCB2DQpwcnVuZSB0cyAgICAgID0gZnN0IChjaG9wIGVtcHR5U2V0IHRzKQ0KDQpjaG9wICAg
ICAgICAgOjogT3JkIHYgPT4gU2V0IHYgLT4gRm9yZXN0IHYgLT4gKEZvcmVzdCB2LCBTZXQgdikN
CmNob3AgbSBbXSAgICAgPSAoW10sIG0pDQpjaG9wIG0gKE5vZGUgdiB0cyA6IHVzKQ0KICAgICAg
ICAgICAgICA9IGlmIGVsZW1lbnRPZiB2IG0gdGhlbg0KICAgICAgICAgICAgICAgICAgY2hvcCBt
IHVzDQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgbGV0IChhcywgbScp
ID0gY2hvcCAoYWRkVG9TZXQgbSB2KSB0cyBpbg0KICAgICAgICAgICAgICAgICAgbGV0IChicywg
bScnKSA9IGNob3AgbScgdXMgaW4NCiAgICAgICAgICAgICAgICAgIChOb2RlIHYgYXMgOiBicywg
bScnKQ0KDQoNCi0tIERlcHRoLWZpcnN0IHNlYXJjaCBhbGdvcml0aG1zDQoNCi0tIEFsZ29yaXRo
bSAxOiBkZXB0aCBmaXJzdCBzZWFyY2ggbnVtYmVyaW5nDQoNCnByZW9yZGVyICAgICAgICAgICAg
OjogVHJlZSBhIC0+IFthXQ0KcHJlb3JkZXIgKE5vZGUgYSB0cykgPSBbYV0gKysgcHJlb3JkZXJG
IHRzDQoNCnByZW9yZGVyRiAgICAgICAgICAgOjogRm9yZXN0IGEgLT4gW2FdDQpwcmVvcmRlckYg
dHMgICAgICAgICA9IGNvbmNhdCAobWFwIHByZW9yZGVyIHRzKQ0KDQpwcmVPcmQgOjogT3JkIHYg
PT4gR3JhcGggdiAtPiBbdl0NCnByZU9yZCAgPSBwcmVvcmRlckYgLiBkZmYNCg0KdGFidWxhdGUg
ICA6OiBPcmQgdiA9PiBbdl0gLT4gRmluaXRlTWFwIHYgSW50DQp0YWJ1bGF0ZSB2cyA9IGxpc3RU
b0ZNICh6aXAgdnMgWzEuLl0pDQoNCnByZUFyciA6OiBPcmQgdiA9PiBGb3Jlc3QgdiAtPiBGaW5p
dGVNYXAgdiBJbnQNCnByZUFyciAgPSB0YWJ1bGF0ZSAuIHByZW9yZGVyRg0KDQotLSBBbGdvcml0
aG0gMjogdG9wb2xvZ2ljYWwgc29ydGluZw0KDQpwb3N0b3JkZXIgOjogVHJlZSBhIC0+IFthXQ0K
cG9zdG9yZGVyIChOb2RlIGEgdHMpID0gcG9zdG9yZGVyRiB0cyArKyBbYV0NCg0KcG9zdG9yZGVy
RiAgIDo6IEZvcmVzdCBhIC0+IFthXQ0KcG9zdG9yZGVyRiB0cyA9IGNvbmNhdCAobWFwIHBvc3Rv
cmRlciB0cykNCg0KcG9zdE9yZCAgICAgIDo6IE9yZCB2ID0+IEdyYXBoIHYgLT4gW3ZdDQpwb3N0
T3JkICAgICAgID0gcG9zdG9yZGVyRiAuIGRmZg0KDQp0b3BTb3J0ICAgICAgOjogT3JkIHYgPT4g
R3JhcGggdiAtPiBbdl0NCnRvcFNvcnQgICAgICAgPSByZXZlcnNlIC4gcG9zdE9yZA0KDQotLSBB
bGdvcml0aG0gMzogY29ubmVjdGVkIGNvbXBvbmVudHMNCg0KY29tcG9uZW50cyAgIDo6IE9yZCB2
ID0+IEdyYXBoIHYgLT4gRm9yZXN0IHYNCmNvbXBvbmVudHMgICAgPSBkZmYgLiB1bmRpcmVjdGVk
DQoNCnVuZGlyZWN0ZWQgICA6OiBPcmQgdiA9PiBHcmFwaCB2IC0+IEdyYXBoIHYNCnVuZGlyZWN0
ZWQgZyAgPSBidWlsZEcgKGVkZ2VzIGcgKysgcmV2ZXJzZUUgZykNCg0KLS0gQWxnb3JpdGhtIDQ6
IHN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnRzDQoNCnNjYyAgICAgICAgICA6OiBPcmQgdiA9
PiBHcmFwaCB2IC0+IEZvcmVzdCB2DQpzY2MgZyAgICAgICAgID0gZGZzICh0cmFuc3Bvc2VHIGcp
IChyZXZlcnNlIChwb3N0T3JkIGcpKQ0KDQpzY2MnICAgICAgICAgOjogT3JkIHYgPT4gR3JhcGgg
diAtPiBGb3Jlc3Qgdg0Kc2NjJyBnICAgICAgICA9IGRmcyBnIChyZXZlcnNlIChwb3N0T3JkICh0
cmFuc3Bvc2VHIGcpKSkNCg0KLS0gQWxnb3JpdGhtIDU6IENsYXNzaWZ5aW5nIGVkZ2VzDQoNCnRy
ZWUgOjogT3JkIHYgPT4gRm9yZXN0IHYgLT4gR3JhcGggdg0KdHJlZSB0cyAgPSBidWlsZEcgKGNv
bmNhdCAobWFwIGZsYXQgdHMpKQ0KIHdoZXJlIGZsYXQgKE5vZGUgdiBycykgPSBbICh2LCB3KSB8
IE5vZGUgdyBfIDwtIHJzIF0gKysNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0ICht
YXAgZmxhdCBycykNCg0KYmFjayAgICAgICAgICAgICAgOjogT3JkIHYgPT4gR3JhcGggdiAtPiBG
aW5pdGVNYXAgdiBJbnQgLT4gR3JhcGggdg0KYmFjayBnIHBvc3QgICAgICAgID0gbWFwRk0gc2Vs
ZWN0IGcNCiB3aGVyZSBzZWxlY3QgdiB3cyA9IFsgdyB8IHcgPC0gd3MsIGRlcmVmIHBvc3QgdiA8
IGRlcmVmIHBvc3QgdyBdDQoNCmNyb3NzICAgICAgICAgICAgIDo6IE9yZCB2ID0+IEdyYXBoIHYg
LT4gRmluaXRlTWFwIHYgSW50IC0+DQogICAgICAgICAgICAgICAgICAgICBGaW5pdGVNYXAgdiBJ
bnQgLT4gR3JhcGggdg0KY3Jvc3MgZyBwcmUgcG9zdCAgID0gbWFwRk0gc2VsZWN0IGcNCiB3aGVy
ZSBzZWxlY3QgdiB3cyA9IFsgdyB8IHcgPC0gd3MsIGRlcmVmIHBvc3QgdiA+IGRlcmVmIHBvc3Qg
dywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVmIHByZSB2ID4gZGVyZWYgcHJlIHcg
XQ0KDQpmb3J3YXJkIDo6IE9yZCB2ID0+IEdyYXBoIHYgLT4gR3JhcGggdiAtPiBGaW5pdGVNYXAg
diBJbnQgLT4gR3JhcGggdg0KZm9yd2FyZCBnIHRyZWVHIHByZSA9IG1hcEZNIHNlbGVjdCBnDQog
d2hlcmUgc2VsZWN0IHYgd3MgPSBbIHcgfCB3IDwtIHdzLCBkZXJlZiBwcmUgdiA8IGRlcmVmIHBy
ZSB3IF0gXFwNCiAgICAgICAgICAgICAgICAgICAgIGRlcmVmIHRyZWVHIHYNCg0KLS0gQWxnb3Jp
dGhtIDY6IEZpbmRpbmcgcmVhY2hhYmxlIHZlcnRpY2VzDQoNCnJlYWNoYWJsZSAgICA6OiBPcmQg
diA9PiBHcmFwaCB2IC0+IHYgLT4gW3ZdDQpyZWFjaGFibGUgZyB2ID0gcHJlb3JkZXJGIChkZnMg
ZyBbdl0pDQoNCnBhdGggICAgICAgICA6OiBPcmQgdiA9PiBHcmFwaCB2IC0+IHYgLT4gdiAtPiBC
b29sDQpwYXRoIGcgdiB3ICAgID0gdyBgZWxlbWAgKHJlYWNoYWJsZSBnIHYpDQoNCi0tIEFsZ29y
aXRobSA3OiBCaWNvbm5lY3RlZCBjb21wb25lbnRzDQoNCmJjYyA6OiBPcmQgdiA9PiBHcmFwaCB2
IC0+IEZvcmVzdCBbdl0NCmJjYyBnID0gKGNvbmNhdCAuIG1hcCBiaWNvbXBzIC4gbWFwIChsYWJl
bCBnIGRudW0pKSBmb3Jlc3QNCiB3aGVyZSBmb3Jlc3QgPSBkZmYgZw0KICAgICAgIGRudW0gICA9
IHByZUFyciBmb3Jlc3QNCg0KbGFiZWwgOjogT3JkIHYgPT4gR3JhcGggdiAtPiBGaW5pdGVNYXAg
diBJbnQgLT4gVHJlZSB2IC0+IFRyZWUgKHYsSW50LEludCkNCmxhYmVsIGcgZG51bSAoTm9kZSB2
IHRzKSA9IE5vZGUgKHYsZGVyZWYgZG51bSB2LGx2KSB1cw0KIHdoZXJlIHVzID0gbWFwIChsYWJl
bCBnIGRudW0pIHRzDQogICAgICAgbHYgPSBtaW5pbXVtIChbZGVyZWYgZG51bSB2XSArKyBbZGVy
ZWYgZG51bSB3IHwgdyA8LSBkZXJlZiBnIHZdDQogICAgICAgICAgICAgICAgICAgICArKyBbbHUg
fCBOb2RlICh1LGR1LGx1KSB4cyA8LSB1c10pDQoNCmJpY29tcHMgOjogVHJlZSAodixJbnQsSW50
KSAtPiBGb3Jlc3QgW3ZdDQpiaWNvbXBzIChOb2RlICh2LF8sXykgdHMpDQogICAgICA9IFsgTm9k
ZSAodjp2cykgdXMgfCAobCxOb2RlIHZzIHVzKSA8LSBtYXAgY29sbGVjdCB0c10NCg0KY29sbGVj
dCA6OiBUcmVlICh2LEludCxJbnQpIC0+IChJbnQsIFRyZWUgW3ZdKQ0KY29sbGVjdCAoTm9kZSAo
dixkdixsdikgdHMpID0gKGx2LCBOb2RlICh2OnZzKSBjcykNCiB3aGVyZSBjb2xsZWN0ZWQgPSBt
YXAgY29sbGVjdCB0cw0KICAgICAgIHZzID0gY29uY2F0IFsgd3MgfCAobHcsIE5vZGUgd3MgdXMp
IDwtIGNvbGxlY3RlZCwgbHc8ZHZdDQogICAgICAgY3MgPSBjb25jYXQgWyBpZiBsdzxkdiB0aGVu
IHVzIGVsc2UgW05vZGUgKHY6d3MpIHVzXQ0KICAgICAgICAgICAgICAgICAgICAgICAgfCAobHcs
IE5vZGUgd3MgdXMpIDwtIGNvbGxlY3RlZCBdDQoNCi0tIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBk
cmF3aW5nIHRyZWVzIGFuZCBmb3Jlc3RzOg0KDQpzaG93VHJlZSA6OiBTaG93IGEgPT4gVHJlZSBh
IC0+IFN0cmluZw0Kc2hvd1RyZWUgID0gZHJhd1RyZWUgLiBtYXBUcmVlIHNob3cNCg0Kc2hvd0Zv
cmVzdCA6OiBTaG93IGEgPT4gRm9yZXN0IGEgLT4gU3RyaW5nDQpzaG93Rm9yZXN0ICA9IHVubGlu
ZXMgLiBtYXAgc2hvd1RyZWUNCg0KbWFwVHJlZSAgICAgICAgICAgICAgOjogKGEgLT4gYikgLT4g
KFRyZWUgYSAtPiBUcmVlIGIpDQptYXBUcmVlIGYgKE5vZGUgeCB0cykgPSBOb2RlIChmIHgpICht
YXAgKG1hcFRyZWUgZikgdHMpDQoNCmRyYXdUcmVlICAgICAgICA6OiBUcmVlIFN0cmluZyAtPiBT
dHJpbmcNCmRyYXdUcmVlICAgICAgICAgPSB1bmxpbmVzIC4gZHJhdw0KDQpkcmF3IDo6IFRyZWUg
U3RyaW5nIC0+IFtTdHJpbmddDQpkcmF3IChOb2RlIHggdnMpID0gZ3JwIHRoaXMgKHNwYWNlIChs
ZW5ndGggdGhpcykpIChzdExvb3AgdnMpDQogd2hlcmUgdGhpcyAgICAgICAgICA9IHMxICsrIHgg
KysgIiAiDQoNCiAgICAgICBzcGFjZSBuICAgICAgID0gdGFrZSBuIChyZXBlYXQgJyAnKQ0KDQog
ICAgICAgc3RMb29wIFtdICAgICA9IFsiIl0NCiAgICAgICBzdExvb3AgW3RdICAgID0gZ3JwIHMy
ICIgICIgKGRyYXcgdCkNCiAgICAgICBzdExvb3AgKHQ6dHMpID0gZ3JwIHMzIHM0IChkcmF3IHQp
ICsrIFtzNF0gKysgcnNMb29wIHRzDQoNCiAgICAgICByc0xvb3AgW3RdICAgID0gZ3JwIHM1ICIg
ICIgKGRyYXcgdCkNCiAgICAgICByc0xvb3AgKHQ6dHMpID0gZ3JwIHM2IHM0IChkcmF3IHQpICsr
IFtzNF0gKysgcnNMb29wIHRzDQogICAgICAgcnNMb29wIFtdICAgICA9IGVycm9yICJkcmF3LCBy
c0xvb3AgKExkZnMuaHMpIg0KDQogICAgICAgZ3JwIGZpcnN0IHJzdCAgID0gemlwV2l0aCAoKysp
IChmaXJzdDpyZXBlYXQgcnN0KQ0KDQogICAgICAgW3MxLHMyLHMzLHM0LHM1LHM2XSA9IFsiLSAi
LCAiLS0iLCAiLSsiLCAiIHwiLCAiIGAiLCAiICsiXQ0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N
Cg0K

--0__=0FBBE703DFAC206E8f9e8a93df938690918c0FBBE703DFAC206E--