OberonCore https://forum.oberoncore.ru/ |
|
ini - файлы https://forum.oberoncore.ru/viewtopic.php?f=23&t=120 |
Страница 1 из 2 |
Автор: | Андрей [ Воскресенье, 26 Февраль, 2006 12:30 ] |
Заголовок сообщения: | ini - файлы |
Имеется ли в ББ компонент для работы с ini - файлами, подобный IniFile в Delphi? |
Автор: | Илья Ермаков [ Воскресенье, 26 Февраль, 2006 14:22 ] |
Заголовок сообщения: | |
Нет, к сожалению, в стандартной поставке такого модуля нет. HostRegistry дает ограниченные возможности записи в реестр - только в ветку приложения. В WinAPI есть ф-и для этого: CreateIniKeyValue GetIniKeyString. Сам я с ними не работал. Я пользовался вместо INI обычными файлы строковых ресурсов ББ (/Rsrc/Strings.odc)? Тогда посмотрите Dialog.MapString. |
Автор: | Андрей [ Вторник, 21 Март, 2006 11:05 ] |
Заголовок сообщения: | |
Цитата: В WinAPI есть ф-и для этого:
Под WinAPI понимается модуль? Но в модуле я таких функций не нашел... |
Автор: | Илья Ермаков [ Вторник, 21 Март, 2006 12:53 ] |
Заголовок сообщения: | |
Нет? Значит, не описаны. Можно сделать свои заголовки по MS SDK. Кстати, а в Дельфе IniFiles реализованы случайно не через эти ф-и API? |
Автор: | Cardinal [ Среда, 22 Март, 2006 17:39 ] |
Заголовок сообщения: | |
Есть в модуле WinApi функции для работы с ini-файлами : Код: PROCEDURE WritePrivateProfileString* ["WritePrivateProfileStringA"] (lpAppName: PtrSTR; lpKeyName: PtrSTR; lpString: PtrSTR; lpFileName: PtrSTR): BOOL;
PROCEDURE GetPrivateProfileInt* ["GetPrivateProfileIntA"] (lpAppName: PtrSTR; lpKeyName: PtrSTR; nDefault: INTEGER; lpFileName: PtrSTR): INTEGER; PROCEDURE GetPrivateProfileString* ["GetPrivateProfileStringA"] (lpAppName: PtrSTR; lpKeyName: PtrSTR; lpDefault: PtrSTR; lpReturnedString: PtrSTR; nSize: INTEGER; lpFileName: PtrSTR): INTEGER; |
Автор: | Cardinal [ Среда, 22 Март, 2006 17:40 ] |
Заголовок сообщения: | |
В Delphi именно через эти функции и реализован класс TIniFile. |
Автор: | Александр Ильин [ Четверг, 30 Ноябрь, 2006 01:43 ] |
Заголовок сообщения: | |
Илья Ермаков писал(а): Я пользовался вместо INI обычными файлы строковых ресурсов ББ (/Rsrc/Strings.odc)? Тогда посмотрите Dialog.MapString.
А есть ли стандартные средства для записи в строковые ресурсы? Dialog.MapString позволяет читать значение по имени, а есть ли способ сохранить значение по имени, если оно изменилось в процессе работы? Или это нужно делать вручную: прочитать файл, сделать поиск ключа, изменить значение и сохранить? |
Автор: | Илья Ермаков [ Четверг, 30 Ноябрь, 2006 02:41 ] |
Заголовок сообщения: | |
Неа, стандартных средств нет... Надо придумать нечто общее. И, кстати, отвязаться наконец от HostRegistry... |
Автор: | Александр Ильин [ Четверг, 30 Ноябрь, 2006 10:32 ] |
Заголовок сообщения: | |
Илья Ермаков писал(а): Неа, стандартных средств нет... Надо придумать нечто общее. И, кстати, отвязаться наконец от HostRegistry...
Да, передо мной сейчас как раз стоит проблема сохранения настроек программы. Лично мне нравятся ini-файлы: легко скопировать вместе с программой, легко сделать как глобальные настройки, так и привязанные к пользователю (если писать в каталог "Application Data" текущего пользователя). Легко просмотреть и поправить вручную, наконец. Более читабельны, чем XML. Конечно, странновато выглядит BlackBox в части того, что касается сохранения настроек. После того, как я его установил, долго не мог понять, почему не сохраняется список открытых файлов. Потом поставил подсистему Desktop из коллекции Зинна, в тех пор проблем почти нет (иногда глючит, правда). Теперь вот нужно сохранять настройки, опять нет готового решения. Я понимаю, что в OMInc сделали все как можно проще, но неужели никто подобную задачу для себя не решал? В коллекции Зинна я ничего такого не нашел. Там, правда, есть интересная подсистема Reg для чтения/правки реестра на древовидном компоненте, но там только пользовательский интерфейс, нет программного. Кстати, для справки, если работать через WinApi.XXXPrivateProfileString, то существует ограничение на максимальный размер читаемого/сохраняемого файла: 64Кб. По крайней мере, под Win98 я с этим столкнулся. Под XP не смотрел, так как с тех пор везде использую TMemIniFile (в Delphi), который самостоятельно загружает ini-файл в собственные TStringList. Там такого ограничения нет. О! У ребят из "Oi Software" кое-что подглядел (правда, исходников нет в открытом доступе)... |
Автор: | Александр Ильин [ Четверг, 30 Ноябрь, 2006 10:33 ] |
Заголовок сообщения: | |
Код: DEFINITION O3stdConfig;
CONST copyright = "© 1998 - 2002 O³ Software GmbH & Co. KG; http://www.o3-software.de"; TYPE ListPtr = POINTER TO ARRAY OF ARRAY OF CHAR; TablePtr = POINTER TO ARRAY OF ARRAY OF ARRAY OF CHAR; PROCEDURE New (VAR rec: ANYREC; IN name: ARRAY OF CHAR); PROCEDURE NewGlobal (IN qualident: ARRAY OF CHAR); PROCEDURE Read (VAR rec: ANYREC; IN name, path: ARRAY OF CHAR); PROCEDURE ReadGlobal (IN path: ARRAY OF CHAR); PROCEDURE ReadList (IN name, path: ARRAY OF CHAR): ListPtr; PROCEDURE ReadTable (IN name, path: ARRAY OF CHAR): TablePtr; END O3stdConfig. This module provides support for configuration files. Data in a software system can be treated differently depending on its lifetime. For very long lifetime CONST declarations are typically used. For short lifetimes databases / files are used. O3stdConfig is for data lifetime somewhere in between. Configuration-Files are modified manually and read in by programs. Config-files have the following format. Each line starts with an qualident, either in the form "name.field.{field}" if it is a configuration for local variables or with "Module.Name.field{.field}" if it is a globally exported variable. The values follows after at least an TAB or whitespace. Configuration-file can include comments. A comment has to begin with "#" or "*" and ends at the end of that line. If a string value contains "#" or "*", the value has to be enclosed in " or ' (this symbol is then not allowed to be used in that value), otherwise everything after "#" / "*" will be treated as an comment.. Empty lines are ignored. Lists start with "@list" and end with "@end" | "@list" | "@table". "@list" is followed by a List-Name, values are separated by linefeeds. Comments after values are ignored (read into the values). Tables start with "@table" and end with "@end" | "@list" | "@table". "@table" is followed by a Table-Name, columns are tab-separated, rows are separated by linefeeds. Comments are ignored (read into the values). PROCEDURE New (VAR rec: ANYREC; IN name: ARRAY OF CHAR); Generates a New configuration file text out of the given rec. name has to be the same when reading the file by the procedure Read. The resulting text can be copied into another config-file or saved as a new config-file. PROCEDURE NewGlobal (IN qualident: ARRAY OF CHAR); Generates a New configuration file text out of the given qualident, which has to bee an "module.record". The resulting text can be copied into another config-file or saved as a new config-file. PROCEDURE Read (VAR rec: ANYREC; IN name, path: ARRAY OF CHAR); Fills the fields of rec with the values from the configuration file at location path. The value for a record field rec.field will be taken from the first entry matching "name.fieldname" otherwise the values remains unchanged. Pre 20 path # "" PROCEDURE ReadGlobal (IN path: ARRAY OF CHAR); Fills the fields of globally exported records given in the config-file at location path. Pre 20 path # "" PROCEDURE ReadList (IN name, path: ARRAY OF CHAR): ListPtr; Reads the list name from the configuration file at location path. Pre 20 path # "" PROCEDURE ReadTable (IN name, path: ARRAY OF CHAR): ListPtr; Reads the table name from the configuration file at location path. Pre 20 path # "" |
Автор: | Александр Ильин [ Четверг, 30 Ноябрь, 2006 10:44 ] |
Заголовок сообщения: | |
У них интересно то, что сохранение значения переменной опирается на метаинформацию о ней. Я с этой областью пока почти не знаком. Плохо то, что файл правится только вручную. Нет способа программно изменить сохраненное значение переменной. В общем, надо придумывать интерфейс для сохранения настроек. |
Автор: | Cardinal [ Суббота, 02 Декабрь, 2006 13:52 ] |
Заголовок сообщения: | |
Код: StdCoder.Decode ..,, ..C71...3Qw7uP5PRPPNR9Rbf9b8R79FTvMf1GomCrlAy2xhX,Cb2x hXhC6FU1xhiZiVBhihgmRiioedhgrZcZRiXFfaqmSrtuGfa4700zdGrr8rmCLLCJuyKtYcZRiX 7.2.s,soX,0k,5TWyql.bnayKmKKqGomC5XzET1.PuP.MHT9N9ntumaU2,CJuyKtQC98P9PP7O NbXmb.2.AYlk2kA41,6.,U08J99SdfJHPNjvQCJuGKfaqmY6MwdONl1QCh0708T,U..w.QskU. sUGpmWbBxhYhAbndMHT9NY6Mw.sQq2Y6cwB.0.Pi9w,gsiE.2.Ad16.86.QC18RdfQHfMf9R9v Q7ONbXmb.2.w22U.EBU.U,.JFkns.U.2m,.D,1cUZT1E.cAE.666..cJ9fQ7PMRPM0S45.2UE0 K1YDIU0KyB.,U.F.UO.,.16.c8.2UwK.s,6.n13s0EMF,eU.k3l,8Mtr.0E..UO.,.1.eWUX,U E0,M5kRF,a.w6s,6.H8.I.kdE,U.Q7IU6U.27IU5U.Y9IU7U.oe.E,y.g4IU9.J0K.0EoE,G.0 EL4.1M.krE,O.0k3,kZ4.5s56.,W.QUO.17.0k,00,6.56.I.ESE,S.0E74.5M3,.z.5636.F. 5c7kQE,O.gn0k,y,0EN1.3s,kSV6U.QLIU5U.wV,E,G.0kbE,U.2i,E,a.0Et4.3c1,U.wNIU4 .l,3s06.n236,6.D13.0kPU4.H0a.0EIG.3c,E5E,U.Q0.Q6.2y,U4.ZT.6,6.nM.IU4.v.3M, 6.Ld.IU5U.Y8QUMU.QCQUB.p.5646.z,u.0kOk,.j,a.0Emk,4V.2.XV.QUHU.oEIU4U.24I.E W9.zTHT8Ff8H986HePHfFH9P9vQrN1PM0HOHVuHZ8J,NH19RF99,dFH9P9HK0mdGLtaKrSqtmG EGpmWLu.mGEG3O3CLK.POMV9Q9fQb99,tIy4mGECoruKvKKtGrm8rt6PTvN,dCv76b8R79HTvN rN1HM1HsETeHb8J,tQHfS9vIdfQHXUgbUAam2av2YdphdZiHBhuhgUgbUAakQbUghV3jABhihg n3Yx2Yp2avgV7AVdphqBggBhYRdZBjUgbUIY7pdKBcABd2xf9hcNJYvgV7g,dOKVOFPM0HsIdf Qc8,ND,NEZeI1OK,tQHfSC366TeF,tEFOEZuC,N1HM0b0YddRio3Yx2YExd7pdIhcG3YIxdUAc GJ8wd43YHZimVvgV7AV6Bgn3hABhnZC...EEmobuoXaIbGpRqk2gV7AV2BhXZidxhiBgmBje2Y x2YE,90cEb8JZOE58J,dI9uETeI7869eH7uCPM0kdYg2BhXZCUUgbU28.cI9uEEIGooC4UdgV7 AV7QhZBju2YHZC6HsCPU72hVRicJ5FOMb9ON0UqBggJbUQeo,.cPN76bPOIbUAdCZe3xc3JeUg V7AV3pd2R5Y6ZPN59RTnweGEq1UG,10..90sIEtK466v,.cI.FVm,AZUgcCZ6M1YeZ3D,ND,,. .gV7AV7YgjphZhZu2Y0xdDZd3BcCRb72Ze2YgBgnZiUwhkhgmBgoBhjphUwiVRiUQipRgXhgnR iahig3YeAZBAV7AVmhgVZgdphbJbUIcD,gV7AV7ogjJihJbUYeZ3DPWkViocjJihBgoZiZJivg V7ktCqkuKR0GeK4.QeXBgiphZJiBAV7g6AV7gV7gV7oe,JeUQgjphqJbUQcjpB91sETfP.r,7P OZP9N76b9R79FgZu2Y2BhmhAkRqk2qUEJeDRc3ZcJJe33YcYgu2Y2BhX,11,NE79N9ePdfQnf8 ,78HeH,tQ9vMN76LPNn99,dR19Pp,kImGEuoWSJK0mU8odG3QbBAVEJ8...UHhgoReoJie2YcA 7iqma5U,JeG,Q6AZg2YC,......SomGrd..YgZpgu2YHZCHXv2YDheI3YqBAQ8kI.......sIA diZie2YcA7ER.Q5hPMNX7p7S2H79u2.......ZON19PJ76F,...ZOF18HH79,dH......U5lY. ..EmKKnMGR0QbUwdJ,MG.H,.......I8....Ie3lR0mbK3UGVd........CpmCqVyquuKueGIa GR0mY.mGEuoW.......UCBghhge2Ycohu2Y7,Q5ktKqleHECJuUd.......kd4KvKKJ0GImqrC KR0GXaKqc9NuP5PMdvPZvC,dP1PP9fC,dFH1uokqav2YDh88rmCLR0mYu2M8...Pk428..ICUd cH9vRJ76FN8p767ml.Y3...P.V0.b9RZvQL9Q,78HeHCrMeHE4Id..rlbkt8HR0mU83.M8rN1H M0hOEAhg2YeJbUA7UvgV7Ic3xc7pdBAV7IhUIbx2YkQbBAV7ocDJeUAhUIbx22,7JT86NOFR88 bPA7N8,N9,NA,7FTO1HM0HMGB86FtQXtKHPL,t6,7AZ7AlO8,d7,78b1Ut2fd2Ya..WpI0GeWo Wuo4aU7AVnJaPJhR3Yug5bPArWvgV7k2aIbCIIeqIq.K2,N1HM09Wvg,C5.V7KPM09eH0mtGLt kRqk4aEc.kdWIa0GIWLR0GdkRohu2YAxdC,HdC,7HT0Q5o8Iiu2YG,PM030Et0GRqXs3Yj2YBB go3hiAdiZiExhrhgm3ZmYZUQe6xdGZecohdAZvgV7cI98JfeIR869eHdOG9eIFdQ,t8,7ARNBH N1HMFRWH3dARbBAVB6I.UG3Yc2ju.22.M8.sCAVK,.qU0,.....y2.I8....Edin4qk2.U6Bgn 76FNGQBME..eHEm2.aEfEqKKreHEa2UU2hVRicJ5Z00moeHEa2.ZfC,,g,30EqKKr0GRqXAhcC tO9PS7N8r76FPM2YugbU2avk2O2.00mqmuKEqGE410m4aU72B.FPMbXf2YDJe23ZfhgtRfdhfd QbBk2.p,kJQe6Zdc2hVRCN76X7AHtC,N1H.66p,kJEdWGo4qtY3hN8PM0K2r,F1,dC.i0m269C nIiHEWGJ0Go4qt2Yu.s8WqkESmHECnR0GJam46OERgcCZe7h6qokG5VuPjPN2hVFKQe6x7Qe6J 8.XNAHN8H76L76V,r76F,66x86F7O11xdD,NAXN8r76JN8.I5,,Q3b0EKMBHtC,78.,dC.iWc, tVlgav2Ye.Z0.Eo44L7ARNBHN1EEWokCbvgVB..W0CZYZ651kIQeZtIdHJ.69O5A6..r,h0FPM I5NuH.,NO.UBkjiqmaLKwfqBggJ5bGta4N00mjWqkC5W2m2g,30kUCpdKIdGJImoWu2AZUobx2 YmYZUIakAZvgV76O66pV6BA2ZfhAi1aIXYgiohUobU2aUYe6h6,N1Hk2O2.VVD7NRtQHfS0mK0 0.akYUfhgtR9003d6,7JFOF.HkY6O11v767f9F1rOOv86d8G68J76bPMPPN,7O1XUoiVNR996J N8PU7A,a2LPN007np.776d8G.UfhgtdR19P.M068J76BvPffP796196hPMcC,NPT9NHfNn961f P796ZPNdPRZfP,d8HN1M0MGYAhPMNvKHPLC0.q.a.YgioiV,enSoiV77r76ZOFdOJM1HU7U3VB U7kW.A,90k2K2.Q5akW.a2oBv767ntUI37.7nta4enSYgi.eGE8nRqU7AVBM0uoWSJIyppKqw6 H9eHGKLi4HN8rN1cF.246H.66P76UTRhZtK22YALXPV3p7UCVYpZfFKIaUIZUYd3p7UdA3,N1c F.24.yppKad22.7npsKcCwffhAr090k4EbkjOrkYZUYd3FmoCamIin4EX.6A..2Yh.wfqBAr0p VYdRQ9g6.R07Hv698HE.sOAZdM1cF.24.yJv4ad.EmoCi3e1zeR1nhkW.g,o7wfcBAmWAVY7OM 8HtCEX.6A..66P,sLF1r0pVY7O.K2UCVY7O6981.i4.O2.V,UT3hVlI.6NW4i3e1z8O11MF.9W UQbBk2W0HfPbPNZ9R,NOR96d9O996BPOZvQd96b9PT9R,d8HN1AhUIbx6Ar,j8GH8H986FNO,7 Dv767ntkI0GH0WYpZflhkFkI0GWyY7pd13ZdBZUg6UYtO91I5iqmYYv2YYpZq,Uq,Gac,.F1rl 2AdCFmuGram4akWkdKKucQrVB6I..6N..MG66FFbUusI8rosCO5plY.amRak4ak2O3CLv4KqeX H,g,30..sOAZUo5.UHdQsQRNGR9RduPb8RZPO2ZqBggZ3bfR1nIiHEGKLCpmGrd68LPNmWnpCg V7g6.QbBAVB...G4..83.EREta4r76cC83amRak4.UusI.P....A3...CbGhgVZhIxhH,W0m0M 8r,.F,N,M1..rN1PEc..Em..S2c8.EmUHdQHXv2YDh8O5p,kIin4cJ6OcCm2.H1sFQbBcE...M 8..2B2YuEYEIiqmsCMOEM2YqBA,dCvFmKKnin4ak2mobyIcqk2MGBmo0mS00EEG3gcMBdI3Y3, ak2kp66v,L16Jk4k2a2F1,ND6OsK..HEv66ELO5sC,NFlOGqk2M09WBA,kRU7p7a4PM0HMFg,9 WUwcZZCQ5qUE,.UY,.U7FJ.cCcQHXv6NI5H0EEy2ERA7UdM1o8QiYhgaZZUQiqFRQ8.ZPNb1.r N182...aGE..Q8ktA7.687PNB99YgZN8rN1YADONdvI23Y3HfPhPMa4Y3b1HtCPU7p6bfR2Yx2 Ydphq,66d8GcR19P,dCMNqk2akWmodKIEqk2AVHVitQCZmBBGpraIrGLICLv4agcR1HKIiZRid QbBk2a2ZPNb96576V76d8G.,,669eH7O1akWuYvkWuYU.Q5qUE,.UY,.UGVe.EREta4rFmcC83 iHEy2ERI8A3PUK,69oCeXH,cQI5...10.kI..sIUndI4aI,6869YAamREm.23Y3H1.NltkIU7p 6b1,ND.UU.EEe1M1gcA,AVHVitQC36J8pm4KqWmtO5NFv6985H,akYcQ22.UU.22U3p7rV3FE. Q5HM1q.03..G4..CpmQ6EI2Yu2Y7V5,aEfko6QTvQN76RvQ9vMplY.EV.ohnhgX3Yug5Vl4AV4 ,enS66yYYtQH17uHq.HEXYALXPVXUU.PU7AVH,Cb4BhiZgcYgi.YZUIYuIYg2YkYZU2ijN8rN1 AV7A70rrCLEqHEqmM0GeW2,NGRuEuqtKad2Y3p7kWk4MFQbUgV7cI.RvQ9n4akW66D0Q6sCg,V 0.....u2e0RX77JUU.bPNsI8roM8Ef.EKogjhCeHEa2UB.U,,ohUobx2ag2Ym24ko.r76BvPfX UIbx.PUA,AV7p6HnSktUI,bPN008GFiHEKIg66sCPk2akd.b1....H,A705,,.aY1dNTPRA39e H.cNT1,dD,dP,7JF090.EbMOqk2g6i1aIX.Ybx2Yi3YI,b1.8pW.90sQ9vM,,7f9L1gV7g600. QbBAVB6I..6N..10.FNGQCm0EvcCcQM8cE.aIX2ZfhA,ND8GFaWa22hPMN96vFFEeUYpZHVo78 bPN5XqBAHN1aUAVYpZH,UUQZUIYuIYUQZUQhZBjg.0mWM1K24ImG4sCPM1H..0pkGLoGprOoom qmCJsKql0GIaIb2iVZicJbUA642.ZuCUgxhXJ5B0bHaMMEEUiBghdCO2cHqadQbBM0h0cOEe., tMFfCCIYk4.koUkEp0GRq1YhjRgUIbxcFH9P6NHfQR7JFPOb983d6HtCPUL,WGqyaiIiZRiUg5 VN8,d7AhU66N0VPMdnI0mKM8,d7IhUYbUY7ohVhB0mK.2iVZCrOOv862aMFWyo4M059O,dC2iV ZCsCaIbUv.H0JHT0Wd22Qgc3YxkL8mI0GeUiBghtKJPL,,V7Kr76J1Q5666PTvMR7JFPOohVhB HN1Hk2K2ohVhBr0sMFvC,NGRWeV7Ebg,HMFQ5A70rk.,ND,7Al86d8G..2aMNFNuI9Gqy4Z1pN D4nR0Gr44,dCvFF2Y3p7g60Gc4KuY8kdkRqk4..T8Q9fP,78NXucFsQm211AdC3YiVuME..HdC GpmsCPUKVnJbUkrgARtIy4r76BfP1PP9X4,u2iHEGrmWLueHEGpmsCI6.HWgxhX3Yx2YCBdA3Y I372eVZC.b0FdP1Xg2YgxBN76BfP1Xd2Y3ZdHFnuqk66cP1XY2Y3p7rV7A7ELUx6A,FYM1AV1x hipCktAdh3ijJio3ZgxBN,69Cqruag2YnBZvgV7M0HWcQiUQYUod7Zdd2YaktAdH3YIhgsdJEL O3aGEGJY.aEbEuKKwAZv6Rc9ZPN19N66pNDGJdKpWiHEG5QiXBgipZ1xhiphZRgoZej3Zn3ZIh gsdJsQUdoZI3hdNHT9N99PFN8HtCk283EuKKwgV7AV7gcAVGhcI,ROGNO1HM0o7Pk2KIa...R0 9WUwdkhArN1P..gcjZiU6Rp762DHdC8YDZ7Q5.cI.df9ZPN.B76df9b18roGqm8LLKqrGr4.9u PdvCPk428.IeZlVWqk8LEWGue1sC,tHsMp7658GsCI6.1mdUopZmVdFK0GN0Xvk2GLLCrl.EdK qkGqVEICqIiHEGLLGqruqm0GRcTdf9bvM.MNg,EdKqk.rN0Pk4..jeQH9R9vIdfQ66F7Rp,kYs QplU83..82..x9RRdQ9Xd,.HUaxhmhhiwemBho,68bP8r76PUo,.mIrin4ak26NT16JM1HMFsJ ZPOQ8kRqUB..uomYeZ3jo3YcAZu6JsCPk2O3GrmcCUvEV.o7.HtCgAuGt.0GRcF18HbOFr76Ua xBQcjpB.dONgdjFqCLLGqocH9vRFN8H,83UZl4g6o7j1in2qk2..8ZbBhnZiZJiU23Ew66NXu. CbAlk.cP1XuME..k2O3OKr44o6EbkRoiu2YIVKVn,in4I6.HeFuLuu011o2FdP1PP0mF0GFAZU .M0HWgFEcHmIEUU..b0Ug6PY3Ud.0GnUUI5u4G0R0ak2.u0b1V,cR,dCvFeKKw.bHma4EuuGnU mBhYV0BgnhgcAZdQ5M05091MFl9QTfQd1m0EKQAOLKoidQbUYii.,,83A,98H6RR7N.O2gV7A, uYBM098H22..g,KIbkW66ZmnQCQb7M1HM103.W06NIiZlrAD,dHI3EW.kRM0h07vMdfC,,QA.0 moeX7,M182u2u2GqlGrIiHEGqlGLLuKEenS2av6N5Xn,pVlM1HEb.QBmWdNOABamRod3xec.hX gMOR1..2BY3H1.PUBM0B0I50HEw7N07vMdnpM8q0,VUU7YgXZiioCi3e13lRYgXlpsK22.Eokh .0n4aU3lREd.GqlgV7UUo7in4gVBAVE,UAxhVZge2YcYBe1sQm211.cC.u2aGR0GW.UBEfktmG Eqk2QCmWf,hXuUmBBk2CKR0mVkR0momGE05NFqaKrKKR00.AVohgsdCUvg,8quOKnKKteHEC36 H.GqoCKueHEG2a4.30g,H6R66pNDyIs68NvP599uqkkRM0106R99SQYUo7mGE81r,PUCVWhiap AmGEqqkW5Qid.b96pVWUd3YuEMiXgBhi76p,q.j0oj3xho3ZohAaGEG2M0ZON19N50F7R99SmG ECqIiXBU7p6dPNoZY,d0q.akYsM,t6,7A78K,7JktipoqJEkliHEaIbCYdN1ak2akWm2,N1M0C rhaqiUk2fvg,ak2A7moWsQ7N8,t6,7A,FYElKLnkhmqouqmqJEe1b97r76H0NPORnI0mWu2k2Q iUUW.e1VN1M09eHqU7.MFQ5A7mqouaUg5.8pWG3od7769eHUYVUIbx6NHfQRdHM8rN1o6.0HEw 7NPOM9UBk2CLu8rt683PRB1aqiGGK0mta0F,LPOV96NPN19NH1b9Q1vM0GJa0A7WWP3aR3Yx2Y WQbWAZUwdG3YcQC.5d6H76.Uk2fd6Jk4M098Hg,AV7,.3tK3N8,d7QCNOFR88kKML,NDgfWAZU Y868MNGro66JN8P.HkY6H.uHE8HEGJY.Orkmqo2YnhgX,u40GJ.HUnhA,dCQCg,A,C3sQRNFl9 RZPM59RFtQ779,NAN76.mWnhAHtCEtKqqyKvKKEiJEemIq.a.b0..KqlGGK2ag6HkmM8,N9YZU QCa0.ki0GJa0A,G4umUGKmK2ZHICrmCKGmWWIYg2YWIYdQ5M0KIb2YBU7gcAFEWGJ0mpKaUIZd .Hkd.o6sQ7,vd6N76VVklIg,A,HWkxB,t6qmM00M1M0Q8.90UYEM.NlpM8r76FVZ3jo,,tO9HE .a.b0.Uc.VXfAag2YA,7FKoCamR0GI.EEO5fPN,,M0A7WGaK2LXYAZUo5V,Y7oiVZhYAZUobx6 AHFe.M06N...iqm69,dRk4a.HU3p7U7MFg,AV3,.g6i18pW.7PO59RPM09WUYdjBArN1qk203. W0CZY,HXVlIQeVpCJFIm4p,EaMMd1,dPcC.u2iXDVmFR.M8Efko6QIbUA7Uv2YohAe1sC,tQN7 6cCCZmVvEV.HkU.mqr2YX2YCFKMAHtC,NEbuI90RPM2YXc6mWmIadQbUA6UYpZidD4HK0GNCnI in46R66pVChAd0FN8rN1o6.0HEEm.,7FT86M0HeFGaf,Q22YI37RO1AV7A7cR..66k2Q8kto66 Ni469EK24kIU7A,b0kWcQ687f9.2C0mJ0mMmGEm2GKL.aGK0mpKadM1M0CLEkp66L76DNDD76L 767f9h1YYBAV7M098HM1M0C5IYP76L767np.,t8,d6ve6PM0Hk2KIbQbU.HsJZPOd1Z1F7R9Xg sQ7N8PM0g6qU7g6in4AVGhgbBhnNNWGu.NvPm0M8M0ZPNb96pVhAavgV7MGYCo3.cQ9vQ,,VlW uYUg,9WUQeVpCrN1HM103.aIrYivg,O3GKR007Xm,Q582UCVYBZvg,H6N8LEe17P1HMFMGRPOk 48oWS2AdiBhoBVBgcCZ6cFU0CyIhgstETfPdfQT9PNPNZvQCJuGqVGLtmKWKqtCK.4jZ3D.UiQ 6G5EWKqtCK.Q6GrkEt.85...CLL.U2V.IS2U.UIU.U76.,6.,..1cUXDJ9XGhighgmRiiQ88pu m470,Mwd0UnpZGhighA70,cw5.,6.QJ,k12U.QI2U.sU6S.bf9bWHZitZhZZcZRC,Mw.ELMSN1 2Umz.0U..2,I96.IEK4.RNEd1YiZ7FCb.6,6..UYU.AU.U.UUQoOF.2UlSw,2UTyB,M.M.6.,U 0KyB6.2..c4E.k.Ue64VT.E.0t.U..61lbAUgQnPt0lLU8ssH2qqmsQCor..62,U...W.0.A,, U.RfnlA9e.az86Utb.rfc7UtwZ.Qe,... --- end of encoding --- Тест Код: MODULE TestIni; IMPORT Files, log := StdLog, IniFiles; (* TestIni.do *) PROCEDURE do*; VAR d: IniFiles.Dictionary; loc: Files.Locator; val: IniFiles.String; res: INTEGER; i, n: INTEGER; BEGIN loc := Files.dir.This(""); d := IniFiles.Load(loc, "test.ini"); ASSERT(d # NIL, 20); d.GetStr("section:key3", "none", val); log.String('val = ' + val$); log.Ln; n := d.GetSecCount(); FOR i := 0 TO n - 1 DO d.GetSecName(i, val); log.Char("#"); log.Int(i); log.String(' ' + val$); log.Ln END; d.Save(loc, "test1.ini", res); ASSERT(res = 0, 20); END do; END TestIni. Попробуйте. Вчера переписал исходники с языка С для Blackbox-ЁЩЕ НЕ ОБКАТАЛ, могут быть траблы с хэшами. Оригинал функции для вычисления хэша Код: unsigned dictionary_hash(char * key)
{ int len ; unsigned hash ; int i ; len = strlen(key); for (hash=0, i=0 ; i<len ; i++) { hash += (unsigned)key[i] ; hash += (hash<<10); hash ^= (hash>>6) ; } hash += (hash <<3); hash ^= (hash >>11); hash += (hash <<15); return hash ; } |
Автор: | Александр Ильин [ Воскресенье, 03 Декабрь, 2006 00:18 ] |
Заголовок сообщения: | |
Посмотрел, вариант в целом интересный. Особенно раздел CONST. : ) Ну, да ладно, это детали реализации. Я тоже написал свой вариант. У меня получилась подсистема Cfg. Я постарался сделать ее с прицелом на возможность прозрачной работы с реестром и прочими хранилищами. Не знаю, насколько у меня это получилось. Краткое описание: Модуль CfgBase содержит абстрактный тип Group, представляющий некую группу параметров. Общий принцип: хранение параметров в виде пар "имя-значение". Каждый параметр однозначно идентифицируется именем (строка) и содержит строковое значение. Методы: GetVal, SetVal, DeleteKey. Предполагается, что конечному пользвателю услуг модуля (т.е. тому объекту, который будет сохранять или читать свои свои параметры) достаточно передать экземпляр объекта CfgBase.Group, и он по имени найдет интересующие его значения. Остальное его не касается. Модуль CfgIni содержит типы Section(CfgBase.Group) и File. Тип Section представляет поименованную секцию ini-файла и реализует хранение параметров и доступ к ним. Экспортированные процедуры - те же, что в CfgBase.Group, ничего нового. Тип File представляет набор секций (даже загруженных из нескольких разных файлов и прочих источников). Экспортированы следующие методы: FindSection, GetSection, DeleteSection, Load, Save. File.FindSection отличается от File.GetSection тем, что последний никогда не вернет NIL. GetSection создает секцию с указанным именем, если она не существует в файле. Методы Load и Save в качестве параметра принимают объект типа CfgIni.Reader и CfgIni.Writer соотвественно. Типы Reader и Writer - абстрактные интерфейсы, экспортирующие по одной процедуре (экспорт только для реализации): ReadLine и WriteLine соответственно. Реализация данных райдеров вынесена в модуль CfgIniRiders. Модуль CfgIniRiders реализует два типа: TextReader(CfgIni.Reader) и TextWriter(CfgIni.Writer). Эти типы поддерживают работу с TextModels.Reader и TextModels.Writer соответственно. При желании работать с другими носителями данных (например, с файлами напрямую), можно добавить в этот модуль реализацию нужных райдеров. Модуль MateConfig используется в подсистеме Mate для сохранения настроек посредством подсистемы Cfg. В этом модуле мы решили, что хотим 1) работать с ini-файлами, а не, например, реестром; 2) работать через текстовые объекты TextModels.Model, а не, например, прямо с файлом. Оба эти решения локализованы в данном модуле и могут быть изменены без какой-либо правки клиентских модулей или подсистемы Cfg. Клиенты модуля MateConfig в моем случае - это различные диалоговые окна, сохраняющие последние данные между запусками программы. Вот общий паттерн для их реализации: Код: MODULE MatePortDlg;
IMPORT Dialog, CfgBase, CfgMapper, MateConfig, ...; CONST iniSection = 'MatePortDlg'; (* имя модуля - уникальный идентификатор секции *) VAR rec*: RECORD port*: Dialog.String; x*: INTEGER (* это просто для примера *) END; PROCEDURE GetSection (): CfgBase.Group; BEGIN RETURN MateConfig.GetSection(iniSection) END GetSection; PROCEDURE LoadSettings (); VAR g: CfgBase.Group; val: POINTER TO ARRAY OF CHAR; BEGIN g := GetSection(); g.GetVal('ComPort', val); IF val = NIL THEN Dialog.MapString('#Mate:Com1,19200', rec.port) ELSE rec.port := val$ END; rec.x := CfgMapper.GetInt(g, 'x', rec.x) END LoadSettings; PROCEDURE SaveSettings (); VAR g: CfgBase.Group; BEGIN g := GetSection(); g.SetVal('ComPort', rec.port$); CfgMapper.SetInt(g, 'x', rec.x) END SaveSettings; (* ...различные процедуры модуля... *) BEGIN LoadSettings() END MatePortDlg. Саму подсистему в стандартнокодированном виде выложил сюда: Cfg. Всяческая критика, особенно конструктивная, категорически приветствуется! |
Автор: | Cardinal [ Воскресенье, 03 Декабрь, 2006 10:31 ] |
Заголовок сообщения: | |
Александр Ильин писал(а): Посмотрел, вариант в целом интересный. Особенно раздел CONST. : )
Зато просто ![]() ![]() |
Автор: | Alexander Shiryaev [ Суббота, 09 Декабрь, 2006 03:11 ] |
Заголовок сообщения: | |
Вот ещё один ![]() Код: MODULE AixRdConf; (* Configuration reader; Alexander Shiryaev, 09.12.06 *) (* EBNF: conf = { line eoln } [ line ] 0X . line = [ spaces ] [ valuable ] [ spaces ] [ comment ] . valuable = key [ spaces ] '=' [ spaces ] value . comment = '#' IGNORE . key = key_ident { key_ident } . value = string | integer | boolean . string = { string_ident } . string_ident = key_ident | '/' | '.' | '-' . key_ident = 'a'..'z' | 'A'..'Z' | digit | '_' . integer = [ '+' | '-' ] digit { digit } . digit = '0'..'9' . boolean = "on" | "off" . spaces = { ' ' | 09X } . eoln = ( 0AX | 0DX ) { 0AX | 0DX } . *) CONST ok* = 0; unexpectedCharacter* = 1; identTooLong* = 2; integerTooLong* = 3; invalidKey* = 4; alreadyAccepted* = 5; notAllAccepted* = 6; TYPE Node* = POINTER TO ABSTRACT RECORD next: Node; key: POINTER TO ARRAY OF CHAR; accepted: BOOLEAN END; BooleanParameter* = POINTER TO RECORD bool-: BOOLEAN END; BooleanNode = POINTER TO RECORD (Node) p: BooleanParameter END; IntegerParameter* = POINTER TO RECORD int-: INTEGER END; IntegerNode = POINTER TO RECORD (Node) p: IntegerParameter END; StringParameter* = POINTER TO RECORD str-: POINTER TO ARRAY OF CHAR END; StringNode = POINTER TO RECORD (Node) p: StringParameter END; Stream* = POINTER TO ABSTRACT RECORD END; PROCEDURE CopyString (IN x: ARRAY OF CHAR): POINTER TO ARRAY OF CHAR; VAR s: POINTER TO ARRAY OF CHAR; BEGIN NEW(s, LEN(x$) + 1); s^ := x$; RETURN s END CopyString; PROCEDURE BindBoolean* (VAR node: Node; IN key: ARRAY OF CHAR; p: BooleanParameter); VAR nb: BooleanNode; BEGIN NEW(nb); nb.key := CopyString(key); nb.p := p; nb.accepted := FALSE; nb.next := node; node := nb END BindBoolean; PROCEDURE BindInteger* (VAR node: Node; IN key: ARRAY OF CHAR; p: IntegerParameter); VAR ni: IntegerNode; BEGIN NEW(ni); ni.key := CopyString(key); ni.p := p; ni.accepted := FALSE; ni.next := node; node := ni END BindInteger; PROCEDURE BindString* (VAR node: Node; IN key: ARRAY OF CHAR; p: StringParameter); VAR ns: StringNode; BEGIN NEW(ns); ns.key := CopyString(key); ns.p := p; ns.accepted := FALSE; ns.next := node; node := ns END BindString; PROCEDURE (s: Stream) Get- (OUT c: CHAR), NEW, ABSTRACT; PROCEDURE FindNode (n: Node; IN key: ARRAY OF CHAR): Node; BEGIN WHILE (n # NIL) & (n.key^ # key) DO n := n.next END; RETURN n END FindNode; PROCEDURE Read* (node: Node; s: Stream; OUT res: INTEGER); CONST bufLen = 1024; VAR c: CHAR; str: ARRAY bufLen OF CHAR; int: INTEGER; bool: BOOLEAN; n: Node; PROCEDURE Next; BEGIN s.Get(c) END Next; PROCEDURE Spaces; BEGIN WHILE (c = ' ') OR (c = 09X) DO Next END END Spaces; PROCEDURE IsKeyIdent (c: CHAR): BOOLEAN; BEGIN RETURN (c >= 'a') & (c <= 'z') OR (c >= 'A') & (c <= 'Z') OR (c >= '0') & (c <= '9') OR (c = '_') END IsKeyIdent; PROCEDURE IsStringIdent (c: CHAR): BOOLEAN; BEGIN RETURN IsKeyIdent(c) OR (c = '/') OR (c = '.') OR (c = '-') END IsStringIdent; PROCEDURE IsDigit (c: CHAR): BOOLEAN; BEGIN RETURN (c >= '0') & (c <= '9') END IsDigit; PROCEDURE EoLn; BEGIN WHILE (c = 0AX) OR (c = 0DX) DO Next END END EoLn; PROCEDURE Expect (ch: CHAR); BEGIN IF c = ch THEN Next ELSE res := unexpectedCharacter END END Expect; PROCEDURE Key; VAR i: INTEGER; BEGIN i := 0; WHILE (i < bufLen) & IsKeyIdent(c) DO str[i] := c; INC(i); Next END; IF i = bufLen THEN res := identTooLong ELSE str[i] := 0X END END Key; PROCEDURE String; VAR i: INTEGER; BEGIN i := 0; WHILE (i < bufLen) & IsStringIdent(c) DO str[i] := c; INC(i); Next END; IF i = bufLen THEN res := identTooLong ELSE str[i] := 0X END END String; PROCEDURE Integer; VAR sign, overflow: BOOLEAN; i: INTEGER; BEGIN IF c = '+' THEN sign := FALSE; Next ELSIF c = '-' THEN sign := TRUE; Next ELSE sign := FALSE END; IF IsDigit(c) THEN int := 0; LOOP i := ORD(c) - ORD('0'); overflow := (int > (MAX(INTEGER) - i) DIV 10); IF overflow THEN EXIT END; int := int * 10 + i; Next; IF ~IsDigit(c) THEN EXIT END END; IF overflow THEN res := integerTooLong ELSIF sign THEN int := -int END ELSE res := unexpectedCharacter END END Integer; PROCEDURE Boolean; BEGIN IF c = 'o' THEN Next; IF c = 'n' THEN Next; bool := TRUE ELSIF c = 'f' THEN Next; IF c = 'f' THEN Next; bool := FALSE ELSE res := unexpectedCharacter END ELSE res := unexpectedCharacter END ELSE res := unexpectedCharacter END END Boolean; PROCEDURE Value; BEGIN n := FindNode(node, str); IF n # NIL THEN IF ~n.accepted THEN WITH n: StringNode DO String | n: IntegerNode DO Integer | n: BooleanNode DO Boolean END ELSE res := alreadyAccepted END ELSE res := invalidKey END END Value; PROCEDURE Line; BEGIN Spaces; IF IsKeyIdent(c) THEN Key; IF res = ok THEN Spaces; Expect('='); IF res = ok THEN Spaces; Value END END END; IF res = ok THEN Spaces; IF c = '#' THEN Next; WHILE (c # 0AX) & (c # 0DX) & (c # 0X) DO Next END END; IF (c = 0AX) OR (c = 0DX) THEN EoLn ELSIF c = 0X THEN ELSE res := unexpectedCharacter END; IF (res = ok) & (n # NIL) THEN WITH n: StringNode DO n.p.str := CopyString(str) | n: IntegerNode DO n.p.int := int | n: BooleanNode DO n.p.bool := bool END; n.accepted := TRUE END END END Line; BEGIN ASSERT(n = NIL); res := ok; Next; WHILE (c # 0X) & (res = ok) DO Line END; IF res = ok THEN n := node; WHILE (n # NIL) & n.accepted DO n := n.next END; IF n # NIL THEN res := notAllAccepted END END END Read; END AixRdConf. Код: MODULE TmpRdConfTest;
IMPORT Log := StdLog, RdConf := AixRdConf; TYPE Stream = POINTER TO RECORD (RdConf.Stream) i: INTEGER END; PROCEDURE (s: Stream) Get (OUT c: CHAR); VAR str: ARRAY 1024 OF CHAR; BEGIN str := "sleep_time_minutes = 60" + 0AX + "use_certificates = off" + 0AX + "ssh_user_keys_path=.ssh/authorized_keys"; c := str[s.i]; INC(s.i) END Get; PROCEDURE Do*; VAR conf: RdConf.Node; int: RdConf.IntegerParameter; bool: RdConf.BooleanParameter; str: RdConf.StringParameter; s: Stream; res: INTEGER; BEGIN NEW(int); NEW(bool); NEW(str); NEW(s); s.i := 0; ASSERT(conf = NIL); RdConf.BindInteger(conf, "sleep_time_minutes", int); RdConf.BindBoolean(conf, "use_certificates", bool); RdConf.BindString(conf, "ssh_user_keys_path", str); RdConf.Read(conf, s, res); IF res = RdConf.ok THEN Log.Int(int.int); Log.Tab; Log.Bool(bool.bool); Log.Tab; Log.String(str.str); ELSE Log.String("error:"); Log.Tab; Log.Int(res) END; Log.Ln END Do; END TmpRdConfTest. (*)TmpRdConfTest.Do Для пользователя исключены следующие ошибки: * указаны не все параметры * дублирование параметров 3 типа значений: * STRING * INTEGER * BOOLEAN |
Автор: | Илья Ермаков [ Суббота, 09 Декабрь, 2006 05:55 ] |
Заголовок сообщения: | |
Вот только что сделал еще одну реализацию - которая, видимо, войдет в BB ServicePack4. Наконец-то отвязал HostRegisrty от реестра, все стандартные опции сохраняются в Host/Rsrc/Config.ini/[Preferences]. Предполагаемо рекомендуемый (во завернул фразу ![]() Выкладываю std-coded пакет с тремя файлами: StdIniFiles, HostIniFiles, HostRegistry. Код: StdCoder.Decode ..,1 ..,,....b8R7v9PuP7v9HePHfFH9P9vQRtP7vMWorCLuy0....ZOND
POb9RZPSRtP7vM.AO,... 1Ak...QW,...58FTuPE,5TWyqlKrqKKrGrtumdGLmGorCquU2hgnRAXDFTvMUn7FTvMf1G2sET fPdPMHfP9fQbf9hOO9vR7ONbvMoedhgrRiioedFWUkTeoxhmhgnpZHZijJC7ONbvM0.,.S.aFA E.QklbcjRAktgdjZgZZh2hgnlsDor.kay4.qorGqmQiig76FUHZijJCbnWmqmqKWKqtcw7.,.D v3A,wfLE.0E.cUGpmWLuOpoKqvCbHZiYpedhA704TeKKw.bHfEWUmL.6..D.Hs36.,sUGpmWbB xhYhAbndMHT9NY6Mw.sQq2Y6cwB.0.bM3w,QVJE.0E.kd5.86.QC18RdfQHfMf9R9vQ7ONb17. ,.D,,6.I16.M.6.JFA0z.U.2m,.58.AU0KyB.,U01,UO.,.16.c8.2UwK.606.d.1606.j,K.I 7AU8U.g3AU2U.I.AU5U.I3,U3U.Y4AU4U.Y3AU72.g7AU6U.g7616.F11s0kdk.e.A7M06.k.q .0kek.m.0kSF,8Mtr.0E..UO.,.16.c8W,4.072U4,311c06.D,.R.1.0kuk.K.0knK.1c,kFG .1.IBA.EjU4U.I7AUB.X11M,6.L5O.0kd.kHkzrobGoemoW0mdGLmaIraKXaKqKqtin4qk2aoa 0pb8Je0GXaKqKag2YBhgoBgg2Y9hgmphZZhg2YHBfHZe3hdvgVBAVIBfEhcBAV7QdZBjCBghhg e2Yx2Y,JeGBcN3YDpcUQc6BcGRbBAV7QeZRgoBhjphe2Yx2YExd7pdIhcG3YIxdUAc0ReIJe,R cI3YGhc1xdGZcBAV7AVjRheIbUIcDxdAhc,pdBAV7gcCZcvgV7AVABhnZie2Yx22.EdKoV.ohZ 3joJZu2YABhnZivg,aUVhhZdC,NEZeIcAfdB,tHB86k4ak2.YcdJiZRgoxBnf8,ND..10.UUgc CZcvUBAVKBcGhV76NHfQP79,tQd9N7OOZP9p767OOZPNUvgV7A,0JdyoVKIWKJdKIEWmtKqleH ECpmCKukI0GaaqtI3FN8p76NOOYZUod3xeg2Y,JcH,in4aEc83...sENPN1fQJ79,dH90.k4aE c....8pm4Km8oryKqeGEWmYuIEiqmaLR0mZKqwu2iHEyoeGJEWLR0GVy2M8N76ROF..a.....M GR9RJ76F,...MGR8J9uF9eIH79,,.......6HHvQe0....1eIkbMGR0QbUoe,JeUYhZphu2Y7p 7kI........b8RZPORvNJ76FNG.....Q6AZg.......wemBhohg0xhjZB...WLR0GV........ .AdiZie....H0.........m2...MGR86lfC,NE.A7.........b8RZPO.QB..6S.U1,...PM0. Eayqriqu0rYGrmqKEWmYuYmJbUAcCBfGhc1RbUwdJloeHEqomGbiAdohghBZvgV7cJ1GEGrw0r meHEiYmViYet3Cr76PvP7fC,tG91gdjZgpZhZRbUAgoZCp76LONU7ZiZNEd9RZvCPM03OFDOGR O0Fd8,tMZPN19R996196PPNdPM,NOdPN0GnyKt0mk0mnmqr8qkmKEOrk8ro4Klmqm0Gs4qtCrm GKE4qt0Gf42VPMZPMPPNdPNZ96JN8PM0HMMd9RZf9TfMJ96pND,NH99RuGv4KtyIleqRqk2akk UoBjk3YugbU.8rmCKeaLsin4ak2.hPOb96pND,,ggs3ijJiohgYRbBA,UVZgm3Yug5bOKb0RNE 7eIFdQHtCPM0.PvP796pNDuoYmoRqk2.GqmCrl0GRqXH,oe,ZdcQdZJC6J69,tIn0YeN3ecIid AZvg,.V9RZ96cH.UZ3jo3Yug5.qomGrkwcZZiI3hdRi7ZiZhhcAgoZCN76HP8PM09eH0Gayqr. QbBAVB..W0..Z0J76FdJ1eI8rmCKR0mUu2AZg2YC,98KdOFRuIHeENOFrN1HM0h0H9R9HK0mmm qmIbUg7MGsCM0HsQ5fC,NH91buM1fPRPNZvCPM0AViVu2YB,ROMPPNrN1HU7QioJiu2Y,J8aZl 2amYaUwd432sCk2aKrGrkeHE4Id..a2kRq.aEqKKrmGEaKRAdC,.HcMp7630sCPM0AVjdC,dET 0.akkmKqyopeHE.U0,PM0442Yug5deIfOFrN1HEayqri4EI8rmCKK0moGrmA3sQ5f95uPRfP9v Md9JT98H9R91.buM1nRqk2akfWoYmoW0GzCrlummyqt0GWyo4ak2aktsF99RTeMJfH1PPWGr4q qAZvg,Qc,Re33YnRgiYicBBR7Rn9QyIXqk2ak2mLEqomkouKuGpw0LK0maK4CrYuKuG3.8qwGr mGpw0LRqk2aU7QiZRgiIeZBgYB7d98RPMPHK0moamRq.akYOIECrmCKLyqp0GeWoWuo4a.HktC ao,VORdPGR9RhOMN98HP8Pk2ak2KIaCpWqk2aU7MMUuEX4IaCpWU7gcCN1HUw,sPTHeaLse1AV nhA8382WGr44IgdQbBU7A7UjFe.A,bvM.cETvPOpkmaWBZBA,akWm2k2AAER..HMFR0YDUVJim Zet3iu.HMGsMR,IcVRiZZet3icAZUgbUgdZVX3hVJiIBD,7JFOFU7sQ9XGVHZCwgcohVhBQCZP 8r,aU7VZlr6J.a.HWAhcC3ZnZimZYdQZl2Yy2YnRAUAhgi3Zd2YI3d3,a.CLuQfnRgiYC.gZlg fUIbx2Yk2fBAV7M0g6i1A,Crl.03b8RZ1hOMN98b9RZ99,tPLP8PM0Hk2gcA,Hk2MMUuEX.M0K Ibg,AV3Z7HeF,tQ51cEkw..HXIFE.M0CrmcIMGGLaEIuqkUdphoBgg2YghgiBZvg,A,BuHZ86H 96pND0HEGpb0maaIbWmtCKL.NWc69,7PAZhAaUYcDh,A,Crl.aIrGqmWLIaKK0mmkI.HUZZhZh hi2epZi7FfkouKuQfdhfdgV7k2gcCtCk2o6.qoYu2.m2F,NXd2YIxdUQiXp3.WWh6670A,C5U7 ,kmkI.HUZViMR.2adgV7A,HkWM1M090Eag6EbQ5sQQ8AV7AVBkW.CrmsPUVZhgx7PM09eH0GdK qkQbBM103.UusI.HlfUe2Yco8ICeX,,50...O3a4m0NXu.A7Q5Hk2aktCKR.C3u4M0aErER.u2 i1AVnZCplU..0mV.M0HXVJ5..A7w6.HMOp76H0.AVj,.rV0,6H.ghcUg.a0QiXpZ1,..UHVvk2 S3..k2C5D0.F,a0sE.R,YCw7PU7YDUdFe69.b1d0.3PSUu.HMO,dCvltC4kYYiKVdQbBA,aktK 4jeQH9Ra2F,m0HN1AVw,sPY8e1AV7p6b1EVyqrmKfUUY82Yd32AaUgcARe33Yd3YuEMgcC,Hk2 C5...Ey.44cCk2a2.MMUckS.CaV,,7JM1M0CLu2YuEF8mRq.aUnRAd1SomQeoJCS4QC.rN1M0C rm.Q8EIu4sQAZBA,akWmY7,.30a5.MOUU.k2o6.0XIla..N0mWAhcCNOR9R1P8HN9X7670A,Cr l.aYY,gAA3k2MORnki3,dCggghARNGR9Rh0HN1HU7MFRmRU7cF.g7.Ea.m2kkaWUYeD7H9eH.P NA.a.H1r06APM0Hk2g6.HktK4U7Fa.UdpBam4a.HMFg,6HKo4A,uYv.bvMC3qk2akWM0PkW66j eQHXvgV7g,V0.GKR0GWa4wBaGEyIsKKreWcYhjRgu2Y4BhgFLmorCqkGrr8rR0mYuYaBhghgg2 YnhgXZCIbUA6kbsEM8p76bONUg2YC,1md.6I....NOObHJ6PI5ktUV,.IbUA6..Y7Y3......U 1ZhZVU23I5ktUV,.I5..Y3..M1.UHhgoZcdJCUe687fC.kIin4I6o7Ad4FuG40mS0GbaIa0GeW 2M0GLmG2enSYgBA,9Wvk2G4,,ak4UUQeZZCgAkRM103.yIs.HeHCru8qtartGrmqKKQCUu..Uu sI.rN1o8YhdRioJ5BOOQCMGRfNTvCPM030EqaqtGLEenSocdZBYgdJiiYdjRgABhn78BOON1Ee WqoCLI8GFamIi1HsJUcYhdRC,t6,dHH8HH76B76F7PHXiohVhhZ3YX2YnhiW,9nI0GWy2aEqEE e1NPObHLgAqk2a.i1aIXYhdFEC022.HcI98JfeIR867POZf9T8Q9fPFdFH9P.G3YhdRCRlkM8R 7JFPOIYGRimRgWAZg2YWQcjphaBhbpZdphdJYg2YnhAkIqk2akWm2M0.uoYmo4ak2o7PkWuYUw dkhArN1PMFR8FCJuG4O2cUXDJ9X1xhiZimxhgZhZJinp3dnVGLtmKWKqt2Ul1.UiQ6G5EWKqtC K.Q6AA.cQ...sQR,.G20EtV.UIU.U72U.E..k.8ssHpmcIf9P9fQbf9bWGhigFWE.4Te.sQRdI f9P9HWE.8z,E.0.LJ.w.QI,E.0U10.bf9bWHZitZhZZcZRC,Mw.ELMSN12Umz.0U..2,I96.IE .EL4IuMOU2tQ0U2U...G00k.0.0.0mFf3,E.4vl5UTyB4.4.0E.cUZT1E..UO.,.1.e06.2UEC .6..mEw7169rwKiEw3c0Cy2,U1xB..0,0..606.k22.0sfCbsQXX8Utj00MyfU.Qfc7ix6a.6r ,... 1Ak...rc,...58FTuPE,5TWyqlKrqKKrGrtumdGLmGorCquU2hgnRAXDFTvMUn7FTvMf1G2sET fPdPMHfP9fQbf9hOO9vR7ONbvMoedhgrRiioedFWUkTeoxhmhgnpZHZijJC7ONbvM0.,.S.GvA U.QklbcjRAktgdjZgZZh2hgnlsDor.kay4.qorGqmQiig76FUHZijJCbnWmqmqKWKqtcw7.,.3 M4A,IzMU.U08J99SdfJHPNjvQCJuGKfaqmY6MwdONl1QCh0708T,U..w.YoMU.sUGpmWbBxhYh AbndMHT9NY6Mw.sQq2Y6cwB.0.Rh3w,ooKE.2.gL2U00.bnUGLu8ro8quGrmCLWKqtE0E.kHE. 0.p.0.4.I3l6w1.0E65.Al16.1cUZT1E..UO.,.1.e0.,6j3.O.IW3k.O.oW,k.2.Aw5k.O.w, AU4.Tg.AU4.LQ.wzBxd2heAhcU2djRioBdiBh4BhghgnRbBgV7AdB3eDJeI3YHZiYB7.N76b8R ZPORvNb99,dFH9P91FuPbHXaKqULBhiBckBhg2Y9hgmphZZhg2YH3YugbUQeNReIhcBRbBAVBA VIBfEhcBAV7QdZBjCBghhgUgbUQeoZA.umZKqwu2in4ak2CpmCKuaqruKEqHE0pbaIbGpW8JEG pb0GdKoVyIdGIEWmdGLm.kdKqlG5am4ak2aEnaKqKKR0GYyqt.bHXKLqmKb4qqK4AViBghhgu2 Y,JeGBcN3Ymgaq2YDpcUQc6BcGhV7AV3pd2RbBAV7YcdJiZRgoxBn96v76V0....6FHfQ91AZU gcCZcvUBAVEJeDRc3ZcJJe33YcQiZRgu2YHhgXZC66NOOb9R,78HdC,tId9N.6HHvQdvCPUKBc G3YgBhn79,7P1vQdfC,tId1.UvU7AVWhiaJbUAcG,XdBb7Cd76TeF,,in4ak2AVmhgnZZUAhg2 YeJbUAdCZe3xc3Jevg,3OFDOGRO1HM03XUIbx2YWIYvgV7AVmFEenSwedpBoZ5hgo3emBhqBgo hgEJijpgdZBbON51SJICrmCKLuqkqag2YWhiaZZUYd3pdcIgppgdYZUQiZRABPOAZvgV7MO,dC v76VtCPM0SJYaIaKIE8quOqhaqi0mF0GMWJEGobqk2ak2aIX0Gq4qt2Yx2YCBdA3YI3d3pdBA, HM0ROFj88NPObnIiHEmqkC5pND,7PHvQqk2ak2KIaCpWqk2aU7o7MMbHLuqmWLuamR0022MMbH LUBAV7MFR0cO,dCvFM.j02ZWhia,kI0GH0GIeKEmHEmoW6P1vQMMPnIqmMaGEGobq.akYcMffN .3ND376d8G9GEmqk.QfehfUIbxcMf1gcARe33YgBA..0Hg0mWuIW.HMGRuEFNOHtC,NGRuEFdO HN1HU3,6P1vQd1.UvgV7kYkogV7AV3,Ie3ZeJJeC3YgBBMFRGEmooCbvk428..p,UdsENPN1fQ rN1o8IgpdC.8HEyIX.k2aEtcC,NGR0U0,cMOqh0ni0GRq12YWhiaRflgfUIbx.Pk285,,jGr2C SJtaKuKKcAhq,y4Q851S3CKLu4m0Y3bPNoAAZBAV3p7CIqK4M0P...p,UdcI9PM7vIdfQ66FNG R86LPNnfC,tG9PSR0r76TOJd86bfC,NEZ0yIX00AZvgV7cJcQ9vQp,.M0HcMOKR.AakIao2YDp 6kRcE.85.U5,..b8RZPOwecQiZRgioBY3LPNn99,d6FuPb9RH0sQuqrGLXyquuKmKKm8GK0GlK 5m284HVnVaVdQ5Ad4,,t6,d6FuP.sQ..,7JFWBk2CrmCKLyqp0GRqXIJeJhcvgV7M00GRcMYYB AV7gcAl4AV7MN.oc,ZdHh6gcCN1H.,dI9PM.in4ak428..pld..aIrGLEWmYu2I5.i16Sp76He HUdQ5o8Qiu2Y,,8HO00.AV7AVmFR.sCI6.b1ZON19Nb0SKIiqmaLKM8rN1HkYOYnhgXpZjFeWo WU7QeoJCQiiQ8ZPOYejBdiZicQig2YsZZUIiZRidQbBk2C5ERcQ9vQ,ND,7APM0H.P.00A7dvC PM0PEc..I5b0.cETvPN96FNGUu...8obyIaKoUuoIin4cJMOp76HeHw6..b1ZmkA7WmpKqwmWd BZvg,aIXUiwBG3k2WLEenSAhUQYU2aBA,M0PM09WU.30rN1HUE,.cC..A7mooCbU2Z7,e1..lX ,J8sHAdClXEEOpU8JEmqmuKR0mY.a0o8QioJiu2Y,,41U1,AV7AVdZZUohg2YqBggZZUQidxgu 2Y7,QbBcE.C58ZVtIknW0mWnZimBZvg,aIXUiwB.AVi3Yug5VtC,NO,dCv,Pk2akf.b9RZvKHP LC0l8670AV7Fr0GTqHEmoWuYsBZUYe6h6,tQ91I5O2QbUIe3ZeJJ8KIbG2M0hPMN96pND0XUQi dxgUIbxMArN1HU7A7CLu.v763N9376d0Ahb,PNAr76H02Y3,M0j02ZnZim,xND,d6Vd6H76B76 CLu.tND,d6nd6H767uH,dR19P,,X7A,d8,dR19PiGEyIdGIICLuUd2Yh2YDJe2d6Vd6iHEa2.. H6SrePv86pVnBhbd8,dRQbBA,akY.66vVgIYUY8MGRuEM1ak2akWmY7pcUQCUX6AYe6VnhA.O2 .k4ak2AV3p7r,akYu2RP8PM0HkW.YhZphUI5uq4aU3l4UU.HGuUvM1H6I.UZdC.kf8roGbHZCw gU.cC.kY2YnJ510w7EdaWBEfEtcC6JS2.UmFEe1jGrUL,Vmo.y4Q8kfUioBY369YZUQiZFnkI0 m4akWkf8rosIUvM1..cCC3.U7pho32sOI5.iXsJbUA7Ud.ktcC.4HP0mb.i1.Q8ktAdiZiIxhH ZimBBWGwmGECLuA3sQsJZPOQ8UfFK6RgV7g6.a2rVB6I....U0xhjZhU.cC..82.cJMO.sC.kY OYs3YI37AhUI54HEKIaCZUAhUI50HEKIbk2akt.MG23Y3Hn2ak2qU3,EVkRM103....MGY72Yc .I5.MG2ju2Y,,y2H0M8EfUgIhg2YUohu2Y7,QbUQioJiu.cAf,Q666eHE42MA.k4.Er.rlo.qU 7w8Er0GS00U2xdBk2aIX2Zi3Yy2YkAZUo2aKEmHEm2CLu8rIaGEGJYktGbPVuEFmWv2Y7pd1NO 00.b0QC.Uc2jPphRZZUQid66J96pND01sJUcsKJPL,t6,Vd..UdEW2YnZCr0sQreOiHEa2sC,, eaUgcC,AdCFrk2K2r,HeFaKEm1.H76d8G.r06Al8698HbWnZCmoWuIIkIgZUAaR3Yu.o7kt.sI .LXgsQdXBMF22kY.i1PEc.kXKKuOoumKqUU2ZgxhXJbUocdZBbHayql4KuyKtiHE66BPONPNpl U.T0EEyoecP1PP9fCW2O2Cb4,M8rN1o8ogu2Y4BBkomavgV7M0H6Rp76LONZ1R7Jn9Q9vCP.Hc NKKqGKR0mZ.yIleKWKqtCqRqk2aU7ICe1.q..OKEe1BOONntQioZg2BhmpZDZhY3ZgxBN76BPO NHGmGEOoUm2HtCMGBGn0mS0Gb.g,aEn.sQ.odZxicYhjRAOoU.M0H0CGEuoYm2.aEnuGdKqnaq tGrm8LIOqomaYEF8GK0Ge8peYZUIiZN8M0akYcQ9HECGE0HEGJY.aUa32od7N1HM0HM09WBM0. K2rV7A7O4EE.6R,dCvlZKKtUIVDpgcogdQbBk2OKLCIqyqtKqRq.AB2Yu..FPObfFHPN2ZoZZU cP1PP8mIi1QeigdDpe33ZHpZKBcA3Z7pdI,N76BP8,t8,dNHPNNHLyKnOqtmGECJL4IW8JIuqk qadYZU2dj,QCVPMd9ONONRP8PM0HEagcBM0HcP1XUIbxc63N1HM09eHqU3FESomG5.rN1qUE,U cYgu2Y2BhmhAMS0mb0rmuKEWGqyau.6HAAkY.mGECrmYCIbUA6.UdIbUQeZ,in4ak2O3uqkqau .UndFf1sCAV7AVnFRQ8.I6o7wcZZi4,68NvP599O4mWiBAamRkYOYiBA0mF0GF8GEGJY.HcHsQ 9nIin4M0bXioA2Yug5RPMPHGin4a.ErEEe1bPN59R67rN1HUG,0mtKaBAV7gcA,.cHH8HP.Rm4 UUwdkhArN1HM103...66NOObHEWGqyau.CbAlk..e1..EuA7UnlosCcJ.e1.cF.i1ak2mqoCLu m0cCC3.6HsCk28aa,EO0nQOHEy2kRqU7M0ZXg..kRcEcHsF.EIEK.N,A3cM2YuEFQ5aEt66pVL dPkX..UHhgX,ROMPntSJI8quOKK.3XdErkIUd322avUL,8aaRfdlF2aM3Y2,HMGBGqEEqXC7H, V3,HM0R0NPOA3.pVgBBqU7AV3Z7M0aEbUVFLgAa0EEUVFLUBU3p7r,e424kf.FdM.kIUe,6PUV VhA4M1M0NPMb1sKcCIAkRqk2M0HeHABkVIBP.90Eq..EMWpRU7VdN1g6UGVGFq.9WUY7Q5qUE, .6F.6658P9XU2ZgFR.bXjNM.00I5.T0M8r,h0B1sQOoosCM0HcQI5.EVEbEXaKqQC7POZf97ON NPNdPNF7PTHK.7N8rN1HEn00O2C5cH.YeGh8HtCP.RdIsQ.YYgEFcF10N76ZXdU7kVUBAV3p7C YZlRM1.U7phdZivg,HcJ6Np76MNUvg,30EbEmamRqU7QeoZg7FXktQ8d9FHfQ.F7NHN1HMFMGR POd1PcE9uFkYuqoGr4KIbGY6xBa2B0IklbeZlVyKrGLtyKqmqm8rtumdGLmCIu8LqGomCrl0ks ,.ELCoruKu.GomCb.sETXV,.Z1...bf9.EWE.8D2.Y02.A,,U..U,IklbeZFdKLqKKtCLLC3ZO RNX2V.AyI,ktuGdKLqKa2V.Iy12.0E.ses,2UXW.2.52.CLLC3b8Rn9P99F9vQ0ks,Uikwm46. Zz,2.,.60cK6.,U00.umUG5kmY62.7.,..Y22U,2.2.2YXK90U.AqXD.zwP0k.0.1.,6.Ikmj, 6..EBU.U,.J,U.2m,.,.E4Wj.Y,YZPS9L6y0I,5TW.kVy4..V6.2..E2E.U76.2kLRClt45J.n T32kwL,,sKFHQvFA,I0.... 1Ak...oD,...58FTuPE,5TWyqlKrqKKrGrtumdGLmGorCquU2hgnRAXDFTvMUn7FTvMf1G2sET fPdPMHfP9fQbf9hOO9vR7ONbvMoedhgrRiioedFWUkTeoxhmhgnpZHZijJC7ONbvM0.,.S.4r7 E.0k,5TWyql.bnayKmKKqGomC5XzET1.PuP.MHT9N9ntumaU2,CJuyKtQC98P9PP7ONbXmb.2. wrGk2kP9,,E.cUGpmWLuOpoKqvCbHZiYpedhA704TeKKw.bHfEWUmL.6..D.1f2E.CcIhgsNHT 9N9ntQ8qorG4704D.CbB,708T1U.Ek1,T.lC22U..Ti,cU.ktAcoZimBhWhiohgnZcZRCY.2.w 22U.EBE.0.4.I3tfj1.0E65.g0AU0KyBU.2.C12.e,2.AU.Ue.4.072U2U,.,c8fP3bOY3E,5z dGLmWom4KmKKtCLLO3U.s.E.sIE.cDE.8.BlRo2B1Fgh3.BFmo2r,V1F2J,tfj1.2G6.1..,c8 Ye6r.3Qwd0ZORNPNZvQRtIdHdKLq6F9vQ59.X5.bf9ZORNPNG20Et,,U3X5UfW.2.52.CLLC3b 8Rn9P99F9vQ0ks,Uikwm46.Zz,E..W.840E.cU.UiAco,.2.7.,..Y32U,U.2.2alK96.DOa1k Dz41.1.3E.9H,2su30AUc,,U.gjPD.BD03E,5zdYgABhiRhnpZABhiRh2hgnV1.,UD,,U4,,k. u1CJuGqVqKmCLLyIsKKrGpryKqGoo4KqyqnWmHCpwCLuKqqyGdCLtCqL4IlyquGrHmGESmU8qr 6638P1vMLfET9SDN88E,9z4U.kNU.EBE.0.z50EJ0.Q.2Gk6k.0.,MT.IyIU.UW.,U6U..M.V6 .,U.Ux,.6.6M6.cFE.AUyUH,......D,UU..A0AU.E.q5.U.UWU.2.W.0.U,o,AU.Ux,.6.MLE .sE,U.2.1sCsI.U0Jijxinhgm3ZbYcjRgpxZ0JchYddRgZphnhgbYZUwY0ZhVRA66NOO5PNkII UDU,2.gD..,.3,,6.2,2..1c1M.,.Xxs1EnVlX4xhgZgnpZ4xhgZg2hgnRAU.2.e6m.K52.U1K y9.,.s1sJ6.,.O10E,9z4U...p.0.4.I3k.E6V.w0wzBAVh2YNBfNBfBhd2Zcg2Yiphg2YioZi gV7A.Mg.IyJ.,UfUAUF.,k.U.G..1M1M.,U.AK..0.t9.Y,wA2U..QEU..w,A76.EPU002..c4 E.k.Ue.UE0,M00Uz1Rd9R,6.X3.U.kJE4k6U.M.E.7.U,I.,k.0.0EJK5F4Zz16.,UgV5UN,,k ,B06..F.z,,6.IEb.0..Y22U,.,.V,2U.w6.k.E.0.1M,kbk,8Mtr.2..c4E.k.0.eG.U.E.mP ,U6U.g4QU8.n5S.0EHl,W.0EIl,i.2O0k,.p1W.0Emk,a.oA616.Py.wzBxd2heAhcU2djRioJ eZxgdRioJitRbB2ZeIZBIU0AVkJijJhZRgoBVx2YWIcgBgX,3N1HsPZvN1fPHfS19RHvPRP0v7 63tRjvRRtP3PNZvPRf959O3N1HsMTfPdfQHfMwhmRi7gbUIYDJgZJC0mqaql8rrCrwCLusQ3N1 HcR9fQbPOTfPH.3sInvQdXjUX,IUWgV7QAVPSZPOD9OdP0v76...UgBhXhAAVx2YW6FTvM.C4I UWgV7QgcBgixgZRi7gbUE,8m4akoCrtKrmCr2q1E,qEJemIqk4akYqIcyIdGJESpouqU0romGE WorCb4BhghgnZZUYcdBAYZUQeoJidphbRig2YH7NHePHfFH9P91FuPA7.rN1HM1HcJ1eI,7PTv M19P9PG7f8p76HeHdOFDOFZuCPM0HM0bPN5fC,tId1.RtI9vMdPOTfPrN1PM0VeITuE98FfeI9 86ZmkGqdGLtEJ0GIqk2akpKqweHE4Id8pUaJEyIX0mdWob8JeCIY4IdiHEOpU8JECLu8LR0mU8 3...IiZRiu2Y7p7k4akIin4ak2OpUsQp761eIENKHP0mbOIECIY42PEVKoXaIbqk2aktc9ZON1 9N.FtO9PS779,tQHtCPM0aIX0mtKqlumriKEGJYKIbqk2A,dHEenS0mdWob68b97HtCPM0aEtK qt0GRqHE0n4ak2KIaCpWqk2ak2.gZlgV7AV3pd2hV7gcC76ZON11kRqk26I..aIrGLJ0GIiqma LR.w7C3Q666EweHEaIbsFQbU.Z1.AZvgV7I6.bPNI811WmpKaYEwamRqU7Ad4,y4EE8rm222aU gcARe33Ymhgn,PFEKIbGo4..in4ak428..3uPT9PJ76F,p,...EwcETuHNOF1eHr76h0ZXu.S2 EV..Zmk.FtO9HG.A,B0wB.666A..q0..UvgV7Ec..A7mooCLueGEW0e1...UslU83U7p7S2r,I Ce1.H,O3mqmuKR0mY.in4..I811UcQhZ7769,7P9fPHtCPU7p6kr.UUUk..M9...kRqk26I.sJ ZPOdPNb8RZPOSKJsOI5.sI.ktGLt...M8rV0,.SJtaKu.23Y2CLu8LGam4akWu2jeQH1Uv...M GR9RJ,I5...rFweHEa2S2H,...23Y2WrIqk2..i1..U0xhjZhe.e1...EV.amRq....23Y2... r,..kY6Hc8Uu...UKVslU.MG.....EIEG...UvAVBgV728.I8gdZBgnhimhgvgV7AVKVmFR.sC .Et.Spou4umXKKu0JtyKnaKqAdiNEFd6HfPd9P379,d6HPH9PMb1379,NAHtCPU2BhVZBumqKK u8roCqdartggh3YugbUIiZ76v76VN1K283.Q5q..MGRPOdvCPM0HcJcP1PP999,dMRPMPPNp76 7OO11CJu8roEE8rmCLK0momGEOLR0mY...h96pNDS3.Opm8rtEIamRqU7YhjRgVVY3YugbUAak IaoQb72Ze2YpRiZJiUYgZpgVhigZiUIZdgV7AViBghhgUIbx6GTX4VnNMV9QROMPHGin4aUWph VhB,,3dENOE5uG3uHle6r76H96pND0nRqk2we6BdAhcU2Zd3Yw2YsAZUoYU2Z1BcE3ZiBghtKH PLH76v763fP11EWyIEaIbCIIaqI0mWuYvg,aIXAhUgbU2bUYe6h6PU7oB22I2N1.HMFNmYOIEW Gv0GS0GMaGEO0hnayIW0GNKHPYbUYad2YI3d3,HMO,dCvlMin4aU7w8Er4qqQ90mF0GMWJEGob qk2aU7A7WGr44ETqHE8mU8mI0GH0Wi,6Dv763dK3N8,7JFWUohV,IbxsEFeIFtHZ8FFdP11A3L 76TeI7GF4KFaGEqGEyIdG21e6aGEK2U7AdCRcck4ak2akWuYBM0sC6F.19QUUUiBAG0.cR9fQE EenSAapQbB.U1BggZhcIYHZiVJiohikpZHhgohikJYg22379,dQ9vQHtCPUGhgVZA.kt66pNDC JuG4HfFELyIsKacIY6xhnZiWYZU6IZPNBPNZPNRvM9vQ3N8PM09WUAdiBhol48oWS2AdiBhohV 3pd27GTXGVnlwuG,5TeK45uPR9RyKqmqm8rtumdYg1ZimZh2hgn7.X5..RtETfPd16FCb.sEMM Ui.Z1...bf9.EWE.8T0E.E8E.k2U..U,IET.0.19.w.A92U.sU.,.60sD6.,U002..676.16.6 .665hK2U.2U5VT0M66.,U0O1E..US.,.1.4ItaqkmaUbl,.,6Y1.0.UA2Tm.mmBjZAgYvob0Cy 2xBq4sET1.UM2.,6..U6U..F.,6wlgR0Oxad.az86Utj00uDLaUojC8.Ty,... --- end of encoding --- |
Автор: | Иван Горячев [ Воскресенье, 10 Декабрь, 2006 08:39 ] |
Заголовок сообщения: | |
На моё ХО все указанные варианты недостаточно обобщены. Как то была у меня мысль хранить все конфиги на LDAP-сервере, например. Так что предлагаю обобщённый интерфейс для доступа к настройкам, в стиле Oberon-way так сказать. Достоинства - расширяемость и полная прозрачность для клиентов. Конкретная реализация у меня только одна - для реестра, и под несколько не такой интерфейс, доработаю - выложу. Код: StdCoder.Decode ..,1 ..A,....bOSb9R9PPTNHT9NTdI9vNHvQdfQnf9T9N5HdKqna4wZBxB
CJuGqaKqtCrkSqmCLLyKmC4..f8RH9Pbf9T9N.ei,... 1Ak...9i....58FTuPE,5TWyqlKrqKKrGrtumdGLmGorCquU2hgnRAXDFTvMUn7FTvMf1G2sET fPdPMHfP9fQbf9hOO9vR7ONbvMoedhgrRiioedFWUkTeoxhmhgnpZHZijJC7ONbvM0.,.S.Wk3 E.0k,5TWyql.bnayKmKKqGomC5XzET1.PuP.MHT9N9ntumaU2,CJuyKtQC98P9PP7ONbXmb.2. oe8k2Ebe.,E.cUGpmWLuOpoKqvCbHZiYpedhA704TeKKw.bHfEWUmL.6..D.lT06.,sUGpmWbB xhYhAbndMHT9NY6Mw.sQq2Y6cwB.0.360w,Iz5U.2.oW0U00.bnUGLu8ro8quGrmCLWKqtE0E. kHU.EBE.0Uk3A2.JFyuv.A.2m,U.Q.AU0KyB.,UoU.UW.,EsU.MEZPO19P,tEneImLT,072U4. f.3cUZT16.,UbU.2.e,2.AU.Ue.0.,6YUNU1Ikmj,2U.EjU.EBU.kzV.I3.0ES9.g,IUQU1o.I UbU1200E,m,Ck2Ub.X6.65E3UyU2Ikmj,2U.EjE.0.p.0.z5,6.J,U.2GE00.3M86,96.IUE3. Gk1E,W2,.6F.MBs.9.3caM,3gwP.,6..EBE.0.4.I3.0ES,D.u,Kk1UNU1I,IUHW1w.IUxU3.O H.s.J.36lM,B.u2yTIem2aOE8HM0HPakYOrkuKEuIL0mXyKtarkCKoKKvaEJam4qobGoemoW0G dKqnaqtGLtarRqk4Gpg0pWqk2SItyqu0raKqtCrkSqmeGEqHE4IVCJe8pUCIe0GdKoVyIdGo4a kWuIWin4ak4akXUe2Yx2YExd7pdIhcG3YIxdUAc0R8...cI9vNH1qomCrt.A6.....eGEqXE,. ....Goo8rmCKuyathdZ,U,,....Ue2203....aErKKwGLEeHEGoo8rm.PM09eHUKBcGhV7YgdJ ih2Yu2Y2,kRqUEJeDRc3ZcJJe33YcYgUIbU.Ud2YD3iZphh2YcAdC3YkBgo3hUIbUAcGJe,BfU wd43Y13d,Jed2Yu2YGhgb,mGEuoWSJK0mU8od.rN1VeIT0.6F.EY4KrGKqKKJ0GIOpU8JEqqtS KEeHEG2.P0M8N76R0.UB28.cQ,dC,dI.aGE...I8.P0.....sN,dC,tFZvPfnI0GY44...g7.. ...kb05J76FNGR0U,,...Q5hOEZ0,dCG2.rl28rmCLEeHE83C5cE9uFHeHPM07Xx2YYBhmRbBA VL3d7Zd33YY3YX2YCBdA3Y2xdBAV7IiZVx22RtHVPNR98VPMdnIin4ak2aIX0GtKqt0mF0GbEe WoWuIE8pWGpe8Jb0GtK49eH7uCAVY32ErKKwGr4akW.ZOFdOJcHH8HPMFR8F,tHVPNin4qEc.E V8rr4KmCqkCLueGEWGf.EW.MH.in4O3,7N,dC.kR..MO..UUY6ELWokuKm68PvQDP8rN1HUU.R ,.PMFRGE8Ity4kRqk4.UHhgoZcdJie2YcYgU.K4M8rN130RW7p6F7NqHEuoYmoI0mb8JEWGmuG rEECGE.d8G90.9eH7W7YgiohZVuUd,7PO0GRqHEgV3VHhgoVvM1.EdKqqyKvKKWaKte00GRUZ, Q5hWBsMffQZ99,7QZPNh96p7670UvcEcHQA2Yug5a4aEs8rmO5vFbaYvgV7w8klKLt8bX2YCFE .HWXhimlS0Gm0GeW2PM0HM0HWkJiZlS0GbEeEEGqo8LEklK5RdP99SgcARe33YkJiZd9RPNcC. u4gcCZ6AV7Ie3,PM0HMFRmREs85,dC.rN1HM05PR2Yu.o3M1k4EE8pmq4kRgV3pd2VbtQc93Qw dONQcjphoJijZhghgmRiiQeotEdfQN9F9vQ59.XrmW5.ELCoruKu.GomCrl0U1VVVm,IC...Qi i..70,cwE.E8E.k22.,6..M.3QwdONIepZhZJinpZHFdKLq6F6.XDJ.QiiIepZhZ7F6.Zz.6., UfW5UXW.2.52.CLLC3b8Rn9P99F9vQ0ks,Uikwm46.Zz,2.,.60,E.e3,6.,U00.umUG5.70,E 0E...7,,M.,.,.,tcpW.6.DOa1kDz41.1.,6.Ikmj,6..EBU.U,.JFkns.U.2m,.,.E4WDN.Nt arm3Wj.Jklb6.Qcj,.E6E...F.,.aU.E.TptYZVQI,AzJE.nT32UP3BNB7l20v.... 1Ak...B,,...58FTuPE,5TWyqlKrqKKrGrtumdGLmGorCquU2hgnRAXDFTvMUn7FTvMf1G2sET fPdPMHfP9fQbf9hOO9vR7ONbvMoedhgrRiioedFWUkTeoxhmhgnpZHZijJC7ONbvM0.,.S.ew5 E.0k,5TWyql.bnayKmKKqGomC5XzET1.PuP.MHT9N9ntumaU2,CJuyKtQC98P9PP7ONbXmb.2. 2XDk2E6y.,E.cUGpmWLuOpoKqvCbHZiYpedhA704TeKKw.bHfEWUmL.6..D.ph1E.CcIhgsNHT 9N9ntQ8qorG4704D.CbB,708T1U.EWn.T.tB12U..7z.cU.ktAcoZimBhWhiohgnZcZRCY.2.w 22U.EBU.6Q,1,EJYjyC.1.VQ.6.5.1cUZT1E.6B6.c6E.2C6.4ItaqkmKECog8ZwpLUE0,c,k8 E,8Mtr.0E.s76.,UO.,.16.,Ue.0.,6YU.F.CE,9z4U.EKE.EBU.kzV.I3.0ES9.g.IULU2Ikm j,2U...p.0.z5,6.J,U.2Gk0E,i.Gk00.W,0EBE,4.CE2E,W0G.IU0U2A,646.n.4.Ck3E,S0G E0E,4,A,IUb.9.G,GE0E,i,CE4UbU2g.636,7.3c46.h.3M.s.L.3s76,E,4,w.IUYU2g.IUI. 7.3.GE1.s.UYU2g.63E0E,e,CE3E,G0Gk0UI.7.3s56,B.G,C.676,9.G,Y.IUZU1w.IUYU2g. IUI.7.3c16,B.363s.UYU2g.63E0E,U12,IUYU2g.63E0E,i.GE1UIU1.3676,9.G,Y.IUFU1. G0Gk0E,G,Y.IUCU2o.IUIU1.3676,9.G,Y.I.s.D.3676,9.G,Y.IU86.GE1E,G,C.676,9.G, Y.IUEE.Ck2UYU2g.63E1UCU2Y.IUTU2o.IUIU1.G0Gk0UI.B.u.GE0E,m1yTIem2aOE8HM0HPa kYOrkuKEuIL0mXyKtarkCKoKKvaEJam4qobGoemoW0GdKqnaqtGLtardGLmqomCrt4qnKqtin4 qkYqIcyIdGp4aEWaqkmqrSKK0GdKqn.rN1HM1dOKVOFPM0NOOb9RJ76v76VuHHeHdOFZ86duH, dI9uETeI7O1HM0RPNl9RJ76p76NOOb9RrN1HM0RPMPPNJ76p767OO19PoZHZimBhixgBAV3pd2 RbBgV72Ze2Y2BhmhgXZijNS,NP9vQb10GJam4akdKKuKptKKteGEqHE8pWC20GI8pmSanViYcd JiZ,qomCrtkIqk2aErMNmGE0rkCrtSrr8LmeGEe144.M0.EdKqn.,NP.b1Y7wcmxhp3inJZUgb U...RdI9vNH1qom.H,ZPNbf8,dC,7HM1HMFR0HM1HsF99RDeQTXe2Yx...u0.P0.u49HE6F..r N1HM0Z1cI91c9DeQTPRqk2K2U1JiZBgohg5JijhCJ,..UG,MH...70...I8.RtFk4.EIsFZvP2 Yhhgn,b1.hOMNPR9vQJ76v,..cI.q2kIEtUu6HM1.sFQeoJie2Yx...umXUBhgn,ErEJEW.... ..UaxhpphYJZUEVyobmoW4Ibqk2KIb.C3b0.......Y6..cR19PJ76p,.UBA,.S2MOIZUg5... ...91..Q5ICUExd7,kU8Jd4og0mbOIECIY4Idin4ak2O4.30..C3.J,......U2,.Q5oCUE,.. .qk2K2U5lYuKueGEq1...MH...70..85EayIbSoYuIein4ak2O4.30.UBsIA7MD...UB,..Y6. .cR.N0M1HMF.S2ZON19PJ76v,......6F..Et.8pW4Iain4ak2O4.30.UBsII8.......U2,.. h1eXGVBAV3,sFIcjxhgJZUg5......U2,..Z1cE.rN1HEn..k4.kdcE........70..O5EV..U 5ldKKueGEq1......EW..Um,Qe3Zevg,HcN.pFV..M1C3b0q1......EW..Uq,Q8qk2.sFIctZ iZRie2Yx.......Y6..sMTPRR9RJFRY7Uvk285I5V0K2..3OKdOFrN1HM0B1cC82..PkdcE.v, .kt.ka...G2..QAUu6H.rV7oCUE,90..M1HMFR0qkWuIW0GdK4kd.ktuG,5TeK45uPR9RZvPN9 P9fQbf9b8R7vEdfQN9F9vQ59.X5..RtETfPd16F9vQ59.C24485Et...ktu0.Y62Um1,.d.,.H E.2U..U,IklbeZFdKLqKKtCLLC3ZORNX2V.AyI,ktuGdKLqKa2V.Iy1U.2.i8SU.sc6.,k,,Un pZHldGrwmqmGomCb.AS.c9Ajg,0EtT.2.U6E.e30E.cU.UiAco,EWE.Y.2..EGE.4E.E.EECOh U.wcNC.zwPA.A.2U.E,9z4U...p.0.4.I3,DX1.0E65.2..N6yY,YZPS9L6y0I,5TW.kVy4..V .,..2,2.M00.,wJbHK4mF3kwL,,AzJE.iJoYpY2H.at1... 1Ak...kQ,...58FTuPE,5TWyqlKrqKKrGrtumdGLmGorCquU2hgnRAXDFTvMUn7FTvMf1G2sET fPdPMHfP9fQbf9hOO9vR7ONbvMoedhgrRiioedFWUkTeoxhmhgnpZHZijJC7ONbvM0.,.S.qO9 U.QklbcjRAktgdjZgZZh2hgnlsDor.kay4.qorGqmQiig76FUHZijJCbnWmqmqKWKqtcw7.,.r T3A,QyJE.0E.cUGpmWLuOpoKqvCbHZiYpedhA704TeKKw.bHfEWUmL.6..D.vQ3E.CcIhgsNHT 9N9ntQ8qorG4704D.CbB,708T1U.kHD,T.zw22U.2.op0U00.bnUGLu8ro8quGrmCLWKqtE0E. kHU.EBE.0Uk3A2.JFyuv.A.2m,U.Q.AU0KyB.,UoU.UW.,EsU.MEZPO19P,tEneImLT,072U4. f.3cUZT16.,Ul.,UO.,.16.c8U.E.076G6.n.3s0s.3gwP.,6.260.I16.wT2U.I3.0ES9.2,I UH0l.3s0s.N.W7GE,9z4U...p.0.4.I3.0ES,DE.IUcU1A,IUQX2w.cJ6,UMU.g0s0s.D.36ps .Ug0UfX2o.IUNU2w.IUTU12,IUTX2o.s7k1E,00,s.N.3sv6,B.00,6,D.367s.L.y8GE1UB.D .3s6,U1w.IUpW1g,IUoX2o.M46,D.KG.s.F.3ce6,B.3M16,D.00,s.E,G9C.IUkG.GE1UBU2w .662U1.3shs.D.3sd6,B.q.w.IUTU1.3MiszFd8HMe,dAV7AhN0HeR1fP,dHR76DuPZPS1vMFP NhP0JN8PMHT8Ff8H986ZONDPOb9RZPSf8RH9PbvCPM1HOHVuHZ8JPM0ZONDPOEK0maCrnCLEen S0GdK4kdGLmqomCrt4qnKqtin4qEIeGEGoo8rmCKuyat3YhhgnRC66JN8PM1VeITuE98FfeI98 6bONdPJbPNZf8,78HeH,dP1PP999,7Q1vQbvRTfQ796p761eIZOEn86TeF,tEFOEZO8rN1hOEZ 86P96p76PuQDHLCpmGreCbmRbBIc3xc7pdBAVhpZiBghhgUIbx2YiBgh77rN1HMPR7Q1vQb1MD ,7Q1vQUYQbBAVGhAUiIcmxhVZgXBgnZicghdgV3pd23YHhgotQ85P68IeZxAEEq4...wcmxhp3 i33jdRioRie2YcIiZxgUIbUIeZ,oZGhgbBBsC,NGR86EE2Y,,.66p763uHT8H9OERuCPcJ1m4a kq0GR0maU5hgoxcmxBin48oW.1uIbOFZ8JFdQ9HECGEuoYmIK0GN0nIin4akqoBkSoBY2IiZxg i2dVphYZhZ3ZhBZvgV7Ie3ZeJJeC3YhpZmhgn3YX22gV3pd2tFZvPg6kRqUEJ8.ggox6c8,78Z 1p,DntELkoUv.EE2Y,,.QbUQgmhgVZiZ3Yu2Y0,AZUI5Z0ELSItyquQ5hOEsN,dCq2..HsM,dC ,,QcmhAwcmxhpV0,kd.2YX.N,knuGr4qqkS.7,Z1.SqIin4akYOIESKL8rmC5EEGJYKIb0GdKI eK3SKLU3pd2RbBMGQgmhA2YI3d3N1HM05f9RPM22.7,HcQ91.5P8rN1aEdK2sMRdQ9n4akWmod Ko4ak283EbaIaqk2KIbGo4KIb2299R.qEIsFZvP2Yhhgn,...CJu8LJ0GISKEeHE83C5.iHEaI b.,FE42..hOEZ86ZPNb96p7610.M8r,0mqkaU5ldsCPcE.10sN,t6,,N,kq.g5EGkn27Uh,HWh pZaxhpphY3YI370GtK4qXhpZmtQ7769eH7O1..P6I.sIQ8e0I5ZmnQC..UgcR19P,dC,,....Q 8C3rFV..kF..q466cP67MPOrkmKEg5hPMN97rN1S4.g,sI.q..w6aIrGLJ0GISau.C5.i1.,FE 42.kRYgZpgVhigZiUIbUAdCZe3xc3Jed22a2kRqEf.g7sFA7in482..C0.kqoBkSoBY2..i1H0 .UBM0HeFWmquGtQiUobx2YBBdC3Z7pdI,HN8,d7,78P1Ybx2YBBcM3Z7pdI,6JFWUI8UH3dDJe I3Zhp3AZUgcCZ6HMFQ583EmKKnUBgcC76D0k403.EVaLuKKJ0GISauUbtQ...,FE42...003OK dOFH76p7630rN1h0ka..82kU.s6..P1kS.7,D1.kYMP.UBM068kt0GT.8ogGZdAZUo2.m1EVaJ eUIVU.sIUH3dD,Uh,HN8H769eH.rVG,YAUBUU.sCPM1V0.sIFvPZ9RHePdf8W0p,Dnt.kR.660 mU...EEsIF0HeHdO8,dC,tI.in4O3UB,.r,U,,kF..q4Ux.G0HsN..a2P1.g,H.F,CLEu1kdWo b.HN8,d7.Y5UH37.Y822.b0Wmd.P1aWUg6.rVG,YAUBUU..M1..moruqnaIrGLJ23e1San,Uv. EE2Y,,..UUEayIbSoYuIeaGE6H.rFf.g7.U0,A6.C0.kq.g5EGM0D1.kYMP...qamtQ,NFQ583 Em.q...rl4.UHlYc8W0p,Dnt.kR.660mU..cR19P,FE.AZvgVK,MHkdMGQ530..5,.AVh,MDUY UhdRkSoCin4akn.UB.b0k4.U5ldUGhgVZhe2YcER.b1..660mU..6N.,VH,ZOF18HH76pld.sC PcJ.q2w68pm4avgV0,.UX..gBR1g5R17,.UvkYUa,UBM068kto5..AZd2Ya.ES...G300UH,F, AZUUB.rVG,YAUBUUw6..P..EdEJUuUbtQ...,FE42...00ZOF1WUEdkR.ka..rFV.42.5,.MP. q167sN..a2P1.UI,PHtQiUg6i1Z06N.P..k4.UHFdEJUukmSan,..22,NE..oC0WUMF1mIin4O 3UB,bWGVvcE..s6.U7gB.v,Y2gBh1qXqlRAVb,.P.C3.P..S23uPT9PJ76FVukmsQ...,FE42. .7166IcD,U0,Q5.g7sFI6QbBI6..Q2.UhdPUxcP67..Q5a2oA.UI,PHtQC.Z06N.P.S2.P..C3 30J,e1San,..22,NE..oC0WU.M8rN1.g7sII6Q530..5,.MP.q167MPO5g5hXvM0D1.q.Q8.q. .w6CpmGLJ0GIcCUn,..22,NE..YAUUkdKIeaGEeXHlRqEf.g7sFQ8in482..C0.kqoBkSoBY2. .i1H0O4..MP8bn,AVG,YAUB.D0k4.UHldc8ERknQC..UU6610w7.O5,FEkIin4O3UB,bWHlRI6 ..Q2.k2q4Ux.G0qaq,vFvsCwA.M1kdsIQ5PMFRWGtNC5K3oZ0CyIhgstETfPdfQT9PNPNZvQRt IdnVGLtmKWKqtCK.4D..umVyKrG5EWKqtCK.Q6AAICUm,..Unp3.6F6.Z50.G,0.aU.6.,..1c UXDJ9XGhighgmRiiQ88pum470,Mwd0UnpZGhighA70,cw5.,6.QJw.QI2U.sU.ktumdsIdPSNP N7ONbH.4D.o3aLq.,cwDU.6..FU.I92U.E,,.RNEd1MNG20U2U...G00k.0.0.0mFf3,E.SoA5 UTyB4.4.0E.cUZT1E..UO.,.1.eWUbl,.,6Y1.0.UA2Tm.mmBjZ92T,eUXDF.sET1.UEU...W. 0.A,,U.yen791tc0MyfU.az86.r8OmOGW7Wk1... --- end of encoding --- |
Автор: | Александр Ильин [ Воскресенье, 10 Декабрь, 2006 11:00 ] |
Заголовок сообщения: | |
Иван, а почему у вас в RegistryUtils везде ARRAY OF CHAR, а в RegistryStdMessages везде Dialog.String? Как бы неадекватность получается... А в целом - действительно, наиболее обобщенная получилась система из предложенных. |
Автор: | Илья Ермаков [ Воскресенье, 10 Декабрь, 2006 12:41 ] |
Заголовок сообщения: | |
Иван, конечно, система вышла обобщенная, однако мне кажется, что слишком утрированно... HandleMessage - это хорошо для расширения и для организации передачи сообщений в среде многих объектов, но целиком вырождать интерфейс, предназначенный для прямого применения пользователями, до одной процедуры - это слишком... Какие-то базовые сценарии для реестра нужно-таки вынести в классический ОО-интерфейс, а HandleMessage оставить только для периферийных расширений... ИМХО. По поводу удаленного хранения настроек - тут надо делать драйвер для Files, который позволит удаленно хранить папки-профили... Поэтому пара loc/file тоже может довольно обобщенно задавать место хранения, да и директорию в моем варианте можно инсталлировать любую, выполнив требуемое расширение. Поскольку Service Pack 4 для ББ 1.5 планирую на след. неделе, прошу выссказать все замечания по моему варианту или предложить, что туда можно добавить из ваших. |
Автор: | Иван Горячев [ Понедельник, 11 Декабрь, 2006 02:58 ] |
Заголовок сообщения: | |
Илья: Ну даже не знаю. А какие именно методы достойны быть непосредственно в составе базового типа? В вашей реализации как минимум не хватает обработки REAL, BOOLEAN и SET. А IntList лишний, хотя может и полезный. С другой стороны, сообщения позволяют комфортно жить в многопоточной обстановке, а Section.ok - нет. И ещё. Я расчитывал, что Registry.Open("") откроет настройки, хранящиеся в файле по умолчанию, который в каждой системе свой (и может даже и не файл вовсе). И вообще, в моём варианте пользователь обычно не будет иметь дел с сообщениями - всё завёрнуто в RegistryUtils (который ещё доработать надо). Что касается замечаний. 1. Добавить процедуры Handle. Не будем повторять ошибок Files ![]() 2. Привести список процедур Get/Set в соответствие базовым типам КП. 3. Интерфейс процедур Get. Вот тут вопрос. Вид Get(... OUT res...) не годится в любом случае - что он вернёт, если значение не найдено? Тут либо Get(... VAR res...) и передавать значение по умолчанию, либо Get(... default ...) : res. По мне так процедуры-функции удобнее 4. Процедура Write. Кажется если ей передать несколько объектов одного типа - будет сохранён только последний. Александр: Ну, в общем, да. Шизеем потихоньку ![]() |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |