From 01285eaab221c24448c6a4225cc7eca1c5ea9630 Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Mon, 15 Nov 2021 07:03:07 +1100 Subject: [PATCH] ready for adug demo --- library/fui/fui_lcl_managers.pas | 43 +- server/fhirconsole.lpi | 1 + server/fhirconsole.pas | 7 +- server/test_form.lfm | 745 +++++++++++++++++-------------- server/test_form.pas | 94 +++- 5 files changed, 535 insertions(+), 355 deletions(-) diff --git a/library/fui/fui_lcl_managers.pas b/library/fui/fui_lcl_managers.pas index 5f5e6f503..7326db4ac 100644 --- a/library/fui/fui_lcl_managers.pas +++ b/library/fui/fui_lcl_managers.pas @@ -34,11 +34,12 @@ This unit contains a set of classes that orchestrate the UI interface -- TObjectManager - binds a set of edits that edit the properties of an object - TListManager - binds a list of objects to a set of UI controls, with a TListView as the centerpiece - TTreeManager - binds a tree of objects to a set of UI controls, with a TTreeView as a centerpiece -- TFHIRSynEditSynchroniser - keeps a SynEdit source for a resource in sync with a loaded resource + - TVTreeManager - binds a tree of objects to a set of UI controls, with a TVirtualStringTree as a centerpiece - TPanelStack - binds to a TPanel and manages a set of subpanels that arew laid out vertically (logical alternative to a TPageControl) +- TObjectManager - binds a set of edits that edit the properties of an object +- TFHIRSynEditSynchroniser - keeps a SynEdit source for a resource in sync with a loaded resource } @@ -148,7 +149,6 @@ TListManager = class abstract (TListOrTreeManagerBase) Property Enabled : boolean read FEnabled write SetEnabled; property Settings : TIniFile read FSettings write SetSettings; - // control function doLoad : boolean; // call this when something changes the data to load procedure saveStatus; @@ -175,6 +175,7 @@ TListManager = class abstract (TListOrTreeManagerBase) function compareItem(left, right : T; col : integer) : integer; virtual; // if col is -1, then the comparison is for the object as a whole function filterItem(item : T; s : String) : boolean; virtual; + procedure focusItemChange(item : T); virtual; function addItem(mode : String) : T; virtual; function editItem(item : T; mode : String) : boolean; virtual; function deleteItem(item : T) : boolean; virtual; @@ -252,6 +253,8 @@ TTreeManager = class abstract (TListOrTreeManagerBase) function getSummaryText(item : T) : String; virtual; procedure changed; virtual; // e.g. to save + + procedure focusItemChange(item : T); virtual; function addItem(parent : T; mode : String) : T; virtual; function editItem(item : T; mode : String) : boolean; virtual; function editItemText(parent, item : T; var text : String) : boolean; virtual; @@ -333,6 +336,8 @@ TVTreeManager = class abstract (TListOrTreeManagerBase) function getSummaryText(item : T) : String; virtual; procedure changed; virtual; // e.g. to save + + procedure focusItemChange(item : T); virtual; function addItem(parent : T; mode : String) : T; virtual; function editItem(item : T; mode : String) : boolean; virtual; function editItemText(parent, item : T; var text : String) : boolean; virtual; @@ -911,6 +916,7 @@ procedure TListManager.updateStatus; updateControls(copExecute, opExecute in ops); FCanEdit := opEdit in ops; + focusItemChange(focus); if assigned(FOnSetFocus) then FOnSetFocus(self); end; @@ -1218,6 +1224,11 @@ function TListManager.filterItem(item: T; s: String): boolean; result := true; end; +procedure TListManager.focusItemChange; +begin + // nothing here +end; + function TListManager.addItem(mode: String): T; begin result := nil; @@ -1778,6 +1789,7 @@ procedure TTreeManager.updateStatus; updateControls(copExecute, opExecute in ops); FCanEdit := opEdit in ops; + focusItemChange(focus); if assigned(FOnSetFocus) then FOnSetFocus(self); end; @@ -1877,6 +1889,11 @@ procedure TTreeManager.changed; // nothing end; +procedure TTreeManager.focusItemChange; +begin + // nothing here +end; + function TTreeManager.addItem(parent : T; mode : String) : T; begin result := nil; @@ -1980,8 +1997,12 @@ procedure TVTreeManager.doAdd(mode: String); procedure TVTreeManager.doEdit(mode: String); begin - changed; - raise ETodo.create('doEdit'); + if focus <> nil then + if editItem(focus, mode) then + begin + updateStatus; + FTree.invalidateNode(focus.FPNode); + end; end; procedure TVTreeManager.doDelete(mode: String); @@ -2205,6 +2226,7 @@ procedure TVTreeManager.updateStatus; updateControls(copExecute, opExecute in ops); FCanEdit := opEdit in ops; + focusItemChange(focus); if assigned(FOnSetFocus) then FOnSetFocus(self); end; @@ -2266,9 +2288,9 @@ procedure TVTreeManager.doPaintTreeCell(Sender: TBaseVirtualTree; TargetCanva fore := clBlack; back := clWhite; getCellColors(getT(node), fore, back); - TargetCanvas.Brush.Color := back; - TargetCanvas.Brush.Style := bsSolid; - TargetCanvas.Rectangle(cellRect); + //TargetCanvas.Brush.Color := back; + //TargetCanvas.Brush.Style := bsSolid; + //TargetCanvas.Rectangle(cellRect); end; procedure TVTreeManager.doControl(sender: TObject); @@ -2341,6 +2363,11 @@ procedure TVTreeManager.changed; // nothing end; +procedure TVTreeManager.focusItemChange; +begin + // nothing here +end; + function TVTreeManager.addItem(parent : T; mode : String) : T; begin result := nil; diff --git a/server/fhirconsole.lpi b/server/fhirconsole.lpi index ad5280830..1406b5d9c 100644 --- a/server/fhirconsole.lpi +++ b/server/fhirconsole.lpi @@ -351,6 +351,7 @@ + diff --git a/server/fhirconsole.pas b/server/fhirconsole.pas index 86607abee..110f1263b 100644 --- a/server/fhirconsole.pas +++ b/server/fhirconsole.pas @@ -40,7 +40,7 @@ fdb_odbc_fpc, console_form, console_tx_edit, console_ep_edit, install_form, install_log, installer, -test_form; + test_form; {$R *.res} @@ -72,7 +72,10 @@ Application.Scaled := True; Application.Initialize; - Application.CreateForm(TMainConsoleForm, MainConsoleForm); + if (paramStr(1) = 'test-form') then + Application.CreateForm(TTestForm, TestForm) + else + Application.CreateForm(TMainConsoleForm, MainConsoleForm); Application.Run; end; end. diff --git a/server/test_form.lfm b/server/test_form.lfm index 6e0b4e163..02649e7d4 100644 --- a/server/test_form.lfm +++ b/server/test_form.lfm @@ -1,354 +1,431 @@ object TestForm: TTestForm Left = 1140 Height = 405 - Top = 68 - Width = 659 + Top = 69 + Width = 336 Caption = 'TestForm' ClientHeight = 405 - ClientWidth = 659 + ClientWidth = 336 OnCreate = FormCreate OnDestroy = FormDestroy LCLVersion = '2.3.0.0' object LazVirtualStringTree1: TLazVirtualStringTree - Left = 8 - Height = 384 - Top = 8 - Width = 288 + Left = 0 + Height = 379 + Top = 26 + Width = 190 + Align = alClient DefaultText = 'Node' Header.AutoSizeIndex = 0 Header.Columns = <> Header.MainColumn = -1 TabOrder = 0 end + object ToolBar1: TToolBar + Left = 0 + Height = 26 + Top = 0 + Width = 336 + Caption = 'ToolBar1' + Images = ImageList1 + TabOrder = 1 + object tbAdd: TToolButton + Left = 1 + Top = 2 + Caption = 'tbAdd' + ImageIndex = 15 + end + object tbEdit: TToolButton + Left = 24 + Top = 2 + Caption = 'tbEdit' + ImageIndex = 16 + end + object tbDelete: TToolButton + Left = 47 + Top = 2 + Caption = 'tbDelete' + ImageIndex = 17 + end + end + object Panel1: TPanel + Left = 190 + Height = 379 + Top = 26 + Width = 146 + Align = alRight + ClientHeight = 379 + ClientWidth = 146 + TabOrder = 2 + object btnAdd: TButton + Left = 8 + Height = 25 + Top = 8 + Width = 75 + Caption = 'Add' + TabOrder = 0 + end + object btnEdit: TButton + Left = 8 + Height = 25 + Top = 40 + Width = 75 + Caption = 'Edit' + TabOrder = 1 + end + object btnDelete: TButton + Left = 8 + Height = 25 + Top = 72 + Width = 75 + Caption = 'Delete' + TabOrder = 2 + end + object mFocus: TMemo + Left = 8 + Height = 266 + Top = 104 + Width = 128 + Anchors = [akTop, akLeft, akRight, akBottom] + TabOrder = 3 + end + end object ImageList1: TImageList - Left = 508 - Top = 36 + Left = 24 + Top = 32 Bitmap = { - 4C7A1200000010000000100000008A2800000000000078DAED9C075455C7BBF6 - 8F51A331D1C424461313134BEC0D7B57ECA26001952282A2A00802A252A44B2F - D27BEFBDF7DE417AEF481744403A487DEEECA3101030C9FFDEFBAD6F7DEBDBC7 - 67ED73CE9EDFCC3BEF9ED953788F006820EAE9EEA6D5D7D79D8E8A8991B7B273 - 0A3234B52C72F5F6AF888849AE8C494E2F8D884D8AF30F0CD5F4F2F4640F090E - 5E14111141E7C61414145C728D9D1D470F1F04EFD5F39017BD33E26CA8D29B1E - EEDA5D9F1F3BF42A330A5EF6E61014BC0F1111D121131313DB89FCC9D3E7BAEF - 3F10457A5A1AD0D3D437D05CDCD8F52AB388B07919119E5529611E1D05E98923 - CEEEDEE0E0E4C2E5CB97D227F29E367AC9D6469A880EF34769693992D27361EF - 110CE517E6907BAE0967175764BD4C4274802B7C5DAC87FC7D3C9F4FE4D1571D - 8DE12E741504A125DEFAFDEB44A796C200A3EA2C77ADCA92709B9AE674BFAED6 - 2CFF91FE5AAAD891F75939B96593F837B931C470A0AD10A88BEE1E4D35AE198A - 376A1C8837AA43A57F06DAF3DF62A07E14BDF524F900C5974FE29B09DFDF0AB4 - 168CB4C79BF497DB3C1E2EB57B8A607146E49BDEEB417DCABB91C6AC1174D592 - E2FBA6E1736228FB07737D479A238C465AB20251EBA53A54EAAED413AE78A9AF - 25C6EC7D7FAEEF28069B09DF3F3D8F6174C5598ED606EA2246F132BA6BF38941 - 2830E5D9D8AD75650D50183C8AFE8699F9C1768C14068D20CF6BE0A51ED7A08F - E8BE0E3F89D3AFEFED5A381CA1751BC359EEA318699B9EEF2C8A412FB1AD2671 - 74B828A8FB75BC6387CFD3138376F7F70F18F3EC46678CC9F0704DF208065BA6 - E53BAAD363A9F24BA2DD61AA253FAA2C270527231D243868A024D0142D854918 - 6C23BEEB6FC6C0E0C0FBA49454A989BCBB8365FB404522A2EC75C071F1340E1E - D807B62B972121F600B616E6C8CF4A45D7AB2C72EB6A51911D030D35959889FC - 2371F1F701CE6608B4D28030E77970313342548017861A4A480C7042696A184A - 52C2509C1808E9C7621010B837A9FDDE1714747BAEA689D28A6A74B5B7E15549 - 3E325313101715061F0F17A424C4A1ADAD0D21113110121629131717679DC82B - 2A2AD29495958F937E651D14121A9E989C921218149C61E7E8946968649A6E63 - E7106DEFE060AFA5A5C5ACA4A444A59DD47FFFA92A3D548E14DACB0CE55A88F6 - A5EBF39FFD5CDAD638FB394D91562B5E071BEDAFF6D162297355342A75554289 - 97160A5C9511AF72AD6F26F66D8CED578D616629F54186A8F67F81724F0D947B - 6BA332D80C25BE7AC8B47C8C50C9938333F1AF838D9F364458A331C91375314E - A80AB742598021F21CE591E7A28248F9CBF0113C72743AB622D26C6D72A0EA48 - 5D8C23AA432D50E4A68A5C7B5964588823DB4101B1A42D7BDE3B643CBDCD16BE - 1101060312C94A08F65344A99F014A7C7491662A82445D7EBCB47C0A7F312638 - 70EE6599C83647DBCC791D6A5ADE10690B4A762E2AC34FE3E5E1A7CB399C6A22 - 820C9B678852E140A281105CF88EC2E212C3FE49F50D325851E3AFFBA1BEB1A4 - BD79BF809B91D8A0A7E6750927C9B3C391CADC88D3BD8F28CD5BB0BAB21BFA27 - 37AF98C8BFF256DF5F417C5C1BED80620F3594051A21DB561AC61A3C43C25132 - 3014390DBF2717E1749B11BA2736956B31AE9F33912F769061297494A3DF1FCA - 5799168F91E3F41C2F2D9E4256FB0E04C3A4A17D69F7D00BC68DBEEAC7D67DF5 - A9EFB2CD84FD0B889F8BBD5E20CD4C0C497AF710ABC983045D01E2EF3B90BF77 - 66489565C786E9EE57A6D1FD47D9D64F51E4A58D0CE2DF4C3B19BA9F938D45E8 - 75F6123E0B336686A7D3B1A40D8B659A8B21D751916E6F3ADDCFDCF0153B07D7 - 3BC760737D1F4C99B6A7E89ED8FCD5747CA23A07721C649145DA459C363FFC1E - 9D8333F73E63DBEBBB58CCC83D323AB77585EE898D73666AA711CF9810A7C183 - 588DDBF0153E43B50BC67FD31FFD4519977ADE3F0C579EFD7DB6D7771FFDD77D - FAE3AB39C51F2D99617F29230C6FC794198EF2483F84A9484F2026BFDEA68760 - B8BF87A81B437D1F34D8DB8D818FAACDCD46AAA90C722C55A7CDA3352B029F3B - 1A0AF3495B92C760B204B20C25A6E4D14CEC9CF6181D261A407D4E1A62B59FE2 - 4D80285A9D9990AC766F521EAF5343A76147C848DF4D86DB5674D61621C5DE08 - C1461AA44F2A2254F1F924BE2E39782A3BD083A1EE160CBEAB23634F2586DBCB - D05896849428F7297C557CF02476748C6DAFC3404B19DE37E6A1AFEE25FA6B13 - D0511E3A852F8F099C6033C5B662A0BD1EEFDF96A3BF299FB0E9E8AB8A474F45 - 38DEBF0A9AC29744067CC0077AE92CBD5CC2BE276C6F7D3A7AAB12081B81AED2 - 00F495794DE10B427DA97911867A28B69ED8FCA1DCDEFA34F4567F644BFCD151 - E88EDE22C7297C768007997EF410B6E1A3CD05E8ADCBF8C846A2B324009D051E - E8C8B54777BEE5143ECDCB998CED2DE3E5F65136D3D970522E610B3FB0ED59E6 - E8CE339BC2A7BADB63B49BF88B2AB79E2A3711DDA4DC0FAC27611DF12ED382C8 - 94F0E65379571B8C90FBDB579F31A1BE14EB8ECE5C07C299D3D999792B8CBE2B - 447F7D32998A46A1B72208DD259EE82E7040678E053A724C89CCE8EA2DB498C2 - 539FFFAD66EACBDFA82CC344CD94EEEF5EFF93F9AC0CDEF71FE741711B434F60 - 4BC4B919F398A71383899A2E8F63B977A7E5A9F4A3A3A3701EC5B8E66987E044 - 68E5B8288EE59514F644B04DCA638CB51B02D1285DF68344E4FCA9FFAED52AE3 - 4CD6C349DF51BC65EF282CFA3EC8B2770496E3EF3FE4713A5B081C0DEA60AF55 - C7AD16231C8BFFAB1E146FD8314A34829F4C93F1A91F285169AF94C9E3769B29 - 1893EE8E973B26CDB7C390A8ECC62AAB14F204005EF68F226D82A8CF1473288A - 9B7EAE1A184271DFC038AF543F4CF7D1DDC41A78113B745A863F6AE4A33EBCA7 - D80B91E508E91F80707ACD382FF56A08CBCC536151DD0D83A62128370CE179C3 - 305DCA1FCFCFC977CAAF877136BC1C813D03E3F7983A3F2A1EA47FF621F590AA - 1C9A2269FA7990AE93C165F0E99CCC5F886AC27EB73CD8D50D41A4709068000F - 3F9E3F7CFEA087E4F311FF322897B44CE2FFB4CFC3A3D426A8940C823F6B0077 - 27E9FDF8993F7B00FBBD4BA7B4CFE9EED9DF699CFE643E702BE9E161220FA26A - A21EA2F744CD4401BC09C233CEF7C9F539444E547AE7DA4844BCCD44724D0C92 - CB83105DE20797122F70C7DC1FE28CE00FB91E72FB9B4FD8B94449DAA50EC8EA - 7D83C2B67264B71520A7DA17C555C1282C744036797627E57A402D4D1FACBEDC - 79173D38BE9DC03BAB95D821AEAB0AA95DC5286A2F426E730E8A2A5C5059E589 - 8A2C3D94BCD4425AFC0B4417F9423A551F4C8EAC211FD943448371DD75086E0F - 42708717E2DB4251581F8AB2522B941718232B5818A981C208CE508651B5057C - 9BB270DA9279F8B8C9B98B84F536233606B764C2BFDD1569EFDC91F7360D4539 - 3A28CBD04256103FA2A20460512C06A52A71D296C4A04FC612F5974E38AC7B22 - 9CF07581ADF9B0AC7380F55B1D52F750E4BE4D454EF84364FAF32323ED099E56 - 0880BF8C19774B982154C00DF1483938572460BFFA9146C2F7C6745442B1F439 - 242A8411FBDA0299D5AE4877E34642B410C2CAB5E052CA0B89BCA310CC3D0D8E - A84BE0F31442404336762BEDEFE34D14EE8B697F05F13C59E8E50921AAC606A9 - AE3751E0771329E6AC64AEF210BE79D2084A1286AF3B0F9EB95F07A7A300FCEB - B3C120B7BBFF66AC60831FF1F5F3423DC4566A22314309990ED750EE7B0395BE - 5C48B3388F58D51308553E81708B2B3071BE8DBB2E4FE1501A8D6DD23BDE90F6 - 106050E20BBBAA2028A788C22D5701C9CE3790EB7A1D351E241F97CB48356342 - B8F61984585E87A2ED5D48C5EA4131C68AE263AF05DD3A4DDAC350F0DB02DC8F - 7A8C87D162880911469A2317AA3DB9F0CA8D1DF1062CB076678724F127A78900 - 5C2AE328769488936A032C6ED7FD9FC6E9C0BC241052710A884A90438ABB204A - FCEFA3D8FB2EA22C6F82D75B101CA6F7A0186F0E01F767F4B2C7DADF39FB2B0B - 497BC8130D5585CF9B54C4E5DB21395011E941641DE42B8970574928641AC3AE - 3C0AFC6ED2145B4EB46C621F60343AB390B48790039A47872C93AD1198608DE8 - 782BC4245AC32FDF1F72711614374C954BB474A67EB847F9C0E59D0A7B431964 - 77359074BD1FD548144D74E33F59F3FF1B656565D9A6A5A50D252525212E2E0E - 919191080909819F9F1F3C3D3D5D67E2727373BFCDCCCCF4ACACAC44637D3D6A - AB2A515D49A90255151578D7DA0A6767674CC7E6E4E49CCDC8C868A8AEAEC6DB - B76F91939E868C9464A42725E265623C52E3E35159560A1B1B9B6979C2A2B9B9 - 99AEBADA5AC226C1CCD41426C6C63032348481BE3E2A4A8A616666362D9F9292 - 82F6F676D412F6D5AB57A4CC04BC4C88474A7C2C92636390181D89F2E2223CB2 - F400BB732954FC2B70DA3A179B8CF36E523CE5A75652BF9A9A1ABC22754E8D8F - A397A9ABAB0B1D1D1D686A6AC22CBD0C12314D08CAEFC0EB6EC02BBF1D67B553 - DF503CE5638AA7EA5F5E5686145266524C1412A322111F190EADB0142814B521 - A07E005A714DF029E84352CD30F86D0BFA293E383898CE57555591675E29DDDE - 84C808C447844336310432856D48EA1B81D0AB3E32EEB681CFB104DC96F9AD97 - 0DD2D752BCAFAF2F5A5A5AE8752F292AA29719171E06FDE0784815BC436AFF08 - 782A7BC155D70FE9E22E1C33AF7E7352276BFB98FFDCDCDCE8F78DE28B0A0B08 - 1B0A559710486434D1D99B84E5ACEDC7B3C24E1C37AEECDAA35DB66BA2FF1D1C - 1CD0D1D141F75F617E3ED49D83F124AC0809C466BEEA7E70D7BD277674E0A451 - 09F66997FEF1E9FDB3B4B44C0B0C0C24E34C218CFD93211D5204BDD03C5C4D6B - 0057752F2473DBC0625E86DBC21298A9FD927B759EDCA7CC131A1EA8E902D82C - 4AF18B740CCE9925E3A46602D28AEA70E7CE1DFC5DFFD974F7F9B051EA00F4D3 - 06C0A892863FEEB8E286E053F0F1F1819797B7E4EFF8C587AFF6AFE7511B3AA7 - 1E3D745C272A7E8B44E0AACFA5FFE9DB05B44DCB17D318962FA25DD9FDDBF6BB - E736F148DFD823CC7F7EE3ED43EB96ECFDF3C7055F6CF879116DA6E3FB6FE6D3 - F6AF59B64AEDEE19B52873C1A45C1F89A6D2D0671DB97E12CDE16682695AF799 - F4F6AEFA69EB4CFC9A258BB6B88BB264F5F83D438B8B00DA3C79D015C88D775E - 3CE4333FA8EF03A5589B167C39E7CFE9F86D2B7E3C1522CEDC52ACC586326336 - D439B2A3C99B13F5CEEC2837654391162BE2A42FE3C7855F9D9C8E5FFFCBE243 - 018F98AA6B5E70A0C69C0D4D6E6C68F1BB8626F7ABA8B560438D2E0762A45986 - BE5D30EFC818336FEE1CDADC39B369B3BFF882B6EEE7C50CEA9C078B429F5D40 - 96EE65D4385FC31B3F76D4BA5C43B6FE1504489D87CC95DD9DF3E7CEDE4CB127 - F76DA109719EA59D3DB49DB671F5AFB4EDBF2F39E12D74B6D14BE4248CF9F741 - E7EE4E68F03340836F07746EED8635FF1178099D1DFD6A36EDF09EAD6B69E672 - FCB4A7B75868CCC776D1B6AEFD9DD8FFFD91E047E76BEAF53850F682D4D79805 - 85E6E7E9E7325D5634E87320429C6970FF963587BCF4257FD197E4FD4184EB2C - EDC2D19DB42D7FAEA0FDFEC3C21D9A9C074A62145990AB770DF54E5C68F3BF89 - D7AE375060700DA1CFCE4295E340BFB7F58BF4E400FB6A3395C725CAA2DC4CE7 - 0E33D0B6129ED87FDC5DF04CA39BD0091811FB5F08EC86D6BD9DD0E627E2DD09 - 43BE2388F5B044517A1C12433C11E7E7006F33E511CEF3476E6D58B99CB661F9 - F74742C42FD4D6133F97E8B022DF801979A64CC833B880122D16149908222D26 - 08365A52B0D4901C88F5B51F35557E8CAB670E38FFFCE377B4954B16EDD3E13E - F42A4EE922F2F5AFE1B53317DA036F92FB48ECD7BB825063495869CB8187F950 - CF5DF6F3A1511EE6C35EE6EA10E3BDD4BC64F1C2DF187E5F72D2FDFEE92657A1 - E3C4FEFDD0BDB707BA42BBA123B08BD8BF037A226CB050790425E11BEF2D541F - 37BB192942FB291F9819F77851CD9FDCFFC3114F599A5A4DB8F14AEF2A4A8C2F - A1C49205C5C6175163781591CF39A1F0801DA6F2F761AB260657BD6770D37F86 - ADEB56F252EDE18B59B3BEDEB77699908DF0F1AA741DD27E89FD6D0137D1E0C2 - 856C5D52F6BDC3AF792F32566A4B0B8E1A2B3CC073D19BDDBB36AF519AF7E5DC - 3F3E69CABF2D5E38FFC2BA158B0519D6FEF874C3EF8B457F58349F9D7CBF69CE - 9CD94B37FDF9C7D13DDBD673FCBAECC749FDE073EBE69502DEA0F46FD7DBAB1E - 04628B4216CE0502078DABB14E3CE21FE54195B5453A1E4CAE6F71357294CE1F - 751D06A3753BD68984E1731CA36131D8BC9A703703604F042E85023229642DDA - 08F0058C6297C13BAC129E9AC76E896830196442B20810C903F8D301856CA0BC - E3C3769A3779E2EEB604F6106D37E8C69A8793EBB292DF1B3E596D38AA9D813B - 598074EE07D6B1146825A36B7D27C04CA62DDB4C815D16C056CD46ACB8E58889 - B63319E6D2F338A4990EEE64E03A29E2A827201A0D8C8C0299A40EBBCD094FC9 - 62145B345EE38FBB5EF43C5611FE7121B1EF792A3D8F031A99B848EA7ECE07D8 - 6F0FDC0D00787DC9758B0FFC6E2B7226D3A0B58A555871C7136B8482B1562418 - E78348FD6433E879EC544805A3DB280E117E8BC90751B6EFB103FE546DC28F47 - 1FD0355687D5248FD5422160A0EA27934ECF83412E0D7B48597BAC41FF7EBD5A - 239DE1149283B58509366DDA84C96D2608AB1E0483C19CCA23939E0765CF1F12 - 3974EED603B266B0B1446A420C72B2B2A6F0745F0AFE95C716D92C3A27F4440E - 1E8ED67849E674C9644EFAF2652AD2C9FC90E24F9C3831631E5B89CDD4789D1A - 1B864432974B4A4C44DACB97B0B2B4C40341411C387060C6F6B88AE4B1F24108 - 9D4F880A453C99CF999898E0CA95CB606464FC477DE10F9207C5ABAB28828D8D - 75DAFAFEDD8B62FE96FB1F98F36B09F0D234EFDEA469DEBE39CB4B579937C3EB - 457A7AA04DBCD06D9E83A70EECA57DFFDDB733CE1F285E9DF0DA027CB3FD4D5F - D8443AAB2037DA1175CDD52829CB1F792A2420BD60DEBCCFF242420234233DF5 - 47ADEF9AD14AE6E08D8DF528AB28426DC32BE4E6A561DD9A55673EC73FE6179C - C3127834C5B3DA110F0A9CC1501B8A948A7C94903CD2735F425E5C20642CFDAC - 59B368AB7F5B46B494F6ED370BE8FC434B8BB97669B699FE058150CAF7826565 - 2AAACA0AC95CBA0035B991B011DE5D318B465B3477EE97B4071C4C3435512EDA - F13D9B69BFFFBC84CE7364A5CE0DCAC84D333132849DAB13925313901CE688C4 - 200B64C4FA63DFDAA5CA54D9D2F7AED27C0CA5698A82D7688777ACA7FDB6EC07 - 3ABFD4C289C664EBCA2F27FD040F25056066A38B502F7B18E9C88283ED72C217 - B366FFA2F6F0FADC5073D9ED36AA227B65F8AFD00E31AC1BE7979CBF48FBE9FC - C52FEF3C7E982AF8841F124A4FA06F40D61D2A0AB8CC7CDE66D3EAE58B53021D - 1292835D7A5C8C94074D141FAA1CDDB561FEB21FBEA5F37F2CFA8A769461F396 - F808FFA680004F84933EEA1FEC03072B13B8395A0E45F939D7E626478CC405BA - 903AB9C2DB5C0D0F38CF1B1FD9B589BE0F7470DB862F3D1DAD438BF333E1E660 - 85005F4F78BBD9937554347C5CAD9118EC064BB527D092E4EF8AF4B41E72D257 - 02EFA5132FCF1EDC4EFF7BA0A6DC23BDEC283744B89B21CCDD02816E9664FD13 - 8E848404847AD8C2495706772E330EDD60391E14E4A0DFE76BA58167F739464F - EEDF4AFF9BA09DB18A4FACBF191C0C65A1247E9394731BD6861A30373381D50B - 059829084247826FC44A55BCCBDD48017AD202603B7320E4DB855F6FA5787BA3 - E7E1669A4FA020CE0B7E8EB310BE7901522277212B210415C97B90BCCB0A8367 - FC20BE87938E24DC0D64C1B877ABF2DCD9B3E9FE3BB28F81F1D4E19DD65C2CC7 - AAB8980F4294E73CC40438217A8F0B5C6C4CAD678FEE895510BDDDA42D797754 - 4E88AB9B61E3EA475FCE99B37CACFD526D923AE6CE99F3E3F29F7E60DFB77DBD - E5EEED9B9C56FDFEABCCFC795F1E2697BE5AB060FEAF3F2FF97EDFD75FCDDF4E - 3ECF9ED8FEFFFFFEDFFF99FDBF7B392693D6FFBB0D940AFEE9FE1F4B96D294F5 - FF19EDA8917FB2FF279DA905B9A2B753D6FF776CB2F177FB7F6691BAD3AEFFF9 - ECF2B147F1C2FBCFEDFFB9F82A4CBBFE3F61510CBDF4B8CFEEFF19584A4CBBFE - 3F65528C07C1B69FDDFF532763C893B08229EBFF532625B866FCE4B3FB7F576D - B4A65DFF9F34C9C5551389BFDDFF9B6EFD7F5C3502E27176FF68FF6F13BF1226 - AEFFD7DC73875942C03FDEFF5B7CE4EAE07A1ED5D173EA9138A26135B24DFA64 - DFE7F6FF366C5A4FD7A6CD1B682B57AFA4ED606038C078ECA809030383DEF2E5 - CB37AC58B182B661C306DAFAF5EBE99AB25FB16E255D7F2C5F4A23CF1C95ABAC - 97C146B479FD1AACFEE3371C3C78D06BE5CA9533F277640CE9E296D0A7DD1455 - 8A9537F2C2236D0FB00A3EC7E59B0F71FCE8A1F7845BB27BF76E1AA54F79558F - 6CBA145DD269728E1971FAA10D50F7AB86BC6735D8153CB16EF38EDE3F572CFB - 65CB962D344A9FF2828661B4FB86E1B4FBBAFE34216DDFB847C65110D40AC06D - 8D209CB821815F962FCB23AB34F2EF7BF280FD7E0ACFF7DC9E26A06C47639671 - A49D9274D2E39075C655096BB04AD861CFD1B34D4B7FF86EF66186CD34FE0B87 - 683C670F4CE1C3550468914A3CB4F017B23425558BF59B3954074E0A99E2DC3D - 75ECE756AAEE0B36FC4189F3E4E2647501D15AE3FB8342A7772C3CB7E3CF9F88 - 685FCEFE8296ACCA438B93BB4A2BD0BAC5D8E2AA9AF0F8A1E8E0B66B8A6014B5 - C3DE6B92644DFF60B8D64961A8A3E4E55075840B7AC3CCDE55E8F3F758F332D2 - F968655E5AD833F613490692A383F91128347D04756307485AC6A1D850086FCB - F3D1DD508A34754E9419F1A3C24E0E2F35EF77103E92F0DF45C872D022146F15 - 957A18A0D2DF92AC77F930D0D389A1EE4EBCB293C15063092C5996C284F96798 - 5C58F63E4E8615F5A68230E7DADB9A28CF4E8B54E0DE192E7F6B3449E71152F5 - 9FC04F9213BDEF5A506F2986B6EC1864A973C0F0D2EF487E218E70F99BBA753E - EA7595968F10726B6333E13B3234EEE807487022488A0B11B23C7014BE88CED2 - 7C62EF6D2459ABA1C9FE314C58D72242E90E22E579623AA20C7A1B43CC607975 - 4D73823CFB3B833B4CBA05AA3C8892BC8E80475761C37F0635B1410879720D05 - D68AE8F05645C60B2194BB28A2D14F73B03DDE0EDD31649EC6B307D47470EE17 - B42F4498F6A605895C40BE2217821E9E81E7BD33F012BA80327D7EF84870A0D5 - EE1190E38FBEFC285419714287F997CE78B9EB5D6410FE7E6C1C5EB964D1897B - 6776C4685C3FD0E7C67F0AD1621710FB881999AADC087D7A09891A771023C386 - A7DB685971B2D77A08FFD7203EF9F87AFD6F4B98CE32AC513CBFEB4FF3D3DBD7 - BCF8F9BB457B3254B913D3946F0C109E9E86F67112F03FBDFFFF38526BB558B8 - BAECC310E50AC140856E017F996E3E1F890A5E4F71D91B6E0F577F8E158FD462 - 150B536B34CA7642626306725A0A91D69C0DDF5761100E972763E7FD4636FBBB - AC33B1A2616A3DBE9591A8ECAA414843342C2B9C6152660767328F887B930CA9 - 044D5CB2E1E9B960C935290FF108CD55847DED511E8AD2CE4A18945A433DCB10 - CA992FA0556802CD42633CCF7F01DF9A503C0897C559B36BAF4F1A5D1EDF5725 - AC9C4AAA29F2DF95C09894A7596004F9971AE3E13C52592A7890280391543978 - 5507E394CD751CD3BF2037C60B073FAFF07A15021762A762863664D254C93826 - 35CE73790982374A023722C4A195670E8564031C7A71A6623C763440AE2FA42E - 065A45A69026EC4C07479828EEC793F577A107F6691D1F8FBDBCEB2BDDE7FE2A - 10B2399A7892A9F8595E20461656859ED8A57E789CBFE5F5A44233D30C1A0526 - 7890220DBE78515CF5BC3B89A3C415FE082A99A67816A383ED2AFBC7EDE77617 - 9563F5BC078F5764CD1B2F059E18317A7D27F2ECC10F7123F4315CC87C729FEE - 096C56DA35EE3F0E9707ABAE39F2BF1624F7C6AD2260DC57F4728345082B022E - C23A970582D34388625F6F90DF3E695FFCB2ED2D56662BEE9E3B4192248F60A8 - 91FAF047C9E24E840C5433CC081B04768F07D8ACB8AB87B0D3B6C173E6ECACA7 - 4C581B19CD2F4136411726B92E30C97181648C06F6E81CA7D8C699D8F1798001 - CBEAC3BAE7640F689FACD8A371AC7B87DAA1EE6DCA7B2B362BEE945D2FBF7DF5 - FFF6DFEFFEBB1216AE5BFD40B056F69EE0AB0ABE3B95DDB7EE947773F3955570 - F115CBB2DF2EFCACFDC242F5AC8282D58D2F0CDB1093F81E99050348CA188047 - 500FF845EBC07A33AFF1127736EB8CECFD9A1E0FEF2E94568EC0276210FA8E83 - D0B21E8495FB1022528721FAAC1917B8327BCEB2A74FCA4348A87615615F3BBA - 76A3B062046A168390D7EF80F48B4EC81BBD879CC1009E6ABF875BC87BF03DAC - C7A9EBA9AF19AF258FB71FC2CAC93E7F8BACC2617A797286FD78A2F90E42CA7D - 93C427D50D27DFF73872311747D812C6DBAF80605585B36F2FAC3D0721A1DD01 - 369ED669C527D105C5173D90946FC601D6B8F1FE73E77E459F6FF800E40D0721 - AAD23163FF65E668C64DC17730B1EEC49E8B31E3FD9787AFBCCFDEB31FA2AAEF - 714FA9EFB3FC0DFEB730B1EAC48E4B51E3FC8DDB25158ADAEF20A74FE6DAE2DD - F474D3E92257339E3DEFC0936775D87A3E62DC7E76DE42B9F3D72AE0E0D9876B - 773A7085FFDD14F6027B23AE7036C2D6B117BB2E25612353D8B8FFD878F257B1 - DECA797DEB413DECBD7AE9BEBA74E32D9D63E168C4856B8DB84464E3D00336DE - 628A7DBDE17CF0A4FECFCC99C57A8E23A3E7C6DD1AD8BBF4424EB51D5C7CCDE0 - E06E82ACF23BD8D8F5E0327709363185F61076DA36789AFD25EBF1AB298D87AE - 64E289F41BE81ABCA34B4CB2013B99E329B67126764C47D912571FB89420BB8F - 35A662F7E5E8EEEDE7A3BAB7B284556CBA102ABBEE6CF0FF4AFFA705F77C41A4 - 409447944E346F9A344B3F5E4F235A37FEBD4FFB5C224DAE8C9E86D8D641DCC8 - E86C660E484B1A8C7A1C47D4F6517197035E26DCCFE96A9529EE6B23E9D3887E - A3F3AECDCFB8D33A5F07BF19C0ADD496F6031E99DDAD49EA68CE304253AE355D - D4FBAA8417D8E191DBAB58D0D12B9EDBFD96705944736976F5B232795D6DB712 - DFB41F704A19AA4B3540639E3B6A125C50E46382224F035445DBA1813C8763E3 - 6D7026A064C4B3BE6F7883DF9B32C2AEA399BF3ABCC0A2B46CAB55726F55AC26 - EAD25C511DEB83CEFA4A7477B6A2A7B3059D7565A88C704475A20DB4FDDDB1CF - 25EFFD228BE26CC2D2FD1068FD58ABC05B02D54916A42C0F7A5FE9E87887A6D7 - D44F54FA3F68B41B954166A888334182871C526C0555C66326CCB9E20ABC9EA0 - 2CD48C945B8CD1A15EF4F676C3D6C698E4D38CF7EFBB1013EE8D8EF204E47BA8 - 814A4B31637C821E5B5BB68B18F29C3530D8D78C91F7EFA8DF184151410AFE3E - 4E509497405A4A04063B0A9066F208545A8A19E343D558DAD2ACF89163AB80C1 - EE3A8C903CBA3AEAA1A3AD4C67F3731280A1160CB66622554F18545A8A19E3BD - E4CEC6C5EAB223CB91CC972BE249751B31D8558FE4B81074B65501C36F80DE6A - B417FAE2A5F923506929668CB77FC2A8E0A7C084144B119479A8135FB50083A4 - 0E2364213D4A34DC4EDEB7A0CC511A09E642A0D252CC186F227C70175151A0EC - 69725D0CA51E1A68AFCE21BEF81083DE5E9D87125715C41809814A43A5A59889 - ED5BFBEE1E0147F5FBBDBE922711A97D1309866248D27F8C445D31C4EA09214C - 931B41AA1CB057B9D34BA59D260684B1A0A00009B1D1C3560F0EC24568377C44 - F6D245BDB77FCA84E4A4C4D1949464A29423937F3B17B484A8BBA2A202818101 - 6D329CDB149FB16F8E236AFB28EABD02B9D65556560692768868F584F8876F88 - 4A89068836CDD4CFC9B53F883A885E13D1F71FFE9343C5B26AA99649C1D6FF84 - 5535F0D828A9109368685D3A686C53E4F96F586363A7DDAE6E618346A6B10824 - C397B56BC5D03F658F091A7F23611AF5AAB4B8743426267DD4D629878C4509A5 - D43527E98BC3AE322C2333C9E1D995913B5ADEA3E6596D700C4E43497129BCBD - 23A1A4EA7E90E223D52FA2CEEFFAB4AAF665C763134FD8E4B5413DA50312A155 - 9034F687FF0BC171E747695E22ED8D7D8AE20C3920AEEF0ECB9C36A82575403C - A00A6C4A3E88D0E302C58CF1D74D7CD1561A8BB7F9C193A4681F0DDBA25E68A4 - F5432AAA15375EC4A12633102DC591A098319EC5340C3DD5C9F4F8FB31E51457 - C134B3166E255D9049E803AF49267A7A3AC6AF53CC187FC9D06F0A2F6F190CEF - F2B7B04929C16D83A4492C258A19E359F5DC27F19535F5B8CC7E1B1246FE084E - 2A9AC48D8962C6F86BDA0E93F88CDC52A4E6944DCB8D8962C6780E75CB29F6FF - 9D28668CE75231FAD73CC58CF1371575FE354F31633CAF9C1A99A79AF60AABEB - 75FF53510CC52E983797B676E9B7B49DBF7E4BC5FF6CBB7B6E238F1415FFC3B4 - E9F6E1753FEE5DBBE4F3F13FF3E7CEA6ED5EB96495C687F89F447AFC4FD8B38E - 5C5F2AFEE77E9A962093DEDED53F6D9B895F4D8FFF619E3EFEC7F53F88FF719A - 2EFEE71296FC27F13FE67FC5FF2C9A10FF336BFE17B459F366D1B572C9220675 - 8E0345A1CF9891A57BE543FC8FEF5FF13F811FE27F3ABE9A3B871EFFF315EB77 - B46F2497D2BE16FF89F6CDE3A5E3F13FDE0FA789FFB9FD21FEC753E8CCE892B9 - F30FCF5A3597B6507E196DA1EC32DA37324BE9E70D1FE27F6A1B26C6FF589C47 - E1C7F89FD7FA1C4815BF3CB870F5BC63B4A78B96CC95FA6EF157123FD2BE9126 - FCB3657FC5FF284C8DFFC937B88638990B10E0D9D6BB4BEB688E40A8482BBBD7 - ADBADFB5361ACE93F8FE478A9F1AFFB38B1EFFA3C5BF1386BC7BF080770B4E7B - 5E856B850FCACACB105792489E850ED86BCA1846F2983753FC4FBEC105946A5C - 02BFD559DCCA168756963E5CB33D1051128DA181213C4D94C542D99F45C6E27F - 623F89FF6976E346AACE45B0BB5D8570AE349EA4CB42365D195D5D5D88CE8D85 - 50C213ACD2D9923063FC0FFF2EA8716F07AB39336CC99CB0B8B114710D8908C8 - 09027BF46D88BE94C272E53F2DD6FDBCF84884C487F89FCA8FF13FC5962C2831 - B98806DDAB3032B900B6183E98265821222F0AFBA24EE156AE10583CAF372F90 - 5AB2662CFEC756F87855C627F13FB9243FD3BB871AD70AAE4DDFEC7B68F84FFF - 9DD81C7B00075C4FD52D96FBF5DC37CF964E17FFF3E093F89F2DB4AF69F31649 - FD7CF87B8D15623F2AFDCE4BDADFAF5F3FFB89B648E667FABC60FEFCF9F40C96 - 2DFB79AE9999E9A89F9FEF147D76FDF0F150525272090808C0E0E00046868731 - 4C34323202C27F36EE912A5F5656D69D4A44F19F1E7FC79F3871DC3024848C37 - DEDEC8CFCF23E50F626060805EF618FFEBAFBFD2E2E3E3E9E9F5F5F527F167CF - 9EA57ECB4BB7B7B7B797AEE1E1417A4CAC9B9B2B9DFF9C3F08AF49F13D3D3DE8 - ECEC447F7F3F1AEAEBE1E1E1016767A729F5D1D3D37B3D1D4FC51077119E8A23 - B6B5B5A5D783CCF3E8F518FEE8CF8F7CD1747C6B4B0B9A5B9AE1E3E30307073B - 04125FAAA9A9125FF4D36DEA1FE8A7F3BABABA8513F93367CED0F9376F1A49D9 - 35A0E279295B2886AAD35FEAA2F33A3A3A859F94AF4D2FBFB5058D8D0D080909 - A2FF569DF20595CF445187B696D624FEC2850B1FFD3F4867A22323D142EA41D5 - 878A2B1E3B53A20E4D4D8D49FC92254B8EEEDFBFDF79C78E1D963B7630A8B1B3 - B39752BE6B7EF3066F1A1B3FE8CD075187BABA7AE174ED77ECD8B76FEF53FA6F - 4E1BEA515F5F3B49D4A1AAAAF2599E999959EF73BF653530D0AFFC1C7FF8F061 - 95ACAC2CAACD8D907B3149D9D9D9101111C9F9BF7D1FF0BFAB52B563C74AB54E - A894BF386754A67142B754F9985EA932A34581F801CDCCDB3B16A6716D9DF539 - BEE4F911D63A57A1AAE6287D3445E8A229548BCC0DC4868AE58E8764DCD8B6E0 - EFCA2F963DF8EB2B936B11F5EEE25DB56EE2BDB54E62FD051247CC3278B6CFFF - 27F6174A1D92A87311ED2F573FE35D2C77C2AEC1470939C207CCFF099B27B66F - 5595255F5DA5C9CDEA9CFBBBD98814EADC65902774C0F9EFD85CC1DDB34B148E - 7B54DB0AF667F1EFE24FE3DEB620F3D64EF55A172914499FCC4F605AF7E5E7F8 - 1CC13D37AAADEFF5956B5DC9CBE0616049E5D8BA314B60AF5DAD8B344A5559BB - 624FFFB9702636936FC7920AC39B6FEB5CA550FA9CA92047F04040F6BDFDC145 - D2A74AEBDD1451A67A6D208671F5F2697F83C1BD7D56C1E3A396543D33F9F79A - 4FCE77AF7FB59D04CA3538117964D59478F674723FC97D3959EBF404E5DAECAD - 2957361F1EBB167B6ACD0F8967D7C9579A3C40852E2FA28FAE640BD9B7E28B49 - FFF7C0BD7D3EE5BADCA3157ABC28797EA92DE9D2269DE8E3ABBF8B3ABA6A6322 - F326875CB1E36F8BE52EA3488619295719A243F6FFC6F0FF4A3FFB2FD0266716 + 4C7A130000001000000010000000632900000000000078DAED9B075815C7FBEF + 8F51A3C92F9A98C46862626289BD61EC1DBB285840A588A008288280A814E9D2 + 7BAF82F4DE7BEF457AEF481744403A48FDFE670F4240C094FBBFF7FE9FFBDC85 + EFB3E7ECCE67DE9977667766DEDD038006A29EEE6E5A7D7DDDE9A8981885E776 + 4E41C6E6D645AEDEFE151131C99531C9E9A511B14971FE81A15A5E9E9EEC21C1 + C18B232222E8DCB88282824BAEB1B3E3E8E183E0BD7A1E0A6277469C8D557BD3 + C35DBBEBF363875E6546C1CBDE124242F7202A2A36646666F662327FF2F4B9EE + 7BF7C5909E9606F434F50D34173776BDCA2C226C5E468467554A984747417AE2 + 88B3BB373838B970F9F2A5F4C9BCA7AD41B28D8916A2C3FC515A5A8EA4F45CD8 + 7B044345CF12F2CFB4E0ECE28AAC9749880E7085AF8BCD90BF8FE7B3C93CFAAA + A331DC85AE8220B4C4DBBC7F9DE8D4521860529DE5AE5D59126E5BD39CEED7D5 + 9AE53FD25F4B991D799F95935B36857F931B430A0EB4150275D1DDA3A9A63543 + F1268D03F12675A8F4CF407BFE5B0CD48FA2B79E241FA0F8F2297C33E1FB5B81 + D68291F678B3FE72DB47C3A5764F102CC1887CF3BB3DA84F7937D2983582AE5A + 62BE6F063E27862AFF60AEEF487384C9484B56206ABDD4864ADD957BC2952EF5 + B5C458BCEFCFF51DC56033E1FB67E6318CAE38EBD1DA407DC4285D46776D3E29 + 100ACC7936756B5F590B14068FA2BF61767EB01D23854123C8F31A7869C035E8 + 23B6AFC34FF2F4EBBBBB160D4768DFC67096FB2846DA66E63B8B62D04BCA5693 + 383A5C14D4FD3ADEB1C3E7C98941BB7BFB074C7976A333C66C78B8267904832D + 33F21DD5E9B194FD926877986B2B8CAAC84BC3C94417090E9A280934474B6112 + 06DB88EFFA9B313038F03E2925557A32EFEE60DD3E509188287B5D705C3C8D83 + 07F681EDCA65488ADFC70B2B4BE467A5A2EB551669BA5A5464C740535D356632 + FF5042E27D80B305029F6B4284F33CB898192126C80B634D65240638A134350C + 252961284E0C84CC2371080ADE9DD27FEF0909B93D53D742694535BADADBF0AA + 241F99A909888B0A838F870B5212E2D0D6D686908818088B8896494848B04EE6 + 959494682A2A2AC7C975651314121A9E989C921218149C61E7E894696C629E6E + 6BE7106DEFE060AFADADCDACACAC4CA59D72FDFE5D557AA81E29B4971DCAB512 + EB4B371438FBA9B4AD71F6F39A229FAF7C1D6CB2BFDA479BA5CC55C9A4D45519 + 255EDA28705541BCEAB5BED9D8B7312FBE680CB348A90F3246B5BF1ECA3D3551 + EEAD83CA600B94F81A20D3FA1142A54E0ECEC6BF0E367DD2106183C6244FD4C5 + 38A12AFC39CA028C91E7A8803C1755442A5C868FD091A333B1159116EB9203D5 + 46EA621C511D6A85223735E4DACB21C34A02D90E8A88257DD9F3EE21D399CB6C + E51B1160342099AC8C603F2594FA19A1C4471F69E6A248D417C04BEB27F01767 + 8203E75E96C96C73B4EDBCD7A1E6E50D912F40C9CE4575F849BC02FCF4398753 + CD449161FB1451AA1C483412860BDF51585D62D83FA5BE41462B6BFCF5C7EA1B + 4BFA9BB71EDC4CC4073DB5AE4B3A499D1D8E54E1469CFE3D4469DDC2F32BBB61 + 7872CBCAC9FC2B6F8DFD15C4C7B5D10E28F6504759A009B25FC8C05493674824 + 4A16C6A2A7E1F7F8229C6E3342FFC4E6726DC60DF326F3C50EB22C858EF2F4F6 + A17C9569F508394ECFF0D2EA09E474EE40284C063A97760FE9316EF2D538B6FE + 8B8F7D976D21E25F40FC5CECA587340B712419DC45AC160F12F40589BFEF40E1 + EE992135969D1B676AAF4C937B0FB36D9EA0C84B0719C4BF9976B2743F279B8A + D2EBEC25721616CC0C4F6662491F16CFB41447AEA312BDBCE9743F73C357FC1C + 5CEF1C83EDF57D3067DA91A27F62CB1733F1891A1CC871904316E917713A02F0 + 7B780ECEDCFB4C5F5CDFC56241DAC8E4DCB695FA2736CD9BAD9F463C65429C26 + 0F62356FC357E40CD52F18FFC9F5E82FC6B8CCF3DE61B8F2ECEF7B717DF7D17F + 7C4D7FF86B4EF1474B66D89FCA08C3DB716586A33CD20F61AA329388A97F6FD3 + 4330DCDF43D48DA1BE310DF67663E0836A73B3916A2E8B1C6BB519F368CD8AC0 + A7B686C27CD2971430982C892C63C96979349372CEB88D0E130DA03E270DB13A + 4FF026400CADCE4C4856BF3B258FD7A9A133B02364A4EF26C36D2B3A6B8B9062 + 6F8260134D724D2A2154E9D914BE2E39783A3BD083A1EE160CBEAB23634F2586 + DBCBD05896849428F7697C557CF01476749C6DAFC3404B19DE37E6A1AFEE25FA + 6B13D0511E3A8D2F8F099C54668A6DC5407B3DDEBF2D477F533E61D3D157158F + 9E8A70BC7F15348D2F890C18C3077AE92CDD2E61DF13B6B73E1DBD5509848D40 + 576900FACABCA6F105A1BED4BC08433D145B4FCA3C66B7B73E0DBDD51FD8127F + 7414BAA3B7C8711A9F1DE041A61F3D846DF850E602F4D6657C6023D1591280CE + 020F74E4DAA33BDF7A1A9FE6E54CC6F69609BB7D5499E96C38B14BD8C231B63D + CB12DD7916D3F854777B8C76137F5176EB29BB89E82676C7584FC23AE25DA615 + 9139E12DA7F3AEB61821EDDB579F31A9BE14EB8ECE5C07C259D2D9D9F9E7187D + 5788FEFA6432158D426F4510BA4B3CD15DE080CE1C2B74E4981359D0D55B6835 + 8DA7BEFF53CD762D7FA5BA1C93355BBABFFAFBEFCC6755F0BE7F9D07C56D0A3D + 81AD11E766CD63816E0C266BA63C8EE5F2CFC853E9474747E13C8A092DD009C1 + 89D0CA09511CCB2B69EC89609B92C7386B3704A251BAEC0789C8FE63FF5DAB55 + C199AC07538E51BC75EF28ACFAC664DD3B02EB89CF63799CCE1606478306D86B + 3570ABC504C7E2FFAC07C51B778C128DE007F3647CEC074A54DA2B650AB8DD66 + 0EC624FE09BBE3D27A3B0CC9CA6EAC7E9E42EE00C0CBFE51A44D12F59D620E45 + 71D3F755034328EE1B98E095EB87E93EE24FAC811729876ECBF0078D7CD0D867 + 8ABD10598E90FE0188A4D74CF0D2AF86B0DC321556D5DD306A1A824AC3109E35 + 0CD3A5F261FF8C1C53793D8CB3E1E508EC199868636AFFB07890FEDD87D443BA + 72689A64E8FB41BA4E0697C1A7732A7F21AA09FBDDF260573704D1C241A2013C + F8B01FFB3EA607E4FB11FF32A894B44CE17FB7CFC3C3D426A8960C42206B00FC + 53F47E622F903D80FDDEA5D3FAE74C6DF6579AA03F9A0FDC4A7A7098C883A89A + A887E83D513351006F82C8ACF37D727E1E911395DEB93612116F33915C1383E4 + F2204497F8C1A5C40BDC31F78638230442AE87DCFEEA23763E51924EA903B27A + DFA0B0AD1CD96D05C8A9F6457155300A0B1D904DEEDD49B91E504F3304AB2F77 + DE450F8EAF27F1CEEA257688EBAA426A57318ADA8B90DB9C83A20A17545679A2 + 22CB00252FB59116AF87E8225FC8A41A82C99135E4037B886830AEBB0EC1ED41 + 08EEF0427C5B280AEB435156FA1CE505A6C80A16416AA00882335460526D05DF + A62C9CB6661E3E6E76EE2261BD2D4819835B32E1DFEE8AB477EEC87B9B86A21C + 5D946568232B4800515182B02A1687729504E94BE230246389C64B271CD63F11 + 4EF8BAC0D67C58D739C0E6AD2EA97B2872DFA62227FC0132FD059091F6184F2A + 042150C60CFE12660817704322521ECE1509D8AF71A491F0BD311D95502A7D06 + C90A11C4BEB64266B52BD2DDB891102D8CB0726DB894F24232EF2884724F8323 + EA12F83C8511D0908DDDCAFBFB781345FA62DA5F41224F0E0679C288AAB145AA + EB4D14F8DD448A252B99AB3C806F9E0C829244E0EBCE83A7EED7C1E92808FFFA + 6C30C8EFEEBF192BD4E0477CFDACD000B1955A48CC5046A6C33594FBDE40A52F + 17D2ACCE2356ED0442554E20DCEA0ACC9C6F83DFE5091C4AA3B15D66E71BD21F + 028C4A7C61571504951431B8E52A22D9F906725DAFA3C683E4E37219A9164C08 + D7398310EBEB507AC10FE9580328C53CA7F8D86B41B74E93FE3014FCB600F7A2 + 1EE141B43862424490E6C8856A4F2EBC726347BC110B6CDCD92145FCC9692608 + 97CA388A1D25E2A4FA008BDB75FF2771BAB02C0984749C22A212E491E22E8412 + FF7B28F6E64794F54DF07A0B81C3FC2E94E22D21E8FE946E7BBCFF9DB3BFB288 + F4873CB15035F8BC49455CBE1D920395901E44D641BE520877958262A629ECCA + A320E02643B1E544CB275F038C26671691FE107240EBE89075B20D02136C101D + FF1C318936F0CBF7877C9C15C50D53768996CD761DEE513970F90FC5BDA10C72 + BB1A48BADE0F6A248A26BAF16FD6FCFF445959592FD2D2D28692929210171787 + C8C848848484C0CFCF0F9E9E9EAEB371B9B9B95F6766667A565656A2B1BE1EB5 + 5595A8AEA45481AA8A0ABC6B6D85B3B3336662737272CE66646434545757E3ED + DBB7C8494F43464A32D29312F132311EA9F1F1A82C2B85ADADED8C3C61D1DCDC + 4C575D6D2D619360616E0E33535398181BC3C8D0101525C5B0B0B098914F4949 + 417B7B3B6A09FBEAD52B6233012F13E291121F8BE4D818244647A2BCB8080FAD + 3DC0EE5C0A55FF0A9CB6C9C566D3BC9B144FF9A995D4AFA6A606AF489D53E3E3 + E836F5F5F5A1ABAB0B2D2D2D58A4974132A60941F91D78DD0D78E5B7E3AC4EEA + 1B8AA77C4CF154FDCBCBCA90426C26C54421312A12F191E1D00E4B8162511B02 + EA07A01DD7049F823E24D50C43E045413FC5070707D3F9AAAA2A72CF2BA59737 + 213202F111E1904B0C816C611B92FA4620FCAA8F8CBB6DE0732C01B7757EEB65 + A3F47514EFEBEB8B9696167ADD4B8A8AE836E3C2C360181C0FE9827748ED1F01 + 4F652FB8EAFA2153DC856396D56F4EEA66ED18F79F9B9B1BBDDD28BEA8B080B0 + A1507309816446139DBD4958CEDA7E3C2DECC471D3CAAE3D3A65BB26FBDFC1C1 + 011D1D1D74FF15E6E743C339188FC38A9040CACC57DD0FEEBAF7A41C1D386952 + 827D3AA5BF7DDC7ED6D6D669818181649C2984A97F3264428A60109A87AB690D + E0AAEE85546E1B582CCB705B4412B3F55FD256E7493B659ED0F4404D17C06655 + 8A9F646270CE221927B512905654873B77EEE0AFAE9FCDFCCF864D5207609836 + 0046D534FC76C71537849E808F8F0FBCBCBC257FC52F397CB57F038FFAD0398D + E8A1E3BA51F15B2503577F2AFD0F5F7F49DBBC62098D61C562DA95DDBFECE03F + B79947E6C61E1181F39B6E1F5ABF74EFEFDF7FF9D9C61F17D366DBBEFD6A216D + FFDAE5ABD5F9CFA847590A25E5FA483695863EEDC8F5936C0EB7104AD3BEC764 + B077F50FDB66E3D72E5DBCD55D8C25ABC7EF295A5C04D1E6C983AE406EBCF3E2 + 21DF05401D0F94666DFAF2F379BFCFC46F5FF9FDA91009E696626D369499B2A1 + CE911D4DDE9CA8776647B9391B8AB45911277319DF2FFAE2E44CFC869F961C0A + 78C8545DA3C7811A4B3634B9B1A1C5EF1A9ADCAFA2D68A0D35FA1C88916119FA + FACB0547C69905F3E7D1E6CF9B4B9BFBD967B4F53F2E61D0E03C5814FAF402B2 + F42FA3C6F91ADEF8B1A3D6E51AB20DAF2040FA3C64AFECEE5C387FEE168A3DB9 + 6F2B4D98F32CEDECA11DB44D6B7EA6EDF875E9096FE1B38D5EA227612AB00FBA + FC7F405380019A7C3BA17B6B376C048EC04BF8ECE817736987F76C5B47B39417 + A03DB9C542633EB68BB66DDDAFA4FCDF1E097E78BEA6DE8003657AA4BEA62C28 + B43C4FDF97E9B3A2C1900311124C83FBB7AE3DE46528F593A114EF77A25C6769 + 178EFE41DBFAFB4ADAAFDF2DDAA9C579A024468905B906D750EFC48536FF9B78 + ED7A030546D710FAF42CD4380EF47BDBE8A52707D8575BA83E2A5111E3663A77 + 9881B68DF0A4FCC7DD85CE34BA099F800929BF9EE06E68DFFD033A0244BC7FC0 + 98EF08623DAC51941E87C4104FC4F939C0DB426584F3FC915B1B57ADA06D5CF1 + ED9110890BB5F5C4CF25BAACC83762469E3913F28C2EA0449B05456642488B09 + 82ADB634AC35A506627DED47CD551EE1EA9903CE3F7EFF0D6DD5D2C5FB74B90F + BD8A53BE887CC36B78EDCC85F6C09BA41D49F90DAE20D4540ACF75E4C1C37CA8 + 879FFD7C689487E5B097A506C4792F352F5DB2E817865F979E74BF77BAC955F8 + 3829FF7EE8DFDD037DE1DDD015DC45CABF1306A26CB0527D0865911BEFADD41E + 35BB992841E7091F9819F77851DD9FB4FFE188272C4DAD66DC7865701525A697 + 5062CD8262D38BA831BE8AC8679C50BCCF0E73857B78A12E0E5783A770337C8A + 6DEB57F152FDE1B33973FEB36FDD72615B91E355E9BAA4FF92F2B705DC44830B + 17B2F589EDBB875FF35E64ACD491111A3555BC8F676237BB776D59ABBCE0F3F9 + BF7DD4957F59B268E185F52B970831ACFBFEC9C65F97887DB778213B39BE79DE + BCB9CB36FFFEDBD13DDB3770FCBCFCFB29D7C1A7D6CDAB04BD41E99FAEB757DF + 0FC456C52C9C0B040E9A5663BD44C4DFCA83B2B555261E4CAE6F71357294CE1F + 751D06A34D3BD68B86E1531CA37131D8BC9AC09F01B02702974201D914B2166D + 04F80246B1CBE81D568B4CCF63B76434988C3221550488E60102E980623650DE + 31164EF32677DCDDD6C01EA21D46DD58FB606A5D560978C327AB0D4775327027 + 0B90C91D631D4B815632BAD67702CC64DAB2DD1CD865056CD36AC4CA5B8E985C + 7626E35C7A1E87B4D2C19D0C5C27268E7A0262D1C0C8289049EAB0DB92F094AC + 46B155F3357EE3F7A2E7B19AF08F0A49F99EA5D2F338A099898BA4EEE77C80FD + F6007F00C0EB4BCE5B8DF1BB9F933D9906AD53AAC2CA3B9E582B1C8C75A2C138 + 1F44EA279741CFE30FC55430BA8DE210E1B79A8D892AFB1E3BE077B5267C7FF4 + 3E5DE3755843F258231C0206AA7EB2E9F43C18E4D3B087D8DA6303FAF10DEA8D + 748653581E365666D8BC7933A6F69920ACBE1F0C064B2A8F4C7A1E54797E93CC + A173B7EE933583AD35521362909395358DA7FB52E8CF3CB6CA65D139E1C7F2F0 + 70B4C14B32A74B2673D2972F53914EE687147FE2C48959F3D846CA4C8DD7A9B1 + 61482473B9A4C444A4BD7C89E7D6D6B82F248403070ECCDA1F57933C56DD0FA1 + F30951A18827F3393333335CB972198C8C8C7FEB5AF88DE441F11AAA4A606363 + 9DB1BE7FF547317FC9FD37CCF9B50579695AFC37695AB76FCEF1D257E1CDF0D2 + 4B4F0FB48D17BECD73F0D481BDB46FBFF97AD6F903C56B105E47906FAEBFB99E + 6DA4B32A72A31D51D75C8D92B2FC9127C282325F2E58F0495E5858906662A0F1 + B0F55D335AC91CBCB1B11E651545A86D7885DCBC34AC5FBBFACCA7F8470242F3 + 58028FA678563BE27E8133186A439152918F1292477AEE4B284808868CA79F33 + 670E6DCD2FCB8996D1BEFEEA4B3AFFC0DA6ABE5DDA8B4CFF824028E77BC1BA32 + 15556585642E5D809ADC48D88AECAE9843A32D9E3FFF73DA7D0E269ABA1817ED + F89E2DB45F7F5C4AE739B252E70765E4A6999918C3CED509C9A909480E734462 + 90153262FDB16FDD3215CAB6CCDDAB341F63199A92D035DAE19D1B68BF2CFF8E + CE2FB372A231BD70159097798C075282B0B0D547A8973D4C74E5C0C17639E1B3 + 39737F527F707D7EA8A5DC0E5B35D1BDB20257688718D64FF04BCF5FA4FD70FE + E2E7771E3D48157A2C0049E5C7303422EB0E55455C663E6FBB79CD8A2529810E + 09C9C12E3D2E262A83664A0F548FEEDAB870F9775FD3F9DF167F413BCAB0656B + 7C847F53408027C2C935EA1FEC0387E7667073B41E8AF273AECD4D8E18890B74 + 21757285B7A53AEE739E373DB26B333D0E7470FBC6CF3D1D6D428BF333E1E6F0 + 1C01BE9EF076B327EBA868F8B8DA2031D80DD6EA8FA12D25D015E96933E464A8 + 0CDE4B275E9E3DB883FE3C504BFEA14176941B22DC2D10E66E8540376BB2FE09 + 47424202423D5EC0495F16772E330EDD60391E14E460D8E7FB5C134FEF718C9E + DCBF8DFE4CD0CE54D527D6DF020EC6725096B849ECDC868DB1262C2DCCF05C4F + 11168A42D095E41B79AE26D1E56EA208031941B09D3910F2F5A2FF6CA3787B93 + 67E1165A8FA128C10B018EB310B97901D2A2FC90931486AAD45D48F1B3C2E8A9 + 0088EFE1A42B0577233930EEDDA6327FEE5CBAFF8EEC63603C75F80F1B2E9663 + 555CCC0721C6731EE2829C10BBCB052E36A6D6B347F7C42A8ADD6ED291E21F95 + 17E6EA66D8B4E6E1E7F3E6AD18EFBF549FA4B6F9F3E67DBFE287EFD8F7EDD860 + BD7BC766A7D5BFFE2CBB70C1E787C9A92FBEFC72E1CF3F2EFD76DF7FBE58B883 + 7C9F3BB9FFFFFFF8DFFF99F8DFDD1CB329EBFFDD46CA057F37FEC792A53C6DFD + 7F46276AE4EFC4FF6432B5215FF476DAFAFF8E6D36FE2AFE6711A93FE3FA9FCF + 2E1F7B942EBCFF54FCCFC55771C6F5FF09AB6218A4C77D32FE67642D39E3FAFF + 945931EE07BFF864FC4F838C218FC30AA6ADFF4F9995E09AE9E34FC6FFAEDA6A + CFB8FE3F69968BAB66927F19FF9B69FD7F5C2D021271767F2BFEB759401993D7 + FF6BEFBAC32221E06FC7FF961CB93AB881476DF49C46248E683E1FD92E73B2EF + 53F1BF8D9B37D0B579CB46DAAA35AB683B19180E301E3B6AC6C0C060B062C58A + 8D2B57AEA46DDCB891B661C306BAA6C52BD6AFA2EBB715CB68E49EA37A95F532 + D888B66C588B35BFFD8283070F7AAD5AB56A56FE8EAC315DDC9286B49B62CAB1 + 0A265E78A8E30156A167B87CF3018E1F3DF49E704B77EFDE4DA3F431AFE6914D + 97924B3A4DDE3123CE30B4011A7ED550F0AC06BBA227D66FD9D9FBFBCAE53F6D + DDBA9546E9635EC8388C76CF389C764FDF9F26ACE31BF7D0340A42DA01B8AD19 + 84133724F1D38AE579649546FEBF2537D86FA7F17CCFEC69822A7634665947DA + 292927030E39675C95B401ABA41DF61C3DDBB4ECBB6FE61E66D84213B87088C6 + 73F6C0343E5C559016A9CC430BD793A329AB596DD8C2A1367052D81CE7EE6A60 + 3FB772755FB0F177CA9C2797246B088AD59ADE1B143EBD73D1B99DBFFF4044FB + 7CEE67B464351E5A9CFC555A81F62DC61657B584470FC406B75F5302A3981DF6 + 5E93226BFAFBC3B54E8A431D252F87AA235CD01B66F1AEC250A0C7869791CE47 + ABF0D2C29EB29F4832921A1DCC8F40A1F94368983A40CA3A0EC5C6C2785B9E8F + EE8652A46970A2CC44001576F278A975AF83F09184FF26428E8316A174ABA8D4 + C30895FED664BDCB87819E4E0C7577E2959D2C861A4B60CDB20C66CC3FC2ECC2 + F2F771B2ACA837178225D7DED64405765AA422F71FE10AB74693741F22D5F031 + FCA438D1FBAE05F5D6E268CB8E419606078C2FFD8A643D09842BDCD4AFF3D1A8 + ABB47E88905B9B9A09DF91A179C73040921341D25C8890E381A3C8457496E693 + F2DE46928D3A9AEC1FC18C751D2294EF20528127A623CAA8B731C402D657D736 + 2728B0BF33BAC3A45FA0C68328A9EB08787815B6026750131B8490C7D75060A3 + 840E6F3564E809A3DC45098D7E5A83EDF176E88E21F3349E3DA0A683F33FA37D + 26CAB4372D48F402F295B810F4E00C3CEF9E8197F00594190AC0479203AD760F + 811C7FF4E547A1CA8413BACC3F75C6CB5FEF2283F0B7E3E3F0AAA58B4FDC3DB3 + 3346F3FA813E3781538816BF80D887CCC854E346E8934B48D4BC831859363CD9 + 4ECB8A93BBD643F83F07F1A9DB7F36FCB294E92CC35AA5F3BB7EB73CBD63ADDE + 8FDF2CDE93A1C69D98A6726380F0F434B40F9300AA0FD2827B3E235224CA234A + 275AF0713F25C7967D389F46B47EE2B84FFB7C222DAE8C9E86D8D641DCC8E86C + 660E484B1A8C7A1447D4F6417197035E26DCCBE96A952DEE6B23E9D3887EA1F3 + AECD4FB9D33A5F07BF19C0ADD496F6031E99DDAD491A68CE304153AE0D5DD4E7 + AA043DECF4C8ED552AE8E895C8ED7E4BB82CA2F934BB7A39D9BCAEB65B896FDA + 0F38A50CD5A51AA131CF1D35092E28F2314391A711AAA2EDD090E382D8785B9C + 092819F1ACEF1BDEE8F7A68CB0EB6996AF0E7F69555AB6ED79726F55AC16EAD2 + 5C511DEB83CEFA4A7477B6A2A7B3059D7565A88C704475A22D74FCDDB1CF25EF + FD62ABE26CC2D2FD1068F348BBC05B12D54956C496073D6ED0D1F10E4DAFA957 + 54FBC734DA8DCA200B54C49921C1431E292F8454279E995872C515783D4659A8 + 05B15B8CD1A15EF4F676E385AD29C9A719EFDF772126DC1B1DE509C8F7500795 + 9662C6F90403B6B66C1771E4396B62B0AF1923EFDF51EF184349511AFE3E4E50 + 5290445A4A04063B0A9066F610545A8A19E743D559DAD29E0B20E7852206C93C + 6884E4D1D5510F5D1D153A9B9F93000CB560B03513A90622A0D252CC38EF257F + 362E569F1D598EE47AA98827D56DC460573D92E342D0D956050CBF017AABD15E + E88B97960F41A5A59871DEFE31A3A29F221352AC4551E6A1417CD5020C923A8C + 9081749468B89D7C6E4199A30C122C8541A5A59871DE4CE4E02EA2A240B9D3E4 + BC384A3D34D15E9D437C31F60E5A7B751E4A5C551163220C2A0D95966226F76F + 1DFE3D828E1AF77A7DA54E2252E726128CC59164F80889FAE2883520F3282D6E + 04A971C05EF54E2F95768667408C050564CE111B3DFCFCFE41B808EF868FE85E + BAA8CFF64F98909C94389A92924C947264EABBF3414B89BA2B2A2A101818D026 + CBB95DE929FB9638A2B60FA23E2B92735D65656520698788D64C7AFEF1155129 + D100D1E6D9E606E4DC6F441D44AF89E8F38F2F17CCA7AD5BF635ED8F9FBFA6E2 + FFDBF9CF6DE291A6E2FF4C9B6F1F5EFFFDDE754B3F1DFF5F387F2E6DF7AAA5AB + 35C7E2FF89F4F87FD8D38E5C5F2AFE7F2F4D5B88C960EF9A1FB6CFC6AFA1C7FF + 99678EFFBBFE8BF8BFD34CF1FF4B58FA6FE2FF967FC6FF174F8AFFCF59F8196D + CE82397491FB368306C781A2D0A7CCC8D2BF3216FFF7FD33FE1F3816FFEFF862 + FE3C7AFCFF0BD66F685F492DA3FD47E207DA578F964DC4FFBD1FCC10FFBF3D16 + FFF7143E33BA74FEC2C37356CFA72D52584E5B24B79CF695EC32FA7EE358FCBF + B66172FCDFEA3C0A3FC4FF5F1B722055E2F2E0A2350B8ED19E2C5E3A5FFA9B25 + 5F487E4FFB4A86F04F97FF19FF579C1EFFCF37BA8638D90B10E4D9DEBB4BFB68 + 8E60A8682BBBD7ADBA5FB537192F90FCF67B8A9F1EFFDF458FFF6B0BFC0163DE + 3DB8CFBB15A73DAFC2B5C20765E565882B49846D9E03F69A3386913C16CC16FF + CF37BA8052CD4B10787E16B7B225A09D6508D76C0F449444636860084F12E5B0 + 48EE47D1F1F87FEC47F1FF66B2FE49D5BD0876B7AB10C995C1E37439C8A5ABA0 + ABAB0BD1B9B1104E788CD5BA5B13668DFF0BEC823AF70EB05A32E30519138A1B + 4B11D79088809C20B047DF86D84B69AC50F9DD6AFD8F4B8E44488EC5FF2B3FC4 + FF8BAD59506276110DFA57616276016C317C304F788E88BC28EC8B3A855BB9C2 + 60F1BCDEFCA5F4D2B5E3F1FF1722C7AB323E8AFFE792FCCCF90F35AE135A97BE + C5F7D0F0EFFE7F604BEC011C703D55B744FEE7735F3D5D3653FCFFFE47F1FFAD + 64B45FB058FAC7C3DF6AAE14FF5EF9575ED2FF7EFECFD31F688B657FA4DF1716 + 2E5C48CF60F9F21FE75B58988FFAF9F94ED3A7E27FE39BB2B2B24B4040000607 + 0730323C8C61A291911110FE93CF3D29FB727272EE54228AFF78FB2BFEC489E3 + C62121C1F0F6F6467E7E1EB13F88818101BAED71FEE79F7FA6C5C7C7D3D31B1A + 1A4EE1CF9E3D4BBDCB4F2F6F6F6F2F5DC3C383F467E26E6EAE74FE53FE20BC16 + C5F7F4F4A0B3B313FDFDFD68A8AF878787079C9D9DA6D5C7C0C0E0F54C3CF50E + 4117E1A9F7085EBC7841AF07B9CFD3EB31FCC19F1FF8A299F8D6961634B734C3 + C7C7070E0E760824BE54575723BEE8A797A97FA09FCEEBEBEB174EE6CF9C3943 + E7DFBC6924B66B403DCFA7CA4231549DFE54179DD7D5D52DFCC8BE0EDD7E6B0B + 1A1B1B10121244FFAD0AE50B2A9FC9A2361D6DED29FC850B173EF87F90CE4447 + 46A285D483AA0FF55EC1F89E12B56969694EE1972E5D7A74FFFEFDCE3B77EEB4 + DEB993419D9D9DBD94F25DF39B3778D3D838A63763A2360D0D8DC299FAEFF8B6 + 6FDFDE27F477CE1BEA515F5F3B45D4A6A6A6FA499E9999D9E053EFB21B191956 + 7E8A3F7CF8B06A565616D5E746485B4C5176763644454573FE77BFC7F37F5BA5 + EAC78E956A9F502DD73B6752A67942BF54E59841A90AA35581C401ADCCDB3B17 + A5716D9BF329BEE4D911D63A57E1AAE628433445E8A329549BCC0DC4878AE58F + 8764DCD8FEE55FD92F963BF8F32BB36B11F5EE125DB56E12BDB54EE2FD059247 + 2C3278762CFC3BE52F943E2459E722D65FAE71C6BB58FE845D838F3272440E58 + FE1D364F7CDFEA2A6BBEBA4AB39BD539F776B31129D6B9CB224FF880F35FB1B9 + 42BBE796281EF7A87E21D49F25B04B208D7BFB9799B7FED0A875914691CCC9FC + 04A6F59F7F8ACF11DA73A3DAE66E5FB9F695BC0C1E0696548E6D9BB204F7DAD5 + BAC8A0548DB52BF6F4EF8B666333F9762EAD30BEF9B6CE551AA5CF980A72840E + 0464DFDD1F5C2473AAB4DE4D09656AD7066218D7AC98F11D2CEE1D730A1E1DB5 + A6EA9929B0D7726ABE7BFDABED2451AEC989C823ABA7BDCF924EDA93B4CBC95A + A7C728D7616F4DB9B2E5F0F8B9D8536BBF4B3CBB5EA1D2EC3E2AF479117D7415 + 5BC8BE959F4DF9EDD1DD7D3EE5FADCA31506BC287976A92DE9D266DDE8E36BBE + 893ABA7A5322F366875CF1E36F8BE52FA3489619295719A243F6FFC2F0FFFAF5 + F76FF528527B8D78B886DC8310950AA140C56E417FD96E3E1FC90A5E4F09B91B + 6E0FD67C8A9588D466150F536F34C97642626306725A0A91D69C0DDF57611009 + 5700BBF3BD46367B7ED6D958B130F51EDFCA485476D520A4211AD615CE302BB3 + 8373B52FE2DE24433A410B976C797A2E58734DC94322426B35615F7B9487A2B4 + B31246A536D0C832864AA61EB40BCDA055688A67F97AF0AD09C5FD70399CB5B8 + F6FAA4C9E5897E485879D55473E4BF2B8129B1A755600285979A13F77BE92C55 + DC4F948568AA3CBCAA8371CAF63A8E195E901FE745829F5578BD0A810B29A752 + 860E64D3D4F0205A7A82E7F212026F94246E449079709E2514938D7048EF4CC5 + C46F4703E4FB42EA62A05D640E19C2CEB6718489E15EBC3C6C0A3DB04FFBF8C4 + 6F2FF97D65FADC5F05422E470B8F33953EC90BC6C8E179A12776691C9EE06F79 + 3DAED0CAB480668119EEA7C8802F5E0C573DF9A77094B8C21F4235D31C4F6374 + B14375FF44F9B9DDC5E4593DEFC2E35510EEC44B8327469C5EDFC93C7BF003DC + 087D0497F220ECD33F812DCABB26FCC7E1727FF5354781D742A46DDC2A02267C + 45B71B2C4A58517011D6B92C109C1EC214FB7AA3C28E29F791CB2F6EB1323FE7 + EEB9132445F208863AA98F40941CEE44C8422DC382B064DEEF711F5B9476F510 + 76C63E78CE929DF594196B23A3E525C825E8C32CD70566392E908AD1C41EDDE3 + 14DB381B3BF11CC08865CD61FD737207744E56ECD13CD6BD53FD50F77695BD15 + 5B94FE90DBA0B063CD7FF7F5FA6F3655EBAA65DA6605DBFE0DAB66E4B1494A31 + 26D1D8A674D0D4B6C8F39FB0A6A64EBB5DDDC2064DCC631118D3071BD78AA1BF + CB1E1332FD4AD23CEA556971E9684C4CFAE80BA71C3C7D96504A9D7392B938EC + 2ACB32329B1C9E5E19B9A3ED3D6A99D506C7E03494149792B5462494D5DC0F52 + 7CA4C645D4F95D9F51D5BEEC7864E649D6BC6DD048E980646815A44CFDE1AF27 + 34E1FC28AD4B4830669FA638630E4818BAC33AA70DEA491D9008A8029BB20F22 + 0CB84031E3FC75335FB495C6E26D7EF01429D947E345512F34D3FA211DD58A1B + 7A71A8C90C444B712428669C67310F434F7532FDF777E3CA29AE8279662DDC4A + BA209BD0075EB34C32FFEF98384F31E3FC2563BF69BC8235598F95BF856D4A09 + 6E1B254D612951CC38CF6AE03E85AFACA9C765F6DB9034F1477052D1146E5C14 + 33CE5FD37198C267E4962235A76C466E5C1433CE7368584F2BFF5F8962C6792E + 55937FCC53CC387F5349F71FF31433CEF3CAAB43C1C4BC5744C3A0FBEF8A6266 + 7AFEFFBF2A1191BA35F7856AE5EE0ABDAAE0BB53D97DEB4E7937375F5905175F + B11CFBEDC24FDEBF4484EB598584AA1BF58CDB1093F81E99050348CA18804750 + 0F04C4EAC07A33AFF1127736EBACECBD9A1E0FEF2E94568EC0276210868E83D0 + B619C473F72144A40E43EC69332E7065F69C654F9F9287B070ED6AC2BE7674ED + 4661C508D4AD06A160D80119BD4EE2D7F790371AC0139DF7700B790FBE07F538 + 753DF535E3B5E489F183B0F272CFDE22AB70986E4FDEB81F8FB5DE4158A56F8A + F8A4BBE1E4FB1E472EE6E2085BC2C4F825285455E1ECDB0B1BCF4148EA74808D + A77546F149764149AF07520ACD38C01A37317EDEB957D1E71B3E0005E34188A9 + 76CC3A7E337334E3A6D03B98D97462CFC59889F19B87AFBCCFDEB31F626AEF71 + 57B9EF93FC0D81B7307BDE899D97A226F81BB74B2A9474DE41DEB01FDC12DDF4 + 7433E9225733B9E776E0F1D33A6C3B1F31517E76DE42F9F3D72AE0E0D9876B77 + 3A7045E0DD34F6027B23AE7036E285632F765D4AC226A6B009FFB1F1E4AF66BD + 95F3FAD6FD7AD87BF5D27D75E9C65B3AC7C2D1880BD71A7189C8D6A1076CBCC5 + 14FB7AE3F9E029E33F336716EB398E8C9E1BFC35B077E985BC5A3BB8F89AC1C1 + DD04399577B0B5EBC165EE126C660AED21EC8C7DF034FB4BD6E357531A0F5DC9 + C4639937D0377A4797B85403FE608EA7D8C6D9D8711D654B5C73E05282DC3ED6 + 988ADD97A3BB779C8FEADEC61256B1F942A8DCFAB3C16BFEA7CEFB69FB1A30A3 + F6948E697BEA98B6066126F6F2952CB493AE5B5E3EBBA8F3FCD4CFF67FB7C2C7 + 3C756E116D4C0B8916107D4644FB9C7AC841F435D1F780972FD9AFD29EC653F9 + 7FCCD2F9492CED0740478FEC573C99919FCCD28F7F3E95A5AD988527FEA1F8C9 + 7627CE4D6269BF7DE097DD9F91FF6C529DA79CFFC0D2D6CFC29336A1F8C9BE9A + 38F781A36D1A13DDFFCB0566E627F96AC2EEFA49FCAE5978D29E74FE235FD16D + 6FFA939D9527ED49B5FF3476FD5496929CE2CC3CD5FFA8BE41F967B2287BE3A2 + 582ADDC7FC585D9FD0FD3A21926636FD4FBA6EFF0BF156F87C } end end diff --git a/server/test_form.pas b/server/test_form.pas index ffa008cd2..f8d7db318 100644 --- a/server/test_form.pas +++ b/server/test_form.pas @@ -33,9 +33,8 @@ interface uses - Classes, SysUtils, Forms, Controls, Graphics, Dialogs, laz.VirtualTrees, - fsl_base, - fui_lcl_managers; + Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ComCtrls, + ExtCtrls, laz.VirtualTrees, fsl_base, fui_lcl_managers; type { TTestNode } @@ -57,12 +56,17 @@ TTestNode = class (TFslTreeNode) property index : Integer read FIndex write FIndex; property Name : String read FName write FName; property Children : TFslList read FChildren; + + function describe : String; end; + TTestForm = class; + { TTestTreeManager } TTestTreeManager = class (TVTreeManager) private + form : TTestForm; public function doubleClickEdit : boolean; override; function LoadData : boolean; override; @@ -74,15 +78,28 @@ TTestTreeManager = class (TVTreeManager) function getSummaryText(item : TTestNode) : String; override; procedure changed; override; + procedure focusItemChange(item : TTestNode); override; + function addItem(parent : TTestNode; mode : String) : TTestNode; override; + function editItem(item : TTestNode; mode : String) : boolean; override; function executeItem(item : TTestNode; mode : String) : boolean; override; function refreshItem(item : TTestNode) : boolean; override; + function deleteItem(parent, item : TTestNode) : boolean; override; end; { TTestForm } TTestForm = class(TForm) + btnAdd: TButton; + btnEdit: TButton; + btnDelete: TButton; ImageList1: TImageList; LazVirtualStringTree1: TLazVirtualStringTree; + mFocus: TMemo; + Panel1: TPanel; + ToolBar1: TToolBar; + tbAdd: TToolButton; + tbEdit: TToolButton; + tbDelete: TToolButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private @@ -103,8 +120,19 @@ implementation procedure TTestForm.FormCreate(Sender: TObject); begin FManager := TTestTreeManager.create; - FManager.Tree := LazVirtualStringTree1; + FManager.registerControl(btnAdd, copAdd); + FManager.registerControl(btnEdit, copEdit); + FManager.registerControl(btnDelete, copDelete); + FManager.registerControl(tbAdd, copAdd); + FManager.registerControl(tbEdit, copEdit); + FManager.registerControl(tbDelete, copDelete); + FManager.registerMenuEntry('&Add', 15, copAdd); + FManager.registerMenuEntry('&Edit', 16, copEdit); + FManager.registerMenuEntry('E&xecute', 18, copExecute); + FManager.registerMenuEntry('&Delete', 17, copDelete); FManager.Images := ImageList1; + FManager.Tree := LazVirtualStringTree1; + FManager.form := self; FManager.doLoad; end; @@ -128,16 +156,19 @@ function TTestTreeManager.LoadData: boolean; result := true; for i := 0 to Random(10) do begin - n := TTestNode.create(Random(Images.count), 'Root.'+inttostr(i)); + n := TTestNode.create(Random(Images.count-3), 'Root.'+inttostr(i)); Data.add(n); for j := 0 to Random(5) do - n.Children.add(TTestNode.create(Random(Images.count), 'Root.'+inttostr(i)+'-'+inttostr(j))); + n.Children.add(TTestNode.create(Random(Images.count-3), 'Root.'+inttostr(i)+'-'+inttostr(j))); end; end; function TTestTreeManager.allowedOperations(item: TTestNode): TNodeOperationSet; begin - result := [opExecute, opRefresh]; + if (item.Name.Contains('-')) then + result := [opEdit, opExecute, opRefresh, opDelete] + else + result := [opAdd, opExecute, opRefresh, opDelete]; end; function TTestTreeManager.getImageIndex(item: TTestNode): integer; @@ -152,11 +183,11 @@ function TTestTreeManager.getCellText(item: TTestNode): String; function TTestTreeManager.getCellColors(item: TTestNode; var fore, back: TColor): boolean; begin - if item.Index > 2 then + if item.Index > images.count div 2 then begin result := true; - fore := clWhite; - back := clBlack; + fore := clMaroon; + back := clWhite; end else Result := inherited getCellColors(item, fore, back); @@ -169,7 +200,25 @@ function TTestTreeManager.getSummaryText(item: TTestNode): String; procedure TTestTreeManager.changed; begin - // do nothing here + // do nothing here, bu we could save the tree +end; + +procedure TTestTreeManager.focusItemChange(item : TTestNode); +begin + form.mFocus.text := item.describe; +end; + +function TTestTreeManager.addItem(parent: TTestNode; mode: String): TTestNode; +var + n : String; +begin + result := nil; + n := 'Node.n-n'; + if InputQuery('Add Test Node', 'Enter Name:', n) then + begin + result := TTestNode.create(Random(Images.count-3), n); + parent.Children.add(result); + end; end; function TTestTreeManager.executeItem(item: TTestNode; mode: String): boolean; @@ -182,6 +231,21 @@ function TTestTreeManager.refreshItem(item: TTestNode): boolean; ShowMessage('Reload '+item.name); end; +function TTestTreeManager.deleteItem(parent, item: TTestNode): boolean; +begin + parent.Children.Remove(item); +end; + +function TTestTreeManager.editItem(item : TTestNode; mode : String) : boolean; +var + n : String; +begin + n := item.name; + result := InputQuery('Test Edit', 'Enter Name:', n); + if result then + item.name := n; +end; + { TTestNode } constructor TTestNode.Create; @@ -208,6 +272,14 @@ function TTestNode.link: TTestNode; result := TTestNode(inherited link); end; +function TTestNode.describe: String; +begin + result := + 'Name: '+name+#13#10+ + 'Image: '+inttostr(index)+#13#10+ + 'Children: '+inttostr(FChildren.count)+#13#10; +end; + function TTestNode.getChildCount: integer; begin result := FChildren.count;