#!/usr/bin/perl

# FIXME: How do we make the Window objects modal to the rest of the app?

if(fork()) { exit; }

# Including GTK modules for GUI.
use Gtk;
use Gtk::Atoms;
use strict;

# Initialize the Gtk layer (Perl/Gtk 0.4 needs this)
init Gtk;

require "backends/pnpdump.pl";
require "backends/config.pl";
require "backends/hackcheck.pl";

# Declare context for the PnP data container structure.
my($pnpinfo);

{
  package INFO;

  $INFO::name = "gpnpconf";
  $INFO::version = "0.6.0";

  @INFO::contributors = (
	"Written by:",
	"Derrik Pates (dmp8309\@silver.sdsmt.edu)",
	"     (demon- on EFnet IRC)",
	"",
	"Thanks to:",
	"Bowie Poag (bjp\@primenet.com)",
	"     (Bowie on EFnet IRC)",
	"     for application icons"
  );

  @INFO::logoimage = (
"240 70 66 1",
"  c #020204",
". c #060604",
"X c #0a0a0c",
"o c #0e0e0c",
"O c #121214",
"+ c #161614",
"\@ c #1a1a1c",
"# c #1e1e1c",
"\$ c #222224",
"\% c #262624",
"& c #2a2a2c",
"* c #2e2e2c",
"= c #323234",
"- c #363634",
"; c #3a3a3c",
": c #3e3e3c",
"> c #424244",
", c #464644",
"< c #4a4a4c",
"1 c #4e4e4c",
"2 c #525254",
"3 c #565654",
"4 c #5a5a5c",
"5 c #5e5e5c",
"6 c #626264",
"7 c #666664",
"8 c #6a6a6c",
"9 c #6e6e6c",
"0 c #727274",
"q c #767674",
"w c #7a7a7c",
"e c #7e7e7c",
"r c #828284",
"t c #868684",
"y c #8a8a8c",
"u c #8e8e8c",
"i c #929294",
"p c #969694",
"a c #9a9a9c",
"s c #9e9e9c",
"d c #a2a2a4",
"f c #a6a6a4",
"g c #aaaaac",
"h c #aeaeac",
"j c #b2b2b4",
"k c #b6b6b4",
"l c #bababc",
"z c #bebebc",
"x c #c2c2c4",
"c c #c6c6c4",
"v c #cacacc",
"b c #cececc",
"n c #d2d2d4",
"m c #d6d6d4",
"M c #dadadc",
"N c #dededc",
"B c #e2e2e4",
"V c #e6e6e4",
"C c #eaeaec",
"Z c #eeeeec",
"A c #f2f2f4",
"S c #f6f6f4",
"D c #fafafc",
"F c #fefefc",
"G c Gray100",
"H c None",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHiHHHafHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHc0HHqejxHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHllt=065zui=HHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH,xMOO9:5Z4+3XHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH+:MtOX4,xu# 1oHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH;O;S:-otdj=.#1.HHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH \@<C&3#5b2X <\$.HHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH =9N-=#HHt3:O. HHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH.<uM>.*HHHoX  HHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHo6fM2X>.HHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH3+qkN7+<.HHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH3+txCi<:XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH3#txCs5:+HHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHH=yHHHHH5=7bHHHHHHHHw9puHHHVVnp2;-tHHHHHHHHHHHHHHHHugcHHHHHH9=OO\@*cHHHHHHHHHHHHHHjeuuHHHHCBze:=7HHHHHHHHHHHHHHHHHHHHSHHHHH:-HHHHHHHHHHHHHHHHSHHHHH;HHHHHHHHHHHHHHHHHHslvHHHHHHi;OO#;HHHHHHHHHHHH:#yvBe=w55HHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHiABHHHHH837t34m=rvi<;HHz*=;18hb=ycHH\%\$XqerylHHHHHHHHHHi*=:8lvd.HHAAMp6780ed0HHHHHHHHH5*-;6dm*-qBHH\%\@:ertuqHHHHHHHHHHHHHHbDNHHHHHH1f8u1HHHHHHHHHHhAV1HHHH.y48jHHHHHHHHHHH**=-4jcoXHHAABd8790tk\$HHHHHHHHH5,dnN6o726HHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHH=knt# HHHH6rcN3,iCv;X:.H86rfzml>6,HHX HHXwpcmk#HHHHHHHHj7thnAvy>5NHH#OOuhnNAdiHHHHHHHHu8uhvb1y\@qHHX.H.<yxbMjHHHHHHHHHHHqiDz-O HHHHHs8jzfHHHHHHH67Bv3\$O HHHHfrgl#HHHHHHHHH27rgcDg<,wHHH#+XalMBVr<HHHHHHHHu0lNM4X8\@OHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHH.,S64o HHHHa<lx6:ijt\@ \% HH-wMSn4o.-HHHHHHHH,sCb0-HHHHHHHj:tBDjq3#0HH.HHH55hCAs-<HHHHHHH0,sCB9O.1\%HHHHHHH9uzSj0\%HHHHHHHH\$=xha# HHHHHHo*ul;4HHHHH\$\@pc2-. HHHHHH,gVgr\%HHHHHHH*-wMFx2i+<HH. HH4qcSBq&wHHHHHHH0,snN5X5XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHH Oqg\@2.HHHHHH\$im<\%1u3=:X HHo5MVk;.6O HHHHHHHp2xAa>=HHHHHHH+qBCt,-X=HHHHHHH82xFh=*#HHHHHH4\$yZv1.,>. HHHHHHH>wNMq7HHHHHHH#X3B,5X HHHHH X:kf\$-oHHH3 ;C4:#  HHHHHH+8Mnd<&HHHHHH.o5MAa&*2#HHHHHHH\%wNCr#o&HHHHHH4\$ucN5X5XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHH \%z8X<.HHHHHH+eV2X,#\@+. HHHX5MNg& ,.HHHHHHHHH\%pAv24\@HHHHHHOqBm6&.5O HHHHHH3\%aDj-.*HHHHHH3#yAl; 4\% HHHHHHHH#,zDd=1HHHHHH \$geO1.HHHHHHX\$yZ8O+X HH +wk\$2+ HHHHHHHX>zAb56\@HHHHH X5MBqO ;.HHHHHHHX<xAy\@X: HHHHH4#yvN5.5XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHH.,A3.<.HHHHHHOwN,.1.HHHHHHHX5mMf\% = HHHHHHHHHO0BBw\@:\@HHHHHO0Vb1# ;.HHHHHHH4#yAj;.- HHHHH3#yAj- ,\@ HHHHHHHHX\%sSv1\$\$HHH3 o5S,.> HHHHHH19Ae&X<. HXX,vr+1O HHHHHHH *gDZy\$>HHHHH X4MM6X;# HHHHHHH.-kAy\@.<.HHHHH3\@ycN5.4XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHo7Z<.<.HHHHHHOtx= 1. HHHHHHX5mMd\$ & HHHHHHHHHo4mAa\$6=HHHHHOqVc<\@-\$ HHHHHHH3#yAk;.; HHHHH3#yAk; ;+ HHHHHHHHX\@yCN9O;HHH .=dv; ; HHHHHHHmy\%.X&  tX\$yFqO1OHHHHHHHH \%dSDh=1+HHHH X5mN4.8o HHHHHHH.-jAy\@.<.HHHHH3#yvN4.4XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHH+0C2X<.HHHHHH\@gt+ :  HHHHHHX4mMd\% \% HHHHHHHHHX1vDh=\%1.HHHHOqVc<\@*\@ HHHHHHH3#yAj-.; HHHHH3#yAj- ;OHHHHHHHHH.+wBCr\@5 HH O7Mk;.- HHHHHHHHd<;;X o0o1xC0O1OHHHHHHHH \%dADz>.&HHHH X5mM4.5XHHHHHHHH.-jAy\@.<.HHHHH3\@yvN4.4XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHH\%8F8o<.HHHHHH>A,.#\$  HHHHHH.4MMd\% \% HHHHHHHHHX<cDj=.5XHHHHO0Vv,\@*# HHHHHHH3#yAj-.; HHHHH3#yAj- ;OHHHHHHHHH.O0BCy#4.H5X\%aSj- ; HHHHHHHHH++X HHO+0BV0O1OHHHHHHHH \$dAFx,.: HHH .4MM4X5XHHHHHHHH.-kAy\@.<.HHHHH3#ycN4.4XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHH5mf;1XHHHHHsdj\$ ,X HHHHHHHX4MMd\% \% HHHHHHHHH.<cDh* 1OHHHH+0Vc<\@*# HHHHHHH3\@yAj- ; HHHHH3\@yAk- ;OHHHHHHHHH +0BCr\@:X\$+\@>lFk- ; HHHHHHHHHHHHHHH \$pZB0O1OHHHHHHHH \%dSDz>.,.HHH X4MM4X5XHHHHHHHH.-kAu\@.<.HHHHH4\@ycN4.4XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHH7vl51oHHHHHami+&&. HHHHHHHX5MNd\% \% HHHHHHHHHX<cDf* <OHHHHOqVc<\@*\@ HHHHHHH3#yAk-.-.HHHHH3#yAj;.-OHHHHHHHHH.OqVVw+>X#+#<cFj; -.HHHHHHHHHHHHHHH.&dSBqo1OHHHHHHHH \%dSDk; ,.HHH .5MM5.4XHHHHHHHH ;jAy\@.<.HHHHH3#ycN5X5XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHvsw5\$HHHHHBB43*. HHHHHHHHX4MMd\% \% HHHHHHHHH.<cAu# <OHHHHO0Vc<\@=\@ HHHHHHH3#yAj-.-.HHHHH3#yAk-.-OHHHHHHHHH.O0Vm6o-oO#\$4nDk;.-.HHHHHHHHHHHHHHH.-jSB0O1OHHHHHHHH \%dSAa\% > HHH X5MM5X5XHHHHHHHH -jAy\@.<.HHHHH3#ycN5X5XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHH&i>&*rHHHDZd:#. HHHHHHHHHX4MMf\% \% HHHHHHHHHX<cN8o 4XHHHHOqVv<\@=\@ HHHHHHH3#yAj;.-.HHHHH3#yAl;.-OHHHHHHHHH OqCz>.1oo9\%4mFx> -.HHHHHHHHHHHHHHHX-jSB0O1OHHHHHHHH \%dFNq+ = HHH X4MM5.5XHHHHHHHH -jAy\@.<.HHHHH3\@ycN5X5XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHH=:1886HHH+X  HHHHHHHHHHX4MNh= \% HHHHHHHHHX<nl>.->.HHHH+0Vv<\@=\@ HHHHHHH4\@yAk;.-.HHHHH3\@yAx> -OHHHHHHHHH OqDu\$ 2X.H\$1bFv< :.HHHHHHHHHHHHHHHH*fSB0O1OHHHHHHHH \%fZl,.*# HHH X4MM5X5XHHHHHHHH.-jAy\@.<.HHHHH3\@ycN5X5XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHnHHHHH.XXXHHHHHHHHHHHHHHHHH.5MCx> * HHHHHHHHH.1Ce\@ 3\% HHHHOqVv<\@=\@ HHHHHHH4#yAk;.-.HHHHH3#yZb2.>+HHHHHHHHH +eN3o - HH#:kDm4.<.HHHHHHHHHHHHHHHH\%yCBqO1OHHHHHHHH \%hlw# 5o HHH X4MM5X5XHHHHHHHH.-kAu\@.<.HHHHH3\@ycN5X5XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHH:aHHHHHHHHHHHHHHHHHHHHHHHHHH.4MAm6o; HHHHHHHHHX7m:.o*o HHHHOqVc<\@=\@ HHHHHHH3#yAk;.-.HHHHH3#yZBq+<#HHHHHHHHH.\@da\$ 3+ HHd=iZBqo2.HHHHHHHHHHHHHHHH87nAy\@2OHHHHHHHH =M9-. * HHHH X4MM5X5XHHHHHHHH.-jAu\@.<.HHHHH3\@ycN5X5XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHX&d=HHHHHHHHHHHHHHHHHHHHHHHHX4mAmt*1XHHHHHHHHH#gwO 3o.HHHHHO0Vc<\@=\@ HHHHHHH4#yAk;.-.HHHHH4\@yZBp:5* HHHHHHHH+:S<. ;. HHHH8vAp\%6oHHHHHHHHHHHHHHHHH2gFj-<\@HHHHHHHHo4m*o 3o HHHH .4MM5X5XHHHHHHHH.;kSu\@.<.HHHHH3\@ycN5X5XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHH.>dd2*\$##\%\%\%\%\%&&-tHHHHHHHHHHX4MVze55\@HHHHHHHH\$8B= 1\$  HHHHHO0Cv1\$-\@ HHHHHHH3#yAk;.-.HHHHH3#yAcr7;,oHHHHHHH04aa+ 3O HHHHHzfAv51\@HHHHHHHHHHHHHHHHHHuMm9&&HHHHHHHH<leO.<# HHHHH.X5MM6o4XHHHHHHHH.-kSu\$X<.HHHHH3\@ycN6o4XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHX2vVzdiuissssddsafNgHHHHHHHH.5MNf<1,=HHHHHHHHeBeO&*. HHHHHH\%yDvq33\@ HHHHHHH8=sDl7=*.HHHHH3#yAk318>#HHHHHHH0vZ1.4\@ HHHHHHHgMnf1&HHHHHHHHHHHHHHHHHHHxnh3;XHHHHHHHkB<.1\%  HHHHH+#0Zmr>,XHHHHHHHH\@1cVs3;;.HHHHH9=sNMt>,XHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHH\@5mFSSAZZASSSSSAZSl23\%HHHHHHX5mMd&+,1>HHHHHHkVl-2*X HHHHHHNtVfr848&\@HHHHHHHbuFae6,;#HHHHH4#yAk:+176\@HHHHHvNnu#4\@. HHHHHHHH-ytwyXHHHHHHHHHHHHHHHHHHHdtq6+ HHHHHMFa1:\$. HHHHHHwebhr82<\$HHHHHHHHwhbyq41>#HHHHHbuDzt93<\$HHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHi7VNMMMMMMMMMBVAFSl:\$<HHHHHHX5MNd\$ -=eiklBBZAzt<\@. HHHHHHHVSi*\@+OoO;HHHHHHVCCw\%++oX\%HHHHH4\@yAk- >*:wdazmCDcyw-O  HHHHHHHHHHHu;-1yHHHHHHHHHHHHHHHHHHH<2=:q:HHHSAn>\$X  HHHHHHHCZf-\@+OX+4HHHHHHHZb3#+OOo#9HHHHCCw>\@+Oo+5HHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHhj85653333458esbCz>.2OHHHHHX5mMd\% \%oH*0sklq;-#X  HHHHHHHHH*;,<,,>:=HHHHHHHH*:,,,,>-\$HHHH3#yAk- ;+OH-0fky<-\$+. HHHHHHHHHHHHHH&>74ihhiHHHHHHHHHHHHHHHHH-378ffHHH#X  HHHHHHHHHH&;,<,<>:*HHHHHHHH=>,<,,>;\%HHHHH=:>,<,>:*HHHHHHHHHHHHHHH",
"HHHHHHHHHHHHH<p,&\%\$\$\$\$\$\$\%*;4pml>.3OHHHHHX4mMd\$ \%.HH\%=-==\%+X  HHHHHHHHHHH\@\@\@\@\@\@\@+HHHHHHHH+\@#\@\@#\@\@oHHHH3#yAj-.;OHHH*=-*&+X. HHHHHHHHHHHHHHHH\@&;--=&HHHHHHHHHHHHHHHHHH\%*=*&HHHX  HHHHHHHHHHHH\@\@#\@\@\@+OHHHHHHHH\@\@\@\@\@#\@+OHHHHH\@\@\@#\@\@\@\@+HHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHjp545<44444444qwp;.&\@HHHHHX4MNd\% \% HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH3#yAj- ;OHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHDbHoXXoXXXXXXXOO.\$,O:+HHHHHX4mMd\% \% HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH3#yAk; -OHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHmC=o HHHHHHHHHHHHHHu>8o HHHHX4MMd\% \% HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH3\@yAk-.;OHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHH3Ns* HHHHHHHHHHHHHHHVd:XHHHHHX4MMd\% \% HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH3\@yAj- ;OHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHH\@,B2& HHHHHHHHHHHHHHHFHH HHHHHX4mMd\% \% HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH3\@yAk;.;OHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHH-*b>- HHHHHHHHHHHHHHHHHH HHHHHX5MMd\% \% HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH3\@yAj- ;OHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHH*pq1oHHHHHHHHHHHHHHHHHHHHHHHHX4MMd\% \% HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH3\@yAj; ;OHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHqB7\%HHHHHHHHHHHHHHHHHHHHHHHHX5MMf*.\$ HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH4#yAk:X-OHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHebsi HHHHHHHHHHHHHHHHHHHHHHH#9Zmj4*# HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH8*sDz8=&oHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHo06q2HHHHHHHHHHHHHHHHHHHHHHenhtw5:*\@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHbiFae7,;\$+HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHH>><wsHHHHHHHHHHHHHHHHHHHH<zV8,>;&1;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHAbk3>;*3,=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHH-4tifffHHHHHHHHHHHHHHHHghg1---*&2HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHgkr:--=*=8HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHH+++\@+HHHHHHHHHHHHHHHHHH+\@\@\@\@\@\@\@OHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\@\@\@#\@#\@\@+HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"
  );
  @INFO::iconimage = (
"64 64 256 2",
"  	c None",
". 	c #020204",
"+ 	c #82820C",
"\@ 	c #C4C404",
"# 	c #0244A5",
"\$ 	c #8A8A14",
"\% 	c #E4E305",
"& 	c #A4A204",
"* 	c #534330",
"= 	c #626204",
"- 	c #CCCA04",
"; 	c #02224C",
"> 	c #D2C2B1",
", 	c #A4A4A4",
"' 	c #A68563",
") 	c #D4D3D3",
"! 	c #B9A289",
"~ 	c #CEE2FC",
"{ 	c #83694D",
"] 	c #B6B6B4",
"^ 	c #30251C",
"/ 	c #E7F2FC",
"( 	c #585408",
"_ 	c #868684",
": 	c #0263F2",
"< 	c #E8D3BB",
"[ 	c #949493",
"} 	c #74740C",
"| 	c #DFC5A9",
"1 	c #393321",
"2 	c #131211",
"3 	c #CFB295",
"4 	c #6B563D",
"5 	c #E6E5E3",
"6 	c #A7937F",
"7 	c #599EFC",
"8 	c #978571",
"9 	c #E7DBC9",
"0 	c #C8AD8F",
"a 	c #8A7660",
"b 	c #46462C",
"c 	c #B7997A",
"d 	c #646464",
"e 	c #022357",
"f 	c #F7E4CB",
"g 	c #98C3FC",
"h 	c #48392A",
"i 	c #FEF3E0",
"j 	c #1C1510",
"k 	c #72624C",
"l 	c #CCCCCC",
"m 	c #545454",
"n 	c #D1BA9F",
"o 	c #B1D2FC",
"p 	c #2C84FC",
"q 	c #544C44",
"r 	c #C2AC93",
"s 	c #A99A84",
"t 	c #F1DCC6",
"u 	c #FEFBEA",
"v 	c #0255CE",
"w 	c #E2CCB2",
"x 	c #F9ECDE",
"y 	c #828284",
"z 	c #BCBCBC",
"A 	c #8D8D61",
"B 	c #1072FC",
"C 	c #3C3A10",
"D 	c #715B44",
"E 	c #988A78",
"F 	c #977957",
"G 	c #02327B",
"H 	c #4592FC",
"I 	c #080A0D",
"J 	c #B5B304",
"K 	c #DAD704",
"L 	c #302C24",
"M 	c #EFD5B9",
"N 	c #747474",
"O 	c #746C64",
"P 	c #DABC9E",
"Q 	c #F2EF04",
"R 	c #BFA58B",
"S 	c #896F51",
"T 	c #021430",
"U 	c #B19476",
"V 	c #72AEFC",
"W 	c #C4C4C4",
"X 	c #D8CCBF",
"Y 	c #5D5C5C",
"Z 	c #614D3A",
"` 	c #ECCEAE",
" .	c #87B9FC",
"..	c #CADEFC",
"+.	c #9C9C9B",
"\@.	c #24240C",
"#.	c #E4D5C7",
"\$.	c #403426",
"\%.	c #4E4E24",
"&.	c #1D1D1C",
"*.	c #F6DCC2",
"=.	c #8C8C8C",
"-.	c #775E44",
";.	c #0F0E0B",
">.	c #3B2E23",
",.	c #9A9604",
"'.	c #DAC2A7",
").	c #E2E2E4",
"!.	c #C8B29A",
"~.	c #5B5B04",
"{.	c #EDEDEC",
"].	c #6C6C6C",
"^.	c #F8E6D6",
"/.	c #A8CCFC",
"(.	c #4A3E2D",
"_.	c #CFBDAF",
":.	c #3B8BFC",
"<.	c #F9FAFC",
"[.	c #E2CEBF",
"}.	c #9D7E5C",
"|.	c #BDBB05",
"1.	c #2A2A04",
"2.	c #024CBB",
"3.	c #D1CF04",
"4.	c #046BFC",
"5.	c #D6B69C",
"6.	c #68A6FC",
"7.	c #CEAE8C",
"8.	c #F6F6F3",
"9.	c #B2B2B4",
"0.	c #82827C",
"a.	c #C0DAFC",
"b.	c #247EFC",
"c.	c #6E6E0C",
"d.	c #76723C",
"e.	c #7D7D7C",
"f.	c #025BE0",
"g.	c #023C94",
"h.	c #AEAE04",
"i.	c #96963C",
"j.	c #ACACAC",
"k.	c #AA8B6C",
"l.	c #DCECFC",
"m.	c #022B6B",
"n.	c #021D47",
"o.	c #DCDCDB",
"p.	c #5098FC",
"q.	c #B6B23C",
"r.	c #64523D",
"s.	c #81B5FC",
"t.	c #3E3E24",
"u.	c #939217",
"v.	c #7D7A0C",
"w.	c #EDEA04",
"x.	c #F2FAFC",
"y.	c #A2927C",
"z.	c #CABAAC",
"A.	c #A2CAFC",
"B.	c #368AFC",
"C.	c #1A7AFC",
"D.	c #E1DE04",
"E.	c #90BEFC",
"F.	c #B99E83",
"G.	c #7E6A52",
"H.	c #555421",
"I.	c #271E14",
"J.	c #F6F604",
"K.	c #9E9E0C",
"L.	c #C2C224",
"M.	c #4C4C4C",
"N.	c #DED2C2",
"O.	c #928470",
"P.	c #F0E2D2",
"Q.	c #A08363",
"R.	c #927859",
"S.	c #4E4439",
"T.	c #9F8B75",
"U.	c #6E6A34",
"V.	c #020D21",
"W.	c #6B635C",
"X.	c #B19C83",
"Y.	c #8F7151",
"Z.	c #645C54",
"`.	c #2A2A29",
" +	c #F0F5FA",
".+	c #7C6447",
"++	c #D4E6FC",
"\@+	c #60A1FC",
"#+	c #9FC6FC",
"\$+	c #B9D5FC",
"\%+	c #3486FC",
"&+	c #1776FC",
"*+	c #CCC4C0",
"=+	c #343434",
"-+	c #E4DDDB",
";+	c #BBAB9E",
">+	c #242424",
",+	c #D6D21C",
"'+	c #0A0604",
")+	c #BEB4AC",
"!+	c #D2CBC4",
"~+	c #5A5244",
"{+	c #5A4A35",
"]+	c #FEEDD7",
"^+	c #362B1C",
"/+	c #AE8E6C",
"(+	c #444444",
"_+	c #968E8C",
":+	c #D6C6B6",
"<+	c #C9B6A6",
"[+	c #3C3C3C",
"}+	c #DAD6D4",
"|+	c #4F3E2D",
"1+	c #023686",
"2+	c #EAE604",
"3+	c #5A4634",
"4+	c #9A958F",
"5+	c #FEE6CC",
"6+	c #D6BC9F",
"7+	c #E6CDB2",
"8+	c #C2BAB4",
"9+	c #9E7A5C",
"0+	c #664E3C",
"a+	c #A29A94",
"b+	c #2A2214",
"c+	c #EAD6C4",
"d+	c #221A14",
"e+	c #928D89",
"f+	c #160E0C",
"g+	c #FEFEFC",
"h+	c #FEF6EC",
"i+	c #D2C6BC",
"j+	c #EADED4",
"k+	c #2A221C",
"l+	c #4A96FC",
"m+	c #BAB604",
"n+	c #DEDA04",
"o+	c #F6F204",
"p+	c #7AB2FC",
"q+	c #8EBAFC",
"r+	c #625E04",
"s+	c #AECEFC",
"t+	c #428EFC",
"u+	c #D6D204",
"v+	c #0A6EFC",
"w+	c #6EAAFC",
"x+	c #C6DEFC",
"y+	c #E2EEFC",
"z+	c #569AFC",
"A+	c #060606",
"B+	c #8E8E04",
"C+	c #A6A60C",
"D+	c #B8A690",
"E+	c #161613",
"F+	c #D1B69C",
"G+	c #867A6C",
"g+g+ +a.\$+\$+\$+\$+\$+\$+\$+g+g+g+g+g+u h+x ^.t c+< < < 7+w w w w w c+9 7+#.t c+c+c+< 7+w | | '.P 6+6+6+F+3 3 7.7.7.7.7.7.0 0 0 c Q.Y.",
"g+g+g+g+ +/ / / / / y+g+g+g+g+g+g+g+g+h+]+^.*.t t t t t t c+t 5+f t t f f 5+f t t c+t M < < ` w | w | '.'.P P P P P P 3 F.R.D r.",
"l.~ g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+h+i i ]+]+]+]+]+]+i h+h+i i h+h+u h+i ]+]+]+f f *.*.*.M M M M ` ` ` ` ` ` 5.Q.r.* 3+",
"++x+y+g+g+g+<.g+g+<.<.g+h+g+g+i j+j+9 N.:+> F+!.0 0 r r r r r r r 0 !.!.r !.<+F+<+!.r r R R R ! c c c U U /+/+k.k.k.k.k..+3+|+* ",
"l.a.l.g+g+x.<. +g+x.x.g+i g+g+j+N.N.X 8.{.{.).).).).-+9 o.o.o.}+}+) ) !+l !+W W z 8+z )+] 9.j.j., +.a+[ [ [ =.e+R.F F Q.D |+h * ",
"++x+++g+g+<.x.x. + + +g+x u g+9 X [.X g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+<.8.i {.{.5 o.o.) l !+*+W W z z ] j.+.e.O S Y.R.4 * |+* ",
"++..l.g+g+<. +<.x.x.<.g+x u g+j+X X X g+u g+g+g+g+g+g+g+g+<.<.8.8.{.{.{.).o.o.}+) ) W W W z 9.j.j., , +.+.+.[ N ]..+{ Y.r.|+h * ",
"l.a.++g+g+x.<. +<. + +g+^.h+g+#.N.X !+<.g+g+j.[ =.=.=.=._ _ _ 0.y 0.e.e.e.e.N N ].].].d d d d d Y Y m Y N =.[ N ].4 { S r.* |+* ",
"++a.++g+g+x.x. + + + +g+^.u g+#.[.!+i+<.g+g+, y y _ y 0.e.N ].d Y m M.(+[+[+=+L `.>+&.E+2 ;.;.I ;.I I ;.;.+.[ N O r.-.{ 0+|+h * ",
"l.a.++g+g+ +x. +x.x. +g+{.i g+#.X :+*+<.<.g+j._ +.] j., +.[ =.e.e.].d m M.(+[+=+`.>+>+&.E+2 ;.I A+A+I E+E++.4+e.N Z D { r.|+h * ",
"++a.l.g+g+ +x. + + + +g+P.h+g+N.:+> _.<.g+g+j.y +.z j.j.+.e+=.e.].].i.L.2+Q Q Q |.B+1 E+;.I I A+A+. A+&.E+, [ e.O Z D { r.* h * ",
"l.a.~ g+g+ + + + + +/ g+P.]+g+[.> > 8+g+<.g+j.y +.9.j.+.4+=.e.N A 2+o+o+Q Q Q Q w.w.\% v.;.I A+A+. . . &.;., +.e.N Z D { 0+|+h * ",
"++a.++g+g+x. + +/  +/ g+P.i g+X n _.<+<.g+g+j.y [ j.j.+.[ =.e.A w.o+J.o+Q Q w.w.2+2+\% \% + I A+A+. . . &.2 , +.e.N {+D { 0+* h * ",
"~ a.++g+g+ +/  + +/  +g+9 x h+:+z.<+;+<.<.g+j.e.[ j.+.+.[ _ e.,+J.o+Q Q Q w.w.w.\% 2+D.D.n+C A+. . . . &.2 , +.e.N Z D .+r.|+h * ",
"++\$+++g+<. +/  +y+/ / g+#.f ]+n !.!.)+8.<.g+j.e.[ j.+.[ =.e.A o+o+o+Q Q w.C+\$ 3.\% D.n+K K } A+. . . . &.2 , , y N Z -..+0+* h * ",
"~ a.++g+x. + +/ / y+y+g+7+P.x n r ;+;+<.8.g+j.e.=., +.[ _ e.q.o+o+Q Q w.u.L >+1 D.D.n+K u+K.A+. . . . &.2 j.+.0.e.{+D { r.|+h * ",
"~ \$+++g+x./ y+y+y+y+y+g+w < f F+r r D+8.8.g+j.e.=., [ =.y e.L.o+o+Q Q w.H.`.>+L D.K u+u+3.,.A+. . . . &.2 j.+.y e.Z -..+0+|+h * ",
"++\$+~ g+x./ / y+l.l.y+g+'.< t !.D+R ;+8.8.g+, N =.+.[ =.e.N d Y d d.U.u.=+L L |.n+u+u+3.\@ ~.. . . . . &.2 j., _ e.Z D { r.|+h |+",
"~ \$+~ g+ +y+y+y+l.l.y+g+'.< t 0 ! ! D+ +{.g+, N y [ =._ e.N d Y M.b (+[+=+t.|.K K u+3.- K.2 . . . . . &.2 j., =.e.Z -.{ r.|+h * ",
"++\$+x+g+ +y+y+l.y+l.l.g+6+7+t 0 F.F.! {.{.g+, ]._ [ =.e.N ].d m m (+[+=+b K n+K u+3.\@ |.1.A+A+. . . . &.2 9., _ 0.Z D { 0+|+h |+",
"~ o ..g+/ l.l.5 l.++++g+_.7+t 0 ! X.X.{.{.g+, ].e.=._ e.N d d m M.(+[+b K K K 3.3.3.K.\@.A+. . . . . . &.2 9.j._ e.Z D { r.* h * ",
"x+o x+g+y+~ ~ ++......g+6+w t R c U s {.{.g++.].e.=.y N ].d Y M.(+[+=+K.D.K K 3.3.\$ j A+A+A+. . . . . &.2 9., _ e.Z D S 0+|+h |+",
"x+s+\$+g+~ \$+o o s+s+s+g+F+| c+D+U k.6 ).5 <.+.].e._ e.N ].Y Y m (+[+=+u+D.K u+- C+;.I A+A+A+. . . . . &.2 9., _ e.~+D { r.* h * ",
"o g A.g+/.g E.s.s.p+s.g+F+| M F.U k.6 5 ).<.[ d N _ e.N d Y M.M.(+[+=+K K u+3.- ( ;.I '+A+. . . . . . E+2 j., _ e.Z D { 0+|+|+|+",
"g w+V ~ 6.p.z+l+H t+H g+!.'.M ! U /+y.).o.8.+.d N y N ].d Y M.M.[+=+=+v.v.v.c.c.\@.I I A+A+. . . . . . &.2 j.+._ e.{+D G.0+|+h * ",
"\@+\%+p E.b.v+4.4.4.: 4.g+3 '.` c U /+y.o.o. +[ Y N e.N ].d m m (+[+=+L `.&.E+E+;.;.I I A+A+. . . . . . &.2 j., y e.{+r..+{+h h h ",
"B f.f.z+f.v v v v v v g+7.'.< c /+k.6 o.o. +[ Y ].e.N d Y m M.(+[+=+H.u+3.- \@ |.= '+A+. . . . . . . . &.;.j.+.y e.|+3+4 * \$.1 h ",
"f.2.v p v # # # 2.# 2.h+r P 7+U /+/+s o.}+{.[ Y ].N ].d Y m M.(+[+=+H.3.3.- |.m+r+I A+A+A+. . . . . . &.2 j., 0.e.h |+{+h ^+^ ^+",
"2.g.2.C.2.# # # # # # ^.R P w U ' ' 6 }+}+{.[ Y ].N ].d Y M.(+[+[+=+H.- \@ \@ |.J r+I A+. . . . . . . . &.2 j.+.y e.1 h 3+h ^+^ ^+",
"2.# # b.2.g.g.# # # # f R 5.| /+' ' 4+) ) y+=.Y ].N ].d m m (+[+=+`.H.3.- |.J J ( A+A+A+. . . . . . . &.;.j., y e.\$.h 3+\$.^+^ ^+",
"# # # p 2.# # # # 2.# f ! 3 | U ' ' 6 l !+{.=.m ].].d d m M.(+[+=+`.\%.\@ \@ |.J h.~.A+A+. . . . . . . . &.;.j.+.y e.\$.h 3+\$.^+^ ^+",
"v 2.v t+f.v v 2.v 2.v t R 3 | k.}.9+y.l l ).=.m ].].].Y m M.(+[+=+L >+>+E+E+2 ;.I I A+A+. . . . . . . &.2 j., e.e.>.h * \$.^ k+^ ",
"f.f.v+p+C.v+v+4.: : : t F.7.P ' }.F y.l l o.=.Y N y e.N N d Y m m M.(+(+[+=+=+`.`.>+>+>+>+>+&.&.&.>+>+>+E+j., e.e.>.h * \$.^ ^ ^+",
"p b.H \$+7 l+p.l+:.:.p t c 0 P ' 9+F E W W o.+.N e.N N ].d Y m M.(+[+=+=+L >+>+>+&.&.&.&.E+E+&.E+E+E+E+&.>+] +.y e.>.\$.S.\$.^ k+^ ",
"6.7 V / E. .p+s.w+w+\@+t c 0 6+Q.F R.8 z z l ] l l l l l l l l l l l l l l l W *+W W z W z z z z z ] ] ] z W +.e.e.>.\$.|+\$.^ b+^+",
" .p+E.g+s+#+g g E.E. .< X.R 6+}.F R.O.z z ] j.j.j.j.j.j.j.j.9.j.9.j.j.9.9.j.j.j.j., , , , , , , +.+.+.+.+.[ =.e.e.^+\$.* 1 ^ ^+^+",
"g  .g g+o A.#+A.#+#+g < X.R F+}.Y.Y.G+9., [ _ _ _ _ =._ =.=.=.=.=.=.=.[ =.[ =.=.=.=.=.=._ _ y _ y e.e.e.e.e.N e.Z.^+\$.|+h ^+>.h ",
"#+ .g g+o #+#+#+#+#+#+< U R F+}.Y.Y.R.E G+O O W.d d W.N _ _ _ =.=.=.[ =.[ =.=.=.=._ _ _ _ _ y y e.q S.S.S.S.S.\$.\$.\$.\$.* h >.\$.h ",
"#+ .g g+s+#+#+#+g g g < U ! !.9+S S { .+D r.Z 3+|+h h * e.e.e.N N N e.N N N ].].d d d d Y Y Y Y [+^+^+^+>.1 >.>.>.\$.h 3+|+h h |+",
"g s.E.g+s+#+g g E.g E.w 6 ! !.F { S { .+.+D 4 r.3+{+3+* * ~+d N N N N N ].].].].].d Y Y Y Y M.\$.>.^+>.\$.\$.\$.h h h h |+{+* h \$.h ",
"g s.E.g+/.g E.E.E.q+q+w k.! !.F { { { { .+.+-.-.r.Z Z {+Z * * O =.e.N N ].N ].d ].d d ].N |+>.^+>.>.\$.h h h h h h |+* r.* h h h ",
"E. .E.g+/.#+E.E.q+E.E.w T.F.0 F { S { { { .+.+.+.+-.D -.4 4 ~+q W.+.+.=.=.=.=.=._ =.+.[ [ [ [ [ [ e.e.e.e.4 h |+|+|+* r.3+h \$.h ",
"E. .E.g+A.g q+E.q+s.s.w T.X.r R.{ { { .+{ )+P.g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+<.<.<.<.8. + +{. +{.{.{.8.) h h |+|+|+4 {+h h h ",
"g s.E.g+/.E.E.q+q+s.s.| 8 X.r S .+.+.+{ O.{.).).).).).).).).5 5 5 5 5 5 5 ).).o.).o.o.o.o.}+o.o.}+}+) ) ) !+0.\$.h h * Z * h \$.h ",
"g s.E.g+#+E.E.q+ .s.s.| Q.6 R { -..+.+{ l l W W W z W W W W W W W W W l W W W W W z z z z z z ] ] ] 9.9.9.9.9.q \$.h h Z 3+h >.h ",
"g s.g g+/.g E.E. .s.s.| T.6 ! { -.-.-.e+a+[ e+e+e+e+=.=.=.e+e+e+e+[ 4+4++.a++.4+[ 4+[ 4+4+4+e+e+e+_ =._ _ _ O.0.\$.\$.h {+|+h \$.h ",
"E.s.g g+/.g E.q+ .s.p+'.T.6 D+{ D -.4 D 4 r.Z 3+* |+|+\$.\$.\$.\$.\$.\$.\$.\$.|+* * |+|+\$.>.>.\$.h |+>.^ ^ ^ ^ ^ ^ ^ ^+^ >.h h * S.\$.>.\$.",
"g s.E.g+/.g g E.s.s.s.'.Q.6 c { 4 -.D 4 4 0+Z 3+3+* 3+|+h h h h h \$.h 3+{+Z Z 3+h \$.h h 3+3+h \$.>.^+>.>.>.>.^+1 >.\$.\$.* h \$.>.h ",
"#+ .g g+s+g g E.q+s.p+'.8 T.8 .+-.D D D 4 r.r.0+Z Z Z Z 3+* |+|+|+|+* 0+4 4 4 4 3+|+|+* {+r.* \$.h \$.\$.\$.\$.\$.\$.h \$.h h h \$.h >.\$.",
"g  .g g+s+#+g q+ .s.w+6+O.a D 3+|+|+h |+h h \$.h \$.\$.h \$.\$.>.1 1 1 >.>.h |+|+|+|+\$.>.>.>.h h \$.^+^ ^ ^ ^ ^ ^ ^ k+^ ^ ^ b+^ >.>.h ",
"#+q+g g+o #+#+q+ .p+6.0 S ~+\$.>.^+>.^+^+>.>.^+^+^+^+^+^ ^+^ k+k+k+k+k+^+>.>.>.>.^+k+I.k+^ ^+^ I.&.d+d+d+d+d+d+d+d+d+d+d+I.^+>.\$.",
"#+ .#+g+\$+/.g q+p+6.l+' r.h >.^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^+^ k+k+I.b+I.I.k+>.>.^+^+k+I.I.I.^ ^ ^ d+j j j &.j j j j j j j j d+^ >.h ",
"#+q+#+g+o #+g  .w+p.t+W.L j j 2 j f+2 f+;.j j j j 2 ;.I f+;.j j ;.I I '+'+A+A+I '+A+A+A+I '+'+2 j 2 2 2 j j E+2 2 2 2 2 j 2 j d+",
"#+E.A.g+o #+q+w+\@+:.p &+v+: f.f.v 2.2.# # # g.g.g.# 2.v v f.v f.f.f.v 2.# g.m.e ; n.n.n.; m.1+g.# # # # # # # # # # # # e T T T ",
"#+q+#+g+s+E.s.\@+p.\%+b.&+B 4.f.f.v 2.2.# # # 2.2.2.v v f.f.f.f.v v 2.2.g.G e n.n.n.n.n.e m.G g.g.# # # # # # # # # # # # e T T T ",
"#+ .#+g+/.s.w+7 l+:.p &+v+: : f.v v 2.v 2.v v f.f.f.f.f.f.v v v 2.# 1+m.e ; n.n.n.; e m.1+g.g.# # # # # # # # g.# g.g.# e T T T ",
"#+s.E.8.E.w+6.z+l+\%+b.&+4.: f.f.v f.f.f.f.f.f.: f.f.f.v v v 2.# g.G m.n.n.n.n.n.n.m.m.g.g.# # # # # # # # # # # # # g.# e T T T ",
"E.p+s./  .6.\@+p.H \%+b.B 4.: : : : : : : : : : f.f.f.v v 2.2.g.1+m.e n.n.n.n.n.; m.G g.g.# # # # # # # # # # # g.# # # # e T T T ",
" .6.w+++p+6.z+p.t+\%+b.B 4.: : 4.: : 4.: : : f.f.v v 2.2.# g.G m.; n.n.n.T n.e m.G g.g.# # # # # # # # # g.# # g.g.g.# # e T T T ",
"V 7 \@+g 6.z+p.t+:.b.&+B B 4.B v+B 4.: : : f.f.v v 2.2.# 1+m.e ; n.n.n.n.e e G g.g.# # # # # # # # # # # # # # # # # # # e T T T ",
"\@+t+\%+f.2.# # # g.g.g.g.g.g.g.g.g.1+1+G G m.m.e e n.n.T T T V.V.V.V.V.T T n.n.n.n.e e e e e e e e n.n.e n.n.e e e n.n.n.n.T T T ",
"l+p f.1+m.m.e e e e e e e e ; ; n.; n.n.n.n.n.T T T V.V.V.A+A+I I I V.V.T V.T T T T T T T T T T T T T T T T T T T T T T T T T T ",
"b.v G e n.e e e e n.n.n.n.n.n.n.n.n.T T T T T V.V.V.A+A+V.A+A+A+V.A+V.V.V.V.T T T V.V.T V.V.V.V.T T V.T T V.V.V.T V.V.V.V.T T T ",
"f.1+m.e e e e e e e e m.e e e ; n.n.n.n.T T T T V.A+V.A+A+V.A+V.V.V.V.T T T T T T T T T T T T T T T T T T T T T T T T T T T T n."
  );
}

# Main window package.
{
  package MW;

# Declaration of toplevel container window.
  $MW::window = Gtk::Window->new('toplevel');
  $MW::window->set_title("PnP Configuration Tool");

  $MW::window->realize();

  my($icon, $iconmask) = Gtk::Gdk::Pixmap->create_from_xpm_d(
	$MW::window->window, undef, @INFO::iconimage);
  $MW::window->window->set_icon(undef, $icon, $iconmask);

# Declaration of main container box.
  $MW::topbox = Gtk::VBox->new(0, 0);
  $MW::window->add($MW::topbox);
  $MW::topbox->show();

# Declaration of menu bar.
  $MW::topmenu = Gtk::MenuBar->new();
  $MW::topbox->pack_start($MW::topmenu, 1, 0, 0);
  $MW::topmenu->show();

# Declaration of file menu handle.
  $MW::filemenu = Gtk::MenuItem->new("File");

# Generate the Menu object and menu entries for the File menu, and attach
# to its parent.
  my($menuitem, $submenu, $subitem);
  $MW::fmenu = Gtk::Menu->new();

  $menuitem = Gtk::MenuItem->new("Read dump");
  $MW::fmenu->append($menuitem);
  $menuitem->show();

  $submenu = Gtk::Menu->new();

  $subitem = Gtk::MenuItem->new("from pnpdump");
  $submenu->append($subitem);
  $subitem->signal_connect('activate',
	[ \&main::open_dump_pnpdump, \$pnpinfo ]);
  $subitem->show();

  $subitem = Gtk::MenuItem->new("from file...");
  $submenu->append($subitem);
  $subitem->signal_connect('activate',
	[ \&main::open_dump_file, \$pnpinfo ]);
  $subitem->show();

  $menuitem->set_submenu($submenu);

  $menuitem = Gtk::MenuItem->new("Read config...");
  $MW::fmenu->append($menuitem);
  $menuitem->signal_connect('activate',
	[ \&main::open_conf_file, \$pnpinfo ]);
  $menuitem->show();

  $menuitem = Gtk::MenuItem->new();
  $MW::fmenu->append($menuitem);
  $menuitem->set_sensitive(0);
  $menuitem->show();

  $menuitem = Gtk::MenuItem->new("Write config");
  $MW::fmenu->append($menuitem);
  $menuitem->signal_connect('activate',
	[ \&main::save_conf_file, \$pnpinfo ]);
  $menuitem->set_sensitive(0);
  $menuitem->show();

  $menuitem = Gtk::MenuItem->new("Write config as...");
  $MW::fmenu->append($menuitem);
  $menuitem->signal_connect('activate',
	[ \&main::save_conf_file_as, \$pnpinfo ]);
  $menuitem->set_sensitive(0);
  $menuitem->show();

  $menuitem = Gtk::MenuItem->new("Apply config now");
  $MW::fmenu->append($menuitem);
  $menuitem->signal_connect('activate',
	[ \&main::save_conf_to_isapnp, \$pnpinfo ]);
  $menuitem->set_sensitive(0);
  $menuitem->show();

  $menuitem = Gtk::MenuItem->new();
  $MW::fmenu->append($menuitem);
  $menuitem->set_sensitive(0);
  $menuitem->show();

  $menuitem = Gtk::MenuItem->new("Exit");
  $MW::fmenu->append($menuitem);
  $menuitem->signal_connect('activate', [ \&main::finish, \$pnpinfo ]);
  $menuitem->show();

  $MW::filemenu->set_submenu($MW::fmenu);
  $MW::topmenu->append($MW::filemenu);
  $MW::filemenu->show();

# Declaration of help menu handle.
  $MW::helpmenu = Gtk::MenuItem->new("Help");

# Generate the Menu object and menu entry for the Help menu, and attach 
# to its parent.
  $MW::hmenu = Gtk::Menu->new();

  $menuitem = Gtk::MenuItem->new("About...");
  $MW::hmenu->append($menuitem);
  $menuitem->signal_connect('activate', [ \&main::about_app, \$pnpinfo ]);
  $menuitem->show();

  $MW::helpmenu->set_submenu($MW::hmenu);
  $MW::topmenu->append($MW::helpmenu);
  $MW::helpmenu->right_justify();
  $MW::helpmenu->show();

# Declaration of containing box which contains the two sides of the display.
  $MW::mainbox = Gtk::HBox->new(0, 0);
  $MW::topbox->add($MW::mainbox);
  $MW::mainbox->show();

# Declaration of left-side container (for device list).
  $MW::box1 = Gtk::VBox->new(0, 0);
  $MW::mainbox->pack_start($MW::box1, 1, 1, 0);
  $MW::box1->border_width(10);
  $MW::box1->show();

# Declaration of label container box (so it can reside on the left).
  $MW::labelbox = Gtk::HBox->new(0, 0);
  $MW::box1->pack_start($MW::labelbox, 1, 0, 0);
  $MW::labelbox->show();

# Declaration of the actual label.
  $MW::devlabel = Gtk::Label->new("Found Devices:");
  $MW::labelbox->pack_start($MW::devlabel, 0, 0, 0);
  $MW::devlabel->show();

# Declaration of the ScrolledWindow that contains the board/LD tree.
  $MW::treebox = Gtk::ScrolledWindow->new(undef, undef);
  $MW::treebox->set_usize(250, 150);
  $MW::treebox->set_policy('automatic', 'automatic');
  $MW::box1->add($MW::treebox);
  $MW::treebox->show();

# Declaration of the root object for the board/LD tree.
  $MW::treeroot = Gtk::Tree->new();
  $MW::treeroot->set_selection_mode('browse');
  $MW::treeroot->set_view_lines(1);
  $MW::treeroot->set_view_mode('item');
  $MW::treebox->add($MW::treeroot);
  $MW::treeroot->show();

# Declaration of the right side container (where profiles/resource
# lists are).
  $MW::box2 = Gtk::Widget->new("Gtk::VBox",
		border_width => 10,
		spacing => 10);
  $MW::mainbox->add($MW::box2);
  $MW::box2->show();

# Declaration of the box where the profile selector will live.
  $MW::profbox = Gtk::HBox->new(0, 0);
  $MW::box2->pack_start($MW::profbox, 1, 0, 0);
  $MW::profbox->show();

# Declaration of the Profile: label.
  $MW::proflbl = Gtk::Label->new("Profiles:");
  $MW::profbox->pack_start($MW::proflbl, 1, 1, 0);
  $MW::proflbl->show();

# Declaration of the OptionMenu to select a device profile.
  $MW::profmenu = Gtk::OptionMenu->new();
  $MW::profbox->add($MW::profmenu);
  $MW::profmenu->set_usize(150, 25);
  $MW::profmenu->show();

# Declaration of the table containing per-device resources and their
# current values.
  $MW::rsrclist = Gtk::List->new();
  $MW::rsrclist->set_usize(250, 150);
  $MW::rsrclist->set_selection_mode('browse');
  $MW::box2->add($MW::rsrclist);
  $MW::rsrclist->show();

  $MW::window->show();

# Add handlers for if the window manager tells us to quit.
  $MW::window->signal_connect('delete_event', [ \&main::finish, \$pnpinfo ]);
}

# Connect a click on the device tree to an update of the relevant areas of
# the current window.
$MW::treeroot->signal_connect('selection_changed', sub {
	my($tree) = @_;
	my(@childlist) = $tree->children;
	my($selected) = $tree->selection;
	my($i) = 0;
# For each of the child widgets of the Tree widget, go through and
# evaluate it.
	while(@childlist) {
	  my($current) = shift(@childlist);
# If it's a TreeItem, see if it matches what we know is selected.
	  if($current =~ /TreeItem/) {
	    $i++;
	    if($current eq $selected) {
# Peek ahead at the next known child. If it's NOT a TreeItem, and there
# really is more on the list, then we can assume it's a subtree containing
# logical device entries, so this isn't an extent. So, we want to clear
# the profile and resource lists.
	      if(!($childlist[0] =~ /TreeItem/) &&
		($childlist[0] =~ /Tree/)) {
		&clear_profs();
		&clear_rsrcs();
	      }
# Otherwise, this must be an extent, so assume that it's a board with a
# single logical device only.
	      else {
		&update_profs(\$pnpinfo, $i,
			$pnpinfo->{board}[$i]{first_ld});
	      }
	    }
	  }
# We can now assume we're at a subtree, so poke around in it.
	  else {
	    my(@sublist) = $current->children;
	    my($j) = 0;
# Go through all the subtree's children (we know there will be no
# subtrees now).
	    while(@sublist) {
	      my($subcurr) = shift(@sublist);
# If we match the selection, then we know the board and LD numbers, so
# pass that all on now.
	      if($subcurr eq $selected) {
		&update_profs(\$pnpinfo, $i,
			$j + $pnpinfo->{board}[$i]{first_ld});
	      }
	      $j++;
	    }
	  }
	}
});

if($#ARGV != -1) {
  my($pnpdata) = &read_config($ARGV[0]);

  if($pnpdata > 0) {
    $pnpinfo = $pnpdata;
    $pnpinfo->{confname} = $ARGV[0];

    ($MW::fmenu->children)[3]->set_sensitive(0);
    ($MW::fmenu->children)[4]->set_sensitive(1);
    ($MW::fmenu->children)[5]->set_sensitive(1);

    $pnpinfo->{touched} = 0;
  }
  elsif($pnpdata == 0) {
    &dlg_cant_open($ARGV[0]);
  }
  elsif($pnpdata == -2) {
    &read_dump(\$pnpinfo, $ARGV[0]);
  }
}

# Call update_devs to setup the window.
&update_devs($pnpinfo);
main Gtk;

# The function to update the current board/LD tree.
sub update_devs {
  my($pnp) = @_;
  my($i);

# Clear current device tree.
  $MW::treeroot->clear_items(0, -1);

# Add entries into the device tree for boards/LDs.
  for $i (1 .. $#{$pnp->{board}}) {
    my($board) = $pnp->{board}[$i];
    my($item) = Gtk::TreeItem->new_with_label($board->{name});
    $MW::treeroot->append($item);

# If there is only one LD for the board in question, don't bother adding
# an LD entry as a subordinate.
    if($board->{first_ld} < $#{$board->{ld}}) {
      my($j);
      my($subtree) = Gtk::Tree->new();
      for $j ($board->{first_ld} .. $#{$board->{ld}}) {
	my($ld) = $board->{ld}[$j];
	my($ld_label);
# If there's no name associated with the current logical device (yes, it
# does happen - some companies are braindead) set a generic label.
	if($ld->{name} ne "") {
	  $ld_label = $ld->{name};
	}
	else {
	  $ld_label = "Logical device $j";
	}
# Attach the description to the logical device's node in the tree.
	my($subitem) = Gtk::TreeItem->new_with_label($ld_label);
	$subtree->append($subitem);
	$subitem->show();
      }
      $item->set_subtree($subtree);
    }
    $item->show();
  }
  &clear_profs();
  &clear_rsrcs();
}

sub clear_profs {
# Remove the existing menu from the profile list OptionMenu.
  if(defined $MW::profmenu->get_menu()) {
    $MW::profmenu->remove_menu();
  }
# Generate a menu with a single menu entry for the profile list OptionMenu.
  my($menu) = Gtk::Menu->new();

  my($menuitem);
  $menuitem = Gtk::RadioMenuItem->new_with_label("None");
  $menuitem->show();
  $menu->append($menuitem);

# Link the new, empty menu to the OptionMenu widget object.
  $MW::profmenu->set_menu($menu);
  $MW::profmenu->set_history(0);
}

sub clear_rsrcs {
# Clear the resource list out completely.
  $MW::rsrclist->clear_items(0, -1);
}

# Function to update the profile list. Must also chain the resource list
# updater as needed.
sub update_profs {
  my($pnpref, $brd, $ldn) = @_;

  my($ld) = $$pnpref->{board}[$brd]{ld}[$ldn];
# Remove the existing menu from the profile list OptionMenu.
  if(defined $MW::profmenu->get_menu()) {
    $MW::profmenu->remove_menu();
  }
# Generate the menu entries for the OptionMenu.
  my($menu) = Gtk::Menu->new();

  my($i);
  my($prev);
  for $i (0 .. $#{$ld->{profile}}) {
    my($profile) = $ld->{profile}[$i];
    my($menuitem);
    $menuitem = Gtk::RadioMenuItem->new_with_label(
	"Profile $i (" . $profile->{priority} . ")", $prev);
    $menu->append($menuitem);
    $menuitem->signal_connect('activate',
	[ \&update_rsrcs, $pnpref, $brd, $ldn, $i ]);
    $menuitem->show();
    $prev = $menuitem;
  }

# Attach the new menu to the OptionMenu widget object.
  $MW::profmenu->set_menu($menu);
  $MW::profmenu->set_history($ld->{current}{profile});
# Update the resource list to correspond to the current device and profile.
  &update_rsrcs(0, $pnpref, $brd, $ldn, $ld->{current}{profile});
}

# Function to update the resource list.
sub update_rsrcs {
  my($parent, $pnpref, $brd, $ldn, $prof) = @_;

# Clear the resource list.
  &clear_rsrcs();

# Create aliases to the current logical device and profile structures.
  my($ld) = $$pnpref->{board}[$brd]{ld}[$ldn];
  my($profile) = $ld->{profile}[$prof];
  
  if($prof != $ld->{current}{profile}) {
    &build_ld_current($$pnpref, $brd, $ldn, $prof);
    ($MW::fmenu->children)[3]->set_sensitive(1);
    $$pnpref->{touched} = 1;
  }

# Add entries into the CList (for now) for the resources.
  my($k);
  for $k (0 .. $#{$profile->{io}}) {
    my($io) = $profile->{io}[$k];
    my($resmenu) = add_resitem("I/O port");
    my($addr) = $io->{addr_min};
    my($menu) = Gtk::Menu->new();
    $resmenu->set_menu($menu);
    my($m) = 0;
    while($addr <= $io->{addr_max}) {
      my($menuitem) = Gtk::MenuItem->new_with_label(
	sprintf("0x%lx - 0x%lx", $addr, $addr + $io->{window_size} - 1));
      $menu->append($menuitem);
      $menuitem->show();
      $menuitem->signal_connect('activate', [ sub {
        my($parent, $stor_ref, $val) = @_;
	$$stor_ref = $val;
      }, \$ld->{current}{io}[$k], $addr ]);
      if($addr == $ld->{current}{io}[$k]) {
        $resmenu->set_history($m);
      }
      $addr += (($io->{addr_align} > 0) ? $io->{addr_align} : 1);
      $m++;
    }
  }
  for $k (0 .. $#{$profile->{irq}}) {
    my($irq) = $profile->{irq}[$k];
    my($resmenu) = add_resitem("IRQ");
    my($menu) = Gtk::Menu->new();
    $resmenu->set_menu($menu);
    my($m);
    for $m (0 .. $#{$irq->{irqs}}) {
      my($menuitem) = Gtk::MenuItem->new_with_label($irq->{irqs}[$m]);
      $menu->append($menuitem);
      $menuitem->show();
      $menuitem->signal_connect('activate', [ sub {
        my($parent, $stor_ref, $val) = @_;
	$$stor_ref = $val;
      }, \$ld->{current}{irq}[$k], $irq->{irqs}[$m] ]);
      if($irq->{irqs}[$m] == $ld->{current}{irq}[$k]) {
        $resmenu->set_history($m);
      }
    }
  }
  for $k (0 .. $#{$profile->{dma}}) {
    my($dma) = $profile->{dma}[$k];
    my($resmenu) = add_resitem("DMA");
    my($menu) = Gtk::Menu->new();
    $resmenu->set_menu($menu);
    my($m);
    for $m (0 .. $#{$dma->{dmas}}) {
      my($menuitem) = Gtk::MenuItem->new_with_label($dma->{dmas}[$m]);
      $menu->append($menuitem);
      $menuitem->show();
      $menuitem->signal_connect('activate', [ sub {
        my($parent, $stor_ref, $val) = @_;
	$$stor_ref = $val;
      }, \$ld->{current}{dma}[$k], $dma->{dmas}[$m] ]);
      if($dma->{dmas}[$m] == $ld->{current}{dma}[$k]) {
        $resmenu->set_history($m);
      }
    }
  }
  for $k (0 .. $#{$profile->{mem}}) {
    my($mem) = $profile->{mem}[$k];
    my($resmenu) = add_resitem("Memory");
    my($addr) = $mem->{addr_min};
    my($menu) = Gtk::Menu->new();
    $resmenu->set_menu($menu);
    my($m) = 0;
    while($addr <= $mem->{addr_max}) {
      my($menuitem) = Gtk::MenuItem->new_with_label(
	sprintf("0x%lx - 0x%lx", $addr, $addr + $mem->{window_size}));
      $menu->append($menuitem);
      $menuitem->show();
      $menuitem->signal_connect('activate', [ sub {
        my($parent, $stor_ref, $val) = @_;
	$$stor_ref = $val;
      }, \$ld->{current}{mem}[$k], $addr ]);
      if($addr == $ld->{current}{mem}[$k]) {
        $resmenu->set_history($m);
      }
      $addr += (($mem->{addr_align} > 0) ? $mem->{addr_align} : 1);
      $m++;
    }
  }
}

sub add_resitem {
  my($labeltext) = @_;

  my($listitem) = Gtk::ListItem->new();

  my($rsrcitem) = Gtk::HBox->new(0, 0);
  $listitem->add($rsrcitem);
  $rsrcitem->show();

  my($lblbox) = Gtk::HBox->new(0, 0);
  $lblbox->set_usize(90, -1);
  $rsrcitem->pack_start($lblbox, 0, 0, 0);
  $lblbox->show();

  my($label) = Gtk::Label->new($labeltext);
  $lblbox->pack_start($label, 1, 0, 0);
  $label->show();

  my($resselect) = Gtk::OptionMenu->new();
  $rsrcitem->add($resselect);
  $resselect->set_usize(210, -1);
  $resselect->show();

  $MW::rsrclist->append_items($listitem);    
  $listitem->show();

  return($resselect);
}

# This function is called on exit. If the current profile is not saved,
# then check and see if the user wants it saved.
sub finish {
  my($parent,$pnpref) = @_;
  if($$pnpref->{touched} == 1) {
    my($dlgconfirm) = Gtk::Dialog->new();
    $dlgconfirm->signal_connect('delete_event', [ sub {
	my($tossme, $window) = @_;
	$window->destroy();
    }, $dlgconfirm ]);
    $dlgconfirm->set_title("Exit App");
    $dlgconfirm->border_width(0);

    my($label) = Gtk::Label->new(
	"Would you like to\nsave the current configuration?");
    $label->set_padding(10, 10);
    $dlgconfirm->vbox->pack_start($label, 1, 1, 0);
    $label->show();

    my($button) = Gtk::Button->new("Yes");
    $button->can_default(1);
    $dlgconfirm->action_area->pack_start($button, 1, 1, 0);
    $button->grab_default();
    $button->signal_connect('clicked', [ sub {
	my($tossme, $window, $pnpref) = @_;
	$window->destroy();
	&save_conf_file($pnpref);
	if($$pnpref->{touched} == 1) { return(); }
	$MW::window->destroy();
	exit();
    }, $dlgconfirm, $pnpref ]);
    $button->show();

    $button = Gtk::Button->new("No");
    $button->can_default(1);
    $dlgconfirm->action_area->add($button);
    $button->signal_connect('clicked', [ sub {
	my($tossme, $window, $pnpref) = @_;
	$window->destroy();
	$MW::window->destroy();
	exit();
    }, $dlgconfirm, $pnpref ]);
    $button->show();
    $dlgconfirm->show();
  }
  else {
    $MW::window->destroy();
    exit();
  }
# make sure this ALWAYS returns true, so that when delete_event occurs on
# the main window, the signal handling mechanism doesn't go thinking we
# failed.
  1;
}


# This function is called by the File->Open dump->from pnpdump menu option.
# It presents a warning message to the user before proceeding.
sub open_dump_pnpdump {
  my($parent, $pnpref) = @_;
  my($dlgconfirm) = Gtk::Dialog->new();
  $dlgconfirm->signal_connect('delete_event', [ sub {
	my($tossme, $window) = @_;
	$window->destroy();
  }, $dlgconfirm ]);
  $dlgconfirm->set_title("Warning");
  $dlgconfirm->border_width(0);

  my($label) = Gtk::Label->new(
	"You must be running as root or the pnpdump binary\nmust " .
	"be SUID root to do this.\n\nAre you sure you want to do this?");
  $label->set_padding(10, 10);
  $dlgconfirm->vbox->pack_start($label, 1, 1, 0);
  $label->show();

  my($button) = Gtk::Button->new("Yes");
  $button->can_default(1);
  $dlgconfirm->action_area->pack_start($button, 1, 1, 0);
  $button->grab_default();
  $button->signal_connect('clicked', [ sub {
	my($tossme, $window, $pnpref) = @_;
	$window->destroy();
	&read_dump_wrapper($pnpref);
  }, $dlgconfirm, $pnpref ]);
  $button->show();
  $button = Gtk::Button->new("No");
  $button->can_default(1);
  $dlgconfirm->action_area->add($button);
  $button->signal_connect('clicked', [ sub {
	my($tossme, $window) = @_;
	$window->destroy();
  }, $dlgconfirm ]);
  $button->show();
  $dlgconfirm->show();
}


# This function is called by the File->Open dump->from file menu option.
# It presents a file selector, so the user can select a dump file to read.
sub open_dump_file {
  my($parent,$pnpref) = @_;

  my($fselector) = Gtk::FileSelection->new("Open Dump");
  $fselector->position(-mouse);
  $fselector->signal_connect('delete_event', sub {
	my($widget, $fs) = @_;
	$fs->destroy();
  }, $fselector);
  $fselector->ok_button->signal_connect('clicked', [ sub {
	my($junk, $pnpref, $fs) = @_;
	if($fs->get_filename() eq "") { return(); }
	my($name) = $fs->get_filename();
	$fs->destroy();
	&read_dump_wrapper($pnpref, $name);
  }, $pnpref, $fselector ], $fselector);
  $fselector->cancel_button->signal_connect("clicked", sub {
	my($widget, $fs) = @_;
	$fs->destroy();
  }, $fselector);

  $fselector->show();
}

# This is the mid-level dump read wrapper. It checks to make sure that
# there's not unsaved data still lingering in memory, and if there is,
# makes provisions for the user to save it if desired.
sub read_dump_wrapper {
  my($pnpref, $name) = @_;
  if($$pnpref->{touched} == 1) {
    my($dlgconfirm) = Gtk::Dialog->new();
    $dlgconfirm->signal_connect('delete_event', [ sub {
	my($tossme, $window) = @_;
	$window->destroy();
    }, $dlgconfirm ]);
    $dlgconfirm->set_title("Config Not Saved");
    $dlgconfirm->border_width(0);

    my($label) = Gtk::Label->new(
	"Would you like to save the\ncurrent configuration?");
    $label->set_padding(10, 10);
    $dlgconfirm->vbox->pack_start($label, 1, 1, 0);
    $label->show();

    my($button) = Gtk::Button->new("Yes");
    $button->can_default(1);
    $dlgconfirm->action_area->pack_start($button, 1, 1, 0);
    $button->grab_default();
    $button->signal_connect('clicked', [ sub {
	my($tossme, $window, $pnpref) = @_;
	$window->destroy();
	&save_conf_file($pnpref);
	if($$pnpref->{touched} == 1) { return(); }
	&read_dump($pnpref, $name);
    }, $dlgconfirm, $pnpref, $name ]);
    $button->show();

    $button = Gtk::Button->new("No");
    $button->can_default(1);
    $dlgconfirm->action_area->add($button);
    $button->signal_connect('clicked', [ sub {
	my($tossme, $window, $pnpref) = @_;
	$window->destroy();
	&read_dump($pnpref, $name);
    }, $dlgconfirm, $pnpref ]);
    $button->show();
    $dlgconfirm->show();
  }
  else {
    &read_dump($pnpref, $name);
  }
}

# This function is called by open_dump_pnpdump and open_dump_file.
# It calls the backend loader, and if there's a problem with the data,
# tells the user about it.
sub read_dump {
  my($pnpref, $name) = @_;

  my($pnpdata) = &read_pnpdata($name);
  if($pnpdata == 0) {
    &dlg_cant_open($name);
    return();
  }
  if($pnpdata == -2) {
    &dlg_wrong_format();
    return();
  }
  if($pnpdata->{boardsfound} == 0) {
    my($dlgerror) = Gtk::Dialog->new();
    $dlgerror->signal_connect('delete_event', [ sub {
	my($tossme, $window) = @_;
	$window->destroy();
    }, $dlgerror ]);
    $dlgerror->set_title("No Boards Found");
    $dlgerror->border_width(0);

    my($label) = Gtk::Label->new(
	"The dump was read successfully,\nhowever, no boards were found.");
    $label->set_padding(10, 10);
    $dlgerror->vbox->pack_start($label, 1, 1, 0);
    $label->show();

    my($button) = Gtk::Button->new("OK");
    $button->can_default(1);
    $dlgerror->action_area->pack_start($button, 1, 1, 0);
    $button->grab_default();
    $button->signal_connect('clicked', [ sub {
	my($tossme, $window) = @_;
	$window->destroy();
    }, $dlgerror ]);
    $button->show();
    $dlgerror->show();
    return();
  }
  $$pnpref = $pnpdata;

  ($MW::fmenu->children)[3]->set_sensitive(1);
  ($MW::fmenu->children)[4]->set_sensitive(1);
  ($MW::fmenu->children)[5]->set_sensitive(1);

  &check_hacks($$pnpref);
  $$pnpref->{touched} = 1;
  &update_devs($$pnpref);
}

# This is the function called by File->Open Config. It sets up the file
# requester dialog, and provides for calling the subsequent checking
# routines.
sub open_conf_file {
  my($parent,$pnpref) = @_;

  my($fselector) = Gtk::FileSelection->new("Open Config");
  $fselector->position(-mouse);
  $fselector->signal_connect('delete_event', sub {
	my($widget, $fs) = @_;
	$fs->destroy();
  }, $fselector);
  $fselector->ok_button->signal_connect('clicked', [ sub {
	my($junk, $pnpref, $fs) = @_;
	if($fs->get_filename() eq "") { return(); }
	read_conf_from_file_wrapper($pnpref, $fs->get_filename());
	$fs->destroy();
  }, $pnpref, $fselector ], $fselector);
  $fselector->cancel_button->signal_connect("clicked", sub {
	my($widget, $fs) = @_;
	$fs->destroy();
  }, $fselector);

  $fselector->show();
}

# A wrapper around read_conf_from_file that checks to see if there is
# lingering unsaved data, and if there is, provides a mechanism for the
# user to save it if desired.
sub read_conf_from_file_wrapper {
  my($pnpref, $name) = @_;
  if($$pnpref->{touched} == 1) {
    my($dlgconfirm) = Gtk::Dialog->new();
    $dlgconfirm->signal_connect('delete_event', [ sub {
	my($tossme, $window) = @_;
	$window->destroy();
    }, $dlgconfirm ]);
    $dlgconfirm->set_title("Config Not Saved");
    $dlgconfirm->border_width(0);

    my($label) = Gtk::Label->new(
	"Would you like to save the\ncurrent configuration?");
    $label->set_padding(10, 10);
    $dlgconfirm->vbox->pack_start($label, 1, 1, 0);
    $label->show();

    my($button) = Gtk::Button->new("Yes");
    $button->can_default(1);
    $dlgconfirm->action_area->pack_start($button, 1, 1, 0);
    $button->grab_default();
    $button->signal_connect('clicked', [ sub {
	my($tossme, $window, $pnpref) = @_;
	$window->destroy();
	&save_conf_file($pnpref);
	if($$pnpref->{touched} == 1) { return(); }
	&read_conf_from_file($pnpref, $name);
    }, $dlgconfirm, $pnpref, $name ]);
    $button->show();

    $button = Gtk::Button->new("No");
    $button->can_default(1);
    $dlgconfirm->action_area->add($button);
    $button->signal_connect('clicked', [ sub {
	my($tossme, $window, $pnpref) = @_;
	$window->destroy();
	&read_conf_from_file($pnpref, $name);
    }, $dlgconfirm, $pnpref ]);
    $button->show();
    $dlgconfirm->show();
  }
  else {
    &read_conf_from_file($pnpref, $name);
  }
}

# The routine that actually calls the config reader, and checks the
# returns to see if the load process failed.
sub read_conf_from_file {
  my($pnpref, $name) = @_;
  if($name eq "") { return(); }

  my($pnpdata) = &read_config($name);
  if($pnpdata == 0) {
    &dlg_cant_open($name);
    return();
  }
  if($pnpdata == -2) {
    &dlg_wrong_format();
    return();
  }
  $$pnpref = $pnpdata;
  $$pnpref->{confname} = $name;

  ($MW::fmenu->children)[3]->set_sensitive(0);
  ($MW::fmenu->children)[4]->set_sensitive(1);
  ($MW::fmenu->children)[5]->set_sensitive(1);

  $$pnpref->{touched} = 0;
  &update_devs($$pnpref);
}

# Called by File->Write config, checks if the current data came from a
# known config file, calls the save routine directly, otherwise treats it
# like a Write config as... operation.
sub save_conf_file {
  my($parent,$pnpref) = @_;

  my($name) = $$pnpref->{confname};

  if($name eq "") { save_conf_file_as(@_); }
  else { write_conf($pnpref, $name); }
}

# Called by File->Write config as..., sets up a file requester box and the
# mechanism to actually write the configuration data.
sub save_conf_file_as {
  my($parent,$pnpref) = @_;

  my($fselector) = Gtk::FileSelection->new("Save Config");
  $fselector->position(-mouse);
  $fselector->signal_connect('delete_event', sub {
	my($widget, $fs) = @_;
	$fs->destroy();
  }, $fselector);
  $fselector->ok_button->signal_connect('clicked', [ sub {
	my($junk, $pnpref, $fs) = @_;
	if($fs->get_filename() eq "") { return(); }
	if(-e $fs->get_filename()) {
	  my($dlgconfirm) = Gtk::Dialog->new();
	  $dlgconfirm->signal_connect('delete_event', [ sub {
		my($tossme, $window) = @_;
		$window->destroy();
	  }, $dlgconfirm ]);
	  $dlgconfirm->set_title("Warning");
	  $dlgconfirm->border_width(0);

	  my($label) = Gtk::Label->new(
		"The file \"" . $fs->get_filename . "\" exists.\n" .
		"Overwrite anyway?");
	  $label->set_padding(10, 10);
	  $dlgconfirm->vbox->pack_start($label, 1, 1, 0);
	  $label->show();

	  my($button) = Gtk::Button->new("Yes");
	  $button->can_default(1);
	  $dlgconfirm->action_area->pack_start($button, 1, 1, 0);
	  $button->grab_default();
	  $button->signal_connect('clicked', [ sub {
		my($tossme, $window, $pnpref, $fs) = @_;
		$window->destroy();
		&write_conf($pnpref, $fs->get_filename());
		$fs->destroy();
	  }, $dlgconfirm, $pnpref, $fs ]);
	  $button->show();
	  $button = Gtk::Button->new("No");
	  $button->can_default(1);
	  $dlgconfirm->action_area->add($button);
	  $button->signal_connect('clicked', [ sub {
		my($tossme, $window) = @_;
		$window->destroy();
	  }, $dlgconfirm ]);
	  $button->show();
	  $dlgconfirm->show();
	}
	else {
	  &write_conf($pnpref, $fs->get_filename());
	  $fs->destroy();
	}
  }, $pnpref, $fselector ], $fselector);
  $fselector->cancel_button->signal_connect("clicked", sub {
	my($widget, $fs) = @_;
	$fs->destroy();
  }, $fselector);

  $fselector->show();
}

# Called by File->Apply config now, puts up a dialog asking for
# confirmation on whether or not to call isapnp with the current config
# data.
sub save_conf_to_isapnp {
  my($parent,$pnpref) = @_;
  my($dlgconfirm) = Gtk::Dialog->new();
  $dlgconfirm->signal_connect('delete_event', [ sub {
	my($tossme, $window) = @_;
	$window->destroy();
  }, $dlgconfirm ]);
  $dlgconfirm->set_title("Warning");
  $dlgconfirm->border_width(0);

  my($label) = Gtk::Label->new(
	"You must be running as root or the isapnp binary\nmust " .
	"be SUID root to do this.\n\nIf you modify resources of " .
	"devices which\ndrivers are loaded for, your system could " .
	"lock up.\n\nAre you sure you want to do this?");
  $label->set_padding(10, 10);
  $dlgconfirm->vbox->pack_start($label, 1, 1, 0);
  $label->show();

  my($button) = Gtk::Button->new("Yes");
  $button->can_default(1);
  $dlgconfirm->action_area->pack_start($button, 1, 1, 0);
  $button->grab_default();
  $button->signal_connect('clicked', [ sub {
	my($tossme, $window, $pnpref) = @_;
	$window->destroy();
	&write_conf($pnpref);
  }, $dlgconfirm, $pnpref ]);
  $button->show();
  $button = Gtk::Button->new("No");
  $button->can_default(1);
  $dlgconfirm->action_area->add($button);
  $button->signal_connect('clicked', [ sub {
	my($tossme, $window) = @_;
	$window->destroy();
  }, $dlgconfirm ]);
  $button->show();
  $dlgconfirm->show();
}

# The code that actually calls the config writer, and checks its return
# value to see if there were any problems.
sub write_conf {
  my($pnpref, $name) = @_;
  my($retval) = &write_config($$pnpref, $name);
  if($retval == 0) {
    my($dlgerror) = Gtk::Dialog->new();
    $dlgerror->signal_connect('delete_event', [ sub {
	my($tossme, $window) = @_;
	$window->destroy();
    }, $dlgerror ]);
    $dlgerror->set_title("Write Config");
    $dlgerror->border_width(0);

    my($label) = Gtk::Label->new(
	"The file $name could not be\nopened for writing.");
    $label->set_padding(10, 10);
    $dlgerror->vbox->pack_start($label, 1, 1, 0);
    $label->show();

    my($button) = Gtk::Button->new("OK");
    $button->can_default(1);
    $dlgerror->action_area->pack_start($button, 1, 1, 0);
    $button->grab_default();
    $button->signal_connect('clicked', [ sub {
	my($tossme, $window) = @_;
	$window->destroy();
    }, $dlgerror ]);
    $button->show();
    $dlgerror->show();
    return();
  }
  $$pnpref->{confname} = $name;
  $$pnpref->{touched} = 0;
  ($MW::fmenu->children)[3]->set_sensitive(0);
}

# A shared dialog block for if a file can't be opened.
sub dlg_cant_open {
  my($name) = @_;
  my($dlgerror) = Gtk::Dialog->new();
  $dlgerror->signal_connect('delete_event', [ sub {
	my($tossme, $window) = @_;
	$window->destroy();
  }, $dlgerror ]);
  $dlgerror->set_title("Read Problem");
  $dlgerror->border_width(0);

  my($label) = Gtk::Label->new(($name ne "") ?
	  "The file $name could not be\nopened for reading." :
	  "A pipe from pnpdump couldn't\nbe opened.");
  $label->set_padding(10, 10);
  $dlgerror->vbox->pack_start($label, 1, 1, 0);
  $label->show();

  my($button) = Gtk::Button->new("OK");
  $button->can_default(1);
  $dlgerror->action_area->pack_start($button, 1, 1, 0);
  $button->grab_default();
  $button->signal_connect('clicked', [ sub {
	my($tossme, $window) = @_;
	$window->destroy();
  }, $dlgerror ]);
  $button->show();
  $dlgerror->show();
}

# A shared dialog to be used for when the data retrieved didn't match the
# required format.
sub dlg_wrong_format {
  my($dlgerror) = Gtk::Dialog->new();
  $dlgerror->signal_connect('delete_event', [ sub {
	my($tossme, $window) = @_;
	$window->destroy();
  }, $dlgerror ]);
  $dlgerror->set_title("Data Error");
  $dlgerror->border_width(0);

  my($label) = Gtk::Label->new(
	"The data read was not in\nthe correct format.");
  $label->set_padding(10, 10);
  $dlgerror->vbox->pack_start($label, 1, 1, 0);
  $label->show();

  my($button) = Gtk::Button->new("OK");
  $button->can_default(1);
  $dlgerror->action_area->pack_start($button, 1, 1, 0);
  $button->grab_default();
  $button->signal_connect('clicked', [ sub {
	my($tossme, $window) = @_;
	$window->destroy();
  }, $dlgerror ]);
  $button->show();
  $dlgerror->show();
}

# Code to check and see if there are any known buggy devices in the
# current data tree.
sub check_hacks {
  my($pnp) = @_;

  my($hacklist) = &hackcheck($pnp);

  my($i);
  for $i (0 .. $#{$hacklist}) {
    my($dlgerror) = Gtk::Dialog->new();
    $dlgerror->signal_connect('delete_event', [ sub {
	my($tossme, $window) = @_;
	$window->destroy();
    }, $dlgerror ]);
    $dlgerror->set_title("Found Broken Device");
    $dlgerror->border_width(0);

    my($label) = Gtk::Label->new(
	"A fix was found for a known problem with your:\n\n" .
	$pnp->{board}[$hacklist->[$i][1]]{name} .
	"\n\nDo you wish to apply a fix?");
    $label->set_padding(10, 10);
    $dlgerror->vbox->pack_start($label, 1, 1, 0);
    $label->show();

    my($button) = Gtk::Button->new("Yes");
    $button->can_default(1);
    $dlgerror->action_area->pack_start($button, 1, 1, 0);
    $button->grab_default();
    $button->signal_connect('clicked', [ sub {
	my($tossme, $window, $pnp, $hacklist) = @_;
	$window->destroy();
	&dohack($pnp, $hacklist->[$i]);
    }, $dlgerror, $pnp, $hacklist ]);
    $button->show();
    $dlgerror->show();

    $button = Gtk::Button->new("No");
    $button->can_default(1);
    $dlgerror->action_area->pack_start($button, 1, 1, 0);
    $button->signal_connect('clicked', [ sub {
	my($tossme, $window) = @_;
	$window->destroy();
    }, $dlgerror ]);
    $button->show();
    $dlgerror->show();
  }
}

# The About... dialog.
sub about_app {
# The About... window's main window definition.
  my($about_win) = Gtk::Window->new('dialog');
  $about_win->set_title("About gpnpconf");

# Define the main widget container.
  my($topbox) = Gtk::Widget->new("Gtk::VBox",
	border_width => 10,
	spacing => 10);
  $about_win->add($topbox);
  $topbox->show();

# Realize dimensions and colormap for the main VBox container.
  $topbox->realize();

# Generate pixmap amd pixmap mask for the logo image.
  my($logo, $logomask) = Gtk::Gdk::Pixmap->create_from_xpm_d(
	$topbox->window, undef, @INFO::logoimage);

# Create a Pixmap widget with the logo image bound into it.
  my($header) = Gtk::Pixmap->new($logo, $logomask);
  $topbox->pack_start($header, 1, 0, 0);
  $header->show();

# Add a version label.
  my($verlabel) = Gtk::Label->new($INFO::name . " version " . $INFO::version);
  $topbox->add($verlabel);
  $verlabel->show();

# The CList to contain the entries from the list of contributors.
  my($credlist) = Gtk::CList->new(1);
  $credlist->set_column_width(0, 200);
  $credlist->set_usize(250, 125);
  $topbox->add($credlist);
  $credlist->show();

# Set up a box to drop the OK button into.
  my($buttonbox) = Gtk::HButtonBox->new();
  $topbox->add($buttonbox);
  $buttonbox->set_layout(-spread);
  $buttonbox->show();

# Put the OK button into the button box.
  my($OKButton) = Gtk::Button->new("OK");
  $buttonbox->add($OKButton);
  $OKButton->show();

# Attach a sub to the OK button to close the About box when clicked.
  $OKButton->signal_connect('clicked', [ sub {
	my($parent, $window) = @_;
	$window->destroy();
  }, $about_win ]);
  $about_win->show();

# Insert everything from the contributors list into the CList we made.
  my($i);
  for $i (0 .. $#INFO::contributors) {
    $credlist->append($INFO::contributors[$i]);
  }
}

