program Przygodowka_szablon;
uses crt;
const
MAXITEMS= 5 ;
map : array [ 1 .. 16 , 1 .. 12 ] of byte =
( ( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ) ,
( 1 , 0 , 0 , 0 , 1 , 0 , 1 , 1 , 0 , 0 , 1 , 1 ) ,
( 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 1 , 1 ) ,
( 1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 0 , 0 , 1 , 1 ) ,
( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ) ,
( 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 1 ) ,
( 1 , 0 , 1 , 0 , 0 , 1 , 0 , 1 , 0 , 0 , 1 , 1 ) ,
( 1 , 0 , 1 , 0 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 1 ) ,
( 1 , 1 , 1 , 0 , 0 , 1 , 0 , 1 , 0 , 0 , 1 , 1 ) ,
( 1 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ) ,
( 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 1 ) ,
( 1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 1 ) ,
( 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 , 0 , 0 , 1 , 1 ) ,
( 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 1 ) ,
( 1 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 1 ) ,
( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ) ) ;
places_ : array [ 1 .. 6 ] of string =
( 'Jestes na lesnej sciezce.' ,
'Mozesz isc na :' ,
'Przed toba jaskinia.' ,
'Przed toba wyjscie z jaskini.' ,
'Jestes w ciemnej jaskini.' ,
'Jestes w podziemnym labiryncie.' ) ;
items : array [ 1 .. MAXITEMS ] of string = ( 'KAMIEN' , 'SZTYLET' , 'PATYK' , 'LISC' , 'SZNUREK' ) ;
var
X : byte ; Y: byte ; JASKINIA: byte ; MAPVISIBLE : byte ; INCAVE : byte ; ITEMHERE : byte ;
ITEMINLOC : array [ 1 .. MAXITEMS ] of byte ;
LOCITEMX : array [ 1 .. MAXITEMS ] of byte ;
LOCITEMY : array [ 1 .. MAXITEMS ] of byte ;
PLACE_ : string [ 200 ] ; C_ : string [ 15 ] ;
VERB_ : string ; INV_ : string [ 15 ] ; INV : array [ 1 .. MAXITEMS ] of byte ; LOCX : byte ; LOCY : byte ; TMP_ : string ;
LOCN, LOCS, LOCE, LOCW, OLDX, OLDY : byte ;
N_, S_, E_, W_ : string [ 10 ] ;
noun : string [ 15 ] ;
cmd : string [ 50 ] ;
i : byte ;
procedure look;
begin
{6452 IF LOCY>5 THEN RESTORE 6005:READ PLACE$
6453 PRINT :PRINT PLACE$;:PRINT " ";:ITEMHERE=0
6454 FOR I=1 TO MAXITEMS:IF ITEMINLOC(I)=1 AND LOCITEMX(I)=LOCX AND LOCITEMY(I)=LOCY THEN ITEMHERE=1
6455 NEXT I:IF ITEMHERE=1 THEN PRINT "Tu lezy ";
6456 RESTORE 6504:FOR I=1 TO MAXITEMS:READ VERB$
6457 IF ITEMINLOC(I)=1 AND LOCITEMX(I)=LOCX AND LOCITEMY(I)=LOCY THEN PRINT VERB$;:PRINT " ";
6458 NEXT I:PRINT :PRINT "NACISNIJ <RETURN>";:INPUT VERB$:PRINT
6459 ITEMHERE=0:RETURN
}
end ;
procedure open;
begin
{
204 IF (JASKINIA=1) AND (LOCX=8) AND (LOCY=3) THEN PRINT "Jaskinia jest otwarta.":JASKINIA=0
205 IF JASKINIA=1 THEN PRINT "Nie mozesz tu nic otworzyc.":PRINT "Nacisnij <RETURN>":INPUT VERB$
207 RETURN
}
end ;
procedure show_inv;
begin
{
1000 PRINT :PRINT "Posiadasz: ":RESTORE 6504:FOR I=1 TO MAXITEMS:READ INV$
1001 IF INV(I)>0 THEN PRINT INV$;:INPUT VERB$
1002 NEXT I:RETURN
}
end ;
procedure show_map;
begin
{
198 RESTORE 6530:X=5:IF LOCY>5 THEN X=16
200 FOR I=1 TO X:FOR J=1 TO 12:READ C:COLOR C:FOR X=1 TO 4:PLOT J*4,I*4+X:DRAWTO (J+4)*4,I*4+X
201 PLOT J*4,I*4+4:DRAWTO J*4+4,I*4+4:NEXT X:NEXT J:NEXT I
202 COLOR 2:PLOT LOCX*4+2,LOCY*4+2:OLDX=LOCX:OLDY=Y:MAPVISIBLE=1
203 RETURN
}
end ;
function end_check : boolean ;
begin
end_check: = false ;
IF ( INV[ 3 ] = 1 ) AND ( LOCITEMX[ 1 ] = 10 ) AND ( LOCITEMY[ 1 ] = 4 ) AND ( INV[ 5 ] = 1 ) THEN end_check: = true ;
end ;
procedure get ;
begin
{
6440 PRINT "Co bierzesz ";:INPUT TMP$
6441 RESTORE 6504:FOR I=1 TO MAXITEMS:READ VERB$
6442 IF LOCX=LOCITEMX(I) AND LOCY=LOCITEMY(I) AND VERB$=TMP$ THEN INV(I)=1:LOCITEMX(I)=-1:LOCITEMY(I)=0
6443 IF LOCITEMX(I)=-1 THEN ITEMINLOC(I)=ITEMINLOC(I)-1:ITEMHERE=3:LOCITEMX(I)=0
6444 NEXT I:IF ITEMHERE=3 THEN PRINT :PRINT "Wziales ";:PRINT TMP$
6445 ITEMHERE=0:RETURN
}
end ;
procedure drop;
begin
{
6446 PRINT "Co chcesz zostawic ";:INPUT TMP$:RESTORE 6504:FOR I=1 TO MAXITEMS:READ VERB$
6447 IF INV(I)=1 AND VERB$=TMP$ THEN GOTO 6449
6448 NEXT I:RETURN
6449 INV(I)=0:LOCITEMX(I)=LOCX:LOCITEMY(I)=LOCY:ITEMINLOC(I)=ITEMINLOC(I)+1
6450 PRINT "Zostawiles ";:PRINT TMP$
6451 RETURN
}
end ;
procedure enter;
begin
{
220 OLDX=LOCX:OLDY=LOCY
221 IF LOCX=10 AND LOCY=3 AND INCAVE=1 THEN LOCX=8:LOCY=3:PRINT "Wyszedles z jaskini."
222 IF LOCX=8 AND LOCY=3 AND JASKINIA=0 AND INCAVE=0 THEN LOCX=10:LOCY=3:PRINT "Wszedles do jaskini"
223 IF (LOCX=10 OR LOCX=8) AND LOCY=3 THEN IF INCAVE=0 THEN INCAVE=1:GOTO 229
224 IF (LOCX=10 OR LOCX=8) AND LOCY=3 THEN IF INCAVE=1 THEN INCAVE=0
225 IF LOCX=9 AND LOCY=4 THEN LOCY=6:PRINT "Wszedles do labiryntu.":GOTO 229
226 IF LOCX=9 AND LOCY=6 THEN LOCY=4:PRINT "Wszedles do jaskini.":GOTO 229
229 RETURN
}
end ;
procedure move_hero;
begin
{
COLOR 0:PLOT OLDX*4+2,OLDY*4+2:COLOR 1:PLOT LOCX*4+2,LOCY*4+2
}
end ;
begin
N_: = 'POLNOC' ; S_: = 'POLUDNIE' ; E_: = 'WSCHOD' ; W_: = 'ZACHOD' ;
C_: = 'CO ROBISZ ' ;
LOCX: = 6 ; LOCY: = 3 ;
FOR I: = 1 TO MAXITEMS DO INV[ I] : = 0 ;
repeat
VERB_: = 'KONIEC' ;
clrscr;
writeln ( 'QUEST ver. beta 04.01' ) ; writeln ;
writeln ( 'AUTOR: SMAKU NOV.18.2015' ) ; writeln ;
writeln ( 'SLOWNIK: N,S,E,W,LOOK,GET,DROP,INV, MAP,EXIT,OPEN,ENTER' ) ; writeln ;
writeln ( 'ZADANIE:' ) ; writeln ;
writeln ( 'Zostaw kamien w odpowiednim miejscu jaskini i z patykiem oraz sznurkiem znajdz wyjscie z lasu. Wejscie do labiryntu podziemnego znajduje sie w jaskini.' ) ; writeln ;
writeln ( 'GRAJ - rozpoczecie gry.' ) ;
writeln ( 'KONIEC - wyjscie z gry.' ) ; writeln ;
write ( 'Co robisz ?' ) ; readln ( VERB_) ;
VERB_: = 'KONIEC' ;
until ( VERB_= 'GRAJ' ) or ( VERB_= 'KONIEC' ) ;
IF VERB_= 'GRAJ' then
{ POCZATEK GRY}
begin
FOR I: = 1 TO MAXITEMS do ITEMINLOC[ I] : = 0 ;
ITEMINLOC[ 5 ] : = 1 ; LOCITEMX[ 5 ] : = 2 ; LOCITEMY[ 5 ] : = 14 ;
ITEMINLOC[ 3 ] : = 1 ; LOCITEMX[ 3 ] : = 8 ; LOCITEMY[ 3 ] : = 3 ; ITEMINLOC[ 1 ] : = 1 ; LOCITEMX[ 1 ] : = 9 ; LOCITEMY[ 1 ] : = 2 ;
LOCN: = 1 ; LOCS: = 1 ; LOCE: = 1 ; LOCW: = 1 ; JASKINIA: = 1 ; MAPVISIBLE: = 0 ; INCAVE: = 0 ; ITEMHERE: = 0 ;
FOR I: = 1 TO MAXITEMS do INV[ I] : = 0 ; INV[ 2 ] : = 1 ; INV[ 4 ] : = 1 ;
IF VERB_= 'EXIT' THEN writeln ; writeln ( 'KONIEC GRY. DZIEKUJEMY.' ) ; writeln ( 'Nacisnij RETURN>' ) ; readln ( VERB_) ; VERB_: = 'KONIEC' ;
IF VERB_= 'E' THEN IF LOCE= 0 THEN begin write ( 'Idziesz na wschod. ' ) ; OLDX: = LOCX; OLDY: = LOCY; LOCX: = LOCX+ 1 ; end ;
IF VERB_= 'N' THEN IF LOCN= 0 THEN begin write ( 'Idziesz na polnoc. ' ) ; OLDX: = LOCX; OLDY: = LOCY; LOCY: = LOCY- 1 ; end ;
IF VERB_= 'W' THEN IF LOCW= 0 THEN begin write ( 'Idziesz na zachod. ' ) ; OLDX: = LOCX; OLDY: = LOCY; LOCX: = LOCX- 1 ; end ;
IF VERB_= 'S' THEN IF LOCS= 0 THEN begin write ( 'Idziesz na poludnie. ' ) ; OLDX: = LOCX; OLDY: = LOCY; LOCY: = LOCY+ 1 ; end ;
IF VERB_= 'MAP' THEN show_map;
IF VERB_= 'LOOK' THEN look;
IF VERB_= 'OPEN' THEN open;
IF VERB_= 'INV' THEN show_inv;
ITEMHERE: = 0 ;
FOR I: = 1 TO MAXITEMS do IF ( ITEMINLOC[ I] = 1 ) AND ( LOCITEMX[ I] = LOCX) AND ( LOCITEMY[ I] = LOCY) THEN ITEMHERE: = 1 ;
IF ITEMHERE= 1 THEN write ( 'Tu cos jest. ' ) ; ITEMHERE: = 0 ;
IF VERB_= 'GET' THEN get ;
IF VERB_= 'DROP' THEN drop;
IF VERB_= 'ENTER' THEN enter;
IF ( LOCX= 2 ) AND ( LOCY= 4 ) AND ( end_check) then begin VERB_: = 'KONIEC' ; writeln ; writeln ( 'WYSZEDLES Z LASU. GRATULACJE.' ) ; writeln ( 'Nacisnij <RETURN>' ) ; readln ( VERB_) ; end ;
IF MAPVISIBLE= 1 THEN move_hero;
{
w basic:
itemhere=0 *80-90) usunąc powtórzenie
zmienna LOCWY - poprawić
98 GRAPHICS 6:COLOR 2
99 RESTORE 6300:READ PLACE$:RESTORE 6504:READ INV$
100 PRINT :PRINT C$;:INPUT VERB$:PRINT :FOR I=1 TO MAXITEMS:IF ITEMINLOC(I)=1 THEN INTEMHERE=1:NEXT I
101 RESTORE 6530+LOCY-2:FOR I=1 TO LOCX:READ LOC:NEXT I:LOCN=LOC
102 RESTORE 6530+LOCY-1:FOR I=1 TO LOCX-1:READ LOC:NEXT I:LOCW=LOC
103 READ LOC:READ LOC:LOCE=LOC
104 RESTORE 6530+LOCY:FOR I=1 TO LOCX:READ LOC:NEXT I:LOCS=LOC
109 RESTORE 6000:READ PLACE$:IF (LOCX=8) AND (LOCY=3) THEN RESTORE 6002:READ PLACE$
110 IF LOCX>8 THEN RESTORE 6004:READ PLACE$
111 IF LOCX=10 AND LOCY=3 THEN RESTORE 6003:READ PLACE$
210 RESTORE 6000:READ PLACE$:IF LOCX=8 AND LOCX=3 THEN RESTORE 6002:READ PLACE$
6501 DATA 20,80,100,50,20,20
6502 DATA 80,80,130,50,150,50
6503 DATA 40,4,150,30,150,30
}
end ;
{ KONIEC }
writeln ( 'Dziekujemy, do widzenia. Koniec gry. Zapraszamy ponownie.' ) ;
end .
cHJvZ3JhbSBQcnp5Z29kb3drYV9zemFibG9uOwp1c2VzIGNydDsKCmNvbnN0CgogTUFYSVRFTVM9NTsKIAogbWFwIDphcnJheSBbMS4uMTYsMS4uMTJdIG9mIGJ5dGUgPQogKCgxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSksCiAgKDEsMCwwLDAsMSwwLDEsMSwwLDAsMSwxKSwKICAoMSwwLDEsMCwwLDAsMCwwLDEsMCwxLDEpLAogICgxLDAsMSwwLDEsMCwxLDEsMCwwLDEsMSksCiAgKDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxKSwKICAoMSwwLDAsMSwxLDAsMCwxLDAsMCwwLDEpLAogICgxLDAsMSwwLDAsMSwwLDEsMCwwLDEsMSksCiAgKDEsMCwxLDAsMCwxLDAsMSwwLDAsMCwxKSwKICAoMSwxLDEsMCwwLDEsMCwxLDAsMCwxLDEpLAogICgxLDAsMCwxLDEsMCwwLDAsMCwwLDAsMSksCiAgKDEsMCwwLDEsMSwwLDAsMSwwLDAsMCwxKSwKICAoMSwwLDAsMCwwLDAsMCwxLDAsMCwxLDEpLAogICgxLDAsMCwxLDEsMCwwLDEsMCwwLDEsMSksCiAgKDEsMCwwLDEsMSwwLDAsMSwwLDAsMCwxKSwKICAoMSwwLDAsMSwwLDAsMCwxLDAsMCwwLDEpLAogICgxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSkpOwogCiAgcGxhY2VzXyA6YXJyYXlbMS4uNl0gb2Ygc3RyaW5nID0KICAoJ0plc3RlcyBuYSBsZXNuZWogc2NpZXpjZS4nLAogICAnTW96ZXN6IGlzYyBuYSA6JywKICAgJ1ByemVkIHRvYmEgamFza2luaWEuJywKICAgJ1ByemVkIHRvYmEgd3lqc2NpZSB6IGphc2tpbmkuJywKICAgJ0plc3RlcyB3IGNpZW1uZWogamFza2luaS4nLAogICAnSmVzdGVzIHcgcG9kemllbW55bSBsYWJpcnluY2llLicpOwogICAKICAKICBpdGVtcyA6YXJyYXkgWzEuLk1BWElURU1TXSBvZiBzdHJpbmcgPSAoJ0tBTUlFTicsJ1NaVFlMRVQnLCdQQVRZSycsJ0xJU0MnLCdTWk5VUkVLJyk7CiAgCiAgCnZhcgogICAgWCA6Ynl0ZTsgWTpieXRlOyBKQVNLSU5JQTogYnl0ZTsgTUFQVklTSUJMRSA6Ynl0ZTsgSU5DQVZFIDpieXRlOyBJVEVNSEVSRSA6Ynl0ZTsKICAgIElURU1JTkxPQyA6YXJyYXkgWzEuLk1BWElURU1TXSBvZiBieXRlOwogICAgTE9DSVRFTVggIDphcnJheVsxLi5NQVhJVEVNU10gb2YgYnl0ZTsKICAgIExPQ0lURU1ZICA6YXJyYXlbMS4uTUFYSVRFTVNdIG9mIGJ5dGU7IAogICAgUExBQ0VfICAgIDpzdHJpbmdbMjAwXTsgQ18gOnN0cmluZ1sxNV07CiAgICAKICAgIFZFUkJfIDpzdHJpbmc7IElOVl8gOnN0cmluZ1sxNV07IElOViA6YXJyYXlbMS4uTUFYSVRFTVNdIG9mIGJ5dGU7IExPQ1ggOmJ5dGU7IExPQ1kgOmJ5dGU7IFRNUF8gOnN0cmluZzsKICAgIExPQ04sIExPQ1MsIExPQ0UsIExPQ1csIE9MRFgsIE9MRFkgOmJ5dGU7CiAgICBOXywgU18sIEVfLCBXXyA6c3RyaW5nWzEwXTsKICAgIAogICAgbm91biA6c3RyaW5nWzE1XTsKICAgIGNtZCAgOnN0cmluZ1s1MF07CiAgICBpIDpieXRlOwogICAgCiAgICAKICAgIApwcm9jZWR1cmUgbG9vazsKYmVnaW4KezY0NTIgSUYgTE9DWT41IFRIRU4gUkVTVE9SRSA2MDA1OlJFQUQgUExBQ0UkCjY0NTMgUFJJTlQgOlBSSU5UIFBMQUNFJDs6UFJJTlQgIiAiOzpJVEVNSEVSRT0wCjY0NTQgRk9SIEk9MSBUTyBNQVhJVEVNUzpJRiBJVEVNSU5MT0MoSSk9MSBBTkQgTE9DSVRFTVgoSSk9TE9DWCBBTkQgTE9DSVRFTVkoSSk9TE9DWSBUSEVOIElURU1IRVJFPTEKNjQ1NSBORVhUIEk6SUYgSVRFTUhFUkU9MSBUSEVOIFBSSU5UICJUdSBsZXp5ICI7CjY0NTYgUkVTVE9SRSA2NTA0OkZPUiBJPTEgVE8gTUFYSVRFTVM6UkVBRCBWRVJCJAo2NDU3IElGIElURU1JTkxPQyhJKT0xIEFORCBMT0NJVEVNWChJKT1MT0NYIEFORCBMT0NJVEVNWShJKT1MT0NZIFRIRU4gUFJJTlQgVkVSQiQ7OlBSSU5UICIgIjsKNjQ1OCBORVhUIEk6UFJJTlQgOlBSSU5UICJOQUNJU05JSiA8UkVUVVJOPiI7OklOUFVUIFZFUkIkOlBSSU5UIAo2NDU5IElURU1IRVJFPTA6UkVUVVJOIAp9CgplbmQ7CgoKcHJvY2VkdXJlIG9wZW47CmJlZ2luCnsKMjA0IElGIChKQVNLSU5JQT0xKSBBTkQgKExPQ1g9OCkgQU5EIChMT0NZPTMpIFRIRU4gUFJJTlQgIkphc2tpbmlhIGplc3Qgb3R3YXJ0YS4iOkpBU0tJTklBPTAKMjA1IElGIEpBU0tJTklBPTEgVEhFTiBQUklOVCAiTmllIG1vemVzeiB0dSBuaWMgb3R3b3J6eWMuIjpQUklOVCAiTmFjaXNuaWogPFJFVFVSTj4iOklOUFVUIFZFUkIkCjIwNyBSRVRVUk4gCn0KZW5kOwoKCnByb2NlZHVyZSBzaG93X2ludjsKYmVnaW4KewoxMDAwIFBSSU5UIDpQUklOVCAiUG9zaWFkYXN6OiAiOlJFU1RPUkUgNjUwNDpGT1IgST0xIFRPIE1BWElURU1TOlJFQUQgSU5WJAoxMDAxIElGIElOVihJKT4wIFRIRU4gUFJJTlQgSU5WJDs6SU5QVVQgVkVSQiQKMTAwMiBORVhUIEk6UkVUVVJOIAp9CmVuZDsKCgpwcm9jZWR1cmUgc2hvd19tYXA7CmJlZ2luCnsKMTk4IFJFU1RPUkUgNjUzMDpYPTU6SUYgTE9DWT41IFRIRU4gWD0xNgoyMDAgRk9SIEk9MSBUTyBYOkZPUiBKPTEgVE8gMTI6UkVBRCBDOkNPTE9SIEM6Rk9SIFg9MSBUTyA0OlBMT1QgSio0LEkqNCtYOkRSQVdUTyAoSis0KSo0LEkqNCtYCjIwMSBQTE9UIEoqNCxJKjQrNDpEUkFXVE8gSio0KzQsSSo0KzQ6TkVYVCBYOk5FWFQgSjpORVhUIEkKMjAyIENPTE9SIDI6UExPVCBMT0NYKjQrMixMT0NZKjQrMjpPTERYPUxPQ1g6T0xEWT1ZOk1BUFZJU0lCTEU9MQoyMDMgUkVUVVJOIAp9CmVuZDsKCgoKZnVuY3Rpb24gZW5kX2NoZWNrIDpib29sZWFuOwpiZWdpbgoKZW5kX2NoZWNrOj1mYWxzZTsKCklGIChJTlZbM109MSkgQU5EIChMT0NJVEVNWFsxXT0xMCkgQU5EIChMT0NJVEVNWVsxXT00KSBBTkQgKElOVls1XT0xKSBUSEVOIGVuZF9jaGVjazo9dHJ1ZTsKCmVuZDsKCgpwcm9jZWR1cmUgZ2V0OwpiZWdpbgp7CjY0NDAgUFJJTlQgIkNvIGJpZXJ6ZXN6ICI7OklOUFVUIFRNUCQKNjQ0MSBSRVNUT1JFIDY1MDQ6Rk9SIEk9MSBUTyBNQVhJVEVNUzpSRUFEIFZFUkIkCjY0NDIgSUYgTE9DWD1MT0NJVEVNWChJKSBBTkQgTE9DWT1MT0NJVEVNWShJKSBBTkQgVkVSQiQ9VE1QJCBUSEVOIElOVihJKT0xOkxPQ0lURU1YKEkpPS0xOkxPQ0lURU1ZKEkpPTAKNjQ0MyBJRiBMT0NJVEVNWChJKT0tMSBUSEVOIElURU1JTkxPQyhJKT1JVEVNSU5MT0MoSSktMTpJVEVNSEVSRT0zOkxPQ0lURU1YKEkpPTAKNjQ0NCBORVhUIEk6SUYgSVRFTUhFUkU9MyBUSEVOIFBSSU5UIDpQUklOVCAiV3ppYWxlcyAiOzpQUklOVCBUTVAkCjY0NDUgSVRFTUhFUkU9MDpSRVRVUk4gCn0KZW5kOwoKCnByb2NlZHVyZSBkcm9wOwpiZWdpbgoKewo2NDQ2IFBSSU5UICJDbyBjaGNlc3ogem9zdGF3aWMgIjs6SU5QVVQgVE1QJDpSRVNUT1JFIDY1MDQ6Rk9SIEk9MSBUTyBNQVhJVEVNUzpSRUFEIFZFUkIkCjY0NDcgSUYgSU5WKEkpPTEgQU5EIFZFUkIkPVRNUCQgVEhFTiBHT1RPIDY0NDkKNjQ0OCBORVhUIEk6UkVUVVJOIAo2NDQ5IElOVihJKT0wOkxPQ0lURU1YKEkpPUxPQ1g6TE9DSVRFTVkoSSk9TE9DWTpJVEVNSU5MT0MoSSk9SVRFTUlOTE9DKEkpKzEKNjQ1MCBQUklOVCAiWm9zdGF3aWxlcyAiOzpQUklOVCBUTVAkCjY0NTEgUkVUVVJOIAp9CmVuZDsKCgpwcm9jZWR1cmUgZW50ZXI7CmJlZ2luCgp7CgoyMjAgT0xEWD1MT0NYOk9MRFk9TE9DWQoyMjEgSUYgTE9DWD0xMCBBTkQgTE9DWT0zIEFORCBJTkNBVkU9MSBUSEVOIExPQ1g9ODpMT0NZPTM6UFJJTlQgIld5c3plZGxlcyB6IGphc2tpbmkuIgoyMjIgSUYgTE9DWD04IEFORCBMT0NZPTMgQU5EIEpBU0tJTklBPTAgQU5EIElOQ0FWRT0wIFRIRU4gTE9DWD0xMDpMT0NZPTM6UFJJTlQgIldzemVkbGVzIGRvIGphc2tpbmkiCjIyMyBJRiAoTE9DWD0xMCBPUiBMT0NYPTgpIEFORCBMT0NZPTMgVEhFTiBJRiBJTkNBVkU9MCBUSEVOIElOQ0FWRT0xOkdPVE8gMjI5CjIyNCBJRiAoTE9DWD0xMCBPUiBMT0NYPTgpIEFORCBMT0NZPTMgVEhFTiBJRiBJTkNBVkU9MSBUSEVOIElOQ0FWRT0wCjIyNSBJRiBMT0NYPTkgQU5EIExPQ1k9NCBUSEVOIExPQ1k9NjpQUklOVCAiV3N6ZWRsZXMgZG8gbGFiaXJ5bnR1LiI6R09UTyAyMjkKMjI2IElGIExPQ1g9OSBBTkQgTE9DWT02IFRIRU4gTE9DWT00OlBSSU5UICJXc3plZGxlcyBkbyBqYXNraW5pLiI6R09UTyAyMjkKMjI5IFJFVFVSTiAKfQoKZW5kOwoKCgpwcm9jZWR1cmUgbW92ZV9oZXJvOwpiZWdpbgp7CkNPTE9SIDA6UExPVCBPTERYKjQrMixPTERZKjQrMjpDT0xPUiAxOlBMT1QgTE9DWCo0KzIsTE9DWSo0KzIKfQplbmQ7CgpiZWdpbgoJCgpOXzo9J1BPTE5PQyc7IFNfOj0nUE9MVUROSUUnOyBFXzo9J1dTQ0hPRCc7IFdfOj0nWkFDSE9EJzsKQ186PSdDTyBST0JJU1ogJzsKTE9DWDo9NjtMT0NZOj0zOwoKRk9SIEk6PTEgVE8gTUFYSVRFTVMgRE8gSU5WW0ldOj0wOwoKCnJlcGVhdAogIAogIFZFUkJfOj0nS09OSUVDJzsKICAKICBjbHJzY3I7CgogIHdyaXRlbG4oJ1FVRVNUIHZlci4gYmV0YSAwNC4wMScpOyB3cml0ZWxuOwoKICB3cml0ZWxuKCdBVVRPUjogU01BS1UgTk9WLjE4LjIwMTUnKTsgd3JpdGVsbjsKCiAgd3JpdGVsbignU0xPV05JSzogTixTLEUsVyxMT09LLEdFVCxEUk9QLElOViwgTUFQLEVYSVQsT1BFTixFTlRFUicpOyB3cml0ZWxuOwoKICB3cml0ZWxuKCdaQURBTklFOicpOyB3cml0ZWxuOwoKICB3cml0ZWxuKCdab3N0YXcga2FtaWVuIHcgb2Rwb3dpZWRuaW0gbWllanNjdSBqYXNraW5pIGkgeiBwYXR5a2llbSBvcmF6IHN6bnVya2llbSB6bmFqZHogd3lqc2NpZSB6IGxhc3UuIFdlanNjaWUgZG8gbGFiaXJ5bnR1IHBvZHppZW1uZWdvIHpuYWpkdWplIHNpZSB3IGphc2tpbmkuJyk7IHdyaXRlbG47CgogIHdyaXRlbG4oJ0dSQUogICAgLSByb3pwb2N6ZWNpZSBncnkuJyk7CiAgd3JpdGVsbignS09OSUVDICAtIHd5anNjaWUgeiBncnkuJyk7IHdyaXRlbG47CgogIHdyaXRlKCdDbyByb2Jpc3ogPycpOyByZWFkbG4oVkVSQl8pOwogIAogIFZFUkJfOj0nS09OSUVDJzsKICAKdW50aWwgKFZFUkJfPSdHUkFKJykgb3IgKFZFUkJfPSdLT05JRUMnKTsKCklGIFZFUkJfPSdHUkFKJyB0aGVuCiB7IFBPQ1pBVEVLIEdSWX0KICBiZWdpbgoKCUZPUiBJOj0xIFRPIE1BWElURU1TIGRvIElURU1JTkxPQ1tJXTo9MDsKCglJVEVNSU5MT0NbNV06PTE7IExPQ0lURU1YWzVdOj0yOyBMT0NJVEVNWVs1XTo9MTQ7CgoJSVRFTUlOTE9DWzNdOj0xOyBMT0NJVEVNWFszXTo9ODsgTE9DSVRFTVlbM106PTM7SVRFTUlOTE9DWzFdOj0xO0xPQ0lURU1YWzFdOj05O0xPQ0lURU1ZWzFdOj0yOwoKCUxPQ046PTE7TE9DUzo9MTtMT0NFOj0xO0xPQ1c6PTE7SkFTS0lOSUE6PTE7TUFQVklTSUJMRTo9MDtJTkNBVkU6PTA7SVRFTUhFUkU6PTA7CgoJRk9SIEk6PTEgVE8gTUFYSVRFTVMgZG8gSU5WW0ldOj0wOyBJTlZbMl06PTE7SU5WWzRdOj0xOwoKCgoKSUYgVkVSQl89J0VYSVQnIFRIRU4gd3JpdGVsbjsgd3JpdGVsbignS09OSUVDIEdSWS4gRFpJRUtVSkVNWS4nKTsgd3JpdGVsbignTmFjaXNuaWogUkVUVVJOPicpOyByZWFkbG4oVkVSQl8pOyBWRVJCXzo9J0tPTklFQyc7CgoKSUYgVkVSQl89J0UnIFRIRU4gSUYgTE9DRT0wIFRIRU4gYmVnaW4gd3JpdGUoJ0lkemllc3ogbmEgd3NjaG9kLiAnKTtPTERYOj1MT0NYO09MRFk6PUxPQ1k7TE9DWDo9TE9DWCsxOyBlbmQ7CklGIFZFUkJfPSdOJyBUSEVOIElGIExPQ049MCBUSEVOIGJlZ2luIHdyaXRlKCdJZHppZXN6IG5hIHBvbG5vYy4gJyk7T0xEWDo9TE9DWDtPTERZOj1MT0NZO0xPQ1k6PUxPQ1ktMTsgZW5kOwpJRiBWRVJCXz0nVycgVEhFTiBJRiBMT0NXPTAgVEhFTiBiZWdpbiB3cml0ZSgnSWR6aWVzeiBuYSB6YWNob2QuICcpO09MRFg6PUxPQ1g7T0xEWTo9TE9DWTtMT0NYOj1MT0NYLTE7IGVuZDsKSUYgVkVSQl89J1MnIFRIRU4gSUYgTE9DUz0wIFRIRU4gYmVnaW4gd3JpdGUoJ0lkemllc3ogbmEgcG9sdWRuaWUuICcpOyBPTERYOj1MT0NYOyBPTERZOj1MT0NZOyBMT0NZOj1MT0NZKzE7IGVuZDsKCgpJRiBWRVJCXz0nTUFQJyBUSEVOIHNob3dfbWFwOwpJRiBWRVJCXz0nTE9PSycgVEhFTiBsb29rOwpJRiBWRVJCXz0nT1BFTicgVEhFTiBvcGVuOwpJRiBWRVJCXz0nSU5WJyBUSEVOIHNob3dfaW52OwoKSVRFTUhFUkU6PTA7CkZPUiBJOj0xIFRPIE1BWElURU1TIGRvIElGIChJVEVNSU5MT0NbSV09MSkgQU5EIChMT0NJVEVNWFtJXT1MT0NYKSBBTkQgKExPQ0lURU1ZW0ldPUxPQ1kpIFRIRU4gSVRFTUhFUkU6PTE7CgoKSUYgSVRFTUhFUkU9MSBUSEVOIHdyaXRlKCdUdSBjb3MgamVzdC4gJyk7IElURU1IRVJFOj0wOwoKSUYgVkVSQl89J0dFVCcgVEhFTiBnZXQ7CklGIFZFUkJfPSdEUk9QJyBUSEVOIGRyb3A7CklGIFZFUkJfPSdFTlRFUicgVEhFTiBlbnRlcjsKCgpJRiAoTE9DWD0yKSBBTkQgKExPQ1k9NCkgQU5EIChlbmRfY2hlY2spIHRoZW4gYmVnaW4gVkVSQl86PSdLT05JRUMnOyB3cml0ZWxuOyB3cml0ZWxuKCdXWVNaRURMRVMgWiBMQVNVLiBHUkFUVUxBQ0pFLicpO3dyaXRlbG4oJ05hY2lzbmlqIDxSRVRVUk4+Jyk7cmVhZGxuKFZFUkJfKTsgZW5kOwoKSUYgTUFQVklTSUJMRT0xIFRIRU4gbW92ZV9oZXJvOwoKCnsKdyBiYXNpYzoKCml0ZW1oZXJlPTAgKjgwLTkwKSB1c3VuxIVjIHBvd3TDs3J6ZW5pZQoKem1pZW5uYSBMT0NXWSAtIHBvcHJhd2nEhwoKCgo5OCBHUkFQSElDUyA2OkNPTE9SIDIKOTkgUkVTVE9SRSA2MzAwOlJFQUQgUExBQ0UkOlJFU1RPUkUgNjUwNDpSRUFEIElOViQKCjEwMCBQUklOVCA6UFJJTlQgQyQ7OklOUFVUIFZFUkIkOlBSSU5UIDpGT1IgST0xIFRPIE1BWElURU1TOklGIElURU1JTkxPQyhJKT0xIFRIRU4gSU5URU1IRVJFPTE6TkVYVCBJCgoxMDEgUkVTVE9SRSA2NTMwK0xPQ1ktMjpGT1IgST0xIFRPIExPQ1g6UkVBRCBMT0M6TkVYVCBJOkxPQ049TE9DCjEwMiBSRVNUT1JFIDY1MzArTE9DWS0xOkZPUiBJPTEgVE8gTE9DWC0xOlJFQUQgTE9DOk5FWFQgSTpMT0NXPUxPQwoxMDMgUkVBRCBMT0M6UkVBRCBMT0M6TE9DRT1MT0MKMTA0IFJFU1RPUkUgNjUzMCtMT0NZOkZPUiBJPTEgVE8gTE9DWDpSRUFEIExPQzpORVhUIEk6TE9DUz1MT0MKCgoKMTA5IFJFU1RPUkUgNjAwMDpSRUFEIFBMQUNFJDpJRiAoTE9DWD04KSBBTkQgKExPQ1k9MykgVEhFTiBSRVNUT1JFIDYwMDI6UkVBRCBQTEFDRSQKMTEwIElGIExPQ1g+OCBUSEVOIFJFU1RPUkUgNjAwNDpSRUFEIFBMQUNFJAoxMTEgSUYgTE9DWD0xMCBBTkQgTE9DWT0zIFRIRU4gUkVTVE9SRSA2MDAzOlJFQUQgUExBQ0UkCgoKCgoyMTAgUkVTVE9SRSA2MDAwOlJFQUQgUExBQ0UkOklGIExPQ1g9OCBBTkQgTE9DWD0zIFRIRU4gUkVTVE9SRSA2MDAyOlJFQUQgUExBQ0UkCgoKCgo2NTAxIERBVEEgMjAsODAsMTAwLDUwLDIwLDIwCjY1MDIgREFUQSA4MCw4MCwxMzAsNTAsMTUwLDUwCjY1MDMgREFUQSA0MCw0LDE1MCwzMCwxNTAsMzAKCn0KCgogZW5kOwogCgl7IEtPTklFQyB9CgkKCXdyaXRlbG4oJ0R6aWVrdWplbXksIGRvIHdpZHplbmlhLiBLb25pZWMgZ3J5LiBaYXByYXN6YW15IHBvbm93bmllLicpOwoJCmVuZC4=