I have written a BlackBox module that takes the "Dates.txt" file (see my previous post), and
corrects all the file date stamps in a given version of BlackBox (eg build #741) to reflect when that file was last modified. See below:
There is probably a 1 line Unix command that does this!
The Docu file (in the pac coding below) gives detailed instructions to do all this.
I would like this "FileDates.txt" file to be routinely produced by the build engine (if this is possible), and made available, maybe in the same place as the "buildlog.html" file.
I am thinking of putting these detailed instructions about how to correct the file datestamps on a Wiki page.
Code: Select all
MODULE RdcTimeStamp; (* Author : Robert D Campbell *)
(* Stamp : *)
(* StdLog *)
IMPORT
Dates, Dialog, Files, HostFiles, Strings, Api := WinApi, StdLog, SYSTEM;
CONST
dates = "FileDates.txt";
TYPE
Str48 = ARRAY 48 OF CHAR;
Str64 = ARRAY 64 OF CHAR;
Str128 = ARRAY 128 OF CHAR;
Dlg = RECORD
path*, name- : Str48;
update* : BOOLEAN
END;
VAR
dlg* : Dlg;
PROCEDURE FileSetDateTime (IN fullName : ARRAY OF CHAR;
IN date : Dates.Date; IN time : Dates.Time) : BOOLEAN;
VAR
fi : Api.HANDLE;
sysTime : Api.SYSTEMTIME;
fiTime : Api.FILETIME;
BEGIN
sysTime.wYear := SHORT (date.year);
sysTime.wMonth := SHORT (date.month);
sysTime.wDay := SHORT (date.day); sysTime.wDayOfWeek := 0;
sysTime.wHour := SHORT (time.hour);
sysTime.wMinute := SHORT (time.minute);
sysTime.wSecond := SHORT (time.second); sysTime.wMilliseconds := 0;
ASSERT (Api.SystemTimeToFileTime (sysTime, fiTime) # Api.FALSE, 20);
fi := Api.CreateFileW (fullName, Api.FILE_WRITE_ATTRIBUTES,
Api.FILE_SHARE_WRITE, NIL, Api.OPEN_EXISTING, {}, 0);
RETURN (Api.SetFileTime (fi, NIL, NIL, fiTime) # Api.FALSE)
& (Api.CloseHandle (fi) # Api.FALSE)
END FileSetDateTime;
PROCEDURE ExtractInt (IN str : ARRAY OF CHAR; beg : INTEGER) : INTEGER;
VAR
n : INTEGER; (* TRAPs on overflow *)
chr : CHAR;
neg : BOOLEAN;
BEGIN
WHILE str [beg] = ' ' DO INC (beg) END;
neg := FALSE;
CASE str [beg] OF
'+' : INC (beg)
| '-', '−' : INC (beg); neg := TRUE (* Ascii or Unicode *)
ELSE
END;
n := 0; chr := str [beg];
WHILE ('0' <= chr) & (chr <= '9') DO
ASSERT (n <= 214748364, 30);
n := 10 * n + ORD (chr) - ORD ('0');
ASSERT ((n >= 0) OR ((n = MIN (INTEGER)) & neg), 31);
INC (beg); chr := str [beg]
END;
IF neg THEN n := -n END;
RETURN n
END ExtractInt;
PROCEDURE OffsetTime (offsetQ : INTEGER; VAR date : Dates.Date; VAR time : Dates.Time);
VAR
dd : INTEGER;
BEGIN
IF offsetQ = 0 THEN RETURN END;
ASSERT (ABS (offsetQ) <= 47, 20);
INC (time.minute, 15 * (offsetQ MOD 4));
INC (time.hour, ASH (offsetQ, -2));
IF time.minute >= 60 THEN DEC (time.minute, 60); INC (time.hour) END;
IF time.hour < 0 THEN dd := -1; INC (time.hour, 24);
ELSIF time.hour >= 24 THEN dd := 1; DEC (time.hour, 24);
ELSE dd := 0 END;
IF dd # 0 THEN Dates.DayToDate (Dates.Day (date) + dd, date) END
END OffsetTime;
PROCEDURE ReadLine (rd : Files.Reader; OUT str : ARRAY OF CHAR);
(* Censors characters below ASCII 32 (space) *)
(* Uses <lf>, <cr>, or <cr, lf> as end of line marker *)
(* <lf, cr> counts as two end of line markers *)
CONST
lf = 0AX;
cr = 0DX;
VAR
k : INTEGER;
chr : SHORTCHAR;
BEGIN
ASSERT (~rd.eof, 20);
k := 0;
LOOP
rd.ReadByte (SYSTEM.VAL (BYTE, chr));
IF chr = cr THEN
rd.ReadByte (SYSTEM.VAL (BYTE, chr));
IF chr # lf THEN rd.SetPos (rd.Pos () - 1) END;
EXIT
END;
IF (chr = lf) OR rd.eof THEN EXIT END;
IF chr >= ' ' THEN str [k] := chr; INC (k) END
END;
str [k] := 0X
END ReadLine;
PROCEDURE Read (loc : Files.Locator; IN name : Files.Name);
VAR
rd : Files.Reader;
str : Str128;
txt : Str64;
n, utc : INTEGER;
date : Dates.Date;
time : Dates.Time;
BEGIN
rd := Files.dir.Old (loc, name, Files.shared).NewReader (NIL);
n := 0;
WHILE ~rd.eof DO
ReadLine (rd, str);
IF str [0] # 0X THEN
date.year := ExtractInt (str, 0);
date.month := ExtractInt (str, 5);
date.day := ExtractInt (str, 8);
time.hour := ExtractInt (str, 11);
time.minute := ExtractInt (str, 14);
time.second := ExtractInt (str, 17);
utc := ExtractInt (str, 20);
ASSERT (utc MOD 100 = 0, 55);
OffsetTime (-utc DIV 25, date, time);
Strings.Extract (str, 26, 999, str);
StdLog.IntForm (n, StdLog.decimal, 5, ' ', FALSE);
Dates.DateToString (date, Dates.abbreviated, txt);
StdLog.String (' | ' + txt + ' @ ');
Dates.TimeToString (time, txt);
StdLog.String (txt + ' |');
StdLog.IntForm (utc, StdLog.decimal, 6, ' ', FALSE);
StdLog.String (' | ' + str);
INC (n);
IF dlg.update THEN
str := dlg.path + '/' + str;
IF ~FileSetDateTime (str, date, time) THEN
StdLog.String(' Not found')
END
END;
StdLog.Ln
END
END
END Read;
PROCEDURE Look*;
VAR
loc : Files.Locator;
name : Files.Name;
BEGIN
loc := Files.dir.This (dlg.path);
Dialog.GetIntSpec ('txt', loc, name);
IF loc # NIL THEN
dlg.path := loc(HostFiles.Locator).path$;
dlg.name := name$;
Dialog.Update (dlg);
Read (loc, name)
END
END Look;
BEGIN
dlg.path := Files.dir.This ('')(HostFiles.Locator).path$;
dlg.name := dates
END RdcTimeStamp.
Code: Select all
PacCoder.Decode /.:G....PEo..1oQ........F..u.0w.EU/g.42.Mk/f.26.Pk/s.3k.IU/Y
.4:.9k/2.4w.Mk/p.0w.J./d.4o.NE/H.5E.ME/h.5..9U/j.4E.Mk....4:1OC5NYbG.HhBMaQV
m67wPu.UyEKS:h:MCcBc:cBkCV5:VQFHyFY80klbrW.0Y61J6L0xjNZ11EoZB1Z.03Pym5Ro1VHz
/8Q5tD1u3vqyBH8.M4mUL0Dz.4E5Ps1m0aETLs8mERiC96akVm/gEVr4zvVItcEeI66:UFFSKmMU
UwY.7vmE:G.S4Xa/8ao3evhPxeo3Gx/sEEoFFB:qW1aXKEMhcUqFDTc.ENIbOV3aj/d6x/:QV.go
46G224UMXwVo.Pu11o5rE5CIu.TuhOgNa.4Mrj.8UcEaO0gW6Cikf73.fekV786JbOwEkXkU2/wP
k5Qca.W186/jE76ZsycMMaw.v/21LY6u6MlO6G470kgqPztb6V.W7n4gcb.WFZMROGEcaY5iFyEj
OINYDTG15RrEpZqrZRkkvclxr5niLrR0IRlEd6S:t3Lnm3ri4LR10DQzl0BfjoSW0MsEkEF4CH2Q
7caG8YiYKCXWM/CCBRzHoU9GzXMkYM3VgQG/6oQE6GvY7m:H/kJ/DzrOkOXUxfOssngoQ86sHllG
xfcsLc6/PY/U1fyvG88lEssK7X8HdOC3DUkn8z00noxUMccs5ScCSC0rwXUFrgMWqFmdrp5.LsnB
/YQ4gKV6MJEyYZVrXew3QHImDw4lVMRaJfgO8Qq6yVm3gMy:.gRjMbsGMHP4MUYcwXY2U1rKWFtN
pqciP62dKl6pRWIW9xgOchhm2Jq:jQzvMm2B1ykTjja1Mvq0v05M6zMH8SykboFd:Sq7krCkGQoJ
k7gDMoisPME/hijq0mkDNq.XwmFq/ywYBCk2yl2hPJg1FbuqxVTr7skq9LxURRWCIqjyT0qQo52J
a16TMHZcf2Dq/tq7.rff:BnSk0v2Xv2L:81RVQ9XBhRq.qbgFPVgR1xjFq1pibfRcN4/qsEyMNn1
v0mE5O/ivKdTnwktlaDHCfESkm:eRcB/RFZqCIxvPEVJtJ7GlrNo53rRcYFVQkpn3THiXh0k5sG/
JgV:C:8vEt6IkqykWRa.oEkqMCrw45/vKVPVcRyhbn/3/UcHzy6KfgnxKuVeu9KdTHdZvxgWehFM
MkPRR2JRW8vICHw:D3W:8DHniFERtYuaOFQkyPSjV1XtbULdmZdagv7e9igmofzXtqhiDqeOdWzo
vrQnB5EP3X7Vx2S5zE:PJZYYBwhy80zceXnqXOCKHYjOgIyL5Tcbn6PaTebkOVGgpFuq1ZKeLrin
9FNebOw9WTtKtTbNH8bQuQqs22jgyzZ6Em1guCJ1pzbH8CGBeBZ4YzUSVCea2QV9lexGDjpuzg5g
WQXrI/XRicmvUW79.sXS7nnJhldjgGKqgQR7w/EMs08STTL29iSnuhBcxphNQp/enTkq/ByctyX/
oGruyZb6Kw494F7Nt2zlBcn87lgCPqpnozy.bY9IYSe7mwI:rtwwmvYYDr5VwwDwznXvIKzCVDbX
NHwuuWwnbwnh80wUi9L:rE4SMDp7GKDzXG:.BKexpELyRafDvm2gGB2uY3yjSMx9EQ0YZc8RYYOf
Go7KDY1Cm/fSeT64DY1t9Vf7Ioh.gQOKVSN7O.B8VQKfMrl4E1j65JplReMC:onb7m/QzQGk7O51
qxZ7xlp0RThniwHmhPY0nkTJt.XZZXgkR3rc8KUPhrbqROfKSRpGFhO/4YBKhp:ywj4nSboov2nf
whI8tssmfTLO1Kg9a4uJO1qEVB/F1me2/ldJG83kbY/JXlT4XX6c8azh12Xe.hGvXf3Lprzgphlu
Ddy4PSNPYgvBT.xaq9Ih1IjfT2TPIgJ6kjzX6EO4dM60dd:pxLiQDTNqM1WqXPZWpHXMjD9uqirJ
G.:LxLy50K5eK6O/9iv3P1x6M1Ue8ypZrRXPvfhO5hZNvw2jUxQk9d5PrSGkQ8uhL012oaDGHSW.
QxZU7LoBr5Eova6/aq0cmzMU5/pel9f82NM5qKWNTOHm9Gv08E6FP:fkfzGSWakVGCPKe0Rckmui
I5iMdDqFuGXXMIZl5H/jZyKn42n91k.BTjSqyVTT7Ezzv:CjpFOLsw5WIzsZFN7:cKhJBlNblcBU
/pkvRD2VeOWw6Y0g6ecZ9VVu2jT8dtpb0iI8wKaujLktCJt8eMr1UhKrvz3.LpQ4Ze79Dc5:6DCQ
VH6.hLPDt/TGKPnwjZDr49cIJQFIJtJBguxLiR5JG2UBMTeox3nqdrgUzKM3Ng9BMOyP70rdNSBT
tCzhDDjvzEFu.GQv7Uf5mgPNrHFFx2jniFG.QSZIwQ:N7Fzq0hYn0smoQ3bKySE4P1PdLKv83Cn9
8zmnjnDSyjmI/ZNqJIC.FBYITS1stprda1lLXdcpxRUaUO.znHbDxWMFfHHc5CCcCHKjvoqqGIcM
T7Xr/UF9Omfy1ctwsmsK1tnTdRwbj35rCRKso/j5G5M1P3jhfUg.:ucgXnsYO6VrOLCGyP1ptnK1
lgMuB9CaNdv:v6BlmjfxhzoUBFkaww8PPpYOPTn70LCLNWhYqvwG7nZCwyHdgMyIzeTDNa46MBXe
22fdfxcdm/z45Q8bXa1toVPLVwtysxQldu1NGz2muqPWpcxhsl5Kl1knIMBq5s42SvChxpiL3x0Q
fyeMl4OCQjk6jdyfIbOXCtdllcxuXVsy:nctm4XYW3BmPHOUIGuaKfhLweCfEGpQtKZwLcfnd3pf
ODSB:4kZqVJLWjD.VwlsgqtFaECd/JPYS8Iqe:Yt3:h2XjnMFKzfa973HQmxu9ocKqQT2L4IkVa/
h6OWVXLBy/GfcQCu6FgRgl29SmRM6dLDpPtOrW2onbVttal5yJZdOeXp/yqd.SJcjftEX/F3VW4J
OPTkf7fFMr285RMlqinE5thR0kiqH:JfLEKbHLsQZPHoFZXRHXTSS1DUl/uwQJVyemOgn4NKTzaJ
DwbJh0SnYYPt9X9I6U67ySK0nDV8QMeTSH0Fro6eoxMM87U3nHhFMUYgMucrX5jn/lzqX3FQZPSD
0LNqMyvxyNoKJtQpt7chPGuQeoBet.XHRHlaGuCcKvpjY/VfDq/QHi2cxljrofGpQj5h4chGx3LF
BMPzguCMLe6BkmfLa4FN2wWim7y7wV23lHlhf1pkoyQsY9Icoyy7oUaHW1f1KvtgTmltcxqRgtxa
SoBRz/jWbxyCDIwXePn3qclf/Sf23/aYrVK/EXN0du6pJoxskzbEdRGTyNyKEGyxC::upZ.isd0K
T7KTMHd3/6sTZFKnpuuxLLkxhxCKy0tR15a/Q2QTT.XnequqgDysSh9Rvvj4SvxFEU0iBTsmuDea
qNWqNREpMuiYTR5YYBh:dtUlZ:DYgK2ISZnIXMWzz/UIaT6t4qG:VgUaSPDY6iNElMQjv:sqsUQD
lPV7LEmT5Q1BcFyr3BByqu7BySvRTIfK5UgjKfQOJKRJ6RzzQ51gh7vP95o8eWXM:QBNpCtXJ:wM
y8OdxRNlSeNwhvo866YKy7cgrZJb:vKx6GRjXFbwzUl3/V9Zl8lobL5iNQGMJ3CIPEjRT:7IemtD
OrpOzci4/N6S1zk.jDkOj4vxFqtnJ.JGioVmi0geyRo:muDBCZWr1KQy9PlxIhnzBNKTp1uol5hh
QTN7:52P.jlDy4zR22LoxWRQD8yfhzfvBjjNX2B8H2Z:xcP.xaNee5VZwXj.bal1/YD90Kzt24iC
9OFmNF5Dl4uiOeklgMv7h3z9hf63TacqtZP6jqb9UdHW0Ri2acEdt72.:3.qyrUnQBn49nC5Tj:j
ys:U.5jz:xxjxKG.tyLs4hC5ugprLXttjnS8UK/DS7PupMDXMuQzOCQ7JPyQFqN9FBVNv.83UNjn
rvebpOUSwOMUp1Dco.07gvm:dtYJbKhJTHLixmKONxP6OrRpf4wvJvmdS9qvPkipgKrq6ZjGsBs2
jkgTmWZ7i5UvmpB7aVgkbFHERdvajHyLzb3WsgzTtbkjmkI0:IwqHQk6MrdvIquH2zDLBV:rBrXj
hzEp9kMWyx0qyd4v3wOYcDTTid3v8L4azhSHLXoIGZXXhz:0Re3CfeiFZ4kKp8Im82KKehwJ8QmB
GYbCd7XK8z.P4f4Hy:XKISgyneXf/qy2bQvbz3sx6lycjyJtDvX8/oBQ:SUI6VMpQDO9XvvxzCPN
bwbssd/mDn56Ti/qRYu1a8zDtlmqrlS1aFXC4bfyZC7n4mo0MIjJlwfrSCxecyXet5yut8R1Bojr
iXvwS6oZf/YkTZWE/n6MU6jFybvPTR7OXj29B17spteqyyIHpfZc6PDqKLKGk3QwFli0jTIHrKKF
SniTvByPWJqxzYKrXlnVyD:pNwTy2ccntX9MkVz3HXNbXVTYlGRXXzsGHXHD37c2xq3zeysd7ChW
PWYk1Tdmg9BdbMd7fDx8Q74eSvSE:9oy/yGFIJCUWvZuMNSZ8zlGTCoH8VaUipBrqlGIJn9kXwBW
4QnB/hKlFiY.Pdy:DcMPdoTjNOR7tHqMQTfzzy/2.1c.9k/0.4k.ME/X.4g.EU/j.5U.L./G.4E.
Mk.j.2o.Pk/Y.0w.J./d.4o.NE/H.5E.ME/h.5..9U/j.4E.Mk....2zdsCKNYbG.QRTNwEVm67w
Pu.UyEKS:h:MCcBc:cBkCV5:VQFHyFY80klbrW.0Y61J6L0xjNZ11EoZB1Z.03Pym5Ro1VHz/8Q5
tD1u3vqyBH8.M4mUL0Dz.4E5Ps1mSiEhLs8mERiC96akVm/gEVr4zvVItcEeI66:UFFSKmMUUwY.
6koiez6.a961grrLwPy8ZzXkcVcWoONjo5B4fclPx/Y0Szw.UEdCt0945903a673/:IV.e6:EY66
B.lBt70.no450Q:6JGlMEDG6HNMyS2.Og68ko6HyUfEW1rfoo6l:EjeQV7:6SX:6GRqVD5nt7srf
y266FCdVekDX/TJh2iq0Ei/UGUKYRUna1KM/89/Xg5nvrOQizcYwPycC/3eSOrk14oYNGkCgd9Mh
/T8qdZ:z8HiIhib84dzzNEwmULL8M/qe3ZowcHNFvmVcfKI8JFZ9f8.fvL874XiM1XNF:ud:cX8y
K.v83vv8Hqf8:zPz8B0U1.H82tcO0OKpNZYrZ9581blZ2hChdNmUwjeh7FTLkbhT8cHoh9Hm1xTD
7GC7SMiH9mldRtKHm1fh6Pm5P2j7.XomjLrOcpfZlt/LReJ/oPinWayLYv.NvwyPhQEwZizMEBu:
zozhHVGCxgyll5bO3agVGdzgqpZvUxg7u3Y4f:oxew3XJlRVRV0m6gKkEgVbfv1hzP3tNE2TNvH8
tt9:hxbphkNE00.49qK.4EfU3zXp2/SSxYYLyppKBGxDxV7JalpRfgsXkPMlyZ4Tky.ogGDtvyBU
B8BvypxCXdMWKHGin9HGOJm9Sn7oexohK6a7oy4F0uKXypibjPMrGXezCi:uPGlzqi7dNpvK3od0
TyoRuIGpMeejzxR8pOz9dKP8vR8i9ahS5Gm9muKVy1Gm/WfRM992vK2rSDGVhK8QBNp2q5GmPWR8
jDfcZ54OK5jtOzCLdB9fTGizqXuJnuL1:Kbgwi7gQodaWtTG5EiznP9ZP6OKP:Kc4Z4:gnmpeSD0
lM7.MjQ/pqCqZ9rjOIBEOqlnGklWnq4l/B8q/:Fobqoen5muJzOCqsrM2:B843192pat93pik4oH
M2jpBIylCj8a/p40tDoovJMqlRj42h4yPL2ZX.8G7ej6cMGjlahWx3HVukcgKo0slMkHoHg.MGLs
lTYq2Xu:FBVDmRlUaTfM:a34M90HvjqjIDxV5q4jKHvz/MH07Dq3k5PdV0UWrSDWb/b2O9DDf6TM
LcnBwXiy/w3u69m/lip7VfbppZxghEk:o99Jf21B5hBxBs5hNYLaZ6J2QonvZp2vxuniYh.O2Eqz
kzTewnoF0jdHSBQdtfEUeqteocWXdpvK6dthXV2bCSEkWDCB5W6jdnDxg7ScV0cgxakUDp78IJ6n
LEdiUW.5aeLjRmlYC/Y:7FfeY7Si:6mX4P/ZSH9lLm0224NgCMwfdUoRW8yYkVu3bI29U4my6J7T
Zb3hVLpCOmt6F54ulylrBS/kl4B3DnBHEGpUokntvuQYBF1x/cNO4zoJsDtt:4fqDXVc4DUwGNg3
qP6TbpKnMkB31nxcBJvYUaxbFtgQcEIuMJShPlxhXDRak:6B4h6OnSx66RtC9RzNet9NBejxZSQn
z8vDfNWpHnLS4hkSOraeyfL7Wj6pBXDM5LaglnB60NgFfhaXvwqDzRoLl7Bgoi7KMwohM08p:Emf
P4RpeE2nLCL2a4ckDBiGPyon5:/Fn8G5zH4Z1wrg2YDXrUNhbpv.O0S3yiNWkMnSMLyDxeoPSOqq
JnO24cxvwm8xtJcV31QmDpk5dUuDwO9RZuStaIHLjwzZK/wqTESek8YfDuZMhp6dTbEIp8x3UIId
buRndjY6S8mLgKIK1.yoic6TewqINS7PP5ZdDDuIa/zYi4TQN7W.zXwYCUft0P:04TEhBv0ffxt:
.rtU8BaJQM6jNQ26iPPggP.zZgmT4qBdGZYGvHFwmdpddv:caN9hWyCbGBUX/LQtUYIY3UQYv31Y
BdoTh7iEnWy6YthfbtkIC85xc0CPkyM7BB8aBs8SXyuv:SM7IUULfgM7Eyxe.ktxmFrRJnPX8sv3
91UKqxI9wTzfjUa0uSMNCM4rdcCWtUVSoSTimuNa9xv0vLt6zVv.ta9pYM5/zzqDn3DNheLhYyG9
jcOunicfwz9jQblZyRRC:JafgUShxJll7wZ4TOfbqkpFBNPHqec:H7XqiCEzLekUH3VReWJgtJTO
2NYHBfsCjGXlKwTMO56xzcQ97Po/wxoiRgBzKOf:d2e10wzjIp8a9FxsVr0QGRpfm35:aU7Sl2K1
9JnpfVEu7fgYIPE0btHaTiz1dzeG/tNV2LYnnCT74H7zF83vZDmO1Z1SoSoPrtrPndQoQLipXMjY
nlxElH:bqjW:8lj7m/OX1j8c:0doiNpibmyTPYqxq18XcGlDJnR2BT7Xm6ul8YX01vMbBiHjiU1W
nrsiyDOJBffkiCK8wGQ9ZV3FO5OufKehXDtxgITNsLc54DO4p8OpuNqp9Us98fTNf5pQ5tJOMV8H
wpymebThLiTXZGitorDeP73OEl0seUmJag1xMKF2LHldqdQbTbCprrUwDXdus6jh7PzDhaH2ae7n
lfbRNqQa5DpDcDXSjZVNZvnKTYI2CTLa/D8U8vsIx46v.RymVb2mgujXSGNV:Q4kZgPLs:1oF:aB
cDV7fO8a:8QDkvCSxWtz/gKjgIjFCggT4TIq:VI/XC2zvpFH7E8O9vQ4EFzwtmbHUQLz:Nyfftvc
swONxNj5fBq1h:ZFLd.7zap26Oi9Jea1IW7k5Ghf4GC7uv:FwFOCIop5gEKzxLKv2jUWXsm3VXxw
jR3RHs9qMTEVxtDObtvQcjYQ4zPOCI.CDoBBfaTc2yRNyMyOCP5vBqlm.W7gixB2WFETl:l3oql8
Ze8pr3nnZ.VRVzh64iuL2ya1KD3PTzOvbPaMLRy1T2hr2k.WHcvBJvDLb7ijNGOQGZ7rf3EHnKon
hyp2wtwvwG1h2EilThHttg91PtzVu6wGKwnp3H4vIxiEYOGXU8HTR9ritlPT3TMyvvD4NqFLZEHb
kIrO.6WWkEc4Wl/nXMhsYYFROii2qleIJlp:kb/tft9ovFKPmEyB8TOLfyvyJLRPcOvYfy5/Wve1
1m4PLLGbK:6Ut78cMDabl.nOnOD2iR8jry8dY4a5vhffegteX/NuEup:UNSH0vbq5MsZ8qqJ5Hwd
GSx/xatURyiElf2EPNW0ljimzMR8ZO2x8F:k4lyR.UkhNRCbSIpNbH/gShRXDhVT7sczn/aShblb
I6eTkTGd9VbBJiavo8CB.jopDp21ymK0d6bQLf5oaj2ojdMww2U/GjrE980gEgL0Y:7iskLVDhSZ
zKSLaSf5fSMbO0VZrGreTmlS/L74xr73s9sLJQbULR2qcyXHaPMpXjUQNvpdjtWRuN69f/CxpUGg
7SonS3i8p6Q51Qsxegh5OJgCsMNWnuWkFep5nxS0/znzBawrp0DeTL/Zpm9P5xKuCgFbGN.3OkqQ
MVjJKYd6.hSXKZzYZORGQReJhzz24t7XIbNwzIGJqg6olJ69YHlzHwwc/RLpkgG01nh/8cNDYxMj
CcePekN32XW.0bTrfm/uxmxLl.oK:HtWsOVNWQijeXzRDjwdfbTaXZinH9hX3OQ48k:yiU/LSw7B
GES7GIuuhorJjMrmuaoEp6ETeKyylsW8nrRQybB8KCxXa8ET1M9y5NEdjy6q4tzsmEdlzL6SUvhZ
ly4:F5dYLLEltXmFWs1:estrv4WwR4xtMdxpt7BYhj9yEUxuxJ3zv02mqsjKdIMXjlp.Fk3Y37VB
Mkd7M0IWVtZBEj1lM1rVuQKQB93157QlTIUL5cEtSHcRkTvhKEtDuivMfVjGUae6a11Jge0sRxXB
WGpXvnH2MTE8ONdfooiiSn.QVVOl8prxWe84eC9Yfs7zYwKdRlu.hinvrjSbDsn2GQz74HM/J7qd
T3wOEFcTwo0q3cO7LBiajZPp4mI4:aTN5r.Jz9E908vMfp3.pdFNxPR1pmxM08TIBvkFaxUtKzeW
K.asbJN7H:N.wIBgVQ:lWJQRtdStchdeCHxK1okTrMtre.xvubNwV6JsPaJ1ek1sIpoPL/4H4lXq
ptFwTEEgdRzHBkvx4sO/hM/O.LFfWZ9GwiIHXfKCe:Wi:gyiPnJ6k3xDnOZkfIQJTp5cmCdX/MyV
S5QQvwzkGFgQ7GRDiRVHYoGMXJC/96KmzraUmvDqyCf6XnplbrGZmQkV2sTW.ipamyJZoNksz7cG
Yva8VuHg:Wo:6IO0gd1gtO6p9Enn5GmMju.MyCJLFh6nQSvK6gh3byNaqnh3CjRJ45t5FFCwltrH
5poouHR7t/l9C0T4D465VIdXd/3aziVpM4FhUuwaS51yI2TIr7HnvnSZ9kysQb7yCqj97hiKLRw3
9H8zaU8OsVOtS0Kp4DrMaikP5xmIoN/u77Is7/03xdMwe5VsiqXOoaQeMJz9ymh.e2BVi3bWkxIn
5wftlOnu38cBuulHuSUxl55JyQ7OvqHHuyuzD9B51oBe7HnYve.oFzdKohgM7Lxd.f.J18pOHler
bbGOfS8UuN/Qwa4qLZG1LhMZoxSzNw2RmKeYOmGhgnmH:ZCed0RSI6q2egpuKbePoa246oDzSgvx
ux7IHWTup:X6SWSGhQXLw2.Dku7sktBCH6yfdFJeHSD2ZTWlw5ZG5NQjene0ZNe:7iH6RKyMkZYM
wyNt/N0xFd7UPnzZiHaS4icWHBeg5ONIKHg5f69pMfEBBNS7aPpSDEhumx8QjvIkdzjbzyvLTMyi
.PYLioIa8LvCf4DsgcSZ3.0a6efyXKQXqVsyUkvIkcp:3eF2rjXTOdUO/gbBDSal82MvmdW8MZXl
Xzq1aIr7Fyp:7hU/JmCEksUj3HVlpBHlPUKoZaD2IdcH0xGWI9U737s/:GGBzdUMbKKa7WV/3RB5
zzx2.1c.9k/0.4k.ME/X.4g.EU/j.5U.L./G.4E.Mk.j.36.Qk/m.4:.9k/I.4Y.PE/Z.3:.R./V
.4o.Q..i.4w.N./X.....HFBjP1HGB6/as7lmm56Ubljc01t/NsmolUuUqUmUr.u2Qm3l3Dt4Ec9
14TS6.8EUBIVQ9qxaI:B1GIoCI.6Jjv6RrEC3Dw2dkTYwDcLjPsp:c/UP8/Q6zw.N.RjUB:U8jkJ
YUvQQKFBUfgXMF1iBzr0dX6VIYEEMUWzyKmMUEwW.7tm6LWX00.HFW3cmjfmEFbDpwB2KHHBwUtc
pHN3jY4m7vTU0/0YwI6gC9qbLuHEH/cE8O127000E:JSIGUB3/VdZ.DOt8/Fn8BNzyLjifL6cUbp
uWqpvEbO7RvKQcCGd894sZ21D69188HBPoLZ3HZsLoR:I4am3B5145JNf6nl4n0BtoO5T8ysM.q5
15Vkg/5JkMq:wtkQnYpb0hDnVraNo7lwscM/h5C6JeRO0NtDvC/qR9Tpb2koTY/i5t6ZPQu45NmM
hNkUCQY:tENk9MWnYFb/rC/xjihNxTRfS4ubrPXNrKsSb2k94rVsWKi./PWGrR2o9RqKu2M0r:3i
k3cqswhqlsB1ye//IWhie2u3dkeFDvJ/Ee3pLSy/mCeOc1JGOUf/O:jBtO7ZJ4EYL/I1P3E7hnNK
CFXj8F8DIXF6.Iqh3GGYOU/1IvxE6s8VJ6t2UOc33EYeUKyFI4ec1DJ2.wJ.zuk265RG.5.X8cfb
Ie7PM2xF.bDPqPs7oux4jB8PSoMi6Qas8xEJ5J6WU5hbu0QuOnx/Seoqy:jg876UGtR2Ugipn9rR
LjI3DIWKsVjiklb9YhmpmDn2l8J50ywaXDSLnNjapwee0VwsaKyPOCDUtlXaKzQVwDpjb6f7F3hY
ccy8qeR6Szul8/:qLfRhYaBHd:Y4PF09T76sCGT/8qD8mFunXYZMemEGkjbNKuT4puTPWgY03/7e
pYWKwOT70r78:rSGTbd.jbPGgt78N6MI6b7Tzzk
AtEndOfEncoding