diff --git a/Notice d'utilisation des signaux_complexes_GL_V10.6.pdf b/Notice d'utilisation des signaux_complexes_GL_V10.7.pdf similarity index 83% rename from Notice d'utilisation des signaux_complexes_GL_V10.6.pdf rename to Notice d'utilisation des signaux_complexes_GL_V10.7.pdf index 6b18986..a7da3c2 100644 Binary files a/Notice d'utilisation des signaux_complexes_GL_V10.6.pdf and b/Notice d'utilisation des signaux_complexes_GL_V10.7.pdf differ diff --git a/UnitAnalyseSegCDM.dfm b/UnitAnalyseSegCDM.dfm index cb2c8bf..29ca8a1 100644 --- a/UnitAnalyseSegCDM.dfm +++ b/UnitAnalyseSegCDM.dfm @@ -1,6 +1,6 @@ object FormAnalyseCDM: TFormAnalyseCDM - Left = 193 - Top = 60 + Left = 206 + Top = 145 AutoScroll = False Caption = 'Fen'#234'tre r'#233'seau CDM' ClientHeight = 596 @@ -11,9 +11,11 @@ object FormAnalyseCDM: TFormAnalyseCDM Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] + KeyPreview = True OldCreateOrder = False Position = poScreenCenter OnCreate = FormCreate + OnKeyDown = FormKeyDown OnMouseWheel = FormMouseWheel OnResize = FormResize DesignSize = ( @@ -23,11 +25,12 @@ object FormAnalyseCDM: TFormAnalyseCDM TextHeight = 13 object Label4: TLabel Left = 1001 - Top = 520 + Top = 512 Width = 27 Height = 13 Anchors = [akTop, akRight] Caption = 'Zoom' + WordWrap = True end object ImageLoco: TImage Left = 688 @@ -56,6 +59,14 @@ object FormAnalyseCDM: TFormAnalyseCDM Transparent = True Visible = False end + object Label5: TLabel + Left = 1005 + Top = 528 + Width = 24 + Height = 13 + Anchors = [akTop, akRight] + Caption = '+ -' + end object ScrollBox1: TScrollBox Left = 8 Top = 16 diff --git a/UnitAnalyseSegCDM.pas b/UnitAnalyseSegCDM.pas index 4ac35a0..94f4635 100644 --- a/UnitAnalyseSegCDM.pas +++ b/UnitAnalyseSegCDM.pas @@ -53,6 +53,7 @@ type ButtonAnime: TButton; ImageLoco: TImage; CheckBoxAutres: TCheckBox; + Label5: TLabel; procedure FormResize(Sender: TObject); procedure CheckSegmentsClick(Sender: TObject); procedure CheckConnexionsClick(Sender: TObject); @@ -77,6 +78,8 @@ type Shift: TShiftState; X, Y: Integer); procedure ImageCDMMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); + procedure FormKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); private { Déclarations privées } public @@ -4717,7 +4720,7 @@ begin CheckDet.checked:=true; LabelPorts.Width:=160; LabelPorts.Height:=23; - + KeyPreview:=true; // pour avtiver l'evt onKeyPressed ImageCDM.Top:=0; ImageCDM.Left:=0; formAnalyseCDM.Caption:=NomModuleCDM; @@ -5579,6 +5582,22 @@ begin SourisBas:=false; end; +procedure TFormAnalyseCDM.FormKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); +var i : integer; +begin + if key=109 then + begin + i:=trackbar1.position; + if i<90 then trackBar1.Position:=i+1; + end; + if key=107 then + begin + i:=trackbar1.position; + if i>50 then trackBar1.Position:=i-1; + end; +end; + end. diff --git a/UnitCompteur.pas b/UnitCompteur.pas index 0afa421..1143987 100644 --- a/UnitCompteur.pas +++ b/UnitCompteur.pas @@ -668,6 +668,7 @@ begin end; with CompteurT[i] do begin + tb.Height:=15; gb.Width:=LargComptC; gb.height:=ofsGBH+him+CompteurT[i].tb.Height+ofsGBB; gb.Top:=(gb.Height+5)*((i-1) div NbreCompteursPLigne); @@ -769,7 +770,7 @@ begin // imageC <-- FCBitMap (on écrit les vitesses) <- ImageCompteur (grande) // créer un bitmap réduit qui sert de référence - Scompteur[i].FCBitMap.Free; // zizi + Scompteur[i].FCBitMap.Free; Scompteur[i].fcBitMap:=tbitmap.Create; with Scompteur[i].FCBitMap do begin diff --git a/UnitConfig.dfm b/UnitConfig.dfm index 45afad1..f6742a6 100644 --- a/UnitConfig.dfm +++ b/UnitConfig.dfm @@ -38,6 +38,909 @@ object FormConfig: TFormConfig Top = 128 Width = 249 Height = 177 + Picture.Data = { + 0A544A504547496D6167659A700000FFD8FFE000104A46494600010101006000 + 600000FFFE003C43524541544F523A2067642D6A7065672076312E3020287573 + 696E6720494A47204A50454720763632292C207175616C697479203D2039300A + 00FFDB0043000201010201010202020202020202030503030303030604040305 + 070607070706070708090B0908080A0807070A0D0A0A0B0C0C0C0C07090E0F0D + 0C0E0B0C0C0CFFDB004301020202030303060303060C0807080C0C0C0C0C0C0C + 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C + 0C0C0C0C0C0C0C0C0C0C0CFFC000110800B400FA03012200021101031101FFC4 + 001F0000010501010101010100000000000000000102030405060708090A0BFF + C400B5100002010303020403050504040000017D010203000411051221314106 + 13516107227114328191A1082342B1C11552D1F02433627282090A161718191A + 25262728292A3435363738393A434445464748494A535455565758595A636465 + 666768696A737475767778797A838485868788898A92939495969798999AA2A3 + A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8 + D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FAFFC4001F010003010101 + 0101010101010000000000000102030405060708090A0BFFC400B51100020102 + 0404030407050404000102770001020311040521310612415107617113223281 + 08144291A1B1C109233352F0156272D10A162434E125F11718191A262728292A + 35363738393A434445464748494A535455565758595A636465666768696A7374 + 75767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7A8A9 + AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5 + E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00F6609F28 + 14A1702A5F2B28BED4F58706BF63B9F94B5A9E05FB54FEDF7E0CFD98BC6B63E1 + 5D622D56F356D434D9B56B85B24461A7DA44923EF7DC46E67F29D5507271938E + 33E7BFB497C61F09C3F0847C4EF03F86AE3E2678DEE6C65D33C3D0DA1926D2F4 + 684ED93FB52EE25FF5F2832324300FDDFCB2198905623EA3FB697EC79E09FDA2 + 7C09A96A1ACE9E2DFC4D6DA5CB6163ADDB3797776D1C990518F2B247F3B7CAE0 + E3736D2A4935F8E3F013C57E3CF837F1635883C27ACF972785C5E6A1A858CB79 + E4DAEA70596E7B85D84ED6631A3B0C7CE003B482057C1711D4C43AEE936B95D9 + AB7657DFE6D9F6590D1C3BA3ED127CCB7BF99F437C17FF0082BD7C44F06F8266 + F86FE3EF1778FF004DF0A8998ABF86EE868D7FA797FBE92A42B1F9F177DAE095 + E42F0401DA4FFB2FDAF8EBE1E4FF00103C1BF10AC7C51A248CCE26BB8A64BC69 + 3201472371F303100EE0A4672428E6BC6BFE0A85AA5BFC69BFF04FC44F0FC135 + F689AA68496F73A8C71EF4826F3246486775E1660AC46D639F94E381537EC7FF + 00B74F84FF00668F1AEBDA6C3A0F896E3E1AF89ADED659AC0DCC7717BA65F7D9 + E34BA963DC5564467F300048628B0E4E4115F331E6E5E687DC7D24A2AF662F88 + BE227F6AE856275286EF546BC9E78A6BA689609E154588A793759632C87CC3B9 + 268D95004C64B9D9EFDFF04B6D357C1DFB7EFC19D58EA9E5E91797CF2DF26A68 + 2CE6974A786E60BC7EA639A23109D18AB64EC73B140207CDD71A9FF6824DA3D8 + FF00A6697717C6E2CA378375CAB728AC801CA332150CA321B626725148FA013C + 0F7BFF0004C9FD9ABC51F10BC6D6EDA0FC5BF8A3A1DCF873C05E19B91E5EA5A5 + E9F7B1182FF5CBA8BEF401AD8CB6D6EAFB59CCF2C980A8A5AA6ECB953D5F4335 + 1EC6C7FC12EBF6B3B8D13F693B4F006A9E75AAEBD149A74B6F701A3922B98636 + 9226656E4310AE9EFBFE95FA49E2ADCBE16D47692185B4841F43B4F3D0D7E23F + FC13A7C61E24F18FED8DF0C7C3FF006A5D4157584FB34F771F9D73A5C71A3C8E + F04D912C615118EC0E10E39535FACDE22F89FA9784EE6E74DFF849341F11DA49 + 1496EC5889AEADEE3692B1B3DB01E57CA19B12C440087337391F5996660E1809 + C2AAF77549FAADBBEFF99F3399E0D3C6C2517AE8DFC99E8BA1E8B6FA6D905B78 + 63B78E43E6948D022EF6E59B03B92724F52493EF56DADBE9D6B17C19E2AB8D67 + C27A7DF4D64DB6E23E44254952095276EE231C646189C11C03915B9697B0EA24 + 88A45665E590F0EBF553C8FC457A94AA45C138F63CF9D36A4FD4F37F87E638BE + 31F8D34DB8B3B75BA98C774B24518DB35B12C17CC381962E5F8F9BA3735E9DE1 + C81603711C6D36D42AC11DB72C590785E720719C741DAA8E95079D25D961CC77 + 5228E31C616B53C3B1EEBDBE3C9C141FA1AD32B4E3CBAF57F8DD91983E64DF92 + FC2C5EF2F9EF404C03EFC558F230697C9C8FEA2BDE3C6E52B797C534C78FFF00 + 555AF2B07F0E2B90F8C9737F67A05AAE9BA9DC68D70D74AFF69816195880AC3C + B314AAC24466652DB7691B47CEB9ACEA54508F33F2FC5D8BA74DC9D933C3BC76 + DE6FECEFF142D556391ED5FC4A634650EB9FB55EB2F07BE477FEA2BC7F4BFF00 + 82617C21F8CBF0F3C35E205B5D63C337FA96916B7772DA45E848E777854B3797 + 2ABAAEE249C2803AF15D27C6FF001B7C44F86FA2F8A2E2EBC25A7F8CBC37AC41 + 746E27F0F492457D652CE192590DAC9B8B445DF790ACE532F9936E02C7FB03FC + 704F8CDF0134CB792EB4B3AD787E03A64D6369725AE043022A24CD1B7CCBB942 + F2328B9EB9381F332A387AF5FD9555ADB66BB76FBFA1EFC2B57A541D5A6F4BF4 + 7DFBFDDD4F25F8F1FF000490F877F0F7E16EA9E22F0DEB9E20B6D63C376771A9 + 192E5E29D6F446858465511020246370CF539071C78F7ECDFF0003BC53FB407C + 27F889E19B8F121F0FF817C23A55D78A7FB36D74E8B6EB1790A79896C5C2AE23 + 53E5BBA316C130B0439C8FBE7E38DA7DAFE05F8D23E0EFD12EF1E9CC0E33FD05 + 7C97FB05EB9A6E907C5174DAE87B7F195BEB9E1AFECCDE0F9139D32DA4B798A7 + DE51232CF0E4F0CFE50193D38F1597E1E9E22114AD16B5D5AFBF53B30B8EAF53 + 0F3937769AB5F5F53BBF8F9A541FB387C18F84FE27FED9F1A78AA1F146991CDA + B5A6B3AEDDDD5ACF18B384A20B78D910450ACF2C81140CF96A18902BE77F087E + D61E28F09DEF899B42F0ADBE8F3788A1B6F3ADAC50C3268F1C324D2AF92AE8DF + BB91EE1988704EC2AAACA3691F497ED95E30B8F09FEC25FB38788AD5566963D3 + ED2D1D18FCB2C771A3F952A13FED47BD73DB39AE13C63FB5EF807E25FC31F116 + A76B6B30F1B6ADE2F9AF21B496DCB470599B0B7B2F25E6040283C913284DD878 + A3240C607899D51B627DD5BA8FE48F5B29ACDD0F79ECDFE67BC7ECB7A96A167E + 17B3BDD72E56DECADF556934D9AE36431AE96CEAF6CDBB81B446D8DC793B393C + 57D6F0F85AF2F7E1CC3E38F11789BC2BF087E1ADD00D67E29F179612EB208DCA + DA7E9E1925B8565E55D99038219164539AFC06F8A5F18BC41E2C9AD2CF53BEB8 + B8B6D2605B2B4B790FEEED228FE5540BD323B9EA7D7A0AD8F875FB48CD7CF61A + 1F8DB57D5EFB43B38BECBA6CF3DC4971FD840B16DB12B121606624B228C67E60 + 01CE63079957A149D1A2F96EF7EBA7636C465B4AB4D54AAAF6E9D0FD9ABBFDA3 + FF0065196FBEC775FB4C7C609AEF38FB7D878420B7D3D4E472226B36936E403C + 927DEBACD77E0E78913E193FC48F863E3AF0E7ED19F0E347266D41F45B6165E2 + 3D26318662F6AA4ACA555492B88E5C6488C819AFCA73FB3EF89B50D21753D22D + A1D7B49954490DE58CE8EB2A9E410370393EC0E7B135D7FEC49FB66F8CBF605F + DA174DF18787A7BC85ACE658759D25DDA38B56B50DFBCB7953D7192AC7947018 + 74C542C66214B9A35257D1BBB6EF6DAE9972C1D06B97917DD6DF73F45FE1F7C4 + AD0FE2B787E3D4B41D421BEB57018EDE248F23A32F507F4EB5E67F1CB48D79BC + 510F88B446934E9A2B98EDF56892EDFF00D32D536C48E91056577550088C8058 + 9EAA496307EDF363A4FEC9DFB6668BE36F87BB21F87BF1A342B6F1CE8F6F18F2 + EDD7ED3F35CDB851C2AB1DB2851C279E00C6D18EDAE35A87C43A03EA969E635A + DE2FDAA167653B94A8618DBD00CF43C8C1F515F472CC219961796AAB496F6FC1 + AFB8F06182960311CF4DFBAFFA68E7343F1ED8E97A65BE9BE20B4BBF0D6A51C1 + 1C5FE913B5C5BCDB50007CEE32C4F04B60163C126A8DEDC789A1BD9921965112 + BB2A0F291B0A0F1C9193F535D76B7A0D9F8A34AB9B4BEB58AF2D26DC1A390707 + 390483D4120E323079C7B578FDDFEC5FA7BDD48D6FE34F1FD9DBB3931411EAC7 + 640B9E107CBD00E07D2BA70B56BAA514D732B269DECFE7D0CB134E9BA8DA6E2E + FDAFFA9F52227C8B9A72A61454823CA85FE21D29CAB8FAFD2BE9E4F53E5CC1F8 + 81A3C7E20F09DCE9F33C91C37E8D6F23C67E655656048F719C8F7AFCAAFF0082 + 88FEC0FA5DCFC65B1D53E145BE9DA5EA9A96971DC78A3C2736AA9672E91A90DD + 15C4F686EE506E2C2E8A1B88DD1DBCB170D130528547EB1F8A5CA410A7FCF473 + 91EC0579CFC41F855E18F8C3349A6F8ABC3FA3F88AC63B48C245A85A24E2262F + 2E4A161946F7520FBD7CC66D83589A8ADA493B7FE4B7FD0FA0CAB18F0F06FA35 + 7FC6C7E567817FE09C777E13F85DAC788BC75F103C23E09B5BA86286C2CE2F37 + 56B9D5F3201298DA01F65C44A392F3819600726B6FE09FC35FD9C3C3FACDADA6 + A7378BBE236A91DD19534B544B48F5011A6F653E4C8BB632AAC38BBC8E4E3A57 + D41F1ABFE08E1E11F881AF2EA9E15F12EB1E1692344B76B2BA53A9593458D823 + 5DCCB246A14003E66C76C62BC0BE0CFF00C12DFF00E321345F07F8824D37C557 + 4CB7D757B6926AB3E996F0AC0AA12390C76EF2E779F315918092329FEAF764FC + B4B2EC4297235BBB5FFE1BFC8FA48E61425073E6D95EDFD7F99E8FE3BFF82E20 + F865E1EBDF0FFC15F86361FB3F6A8AA161BDD134DD364B864383FBC965B76BCC + 95E43ADDF707E615F17FC43B6F899FB40FC478F5EF157FC24DE2EF1178B2E088 + AFEEE299EE7509490001BC65C92CA06D279603B8AF7EFDAABC3967FB2C7ED9F0 + 69AFA0F84593C3B6E6EA5BBD2B44F32669AE22FB5A3C82EA5904CD1B3A22C929 + 24AA31237649FAFBF66CD17C59FB516A5E07D534ED33C53AFDF683E2BB6D4D2C + 2C239EEA33A6ED475956D631E5C691A4AA9B82800C4C3764E2B86541D1ADEC1D + 92BD9BEDDFEE3AA35F9E97B68ABE97472FFF0004DCFF0082482FC14BC97C5DF1 + 5B4FD2F52D7AFE036D61A1BEDBA874C46C179663CA34CC06D0AB95552F924B61 + 7ECDD7BC37A7F85345BAB4D2EC6CF4BB34D1AF02C16702C11A0C274550056DFC + 59BED4BE0CC7A7CDE29F0AF8C3414B8B958A06BFD29EDE2B966046C499F10B3E + 327CBF3048403B558E14E1EA9E33D17C6B1EA16B637BE65E43A55D8B8B3914DA + 5F40ACABCB45326F407B3346573EBD2BED68C7094E84E961E49EAACEE9B774BA + FDFA23E46ACF1352B46AD74D68FC96EFFE00FB3F0FDBDDDA43710BCB6B712448 + 4CF030567E060BAE0A3F1FDE071DB1D6926B6B98B6FDB2DE3BE8D7959EDD3122 + 7FC0324FE28C49CFDD159BE03D4B5BD3BC19A4B6AB602F646B64334967283342 + 48CED28C1436DCED055B242E719AE8B4EF10D8EB32F976F708D70ADB5A09018A + 607D363004E3D46455C250714BE17D9FF567F22674E49B6B55E5FD5FEF393F87 + 3E256F15C5AF4DA3EA36B7D058EB1359B452AB66268D630D1B37DF570DBB3BC3 + 11D31C1AEE3C10D25CC9A97996EF6B22C88BB5983071B01CA90795E71C80783C + 573FE1FF000B5A5CDE6B6CD03413FF006948C25899A2990B244C70E30D863C91 + 9C1F4C715D078623D4B4DB9D40AAC7A9C2B2A0209586E40F2C1F411B1E7A1F2F + EA6B6CBE4D38C9EDAEDF3E9BFDD733C76D25E9FA1D01872D9A0C3934DD3F57B5 + D4EE1A18D9A3B955DCD6F3218E651EBB5B048FF68657D09AB861E3A7E95F4119 + A6AF1678CE2D6E5336F5CEFC4CF05DE78CBC2F35AE9D796BA76A05488A79ED7E + D11AE4824150C8C036304AB0383DC818EB7C8C1A468703A1A9A91538F2CB61C6 + 6E2EE8F977C67AA78BBE11C6F75E25F06EA13D8C243B6ADE1B2753B6840FE278 + B6ACF1803D51946492DC64F88E85FB35781FE31CF6BA87847C651FF6569B79F6 + 9B64D3ADE15D474B2771F2D6E0E2E238C336424808C9E3B1AFD1044F2A4565E0 + A11CF4AF907E247EC97E15D7755F3A3B7D43C3FE20D3CB1875CD267363A88E48 + 2CEEB9127FB4640F9E80815E3E330FEF462FDE5ABD747A5B66ADE5A7E27A984A + C92725EEBD36D575E8FF0047D5E8799F8FBC6FF10BC1FAC78B3C1B1DB43F1134 + 98F407BA96E6E268EC357B58655923DC3AC771E5E0EE040761CA91F747CEFF00 + F04EFF0087FA07ED33ACF8B3C1DA969661D5EC0DEEBB6DAEDA5DB477D69B2DD2 + 3840451F3471CF1C6D96623748A300B06AEE3E25786BE2DFC32FDA75AF2EAEF5 + 2F8896ABE1BBDF3D34A68AC6EAFF004E1BE34F3E0385774964495963DC4A8EBF + 7B15FF00E09EFF0006BC7B69E0BF106A1E07F0C4DE20F12EA73DC456F6D1697A + 81D4EC1D62222B8865B5864DD1B348434330113F94BBB2335F3F88AF0F6D1F6F + 7514DDD4BB69B3FC376CF730F49FB17ECAD7925671EFE6BFE024745FB5F6B967 + E34FF82507C0BD42D248E54B1D4F4FD3E6D9C7952C76B730C88476C3478FA60F + 422BE39F855E1D5D4E3BC9DB6EE9AF6708A3B0F3769FE607E35FA45E17FF0082 + 2BFED3DF153E04E9BE11D53C2DA1F83FC176F716BAACCDAE5CC5A7C715DC1018 + 04CC0CBE7AE63C6FC200CCA0ED073BA2F0FF00FC122FE0BFECF0D19F895FB5A7 + C2DD125B47324BA678514EBD2839C9F9630B206CFF007C3F3D8D7978CC7D3AB3 + 528DDFBA96DA5D2B1E96130B3A51717D5B7F267867FC17FF00F663F047ECC5F1 + 4BE1AF85FC27A2E9FA2EB5E1DF87BA3A78AAE2D90A9D67529BCD792790671E66 + 029DC06487C1276AE3F34FC4578F35C470C7F2B49D48F4AFD1AFF83817F6A2F0 + 87ED73FB5F6A5E2EF00DF5E6ADE1B934ED36C85DCF6725A996482DDA373B2401 + 82EEC60B019AFCEF9BC6574DE18BAD0F6C0D6726A316A0ACC999239238E48885 + 6ECAE241B87731A7A73E6C60BD0F4B999F577FC12ABE385EFC35F892BE11BEB9 + B893C37E260D6D0073BA2B4BA6FBA39E02CBCA91D37943EB5E9DFB637C3EBFF0 + 27C55B36D4354D435ABBBED320336A57F299AE6FDE35F2BCC91CF2CCC8B193F5 + C57C1BA378F2F3C3FA7BC76BFBAB8C868A70C43DBB0390C873F7811907B1AFB1 + 75FF00DB7D7F6C9F865E1F875AF0F9D2FC6BE177686F6FED48FB0EA904883E70 + A4EF8E5DF1825794E490470A08C5A95C6ECD1F66FF00C144249356FF00825DFE + C4DAE6E669E1D035AD34C87A858A7B7445FC0262B4BF625F10B78C7F65EB3691 + B75C5BCF756CFF0079881BB2B9C8F4230013DBA722A87ED98A353FF82237EC8F + 75F785AEA7E22B2CFB1BB90FFEC959BFF04F5D7E3D2BF67D5B7B9323473EBAF6 + 90E264608D228FE0C8645E0E49CE7271DC57A5954946AFBDE7F91E766316E969 + DD1EFF00A49FB5D942DCE2401BEB9E7FCFE353344DB8E3CCC678C74AAFE1619D + 16DFEEE7CA4CE06D19DAB9FF003F4AB8E30C7EE75EEF83F88AFA5C0BFDCC7D11 + E2627F8B2F565A6D7FC59E1A9F17DA2DAEB1663FE5E74F9FF7B1A8EED195DCEC + 7FBB1A607A9AD2D1BE24E91AA6E59266D3E68F1E6C578BE51873D03364A06FF6 + 4B6E1DC03C574623C81506A3A1DAEB2ABF6AB7867F2FEE33AE5A33EAADD54FB8 + 20D7BB2A3561FC39DFCA5AFE3BFE67CEFB483F8A3F77F96C721E36F1D69F6FA9 + 450CD24D1C36FE62BCE6DD9E3CFCBC295C9EA083C7627903359DE19D66D3C43A + AEA5716338BAB78C44AB2A2B796CB83C86230C0B6EE5491C1A8FC5BF03E6B28D + A4D22EF51B7B7F3CCFE5C32B3143B8B1F9460B939C6496C8E0A919CF9ADAF8B7 + 45D1BC6775711DE69363AB5C2F98D73672C50DC4990546F0C0B4921238002A1C + 119E08AF9AC463AAD3C45AB46DADFD74B68D2FD3D4F76861613A17A6EFA5BD35 + BEABFE0AF99ECC8BBA1B8F518C7D42822BE7FF008D571A87C3CFDB7FE1C78934 + 6BCD2B4E97C4D1DFF87EE5F50B27B9B6674B58E685E5F2E44745DA64432296D8 + 36B32B2AFCBDDFC35F891AA1F05E91797DAA697AACD756705C5C99D45BEF91E2 + 563E5CD1028DBB04AAEC66231CF7AB17DFB277C52F8C7E28F08F89B5DF86DABE + 8BA4F85B5CBBBC6935E6B6D1ED6EEC2748ADC82D79346AE1ECDAE2320E0166CE + 00C1A55B30A16837249DEFF8A7D3C8AA385A8E535157D2DF83FD4FCE9FF82AE7 + 8FBC75E15FDB33C4D21B68740BE934CB18F526D1EEDAEE3319B458F1E73451B8 + 89D33B91940CB10770009EF7E057FC147AFBE3C7ECEFE17F82B1F8AA1F85F75A + 4AB43F61D3E1FB0E99E30B8762566B9922C3BCE72AA11CB20DA0469D87D37E3C + F861A7FC0397E3E7C4EF1A7C50F84FAAF88BC41F0875BF05F87F41D17C49FDBD + AC5D5C4D63F64B67945BC4F179CD016591BCDC17909030723F15AD3ECB05B4D3 + 3497906AD63750B5B04E136FEF3CC278C89158445791C6FEE057CCE32A46AD79 + D485ED776763E9307074E846125AA48FD6AFD9DFE36F8D7F621F8ADA7683E32B + A8FC49F0BFC6B20D3FC51E1B7D43ED5A76AD61215599FCACEE8678C3EF8A5011 + C3A603101C57B7FC31D52E3E14FED5BE3EF833AB6A126AADE099359D2747BBBA + C35C3411B703BE0491469215FBA190FAD7C61A7FED3FE1BFDABBC01E0CF26E48 + F1969B770C5AC58496CD1B3EF015A646C6C68DA45CE03646EC1515F4AFC4EBA9 + 752FF82FAFC4C64DDB1358D7D5C2F4F92C6E5727F103B8ABCB6A4E35E37EAD5F + CF52730A717465E8FF0023EB1F0943E778634D931F33DA44C7F1406ADEA7E1DB + 3D62D7CABBB786EA31C2AC89BB67D0F51F85677C3BD4E6BCF0769AE1AD6F952D + 61490DB931B23F9484AE18907191CEE1F4CD6F5BDE43733F97B8C72B748DD4A3 + 1FA03D7F0C8AFB184E2E093DBCCF939464A4DA389F0F786F5ED33C43AFC90EA5 + 6ED6FF006958AD2DEE6269A3F29628F8660E195B2CC370FE100107031DB7804D + C5D595E3DE5B456975F69DAF14571E7C6308982AFB5490410795041C8E7A9A1A + 1E5351D755BA2DF8DA3D8C109FE64D6F7844F9ADA87B5C2FFE8A4ABCAE9C60E3 + 6DB5D3A75FEB433CC2A39295FCBF42D6A1A45BEAD0F977104770AA772875CED6 + F553D8FB8E6AA7F65DFE98736773F6A8874B7BD624FE13005FFEFB0E4FA8EB5B + 4211FF00D6A511F3E95EECA317AF5EE7931BA31A2D7E012AC3751CBA7DC390AA + 97185590F6092025189F40777A815A0D0E3A8C7D7B54F359A5C44D1C8AB24720 + C3A30CAB0F423A1ACEFF00846DF4D19D36E1AD57B4120335BE3D02E4141E8119 + 40F43D2A79A715AEBF9FF97E41CA9EDA13345B7EBDB15E27F109ADF469AFEF2E + 2486DED6D5E632CB83B2345624B1EF85C1E31C9E9D2BD91B5B6D387FC4CAD5AC + F1F7A743E75B7E2E00280772EAA07A9EB5C8787B5AD0FC33F113C51E39F10C29 + A97857E0D68F3F8F2F6D9986CD4AF232134AB52791896E49743D336A99C8635E + 56698C8D18AABD55F4F376B1E9E5B85759BA5DEDFA9E55F1C75FF863FB09C5A5 + 78ABE2E785D3C79F18356D303E81F0E669CC367A0D8C8C1D6E35B619DF248CAA + E2D082A36852A48F353E73F8ABFF0005D2FDA27C7B64D61A678D2DFC07A228DB + 6FA5784F4D834BB7B44EC91BAAB4E001FF004D6BE6DF8A1E3BF167ED15F103C5 + FE3CD7A6BCD6F5ABF965D6F5CBEC164803380CE7B244995451F75542A8C002BC + 4EF3C75ACDF4866D3F4B87EC39CA1BB98C734CBEA17F873DB7738F4AF83A9375 + 26EA54D5BEA7DCD1A51A7054E1B23D63E297ED01E2FF008BF78F71E2CF157893 + C51331CEFD5F539EF981F6F359B15C4CDADED1D781E95912EB71DE6976B711C9 + F3DC2132C2410F6AE1994C6D918246DCE46410473DAB32EB58C1EBC52B1A16BC + 47AE2C42691B695442C41E84019AF15B3F0C2CB62970C1A38DB2598AFCB90718 + 1EBDB8F7AEEBC69ACE34AB9F9BEFA6CEBEBC7F5AE6E1D566B8F09DADAB4D33DB + DACEDE5C4CC4A445B2720741939CE3AF14D225C8A71786F2A1820618CE09F98F + F9FAD7B2FC1AD00695E0A86E86337B712AF078C22C78FD59ABCB6C67690AA80C + CCC76AA8E49F6AFA1F4DD174DD13E1B78420D3EF9F50125B4B35C486DDA1D933 + 49FBC8C0639608C0AEEE036DC8029C9590A326D9F787ED1B746FFF00E080FF00 + B38C91A34D35BF8FF58D3D114649324B78C140F7C0AE07F663F105C7C39FD9FA + 7BB96CC2CDA4F8A374D1C9959C32C1BC031E012A32D904E4EEE31B70C7ED11E2 + D96FFF00E080DF09EC6DA465B8D2BE2CDFAEE46C3266DAE64C823A1F987D0D79 + 37ECF1F1EB5AD53F6789B47D726BAD5F6EB36BA7D9DF4E91C50C710B49CAC265 + 003BC8A2263B79243027A739C25C916FD4551733B79A3EDBFD9DFE2C45F15FC3 + 12DC2C7676CD6EE1638A09A79B29D0317921883F2083E56F5071F39AEF1D0063 + FBC8D79E854923F1AE2FE054F0F8A3E16E936F7D343A85D5BC3B8B799BDCFEF2 + 451206E082769F9800460F7AEA4F872653F26ADAD22FF0AA946551E809524FD4 + 926BE9F2DA927878BDF43C1C6462AAB47A481D3F4A7AA73EBED595FF00097476 + 43FE26167A96960725E683CC8547A99622E883DDD96B534CBDB6D62D45C59DC5 + BDDDB938F360904887FE04A48AFAEE64DE87C9F2B451F191F23C1FAB37A59CDD + B3FC07B57CCFFB42FECFBE15F187827589F59D16CE49A1B0B89E0BC84F917116 + C42E0874C1EA070723AF06BE96F8889FF1426A9DF741E5F0339DC42FF5AF94FF + 00E0A43FB5669FFB2C7C21B496E34B9358BEF13CD36996B6FE67950AA988F9B2 + 48F8246148C2819627B004D795984E0AF2A9B25D7E67760E139351A6DDEFFE47 + 1BF13BE2C5E7FC13FBE057877E17F872EAFADFE226A9A45BEB5E25D7B5094497 + FE1582E638E7B6D2EC1F005A3985A3B89A58F12833471071E5316F9B6D7F6909 + BE200921BC6B7F135BDAAE4FDAA275961463CBC6E401F331E64DAC493F7B915D + E6AFF11A1FF8295FC48F1B7C42D2756B3D1F5CF185E5F5F6ABE183A818A6B1DF + 978AD4B10AB73684AC4AAC420FBBB941422BCFBC57F0E359F87CAADAF787F57D + 3E69976DB4D345E5C49CE5B2483BB701C0561C8CF2073F9DBE596FAB3EFF0096 + CAC69E9F17877C4516E5BABAD0AEA4521D2746B9B71D30A8C32C7B7CCFB00CF4 + 039AF09F1FFECEBADDF6B5A96BD676F69E20B1BCBD90ADD6952A5D2819C2A7CA + 72CD8033B030072326AE78CBE3C3782BC68BA69D33CEB5B708D39F30C72CCAD8 + 24C47955E38CB0619078E2BB4F037EC4DE2ED76CAD7C51F067C47178E747B898 + 091B49BCFECFD7B4C126DDF15C5B96C96031911BB93B73B429A4BDD7A3FBFF00 + CC528CBA1A1FB0FF0080A6B4F1469724B6B716F36A1E21B4B25F3A228D88E45D + E3040E8CE01F75F6AFB53C5FE28D1FC3BFF05AFF008B7AA5EEBBA25BC8DE2BF1 + 1D8496979706DEE1039B8891A3DCBB6505815DA84B0C0C800827CCFE13EA9E24 + B4FDA07E1BF84F5AD325B1B893C4563676F06A76A7CDD33CCB9890344080396F + 9892ADB8E7A5770DE11F06FC5DFF0082A0FC594F1168F75E23D423D675FBAD42 + DA440D6F2CF15DB9FB541B3E70E8FF00BC1CA019E2B6C3549FB78B4B5D3CD7F9 + FE06189B7B1929763EA8F809E37B1D52D5B498E4DD3320BAB7995C3C77881235 + 93611FC71B140EA7040910E3078F49FB325CB796EAB223E32A572A7F0AF04F84 + 9F0AF43D43C1DBB4BD6AF346D734BBC379A55CBDFCCD1432C90A91E644EC6275 + 667954A005B6123200E3D03C39E2EF175CF8625BB86D74ED6B51D3E616D7BA63 + C66D6F2D6752BBD3218C720DAC1D4E230E8CAC3A815F4984C55A8A525D1EDAFE + 1BFE07CF62282955728BB7AE858F8657571E238B53BE8E46B36BA9ADEE05B91E + 6C51EFB2B76D872013824FDD23823A6315DDF82629D4EA3E72C6ADF695C7979D + AC3CA8F9E7A679E3F53D6BCABF67CF895FDA1A0CB1EA5A56A5A5C82686DD5CD9 + 4F242E5618D013208F0B9C00093B4F627A57B3785E3FDFEA0BDC4EA0FF00DFA4 + AEFCA2A46718496FADFF0013933384A0E49F97E85D11739C52F927DAAC08368E + FC75A7345FE457D0DCF10ABE591DA93CAC1FBBF855B68700FD29AF167FCF4A77 + 029F9783C706BE1EFF00828A7ED91E05FD9C3E0A7ED09F0EAF27BBFF0084DFE2 + 9DCF85DECAD6CE0DEA2D2CE479E492790E1635382A1012C5981DBB72C3EEA68B + 9AFC96FF0082CE7EC01E3AF1BFC50F8AFF0018BC370C7AC7857C276BA0DEF88A + 269BCBBBD345DC6D651491C6DFEBA1DF6803143BD5A61F2155671F37C4F6FABC + 5BFE6FD19F41C3AFFDA24BCBF547CBBF0E75CD0BE30EA1716ED72B1496D63792 + C504B288F337D965F281C9C32B485539E85C67039AE5352BB749995B706CF20F + 07E86BC32DFC4179E1FD563BAB39E4B6B8B763B2443C8EC7EA08E3D0835EA9F0 + BBE3D3788F528ED754B1B3B8B82A5419230D1DC01C95F5463CF438FA74AF8D8D + BA9F612BF43535CD574C86C6D56CE6BE92FB0E7501340B1C31C99F9444C18990 + 6CDBB8B05C3640040CD73B75AC7DEC56C7C5CB9D2D05BDD695A7DC69EA5CC730 + 79C491CA480CAC83195C7CCA412412B901738AF3F9F522D9E6B5E546674EFA65 + BDD58ACB7DBDE37F99514E323D7FCFA52695E15B2D6AEE4B5D36E23B3B999711 + C176DBA0B93D76EEC655B8C8CE727D2B16C3C52D244B6F32B371B6361DBEB597 + E28D63FB2E3DCBF7F385E7BD73734E333A3962E27A8FC2ED2B5AF056B53B4DA3 + B5ADE03B6398C45F62E0E5A37E460E71953FD6BD4358D5649AD2CE4B8CEE58D9 + C9273DC7FF005EB8BFD8B3F6A2D5BE1E78DAC6CF5F65D4349BC7547F346707B0 + 6F53D8370C09EBE9EC5FB704A74CD3F4FD616D748B6B7BF92E61B696C0102E6D + B28D0492924E662A5C31000CA74E335A3A9CCCCF91A3D87411FF00096FFC10AA + FB5398EE8742F8CFE4267F8449A6313FAC82B96FD80E3B76F016B5A6CEB1C82D + FC59A7DC1431BB3BC4CA490A4E22C65390C73F771F2EE0777E16DC797FF06F4F + 8D6CDBFD649F196DAE109EE4E9F6A08FC326B9DFF827C5C6A975E15F17DE58BF + 99A5E9FA8690DA9C610B794185DAACCD8FE1565552082079809C2A961A42EEE9 + 18D4B5B5F23EACF1F5A5F7C379EDBC45E1B8868763A5DCB596A30C912B450DB4 + F223873147BF72AC8724AB8386E0004E3D13FE124F1AA7CBFF00088F8667C71E + 62EBD322C9FED05C700F5C76A6E9D7DA2F8BB58D734937961AAC1A944EEF046F + E679D06C8924639180BF38049EE78AF2AFF8573F193C3BFF0012FD2754D3E6D2 + 6C7FD1ECA4942891E04F9632DFBA3C95009E4F35E9518F227283934DBF85F54F + EED4F3EA4B99F2C924D25F12F23EA74B1D6B4CE60BEB3D4917A25DC5E44C7FED + AC436FE1E57E3546FED6C6EAF7ED1AA7876F2CEEBA1BEB3432B9F612DB9F3C0F + 52CAA2B7A2D7AC8BAC724C2DE46E152E54C0CC7D83E377D5722B4563FF003E95 + F7124A5B3BFE27C4F335BFF91C078AB17FE0FBCFEC7F112EA491C90A496D7023 + BA31E654C02CBB2453FF005D198F5E3BD792FED27A3E93F10FE06EB9A7F89BC3 + D63ACE9975107DADB6E2385B700241B82BA380C70F182C3B11D6BDCFE2EE8D69 + AC787EDFED36B6F70DF6A863579230CF18DE18ED6EAB9DBD411EB5F3FF00C76D + 0BFE118F056A86DF52D4A387ED16F1A5B4D37DA166CDC47C03206907CB93F2B8 + 0003C57958F8FBB3BF45FD6E7A3837AC12EAFF00CBB1F941FB5E7C1BD3FE047F + C149FE2E7813C0BAB4DE10D37C13E33D7F4CF0FDCC97B2F99691D9CD702DE113 + E7CCDEDE5244AE49259D4B13C9AFAD3C05F1E61FDA9BF61192F64D53CDF13787 + E08E2D5AC96E70F23C52C59BA685481B5D36B6EDBB433380460D788FFC167B43 + D217FE0A5DF1B24B6B4812F2E3C6BAEDC3BC670B216D4A40AEC31839F98F6CE7 + 249AF16FD9EFC17FDA1E2D9353658DBFB26232E4B00C19888C60673FC67240C0 + E338C8CFC23A6A4933EEF9ADA1E87F1D74BB3BDF85DA8DCDC411C93D922B5BCA + 47CF1333A8F94F5E73C8E86BCEBF661F8A7ABFECEBE39D1FE25697ABA2AE8FAD + 43A7EA3A4A5C18E6D42DA48DA46575E8D132C722E4E76B853D715F627C34FD82 + BE2D7ED19A1DBC9E1DF84FE39F1468F7855E3B987439DEC651D41F38A888AF71 + 96C1C7B57CF973FF0004F8F15689757175E228BC23E07B792795C0D7BC516167 + E4217254797E7349C2E380A4F1D0D115195C4E5CACFD3FF0DE8DA5FED0FF00B7 + 5FECF3E2AD0759B6D63C3371A826B779A925EF9D05A5969AF05EDCB39DCCB16C + B7462C9F2E1B391B98E7C2FF00E0989F1CA0F8F3FF00053AF899E2BFDDD9E95F + 64D675C9AEA67090DBC32DE44A0B3B602F32E727B035F3E683FB49F84BF643FD + 97FC59F0C7E0FCD71E25F89FF159C693E26F17D9DB491431E97942BA5E9A8C04 + CFE749BBCC95954C802AAAEDFBDEEDFF0004F7FF008274C5F0B561D5FC59690C + DE309ACFCEBCB2BBD3EDF52B6D20CCF135B5B98E456C5CAA46F24841055678C7 + 03E66ECCAE8CD57528ABF2BF438B32A90F60E3376E6D0FAF7E06F83EDBE2A69D + AA78B17519E4B5F105E4D2E9B22DB40616B6F930CA1E2DCD1B4A26646241D8C8 + 5481B6B67C5BF0EBC55E074B8D5B41D6BEC91A40CB7D2DBC0F752B4414E2616B + 23E25993939F372CB940BCA95E675DF88DAFF82FC4674B8B5BD275CD69905CC7 + A5DBF872E649E3B7DDB4EE68AE0AC2A5810AF200090C06EDA71B7E1DF8BFF132 + F85CC72F82B47D3DF67FA1DE5DEB43C80C73832C48AF2F1C12A339E9B876F6FE + AB8771E4B352EE95F5F95D2FC0F0FEB35AFCD74E3E6FA7CEC3FF0067EF8BAB3E + 9B32C71D8EA10DC3C6B6EF05DC70CB7402004C713B65DBA0281B703C63D3D9FC + 13E3AD365BFD42DAE276D2EFBCC566B4D410DACD10F2D0721B8FC89EBEB5C87C + 3CD074CD03C056BE1DB811EA76B0DBA4371F68815A2BC7E4C8ED19CA80CCCC76 + F20671D3AF67F0CFC35A443A4DEE8F6F676B269565324B0DB36258AD59D72511 + 49223C7DE0A0003CCC800115D781C3E228B8C7993F55FE5F9BBFA1CB8CC452AA + 9C92B7A33AF681A33F32B03DA831FB7B56245F0DA2D1D7FE24B7FA868BDC471C + 9E75BE7D4C526474E38200F4CF3486F7C4DA2498B8D3ECF5AB7E865B193C8B80 + 075631C876B13D95587D457B1F58947F8916BCD6ABFCFF0003C9F6717F04BEFD + 3FE07E26E343F351E5607E95856BF14F4596FBECB7571368F7854B791A940D6A + 71FEF37C9CF61BB279C0C574617CE89645656471B9181CABAFA83DEB68558CD7 + BACCE5171D245578F3FD2BE12FF829F7EDF1E0FF00D9C7C33F1CFE17DFDBDFEA + 5E24F8AFE1AF0CDBD98B578CC1A69B3BEBBBA77B925B7216468B622A9DC1F71D + A304FDE7B0927D6BF263FE0B17FF0004D3F187C40F8D9F127E29F8366B7D634D + D27C3D6BE2BF10D85C4BE4DCD94018593BDBE7E59954C28ECB9575126155EBC5 + E234FEAA9F9AFD4F7387ADF5977ECFF43F353C27F0CAD7C4FE2FB159AF9AEB47 + 5BB8BFB516D87977B15AB3A89648D4EE0C554923193903E539ACB8113C0DE2FB + AB4942E74DBA916325B3BF6B90AE18750700861C1ACF1ACDC68B789716F3496F + 7109F95D1B04763FE4D74DA3FC406F88314763AB5BC46660441729F2927B023B + 67DB8ED8AF8B8EDE67D93DF4363C49AF5AF8C7C1B25C5ACF1C8F0ED95E10DF3C + 673B5B23AE39383E95C686C0FC0D59D6B408F4C8924F255668A4D8CE18FEF01C + F51D0118C71EA2AA2727F5ADB733D8B1A5AF9BAA43F5CD3B55D56CC5BEAD6D73 + A7C77D71736AA965334ACA6C6613C6E6400101B3124B1E1B23F7B9EAA08AA599 + 1F746CCAC3A106923D264D42292E1BF7877EC6FC856728DDDCD23B1A5E08F184 + 3A1CAFF6A4976EDF97628DC0FA73FCEBD97C41F19ACBE307C06D334B9353B78F + 54D26E92596C6662920E76B1889E1D4862D8524AE4E46315E2F63E07B8D4DA28 + ED639AE2EA7216386242F248DE800E49AFB0BF63BFD92BC2DFB2688FE337ED11 + 0FD8749F0FA7DB7C3DE0B970352F14DF291E547244798EDD5B0CFBC7601C053B + 5E7979751B9773D3BF6C1BE6FD943FE097BF08FE13DD2B5BF8A3C617D3FC40D6 + 6CCFCB25A24D1B5BDA0917A863130CA9E4340C0F22B88FF826B78635FF001EF8 + 6358D264D2AE23F06F89B5ED363D57593284DA2CC4D22DA46ADFEB1A569D7715 + E630A87F8857CFBFB457C7FF00187EDC3FB45EA5E2AD694DC6BDE27BA0B6D688 + FB62B48BA470A963858D1001B98F0AA598E4B13F7CFECE9F0A7C79FB2A78434E + F0FEA10F877C45A4F87C5C4F6FE4EB634FB78A5725A79A559A240EC43940D2B3 + 796870768C29D693D5A5D9EDF71CD5B44969BA3DE3E10FECCAD65E31BCFF0084 + 5FC59AF6832DE299E0DAD15C0573B41F34BAEE9A145880557214191FE66C8C7A + D2FC0EF8AC146DD7BE165C2E38965D0AF84920FEF36D3B727A9C719E95F377C3 + 9FF828D7857E146B9BFC53A1EB1677B1C662FB2E977D61ABB2CA71B46639C1FB + A720BAF19E171C9F648FFE0A37E01BE8D665D0FE29C8B30DE1FF00E114BC7DC0 + F39DC0E0E7D4706A31D53D9D771C34B963E4DAD7AE9EA183A6E7493AEAF2F357 + F4FC0F6C6844919560195860A9E73F5AE3F5BD6D7C29AA4D1C9E17F135B58C6D + 98EFF4545BA81C103E66B6858CDBB39073038E3EF1EDDBF97851C53D22FDE0FA + F1EF5FA5D68F3E9B1F9EC64A3AB573C8354F8D1A0F8F746863F0EF89F46F115D + 5BDFA2C962EC20BE8982BE448980F1E003C18739183EDF0EFF00C15E7E18F8D7 + E256A9E0ABEF0C5C7886C7ED3BB43BAB44FF00906ABCCEBB6492646DD1B48DE5 + C5992301B00020820FD15F0CBC9F8A3E35F88F7BACE9163E225BAF1CDE69F6B6 + F736A9244905AA4CAA58BE55407918EEE58E7E519C01F3AFFC154FE1C7C60F01 + DAF86751F872BA93F84A19925BAB4D2EEA4B8920D4C48ED0AC76B233B796B1AA + 91E52E19B797500201F278AAD3AB425CEAFD34F27A6F7FCCFA7C251852AD1507 + 6EBAF9AF97E47CE7F0EBFE0A3BAAFC1FBF7F86DF1C3E1B7867E28587836E25D1 + 2E1B50B686E756D3BC891A29104CC1D25F2F695054A12147EF0F5AFA7BF6AFFD + 943E17F807E08D97C4AF85BA443A6691E228AC99BECD7B2C96CD0CD89229238E + 4DC577861BB2FF00294501465ABE69F0B7C44FD98BF6A6D51E6F8A5A7F8AFE10 + FC50D4A690EB5AEE9533C9A56A77B231134D2412097C969198B3A048914B37CE + 3191D478B35FF8A7FB27586BBFB3D6A979A4F897C03A79175A75FDCD81174B66 + D309E19E1915F0A1A4600A3F98AA647556E057CB72EBA687D2F4D4EA3FE0B47F + B447C44F0BEA7F06FC31A4F8EBC61A5F8517E1278508D1EDB57B88AC11DF48B7 + 766112B6DCB6E3BB8E71EB5F0CFC31F87579F10F48F166A10EA16F02784ECEDE + FEE2291DBCD9D26BD82D3318008255EE109DC4003D4F07EC8FF82D2D89D4FC6F + F0DA3546F32CBE12F835B77738D12D09FC839AF8CFE095EDDDB78EE6B286668E + 1D5ED5AD6EE30389A359239C29FA490C6DC7F76B7A4B4D4897747D2FFF0004FA + F85DAD5DFC506D4F4196E9B5286C5E7B61A3FD925D662500A3C9145732216E18 + 3108EAC54750B9AFD19F811F111BC23A3B586A5A829D46DE532DE9D42D1F4AB8 + 84CA58869D2E1C7EF642AEBB96E664629B50801547CCFF00F04A1F82BE19F1F4 + BAADC6B5A3DBDF5C5958B18A60EF14D6C4DD32EE49232AF1B6171B948207422B + DF3C6DE1793C1FFB68782FC27A1EB97B34DE23D0EE2711F886793598912DD6EF + CA84F9C5A56899A493EFBB11962B835EDD3A3569E194E9BDDADBCD9E157A94AA + E25D3A8AF657FB91DBDBFC69F0BE9BF19B5ED3F509A18753D42DED2578E69021 + DA88E026E936863F31608A58E2424020E4F7FF00DBBA6C76FBDAF7FB342AEF54 + B86F248503248593195C77008F7AF86FE347C3CD474CFDB0FC3B0DFE93E1CD0E + 3D43565D164BDF0EA3AC49703ECE4CA914AC7685037007A3BC9C9040AFBE3E0B + FC13B1F86FE28B7D3EDF49D275A56D3A59273711ADBB5C490C90289CC20341E7 + 1F35F2C89106DDC91815D997D6AD3BC1AD9EFEACE3C7D1A34ED35BB5B7A235BC + 1FF09FC41E28B813DF5C1D374523EE344D06A379F43C8813DCA79879C08F873E + ADA16936BE16D322B1B3D3FEC5690E76AC0A194927249C65D989249661924924 + 927358E91586923EEEBDE172BDD7E7B545EFC7EF6D501E39215BD319AD5D324D + 5AEED966B1B8D1FC416EDF2878D8DBB7FDF69E6239F60A83DEBDEA7151F5FBFF + 00E18F06A49CBD3EE34E0BB8669762C8BE6373B0F0FF00F7C9E7F4A97663FBDF + 8D71DE35F8F3E15F8729E5F8AB51B3F0F4CC3F7706A17300F3C8EC0872A3FE06 + 57AD78D685FF000547F85FAB5F341147E2C8FE42F1B5A68F73329C1DB8036796 + 7E6CAE7904E3A8C35635F32A1424A356695FFAF91B50CBB115A2E54E2DA5FD7C + FE47D217FA65BEAD6A60BAB786EA163CC73462443F83022B9897E0FD8E9ECF26 + 8977A97876666F308B29CF9123F669226CABE3818E303818E2BC2BE23FFC1452 + FF00C30F6D71A3F817571A6F9C52697C4F3DB692B3AE323CB68E495C375214C2 + 49E7818AB1E1DFDA27E357C5B8A47D03C2FE1BD06DFECAF3A4B75A36AD781DC1 + C79692C82D9198EE5232A01F9BB2935C32CEB0139349F335FCAAFF00735FE68E + E8E4B8D8479A568A7DDDBEFB9EDD12F8B3C3C8AB71158F88ADC02AB2C58B3BB6 + 3D77329FDD9F4C2E0FD6BE16FF008293FF00C14E7C33F03BC49F127C0F1E83A8 + 6A9AD78DBE1ECFE0DBF8A793EC874479AE56E619DC6D7DE7CA3B820C7DF52580 + 209F2FD1B56F8CFF0014BFE0A39A9785DBE206B5E1DD69B50962329924582DE5 + FB190C9F6786711A2840C84C2E0E470E71CF1BFB747FC127FE25788BE23F8935 + DBBD5B43B8D62DBC21AA78D6FAEA5D76EAF975A874C16CB7090B4D009A298453 + 215499E456F2FF00D6A920579B9963275A83508CB953D5BB69FADFE67A996E0A + 146B2739479ADB2BFF00C358FCED8FE1C4FE2596E27D26EADB506B77DD2DACBF + B898A93D4024AB0EDD460F6E4565D9DB5EF83755F2EEACEE6DDA3625034679E7 + 839E9F9546DAE5D683A80B8B499EDE7889DAC9D467A8F7F706BA8F0D7C4F93C6 + C16C356B784994ED4B841B406EDB97A0CFA8C0CF6AF015ADA9F40C5D4BC49A6F + 8A3C3B3059A386F9537189FE562CA7391D8E4038039E6BD4FF00638FD933C35F + B41783BC75E29F18F8F1FC0BE19F87E96325FDC47A4BEA124AB752491A615581 + 186455E15892E3818AF1FF0010F87974DB49B30C7BA07DEB2EDF9B04818CFA77 + 1F8D7D0DFB10EED47F640FDA834F5E77F86F4ABE03FEB85EB3FF005ADE1AEE67 + 3D8D69EC3F634F870AC24D4BE327C429D3FE79A5BE9D6B263D98472A8FCCD513 + FB637C09F04C4E9E10FD9E74D9D55B227F10F8867BC2C7B13115653F81AF94E4 + B48834885BF7DB9B01871C7A1FF3D2BE80FD9AFF00635D23E387EC5FF19BE26D + C6BD796BA9FC337B14B7D26DA042B742E254532C9236485DBE600AAB92533BB1 + C198A954938C16BABFBB50938C1734DF65F7BB1D643FF0543F1A2CCBA7F817C2 + 9F0E3C08F707C985F40F0E8FB4E4F002972CACC738E13AD64F867F65DF8CDFB5 + 5F8E5B54D62C75CB8BCBA6025D6BC4F2496F0C6A0F014480B955CF091A363200 + 5008A77ECDFF0000FC27E35F17F836DEFB528DBFB4EE754D3EFB48B75F2EEA05 + 86C0DCDBDD9903173BE577419181F67032C32A3E9DF10FECD375F01F5DB5BAB1 + F8897FFF0008CDC6A3F6092DB5AD38DD4D6BBF705669D084DB9EBE698D79C672 + 4648D37CBCF2F87CADE44CAA24F963BF99A7F0DFF62FF0EFECD7F0BF58BAD3EF + E1D67C5924416E7569A200B8DCA4C100DC7CA46C637292E58F2595401A1E06F8 + 33258259DC78AB4BD1BC7BA95D1896E8EBD792DE240F80024237F97B02825559 + 1C6319EED5D45A6913476B247AF5BFDAAD5668A2F32C94A433F2197E62C50E40 + 27113B82B820915B6DF1A341D7FC596B169CCCD1E9F3416E418C288595423A8F + F75CB29C67054F7E2AA5528549FEEF651F4D7F5328C6B463EFEEDFE076DA145A + 3F82916D747B33E129264DE90E981B4FC24647DF7B72AAE41652016206781D6B + 2EEFC33A65F5D493491DECB24CE5D9DAEEE09724E493F3F7AD1D5BC41A6AE98B + 7135F5A40AAA76379A30325793CF7207739C7E15CABE95E229D8BC7A1F8DA68D + CEE5923F0FDEB2480F465222C107A835D198E15CAB5E11BE8B6B1860710A34AD + 37D59F6F5EDE43A6D94971733436F6F029796695C2471A8EA598F007B9ACAB6B + 8D43C5B22ADAFDA349D34B0DD75247B6EEE07FD32461FBB53FDF906E3CE1002B + 257CBBF073FE0A9FF0E7E377C71D07C3234DF15DE6A5AC5E8B7D32696DE14D3E + D672098F119937EF240512B82416C8F2D4915F40EAD7DE33F04E99757CBAD68B + AB5BD8C2F3B43AC6912D94C5514B1DD776CED0A9C0EA203CD7D83C642A2BC355 + E5FD7E47C94B093A6ED5347E7FD7E67947C2FF000EC3F0DF48D0ADECDA49D752 + 9757D5A6799CB3492BDC427713D4FCB391C924F724D7CEDFF054CFDB9BC45FB3 + 55F782F4FD1FC33637B1C939D5DB52D4609A4B34913CC816DD4C6E83CCC33B1C + B640319039C8F6CF851F15AE3C7BE1FF00095E47E13D6A6D3E3D2AED449A75E5 + BDEB32F9D0C6CE54B44FB730646D462C1B81C7373E317C66F8790F812FF4ED62 + ED4F1FE9BA46ABA6CF1CF32323AA8304D182CA5CAFCC14A8CE73819AF07DB43E + A295ECDFEAEFD4F6FD9CFEB8E4E3CC974F456E87E6EDAFEC9BF0C3F6FEF186A7 + E2DF04FC5ED2BC2FE3CF175EDC6A5A87837C61079622BCB891A4952DEEA3C19A + 3DEE4A6C85D82EDDDF3022BBFD77F6A8D53C3BF02AE3E00FC4EF01CC7E22F836 + 28F4787C5515CC326FB6B799658436E412188C4A14323B07CC6C541626BE3EFD + B33C2B63E0EFDAFF00E2769BA7E96747D1ED7C57AA0D2AD1206B65B5B43752B5 + AF968402B1F9262298E0A15238C57DBDF0F3E39F807FE0A09F077C35A0C76F71 + 27ED45AD5BE9FE17820FB25D37F6F325D4481C48AA6DC33C6A2466728570EB9D + A1457CCBD357A9F4DBEC47FF000536B05F117C7DF05D9150CB1FC2BF085B3F7E + 1BC39627FF0066AF857E0EE9D259FC6486178DB7C026490019DA4020FEB5F657 + FC153FE2C69117ED6BE25BEF0E32EB5E1DF0DC5A7784F4EB98E4DB1DE43A6585 + BE9D1DC83CFCB235A09063FBE2BE40F84739D57E38A4E4C8A970679D93CC2777 + 05C027F8B07D6BA2927A194DE87E8CFF00C1273C3ED73A6EA9A85C6A16B60B0E + 9F39124F12342BFE9CF82C4ED7181DD64439EE4715D77C56F8C7A2783FFE0A25 + F0EF579B5DD2F54B5B0F0F3DB4B77A64ADA9ADBBF997800640E5831320CA6F63 + 8C73CE2BC1FF0062CF855E01F1B594D378E35BD6B43F2ED9EE21BF8ED5BECCB2 + 79E546E79619615014E0960A323EF135E957BE0EB5D03F6EFF0084F69E11F137 + 843C7D6D3E9137D8E60B15ADA921AE3F713BDA7980BEDC6196307951B08193EC + C6759D18C61156BAD6FADFA688F1654E8FB794A6DDECF4B74EBAEC6E7ED47F14 + 2DBC67F1BBC1F7D670DF18ECBC4CBAA3CED6C6D94A88635DB890E6327CB0403C + 05C9AFA8349F8E1F14B51F1DC0DE1FF0678574F55B0B94177AB6A171730EDF36 + 00C4AC71C5F30654FE3C1DC483C0CFC9FF00B5D78BF678C1A7B9D2ACEC924F1C + DA4BF6AB2BE86EE1DB1DACE8D0A01B65619190C2309F2E090DB54FE857C09BDD + 0FC4DE2DD2FC41A0C2B0D8EB5A4DD4F138B77B332A34B6FCB44C1486F9472573 + 83C1C1193034EBCE4D42A72F7B2F37DFB118E9D1A708CA54F9BB5DE9B2EDDCE5 + ECFC13F1FF00C75A69B8BFF1DE8FA12CC418A2F0F69505BC40739CC971E7CBDC + 60A9EDEF54DFFE09E9278BF576BCF1678EFC5BAE4D2A9497CCD66E5A3953FB8D + 1E44641E0E3681903A62BE8C9340B3965693C948E66396961262909F76521BF5 + A7AE9B736FC437D27A05B88C4CABF88DAE7F1627EB5EAFF64C64EF5A739FFDBC + D7E0AC7951CE2A455A8C630F48FEAEE7837857FE09BBE03F03B79DA3A7D8AF32 + 1BCCFB2A15F73C624DC78E4C84703E5AF8F7E25FEC4DAC78DFFE0A4DADF86F46 + F176BDA0DDDD4075C6D4F4FD935CDBA4704188D54BC21801204CB7CDB703F7A4 + 923F4F96E6F201FBCB459BB036F28CB7B957DA07D371FA9AF21B8D1ADED3F6EB + B0D5A7D1F4FB28E4F045C08F549DE486EDA5FB7461E0DAD88DE321D583F24321 + 0A7048AE5C665B8383A708C2DCD249EF7B7AB3AF0799E2E7CF394EFCB16D7A9D + 87866C34DF04C10DAE97AC7F6549811A45AB58AC7E7B77209586491C9EA448C3 + 9E9C8AE864BED5AD79BAD316E94FFCB4B2B8566FA94976607B2B39F6AD978D67 + B665655923997E60795753FA115927C17616EBFE871CDA6B751F6295A04CFA98 + D4F96C7FDE535EF429A82E58688F0A5539DF34F73F367E0EEA31DF7FC167BC45 + 33A9B78D7C577C999B74647FA24D80437DD3920638EDC64E4F71FF000582FDB5 + B40FD97FE20695A59B78F5BD735CF00F88F41BBB04B83049656DAA8B6862B876 + DAC18036F291181B9B67254106B84F8136335C7FC164FC5D12AC5A848BE2DD5D + 08BB608B3E2C6E73BCAA103201E898CF6AA5FF00059FFD81A1F8D1F1AFC0DAAE + 8090F85FC49E25D2F54B6B9123AC9A5DD1D36D7ED510411A892391D5A442C536 + 9DB19DB90C4FCFE2399E0EAF2FF37EA8FA2C3F2AC652727F67F43F25F4FF0086 + 69E38BF9E1D17548CDFC41A75B5BC4F2CCCA39628EB90C579241038E79C1C54F + 13787354F0B78A64B9934D92DE191C4A04617CA462016505491B43640F503A0A + C57D526B49A3B88249619948923746DAE87A8C11D0D751E17F8BDA86A720B5D5 + 923BAB791B63CBB36BA8F52070DF9035F351B5B53E95F91666F1769FE22F0FB4 + 17529B5D45A22A564520391D0838C7381C7AD7BBFF00C13ADBEDBF0B7F692B06 + E049F0BEFAEFA7786446FF00D9ABC2BC53E1A5D32DEE5552368F06646D837290 + 3B375C633C74AF74FF0082606ED4358F8DDA6FFD053E11F882003D4ED848ADE9 + DCCE7B58F9875FB6F2F5090A9FE23823BF26BE9AFF00826BFC4A834CF85DFB47 + F81EEDE4487C5DF0F25D42D9563670F736132C8A0ED0768F2E598EE38036F5E4 + 57CDB771FDA76B7F79335DA7EC8DE3E4F877F1CA192697C9B7D7348D5BC3D396 + 38522FF4EB9B45DDEC249A33FF0001AAC3C9C6A292F4FBF4FD49AD0E6A6D7CFE + ED4FA3BF67FF0084FA5F8C34EF0CCD27DBECAFEEBC6969A4CB7D617925BDD241 + 71A748C888FF003227EF222721093961C8E2BD97E206BDE22F00FC16F145C1F1 + E787FC55E1B8E092CE74D72C9EDF53B492452B1FD9E68C1496E01C11B9436E52 + 32A412BE6BFB3569B6D359E8B7122B47756DE3FF000BA47711B98A78A3923BF4 + 708C385E550E4FF741F5AF59FDAB3E1343A67C18F126B13EB16775336A365A8C + F67A8C4BF688D8CF6E1BECD2311E629F9C32229230C4E3219AA29C29A9455BFA + B18B7CD51C5FF5D7F5352E7E2AF83756F05EA3A0DE4571A2EBD61A6456FA743A + 822A24327961631BC31842B7C8CAFB89C2920A9C83E0BF133E19FF00C209F19F + 44D2F4E93C45A2E9BAB7F6734D3DE88D27B8334AE1E48F61DB24188DD91A41B8 + E067D4FAB7ECB5ADEBDF1274FF008D10DAB5D0D36F24BD6566B117492DB2B4C8 + AA57036900150C18005B9E14579AFED4FE36D43C4DE2FF000FDE4B058D9FF61A + 436369E4337EFA3B7895D1DC1EAC3ED0CA76F0304738CD79BCB6B58EC5D4FD2E + FD937E01F85F41F0658DFC9A6A6A9E20D1EF2EEC5F50BD76B9749209DA21244A + E4A4259151B11FDD2C46E6EA7DA9E172E7E57EBE95F977ADF81BF6EAD57C2B78 + 7C23A0F89974B8EE64FB5C5A2DAE9D78F0DDB849645545324AAA6396161B4630 + E08279AF3A97E14FED98256F36C7E3B09327781A05F8E7BF021C7E55F4986E22 + A54A0A10A6BCF5B6A7875B239559B9CA7F87FC1380F84DFB4743E24F1E7C19FB + 2E9FA569BAEF837527177AAE9F6C96AD7B119216B68DFCA4C3BC2164FDE90D23 + 79D825B62D7D936DF1BBE3378A3C5DF127C1EDAC78CA55F07E8F7336B12AE9B6 + BFD9B6D11B576DB24F2A99519D46546159CEFDBD067466FF00823FC7FB336A9E + 18D77C1BE13F0AFC415F0A78965D6EED752D6E6B5BAD734F138960B3920B856B + 35648C0899B3893258852401E8DFB2AFED35A3FED39E1DF8EDE24D3743B9D075 + AF15BDB5A34372F086B98C99CC488EB8F30C51C9B4B103236D793530F5694D29 + 371DFCB6BBFF00807A5F58A5562E51B4BF1DD9C4783BF65EB6F2BC2EFE23D6FC + 4BA5C7A6F852C9A3812DAEDAD2D656332C98DA7CA5CBA3163B572770EB93567E + 287C00F01C1616F79A6FF67EB567A1697AC6A375334B14A63963B36580FCAB90 + CAC5DBE6E7E41DD457D19AFC91693AC9B9BCB85B1B18F4CB5B759643B149F36E + 656F98E00C09579FF6BD8D796FC53F8F3F063EC3343AF78B3C13A93EC6DF612D + DDADEBDD3904052A1DB1F79865F006EE4819AE8587C324A7369CB4DEEFD7BFE4 + 72CABE25B718A696BD95FF0023F28AF7E2AF827E3C78634DB3F8A30F88F4EF10 + E8F17D96C3C51A25BC57935D5A86262B7BDB79248FCCF283154951C304DAACAC + 1411DCFECC5FB4A7C39FD90BC4BAD5C7C3E9B5F4F126B9A44FA21F166BB64B1D + ED9437055268F4CB581A4F2659620F19B87769024AEA8232C5AABFFC145BC3BE + 1283C79669F0BFC0EBE1B5D244897CD14A5DAF8CAA8C8EB1B31558B663853C97 + CE0FDEAF2BFD9A7C23AB7817E29E9FE3CD7BCBD174FF0007DCC57BE4EDB6FB65 + E33128A2286575DE412090C0A85C920806B92B24B4D19DD464E4AFAAF23A0F8C + 9F107C31AE2DD5A2DF7D96DCC7E5279EAAA73FC276025B00E0E76D79BFC0145B + EF8C962D1C8A47933F43C8FDD9AF66D67F648F86C15E6F127C6CF87D14FB0B79 + 5A2699A8EB370C40E1772411401BB7FAEDA3D4D67FC33F83DE11F845E206D4AC + 3C69E10F172DEC2F6F6A2D8DD5ADFD83928C5DA09D231CAABC7C348B87638DDB + 4D453A8B99234A917C973EB2FF00827A7C32F8E07E1FFF00C265F0E754F0943A + 74A27B0FB16B3B9BCCF2E61B87C91961BD943062E9F748CFADAF8B3A078DBE28 + FEDE9F09F4FF008A5E05F0CE8F71783CB921D22E43DB6B302CCCCF2C98919811 + 9230CDBB038AF5CFD943C49FB3ADA7C1FF000869573E27D3FC29E26B1115E6A1 + 35F5A5DA19AE4FCD2C7E7BE53C92CCC76A4A801C101718A77C754F0C78D3FE0A + 75F0374DF0378B1B5C812CCBDCDE43A91D5A1B233CD208634965697E622272D1 + 9276AEC385DC09FA0A74FF007295F4BAEA9ADD74DD1F3B2A9FBF93B747D1A7B7 + 7BEA791FED216DE0DF873E05F13F867428FEC771A1F8F2C6F22B6820676B1B73 + 0DD2281230C005D70159F2719AFD34F035D35DFC46D2DDBCC0CFA7DD6E1D5724 + DB9E4FA8C57C3BFF000504F84D7DE14FD98FC51A85D43A3CACBE3B815B518ED7 + ECF7975279F322C45773B4806377DE50A1B80D86C7D99F0666D72F35FD0EF751 + F0DEB1A743169ACEF3C8D6D2C532C8916D286295CF38276B056C0E456D9738C2 + 6EFF00D6ACE7CC3DE847E7F923D91507E14E58C0C7BFE95135F436FA7C979319 + ADACE152EF3CF0BC312281924B3800003927B53FC4D751F847E1F6A9E29BCF9F + 43D1616B8BB9ED48BA68D557790238CB3B36DE42A82C72300E467D878BA2B792 + FBD1E3470D55ED17F712797F5AF2AF859F0AACB40FDAA7E29F8AE2B7924BCD71 + 74EB59AE594058CA59C00DBA1DD93F2AC3231C007CD519254E3E62F19FFC1C5D + FB3BE9F21B4D0478FF00C5734CE2247D3F4716A9F31DBB83DC3A30EA48F933C7 + 4AD2FD873FE0A516DF10FE1AEB1A84D1EA1E23BA8F5D9E3BC9A7B9585E266556 + 4D8BE5FF00ABF2FCB5193CB24841208C79B89CCB0EEA422E5A277FC2CBA75BFE + 07A987CAF12A9CDA8EAD592F9DDFE47DACDA0DA87668E25B776392D0130B31F7 + 2A467F1CD1FD9F7512FEEAED9813F76E230E07B02BB4FE2DBBFC737C15E376F8 + 87E0CD3F56B4B59AC22D533B3CEDB23201BB2700E0F2B8EA383DAA2F8C365E30 + B2F829A3EB9E1FF13681E1DBA1E2BB1D0AF9D7434D59EEA0BDD56CEC51D0CEFB + 2092159E4728639433003700093D188CC68D2A4AB24DA7D8E6C3E5F56AD574AF + 66BBFF00C03F38FF00664B991BFE0B3FE2F668CC922F8C7C400AC7DF1677A38D + C47A77EDEFC57A7FFC165FF68ED27E03DCFC23D4DA1FED0D6AC352D52ED74C97 + 75B3CB692E9B35A3486428708259E2E80EFDAC07DD35F3858FC59F17FECAFF00 + F0551F8CDABF862CEF3C69E24F09EA1E3190DE186DADE4474B1BF85F5168B625 + BFEE41FB4989061846E8AA30A1ACFF00C14BB4EF097ED59FB447863C1B6BA97C + 70F08F8CE6B9D3B48D374BF8AB697D26A16B04F06A32DF48CD2EF0D1FDAADECC + AED9C2E6EAE0C71B05213E76A666FD9CA8C17C4EFE9ADCFA5A796AF6B1AD37F0 + AB7E07E6AF867E0669DF1175C5D1F4EF100D375699765947A8C3FE8F76E3A47E + 6A728E7F8414218F190700E1F8EBE16789FC19AF3B6A161FBC8422C8D149E621 + 28A173D8F20679C54DE34B7B8D2F56B88B7347359DC3C0DB491B5E372A483F55 + EB57F48F8E5E20D6EFFCAD6E6FED48E3C2892E17FD2197DDFABF1DDB24FAD795 + 193FB47AF249FC22683E3DB1BBD07EC3AD34D6D38DD123F965E39148E3247208 + CE3A7402BDD3FE0920AD79FB4A78874DEADABF81B5CB2C7A936E1BFF0064AF1A + F137859224926B74536D76A1DBE507A659483D460FA57B2FFC11BDD9BF6F1F0D + AF3E5CDA66A91CBEC86CA5CE7F215D14CC6A6C7CDF631EF82127FE788AC785FE + CBADDABF649D1BE98615BD69E5C6D1AE7F758D9BBD1738CFBE0735CFEAFF00B8 + B866FEEBE7E9CD268A5A9F58683A3789F507B59341BABCB3D3EC6EEC6E6F8C57 + 86350E6E8C36F318778F38A4B200BB412BE61E80B1AFADFF0069BF8970F8D3E0 + E789BC13ABE9BA8C9E28D16D4D86A37F6BE6DCFD9E485C911CF2CE90C85C3460 + 36D8A44E58EF04E2BE38D37C4DAE693E176486F5AC92FA654BA8ACEE5E38EE62 + 4B859610E323715711B818215943019191F567863F686BEF17783EC3C3DE259B + ED1A97887C2379ACCD37D8C02F3FDAEE6DC4FB555362CF6F1412339043BAB4CC + 73231A9955942328AD992E9464D49EE8E6FF00E09A53EB2AB7D63E1A9219355B + 8D1EEDEF6D43C07ED96E55CC8AEEE0EC382AC3A67691900E4737FB57E937AB61 + F0EBC4579A5AAC5E22D2E48A2BC5B5F216F96210461865882CAA55491B73C1C6 + 4F3C7FEC75AEE9FADFC41D763D4AD2D6F2DF50F0EDE69304324584B26F2418A7 + 0C394D8C1DB78E540CFA0153C5171E268BE15787D357B8D4AEB48D2EE6E6C74E + 4B98CCB6F6CDBB122C4F80DD153208C0E0E6B9797DFB9B736963F487FE098DFB + 7FD9BFC545F879A97C41B596FF00C456F06A3A25E6A9A535BDAEAD782D2086E6 + CE66DDBE29235B7844723BFEF70C02E4857FD10FEDBF1A7FD0034493FDB4D664 + DADEE3F71D0D7E1AFC3BBAF11F8FFF00690F09EA5E26F07F84AFA6BAF0F34D6A + FAF491CD6F0DA94B4315D212A5B72A4242AEEDCA1E400AE79FAB113E20D8A2C3 + 05F7C22B58211B23863D4F5444854701428BDC0007000E062B4860EACB64CCA5 + 88A6B767D75E28F0C5AF8BBC3B79A56A11CAD65A8C0D6F388E5689CA30C1C3A9 + 0CA7DC10457C77E14FF825B6977D6FE28B6F087C44F8BBF0DEC23D59EDA3B7B3 + D5A19AD2E9A35556936ED12BA86CA82D203F21E3B9FA0BC4DE1FF09F803C177F + 736FFF0009578621B181D834173776A9031E9B5E66FB38218F00B6DE8067815C + 9FECDFF1364F1BFC28D1354F117C4AD3F49F126B0AD712E99149650ADBB3FEF3 + CA30485A4DE036E6CEC7058864560D9FAEC6D3A356B45565B26F75E9AEDDCF94 + C2D4AF4E94A545BD5A5B7CF4DFB1F287C57FF821B7C44D58CD269BF143C2FE32 + 661C2789F4DB8B39587A19636B8CFD768AF86BF697FD807E2A7ECBB7571278AB + C1BA8693A6AB958F52B36379A5CB93C6DB94CAA93D924DAF8ED5FBA9F0EBC59A + 87C4AD26F2FB40F1526A76765772D8C86FFC3D25B06963628E11B29B9432B0DC + 1586548CD748C9E3010C90CD1784F5186652922133DB8914F552A448181F7FCB + B571CF27C34D7351BAFC51D14F39C4425CB56CFF0007FD7C8FE6C7C37F10B56F + 0A4E2D24692F2C738304ADF347FEE1EDF4E47B77A7789342B6BF125E59A308E4 + 2588230D193EB5FABDFF00054FFD81BC03A67C09D7FE2159FC33D27C27E25D32 + 5B5C5E681AAF97632F9B731C4DE65AF9688490E465114827249AFCF5D1FE1E5B + 792AE5BCCFBD91B703E515E2E2B0B528CBD9CBF53DDC2E2A9D687B489E576BA3 + 47A7D9C724CA599865549E4FF9F5AAD3788AFB4997CCB5DB6E776D1B073F9D45 + F13F55BCD0BE22DD5ADB95589821F2D9430CE39E7AFEB5D67C0AF05C1F15BC4B + 6763AAC170D6F34E5196CEEA2B491F0858012CC1A34C903E660463B6715C328D + B5676AEC8C2D37C6DAE4A7F737D711EDEA518A85FAD773F0F7E366A3E07BA171 + FDAFA8C9A90561138214C6A54A9DAC3E6E412A493D1B18E6BE8AF877F087E1A5 + 96A1A0EADA0F82F53D2EF7C25E3AD12D357B7F13EAC9AB5B6A1653CCE8D902DA + 188A8911436637575901040460FF00A05F163FE0947F093C5FE0CF1559F85F51 + D4BC2C6EA1903697697BE5D8DCEA7106F29E68E41925248C0548CA280D270C18 + 6DDA8D1A937FBA7E7BDBF130AF5E9D2FE2AFC2E7CAFF000C3FE09B5FB587ED35 + F0EB439A2F08DF2F84B5058B5BD34EB1E2DB586CD84D0B7977490B4EEC19A295 + B9F2F387AFB59345FDA43C17E33B1F07FC49BCF10CDA95E784B529FC0FA7FC24 + BB7863D3EF607B38E0975295628435AC2D2A26FB8F347EF3E62F9E7BCFD91FF6 + E6B3F867FF0004E3F0878866D25B525F087842DA17B2370B672CBF6689E38E18 + 9D8C9BDD8C6918DCA9F330EB9CD779E27FDB33C27F0E3E3059F89BE2169BAA78 + 7FC43A7E917BA3E976BA44777AEC77B6B3CD673CEC7CAB550ACB25B42A18B050 + 0B752462651C472F34AF6239A8F372C6D738DBFF0015DB0F892BE35D7B54D42D + BC693F8DF56F0B6A773752DD59DA1D253C357456C16190ADB84FB4C70CDE5A8F + 304AE1CF2F93C6E81E288FF67DF84BE30F186B9E03F86FA1C7A0FC3BF096A167 + 67A55D0FECB9AC45D5E473DEDE4AB6DBA2BDDCC4C8AB0B0091A2F98E7257B99B + F69DF03EB7F1E25F137857E03FC45BCF1A6B1672C97979AA68B1E9EBABDA9896 + D24112CD70C124646843CC2257686028588205719F1F3E38EAD6625D26E3E07F + C33D121D620B5D0AD175AF115ADABD84789951CC9040B22C6F1A36E567010403 + 192F8A98D3AD7E68C5E9F9EFE88A7529BF764D7F5A1F9897FF00B36F80FC3FFB + 40DF5BDCFC42BEBAD43C59752EA7E1EB2D2FC29A6DD69915A4B26F8A3B7D5351 + 9E36BA3123842628583046DACFC9AEFECBC43F0D3F620F1C37873C3B1EB1AE69 + 7E2290C136A7178922BA0AD081B2630FF674263318725A06C160E02CA386AF31 + FDA9BF66C7F84DE25D7BC3777E2EF01DFF00816F353FED8D074ED22CE3BFBAFB + 4799819360D1005166914492B46655442501C2AFAA693E178BC51F0EFC27E249 + 2CF54F895A9F876D67BD92DEF6E2CB47859A18716FE6234AF717516CB6759117 + CA92411B21941CBAD4BDD95E4691D62944FD00FD95BC4963E28F043D9DB3DE59 + 6B9A1EAB77A36A3736EAB70AD358B157B74C1DE17748241850C55C960075F6BF + 1678AB4AD7FE09C7E1BBABCB78EFEE3C5D61A8ACBA3DBADC283657F0DF8132BC + 91F97248B62F13658847209240207E7C7FC1327C67A77C16F85DAB697E236F19 + 6B7E30F895E21BBD6F53D62DA07B601E7220C22AC9E6AC81D24762A8A497C0DC + AAA6BAEF8EFF00B7D6A57DFDA3A0E89E0D856F2E2D62B886F6EEF62867825BDB + 68A6672157CC611A4CC321577300C0950B9EDA98BA4F0FEC7EEB5FA773CF8E16 + AAC47B5E9AEFFD7F5D8F2CFD9BF57D07E33FFC1567E28DE4B6571AAF873C73A8 + 78BE2B98E229311697B677F1B48AD1391222C736F2D1B1C804A93C676BF6F4F8 + F1E0FF00863F09BC13AA49E34F1EF8CBC65A7FC51F0E5EF8A2FF00C44935C7D8 + AD74FB7BCB36B64BCFB2C10C8A8279DC2A658B4B231248663F35FC18F8D7ABFE + CF7F1D2FBC631EB3A7E83A969379334D79788CD6D18789D2547552A59583B0C1 + 3DF90699FF000508FDAAEE3F69FF00D8F6F34FD3FE207FC24FA1784758B06934 + A44B78E1B3693ED016541E4C72BA02EEB906455322A9604A83872FBEAFDBCB73 + AD5ED6F33E50FDB9BE1F37C1EFDA53E206898CC30EB173756A7040782E2433C4 + 412391B640B91C12A715E1DF69965789FF008A340873DC03C7E5D2BECFF06DEF + 867FE0A25F07BC3FE0BF126B163E1BF8CFE0BB45D37C3DAB5FBEDB5F15582FDC + B39A4EA268FA29E49CEE018B381E27E38FD853E2BFC39D764D3F52F87FE2A322 + B6C1259E9EF79049FEEC908743F9D54A9EA5C65D0C0F067C5BB61A79B3D6232A + AB81149147BC11DC3639FC877AF7EFF827BE98BF03FE1AFC62F8D975F269FE19 + D0AE3C35E1D95C6DFB66AB7BB523D99E498D36961D42CB9EC6B9FF00837FF04D + 2F186AF07FC249F101A1F85FE05D3C892FF58D7C8B790275DB140C43B487A004 + 2827A64FCA6AFED87FB4DE8BF12B46D03E1DFC3AD3EE344F84FE052E74C8261B + 6E759BA6C89350B91C7EF1B736D046543B13B4B145AA7A132D4F054411DB22FF + 00754AFE9593E2118F339E39ADC9ED9A081376DF9D770C306E08EF8E9D3A1E45 + 62EBD0F9DBBE99A25B1513E8ED2BC63FD99E0AB51F66B3B8FED4B278CC9736C9 + 2ADB8DB6EE5E32DCACBC10197E600903EF57AD7817E20AF863C4BE33BEF155E4 + 6DE28D7A236D7536B16F23DD7D9C1B7F2208D540863468C105780AB144A981F2 + 9F03F0E06D4BE1868ED1C68CD6F6D196F9B9FF0052BCFD32BF5E6BA7F87FE3DF + 105BEB9AB69FE1F592F26BCB5B8B0BAB44B72CD716F260BAB05C171F2860093C + AF4ED594F71C7627FD99A04B3F89D0C0D7B0E8F1C2C1A296E9E18A3891771C1F + 3BF767238C36771C639C576FFB473EA5E1AD074CB15B8D4751D17CC62B23432C + 76B05C3990EE12E3CA264019C22724649279AF30F8256706ABF16743B0D5352B + 8B4D324D42149E45BC5B76B642E06FF3581085786CF6C57D49FB49793AF7EC97 + 756E9A84DAA4B6DE30751704C4D1CF12473246D94033210492DB4039F7CD44AE + 9AB0CF11F1CE90DE048BC39A83EED58DE698B78D696D76EAD0A324ADB5F2A769 + DB1EF21430DB8C915DD693FB4569F36956AF36816AD33C4ACE4DD124B1033FC1 + 5DE7C3EF0F785F52BDF8177DAF6A9A6D9C933496FAA3493C2C6158A29D6112AE + 18A2BB02A378C30FBA33927E93B5B3F024B6D1B342DB99413E4445A2CE3F8488 + B057D08EA2B1A951DF634A713E82FDB23E1BF87F59FD9ABC51A4DFC3E266B5D6 + E04D3847A5CF34CF1C9348B1C72794C5A3DB1B3090E57A21C738AEDFC23F0863 + F0878274DF0FD9EBBA96A5A5E976B1DADAA6A76D6772BE546A163DDB6042C768 + 03713938C924924F53723CD963FEEC32A1FAB123F903F991E95711016E47E95F + A04A9AE772F2B1F03ED64A0A070B1FC1982DAC66B786CB40B786793CE9174D86 + 7D27CC72412C7ECF28F9C900EEEBD33576C741D561DC60B8D76C63591908FED4 + 5BDF33048C817114C4038E9B81AEC235E5477A759C6AB180AA7E7666000EA589 + 3FD68E44B6279DBD0F967FE0A8EBAB4DFB1178AAD6E2E1E6825BAD3D5BCFB48D + 243FE99163E68E418E7FE9973EDD6BF32C7863EC3A4190AB7CAB20C7F77E5E7F + 515FAADFF053CDBA9FEC89A9E5D9ADE6D574E58801F7BFD21497F7CE300F65C9 + FE222BF3C75BF0C5C6B3A1496F636FE64DE55CCDB4B05F9521323B7246005563 + CFA57878EBCEA29BDADA1EF602D0A4E0B7BEBEA7C1BF1FAD9EDFE25DFC8BF7A1 + 0AFF008735EB9FB1969125E6B9A79DFAA5BC77174567934F8619AE4DBBC38991 + 166FDDE5E2675F9BB12464802B87F8D7E0AD5BC4DE35D5350B3B192E2DE588C6 + A5194B6E03046DCE7A8F4AF5EFD8E34AB7B0BEB54D7350B6F0EC30932C975A81 + 9228A275B76DA1CA4333ED660172B1B1E7819E478B286E8F7148F50FDA5BC316 + BA4FC2B8EDFC0EB1C3E176D4E3D4AFEEE5D7BFB4F55BF9608A458D2711C30456 + C882566089E639704BC8764613E91F8ABE0D3E28F12378B3C2F69691E8FA8585 + D4369A2F8C14EBB60BE4A194DDACB26F95988803471C8772EE2AC5A32517CA2E + 7E36C9F18FC31E22F877A7EA9F10AF75AF0F698FA5E8BAC69B65791681E29B79 + 711CED25A38091B4B148C4CB2AC5958436D8F6A463DC3F663F86FAE7C43FD947 + E1DDE4DE2FB186CF505103D958E9CF0DD5B4663B9B7129956E544D2125530F1E + 06EEE179E395B975669ADFFCCF03F843FF00050F9BC2FF0009BC2BE133378574 + 4D274DD645EB5EDFD9C5325F189609638583B2ED8967904982082634078C83F5 + B7C49BEF8F5E1CF006ABE30F166A43C2FE14D16D05C5C5CDAE976DA608977752 + 5B9F98B22AE382580EA6BE5BF0C7FC13A63F889F1B7E257C3FF107897C2BA545 + E0FD434BD516F350BF4F31A0BB89CCC6168A366793CB440C8005570BB81DB5FA + 76DF113C3FA57C38B7F01CDA8F877C49A3C3631E9434A934B94CED6C91AC681C + CF341BF0A8BCAA16CE0E735D11C5495A2DBB69DFF468E7A9878BF79257F45FA9 + F949ACFED859FB55C269FF0015B58B3BB25659A6BE105A1DCC1C9578E468C862 + 99E3A9504F415F612FFC13A74FF187C39B7F881A7DC43AF7F6BE836FABD8E98D + 66EB3DF192133450B19640A9231755666185C939E39ECB4BD17E1FFC2BF146BD + E2FF0010787CDA5E5F451C1787518E2D1C5DBA6F2B752B9B378DA46DC434C650 + A0B64004927B6F167EDB5E15B58E592E6E34BF0959B010A346B71ACDAF2A3684 + 367322AEE5E4663620F50320D72D4A8AF7F3EDB9D5084ADA76EE7E6EEA9F0F7E + 335BCB63A2E9BE0AF09D9B4978CBA9E9B69A72FEE2D4C8A5C348CE33F2B9766C + 08A38CA317259847DC49F10BC55FB34DA40B1DD781FC496ECE74AFB2697E22D3 + F55F14C72CED78C9776ED03DDFD9D6289204633C24096E079615CABAFB57C43F + DA53C0FF0013EE3C41A6DE78EB45D36D64944204DE08179672DA410BDDB5BCE6 + F239BC962D6E92AEF88A130606F902D707F137F6BBF87FF06FE217FC2117D6FA + DBEA715C84B1BC8753FF00843B4081CC61E06636CD708B957E240910CB9FBABF + 30D232DD2D7B6DA13CBB391E9DF097C15F1035FF001BF82F55BFD3BC752D9DBE + A96923EADE25D3E5875092C6E6C259FC9D49F647992D6E2DCC44C84362E90316 + 5118AFA7BF673D5345F08E9FAADAB789344BE9219AD2DE386DAFA1BFB88922D3 + EDA160F0C26471B9A36254820F247079F89743F88BA9FF00656A1A7EA1A4F81F + C3B757FAE69B6CBAB59DEDD7882F07DAACAF4A4B6B7F792CBF37EE9536429971 + 7129014A864F54D07E25F89FE04FC3CBAD574FF1343A0C76DA6BDB2437B77656 + D6A26505949DD0C804859DCAF98E8C1A4C061804E752EDEA5C6D63E6EF077ECC + F2FED35FB6278C3C23A45AAB5A6A3E27BD92782451144D631CECF2218DD7A88D + 72A8547CC141031C6D7EDB5FF04C7D07E00FFC13B35CD11A6F06DBFC6CB18A0F + 105FE9566F135D6A3A7DBCCEB2C9688D1A4E8BE59323A2008CD0B8009518E416 + 2F1458B789755864F105BEA9AB3CD3ADCDADC496B7370F2E1891328CAEF63F33 + 007827E56191599FB44FC38F1D7ED1DE36D37C5BA1D8F847C3AB6F636561A55A + EBFAC4D72BA5E9F6D6CF0881895CC924B248F2C8CCAADE63B67926B49F3AAA9C + 7AA220A2E9B52EE7E6F5E5A27D8B77972BAED25BF72C700727231D873ED5DEF8 + 3BF6E1F8A9F0EB43FB0E8BF113C5D6F63020D907DB1A68E15E802F99BB68F618 + 15EF1FB447ECE7E34F005E58EBFE22B9F871AE6A175A447696F1697A85CC3379 + 085A34706E11BCD2376D2C1F3803278AF8EBC71E19BEF0C6AD25ADD43F659594 + 318FCC56CA9CE3A1231D7BD7546A49A21C5266D7C44FDA27C45F16AFD2E7C51A + EEBDE24BA8B2626D46F5E61167FB81890BFF000102A5F0AE953788FC3179AD49 + 6F247A6D94E2DF3190EEEFB771E3B000AF3DF70C7438F3C5B5FB5DC470C7B649 + A46088A187CC49C01E95EF1F04FC252D97C2FD4345D466861BCB8BF3730D9C37 + 51CB3483CA55C9446240C8C73CF5A4E4F61D91E6F73E28D15AC658E383578EF3 + 04C6CC23F2F3E8CB8DDF883F9D63CFA87DA59B103B2ED009C7B0F6C57B047FB3 + 3F8B2EA48E6D3B4BBC8CC4C1926F3043E5B0E41058820F715D5F833E0878825F + 1E7DB3C55AFDD2DD5F5BCB0DCDFDBDF7DBB54B7FDD0447C3BA172B8500798385 + C640A7EF2576174637816D193E0CDAE15F74D6A30BDF203A1E7D7915E9BFB327 + 8217429B4EF11586A925F4724F358DDA0824B5BAD3DDACE6640EB8276B61C874 + 62AC14F23070787FC3F6BA5E8935DF8C2C752D6B4FB142F756DE62D94FAC46A1 + 9A40B260AA33EDC67E6C13CE7AD7A17ECCBF027C1BFF0009E6B9A65BE8B1C725 + D69911CFF6F5CEB11582B48CD37D9F305BAC73A88B0D2B34EA239B09B99C38AA + 89DF4338C95B53C23E10F875BC41F1934CB3589526B9B989510289464B2ED5DA + C181CF1F2907A8073DFE97F8E1E19B8F0E7ECBDE2AD1AF9BF7BA3EA314C3CD8C + 79922398B6392077CB80BC6DC6DC118C78E7C40F0A59785BF6CE4F0EF87A48E5 + 86096C5567E6E5A277487703F30DD8661C139C6066BE8FFDAC3E1B78BADFE197 + 8E34FD4E3F0D5EC3A7E95A65CCB3E9FE7D8BDB037B300441286121380ADF3A85 + 5C101B9A950E68F3F6B04A694947B9E14FE19B8D27E1FF0082BC59A2E9F7D79A + C6A177E458C36914E646BA8CEE8063CB2B26589CAC4FBB181B41193C2EA5FB71 + 4E750B8FB769F711DEF98DF685F36F06D933F30C7DA4639CD7D45FB28E87378A + BE16FC3D81B4FD6E0B7F0AF8C975692F7ECB27D916DE24F34279DFEAC3193CA0 + 54FCC43E471CD7C07F1C2286D7E3578C238D19638F5BBD551C0C013B81DAB595 + 18593D2FFD7EA4C6ACAED33FA563E20D345BC68BA858B36F4EB709B9BE71938C + F73CD6A5A4E977FEA64498772AC187E95E0D04DABEB024B8BFF1ED8E817D771A + E45DF86BC892152DBC2317650CCBC8C851CE4F238AE9749BAF0BC3A15D69D2F8 + DA059A38E276D663D580B867B89A440A91EFFB3E4B28500C0C49906724835F46 + B1D564F4A6FE6EC7CCCB054E3BCF5F467A478B7C67A4FC3FB09AEB5ABC8F4FB7 + B7B692EDDE50DC471825C800124F070A32CC4600278AF1ABEFF8293FC1D5F076 + 8FAC5AF8B7ED9A5EB969737904E9673DBB3416E1CC876CEB1B00DE54C01C7CC2 + 09B1F74B0DDD27F675F0D69BAE5B6A967A6EB5A85F5A09560BDBB5B680979230 + 8FC8856525C29DCC1318690F3920B47EC6DE119F5AD5AFBC41A4E87AB26B51A5 + AC3A747A622C16A05BBC1B50B1242F92F2A7EEC46162665DACA140E3C557C5CD + 38C52B75FF002EDA9D586A38483529B6DF4D2DF3F97E879BFEDD5F1534EF8CFF + 00B1E47A96866C753D0EFB5DB0F22FECB54B6BDB7B80B2C81B6BC0EE8D878CA9 + 01B2086CE31839BFB25FECE7A0EB7FB2F6BFAC6B1A4DB5D5E6BD36A16905CCA9 + B9E0B516E21210E78CB19B247D3A55CFDBDBE1BC7F08BF651D1F44D1DA1B5F0F + 58EB16504165145E5AC2155F6851D028DA400A0718CE4E49F60F877E101E05FD + 967C2561E5F9771FD8ED3CA3D1E64F39FF00F1E7C7E15C38E9D4E48BA97E6EBF + E5A6E7760E34F99FB2B72F4FF83E67E196BF7D69E14F156AFA2EA17D630EA5A6 + 5F4D6F7104970A8E8CAE41E09CF38AEBFE1AEB17DA15A5D6ADA05E3DBEA562AF + 34535BBAEF50217DDB5BA64AE467DEBCAFFE0A55E188F47FDB43E264516369BA + 4B9618FE29208E46FF00C79CD7A2FEC3DF0DF4DF14695A2E8BA8798D6FAAEB90 + 46638D824972ECB1EC8518FDD691F081806605B211C80A7939934EFB58EF71B3 + 4D1EFDF0034BD4BE247C4BF0D78D2E3E227883537D36E7C3F77E25F0EEA77173 + E5D85AC97004F348E646824846C766C7CAAA58B05DC0554FD99FC69E34BBF873 + A2E87E0DD305F6A1E1FD5AED750BCBCB7B1BCB30BB4B431DB0998162B8958EC6 + 00F98BD8823CAAFF00E3BC7E36175E1BF87D7DA6E83A14D0DB88E4834CB98F53 + F2158C1E5493B090EF56320133166505C46C8ACCA7DAFF0066B8A4F85BE3BF12 + 5BE977DA7E9F63E13F10C3A9033DC08D238E4B49E38A188481434C0C9B0EE1F3 + 6D63CE0570EF16AC6F2D1EACF40F825F0BF54F1FFEDDD63FF0995ADE785FFB6B + C212DF5841A7CF6F1BDE436D3881164642E50B42EFB82346C47A29E6C7C54FD9 + EFE28FC60F8EBF15BC25A3FC52F105CD9F86EE34BB8D2ADB53D5EF63922FB642 + D7660B710BAC4AA8CA533229013196E589DEF881F1964F0AFEDB1F056EA6D235 + 45BDB0B6D4745B9B4816D2FE468AE2D992DD116C679DE461247B8A955241C0CE + 491E81F013E387857C35FB53FC62B8D7BC40BA45CEBABA20B6FEDA80E97712F9 + 164CB28F2650AF128908015F92369CB7DE3ECD3C251E5507BDF7D9DADD8F1EA6 + 2AB2939ADADB6FADD1F2BEA9F04BC57E10FDA33E1F7C31D5216BF97C51AE9D1E + 5B8B59E08D2D65478A594A4891A4B232C6CB316729F3700B95047D8BFB53FF00 + C12DE6F81BA0FDB06AD6B7927FC25BA8697A7DE5F5EB08F59B1F2ADA6B3712B8 + 9024CA5EF12566609E65BAA054196AE5749D5FC37F12FF006FBF875AC43A8432 + 697378C1AE2D354B7B2B8BA9229A6821B688C6A8426D79090CCEAC0EC003264B + 57D8FF00B60FECD31F86FE0F6B5A7EADE3CF1C34163AEDDF886D9EF67B2B3B4B + 39B51BD325D46B10B6173E5667B82B1A4E71B8F2531BBC6853849C979B5F73D0 + F61B924BA689FDEB53F1C7E36FC24B7F879F062E97C5DE2AD43C2F6BE3DD6ACA + F17C44D126AB63E1CBAB54D4A08ACEE45A949639EEA090C81BCA21163DACCC4B + F97CC7C42F817A2FC1EF85D6775E32F8A5A845AC58EA70E97A3369FA4B5E5BDF + 4915BC170927DAA69E2F214473C663223917E51C8C135F417FC14F34FD3F46F8 + 71F0CF5ED2EEAC7414B6B18AC353F105F4116B5E1E8818D847637FA701297776 + 0ECB3FD99CC6514647253E5EFDAFBC391D97EC69630CF6579A4FD9FC4D2CF6B0 + 5CDDFDA207CE9F6DFF001E4E4E5ACB68060EE2168B3EA7B274D464A2B6B2FC91 + 85393945B7DDFE67BB7C15F0578AAD758F0668763AF785350D0FC077A2F92E23 + D5EDEE66768768B49DDA08D23F2A28E5B948621BF699642EC4305AF61F879F18 + 3C4DF06F4ED763F10787AC2EA2D362FED1B486F750FECC478A3749A76C48CC1C + 11122AE028CE4019233F3F7C17F157D8BC6DE04D3759D427F10E9BA9E948F636 + B3465974A6DC4BC4DF383E5882D86DDA7E53B7E423E61EE07C6979E11FD9EBE2 + F6B9E245908D05EEA422DAF6DECD6FEE1EE1EDFCA86411C9E5A8598795D5385D + A9950C3292946AEDA0F4953DCF8E3E2AFED65F1735CD35B5ED07C49A2C769329 + BA1636BA3DA09A0899C8DCA2584B950782413820E0B0E6BC6356FDBA3E2F3339 + FF0084E35CB7DDD45B48B6DFFA2C2D7710FC6ED3AEB43D51B56B85BABABAB630 + DB43A8C03559A25F3176C725C490EE70AA58F500900F04F1B1FB4869DF01BE33 + 780BC2775E08D4B56F0D7C486B2B4B6D720BBD345B681712ADAAABB2B20CC4E6 + 65DBBC828C1B7391CBD1ECA4EED16AA2564D1E43E12FDABFC65ADDE6A6BAEEB1 + 26BD69F6379A78F57D40C92305C01E43484B79A376422F040248E323B58353D2 + 7C79E168F50B786CB528E152424B107F29C73B594F43FCC7B5780F893C197DE1 + 2F105C69BA959DC595EDBB18E48A54C143D7F11DC11C104115BBE0696FBC357A + B716323445C6D910FDC997D1877FE63DAA7A6869A6E75DA9FED15E24D160682C + F4FF000DD946A3681169AA0E07D49AE7EDBE30F89AE2EDA78EE63B395B86305B + C684FAF2067BD4DE21D3C6ACAD34719567E5E3C7DDCFA7B7BD57D37C35242BBA + E15608C6097738502B3BBEA5DA3BA417DE32F116B4BB6EB55BFB856FE1927665 + FC89AA724CD691AC97175E5F395E7073EDEB57754D66DED2D9A2B1856593A19E + 55F97FE02BFE39AE3A6692F6EDA4964692461C92739E6A772B5B1E93E16FDA07 + 53F09E9CB6D6BAA6AB3479E52E27F3A2FA04604015B3A77ED5B7966EBE769F14 + C579530B98190FA8C0207E55E77E04F86FAF7C48D5BEC1E1FD1757D72F76190C + 1A75949752851D5B646A4E07AE2B63C6BF0A358F864D1C3AAD8FD8EEA662803C + 88F2C6C02E54C609D87E75FBDCF3D2AA3269E8C9924F73D5BE1FFC5AF0FF0089 + 35CFED6B8D3F51B1D45583B5CCB6F1CF0CE4306C39C867E473C1E2BD53C73FB4 + 8EB5F123C21A968CB7D610DBEAF0DBDB5CBC21EDD658E079258E2DAED8442F26 + 4840061471F7B773773FB21782E2D52DECF4BD73C53AC5C5C68971AAAB5D4B1A + 431C296125C292D1A875225409B0060413CE700FB07ECADFB1CFC2DF125CDCD9 + F883C1975AF6A5A7696D35D06D6EEDD279C4AA36C680478254E03162A0E72010 + 71A46B54B72F46652A70DDF424FD9A7F683B1F861F0BAF7C23AB5B4EF6F34CD7 + 96F77664336F68E38CA39F30298F0808C65837B74F867E3AD85C37C6FF00191F + B3DC2E75CBDE190EE1FE90FD7DEBF483E13FC2BF82BE0CF0E78B7557F87B269F + 6BA0191A5D527D2E2B986C632F1A8625669652BBA2936B6CCFEF08C5705E29F0 + CF80755F136A57574D3C97373752CB2B996CBE7767258FFAFEE49AA956D9CBB1 + 11A69EC8FD53FD97BC7DA97C4BFD9EFC1BE21D52456D4B56D1EDEE6E5A30555E + 42BF33633C67AFD4D75F2F8774FD68FF00A669F6379890B8F3EDD24C10D907E6 + 079079CD1457D9D1D69C6FD91F175F4AB2B7765497E1F689AB3DD5BCDA65AAC3 + 1C8A1561530E094472D9420E7271907A281EB99B4EF045AFDA2E2382EB54B48E + DE408AB15EC841DD1A312771273CFE1818C73928AE4B5A31F57FA9D5CCFDFF00 + F0AFD0F05FF8290688F1FC1AD1ACE4BFBEB8B5B8F1258C6D1CAC8DD44A33BB6E + EE87B9AF68F891214F0B246BF2C71DBC88AA070004C0FD28A2BCDCDB75F33D2C + A7E197A9F807FF000552B7583F6D7F8A3B06DF9ED7BFAD95B13FA9AF4CFD81EF + 1B4BF1AFC3BDAA926DF1CE9080C83715FDFC073F51814515C54FE1F97E87A953 + 75EA790FC30B249758D77EF27D8746B578B61DB82D752B367D725D8FE5E95F48 + 786EE85B78CAC7C4135B69B797D71A0D8DCCC92D840B6F2B34B736EC0C488A80 + 18C63800E4EECEEC105158D959FF005D4A937747D71FF0506F835A07837F64DF + 837AFE9316A5617F278B7478E409AB5DB467CD8A62E515A53E536777316CFBC7 + DB1E3FF01FE0F687E284D4AE3548EFB516BAD3ECEFA412DFCEB9925D3D2E8825 + 1D4B2893202B12304E7279A28AEBC47C76E965F9238F08DBA4DF9BFCCCFF0085 + BE02D27C0BE39F19FF0063D8C3A70D2FC33AC49008C6E2A91C0BBA3DCD965595 + 0BC6ECA43ED91F6B23618755FF00048AD7ACBE27783B52F104DE1CF0D697793F + 8BF488825858EC4897ECAEA554B977C36DDC41620B33375268A2B8701FC59AF3 + 7F923BF19FEEF07E4BFF004A6715FF000559B0B5F0B7C3BF04C86CED350B3F12 + 5FDAE997B67730A88DA2FB3120AC91EC995964449011270CA78DACEADF217C7C + F164DAE7C10B0F0A8861B4D0FC1325C2E9B6F1348DFBC79912499DA466667641 + 1A750AA90C4AAAA1714515D4FE146503D334BD426F87D17C2EBED3E6B8F3BC47 + A2C33DCACB3C92468C751685B626EC0052250548233938CF35CB7C48F1DDCEAD + FB3B9B336B636F1DF6AD25D398632A5424F38112F3811EE3BB6E3860318000A2 + 8ACEA7C6553F84F12B3B15D47548A172CAB21C12B8CF4CD5111F972EDC9C1E28 + A282A47E93F80FF667F06FED8DFB2F7C4EF1278BB498E3F107803E1968BAC68F + A869C7ECF3453C3FDBD9DFD55D6516F0AB86072235C152011F9F1A3E8B0C76E3 + 1BBE5E073451584762A5F11721D1A16D46163BB3F7873D0D71DF192F24D13518 + DA17639936ED73B940C761DA8A2B396E694CE6B4FF00114D7C63478E10188CED + 07FC6B5347D1E0BAF1024722B347904AE719F6E39E7DB9A28A8347B1EC565A87 + 88BE0EF8125BBF08F8DBC71E154D540FB55B691AD4D6704FB49DBB96320B6373 + 6324E326B85BEF106ADAE5BADE6A9AC6A5AB4D6F2A4CAD7D209D999700167237 + 9E00182718028A2B334E87DF9FB347872D757F8A3AD79D18FF0044F00AA44100 + 4D9BD630C780393B9B9FF68D7AE7C1676F107C766D4266F2EE353B6B99AE3CB0 + 3123A35BCF939C9CB348C092738C6304668A2B78F4F4397B9E79E209E5BBF85D + F136CCCD2C70C7E13D58111B6DDE12E92450474C033C9C631D3B806BE42F8EDF + 10FC4769F1BFC65143E22D7A1863D72F51238EFA4548D45C38000CF000E31451 + 56BE1899FDA67FFFD9} Stretch = True end object Label11: TLabel @@ -670,7 +1573,7 @@ object FormConfig: TFormConfig Top = 8 Width = 633 Height = 505 - ActivePage = TabSheetPN + ActivePage = TabSheetAutonome Font.Charset = DEFAULT_CHARSET Font.Color = clBlack Font.Height = -11 @@ -717,7 +1620,10 @@ object FormConfig: TFormConfig Top = 24 Width = 81 Height = 21 + Hint = 'Adresse IP' TabStop = False + ParentShowHint = False + ShowHint = True TabOrder = 0 end object EditPortCDM: TEdit @@ -725,9 +1631,12 @@ object FormConfig: TFormConfig Top = 48 Width = 57 Height = 21 + Hint = 'Port du serveur de CDM Rail (9999 par d'#233'faut)' TabStop = False BiDiMode = bdLeftToRight ParentBiDiMode = False + ParentShowHint = False + ShowHint = True TabOrder = 1 Text = '123' end @@ -1308,7 +2217,7 @@ object FormConfig: TFormConfig Top = 128 Width = 297 Height = 73 - Caption = 'Acc'#232's r'#233'seau '#224' l'#39'interface vers la centrale' + Caption = 'Acc'#232's r'#233'seau '#224' l'#39'interface XpressNet vers la centrale' TabOrder = 2 object Label7: TLabel Left = 14 @@ -1329,7 +2238,10 @@ object FormConfig: TFormConfig Top = 20 Width = 81 Height = 21 + Hint = 'Adresse IP de l'#39'interface XpressNet' TabStop = False + ParentShowHint = False + ShowHint = True TabOrder = 0 end object EditportLenz: TEdit @@ -1337,7 +2249,10 @@ object FormConfig: TFormConfig Top = 44 Width = 81 Height = 21 + Hint = 'Port de l'#39'interface Xpressnet' TabStop = False + ParentShowHint = False + ShowHint = True TabOrder = 1 end end @@ -1495,7 +2410,7 @@ object FormConfig: TFormConfig TabOrder = 8 object Label82: TLabel Left = 16 - Top = 32 + Top = 28 Width = 35 Height = 13 Caption = 'Echelle' @@ -3183,7 +4098,7 @@ object FormConfig: TFormConfig Caption = 'Etat' end object LabeledEditDCC: TLabeledEdit - Left = 40 + Left = 16 Top = 20 Width = 41 Height = 21 @@ -3194,7 +4109,7 @@ object FormConfig: TFormConfig OnChange = LabeledEditDCCChange end object LabeledEditEtatAcc: TLabeledEdit - Left = 160 + Left = 144 Top = 20 Width = 41 Height = 21 @@ -3205,8 +4120,8 @@ object FormConfig: TFormConfig OnChange = LabeledEditEtatAccChange end object SpinEditEtat: TSpinEdit - Left = 240 - Top = 19 + Left = 200 + Top = 20 Width = 33 Height = 22 MaxValue = 2 @@ -3216,7 +4131,7 @@ object FormConfig: TFormConfig OnChange = SpinEditEtatChange end object LabeledEditTrain: TLabeledEdit - Left = 160 + Left = 144 Top = 44 Width = 113 Height = 21 @@ -3232,8 +4147,8 @@ object FormConfig: TFormConfig OnChange = LabeledEditTrainChange end object RadioGroupOP: TRadioGroup - Left = 208 - Top = 16 + Left = 48 + Top = 32 Width = 89 Height = 57 Caption = 'Op'#233'rateur' @@ -3343,8 +4258,8 @@ object FormConfig: TFormConfig 'Les fonctions logiques servent de d'#233'clencheurs pour les actions ' + 'et les conditions. ' - 'Elles permettent de r'#233'aliser des combinaisons logiques d'#39#39#233'lemen' + - 'ts divers comme ' + 'Elles permettent de r'#233'aliser des combinaisons logiques d'#39#233'l'#233'ment' + + 's divers comme ' 'l'#39#233'tat des aiguillages, d'#233'tecteurs, boutons TCO, m'#233'moires etc...') ReadOnly = True TabOrder = 2 @@ -4960,8 +5875,8 @@ object FormConfig: TFormConfig Caption = 'Les p'#233'riph'#233'riques sont utilis'#233's pour '#234'tre activ'#233's par une action' + ' et pour leur envoyer des ordres ASCII. On peut '#233'galement leur e' + - 'nvoyer des informations sur les '#233'v'#232'nements aiguillage, d'#233'tecteur' + - 's et actionneurs via les services.' + 'nvoyer des informations sur les '#233'v'#232'nements aiguillages, d'#233'tecteu' + + 'rs et actionneurs via les services.' WordWrap = True end object LabelRC: TLabel @@ -5084,7 +5999,10 @@ object FormConfig: TFormConfig Top = 80 Width = 97 Height = 17 + Hint = 'COM/USB uniquement : mise '#224' 0 ou 1 de la ligne DTR' Caption = 'DTR' + ParentShowHint = False + ShowHint = True TabOrder = 4 OnClick = cbDTRClick end @@ -5460,7 +6378,7 @@ object FormConfig: TFormConfig end object GroupBoxBt: TGroupBox Left = 312 - Top = 192 + Top = 320 Width = 260 Height = 121 Caption = 'Bouton' diff --git a/UnitConfig.pas b/UnitConfig.pas index 498cb2b..ed451de 100644 --- a/UnitConfig.pas +++ b/UnitConfig.pas @@ -7426,6 +7426,7 @@ var i,j,x,y,l,k,LongestLength,PixelLength : integer; begin if AffEvt or (debug=1) then Affiche('Création fenêtre config',clLime); + editAdrIPCDM.Hint:='Adresse IP du PC sur lequel CDM rail s''exécute'+#13+'ou 127.0.0.1 pour indiquer ce pc'; ValueListEditor.Visible:=true; // liste des paramètres du mode expert de la ValueListEditor @@ -7482,8 +7483,8 @@ begin with Liste[5] do begin nom:='5. Utilisation de l''anti timeout Ethernet'; - aide:='Si 1, envoie un caractère chaque minute à la centrale '+#13+ - 'pour éviter sa déconnexion (uniquement en Ethernet)'; + aide:='Si avec, envoie un caractère chaque minute à la centrale '+#13+ + 'pour éviter sa déconnexion (uniquement en Ethernet XpressNet)'; typ:= PickList; variable:=@AntiTimeoutEthLenz; typeVar:=Bool; @@ -7713,47 +7714,7 @@ begin TreeViewL.HideSelection:=false; TreeViewL.Images:=ImageListLogic; - with SpinEditEtat do - begin - Top:=19; - Left:=160; - Visible:=false; - text:='1'; - MaxValue:=2; - Hint:='Etat de l''accessoire'+#13+ - '1=dévié'+#13+ - '2=droit'; - ShowHint:=true; - end; - - LabelEtat.Top:=4; - LabelEtat.Left:=160; - LabelEtat.Visible:=false; - - with ComboBoxOperateur do - begin - Style:=csOwnerDrawFixed; - clear; - itemHeight:=18; // hauteur des icones - items.add(nomopET); - items.add(NomOpOU); - items.add(NomOpNonET); - items.add(NomOpNonOU); - end; - - RadioGroupOP.visible:=false; - - with ComboBoxVar do - begin - Style:=csOwnerDrawFixed; - clear; - itemHeight:=18; // hauteur des icones - items.add(NomEtatDCC); - items.add(NomEtatDet); - items.add(NomEtatBoutonTCO); - items.add(NomEtatMemoire); - end; - + s:=GetCurrentDir; if not(directoryExists(rep_icones)) then CreateDir(rep_icones); ChDir(s); // revient au rep initial @@ -8164,7 +8125,7 @@ begin with LbZTitre do begin Left:=64;Top:=20;Width:=50;Height:=12; - caption:='Zone ferme Zone ouvre'; + caption:='Zone ferme Zone ouvre'; name:='LbZTitre'; parent:=GroupBoxPNZ; end; @@ -8548,6 +8509,53 @@ begin // marche pas!! SendMessage(ListBoxActions.Handle,LB_SETHORIZONTALEXTENT,PixelLength,0); + // fonctions + LabeledEditEtatACC.Left:=LabeledEditDCC.Left+LabeledEditDCC.editlabel.Width+10; + LabeledEditTrain.Left:=LabeledEditEtatACC.Left; + RadioGroupOP.Left:=LabeledEditEtatACC.Left+LabeledEditEtatACC.editLabel.width+10; + with SpinEditEtat do + begin + Top:=22; + Left:=LabeledEditEtatACC.left; + Visible:=false; + text:='1'; + MaxValue:=2; + Hint:='Etat de l''accessoire'+#13+ + '1=dévié'+#13+ + '2=droit'; + ShowHint:=true; + end; + + LabelEtat.Top:=4; + LabelEtat.Left:=SpinEditEtat.left; + LabelEtat.Visible:=false; + + with ComboBoxOperateur do + begin + Style:=csOwnerDrawFixed; + clear; + itemHeight:=18; // hauteur des icones + items.add(nomopET); + items.add(NomOpOU); + items.add(NomOpNonET); + items.add(NomOpNonOU); + end; + + RadioGroupOP.visible:=false; + + with ComboBoxVar do + begin + Style:=csOwnerDrawFixed; + clear; + itemHeight:=18; // hauteur des icones + items.add(NomEtatDCC); + items.add(NomEtatDet); + items.add(NomEtatBoutonTCO); + items.add(NomEtatMemoire); + end; + + + // actionneurs PN ListBoxPN.Clear; longestLength:=0; @@ -8626,6 +8634,7 @@ begin 'Le nombre de crans à 128 est validé par la mise à 1 du bit 1 du CV29 du décodeur'; LabeledEditCrans.ShowHint:=true; + // compteurs ComboBoxCompt.ItemIndex:=0; @@ -8679,8 +8688,6 @@ begin ButtonCouleur.Visible:=false; {$IFEND} - ImageSignaux.picture.Assign(formpilote.ImageSignaux.Picture); - EditComUSB.Hint:='COMX:vitesse,parité,nombre de bits,bits de stop,protocole'+#13+ 'procotole = 0 : sans protocole, avec temporisation d''envoi entre trames (LZV200)'+#13+ ' = 1 : protocole logiciel XON-XOFF avec temporisation d''envoi'+#13+ @@ -8726,24 +8733,8 @@ begin label72.caption:='La rotation de bouton changera la vitesse du train. L''appui sur le bouton stoppe le train.'+#13+ 'Les évènements clavier sont interceptés par signaux complexes ce qui ne nécessite pas d''activer la fenêtre'; - { - with GroupBoxBr do - begin - Left:=312; - top:=170; - Width:=260; - Height:=140; - visible:=true; - end; - with GroupBoxBT do - begin - Left:=312; - top:=170; - Width:=260; - Height:=140; - Visible:=false; - end;} GroupBoxBT.Visible:=false; + clic_BRM; PageControl.ActivePage:=Formconfig.TabSheetCDM; // force le premier onglet sur la page couleurs_config; @@ -17521,7 +17512,7 @@ end; procedure calculs; var vitesse,erreur,distArret : integer; - coeff,vitR,TempsArret : single; + vitR,TempsArret : single; begin val(FormConfig.LabeledEditCalcV.text,vitesse,erreur); vitesse:=abs(vitesse); @@ -17977,7 +17968,7 @@ begin LabeledEditDCC.text:=intToSTR(fonction[foncCourante,iNode].adresse); end; - if i=EtatDet then + if i=EtatDet then // actionneur détecteur begin RadioGroupOP.Visible:=false; LabelEtat.Visible:=false; @@ -17993,7 +17984,7 @@ begin if i=EtatBoutonTCO then begin RadioGroupOP.Visible:=false; - LabelEtat.Visible:=true; + //LabelEtat.Visible:=true; SpinEditEtat.Visible:=false; LabeledEditEtatACC.Visible:=true; LabeledEditTrain.visible:=false; @@ -18009,7 +18000,7 @@ begin with RadioGroupOP do begin Visible:=true; - left:=208; + left:=LabeledEditEtatACC.Left+LabeledEditEtatACC.width+10; top:=8; end; LabeledEditDCC.Visible:=true; @@ -18980,7 +18971,6 @@ end; procedure TFormConfig.ValueListEditorMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); -var BarInfo: TScrollInfo; begin exit; y:=y div (ValueListEditor.RowHeights[0]+1); @@ -19123,10 +19113,10 @@ begin shapeB7.Brush.Color:=clGray; shapeB8.Brush.Color:=clGray; GroupBoxBt.visible:=true; + GroupBoxBT.Top:=GroupBoxBloc.Top+GroupBoxBloc.Height+10; GroupBoxBr.visible:=false; GroupBoxBT.caption:='Bouton n°'+intToSTR(BoutonBloc); end; - end; procedure rotatif; @@ -19144,6 +19134,7 @@ begin shapeB8.Brush.Color:=clGray; GroupBoxBR.visible:=true; GroupBoxBT.Visible:=false; + GroupBoxBR.Top:=GroupBoxBloc.Top+GroupBoxBloc.Height+10; end; end; @@ -19264,7 +19255,12 @@ procedure TFormConfig.LabeledEditCTChange(Sender: TObject); var i,erreur : integer; begin val(LabeledEditCT.Text,i,erreur); - if (erreur<>0) or (i<0) or (i>255) then exit; + if (erreur<>0) or (i<0) or (i>255) then + begin + labelInfo.Caption:='Erreur : valeur de 1 à 255'; + exit; + end; + labelInfo.Caption:=''; case BoutonBloc of 1 : blocUSB[NumBlocUSB].Bp1:=i; 2 : blocUSB[NumBlocUSB].Bp2:=i; @@ -19283,7 +19279,12 @@ procedure TFormConfig.LabeledEditRmChange(Sender: TObject); var i,erreur : integer; begin val(LabeledEditRm.Text,i,erreur); - if (erreur<>0) or (i<0) or (i>255) then exit; + if (erreur<>0) or (i<0) or (i>255) then + begin + labelInfo.Caption:='Erreur : valeur de 1 à 255'; + exit; + end; + labelInfo.Caption:=''; blocUSB[NumBlocUSB].rotatifM:=i; end; @@ -19291,7 +19292,12 @@ procedure TFormConfig.LabeledEditRpChange(Sender: TObject); var i,erreur : integer; begin val(LabeledEditRp.Text,i,erreur); - if (erreur<>0) or (i<0) or (i>255) then exit; + if (erreur<>0) or (i<0) or (i>255) then + begin + labelInfo.Caption:='Erreur : valeur de 1 à 255'; + exit; + end; + labelInfo.Caption:=''; blocUSB[NumBlocUSB].rotatifP:=i; end; @@ -19299,7 +19305,12 @@ procedure TFormConfig.LabeledEditClicChange(Sender: TObject); var i,erreur : integer; begin val(LabeledEditClic.Text,i,erreur); - if (erreur<>0) or (i<0) or (i>255) then exit; + if (erreur<>0) or (i<0) or (i>255) then + begin + labelInfo.Caption:='Erreur : valeur de 1 à 255'; + exit; + end; + labelInfo.Caption:=''; blocUSB[NumBlocUSB].clic:=i; end; @@ -19308,7 +19319,12 @@ procedure TFormConfig.LabeledEditNUMChange(Sender: TObject); var i,erreur : integer; begin val(LabeledEditNUM.Text,i,erreur); - if (erreur<>0) or (i<1) or (i>10) then exit; + if (erreur<>0) or (i<1) or (i>10) then + begin + labelInfo.Caption:='Erreur : valeur de 1 à 10'; + exit; + end; + labelInfo.Caption:=''; NumBlocUSB:=i; LabeledEditCT.Text:=''; LabeledEditRM.Text:=''; @@ -19326,13 +19342,19 @@ begin i:=index_train_nom(BlocUSB[NumBlocUSB].AffTrain); ComboBoxUSBTr.ItemIndex:=i; label72.caption:=''; + clic_BRM; end; procedure TFormConfig.LabeledEditFChange(Sender: TObject); var i,erreur : integer; begin val(LabeledEditF.Text,i,erreur); - if (erreur<>0) or (i<0) or (i>30) then exit; + if (erreur<>0) or (i<0) or (i>30) then + begin + labelInfo.Caption:='Erreur : valeur de 0 à 30'; + exit; + end; + labelInfo.Caption:=''; case boutonbloc of 1 : blocUSB[NumBlocUSB].Fbp1:=i; 2 : blocUSB[NumBlocUSB].Fbp2:=i; @@ -19602,7 +19624,6 @@ begin ListBoxTrains.items[ligneclicTrain]:=encode_train(ligneclicTrain+1); ListBoxTrains.selected[ligneclicTrain]:=true; calcul_equations_coeff(ligneclicTrain+1); - end; procedure TFormConfig.LabeledEditVit3Change(Sender: TObject); @@ -19626,9 +19647,10 @@ begin ListBoxTrains.selected[ligneclicTrain]:=true; calcul_equations_coeff(ligneclicTrain+1); - end; + + end. diff --git a/UnitConfigCellTCO.dfm b/UnitConfigCellTCO.dfm index 5901a82..cc632e9 100644 --- a/UnitConfigCellTCO.dfm +++ b/UnitConfigCellTCO.dfm @@ -485,10 +485,10 @@ object FormConfCellTCO: TFormConfCellTCO OnClick = CheckPinvClick end object GroupBoxAction: TGroupBox - Left = 312 + Left = 320 Top = 152 Width = 273 - Height = 145 + Height = 153 Caption = 'Actions' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -497,8 +497,8 @@ object FormConfCellTCO: TFormConfCellTCO Font.Style = [] ParentFont = False TabOrder = 3 - object Label3: TLabel - Left = 16 + object LabelAction: TLabel + Left = 8 Top = 122 Width = 110 Height = 13 @@ -523,7 +523,7 @@ object FormConfCellTCO: TFormConfCellTCO OnMouseDown = ListBoxActionMouseDown end object EditParam1: TEdit - Left = 144 + Left = 128 Top = 118 Width = 33 Height = 21 @@ -534,7 +534,7 @@ object FormConfCellTCO: TFormConfCellTCO OnChange = EditParam1Change end object EditParam2: TEdit - Left = 184 + Left = 168 Top = 118 Width = 33 Height = 21 diff --git a/UnitConfigCellTCO.pas b/UnitConfigCellTCO.pas index af40fc3..67b2cba 100644 --- a/UnitConfigCellTCO.pas +++ b/UnitConfigCellTCO.pas @@ -36,7 +36,7 @@ type ListBoxAction: TListBox; EditParam1: TEdit; EditParam2: TEdit; - Label3: TLabel; + LabelAction: TLabel; ImageListIcones: TImageList; BitBtnOk: TBitBtn; BitBtnAnnule: TBitBtn; @@ -792,7 +792,7 @@ begin top:=140; width:=273; height:=145; - end; + end; with GroupBoxOrientation do begin left:=8; @@ -803,15 +803,18 @@ begin left:=16; top:=140; width:=273; - height:=145; + height:=ListBoxAction.Height+60;; end; with GroupBoxCanton do begin left:=16; top:=140; width:=273; - height:=145; + height:=130; end; + LabelAction.top:=ListBoxAction.top+ListBoxAction.Height+10; + EditParam1.Top:=ListBoxAction.top+ListBoxAction.Height+6; + EditParam2.Top:=ListBoxAction.top+ListBoxAction.Height+6; With StringGridDet do begin @@ -858,6 +861,7 @@ begin // une imagelist c'est 16x16 maxi with ListBoxAction do begin + Font.Size:=round(8*RedFonte); Items.Add(Format('%d%s', [0, 'Afficher TCO'])); // valeur d'index de l'icone dans la ImagelistIcones itemHeight:=16; Items.Add(Format('%d%s', [1, 'Afficher Signaux Complexes'])); @@ -878,6 +882,8 @@ begin itemHeight:=16; Items.Add(Format('%d%s', [26, 'Bouton bistable'])); itemHeight:=16; + + //height:=GroupBoxEl.Height-ListBoxAction.top; end; // calcul des éléments en fonction de la taille de GroupBoxEL à cause du dimensionnement enn % des textes windows @@ -888,7 +894,7 @@ begin GroupBoxCanton.Width:=GroupBoxEL.Width-10; GroupBoxDet.top:=RadioGroupSEl.Height+RadioGroupSel.Top+10; GroupBoxDet.Width:=GroupBoxEL.Width-10; - GroupBoxAction.top:=RadioGroupSEl.Height+RadioGroupSel.Top+10; + GroupBoxAction.top:=RadioGroupSEl.Height+RadioGroupSel.Top+5; GroupBoxAction.Width:=GroupBoxEL.Width-10; GroupBoxOrientation.top:=RadioGroupSEl.Height+RadioGroupSel.Top+10; diff --git a/UnitIntro.dfm b/UnitIntro.dfm index 779a2d8..07fc6c9 100644 --- a/UnitIntro.dfm +++ b/UnitIntro.dfm @@ -3,7 +3,7 @@ object FormIntro: TFormIntro Top = 150 BorderStyle = bsDialog Caption = 'Introduction de donn'#233'es' - ClientHeight = 106 + ClientHeight = 103 ClientWidth = 188 Color = clBtnFace Font.Charset = DEFAULT_CHARSET @@ -19,9 +19,9 @@ object FormIntro: TFormIntro Top = 24 Width = 57 Height = 21 - EditLabel.Width = 47 + EditLabel.Width = 102 EditLabel.Height = 13 - EditLabel.Caption = 'D'#233'tecteur' + EditLabel.Caption = 'D'#233'tecteur / aiguillage' TabOrder = 0 end object ButtonTrCanton: TButton diff --git a/UnitIntro.pas b/UnitIntro.pas index 53d800c..7c8b16a 100644 --- a/UnitIntro.pas +++ b/UnitIntro.pas @@ -22,7 +22,7 @@ type var FormIntro: TFormIntro; - AchercherDet,AchercherCanton : integer; + AchercherDetAig,AchercherCanton : integer; implementation @@ -35,10 +35,12 @@ begin close; end; + + procedure TFormIntro.ButtonTrDetClick(Sender: TObject); var erreur : integer; begin - val(LabeledEditDetAig.text,AchercherDet,erreur); + val(LabeledEditDetAig.text,AchercherDetAig,erreur); close; end; diff --git a/UnitPilote.dfm b/UnitPilote.dfm index 2acd240..ca00180 100644 --- a/UnitPilote.dfm +++ b/UnitPilote.dfm @@ -68,916 +68,6 @@ object FormPilote: TFormPilote Height = 13 Caption = 'D'#233'codeur:' end - object ImageSignaux: TImage - Left = 168 - Top = 72 - Width = 153 - Height = 105 - Picture.Data = { - 0A544A504547496D6167659A700000FFD8FFE000104A46494600010101006000 - 600000FFFE003C43524541544F523A2067642D6A7065672076312E3020287573 - 696E6720494A47204A50454720763632292C207175616C697479203D2039300A - 00FFDB0043000201010201010202020202020202030503030303030604040305 - 070607070706070708090B0908080A0807070A0D0A0A0B0C0C0C0C07090E0F0D - 0C0E0B0C0C0CFFDB004301020202030303060303060C0807080C0C0C0C0C0C0C - 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C - 0C0C0C0C0C0C0C0C0C0C0CFFC000110800B400FA03012200021101031101FFC4 - 001F0000010501010101010100000000000000000102030405060708090A0BFF - C400B5100002010303020403050504040000017D010203000411051221314106 - 13516107227114328191A1082342B1C11552D1F02433627282090A161718191A - 25262728292A3435363738393A434445464748494A535455565758595A636465 - 666768696A737475767778797A838485868788898A92939495969798999AA2A3 - A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8 - D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FAFFC4001F010003010101 - 0101010101010000000000000102030405060708090A0BFFC400B51100020102 - 0404030407050404000102770001020311040521310612415107617113223281 - 08144291A1B1C109233352F0156272D10A162434E125F11718191A262728292A - 35363738393A434445464748494A535455565758595A636465666768696A7374 - 75767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7A8A9 - AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5 - E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00F6609F28 - 14A1702A5F2B28BED4F58706BF63B9F94B5A9E05FB54FEDF7E0CFD98BC6B63E1 - 5D622D56F356D434D9B56B85B24461A7DA44923EF7DC46E67F29D5507271938E - 33E7BFB497C61F09C3F0847C4EF03F86AE3E2678DEE6C65D33C3D0DA1926D2F4 - 684ED93FB52EE25FF5F2832324300FDDFCB2198905623EA3FB697EC79E09FDA2 - 7C09A96A1ACE9E2DFC4D6DA5CB6163ADDB3797776D1C990518F2B247F3B7CAE0 - E3736D2A4935F8E3F013C57E3CF837F1635883C27ACF972785C5E6A1A858CB79 - E4DAEA70596E7B85D84ED6631A3B0C7CE003B482057C1711D4C43AEE936B95D9 - AB7657DFE6D9F6590D1C3BA3ED127CCB7BF99F437C17FF0082BD7C44F06F8266 - F86FE3EF1778FF004DF0A8998ABF86EE868D7FA797FBE92A42B1F9F177DAE095 - E42F0401DA4FFB2FDAF8EBE1E4FF00103C1BF10AC7C51A248CCE26BB8A64BC69 - 3201472371F303100EE0A4672428E6BC6BFE0A85AA5BFC69BFF04FC44F0FC135 - F689AA68496F73A8C71EF4826F3246486775E1660AC46D639F94E381537EC7FF - 00B74F84FF00668F1AEBDA6C3A0F896E3E1AF89ADED659AC0DCC7717BA65F7D9 - E34BA963DC5564467F300048628B0E4E4115F331E6E5E687DC7D24A2AF662F88 - BE227F6AE856275286EF546BC9E78A6BA689609E154588A793759632C87CC3B9 - 268D95004C64B9D9EFDFF04B6D357C1DFB7EFC19D58EA9E5E91797CF2DF26A68 - 2CE6974A786E60BC7EA639A23109D18AB64EC73B140207CDD71A9FF6824DA3D8 - FF00A6697717C6E2CA378375CAB728AC801CA332150CA321B626725148FA013C - 0F7BFF0004C9FD9ABC51F10BC6D6EDA0FC5BF8A3A1DCF873C05E19B91E5EA5A5 - E9F7B1182FF5CBA8BEF401AD8CB6D6EAFB59CCF2C980A8A5AA6ECB953D5F4335 - 1EC6C7FC12EBF6B3B8D13F693B4F006A9E75AAEBD149A74B6F701A3922B98636 - 9226656E4310AE9EFBFE95FA49E2ADCBE16D47692185B4841F43B4F3D0D7E23F - FC13A7C61E24F18FED8DF0C7C3FF006A5D4157584FB34F771F9D73A5C71A3C8E - F04D912C615118EC0E10E39535FACDE22F89FA9784EE6E74DFF849341F11DA49 - 1496EC5889AEADEE3692B1B3DB01E57CA19B12C440087337391F5996660E1809 - C2AAF77549FAADBBEFF99F3399E0D3C6C2517AE8DFC99E8BA1E8B6FA6D905B78 - 63B78E43E6948D022EF6E59B03B92724F52493EF56DADBE9D6B17C19E2AB8D67 - C27A7DF4D64DB6E23E44254952095276EE231C646189C11C03915B9697B0EA24 - 88A45665E590F0EBF553C8FC457A94AA45C138F63CF9D36A4FD4F37F87E638BE - 31F8D34DB8B3B75BA98C774B24518DB35B12C17CC381962E5F8F9BA3735E9DE1 - C81603711C6D36D42AC11DB72C590785E720719C741DAA8E95079D25D961CC77 - 5228E31C616B53C3B1EEBDBE3C9C141FA1AD32B4E3CBAF57F8DD91983E64DF92 - FC2C5EF2F9EF404C03EFC558F230697C9C8FEA2BDE3C6E52B797C534C78FFF00 - 555AF2B07F0E2B90F8C9737F67A05AAE9BA9DC68D70D74AFF69816195880AC3C - B314AAC24466652DB7691B47CEB9ACEA54508F33F2FC5D8BA74DC9D933C3BC76 - DE6FECEFF142D556391ED5FC4A634650EB9FB55EB2F07BE477FEA2BC7F4BFF00 - 82617C21F8CBF0F3C35E205B5D63C337FA96916B7772DA45E848E777854B3797 - 2ABAAEE249C2803AF15D27C6FF001B7C44F86FA2F8A2E2EBC25A7F8CBC37AC41 - 746E27F0F492457D652CE192590DAC9B8B445DF790ACE532F9936E02C7FB03FC - 704F8CDF0134CB792EB4B3AD787E03A64D6369725AE043022A24CD1B7CCBB942 - F2328B9EB9381F332A387AF5FD9555ADB66BB76FBFA1EFC2B57A541D5A6F4BF4 - 7DFBFDDD4F25F8F1FF000490F877F0F7E16EA9E22F0DEB9E20B6D63C376771A9 - 192E5E29D6F446858465511020246370CF539071C78F7ECDFF0003BC53FB407C - 27F889E19B8F121F0FF817C23A55D78A7FB36D74E8B6EB1790A79896C5C2AE23 - 53E5BBA316C130B0439C8FBE7E38DA7DAFE05F8D23E0EFD12EF1E9CC0E33FD05 - 7C97FB05EB9A6E907C5174DAE87B7F195BEB9E1AFECCDE0F9139D32DA4B798A7 - DE51232CF0E4F0CFE50193D38F1597E1E9E22114AD16B5D5AFBF53B30B8EAF53 - 0F3937769AB5F5F53BBF8F9A541FB387C18F84FE27FED9F1A78AA1F146991CDA - B5A6B3AEDDDD5ACF18B384A20B78D910450ACF2C81140CF96A18902BE77F087E - D61E28F09DEF899B42F0ADBE8F3788A1B6F3ADAC50C3268F1C324D2AF92AE8DF - BB91EE1988704EC2AAACA3691F497ED95E30B8F09FEC25FB38788AD5566963D3 - ED2D1D18FCB2C771A3F952A13FED47BD73DB39AE13C63FB5EF807E25FC31F116 - A76B6B30F1B6ADE2F9AF21B496DCB470599B0B7B2F25E6040283C913284DD878 - A3240C607899D51B627DD5BA8FE48F5B29ACDD0F79ECDFE67BC7ECB7A96A167E - 17B3BDD72E56DECADF556934D9AE36431AE96CEAF6CDBB81B446D8DC793B393C - 57D6F0F85AF2F7E1CC3E38F11789BC2BF087E1ADD00D67E29F179612EB208DCA - DA7E9E1925B8565E55D99038219164539AFC06F8A5F18BC41E2C9AD2CF53BEB8 - B8B6D2605B2B4B790FEEED228FE5540BD323B9EA7D7A0AD8F875FB48CD7CF61A - 1F8DB57D5EFB43B38BECBA6CF3DC4971FD840B16DB12B121606624B228C67E60 - 01CE63079957A149D1A2F96EF7EBA7636C465B4AB4D54AAAF6E9D0FD9ABBFDA3 - FF0065196FBEC775FB4C7C609AEF38FB7D878420B7D3D4E472226B36936E403C - 927DEBACD77E0E78913E193FC48F863E3AF0E7ED19F0E347266D41F45B6165E2 - 3D26318662F6AA4ACA555492B88E5C6488C819AFCA73FB3EF89B50D21753D22D - A1D7B49954490DE58CE8EB2A9E410370393EC0E7B135D7FEC49FB66F8CBF605F - DA174DF18787A7BC85ACE658759D25DDA38B56B50DFBCB7953D7192AC7947018 - 74C542C66214B9A35257D1BBB6EF6DAE9972C1D06B97917DD6DF73F45FE1F7C4 - AD0FE2B787E3D4B41D421BEB57018EDE248F23A32F507F4EB5E67F1CB48D79BC - 510F88B446934E9A2B98EDF56892EDFF00D32D536C48E91056577550088C8058 - 9EAA496307EDF363A4FEC9DFB6668BE36F87BB21F87BF1A342B6F1CE8F6F18F2 - EDD7ED3F35CDB851C2AB1DB2851C279E00C6D18EDAE35A87C43A03EA969E635A - DE2FDAA167653B94A8618DBD00CF43C8C1F515F472CC219961796AAB496F6FC1 - AFB8F06182960311CF4DFBAFFA68E7343F1ED8E97A65BE9BE20B4BBF0D6A51C1 - 1C5FE913B5C5BCDB50007CEE32C4F04B60163C126A8DEDC789A1BD9921965112 - BB2A0F291B0A0F1C9193F535D76B7A0D9F8A34AB9B4BEB58AF2D26DC1A390707 - 390483D4120E323079C7B578FDDFEC5FA7BDD48D6FE34F1FD9DBB3931411EAC7 - 640B9E107CBD00E07D2BA70B56BAA514D732B269DECFE7D0CB134E9BA8DA6E2E - FDAFFA9F52227C8B9A72A61454823CA85FE21D29CAB8FAFD2BE9E4F53E5CC1F8 - 81A3C7E20F09DCE9F33C91C37E8D6F23C67E655656048F719C8F7AFCAAFF0082 - 88FEC0FA5DCFC65B1D53E145BE9DA5EA9A96971DC78A3C2736AA9672E91A90DD - 15C4F686EE506E2C2E8A1B88DD1DBCB170D130528547EB1F8A5CA410A7FCF473 - 91EC0579CFC41F855E18F8C3349A6F8ABC3FA3F88AC63B48C245A85A24E2262F - 2E4A161946F7520FBD7CC66D83589A8ADA493B7FE4B7FD0FA0CAB18F0F06FA35 - 7FC6C7E567817FE09C777E13F85DAC788BC75F103C23E09B5BA86286C2CE2F37 - 56B9D5F3201298DA01F65C44A392F3819600726B6FE09FC35FD9C3C3FACDADA6 - A7378BBE236A91DD19534B544B48F5011A6F653E4C8BB632AAC38BBC8E4E3A57 - D41F1ABFE08E1E11F881AF2EA9E15F12EB1E1692344B76B2BA53A9593458D823 - 5DCCB246A14003E66C76C62BC0BE0CFF00C12DFF00E321345F07F8824D37C557 - 4CB7D757B6926AB3E996F0AC0AA12390C76EF2E779F315918092329FEAF764FC - B4B2EC4297235BBB5FFE1BFC8FA48E61425073E6D95EDFD7F99E8FE3BFF82E20 - F865E1EBDF0FFC15F86361FB3F6A8AA161BDD134DD364B864383FBC965B76BCC - 95E43ADDF707E615F17FC43B6F899FB40FC478F5EF157FC24DE2EF1178B2E088 - AFEEE299EE7509490001BC65C92CA06D279603B8AF7EFDAABC3967FB2C7ED9F0 - 69AFA0F84593C3B6E6EA5BBD2B44F32669AE22FB5A3C82EA5904CD1B3A22C929 - 24AA31237649FAFBF66CD17C59FB516A5E07D534ED33C53AFDF683E2BB6D4D2C - 2C239EEA33A6ED475956D631E5C691A4AA9B82800C4C3764E2B86541D1ADEC1D - 92BD9BEDDFEE3AA35F9E97B68ABE97472FFF0004DCFF0082482FC14BC97C5DF1 - 5B4FD2F52D7AFE036D61A1BEDBA874C46C179663CA34CC06D0AB95552F924B61 - 7ECDD7BC37A7F85345BAB4D2EC6CF4BB34D1AF02C16702C11A0C274550056DFC - 59BED4BE0CC7A7CDE29F0AF8C3414B8B958A06BFD29EDE2B966046C499F10B3E - 327CBF3048403B558E14E1EA9E33D17C6B1EA16B637BE65E43A55D8B8B3914DA - 5F40ACABCB45326F407B3346573EBD2BED68C7094E84E961E49EAACEE9B774BA - FDFA23E46ACF1352B46AD74D68FC96EFFE00FB3F0FDBDDDA43710BCB6B712448 - 4CF030567E060BAE0A3F1FDE071DB1D6926B6B98B6FDB2DE3BE8D7959EDD3122 - 7FC0324FE28C49CFDD159BE03D4B5BD3BC19A4B6AB602F646B64334967283342 - 48CED28C1436DCED055B242E719AE8B4EF10D8EB32F976F708D70ADB5A09018A - 607D363004E3D46455C250714BE17D9FF567F22674E49B6B55E5FD5FEF393F87 - 3E256F15C5AF4DA3EA36B7D058EB1359B452AB66268D630D1B37DF570DBB3BC3 - 11D31C1AEE3C10D25CC9A97996EF6B22C88BB5983071B01CA90795E71C80783C - 573FE1FF000B5A5CDE6B6CD03413FF006948C25899A2990B244C70E30D863C91 - 9C1F4C715D078623D4B4DB9D40AAC7A9C2B2A0209586E40F2C1F411B1E7A1F2F - EA6B6CBE4D38C9EDAEDF3E9BFDD733C76D25E9FA1D01872D9A0C3934DD3F57B5 - D4EE1A18D9A3B955DCD6F3218E651EBB5B048FF68657D09AB861E3A7E95F4119 - A6AF1678CE2D6E5336F5CEFC4CF05DE78CBC2F35AE9D796BA76A05488A79ED7E - D11AE4824150C8C036304AB0383DC818EB7C8C1A468703A1A9A91538F2CB61C6 - 6E2EE8F977C67AA78BBE11C6F75E25F06EA13D8C243B6ADE1B2753B6840FE278 - B6ACF1803D51946492DC64F88E85FB35781FE31CF6BA87847C651FF6569B79F6 - 9B64D3ADE15D474B2771F2D6E0E2E238C336424808C9E3B1AFD1044F2A4565E0 - A11CF4AF907E247EC97E15D7755F3A3B7D43C3FE20D3CB1875CD267363A88E48 - 2CEEB9127FB4640F9E80815E3E330FEF462FDE5ABD747A5B66ADE5A7E27A984A - C92725EEBD36D575E8FF0047D5E8799F8FBC6FF10BC1FAC78B3C1B1DB43F1134 - 98F407BA96E6E268EC357B58655923DC3AC771E5E0EE040761CA91F747CEFF00 - F04EFF0087FA07ED33ACF8B3C1DA969661D5EC0DEEBB6DAEDA5DB477D69B2DD2 - 3840451F3471CF1C6D96623748A300B06AEE3E25786BE2DFC32FDA75AF2EAEF5 - 2F8896ABE1BBDF3D34A68AC6EAFF004E1BE34F3E0385774964495963DC4A8EBF - 7B15FF00E09EFF0006BC7B69E0BF106A1E07F0C4DE20F12EA73DC456F6D1697A - 81D4EC1D62222B8865B5864DD1B348434330113F94BBB2335F3F88AF0F6D1F6F - 7514DDD4BB69B3FC376CF730F49FB17ECAD7925671EFE6BFE024745FB5F6B967 - E34FF82507C0BD42D248E54B1D4F4FD3E6D9C7952C76B730C88476C3478FA60F - 422BE39F855E1D5D4E3BC9DB6EE9AF6708A3B0F3769FE607E35FA45E17FF0082 - 2BFED3DF153E04E9BE11D53C2DA1F83FC176F716BAACCDAE5CC5A7C715DC1018 - 04CC0CBE7AE63C6FC200CCA0ED073BA2F0FF00FC122FE0BFECF0D19F895FB5A7 - C2DD125B47324BA678514EBD2839C9F9630B206CFF007C3F3D8D7978CC7D3AB3 - 528DDFBA96DA5D2B1E96130B3A51717D5B7F267867FC17FF00F663F047ECC5F1 - 4BE1AF85FC27A2E9FA2EB5E1DF87BA3A78AAE2D90A9D67529BCD792790671E66 - 029DC06487C1276AE3F34FC4578F35C470C7F2B49D48F4AFD1AFF83817F6A2F0 - 87ED73FB5F6A5E2EF00DF5E6ADE1B934ED36C85DCF6725A996482DDA373B2401 - 82EEC60B019AFCEF9BC6574DE18BAD0F6C0D6726A316A0ACC999239238E48885 - 6ECAE241B87731A7A73E6C60BD0F4B999F577FC12ABE385EFC35F892BE11BEB9 - B893C37E260D6D0073BA2B4BA6FBA39E02CBCA91D37943EB5E9DFB637C3EBFF0 - 27C55B36D4354D435ABBBED320336A57F299AE6FDE35F2BCC91CF2CCC8B193F5 - C57C1BA378F2F3C3FA7BC76BFBAB8C868A70C43DBB0390C873F7811907B1AFB1 - 75FF00DB7D7F6C9F865E1F875AF0F9D2FC6BE177686F6FED48FB0EA904883E70 - A4EF8E5DF1825794E490470A08C5A95C6ECD1F66FF00C144249356FF00825DFE - C4DAE6E669E1D035AD34C87A858A7B7445FC0262B4BF625F10B78C7F65EB3691 - B75C5BCF756CFF0079881BB2B9C8F4230013DBA722A87ED98A353FF82237EC8F - 75F785AEA7E22B2CFB1BB90FFEC959BFF04F5D7E3D2BF67D5B7B9323473EBAF6 - 90E264608D228FE0C8645E0E49CE7271DC57A5954946AFBDE7F91E766316E969 - DD1EFF00A49FB5D942DCE2401BEB9E7FCFE353344DB8E3CCC678C74AAFE1619D - 16DFEEE7CA4CE06D19DAB9FF003F4AB8E30C7EE75EEF83F88AFA5C0BFDCC7D11 - E2627F8B2F565A6D7FC59E1A9F17DA2DAEB1663FE5E74F9FF7B1A8EED195DCEC - 7FBB1A607A9AD2D1BE24E91AA6E59266D3E68F1E6C578BE51873D03364A06FF6 - 4B6E1DC03C574623C81506A3A1DAEB2ABF6AB7867F2FEE33AE5A33EAADD54FB8 - 20D7BB2A3561FC39DFCA5AFE3BFE67CEFB483F8A3F77F96C721E36F1D69F6FA9 - 450CD24D1C36FE62BCE6DD9E3CFCBC295C9EA083C7627903359DE19D66D3C43A - AEA5716338BAB78C44AB2A2B796CB83C86230C0B6EE5491C1A8FC5BF03E6B28D - A4D22EF51B7B7F3CCFE5C32B3143B8B1F9460B939C6496C8E0A919CF9ADAF8B7 - 45D1BC6775711DE69363AB5C2F98D73672C50DC4990546F0C0B4921238002A1C - 119E08AF9AC463AAD3C45AB46DADFD74B68D2FD3D4F76861613A17A6EFA5BD35 - BEABFE0AF99ECC8BBA1B8F518C7D42822BE7FF008D571A87C3CFDB7FE1C78934 - 6BCD2B4E97C4D1DFF87EE5F50B27B9B6674B58E685E5F2E44745DA64432296D8 - 36B32B2AFCBDDFC35F891AA1F05E91797DAA697AACD756705C5C99D45BEF91E2 - 563E5CD1028DBB04AAEC66231CF7AB17DFB277C52F8C7E28F08F89B5DF86DABE - 8BA4F85B5CBBBC6935E6B6D1ED6EEC2748ADC82D79346AE1ECDAE2320E0166CE - 00C1A55B30A16837249DEFF8A7D3C8AA385A8E535157D2DF83FD4FCE9FF82AE7 - 8FBC75E15FDB33C4D21B68740BE934CB18F526D1EEDAEE3319B458F1E73451B8 - 89D33B91940CB10770009EF7E057FC147AFBE3C7ECEFE17F82B1F8AA1F85F75A - 4AB43F61D3E1FB0E99E30B8762566B9922C3BCE72AA11CB20DA0469D87D37E3C - F861A7FC0397E3E7C4EF1A7C50F84FAAF88BC41F0875BF05F87F41D17C49FDBD - AC5D5C4D63F64B67945BC4F179CD016591BCDC17909030723F15AD3ECB05B4D3 - 3497906AD63750B5B04E136FEF3CC278C89158445791C6FEE057CCE32A46AD79 - D485ED776763E9307074E846125AA48FD6AFD9DFE36F8D7F621F8ADA7683E32B - A8FC49F0BFC6B20D3FC51E1B7D43ED5A76AD61215599FCACEE8678C3EF8A5011 - C3A603101C57B7FC31D52E3E14FED5BE3EF833AB6A126AADE099359D2747BBBA - C35C3411B703BE0491469215FBA190FAD7C61A7FED3FE1BFDABBC01E0CF26E48 - F1969B770C5AC58496CD1B3EF015A646C6C68DA45CE03646EC1515F4AFC4EBA9 - 752FF82FAFC4C64DDB1358D7D5C2F4F92C6E5727F103B8ABCB6A4E35E37EAD5F - CF52730A717465E8FF0023EB1F0943E778634D931F33DA44C7F1406ADEA7E1DB - 3D62D7CABBB786EA31C2AC89BB67D0F51F85677C3BD4E6BCF0769AE1AD6F952D - 61490DB931B23F9484AE18907191CEE1F4CD6F5BDE43733F97B8C72B748DD4A3 - 1FA03D7F0C8AFB184E2E093DBCCF939464A4DA389F0F786F5ED33C43AFC90EA5 - 6ED6FF006958AD2DEE6269A3F29628F8660E195B2CC370FE100107031DB7804D - C5D595E3DE5B456975F69DAF14571E7C6308982AFB5490410795041C8E7A9A1A - 1E5351D755BA2DF8DA3D8C109FE64D6F7844F9ADA87B5C2FFE8A4ABCAE9C60E3 - 6DB5D3A75FEB433CC2A39295FCBF42D6A1A45BEAD0F977104770AA772875CED6 - F553D8FB8E6AA7F65DFE98736773F6A8874B7BD624FE13005FFEFB0E4FA8EB5B - 4211FF00D6A511F3E95EECA317AF5EE7931BA31A2D7E012AC3751CBA7DC390AA - 97185590F6092025189F40777A815A0D0E3A8C7D7B54F359A5C44D1C8AB24720 - C3A30CAB0F423A1ACEFF00846DF4D19D36E1AD57B4120335BE3D02E4141E8119 - 40F43D2A79A715AEBF9FF97E41CA9EDA13345B7EBDB15E27F109ADF469AFEF2E - 2486DED6D5E632CB83B2345624B1EF85C1E31C9E9D2BD91B5B6D387FC4CAD5AC - F1F7A743E75B7E2E00280772EAA07A9EB5C8787B5AD0FC33F113C51E39F10C29 - A97857E0D68F3F8F2F6D9986CD4AF232134AB52791896E49743D336A99C8635E - 56698C8D18AABD55F4F376B1E9E5B85759BA5DEDFA9E55F1C75FF863FB09C5A5 - 78ABE2E785D3C79F18356D303E81F0E669CC367A0D8C8C1D6E35B619DF248CAA - E2D082A36852A48F353E73F8ABFF0005D2FDA27C7B64D61A678D2DFC07A228DB - 6FA5784F4D834BB7B44EC91BAAB4E001FF004D6BE6DF8A1E3BF167ED15F103C5 - FE3CD7A6BCD6F5ABF965D6F5CBEC164803380CE7B244995451F75542A8C002BC - 4EF3C75ACDF4866D3F4B87EC39CA1BB98C734CBEA17F873DB7738F4AF83A9375 - 26EA54D5BEA7DCD1A51A7054E1B23D63E297ED01E2FF008BF78F71E2CF157893 - C51331CEFD5F539EF981F6F359B15C4CDADED1D781E95912EB71DE6976B711C9 - F3DC2132C2410F6AE1994C6D918246DCE46410473DAB32EB58C1EBC52B1A16BC - 47AE2C42691B695442C41E84019AF15B3F0C2CB62970C1A38DB2598AFCB90718 - 1EBDB8F7AEEBC69ACE34AB9F9BEFA6CEBEBC7F5AE6E1D566B8F09DADAB4D33DB - DACEDE5C4CC4A445B2720741939CE3AF14D225C8A71786F2A1820618CE09F98F - F9FAD7B2FC1AD00695E0A86E86337B712AF078C22C78FD59ABCB6C67690AA80C - CCC76AA8E49F6AFA1F4DD174DD13E1B78420D3EF9F50125B4B35C486DDA1D933 - 49FBC8C0639608C0AEEE036DC8029C9590A326D9F787ED1B746FFF00E080FF00 - B38C91A34D35BF8FF58D3D114649324B78C140F7C0AE07F663F105C7C39FD9FA - 7BB96CC2CDA4F8A374D1C9959C32C1BC031E012A32D904E4EEE31B70C7ED11E2 - D96FFF00E080DF09EC6DA465B8D2BE2CDFAEE46C3266DAE64C823A1F987D0D79 - 37ECF1F1EB5AD53F6789B47D726BAD5F6EB36BA7D9DF4E91C50C710B49CAC265 - 003BC8A2263B79243027A739C25C916FD4551733B79A3EDBFD9DFE2C45F15FC3 - 12DC2C7676CD6EE1638A09A79B29D0317921883F2083E56F5071F39AEF1D0063 - FBC8D79E854923F1AE2FE054F0F8A3E16E936F7D343A85D5BC3B8B799BDCFEF2 - 451206E082769F9800460F7AEA4F872653F26ADAD22FF0AA946551E809524FD4 - 926BE9F2DA927878BDF43C1C6462AAB47A481D3F4A7AA73EBED595FF00097476 - 43FE26167A96960725E683CC8547A99622E883DDD96B534CBDB6D62D45C59DC5 - BDDDB938F360904887FE04A48AFAEE64DE87C9F2B451F191F23C1FAB37A59CDD - B3FC07B57CCFFB42FECFBE15F187827589F59D16CE49A1B0B89E0BC84F917116 - C42E0874C1EA070723AF06BE96F8889FF1426A9DF741E5F0339DC42FF5AF94FF - 00E0A43FB5669FFB2C7C21B496E34B9358BEF13CD36996B6FE67950AA988F9B2 - 48F8246148C2819627B004D795984E0AF2A9B25D7E67760E139351A6DDEFFE47 - 1BF13BE2C5E7FC13FBE057877E17F872EAFADFE226A9A45BEB5E25D7B5094497 - FE1582E638E7B6D2EC1F005A3985A3B89A58F12833471071E5316F9B6D7F6909 - BE200921BC6B7F135BDAAE4FDAA275961463CBC6E401F331E64DAC493F7B915D - E6AFF11A1FF8295FC48F1B7C42D2756B3D1F5CF185E5F5F6ABE183A818A6B1DF - 978AD4B10AB73684AC4AAC420FBBB941422BCFBC57F0E359F87CAADAF787F57D - 3E69976DB4D345E5C49CE5B2483BB701C0561C8CF2073F9DBE596FAB3EFF0096 - CAC69E9F17877C4516E5BABAD0AEA4521D2746B9B71D30A8C32C7B7CCFB00CF4 - 039AF09F1FFECEBADDF6B5A96BD676F69E20B1BCBD90ADD6952A5D2819C2A7CA - 72CD8033B030072326AE78CBE3C3782BC68BA69D33CEB5B708D39F30C72CCAD8 - 24C47955E38CB0619078E2BB4F037EC4DE2ED76CAD7C51F067C47178E747B898 - 091B49BCFECFD7B4C126DDF15C5B96C96031911BB93B73B429A4BDD7A3FBFF00 - CC528CBA1A1FB0FF0080A6B4F1469724B6B716F36A1E21B4B25F3A228D88E45D - E3040E8CE01F75F6AFB53C5FE28D1FC3BFF05AFF008B7AA5EEBBA25BC8DE2BF1 - 1D8496979706DEE1039B8891A3DCBB6505815DA84B0C0C800827CCFE13EA9E24 - B4FDA07E1BF84F5AD325B1B893C4563676F06A76A7CDD33CCB9890344080396F - 9892ADB8E7A5770DE11F06FC5DFF0082A0FC594F1168F75E23D423D675FBAD42 - DA440D6F2CF15DB9FB541B3E70E8FF00BC1CA019E2B6C3549FB78B4B5D3CD7F9 - FE06189B7B1929763EA8F809E37B1D52D5B498E4DD3320BAB7995C3C77881235 - 93611FC71B140EA7040910E3078F49FB325CB796EAB223E32A572A7F0AF04F84 - 9F0AF43D43C1DBB4BD6AF346D734BBC379A55CBDFCCD1432C90A91E644EC6275 - 667954A005B6123200E3D03C39E2EF175CF8625BB86D74ED6B51D3E616D7BA63 - C66D6F2D6752BBD3218C720DAC1D4E230E8CAC3A815F4984C55A8A525D1EDAFE - 1BFE07CF62282955728BB7AE858F8657571E238B53BE8E46B36BA9ADEE05B91E - 6C51EFB2B76D872013824FDD23823A6315DDF82629D4EA3E72C6ADF695C7979D - AC3CA8F9E7A679E3F53D6BCABF67CF895FDA1A0CB1EA5A56A5A5C82686DD5CD9 - 4F242E5618D013208F0B9C00093B4F627A57B3785E3FDFEA0BDC4EA0FF00DFA4 - AEFCA2A46718496FADFF0013933384A0E49F97E85D11739C52F927DAAC08368E - FC75A7345FE457D0DCF10ABE591DA93CAC1FBBF855B68700FD29AF167FCF4A77 - 029F9783C706BE1EFF00828A7ED91E05FD9C3E0A7ED09F0EAF27BBFF0084DFE2 - 9DCF85DECAD6CE0DEA2D2CE479E492790E1635382A1012C5981DBB72C3EEA68B - 9AFC96FF0082CE7EC01E3AF1BFC50F8AFF0018BC370C7AC7857C276BA0DEF88A - 269BCBBBD345DC6D651491C6DFEBA1DF6803143BD5A61F2155671F37C4F6FABC - 5BFE6FD19F41C3AFFDA24BCBF547CBBF0E75CD0BE30EA1716ED72B1496D63792 - C504B288F337D965F281C9C32B485539E85C67039AE5352BB749995B706CF20F - 07E86BC32DFC4179E1FD563BAB39E4B6B8B763B2443C8EC7EA08E3D0835EA9F0 - BBE3D3788F528ED754B1B3B8B82A5419230D1DC01C95F5463CF438FA74AF8D8D - BA9F612BF43535CD574C86C6D56CE6BE92FB0E7501340B1C31C99F9444C18990 - 6CDBB8B05C3640040CD73B75AC7DEC56C7C5CB9D2D05BDD695A7DC69EA5CC730 - 79C491CA480CAC83195C7CCA412412B901738AF3F9F522D9E6B5E546674EFA65 - BDD58ACB7DBDE37F99514E323D7FCFA52695E15B2D6AEE4B5D36E23B3B999711 - C176DBA0B93D76EEC655B8C8CE727D2B16C3C52D244B6F32B371B6361DBEB597 - E28D63FB2E3DCBF7F385E7BD73734E333A3962E27A8FC2ED2B5AF056B53B4DA3 - B5ADE03B6398C45F62E0E5A37E460E71953FD6BD4358D5649AD2CE4B8CEE58D9 - C9273DC7FF005EB8BFD8B3F6A2D5BE1E78DAC6CF5F65D4349BC7547F346707B0 - 6F53D8370C09EBE9EC5FB704A74CD3F4FD616D748B6B7BF92E61B696C0102E6D - B28D0492924E662A5C31000CA74E335A3A9CCCCF91A3D87411FF00096FFC10AA - FB5398EE8742F8CFE4267F8449A6313FAC82B96FD80E3B76F016B5A6CEB1C82D - FC59A7DC1431BB3BC4CA490A4E22C65390C73F771F2EE0777E16DC797FF06F4F - 8D6CDBFD649F196DAE109EE4E9F6A08FC326B9DFF827C5C6A975E15F17DE58BF - 99A5E9FA8690DA9C610B794185DAACCD8FE1565552082079809C2A961A42EEE9 - 18D4B5B5F23EACF1F5A5F7C379EDBC45E1B8868763A5DCB596A30C912B450DB4 - F223873147BF72AC8724AB8386E0004E3D13FE124F1AA7CBFF00088F8667C71E - 62EBD322C9FED05C700F5C76A6E9D7DA2F8BB58D734937961AAC1A944EEF046F - E679D06C8924639180BF38049EE78AF2AFF8573F193C3BFF0012FD2754D3E6D2 - 6C7FD1ECA4942891E04F9632DFBA3C95009E4F35E9518F227283934DBF85F54F - EED4F3EA4B99F2C924D25F12F23EA74B1D6B4CE60BEB3D4917A25DC5E44C7FED - AC436FE1E57E3546FED6C6EAF7ED1AA7876F2CEEBA1BEB3432B9F612DB9F3C0F - 52CAA2B7A2D7AC8BAC724C2DE46E152E54C0CC7D83E377D5722B4563FF003E95 - F7124A5B3BFE27C4F335BFF91C078AB17FE0FBCFEC7F112EA491C90A496D7023 - BA31E654C02CBB2453FF005D198F5E3BD792FED27A3E93F10FE06EB9A7F89BC3 - D63ACE9975107DADB6E2385B700241B82BA380C70F182C3B11D6BDCFE2EE8D69 - AC787EDFED36B6F70DF6A863579230CF18DE18ED6EAB9DBD411EB5F3FF00C76D - 0BFE118F056A86DF52D4A387ED16F1A5B4D37DA166CDC47C03206907CB93F2B8 - 0003C57958F8FBB3BF45FD6E7A3837AC12EAFF00CBB1F941FB5E7C1BD3FE047F - C149FE2E7813C0BAB4DE10D37C13E33D7F4CF0FDCC97B2F99691D9CD702DE113 - E7CCDEDE5244AE49259D4B13C9AFAD3C05F1E61FDA9BF61192F64D53CDF13787 - E08E2D5AC96E70F23C52C59BA685481B5D36B6EDBB433380460D788FFC167B43 - D217FE0A5DF1B24B6B4812F2E3C6BAEDC3BC670B216D4A40AEC31839F98F6CE7 - 249AF16FD9EFC17FDA1E2D9353658DBFB26232E4B00C19888C60673FC67240C0 - E338C8CFC23A6A4933EEF9ADA1E87F1D74BB3BDF85DA8DCDC411C93D922B5BCA - 47CF1333A8F94F5E73C8E86BCEBF661F8A7ABFECEBE39D1FE25697ABA2AE8FAD - 43A7EA3A4A5C18E6D42DA48DA46575E8D132C722E4E76B853D715F627C34FD82 - BE2D7ED19A1DBC9E1DF84FE39F1468F7855E3B987439DEC651D41F38A888AF71 - 96C1C7B57CF973FF0004F8F15689757175E228BC23E07B792795C0D7BC516167 - E4217254797E7349C2E380A4F1D0D115195C4E5CACFD3FF0DE8DA5FED0FF00B7 - 5FECF3E2AD0759B6D63C3371A826B779A925EF9D05A5969AF05EDCB39DCCB16C - B7462C9F2E1B391B98E7C2FF00E0989F1CA0F8F3FF00053AF899E2BFDDD9E95F - 64D675C9AEA67090DBC32DE44A0B3B602F32E727B035F3E683FB49F84BF643FD - 97FC59F0C7E0FCD71E25F89FF159C693E26F17D9DB491431E97942BA5E9A8C04 - CFE749BBCC95954C802AAAEDFBDEEDFF0004F7FF008274C5F0B561D5FC59690C - DE309ACFCEBCB2BBD3EDF52B6D20CCF135B5B98E456C5CAA46F24841055678C7 - 03E66ECCAE8CD57528ABF2BF438B32A90F60E3376E6D0FAF7E06F83EDBE2A69D - AA78B17519E4B5F105E4D2E9B22DB40616B6F930CA1E2DCD1B4A26646241D8C8 - 5481B6B67C5BF0EBC55E074B8D5B41D6BEC91A40CB7D2DBC0F752B4414E2616B - 23E25993939F372CB940BCA95E675DF88DAFF82FC4674B8B5BD275CD69905CC7 - A5DBF872E649E3B7DDB4EE68AE0AC2A5810AF200090C06EDA71B7E1DF8BFF132 - F85CC72F82B47D3DF67FA1DE5DEB43C80C73832C48AF2F1C12A339E9B876F6FE - AB8771E4B352EE95F5F95D2FC0F0FEB35AFCD74E3E6FA7CEC3FF0067EF8BAB3E - 9B32C71D8EA10DC3C6B6EF05DC70CB7402004C713B65DBA0281B703C63D3D9FC - 13E3AD365BFD42DAE276D2EFBCC566B4D410DACD10F2D0721B8FC89EBEB5C87C - 3CD074CD03C056BE1DB811EA76B0DBA4371F68815A2BC7E4C8ED19CA80CCCC76 - F20671D3AF67F0CFC35A443A4DEE8F6F676B269565324B0DB36258AD59D72511 - 49223C7DE0A0003CCC800115D781C3E228B8C7993F55FE5F9BBFA1CB8CC452AA - 9C92B7A33AF681A33F32B03DA831FB7B56245F0DA2D1D7FE24B7FA868BDC471C - 9E75BE7D4C526474E38200F4CF3486F7C4DA2498B8D3ECF5AB7E865B193C8B80 - 075631C876B13D95587D457B1F58947F8916BCD6ABFCFF0003C9F6717F04BEFD - 3FE07E26E343F351E5607E95856BF14F4596FBECB7571368F7854B791A940D6A - 71FEF37C9CF61BB279C0C574617CE89645656471B9181CABAFA83DEB68558CD7 - BACCE5171D245578F3FD2BE12FF829F7EDF1E0FF00D9C7C33F1CFE17DFDBDFEA - 5E24F8AFE1AF0CDBD98B578CC1A69B3BEBBBA77B925B7216468B622A9DC1F71D - A304FDE7B0927D6BF263FE0B17FF0004D3F187C40F8D9F127E29F8366B7D634D - D27C3D6BE2BF10D85C4BE4DCD94018593BDBE7E59954C28ECB9575126155EBC5 - E234FEAA9F9AFD4F7387ADF5977ECFF43F353C27F0CAD7C4FE2FB159AF9AEB47 - 5BB8BFB516D87977B15AB3A89648D4EE0C554923193903E539ACB8113C0DE2FB - AB4942E74DBA916325B3BF6B90AE18750700861C1ACF1ACDC68B789716F3496F - 7109F95D1B04763FE4D74DA3FC406F88314763AB5BC46660441729F2927B023B - 67DB8ED8AF8B8EDE67D93DF4363C49AF5AF8C7C1B25C5ACF1C8F0ED95E10DF3C - 673B5B23AE39383E95C686C0FC0D59D6B408F4C8924F255668A4D8CE18FEF01C - F51D0118C71EA2AA2727F5ADB733D8B1A5AF9BAA43F5CD3B55D56CC5BEAD6D73 - A7C77D71736AA965334ACA6C6613C6E6400101B3124B1E1B23F7B9EAA08AA599 - 1F746CCAC3A106923D264D42292E1BF7877EC6FC856728DDDCD23B1A5E08F184 - 3A1CAFF6A4976EDF97628DC0FA73FCEBD97C41F19ACBE307C06D334B9353B78F - 54D26E92596C6662920E76B1889E1D4862D8524AE4E46315E2F63E07B8D4DA28 - ED639AE2EA7216386242F248DE800E49AFB0BF63BFD92BC2DFB2688FE337ED11 - 0FD8749F0FA7DB7C3DE0B970352F14DF291E547244798EDD5B0CFBC7601C053B - 5E7979751B9773D3BF6C1BE6FD943FE097BF08FE13DD2B5BF8A3C617D3FC40D6 - 6CCFCB25A24D1B5BDA0917A863130CA9E4340C0F22B88FF826B78635FF001EF8 - 6358D264D2AE23F06F89B5ED363D57593284DA2CC4D22DA46ADFEB1A569D7715 - E630A87F8857CFBFB457C7FF00187EDC3FB45EA5E2AD694DC6BDE27BA0B6D688 - FB62B48BA470A963858D1001B98F0AA598E4B13F7CFECE9F0A7C79FB2A78434E - F0FEA10F877C45A4F87C5C4F6FE4EB634FB78A5725A79A559A240EC43940D2B3 - 796870768C29D693D5A5D9EDF71CD5B44969BA3DE3E10FECCAD65E31BCFF0084 - 5FC59AF6832DE299E0DAD15C0573B41F34BAEE9A145880557214191FE66C8C7A - D2FC0EF8AC146DD7BE165C2E38965D0AF84920FEF36D3B727A9C719E95F377C3 - 9FF828D7857E146B9BFC53A1EB1677B1C662FB2E977D61ABB2CA71B46639C1FB - A720BAF19E171C9F648FFE0A37E01BE8D665D0FE29C8B30DE1FF00E114BC7DC0 - F39DC0E0E7D4706A31D53D9D771C34B963E4DAD7AE9EA183A6E7493AEAF2F357 - F4FC0F6C6844919560195860A9E73F5AE3F5BD6D7C29AA4D1C9E17F135B58C6D - 98EFF4545BA81C103E66B6858CDBB39073038E3EF1EDDBF97851C53D22FDE0FA - F1EF5FA5D68F3E9B1F9EC64A3AB573C8354F8D1A0F8F746863F0EF89F46F115D - 5BDFA2C962EC20BE8982BE448980F1E003C18739183EDF0EFF00C15E7E18F8D7 - E256A9E0ABEF0C5C7886C7ED3BB43BAB44FF00906ABCCEBB6492646DD1B48DE5 - C5992301B00020820FD15F0CBC9F8A3E35F88F7BACE9163E225BAF1CDE69F6B6 - F736A9244905AA4CAA58BE55407918EEE58E7E519C01F3AFFC154FE1C7C60F01 - DAF86751F872BA93F84A19925BAB4D2EEA4B8920D4C48ED0AC76B233B796B1AA - 91E52E19B797500201F278AAD3AB425CEAFD34F27A6F7FCCFA7C251852AD1507 - 6EBAF9AF97E47CE7F0EBFE0A3BAAFC1FBF7F86DF1C3E1B7867E28587836E25D1 - 2E1B50B686E756D3BC891A29104CC1D25F2F695054A12147EF0F5AFA7BF6AFFD - 943E17F807E08D97C4AF85BA443A6691E228AC99BECD7B2C96CD0CD89229238E - 4DC577861BB2FF00294501465ABE69F0B7C44FD98BF6A6D51E6F8A5A7F8AFE10 - FC50D4A690EB5AEE9533C9A56A77B231134D2412097C969198B3A048914B37CE - 3191D478B35FF8A7FB27586BBFB3D6A979A4F897C03A79175A75FDCD81174B66 - D309E19E1915F0A1A4600A3F98AA647556E057CB72EBA687D2F4D4EA3FE0B47F - B447C44F0BEA7F06FC31A4F8EBC61A5F8517E1278508D1EDB57B88AC11DF48B7 - 766112B6DCB6E3BB8E71EB5F0CFC31F87579F10F48F166A10EA16F02784ECEDE - FEE2291DBCD9D26BD82D3318008255EE109DC4003D4F07EC8FF82D2D89D4FC6F - F0DA3546F32CBE12F835B77738D12D09FC839AF8CFE095EDDDB78EE6B286668E - 1D5ED5AD6EE30389A359239C29FA490C6DC7F76B7A4B4D4897747D2FFF0004FA - F85DAD5DFC506D4F4196E9B5286C5E7B61A3FD925D662500A3C9145732216E18 - 3108EAC54750B9AFD19F811F111BC23A3B586A5A829D46DE532DE9D42D1F4AB8 - 84CA58869D2E1C7EF642AEBB96E664629B50801547CCFF00F04A1F82BE19F1F4 - BAADC6B5A3DBDF5C5958B18A60EF14D6C4DD32EE49232AF1B6171B948207422B - DF3C6DE1793C1FFB68782FC27A1EB97B34DE23D0EE2711F886793598912DD6EF - CA84F9C5A56899A493EFBB11962B835EDD3A3569E194E9BDDADBCD9E157A94AA - E25D3A8AF657FB91DBDBFC69F0BE9BF19B5ED3F509A18753D42DED2578E69021 - DA88E026E936863F31608A58E2424020E4F7FF00DBBA6C76FBDAF7FB342AEF54 - B86F248503248593195C77008F7AF86FE347C3CD474CFDB0FC3B0DFE93E1CD0E - 3D43565D164BDF0EA3AC49703ECE4CA914AC7685037007A3BC9C9040AFBE3E0B - FC13B1F86FE28B7D3EDF49D275A56D3A59273711ADBB5C490C90289CC20341E7 - 1F35F2C89106DDC91815D997D6AD3BC1AD9EFEACE3C7D1A34ED35BB5B7A235BC - 1FF09FC41E28B813DF5C1D374523EE344D06A379F43C8813DCA79879C08F873E - ADA16936BE16D322B1B3D3FEC5690E76AC0A194927249C65D989249661924924 - 927358E91586923EEEBDE172BDD7E7B545EFC7EF6D501E39215BD319AD5D324D - 5AEED966B1B8D1FC416EDF2878D8DBB7FDF69E6239F60A83DEBDEA7151F5FBFF - 00E18F06A49CBD3EE34E0BB8669762C8BE6373B0F0FF00F7C9E7F4A97663FBDF - 8D71DE35F8F3E15F8729E5F8AB51B3F0F4CC3F7706A17300F3C8EC0872A3FE06 - 57AD78D685FF000547F85FAB5F341147E2C8FE42F1B5A68F73329C1DB8036796 - 7E6CAE7904E3A8C35635F32A1424A356695FFAF91B50CBB115A2E54E2DA5FD7C - FE47D217FA65BEAD6A60BAB786EA163CC73462443F83022B9897E0FD8E9ECF26 - 8977A97876666F308B29CF9123F669226CABE3818E303818E2BC2BE23FFC1452 - FF00C30F6D71A3F817571A6F9C52697C4F3DB692B3AE323CB68E495C375214C2 - 49E7818AB1E1DFDA27E357C5B8A47D03C2FE1BD06DFECAF3A4B75A36AD781DC1 - C79692C82D9198EE5232A01F9BB2935C32CEB0139349F335FCAAFF00735FE68E - E8E4B8D8479A568A7DDDBEFB9EDD12F8B3C3C8AB71158F88ADC02AB2C58B3BB6 - 3D77329FDD9F4C2E0FD6BE16FF008293FF00C14E7C33F03BC49F127C0F1E83A8 - 6A9AD78DBE1ECFE0DBF8A793EC874479AE56E619DC6D7DE7CA3B820C7DF52580 - 209F2FD1B56F8CFF0014BFE0A39A9785DBE206B5E1DD69B50962329924582DE5 - FB190C9F6786711A2840C84C2E0E470E71CF1BFB747FC127FE25788BE23F8935 - DBBD5B43B8D62DBC21AA78D6FAEA5D76EAF975A874C16CB7090B4D009A298453 - 215499E456F2FF00D6A920579B9963275A83508CB953D5BB69FADFE67A996E0A - 146B2739479ADB2BFF00C358FCED8FE1C4FE2596E27D26EADB506B77DD2DACBF - B898A93D4024AB0EDD460F6E4565D9DB5EF83755F2EEACEE6DDA3625034679E7 - 839E9F9546DAE5D683A80B8B499EDE7889DAC9D467A8F7F706BA8F0D7C4F93C6 - C16C356B784994ED4B841B406EDB97A0CFA8C0CF6AF015ADA9F40C5D4BC49A6F - 8A3C3B3059A386F9537189FE562CA7391D8E4038039E6BD4FF00638FD933C35F - B41783BC75E29F18F8F1FC0BE19F87E96325FDC47A4BEA124AB752491A615581 - 186455E15892E3818AF1FF0010F87974DB49B30C7BA07DEB2EDF9B04818CFA77 - 1F8D7D0DFB10EED47F640FDA834F5E77F86F4ABE03FEB85EB3FF005ADE1AEE67 - 3D8D69EC3F634F870AC24D4BE327C429D3FE79A5BE9D6B263D98472A8FCCD513 - FB637C09F04C4E9E10FD9E74D9D55B227F10F8867BC2C7B13115653F81AF94E4 - B48834885BF7DB9B01871C7A1FF3D2BE80FD9AFF00635D23E387EC5FF19BE26D - C6BD796BA9FC337B14B7D26DA042B742E254532C9236485DBE600AAB92533BB1 - C198A954938C16BABFBB50938C1734DF65F7BB1D643FF0543F1A2CCBA7F817C2 - 9F0E3C08F707C985F40F0E8FB4E4F002972CACC738E13AD64F867F65DF8CDFB5 - 5F8E5B54D62C75CB8BCBA6025D6BC4F2496F0C6A0F014480B955CF091A363200 - 5008A77ECDFF0000FC27E35F17F836DEFB528DBFB4EE754D3EFB48B75F2EEA05 - 86C0DCDBDD9903173BE577419181F67032C32A3E9DF10FECD375F01F5DB5BAB1 - F8897FFF0008CDC6A3F6092DB5AD38DD4D6BBF705669D084DB9EBE698D79C672 - 4648D37CBCF2F87CADE44CAA24F963BF99A7F0DFF62FF0EFECD7F0BF58BAD3EF - E1D67C5924416E7569A200B8DCA4C100DC7CA46C637292E58F2595401A1E06F8 - 33258259DC78AB4BD1BC7BA95D1896E8EBD792DE240F80024237F97B02825559 - 1C6319EED5D45A6913476B247AF5BFDAAD5668A2F32C94A433F2197E62C50E40 - 27113B82B820915B6DF1A341D7FC596B169CCCD1E9F3416E418C288595423A8F - F75CB29C67054F7E2AA5528549FEEF651F4D7F5328C6B463EFEEDFE076DA145A - 3F82916D747B33E129264DE90E981B4FC24647DF7B72AAE41652016206781D6B - 2EEFC33A65F5D493491DECB24CE5D9DAEEE09724E493F3F7AD1D5BC41A6AE98B - 7135F5A40AAA76379A30325793CF7207739C7E15CABE95E229D8BC7A1F8DA68D - CEE5923F0FDEB2480F465222C107A835D198E15CAB5E11BE8B6B1860710A34AD - 37D59F6F5EDE43A6D94971733436F6F029796695C2471A8EA598F007B9ACAB6B - 8D43C5B22ADAFDA349D34B0DD75247B6EEE07FD32461FBB53FDF906E3CE1002B - 257CBBF073FE0A9FF0E7E377C71D07C3234DF15DE6A5AC5E8B7D32696DE14D3E - D672098F119937EF240512B82416C8F2D4915F40EAD7DE33F04E99757CBAD68B - AB5BD8C2F3B43AC6912D94C5514B1DD776CED0A9C0EA203CD7D83C642A2BC355 - E5FD7E47C94B093A6ED5347E7FD7E67947C2FF000EC3F0DF48D0ADECDA49D752 - 9757D5A6799CB3492BDC427713D4FCB391C924F724D7CEDFF054CFDB9BC45FB3 - 55F782F4FD1FC33637B1C939D5DB52D4609A4B34913CC816DD4C6E83CCC33B1C - B640319039C8F6CF851F15AE3C7BE1FF00095E47E13D6A6D3E3D2AED449A75E5 - BDEB32F9D0C6CE54B44FB730646D462C1B81C7373E317C66F8790F812FF4ED62 - ED4F1FE9BA46ABA6CF1CF32323AA8304D182CA5CAFCC14A8CE73819AF07DB43E - A295ECDFEAEFD4F6FD9CFEB8E4E3CC974F456E87E6EDAFEC9BF0C3F6FEF186A7 - E2DF04FC5ED2BC2FE3CF175EDC6A5A87837C61079622BCB891A4952DEEA3C19A - 3DEE4A6C85D82EDDDF3022BBFD77F6A8D53C3BF02AE3E00FC4EF01CC7E22F836 - 28F4787C5515CC326FB6B799658436E412188C4A14323B07CC6C541626BE3EFD - B33C2B63E0EFDAFF00E2769BA7E96747D1ED7C57AA0D2AD1206B65B5B43752B5 - AF968402B1F9262298E0A15238C57DBDF0F3E39F807FE0A09F077C35A0C76F71 - 27ED45AD5BE9FE17820FB25D37F6F325D4481C48AA6DC33C6A2466728570EB9D - A1457CCBD357A9F4DBEC47FF000536B05F117C7DF05D9150CB1FC2BF085B3F7E - 1BC39627FF0066AF857E0EE9D259FC6486178DB7C026490019DA4020FEB5F657 - FC153FE2C69117ED6BE25BEF0E32EB5E1DF0DC5A7784F4EB98E4DB1DE43A6585 - BE9D1DC83CFCB235A09063FBE2BE40F84739D57E38A4E4C8A970679D93CC2777 - 05C027F8B07D6BA2927A194DE87E8CFF00C1273C3ED73A6EA9A85C6A16B60B0E - 9F39124F12342BFE9CF82C4ED7181DD64439EE4715D77C56F8C7A2783FFE0A25 - F0EF579B5DD2F54B5B0F0F3DB4B77A64ADA9ADBBF997800640E5831320CA6F63 - 8C73CE2BC1FF0062CF855E01F1B594D378E35BD6B43F2ED9EE21BF8ED5BECCB2 - 79E546E79619615014E0960A323EF135E957BE0EB5D03F6EFF0084F69E11F137 - 843C7D6D3E9137D8E60B15ADA921AE3F713BDA7980BEDC6196307951B08193EC - C6759D18C61156BAD6FADFA688F1654E8FB794A6DDECF4B74EBAEC6E7ED47F14 - 2DBC67F1BBC1F7D670DF18ECBC4CBAA3CED6C6D94A88635DB890E6327CB0403C - 05C9AFA8349F8E1F14B51F1DC0DE1FF0678574F55B0B94177AB6A171730EDF36 - 00C4AC71C5F30654FE3C1DC483C0CFC9FF00B5D78BF678C1A7B9D2ACEC924F1C - DA4BF6AB2BE86EE1DB1DACE8D0A01B65619190C2309F2E090DB54FE857C09BDD - 0FC4DE2DD2FC41A0C2B0D8EB5A4DD4F138B77B332A34B6FCB44C1486F9472573 - 83C1C1193034EBCE4D42A72F7B2F37DFB118E9D1A708CA54F9BB5DE9B2EDDCE5 - ECFC13F1FF00C75A69B8BFF1DE8FA12CC418A2F0F69505BC40739CC971E7CBDC - 60A9EDEF54DFFE09E9278BF576BCF1678EFC5BAE4D2A9497CCD66E5A3953FB8D - 1E44641E0E3681903A62BE8C9340B3965693C948E66396961262909F76521BF5 - A7AE9B736FC437D27A05B88C4CABF88DAE7F1627EB5EAFF64C64EF5A739FFDBC - D7E0AC7951CE2A455A8C630F48FEAEE7837857FE09BBE03F03B79DA3A7D8AF32 - 1BCCFB2A15F73C624DC78E4C84703E5AF8F7E25FEC4DAC78DFFE0A4DADF86F46 - F176BDA0DDDD4075C6D4F4FD935CDBA4704188D54BC21801204CB7CDB703F7A4 - 923F4F96E6F201FBCB459BB036F28CB7B957DA07D371FA9AF21B8D1ADED3F6EB - B0D5A7D1F4FB28E4F045C08F549DE486EDA5FB7461E0DAD88DE321D583F24321 - 0A7048AE5C665B8383A708C2DCD249EF7B7AB3AF0799E2E7CF394EFCB16D7A9D - 87866C34DF04C10DAE97AC7F6549811A45AB58AC7E7B77209586491C9EA448C3 - 9E9C8AE864BED5AD79BAD316E94FFCB4B2B8566FA94976607B2B39F6AD978D67 - B665655923997E60795753FA115927C17616EBFE871CDA6B751F6295A04CFA98 - D4F96C7FDE535EF429A82E58688F0A5539DF34F73F367E0EEA31DF7FC167BC45 - 33A9B78D7C577C999B74647FA24D80437DD3920638EDC64E4F71FF000582FDB5 - B40FD97FE20695A59B78F5BD735CF00F88F41BBB04B83049656DAA8B6862B876 - DAC18036F291181B9B67254106B84F8136335C7FC164FC5D12AC5A848BE2DD5D - 08BB608B3E2C6E73BCAA103201E898CF6AA5FF00059FFD81A1F8D1F1AFC0DAAE - 8090F85FC49E25D2F54B6B9123AC9A5DD1D36D7ED510411A892391D5A442C536 - 9DB19DB90C4FCFE2399E0EAF2FF37EA8FA2C3F2AC652727F67F43F25F4FF0086 - 69E38BF9E1D17548CDFC41A75B5BC4F2CCCA39628EB90C579241038E79C1C54F - 13787354F0B78A64B9934D92DE191C4A04617CA462016505491B43640F503A0A - C57D526B49A3B88249619948923746DAE87A8C11D0D751E17F8BDA86A720B5D5 - 923BAB791B63CBB36BA8F52070DF9035F351B5B53E95F91666F1769FE22F0FB4 - 17529B5D45A22A564520391D0838C7381C7AD7BBFF00C13ADBEDBF0B7F692B06 - E049F0BEFAEFA7786446FF00D9ABC2BC53E1A5D32DEE5552368F06646D837290 - 3B375C633C74AF74FF0082606ED4358F8DDA6FFD053E11F882003D4ED848ADE9 - DCCE7B58F9875FB6F2F5090A9FE23823BF26BE9AFF00826BFC4A834CF85DFB47 - F81EEDE4487C5DF0F25D42D9563670F736132C8A0ED0768F2E598EE38036F5E4 - 57CDB771FDA76B7F79335DA7EC8DE3E4F877F1CA192697C9B7D7348D5BC3D396 - 38522FF4EB9B45DDEC249A33FF0001AAC3C9C6A292F4FBF4FD49AD0E6A6D7CFE - ED4FA3BF67FF0084FA5F8C34EF0CCD27DBECAFEEBC6969A4CB7D617925BDD241 - 71A748C888FF003227EF222721093961C8E2BD97E206BDE22F00FC16F145C1F1 - E787FC55E1B8E092CE74D72C9EDF53B492452B1FD9E68C1496E01C11B9436E52 - 32A412BE6BFB3569B6D359E8B7122B47756DE3FF000BA47711B98A78A3923BF4 - 708C385E550E4FF741F5AF59FDAB3E1343A67C18F126B13EB16775336A365A8C - F67A8C4BF688D8CF6E1BECD2311E629F9C32229230C4E3219AA29C29A9455BFA - B18B7CD51C5FF5D7F5352E7E2AF83756F05EA3A0DE4571A2EBD61A6456FA743A - 822A24327961631BC31842B7C8CAFB89C2920A9C83E0BF133E19FF00C209F19F - 44D2F4E93C45A2E9BAB7F6734D3DE88D27B8334AE1E48F61DB24188DD91A41B8 - E067D4FAB7ECB5ADEBDF1274FF008D10DAB5D0D36F24BD6566B117492DB2B4C8 - AA57036900150C18005B9E14579AFED4FE36D43C4DE2FF000FDE4B058D9FF61A - 436369E4337EFA3B7895D1DC1EAC3ED0CA76F0304738CD79BCB6B58EC5D4FD2E - FD937E01F85F41F0658DFC9A6A6A9E20D1EF2EEC5F50BD76B9749209DA21244A - E4A4259151B11FDD2C46E6EA7DA9E172E7E57EBE95F977ADF81BF6EAD57C2B78 - 7C23A0F89974B8EE64FB5C5A2DAE9D78F0DDB849645545324AAA6396161B4630 - E08279AF3A97E14FED98256F36C7E3B09327781A05F8E7BF021C7E55F4986E22 - A54A0A10A6BCF5B6A7875B239559B9CA7F87FC1380F84DFB4743E24F1E7C19FB - 2E9FA569BAEF837527177AAE9F6C96AD7B119216B68DFCA4C3BC2164FDE90D23 - 79D825B62D7D936DF1BBE3378A3C5DF127C1EDAC78CA55F07E8F7336B12AE9B6 - BFD9B6D11B576DB24F2A99519D46546159CEFDBD067466FF00823FC7FB336A9E - 18D77C1BE13F0AFC415F0A78965D6EED752D6E6B5BAD734F138960B3920B856B - 35648C0899B3893258852401E8DFB2AFED35A3FED39E1DF8EDE24D3743B9D075 - AF15BDB5A34372F086B98C99CC488EB8F30C51C9B4B103236D793530F5694D29 - 371DFCB6BBFF00807A5F58A5562E51B4BF1DD9C4783BF65EB6F2BC2EFE23D6FC - 4BA5C7A6F852C9A3812DAEDAD2D656332C98DA7CA5CBA3163B572770EB93567E - 287C00F01C1616F79A6FF67EB567A1697AC6A375334B14A63963B36580FCAB90 - CAC5DBE6E7E41DD457D19AFC91693AC9B9BCB85B1B18F4CB5B759643B149F36E - 656F98E00C09579FF6BD8D796FC53F8F3F063EC3343AF78B3C13A93EC6DF612D - DDADEBDD3904052A1DB1F79865F006EE4819AE8587C324A7369CB4DEEFD7BFE4 - 72CABE25B718A696BD95FF0023F28AF7E2AF827E3C78634DB3F8A30F88F4EF10 - E8F17D96C3C51A25BC57935D5A86262B7BDB79248FCCF283154951C304DAACAC - 1411DCFECC5FB4A7C39FD90BC4BAD5C7C3E9B5F4F126B9A44FA21F166BB64B1D - ED9437055268F4CB581A4F2659620F19B87769024AEA8232C5AABFFC145BC3BE - 1283C79669F0BFC0EBE1B5D244897CD14A5DAF8CAA8C8EB1B31558B663853C97 - CE0FDEAF2BFD9A7C23AB7817E29E9FE3CD7BCBD174FF0007DCC57BE4EDB6FB65 - E33128A2286575DE412090C0A85C920806B92B24B4D19DD464E4AFAAF23A0F8C - 9F107C31AE2DD5A2DF7D96DCC7E5279EAAA73FC276025B00E0E76D79BFC0145B - EF8C962D1C8A47933F43C8FDD9AF66D67F648F86C15E6F127C6CF87D14FB0B79 - 5A2699A8EB370C40E1772411401BB7FAEDA3D4D67FC33F83DE11F845E206D4AC - 3C69E10F172DEC2F6F6A2D8DD5ADFD83928C5DA09D231CAABC7C348B87638DDB - 4D453A8B99234A917C973EB2FF00827A7C32F8E07E1FFF00C265F0E754F0943A - 74A27B0FB16B3B9BCCF2E61B87C91961BD943062E9F748CFADAF8B3A078DBE28 - FEDE9F09F4FF008A5E05F0CE8F71783CB921D22E43DB6B302CCCCF2C98919811 - 9230CDBB038AF5CFD943C49FB3ADA7C1FF000869573E27D3FC29E26B1115E6A1 - 35F5A5DA19AE4FCD2C7E7BE53C92CCC76A4A801C101718A77C754F0C78D3FE0A - 75F0374DF0378B1B5C812CCBDCDE43A91D5A1B233CD208634965697E622272D1 - 9276AEC385DC09FA0A74FF007295F4BAEA9ADD74DD1F3B2A9FBF93B747D1A7B7 - 7BEA791FED216DE0DF873E05F13F867428FEC771A1F8F2C6F22B6820676B1B73 - 0DD2281230C005D70159F2719AFD34F035D35DFC46D2DDBCC0CFA7DD6E1D5724 - DB9E4FA8C57C3BFF000504F84D7DE14FD98FC51A85D43A3CACBE3B815B518ED7 - ECF7975279F322C45773B4806377DE50A1B80D86C7D99F0666D72F35FD0EF751 - F0DEB1A743169ACEF3C8D6D2C532C8916D286295CF38276B056C0E456D9738C2 - 6EFF00D6ACE7CC3DE847E7F923D91507E14E58C0C7BFE95135F436FA7C979319 - ADACE152EF3CF0BC312281924B3800003927B53FC4D751F847E1F6A9E29BCF9F - 43D1616B8BB9ED48BA68D557790238CB3B36DE42A82C72300E467D878BA2B792 - FBD1E3470D55ED17F712797F5AF2AF859F0AACB40FDAA7E29F8AE2B7924BCD71 - 74EB59AE594058CA59C00DBA1DD93F2AC3231C007CD519254E3E62F19FFC1C5D - FB3BE9F21B4D0478FF00C5734CE2247D3F4716A9F31DBB83DC3A30EA48F933C7 - 4AD2FD873FE0A516DF10FE1AEB1A84D1EA1E23BA8F5D9E3BC9A7B9585E266556 - 4D8BE5FF00ABF2FCB5193CB24841208C79B89CCB0EEA422E5A277FC2CBA75BFE - 07A987CAF12A9CDA8EAD592F9DDFE47DACDA0DA87668E25B776392D0130B31F7 - 2A467F1CD1FD9F7512FEEAED9813F76E230E07B02BB4FE2DBBFC737C15E376F8 - 87E0CD3F56B4B59AC22D533B3CEDB23201BB2700E0F2B8EA383DAA2F8C365E30 - B2F829A3EB9E1FF13681E1DBA1E2BB1D0AF9D7434D59EEA0BDD56CEC51D0CEFB - 2092159E4728639433003700093D188CC68D2A4AB24DA7D8E6C3E5F56AD574AF - 66BBFF00C03F38FF00664B991BFE0B3FE2F668CC922F8C7C400AC7DF1677A38D - C47A77EDEFC57A7FFC165FF68ED27E03DCFC23D4DA1FED0D6AC352D52ED74C97 - 75B3CB692E9B35A3486428708259E2E80EFDAC07DD35F3858FC59F17FECAFF00 - F0551F8CDABF862CEF3C69E24F09EA1E3190DE186DADE4474B1BF85F5168B625 - BFEE41FB4989061846E8AA30A1ACFF00C14BB4EF097ED59FB447863C1B6BA97C - 70F08F8CE6B9D3B48D374BF8AB697D26A16B04F06A32DF48CD2EF0D1FDAADECC - AED9C2E6EAE0C71B05213E76A666FD9CA8C17C4EFE9ADCFA5A796AF6B1AD37F0 - AB7E07E6AF867E0669DF1175C5D1F4EF100D375699765947A8C3FE8F76E3A47E - 6A728E7F8414218F190700E1F8EBE16789FC19AF3B6A161FBC8422C8D149E621 - 28A173D8F20679C54DE34B7B8D2F56B88B7347359DC3C0DB491B5E372A483F55 - EB57F48F8E5E20D6EFFCAD6E6FED48E3C2892E17FD2197DDFABF1DDB24FAD795 - 193FB47AF249FC22683E3DB1BBD07EC3AD34D6D38DD123F965E39148E3247208 - CE3A7402BDD3FE0920AD79FB4A78874DEADABF81B5CB2C7A936E1BFF0064AF1A - F137859224926B74536D76A1DBE507A659483D460FA57B2FFC11BDD9BF6F1F0D - AF3E5CDA66A91CBEC86CA5CE7F215D14CC6A6C7CDF631EF82127FE788AC785FE - CBADDABF649D1BE98615BD69E5C6D1AE7F758D9BBD1738CFBE0735CFEAFF00B8 - B866FEEBE7E9CD268A5A9F58683A3789F507B59341BABCB3D3EC6EEC6E6F8C57 - 86350E6E8C36F318778F38A4B200BB412BE61E80B1AFADFF0069BF8970F8D3E0 - E789BC13ABE9BA8C9E28D16D4D86A37F6BE6DCFD9E485C911CF2CE90C85C3460 - 36D8A44E58EF04E2BE38D37C4DAE693E176486F5AC92FA654BA8ACEE5E38EE62 - 4B859610E323715711B818215943019191F567863F686BEF17783EC3C3DE259B - ED1A97887C2379ACCD37D8C02F3FDAEE6DC4FB555362CF6F1412339043BAB4CC - 73231A9955942328AD992E9464D49EE8E6FF00E09A53EB2AB7D63E1A9219355B - 8D1EEDEF6D43C07ED96E55CC8AEEE0EC382AC3A67691900E4737FB57E937AB61 - F0EBC4579A5AAC5E22D2E48A2BC5B5F216F96210461865882CAA55491B73C1C6 - 4F3C7FEC75AEE9FADFC41D763D4AD2D6F2DF50F0EDE69304324584B26F2418A7 - 0C394D8C1DB78E540CFA0153C5171E268BE15787D357B8D4AEB48D2EE6E6C74E - 4B98CCB6F6CDBB122C4F80DD153208C0E0E6B9797DFB9B736963F487FE098DFB - 7FD9BFC545F879A97C41B596FF00C456F06A3A25E6A9A535BDAEAD782D2086E6 - CE66DDBE29235B7844723BFEF70C02E4857FD10FEDBF1A7FD0034493FDB4D664 - DADEE3F71D0D7E1AFC3BBAF11F8FFF00690F09EA5E26F07F84AFA6BAF0F34D6A - FAF491CD6F0DA94B4315D212A5B72A4242AEEDCA1E400AE79FAB113E20D8A2C3 - 05F7C22B58211B23863D4F5444854701428BDC0007000E062B4860EACB64CCA5 - 88A6B767D75E28F0C5AF8BBC3B79A56A11CAD65A8C0D6F388E5689CA30C1C3A9 - 0CA7DC10457C77E14FF825B6977D6FE28B6F087C44F8BBF0DEC23D59EDA3B7B3 - D5A19AD2E9A35556936ED12BA86CA82D203F21E3B9FA0BC4DE1FF09F803C177F - 736FFF0009578621B181D834173776A9031E9B5E66FB38218F00B6DE8067815C - 9FECDFF1364F1BFC28D1354F117C4AD3F49F126B0AD712E99149650ADBB3FEF3 - CA30485A4DE036E6CEC7058864560D9FAEC6D3A356B45565B26F75E9AEDDCF94 - C2D4AF4E94A545BD5A5B7CF4DFB1F287C57FF821B7C44D58CD269BF143C2FE32 - 661C2789F4DB8B39587A19636B8CFD768AF86BF697FD807E2A7ECBB7571278AB - C1BA8693A6AB958F52B36379A5CB93C6DB94CAA93D924DAF8ED5FBA9F0EBC59A - 87C4AD26F2FB40F1526A76765772D8C86FFC3D25B06963628E11B29B9432B0DC - 1586548CD748C9E3010C90CD1784F5186652922133DB8914F552A448181F7FCB - B571CF27C34D7351BAFC51D14F39C4425CB56CFF0007FD7C8FE6C7C37F10B56F - 0A4E2D24692F2C738304ADF347FEE1EDF4E47B77A7789342B6BF125E59A308E4 - 2588230D193EB5FABDFF00054FFD81BC03A67C09D7FE2159FC33D27C27E25D32 - 5B5C5E681AAF97632F9B731C4DE65AF9688490E465114827249AFCF5D1FE1E5B - 792AE5BCCFBD91B703E515E2E2B0B528CBD9CBF53DDC2E2A9D687B489E576BA3 - 47A7D9C724CA599865549E4FF9F5AAD3788AFB4997CCB5DB6E776D1B073F9D45 - F13F55BCD0BE22DD5ADB95589821F2D9430CE39E7AFEB5D67C0AF05C1F15BC4B - 6763AAC170D6F34E5196CEEA2B491F0858012CC1A34C903E660463B6715C328D - B5676AEC8C2D37C6DAE4A7F737D711EDEA518A85FAD773F0F7E366A3E07BA171 - FDAFA8C9A90561138214C6A54A9DAC3E6E412A493D1B18E6BE8AF877F087E1A5 - 96A1A0EADA0F82F53D2EF7C25E3AD12D357B7F13EAC9AB5B6A1653CCE8D902DA - 188A8911436637575901040460FF00A05F163FE0947F093C5FE0CF1559F85F51 - D4BC2C6EA1903697697BE5D8DCEA7106F29E68E41925248C0548CA280D270C18 - 6DDA8D1A937FBA7E7BDBF130AF5E9D2FE2AFC2E7CAFF000C3FE09B5FB587ED35 - F0EB439A2F08DF2F84B5058B5BD34EB1E2DB586CD84D0B7977490B4EEC19A295 - B9F2F387AFB59345FDA43C17E33B1F07FC49BCF10CDA95E784B529FC0FA7FC24 - BB7863D3EF607B38E0975295628435AC2D2A26FB8F347EF3E62F9E7BCFD91FF6 - E6B3F867FF0004E3F0878866D25B525F087842DA17B2370B672CBF6689E38E18 - 9D8C9BDD8C6918DCA9F330EB9CD779E27FDB33C27F0E3E3059F89BE2169BAA78 - 7FC43A7E917BA3E976BA44777AEC77B6B3CD673CEC7CAB550ACB25B42A18B050 - 0B752462651C472F34AF6239A8F372C6D738DBFF0015DB0F892BE35D7B54D42D - BC693F8DF56F0B6A773752DD59DA1D253C357456C16190ADB84FB4C70CDE5A8F - 304AE1CF2F93C6E81E288FF67DF84BE30F186B9E03F86FA1C7A0FC3BF096A167 - 67A55D0FECB9AC45D5E473DEDE4AB6DBA2BDDCC4C8AB0B0091A2F98E7257B99B - F69DF03EB7F1E25F137857E03FC45BCF1A6B1672C97979AA68B1E9EBABDA9896 - D24112CD70C124646843CC2257686028588205719F1F3E38EAD6625D26E3E07F - C33D121D620B5D0AD175AF115ADABD84789951CC9040B22C6F1A36E567010403 - 192F8A98D3AD7E68C5E9F9EFE88A7529BF764D7F5A1F9897FF00B36F80FC3FFB - 40DF5BDCFC42BEBAD43C59752EA7E1EB2D2FC29A6DD69915A4B26F8A3B7D5351 - 9E36BA3123842628583046DACFC9AEFECBC43F0D3F620F1C37873C3B1EB1AE69 - 7E2290C136A7178922BA0AD081B2630FF674263318725A06C160E02CA386AF31 - FDA9BF66C7F84DE25D7BC3777E2EF01DFF00816F353FED8D074ED22CE3BFBAFB - 4799819360D1005166914492B46655442501C2AFAA693E178BC51F0EFC27E249 - 2CF54F895A9F876D67BD92DEF6E2CB47859A18716FE6234AF717516CB6759117 - CA92411B21941CBAD4BDD95E4691D62944FD00FD95BC4963E28F043D9DB3DE59 - 6B9A1EAB77A36A3736EAB70AD358B157B74C1DE17748241850C55C960075F6BF - 1678AB4AD7FE09C7E1BBABCB78EFEE3C5D61A8ACBA3DBADC283657F0DF8132BC - 91F97248B62F13658847209240207E7C7FC1327C67A77C16F85DAB697E236F19 - 6B7E30F895E21BBD6F53D62DA07B601E7220C22AC9E6AC81D24762A8A497C0DC - AAA6BAEF8EFF00B7D6A57DFDA3A0E89E0D856F2E2D62B886F6EEF62867825BDB - 68A6672157CC611A4CC321577300C0950B9EDA98BA4F0FEC7EEB5FA773CF8E16 - AAC47B5E9AEFFD7F5D8F2CFD9BF57D07E33FFC1567E28DE4B6571AAF873C73A8 - 78BE2B98E229311697B677F1B48AD1391222C736F2D1B1C804A93C676BF6F4F8 - F1E0FF00863F09BC13AA49E34F1EF8CBC65A7FC51F0E5EF8A2FF00C44935C7D8 - AD74FB7BCB36B64BCFB2C10C8A8279DC2A658B4B231248663F35FC18F8D7ABFE - CF7F1D2FBC631EB3A7E83A969379334D79788CD6D18789D2547552A59583B0C1 - 3DF90699FF000508FDAAEE3F69FF00D8F6F34FD3FE207FC24FA1784758B06934 - A44B78E1B3693ED016541E4C72BA02EEB906455322A9604A83872FBEAFDBCB73 - AD5ED6F33E50FDB9BE1F37C1EFDA53E206898CC30EB173756A7040782E2433C4 - 412391B640B91C12A715E1DF69965789FF008A340873DC03C7E5D2BECFF06DEF - 867FE0A25F07BC3FE0BF126B163E1BF8CFE0BB45D37C3DAB5FBEDB5F15582FDC - B39A4EA268FA29E49CEE018B381E27E38FD853E2BFC39D764D3F52F87FE2A322 - B6C1259E9EF79049FEEC908743F9D54A9EA5C65D0C0F067C5BB61A79B3D6232A - AB81149147BC11DC3639FC877AF7EFF827BE98BF03FE1AFC62F8D975F269FE19 - D0AE3C35E1D95C6DFB66AB7BB523D99E498D36961D42CB9EC6B9FF00837FF04D - 2F186AF07FC249F101A1F85FE05D3C892FF58D7C8B790275DB140C43B487A004 - 2827A64FCA6AFED87FB4DE8BF12B46D03E1DFC3AD3EE344F84FE052E74C8261B - 6E759BA6C89350B91C7EF1B736D046543B13B4B145AA7A132D4F054411DB22FF - 00754AFE9593E2118F339E39ADC9ED9A081376DF9D770C306E08EF8E9D3A1E45 - 62EBD0F9DBBE99A25B1513E8ED2BC63FD99E0AB51F66B3B8FED4B278CC9736C9 - 2ADB8DB6EE5E32DCACBC10197E600903EF57AD7817E20AF863C4BE33BEF155E4 - 6DE28D7A236D7536B16F23DD7D9C1B7F2208D540863468C105780AB144A981F2 - 9F03F0E06D4BE1868ED1C68CD6F6D196F9B9FF0052BCFD32BF5E6BA7F87FE3DF - 105BEB9AB69FE1F592F26BCB5B8B0BAB44B72CD716F260BAB05C171F2860093C - AF4ED594F71C7627FD99A04B3F89D0C0D7B0E8F1C2C1A296E9E18A3891771C1F - 3BF767238C36771C639C576FFB473EA5E1AD074CB15B8D4751D17CC62B23432C - 76B05C3990EE12E3CA264019C22724649279AF30F8256706ABF16743B0D5352B - 8B4D324D42149E45BC5B76B642E06FF3581085786CF6C57D49FB49793AF7EC97 - 756E9A84DAA4B6DE30751704C4D1CF12473246D94033210492DB4039F7CD44AE - 9AB0CF11F1CE90DE048BC39A83EED58DE698B78D696D76EAD0A324ADB5F2A769 - DB1EF21430DB8C915DD693FB4569F36956AF36816AD33C4ACE4DD124B1033FC1 - 5DE7C3EF0F785F52BDF8177DAF6A9A6D9C933496FAA3493C2C6158A29D6112AE - 18A2BB02A378C30FBA33927E93B5B3F024B6D1B342DB99413E4445A2CE3F8488 - B057D08EA2B1A951DF634A713E82FDB23E1BF87F59FD9ABC51A4DFC3E266B5D6 - E04D3847A5CF34CF1C9348B1C72794C5A3DB1B3090E57A21C738AEDFC23F0863 - F0878274DF0FD9EBBA96A5A5E976B1DADAA6A76D6772BE546A163DDB6042C768 - 03713938C924924F53723CD963FEEC32A1FAB123F903F991E95711016E47E95F - A04A9AE772F2B1F03ED64A0A070B1FC1982DAC66B786CB40B786793CE9174D86 - 7D27CC72412C7ECF28F9C900EEEBD33576C741D561DC60B8D76C63591908FED4 - 5BDF33048C817114C4038E9B81AEC235E5477A759C6AB180AA7E7666000EA589 - 3FD68E44B6279DBD0F967FE0A8EBAB4DFB1178AAD6E2E1E6825BAD3D5BCFB48D - 243FE99163E68E418E7FE9973EDD6BF32C7863EC3A4190AB7CAB20C7F77E5E7F - 515FAADFF053CDBA9FEC89A9E5D9ADE6D574E58801F7BFD21497F7CE300F65C9 - FE222BF3C75BF0C5C6B3A1496F636FE64DE55CCDB4B05F9521323B7246005563 - CFA57878EBCEA29BDADA1EF602D0A4E0B7BEBEA7C1BF1FAD9EDFE25DFC8BF7A1 - 0AFF008735EB9FB1969125E6B9A79DFAA5BC77174567934F8619AE4DBBC38991 - 166FDDE5E2675F9BB12464802B87F8D7E0AD5BC4DE35D5350B3B192E2DE588C6 - A5194B6E03046DCE7A8F4AF5EFD8E34AB7B0BEB54D7350B6F0EC30932C975A81 - 9228A275B76DA1CA4333ED660172B1B1E7819E478B286E8F7148F50FDA5BC316 - BA4FC2B8EDFC0EB1C3E176D4E3D4AFEEE5D7BFB4F55BF9608A458D2711C30456 - C882566089E639704BC8764613E91F8ABE0D3E28F12378B3C2F69691E8FA8585 - D4369A2F8C14EBB60BE4A194DDACB26F95988803471C8772EE2AC5A32517CA2E - 7E36C9F18FC31E22F877A7EA9F10AF75AF0F698FA5E8BAC69B65791681E29B79 - 711CED25A38091B4B148C4CB2AC5958436D8F6A463DC3F663F86FAE7C43FD947 - E1DDE4DE2FB186CF505103D958E9CF0DD5B4663B9B7129956E544D2125530F1E - 06EEE179E395B975669ADFFCCF03F843FF00050F9BC2FF0009BC2BE133378574 - 4D274DD645EB5EDFD9C5325F189609638583B2ED8967904982082634078C83F5 - B7C49BEF8F5E1CF006ABE30F166A43C2FE14D16D05C5C5CDAE976DA608977752 - 5B9F98B22AE382580EA6BE5BF0C7FC13A63F889F1B7E257C3FF107897C2BA545 - E0FD434BD516F350BF4F31A0BB89CCC6168A366793CB440C8005570BB81DB5FA - 76DF113C3FA57C38B7F01CDA8F877C49A3C3631E9434A934B94CED6C91AC681C - CF341BF0A8BCAA16CE0E735D11C5495A2DBB69DFF468E7A9878BF79257F45FA9 - F949ACFED859FB55C269FF0015B58B3BB25659A6BE105A1DCC1C9578E468C862 - 99E3A9504F415F612FFC13A74FF187C39B7F881A7DC43AF7F6BE836FABD8E98D - 66EB3DF192133450B19640A9231755666185C939E39ECB4BD17E1FFC2BF146BD - E2FF0010787CDA5E5F451C1787518E2D1C5DBA6F2B752B9B378DA46DC434C650 - A0B64004927B6F167EDB5E15B58E592E6E34BF0959B010A346B71ACDAF2A3684 - 367322AEE5E4663620F50320D72D4A8AF7F3EDB9D5084ADA76EE7E6EEA9F0F7E - 335BCB63A2E9BE0AF09D9B4978CBA9E9B69A72FEE2D4C8A5C348CE33F2B9766C - 08A38CA317259847DC49F10BC55FB34DA40B1DD781FC496ECE74AFB2697E22D3 - F55F14C72CED78C9776ED03DDFD9D6289204633C24096E079615CABAFB57C43F - DA53C0FF0013EE3C41A6DE78EB45D36D64944204DE08179672DA410BDDB5BCE6 - F239BC962D6E92AEF88A130606F902D707F137F6BBF87FF06FE217FC2117D6FA - DBEA715C84B1BC8753FF00843B4081CC61E06636CD708B957E240910CB9FBABF - 30D232DD2D7B6DA13CBB391E9DF097C15F1035FF001BF82F55BFD3BC752D9DBE - A96923EADE25D3E5875092C6E6C259FC9D49F647992D6E2DCC44C84362E90316 - 5118AFA7BF673D5345F08E9FAADAB789344BE9219AD2DE386DAFA1BFB88922D3 - EDA160F0C26471B9A36254820F247079F89743F88BA9FF00656A1A7EA1A4F81F - C3B757FAE69B6CBAB59DEDD7882F07DAACAF4A4B6B7F792CBF37EE9536429971 - 7129014A864F54D07E25F89FE04FC3CBAD574FF1343A0C76DA6BDB2437B77656 - D6A26505949DD0C804859DCAF98E8C1A4C061804E752EDEA5C6D63E6EF077ECC - F2FED35FB6278C3C23A45AAB5A6A3E27BD92782451144D631CECF2218DD7A88D - 72A8547CC141031C6D7EDB5FF04C7D07E00FFC13B35CD11A6F06DBFC6CB18A0F - 105FE9566F135D6A3A7DBCCEB2C9688D1A4E8BE59323A2008CD0B8009518E416 - 2F1458B789755864F105BEA9AB3CD3ADCDADC496B7370F2E1891328CAEF63F33 - 007827E56191599FB44FC38F1D7ED1DE36D37C5BA1D8F847C3AB6F636561A55A - EBFAC4D72BA5E9F6D6CF0881895CC924B248F2C8CCAADE63B67926B49F3AAA9C - 7AA220A2E9B52EE7E6F5E5A27D8B77972BAED25BF72C700727231D873ED5DEF8 - 3BF6E1F8A9F0EB43FB0E8BF113C5D6F63020D907DB1A68E15E802F99BB68F618 - 15EF1FB447ECE7E34F005E58EBFE22B9F871AE6A175A447696F1697A85CC3379 - 085A34706E11BCD2376D2C1F3803278AF8EBC71E19BEF0C6AD25ADD43F659594 - 318FCC56CA9CE3A1231D7BD7546A49A21C5266D7C44FDA27C45F16AFD2E7C51A - EEBDE24BA8B2626D46F5E61167FB81890BFF000102A5F0AE953788FC3179AD49 - 6F247A6D94E2DF3190EEEFB771E3B000AF3DF70C7438F3C5B5FB5DC470C7B649 - A46088A187CC49C01E95EF1F04FC252D97C2FD4345D466861BCB8BF3730D9C37 - 51CB3483CA55C9446240C8C73CF5A4E4F61D91E6F73E28D15AC658E383578EF3 - 04C6CC23F2F3E8CB8DDF883F9D63CFA87DA59B103B2ED009C7B0F6C57B047FB3 - 3F8B2EA48E6D3B4BBC8CC4C1926F3043E5B0E41058820F715D5F833E0878825F - 1E7DB3C55AFDD2DD5F5BCB0DCDFDBDF7DBB54B7FDD0447C3BA172B8500798385 - C640A7EF2576174637816D193E0CDAE15F74D6A30BDF203A1E7D7915E9BFB327 - 8217429B4EF11586A925F4724F358DDA0824B5BAD3DDACE6640EB8276B61C874 - 62AC14F23070787FC3F6BA5E8935DF8C2C752D6B4FB142F756DE62D94FAC46A1 - 9A40B260AA33EDC67E6C13CE7AD7A17ECCBF027C1BFF0009E6B9A65BE8B1C725 - D69911CFF6F5CEB11582B48CD37D9F305BAC73A88B0D2B34EA239B09B99C38AA - 89DF4338C95B53C23E10F875BC41F1934CB3589526B9B989510289464B2ED5DA - C181CF1F2907A8073DFE97F8E1E19B8F0E7ECBDE2AD1AF9BF7BA3EA314C3CD8C - 79922398B6392077CB80BC6DC6DC118C78E7C40F0A59785BF6CE4F0EF87A48E5 - 86096C5567E6E5A277487703F30DD8661C139C6066BE8FFDAC3E1B78BADFE197 - 8E34FD4E3F0D5EC3A7E95A65CCB3E9FE7D8BDB037B300441286121380ADF3A85 - 5C101B9A950E68F3F6B04A694947B9E14FE19B8D27E1FF0082BC59A2E9F7D79A - C6A177E458C36914E646BA8CEE8063CB2B26589CAC4FBB181B41193C2EA5FB71 - 4E750B8FB769F711DEF98DF685F36F06D933F30C7DA4639CD7D45FB28E87378A - BE16FC3D81B4FD6E0B7F0AF8C975692F7ECB27D916DE24F34279DFEAC3193CA0 - 54FCC43E471CD7C07F1C2286D7E3578C238D19638F5BBD551C0C013B81DAB595 - 18593D2FFD7EA4C6ACAED33FA563E20D345BC68BA858B36F4EB709B9BE71938C - F73CD6A5A4E977FEA64498772AC187E95E0D04DABEB024B8BFF1ED8E817D771A - E45DF86BC892152DBC2317650CCBC8C851CE4F238AE9749BAF0BC3A15D69D2F8 - DA059A38E276D663D580B867B89A440A91EFFB3E4B28500C0C49906724835F46 - B1D564F4A6FE6EC7CCCB054E3BCF5F467A478B7C67A4FC3FB09AEB5ABC8F4FB7 - B7B692EDDE50DC471825C800124F070A32CC4600278AF1ABEFF8293FC1D5F076 - 8FAC5AF8B7ED9A5EB969737904E9673DBB3416E1CC876CEB1B00DE54C01C7CC2 - 09B1F74B0DDD27F675F0D69BAE5B6A967A6EB5A85F5A09560BDBB5B680979230 - 8FC8856525C29DCC1318690F3920B47EC6DE119F5AD5AFBC41A4E87AB26B51A5 - AC3A747A622C16A05BBC1B50B1242F92F2A7EEC46162665DACA140E3C557C5CD - 38C52B75FF002EDA9D586A38483529B6DF4D2DF3F97E879BFEDD5F1534EF8CFF - 00B1E47A96866C753D0EFB5DB0F22FECB54B6BDB7B80B2C81B6BC0EE8D878CA9 - 01B2086CE31839BFB25FECE7A0EB7FB2F6BFAC6B1A4DB5D5E6BD36A16905CCA9 - B9E0B516E21210E78CB19B247D3A55CFDBDBE1BC7F08BF651D1F44D1DA1B5F0F - 58EB16504165145E5AC2155F6851D028DA400A0718CE4E49F60F877E101E05FD - 967C2561E5F9771FD8ED3CA3D1E64F39FF00F1E7C7E15C38E9D4E48BA97E6EBF - E5A6E7760E34F99FB2B72F4FF83E67E196BF7D69E14F156AFA2EA17D630EA5A6 - 5F4D6F7104970A8E8CAE41E09CF38AEBFE1AEB17DA15A5D6ADA05E3DBEA562AF - 34535BBAEF50217DDB5BA64AE467DEBCAFFE0A55E188F47FDB43E264516369BA - 4B9618FE29208E46FF00C79CD7A2FEC3DF0DF4DF14695A2E8BA8798D6FAAEB90 - 46638D824972ECB1EC8518FDD691F081806605B211C80A7939934EFB58EF71B3 - 4D1EFDF0034BD4BE247C4BF0D78D2E3E227883537D36E7C3F77E25F0EEA77173 - E5D85AC97004F348E646824846C766C7CAAA58B05DC0554FD99FC69E34BBF873 - A2E87E0DD305F6A1E1FD5AED750BCBCB7B1BCB30BB4B431DB0998162B8958EC6 - 00F98BD8823CAAFF00E3BC7E36175E1BF87D7DA6E83A14D0DB88E4834CB98F53 - F2158C1E5493B090EF56320133166505C46C8ACCA7DAFF0066B8A4F85BE3BF12 - 5BE977DA7E9F63E13F10C3A9033DC08D238E4B49E38A188481434C0C9B0EE1F3 - 6D63CE0570EF16AC6F2D1EACF40F825F0BF54F1FFEDDD63FF0995ADE785FFB6B - C212DF5841A7CF6F1BDE436D3881164642E50B42EFB82346C47A29E6C7C54FD9 - EFE28FC60F8EBF15BC25A3FC52F105CD9F86EE34BB8D2ADB53D5EF63922FB642 - D7660B710BAC4AA8CA533229013196E589DEF881F1964F0AFEDB1F056EA6D235 - 45BDB0B6D4745B9B4816D2FE468AE2D992DD116C679DE461247B8A955241C0CE - 491E81F013E387857C35FB53FC62B8D7BC40BA45CEBABA20B6FEDA80E97712F9 - 164CB28F2650AF128908015F92369CB7DE3ECD3C251E5507BDF7D9DADD8F1EA6 - 2AB2939ADADB6FADD1F2BEA9F04BC57E10FDA33E1F7C31D5216BF97C51AE9D1E - 5B8B59E08D2D65478A594A4891A4B232C6CB316729F3700B95047D8BFB53FF00 - C12DE6F81BA0FDB06AD6B7927FC25BA8697A7DE5F5EB08F59B1F2ADA6B3712B8 - 9024CA5EF12566609E65BAA054196AE5749D5FC37F12FF006FBF875AC43A8432 - 697378C1AE2D354B7B2B8BA9229A6821B688C6A8426D79090CCEAC0EC003264B - 57D8FF00B60FECD31F86FE0F6B5A7EADE3CF1C34163AEDDF886D9EF67B2B3B4B - 39B51BD325D46B10B6173E5667B82B1A4E71B8F2531BBC6853849C979B5F73D0 - F61B924BA689FDEB53F1C7E36FC24B7F879F062E97C5DE2AD43C2F6BE3DD6ACA - F17C44D126AB63E1CBAB54D4A08ACEE45A949639EEA090C81BCA21163DACCC4B - F97CC7C42F817A2FC1EF85D6775E32F8A5A845AC58EA70E97A3369FA4B5E5BDF - 4915BC170927DAA69E2F214473C663223917E51C8C135F417FC14F34FD3F46F8 - 71F0CF5ED2EEAC7414B6B18AC353F105F4116B5E1E8818D847637FA701297776 - 0ECB3FD99CC6514647253E5EFDAFBC391D97EC69630CF6579A4FD9FC4D2CF6B0 - 5CDDFDA207CE9F6DFF001E4E4E5ACB68060EE2168B3EA7B274D464A2B6B2FC91 - 85393945B7DDFE67BB7C15F0578AAD758F0668763AF785350D0FC077A2F92E23 - D5EDEE66768768B49DDA08D23F2A28E5B948621BF699642EC4305AF61F879F18 - 3C4DF06F4ED763F10787AC2EA2D362FED1B486F750FECC478A3749A76C48CC1C - 11122AE028CE4019233F3F7C17F157D8BC6DE04D3759D427F10E9BA9E948F636 - B3465974A6DC4BC4DF383E5882D86DDA7E53B7E423E61EE07C6979E11FD9EBE2 - F6B9E245908D05EEA422DAF6DECD6FEE1EE1EDFCA86411C9E5A8598795D5385D - A9950C3292946AEDA0F4953DCF8E3E2AFED65F1735CD35B5ED07C49A2C769329 - BA1636BA3DA09A0899C8DCA2584B950782413820E0B0E6BC6356FDBA3E2F3339 - FF0084E35CB7DDD45B48B6DFFA2C2D7710FC6ED3AEB43D51B56B85BABABAB630 - DB43A8C03559A25F3176C725C490EE70AA58F500900F04F1B1FB4869DF01BE33 - 780BC2775E08D4B56F0D7C486B2B4B6D720BBD345B681712ADAAABB2B20CC4E6 - 65DBBC828C1B7391CBD1ECA4EED16AA2564D1E43E12FDABFC65ADDE6A6BAEEB1 - 26BD69F6379A78F57D40C92305C01E43484B79A376422F040248E323B58353D2 - 7C79E168F50B786CB528E152424B107F29C73B594F43FCC7B5780F893C197DE1 - 2F105C69BA959DC595EDBB18E48A54C143D7F11DC11C104115BBE0696FBC357A - B716323445C6D910FDC997D1877FE63DAA7A6869A6E75DA9FED15E24D160682C - F4FF000DD946A3681169AA0E07D49AE7EDBE30F89AE2EDA78EE63B395B86305B - C684FAF2067BD4DE21D3C6ACAD34719567E5E3C7DDCFA7B7BD57D37C35242BBA - E15608C6097738502B3BBEA5DA3BA417DE32F116B4BB6EB55BFB856FE1927665 - FC89AA724CD691AC97175E5F395E7073EDEB57754D66DED2D9A2B1856593A19E - 55F97FE02BFE39AE3A6692F6EDA4964692461C92739E6A772B5B1E93E16FDA07 - 53F09E9CB6D6BAA6AB3479E52E27F3A2FA04604015B3A77ED5B7966EBE769F14 - C579530B98190FA8C0207E55E77E04F86FAF7C48D5BEC1E1FD1757D72F76190C - 1A75949752851D5B646A4E07AE2B63C6BF0A358F864D1C3AAD8FD8EEA662803C - 88F2C6C02E54C609D87E75FBDCF3D2AA3269E8C9924F73D5BE1FFC5AF0FF0089 - 35CFED6B8D3F51B1D45583B5CCB6F1CF0CE4306C39C867E473C1E2BD53C73FB4 - 8EB5F123C21A968CB7D610DBEAF0DBDB5CBC21EDD658E079258E2DAED8442F26 - 4840061471F7B773773FB21782E2D52DECF4BD73C53AC5C5C68971AAAB5D4B1A - 431C296125C292D1A875225409B0060413CE700FB07ECADFB1CFC2DF125CDCD9 - F883C1975AF6A5A7696D35D06D6EEDD279C4AA36C680478254E03162A0E72010 - 71A46B54B72F46652A70DDF424FD9A7F683B1F861F0BAF7C23AB5B4EF6F34CD7 - 96F77664336F68E38CA39F30298F0808C65837B74F867E3AD85C37C6FF00191F - B3DC2E75CBDE190EE1FE90FD7DEBF483E13FC2BF82BE0CF0E78B7557F87B269F - 6BA0191A5D527D2E2B986C632F1A8625669652BBA2936B6CCFEF08C5705E29F0 - CF80755F136A57574D3C97373752CB2B996CBE7767258FFAFEE49AA956D9CBB1 - 11A69EC8FD53FD97BC7DA97C4BFD9EFC1BE21D52456D4B56D1EDEE6E5A30555E - 42BF33633C67AFD4D75F2F8774FD68FF00A669F6379890B8F3EDD24C10D907E6 - 079079CD1457D9D1D69C6FD91F175F4AB2B7765497E1F689AB3DD5BCDA65AAC3 - 1C8A1561530E094472D9420E7271907A281EB99B4EF045AFDA2E2382EB54B48E - DE408AB15EC841DD1A312771273CFE1818C73928AE4B5A31F57FA9D5CCFDFF00 - F0AFD0F05FF8290688F1FC1AD1ACE4BFBEB8B5B8F1258C6D1CAC8DD44A33BB6E - EE87B9AF68F891214F0B246BF2C71DBC88AA070004C0FD28A2BCDCDB75F33D2C - A7E197A9F807FF000552B7583F6D7F8A3B06DF9ED7BFAD95B13FA9AF4CFD81EF - 1B4BF1AFC3BDAA926DF1CE9080C83715FDFC073F51814515C54FE1F97E87A953 - 75EA790FC30B249758D77EF27D8746B578B61DB82D752B367D725D8FE5E95F48 - 786EE85B78CAC7C4135B69B797D71A0D8DCCC92D840B6F2B34B736EC0C488A80 - 18C63800E4EECEEC105158D959FF005D4A937747D71FF0506F835A07837F64DF - 837AFE9316A5617F278B7478E409AB5DB467CD8A62E515A53E536777316CFBC7 - DB1E3FF01FE0F687E284D4AE3548EFB516BAD3ECEFA412DFCEB9925D3D2E8825 - 1D4B2893202B12304E7279A28AEBC47C76E965F9238F08DBA4DF9BFCCCFF0085 - BE02D27C0BE39F19FF0063D8C3A70D2FC33AC49008C6E2A91C0BBA3DCD965595 - 0BC6ECA43ED91F6B23618755FF00048AD7ACBE27783B52F104DE1CF0D697793F - 8BF488825858EC4897ECAEA554B977C36DDC41620B33375268A2B8701FC59AF3 - 7F923BF19FEEF07E4BFF004A6715FF000559B0B5F0B7C3BF04C86CED350B3F12 - 5FDAE997B67730A88DA2FB3120AC91EC995964449011270CA78DACEADF217C7C - F164DAE7C10B0F0A8861B4D0FC1325C2E9B6F1348DFBC79912499DA466667641 - 1A750AA90C4AAAA1714515D4FE146503D334BD426F87D17C2EBED3E6B8F3BC47 - A2C33DCACB3C92468C751685B626EC0052250548233938CF35CB7C48F1DDCEAD - FB3B9B336B636F1DF6AD25D398632A5424F38112F3811EE3BB6E3860318000A2 - 8ACEA7C6553F84F12B3B15D47548A172CAB21C12B8CF4CD5111F972EDC9C1E28 - A282A47E93F80FF667F06FED8DFB2F7C4EF1278BB498E3F107803E1968BAC68F - A869C7ECF3453C3FDBD9DFD55D6516F0AB86072235C152011F9F1A3E8B0C76E3 - 1BBE5E073451584762A5F11721D1A16D46163BB3F7873D0D71DF192F24D13518 - DA17639936ED73B940C761DA8A2B396E694CE6B4FF00114D7C63478E10188CED - 07FC6B5347D1E0BAF1024722B347904AE719F6E39E7DB9A28A8347B1EC565A87 - 88BE0EF8125BBF08F8DBC71E154D540FB55B691AD4D6704FB49DBB96320B6373 - 6324E326B85BEF106ADAE5BADE6A9AC6A5AB4D6F2A4CAD7D209D999700167237 - 9E00182718028A2B334E87DF9FB347872D757F8A3AD79D18FF0044F00AA44100 - 4D9BD630C780393B9B9FF68D7AE7C1676F107C766D4266F2EE353B6B99AE3CB0 - 3123A35BCF939C9CB348C092738C6304668A2B78F4F4397B9E79E209E5BBF85D - F136CCCD2C70C7E13D58111B6DDE12E92450474C033C9C631D3B806BE42F8EDF - 10FC4769F1BFC65143E22D7A1863D72F51238EFA4548D45C38000CF000E31451 - 56BE1899FDA67FFFD9} - Visible = False - end object GroupBox1: TGroupBox Left = 8 Top = 48 diff --git a/UnitPilote.pas b/UnitPilote.pas index c1be47f..89630f2 100644 --- a/UnitPilote.pas +++ b/UnitPilote.pas @@ -39,7 +39,6 @@ type CheckChiffre: TCheckBox; CheckChevron: TCheckBox; CheckClignote: TCheckBox; - ImageSignaux: TImage; procedure RadioVertClick(Sender: TObject); procedure RadioVertCliClick(Sender: TObject); procedure RadioJauneClick(Sender: TObject); diff --git a/UnitPrinc.dfm b/UnitPrinc.dfm index faa030d..d4f5c1f 100644 --- a/UnitPrinc.dfm +++ b/UnitPrinc.dfm @@ -1,11 +1,11 @@ object FormPrinc: TFormPrinc - Left = 257 - Top = 205 + Left = 148 + Top = 246 Anchors = [akLeft, akTop, akRight] BorderStyle = bsNone Caption = 'Signaux complexes' - ClientHeight = 431 - ClientWidth = 866 + ClientHeight = 520 + ClientWidth = 976 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -23,8 +23,8 @@ object FormPrinc: TFormPrinc OnKeyDown = FormKeyDown OnResize = FormResize DesignSize = ( - 866 - 431) + 976 + 520) PixelsPerInch = 96 TextHeight = 13 object LabelTitre: TLabel @@ -1432,7 +1432,7 @@ object FormPrinc: TFormPrinc Visible = False end object LabelClock: TLabel - Left = 774 + Left = 884 Top = 0 Width = 85 Height = 22 @@ -5443,8 +5443,8 @@ object FormPrinc: TFormPrinc end object StatusBar1: TStatusBar Left = 0 - Top = 409 - Width = 866 + Top = 498 + Width = 976 Height = 22 Panels = < item @@ -6450,7 +6450,7 @@ object FormPrinc: TFormPrinc Caption = '-' end object Mesurerlavitessedestrains: TMenuItem - Caption = 'Mesurer la vitesse des trains' + Caption = 'Mesurer la vitesse des trains ('#233'talonnage)' OnClick = MesurerlavitessedestrainsClick end object Affichelamesuredesvitesses1: TMenuItem diff --git a/UnitPrinc.pas b/UnitPrinc.pas index e8d1753..d3dd6f7 100644 --- a/UnitPrinc.pas +++ b/UnitPrinc.pas @@ -8,6 +8,9 @@ unit Unitprinc; on utilise activeX Tmscomm pour les liaisons série/USB Delphi 12 : + Dans Outils / Options / Interface utilisateurs / Concerpteur de fiches / Haute résolution + Sélextionner Automatique (PPI de l'écran) et cocher "taille de la grille..." + on utilise AsyncPro pour les liaisons série/USB - ce composant est compilable en 32 et en 64 bits. https://github.com/TurboPack/AsyncPro liste des fichiers nécessaires: @@ -21,6 +24,8 @@ unit Unitprinc; AwDefine.inc AwUser.pas AwWin32.pas + LnsWin32.pas + LnsQueue.pas OoMisc.pas un essai avec IdTCPClient (Indy) a été fait avec D7/D12. En D7 nécéssite le fichier Idtcpclient.dcu. @@ -438,7 +443,6 @@ type procedure Sauvegarderlaconfiguration1Click(Sender: TObject); procedure MesurerlavitessedestrainsClick(Sender: TObject); procedure Affichelamesuredesvitesses1Click(Sender: TObject); - procedure Button0Click(Sender: TObject); procedure Etatdesactionneurs1Click(Sender: TObject); procedure Compilerlabasededonnes1Click(Sender: TObject); procedure PopupMenuTrainsPopup(Sender: TObject); @@ -1037,7 +1041,7 @@ tTrain = record x0,y0,x1,y1 : integer; // ancien contour du tampon, pour l'animation dans la fenêtre cdm // routes ----------------------------------- roulage : integer; // =1 train en roulage mais arrêté pour réservation par tiers =2 en roulage effectif - dernierDet : integer; // dernier détecteur traité + dernierDet : integer; // dernier détecteur traité (le n-1) cantonOrg,CantonDest : integer; // cantons origine et destination si route route : TuneRoute; // tableau de la route en cours du train NomRoute : array[1..30] of string; // nom de la route sauvegardée @@ -1493,6 +1497,7 @@ function ClavierHookLLProc(Code : integer; WordParam : wparam; LongParam: lparam procedure cree_GB_compteur(rang : integer); procedure pilote_train(det1,det2,AdrTrain,it : integer); procedure equation_droite(y1,y2,x1,x2 : single;var pente,b : single); +procedure change_clic_train(i : integer); implementation @@ -1550,7 +1555,7 @@ uses UnitDebug, UnitPilote, UnitSimule, UnitTCO, UnitConfig, Fclient.IOHandler.ReadBytes(Fdata,0,false); if (FData <> nil) and Assigned(FOnData) then {$ELSE} - FData := FClient.CurrentReadBuffer; + FData:=FClient.CurrentReadBuffer; if (FData <> '') and Assigned(FOnData) then {$IFEND} Synchronize(DataReceived); @@ -2078,7 +2083,7 @@ begin //---- calc _systemId de la mac-address[2-5] XOR mac-address[1]... if (RetCode=chr(0)) or (RetCode=chr(6)) then begin - _SystemId := IntToHex(Ord(Adapter.adapter_address[0]), 2) + '-' + + _SystemId:=IntToHex(Ord(Adapter.adapter_address[0]), 2) + '-' + IntToHex(Ord(Adapter.adapter_address[1]),2) + '-' + IntToHex(Ord(Adapter.adapter_address[2]),2) + '-' + IntToHex(Ord(Adapter.adapter_address[3]),2) + '-' + @@ -2183,7 +2188,7 @@ begin i:=pos('-',s); if i>4 then begin - i:=i-4; + i:=i-4; s:=copy(s,i,9)+' '; // Id de formatage de c:\ end; end @@ -2288,7 +2293,7 @@ begin end; end; - +// exécuté en fin d'init (voir menu Projet/voir le source) procedure fin_preliminaire; var i : integer; s : string; @@ -2594,7 +2599,7 @@ begin end; {$ELSE} -// envoi la chaîne trameIF à la centrale par USBLenz ou socket, n'attend pas l'ack +// envoi la chaîne trameIF à la centrale par USB ou socket, n'attend pas l'ack // pour le protole XpressNet (1), on ajoute l'entete et le suffixe dans la trame. // ici on envoie pas à CDM // utilisation de TMSCOMM @@ -2603,7 +2608,7 @@ var i,timeout,valto,l : integer; begin if simuInterface then exit; - if protocole=1 then s:=entete+s; // ajout de l'entete en Xpressnet, pas en Dccpp + if protocole=1 then s:=entete+s; // ajout de l'entete définie dans le panneau de config en Xpressnet, pas en Dccpp l:=length(s); Setlength(TrameIF,l); for i:=0 to l-1 do TrameIF[i]:=byte(ord(s[i+1])); // transforme la chaine en tableau dynamique d'octets @@ -3338,6 +3343,7 @@ begin end; // Ecrire sur un canvas un texte avec un angle, avec ou sans bordure, monochrome ou à face texturée +// procédure pour Delphi 7 // params : C = Canvas // X,Y = Coordonnées angle supérieur gauche du début du texte. // Fonte = Police de caractères à utiliser : uniquement des fontes scalables. @@ -3410,6 +3416,7 @@ begin SelectObject(dc,AncBrush); DeleteObject(NouvBrush); end; + // inverse une image (miroir horizontal) et la met dans dest // Utilisé pour les signaux belges, et les trains procedure inverse_image(imageDest,ImageSrc : Timage); @@ -4902,7 +4909,7 @@ begin with font do begin Color:=clWhite; - Size:=taillefonte; + Size:=round(taillefonte*RedFonte); Style:=[fsbold]; Name:='Arial'; end; @@ -5216,7 +5223,7 @@ begin end; } -// dessine l'aspect du signal en fonction de son adresse dans le canvas de destination +// dessine dans le canvas de destination l'aspect du signal en fonction de son adresse passé en paramètre, son orientation, facteurs de réduction (FrX et FrY) en x,y procedure Dessine_signal_mx(CanvasDest : Tcanvas;x,y : integer;FrX,frY : single;adresse : integer;orientation : integer); var i,aspect : integer; begin @@ -5284,7 +5291,7 @@ end; function Select_dessin_Signal(TypeSignal : integer) : TBitmap; var Bm : TBitMap; begin - case TypeSignal of + case TypeSignal of 2 : Bm:=Formprinc.Image2feux.picture.Bitmap; 3 : Bm:=Formprinc.Image3feux.picture.Bitmap; 4 : Bm:=Formprinc.Image4feux.picture.Bitmap; @@ -5299,9 +5306,9 @@ begin 14 : Bm:=Formprinc.Image4Dir.picture.Bitmap; 15 : Bm:=Formprinc.Image5Dir.picture.Bitmap; 16 : Bm:=Formprinc.Image6Dir.picture.Bitmap; - else Bm:=nil; - end; - Select_dessin_Signal:=bm; + else Bm:=nil; + end; + Select_dessin_Signal:=bm; end; // créée une image dynamiquement dans la partie droite pour un nouveau signal déclaré dans le fichier de config @@ -5415,6 +5422,7 @@ begin else Signaux[rang].checkFB:=nil; end; +// change le train sélectionné ; i=nouvel index train procedure change_clic_train(i : integer); begin if (i<1) or (i>nTrains) then exit; @@ -5480,7 +5488,7 @@ end; procedure cree_GB_compteur(rang : integer); const HautTb=10; // hauteur trackbar ofsGBH=15; // marge haut du groupbox - ofsGBB=8; // marge bas du groupbox + ofsGBB=8; // marge bas du groupbox var Imh,Iml : integer; begin iml:=0;imh:=0; @@ -5974,7 +5982,7 @@ begin chaine_CDM_Acc:=so+s; end; -// prépare une tache pour le timer +// met une tache en tableau taches[] pour le timer // ttache=1 : pilote accessoire... // temporisation pour le timer avant action // destinataire (1=CDM 2=XpressNet 3=Dccpp) @@ -5989,7 +5997,7 @@ begin exit; end; - NoTraite:=true; // interdire le traitement pour éviter interférence + NoTraite:=true; // interdire le traitement pour éviter interférence with taches[pointeurTaches+1] do begin traite:=false; @@ -6435,7 +6443,7 @@ begin //else Affiche('action='+intToSTR(code),clLime); end; - // en sortie si on renvoie <>0,la touche n'est pas transmise + // en sortie si on renvoie <>0,la touche n'est pas transmise à windows callNextHookEx(kbHook,code,wordparam,longparam); if r=99 then result:=0 else result:=r; end; @@ -6611,7 +6619,7 @@ begin end; if (fonction>=13) and (fonction<=20) then begin - b:=222; + b:=222; // 1101 1110 if etat=1 then case fonction of 13 : c:=1; @@ -6811,13 +6819,13 @@ begin Signaux[i].EtatSignal:=etats; end; // signalisation combinée - if (aspect and $1C0)<>0 then + if (aspect and $1c0)<>0 then begin etats:=Signaux[i].EtatSignal; //si le bit 15 (bita1) est à 1, c'est l'indicateur de mise à 1 if testBit(aspect,bita1) then begin - etats:=etats or (aspect and $1C0); // mise à 1 par masquage + etats:=etats or (aspect and $1c0); // mise à 1 par masquage Signaux[i].EtatSignal:=Signaux[i].EtatSignal or etats; end else @@ -8114,18 +8122,18 @@ begin // 98=VJR + blanc + violet + ral30 + rappel30 if modele=98 then begin - case aspect of + case aspect of vert,vert_cli : begin pilote_acc(adresse+1,1,signal);pilote_acc(adresse+3,2,signal);end; jaune,jaune_cli : begin pilote_acc(adresse,1,signal);pilote_acc(adresse+3,2,signal);end; semaphore,semaphore_cli: begin pilote_acc(adresse,2,signal);pilote_acc(adresse+3,2,signal);end; blanc,blanc_cli : pilote_acc(adresse+1,2,signal); violet : pilote_acc(adresse+3,1,signal); - end; + end; if combine=ral_30 then begin pilote_acc(adresse+2,1,signal);pilote_acc(adresse+3,2,signal);end; if combine=rappel_30 then begin pilote_acc(adresse+2,2,signal);pilote_acc(adresse+3,2,signal);end; if ((aspect=jaune) or (aspect=jaune_cli)) and (combine=rappel_30) then begin pilote_acc(adresse,1,signal);pilote_acc(adresse+2,2,signal);pilote_acc(adresse+3,2,signal);end; - end; + end; // 99=VJR + blanc + violet + ral30 + rappel60 if modele=99 then @@ -13402,7 +13410,7 @@ end; } function test_memoire_zones(adresse : integer) : boolean; var AdrSuiv,prec,ife,actuel,i,j,it, - dernierdet,AdrSignal,NSignaux,NSigMax,voie1,voie2,indexSig2,indexSig1,ia : integer; + dernierdetec,AdrSignal,NSignaux,NSigMax,voie1,voie2,indexSig2,indexSig1,ia : integer; TypePrec,TypeActuel : TEquipement; Pres_train : boolean; s : string; @@ -13463,7 +13471,7 @@ begin Pres_train:=false; TypePrec:=det; - dernierdet:=prec; + dernierdetec:=prec; // purge les aiguillages après le signal it:=0; @@ -13503,19 +13511,19 @@ begin repeat inc(j); - if (typeactuel=det) and (dernierdet<>0) then + if (typeactuel=det) and (dernierdetec<>0) then begin - Pres_train:=MemZone[dernierdet,actuel].etat or detecteur[actuel].etat or Pres_Train; + Pres_train:=MemZone[dernierdetec,actuel].etat or detecteur[actuel].etat or Pres_Train; if (nivDebug=3) then begin - if Pres_Train then AfficheDebug('Présence train de '+intToSTR(dernierdet)+' à '+intToSTR(actuel),clyellow) - else AfficheDebug('Absence train de '+intToSTR(dernierdet)+' à '+intToSTR(actuel),clyellow) + if Pres_Train then AfficheDebug('Présence train de '+intToSTR(dernierdetec)+' à '+intToSTR(actuel),clyellow) + else AfficheDebug('Absence train de '+intToSTR(dernierdetec)+' à '+intToSTR(actuel),clyellow) end; - Pres_train:=MemZone[actuel,dernierdet].etat or Pres_Train; + Pres_train:=MemZone[actuel,dernierdetec].etat or Pres_Train; if (nivDebug=3) then begin - if Pres_Train then AfficheDebug('Présence train inverse de '+intToSTR(actuel)+' à '+intToSTR(dernierdet),clyellow) - else AfficheDebug('Absence train de '+intToSTR(actuel)+' à '+intToSTR(dernierdet),clyellow) + if Pres_Train then AfficheDebug('Présence train inverse de '+intToSTR(actuel)+' à '+intToSTR(dernierdetec),clyellow) + else AfficheDebug('Absence train de '+intToSTR(actuel)+' à '+intToSTR(dernierdetec),clyellow) end; // sortir de suite if Pres_train then @@ -13525,7 +13533,7 @@ begin exit; end; - dernierdet:=actuel; + dernierdetec:=actuel; // isi:=index_signal_det(Actuel,voie,index2); // renvoie l'index du signal se trouvant au détecteur "AdrSuiv": il peut y avoir 4 détecteurs par signal index_signal_det(actuel,voie1,indexSig1,voie2,indexSig2); @@ -15768,6 +15776,65 @@ begin detecteur[detect].Temps_cour:=0; // arret incrémente le compteur end; +// Supprime le train i du tableau TrainZone +procedure supprime_train_zone(isup,det1,det2,AdrTrainLoc : integer); +var i : integer; +begin + // N_trains est ke nombre de trains détectés + for i:=isup to N_Trains-1 do + begin + TrainZone[i]:=TrainZone[i+1]; + end; + + dec(N_Trains); + Formprinc.LabelNbTrains.caption:=IntToSTR(N_trains); + + MemZone[det1,det2].etat:=FALSE; // dévalide l'ancienne zone + MemZone[det1,det2].train:=''; + MemZone[det1,det2].Adrtrain:=0; + MemZone[det1,det2].IndexTrainRoulant:=0; + MemZone[det2,det1].etat:=FALSE; // dévalide l'ancienne zone inverse + MemZone[det2,det1].train:=''; + MemZone[det2,det1].Adrtrain:=0; // libère la réservation + MemZone[det2,det1].IndexTrainRoulant:=0; + with detecteur[det1] do + begin + Train:=''; + AdrTrainRes:=0; + IndexTrainRoulant:=0; + AdrTrain:=0; + precedent:=0; + suivant:=0; + end; + with detecteur[det2] do + begin + Train:=''; + AdrTrainRes:=0; + AdrTrain:=0; + IndexTrainRoulant:=0; + precedent:=0; + suivant:=0; + end; + + libere_canton(det1,det2,AdrTrainLoc); + for i:=1 to nbreTCO do + begin + Zone_TCO(i,det1,det2,isup,AdrTrainLoc,0,true,true); // enleve la loco des cantons du tco + maj_tco(i,det2); + end; + + isup:=index_train_adresse(AdrTrainLoc); + with trains[isup] do + begin + detecteurSuiv:=0; + detecteurPrec:=0; + dernierDet:=0; + end; + actualise_seltrains; + + Affiche_evt('Suppression du train',clOrange); +end; + // calcul des zones depuis le tableau des fronts montants ou descendants des évènements détecteurs // transmis dans le tableau Event_det // rattache le nouveau détecteur à un train @@ -15838,7 +15905,7 @@ begin Affiche('Démarrage train non placé depuis détecteur '+intToSTR(det3),clred); if TraceListe then AfficheDebug('Démarrage train non placé depuis détecteur '+intToSTR(det3),clred); end; - // affecter le nouveau détecteur + // affecter le nouveau détecteur detecteur[det3].train:=Train_ch; detecteur[det3].AdrTrain:=AdrTrainLoc; detecteur[det3].IndexTrainRoulant:=i; @@ -15855,9 +15922,37 @@ begin if adrSuiv>NbMaxDet then begin - if adrsuiv=9996 then affiche_evt('Erreur aiguillage '+intToSTR(AigMal)+' mal positionné',clred) - else + if AdrSuiv=9996 then Affiche_evt('La position de l''aiguillage '+intToSTR(AigMal)+' est inconnue',clred); Affiche_evt('Info 1-0 '+intToSTR(AdrSuiv)+' : pas de suivant detecteur_suivant_el '+intToSTR(det1)+' '+intToSTR(det3),clWhite); + MemZone[det1,det3].etat:=FALSE; // dévalide l'ancienne zone + MemZone[det1,det3].train:=''; + MemZone[det1,det3].Adrtrain:=0; + MemZone[det1,det3].IndexTrainRoulant:=0; + MemZone[det3,det1].etat:=FALSE; // dévalide l'ancienne zone inverse + MemZone[det3,det1].train:=''; + MemZone[det3,det1].Adrtrain:=0; // libère la réservation + MemZone[det3,det1].IndexTrainRoulant:=0; + with detecteur[det1] do + begin + Train:=''; + AdrTrainRes:=0; + IndexTrainRoulant:=0; + end; + with detecteur[det3] do + begin + Train:=''; + AdrTrainRes:=0; + IndexTrainRoulant:=0; + end; + + libere_canton(det1,det3,AdrTrainLoc); // on quitte det3 + for ntco:=1 to nbreTCO do + begin + Zone_TCO(ntco,det1,det3,i,AdrTrainLoc,0,false,true); // tco,det1,det2,train, mode + maj_tco(ntco,det3); + end; + // le train est perdu, le suppprimer + supprime_train_zone(i,det1,det3,AdrTrainLoc); exit; end else @@ -15960,7 +16055,6 @@ begin MemZone[det3,det_suiv].AdrTrain:=AdrTrainLoc; for ntco:=1 to nbreTCO do begin - //raz_cantons_train(AdrTrainLoc); // efface tous les cantons contenant le train adrloc if ModeCouleurCanton=0 then zone_TCO(ntco,det3,det_suiv,i,AdrTrainLoc,1,true,true) else zone_TCO(ntco,det3,det_suiv,i,AdrTrainLoc,2,true,true); // affichage avec la couleur de index_couleur du train end; @@ -16163,8 +16257,13 @@ begin if TraceListe then AfficheDebug('le sursuivant est '+intToSTR(adrsuiv),couleur); if (Adrsuiv>=9990) and not(casaig) then begin - //Affiche('Erreur 1500 : pas de suivant sur la route de '+intToSTR(det2)+' à '+intToSTR(det3),clRed); if (NivDebug=3) or TraceListe then AfficheDebug('Msg 1500 : pas de suivant sur la route de '+intToSTR(det2)+' à '+intToSTR(det3),clorange); + if AdrSuiv=9996 then Affiche_evt('La position de l''aiguillage '+intToSTR(AigMal)+' est inconnue',clred); + Affiche_evt('Info 2-0 '+intToSTR(AdrSuiv)+' : pas de suivant detecteur_suivant_el '+intToSTR(det1)+' '+intToSTR(det3),clWhite); + + // le train est perdu, le suppprimer + supprime_train_zone(i,det2,det3,AdrTrainLoc); + exit; end else begin @@ -16414,8 +16513,9 @@ begin end else begin - if det_suiv=9996 then affiche_evt('Erreur 2-1 position inconnue aiguillage ',clred) + if det_suiv=9996 then affiche_evt('Erreur 2-1 position inconnue aiguillage '+intToSTR(AigMal),clred) else Affiche_evt('Erreur 2-1 '+intToSTR(Det_Suiv)+' : pas de suivant det_suiv_cont '+intToSTR(det2)+' '+intToSTR(det3),clred); + end; end else @@ -16552,7 +16652,7 @@ begin // Nombre d'éléments à 0 : ici c'est un nouveau train donc créer un train, donc un tableau if N_Trains>=Max_Trains then begin - Affiche('Erreur nombre de train maximal atteint',clRed); + Affiche('Erreur nombre de trains en circulation maximal atteint',clRed); N_trains:=0; end; Inc(N_trains); @@ -21502,20 +21602,6 @@ begin lire_fichier_tco(i); end; - { - case compteur of - 1 : begin - init_compteur1; - aiguille_compteur(1,0); - Compteurdevitesse1.checked:=true; - end; - 2 : begin - Init_compteur2; - aiguille_compteur(2,0); - Compteurdevitesse2.checked:=true; - end; - end; } - verif_coherence; procetape('La configuration a été lue'); @@ -21576,7 +21662,6 @@ begin end; renseigne_tous_cantons; // les form des TCO doivent être créés - // ouvre les périphériques commandes actionneurs, car on a lu les com dans la config for i:=1 to NbPeriph do begin @@ -21698,8 +21783,14 @@ end; procedure TFormPrinc.RecuInterface(Sender: TObject;Count : word); var i,tev,l : integer; s : string; - tablo : array[1..255] of byte; + tablo : array[1..1024] of byte; begin + if count>1024 then + begin + Affiche('Débordement Com interface',clred); + count:=1024; + end; + MSCommUSBInterface.GetBlock(tablo,count); l:=Long_Recue; // résidu précédent à chainer - longueur du tampon @@ -22690,7 +22781,7 @@ begin end; -// erreur sur socket Lenz (interface XpressNet) +// erreur sur socket interface XpressNet) procedure TFormPrinc.ClientSocketInterfaceError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); @@ -23375,7 +23466,7 @@ begin ss:=copy(commandeCDM,i+5,l-i-5); nom:=ss; Delete(commandeCDM,i,l-i+1); - end; + end; i:=posEx('OBJ=',commandeCDM,1);l:=posEx(';',commandeCDM,i); if (i<>0) and (l<>0) then @@ -24047,8 +24138,8 @@ begin if protocole=1 then begin - //s:=#$ff+#$fe+#$23+#$1e+Char(adr)+Char(valeur); //CV de 512 à 767 V3.4 - //s:=#$ff+#$fe+#$23+#$1d+Char(adr)+Char(valeur); //CV de 256 à 511 V3.4 + //s:=#$23+#$1e+Char(adr)+Char(valeur); //CV de 512 à 767 V3.4 + //s:=#$23+#$1d+Char(adr)+Char(valeur); //CV de 256 à 511 V3.4 s:=#$23+#$16+Char(adr)+Char(valeur); //CV de 1 à 256 s:=checksum(s); envoi(s); // envoi de la trame et attente Ack @@ -24323,8 +24414,6 @@ begin end; end; - - // pour déplacer l'ascenseur de l'affichage automatiquement en bas procedure TFormPrinc.FenRichChange(Sender: TObject); begin @@ -24376,7 +24465,7 @@ begin end; procedure TFormPrinc.Etatdeszonespartrain1Click(Sender: TObject); -var i,j,n,train : integer; +var i,j,n,train,nb : integer; couleur : tcolor; rien,aff : boolean; s,ss : string; @@ -24384,7 +24473,8 @@ begin Affiche('',clyellow); Affiche('Historique de l''état des zones par train',clWhite); rien:=true; - for train:=1 to 20 do + + for train:=1 to nTrains do begin n:=TrainZone[train].Nbre; for i:=1 to n do @@ -24399,8 +24489,9 @@ begin Affiche(s,CouleurTrain[couleur]); end; end; + Affiche('Liste des zones actuellement occupées:',clWhite); - i:=0; + nb:=0;i:=0; repeat j:=0; repeat @@ -24411,14 +24502,14 @@ begin s:=s+' Train n°'+intToSTR(MemZone[i,j].IndexTrainRoulant); s:=s+' PrevSuiv='+intToSTR(MemZone[i,j].Prev); Affiche(s,couleurTrain[MemZone[i,j].IndexTrainRoulant]); - + inc(nb); rien:=false; end; inc(j); until (j>NbMaxDet); inc(i); until (i>NbMaxDet); - + if nb=0 then Affiche('Aucune zone occupée',clYellow); {Affiche('Derniers éléments scannés:',clWhite); for i:=1 to idEl do begin @@ -26092,10 +26183,16 @@ end; // réception COM/USB du périphérique 1 avec Asyncpro procedure TFormPrinc.RecuPeriph1(Sender: TObject;Count : Word); var s : string; - tablo : array[1..255] of byte; // tableau rx usb + tablo : array[1..1024] of byte; // tableau rx usb c : char; i : integer; begin + if count>1024 then + begin + Affiche('Débordement com périph1',clred); + count:=1024; + end; + MScommCde1.GetBlock(Tablo,count); for i:=1 to count do @@ -26107,7 +26204,6 @@ begin s:=tablo_periph[1].tamponrx; affiche(s,clyellow); tablo_periph[1].tamponrx:=''; - telecommande(s); end; if (c>#31) and (c<#128) then tablo_periph[1].tamponrx:=tablo_periph[1].tamponrx+c; @@ -26121,7 +26217,14 @@ var s : string; c : char; i : integer; begin + if count>1024 then + begin + Affiche('Débordement com périph2',clred); + count:=1024; + end; + MSCommCde2.GetBlock(Tablo,count); // TMSComm autoadapte la longueur du tampon dynamique + for i:=1 to length(tablo) do begin c:=char(tablo[i]); @@ -27974,11 +28077,7 @@ begin Affiche_mesure_trains; end; -procedure TFormPrinc.Button0Click(Sender: TObject); -begin -{ EditVitesse.Text:='0'; - TrackBarVit.Position:=0; } -end; + procedure TFormPrinc.Compilerlabasededonnes1Click(Sender: TObject); begin diff --git a/UnitRouteTrains.pas b/UnitRouteTrains.pas index 031094f..89b1fc7 100644 --- a/UnitRouteTrains.pas +++ b/UnitRouteTrains.pas @@ -523,7 +523,7 @@ begin ncanton:=0; TrainExistant:=0; ideb:=trains[idTrain].PointRout; - ideb:=Pointeur; // zizi + ideb:=Pointeur; AdrSig:=0; SigBonSens:=false; //TraceListe:=true; diff --git a/UnitTCO.dfm b/UnitTCO.dfm index 4e29d75..ae89a4b 100644 --- a/UnitTCO.dfm +++ b/UnitTCO.dfm @@ -1598,6 +1598,10 @@ object FormTCO: TFormTCO Caption = 'Supprimer le canton' OnClick = Supprimercanton1Click end + object Afficherlecompteurdevitessedutrain1: TMenuItem + Caption = 'Afficher le compteur de vitesse du train' + OnClick = Afficherlecompteurdevitessedutrain1Click + end object N6: TMenuItem Caption = '-' end diff --git a/UnitTCO.pas b/UnitTCO.pas index 2a100c8..e8a462f 100644 --- a/UnitTCO.pas +++ b/UnitTCO.pas @@ -171,6 +171,7 @@ type Modedplacement1: TMenuItem; N12: TMenuItem; LabelPM: TLabel; + Afficherlecompteurdevitessedutrain1: TMenuItem; //TimerTCO: TTimer; procedure FormCreate(Sender: TObject); procedure FormActivate(Sender: TObject); @@ -419,6 +420,7 @@ type procedure Modeslection1Click(Sender: TObject); procedure Modedplacement1Click(Sender: TObject); procedure Button1Click(Sender: TObject); + procedure Afficherlecompteurdevitessedutrain1Click(Sender: TObject); public { Déclarations publiques } end; @@ -718,7 +720,8 @@ procedure origine_canton(var x,y : integer); implementation uses UnitConfigTCO, Unit_Pilote_aig, UnitConfigCellTCO, UnitClock, selection_train , - UnitRoute, UnitRouteTrains, UnitInfo, UnitIntro, UnitMemZone; + UnitRoute, UnitRouteTrains, UnitInfo, UnitIntro, UnitMemZone, + UnitCompteur; {$R *.dfm} @@ -2597,7 +2600,6 @@ begin Affiche('TCO '+nomFichierTCO[i]+' sauvegardé',clyellow); end; TCO_modifie:=false; - end; // calcule les Hauteur et Largeur des cellules en fonction du Zoom @@ -2629,7 +2631,7 @@ begin end; // renvoie la position de l'aiguillage en position x,y du tco indextco -function positionTCO(indexTCO,x,y : integer) : integer; +function position_Aig_TCO(indexTCO,x,y : integer) : integer; var position,i : integer; begin i:=index_Aig(tco[indextco,x,y].Adresse); @@ -2656,16 +2658,16 @@ begin StartDegres:=startDegres*pisur180; stopDegres:=StartDegres+stopDegres*pisur180; - x1:=CentreX - rayonX; - y1:=CentreY - rayonY; - x2:=CentreX + rayonX; - y2:=CentreY + rayonY; + x1:=CentreX-rayonX; + y1:=CentreY-rayonY; + x2:=CentreX+rayonX; + y2:=CentreY+rayonY; SinCos(StartDegres,SinA,CosA); - x4:=CentreX + round(rayonX*CosA); - y4:=Centrey - Round(rayonY*SinA); + x4:=CentreX+round(rayonX*CosA); + y4:=Centrey-Round(rayonY*SinA); SinCos(StopDegres,SinA,CosA); - x3:=CentreX + round(rayonX*CosA); - y3:=Centrey - round(rayonY*SinA); + x3:=CentreX+round(rayonX*CosA); + y3:=Centrey-round(rayonY*SinA); Canvas.Arc(x1,y1,x2,y2,x3,y3,x4,y4); end; @@ -2709,92 +2711,10 @@ begin end; end; -// élément de voie horizontale Element 1 -procedure dessin_1(indexTCO: integer;Canvas : Tcanvas;x,y,mode : integer); -var Adr,yf,xf,x0,y0,jy1,jy2,ep,xc,yc,but : integer; - r : Trect; - couleur : Tcolor; -begin - x0:=(x-1)*LargeurCell[indexTCO]; - y0:=(y-1)*HauteurCell[indexTCO]; - xc:=x0+(LargeurCell[indexTCO] div 2); - yc:=y0+(HauteurCell[indexTCO] div 2); - xf:=x0+LargeurCell[indexTCO]; - yf:=y0+HauteurCell[indexTCO]; - ep:=tco[indextco,x,y].epaisseurs; - but:=tco[indextco,x,y].buttoir; - - with canvas do - begin - //Brush.Color:=tco[indextco,x,y].CouleurFond; - Pen.Mode:=pmCopy; - - // buttoir - if but<>0 then - begin - case mode of - 0 : couleur:=clVoies[indexTCO]; - 1 : couleur:=clAllume[indexTCO]; - 2 : couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - pen.color:=couleur; - if testbit(ep,7) or testbit(ep,3) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - - if testBit(but,7) then - begin - moveTo(x0,yc);LineTo(xc,yc); - end; - if testBit(but,3) then - begin - moveTo(xc,yc);LineTo(xf,yc); - end; - - Pen.Width:=epaisseur; - pen.Color:=Clred; - moveto(xc,yc+round(7*fryGlob[indexTCO])); - LineTo(xc,yc-round(7*fryGlob[indexTCO])); - exit; - end; - - - // détecteur - Adr:=tco[indextco,x,y].adresse; - if adr<>0 then - begin - pen.Width:=1; - if detecteur[Adr].etat then - begin - brush.Color:=clAllume[indexTCO]; - pen.color:=clAllume[indexTCO]; - end - else - begin - pen.color:=tco[indextco,x,y].CouleurFond; - brush.color:=tco[indextco,x,y].CouleurFond; - end; - // dessine la bande horizontale - jy1:=y0+(HauteurCell[indexTCO] div 2)-round(7*fryGlob[indexTCO]); // pos Y de la bande sup - jy2:=y0+(HauteurCell[indexTCO] div 2)+round(7*fryGlob[indexTCO]); // pos Y de la bande inf - if avecGrille[indexTCO] then r:=Rect(x0+1,jy1,xf-1,jy2) else - r:=Rect(x0,jy1,x0+LargeurCell[indexTCO],jy2) ; - FillRect(r); - end; - - // dessine la voie - case mode of - 0 : couleur:=clVoies[indexTCO]; - 1 : couleur:=clAllume[indexTCO]; - 2 : couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - pen.color:=couleur; - if testbit(ep,7) or testbit(ep,3) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveTo(x0,yc);LineTo(xf,yc); - end; -end; function IsVoieDroite(i : integer) : boolean; begin - result:=(i=1) or (i=10) or (i=11) or (i=20); + result:=(i=1) or (i=10) or (i=11) or (i=20); // voie horizontale, verticale, inclinée G inclinée D end; // renvoie vrai si l'élément i est un canton H ou V @@ -2919,6 +2839,7 @@ begin result:=((Larg*tf) div 40)+1; end; +// affiche le texte dans la cellule procedure affiche_texte(indextco,x,y : integer); var b,x0,y0,xt,yt,repr,largCell,hautCell,tf,tailleFont : integer; ss,s,nf : string; @@ -3036,6 +2957,89 @@ begin end; end; +// élément de voie horizontale Element 1 +procedure dessin_1(indexTCO: integer;Canvas : Tcanvas;x,y,mode : integer); +var Adr,yf,xf,x0,y0,jy1,jy2,ep,xc,yc,but : integer; + r : Trect; + couleur : Tcolor; +begin + x0:=(x-1)*LargeurCell[indexTCO]; + y0:=(y-1)*HauteurCell[indexTCO]; + xc:=x0+(LargeurCell[indexTCO] div 2); + yc:=y0+(HauteurCell[indexTCO] div 2); + xf:=x0+LargeurCell[indexTCO]; + yf:=y0+HauteurCell[indexTCO]; + ep:=tco[indextco,x,y].epaisseurs; + but:=tco[indextco,x,y].buttoir; + + with canvas do + begin + //Brush.Color:=tco[indextco,x,y].CouleurFond; + Pen.Mode:=pmCopy; + + // buttoir + if but<>0 then + begin + case mode of + 0 : couleur:=clVoies[indexTCO]; + 1 : couleur:=clAllume[indexTCO]; + 2 : couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + pen.color:=couleur; + if testbit(ep,7) or testbit(ep,3) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + + if testBit(but,7) then + begin + moveTo(x0,yc);LineTo(xc,yc); + end; + if testBit(but,3) then + begin + moveTo(xc,yc);LineTo(xf,yc); + end; + + Pen.Width:=epaisseur; + pen.Color:=Clred; + moveto(xc,yc+round(7*fryGlob[indexTCO])); + LineTo(xc,yc-round(7*fryGlob[indexTCO])); + exit; + end; + + + // détecteur + Adr:=tco[indextco,x,y].adresse; + if adr<>0 then + begin + pen.Width:=1; + if detecteur[Adr].etat then + begin + brush.Color:=clAllume[indexTCO]; + pen.color:=clAllume[indexTCO]; + end + else + begin + pen.color:=tco[indextco,x,y].CouleurFond; + brush.color:=tco[indextco,x,y].CouleurFond; + end; + // dessine la bande horizontale + jy1:=y0+(HauteurCell[indexTCO] div 2)-round(7*fryGlob[indexTCO]); // pos Y de la bande sup + jy2:=y0+(HauteurCell[indexTCO] div 2)+round(7*fryGlob[indexTCO]); // pos Y de la bande inf + if avecGrille[indexTCO] then r:=Rect(x0+1,jy1,xf-1,jy2) else + r:=Rect(x0,jy1,x0+LargeurCell[indexTCO],jy2) ; + FillRect(r); + end; + + // dessine la voie + case mode of + 0 : couleur:=clVoies[indexTCO]; + 1 : couleur:=clAllume[indexTCO]; + 2 : couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + pen.color:=couleur; + if testbit(ep,7) or testbit(ep,3) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveTo(x0,yc);LineTo(xf,yc); + end; +end; + procedure dessin_2L(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); var x0,y0,xc,yc,jy2,xf,yf,position,jy1,ep : integer; r : Trect; @@ -3093,7 +3097,7 @@ begin xf:=x0+LargeurCell[indexTCO]; // x fin yf:=y0+hauteurCell[indexTCO]; // y fin fond:=tco[indextco,x,y].CouleurFond; - position:=positionTCO(indexTCO,x,y); + position:=position_Aig_TCO(indexTCO,x,y); ep:=tco[indextco,x,y].epaisseurs; with canvas do @@ -3230,7 +3234,7 @@ begin xf:=x0+LargeurCell[indexTCO]; // x fin yf:=y0+hauteurCell[indexTCO]; // y fin fond:=tco[indextco,x,y].CouleurFond; - position:=positionTCO(indexTCO,x,y); + position:=position_Aig_TCO(indexTCO,x,y); ep:=tco[indextco,x,y].epaisseurs; // mode rond @@ -3379,7 +3383,7 @@ begin xf:=x0+LargeurCell[indexTCO]; // x fin yf:=y0+hauteurCell[indexTCO]; // y fin fond:=tco[indextco,x,y].CouleurFond; - position:=positionTCO(indexTCO,x,y); + position:=position_Aig_TCO(indexTCO,x,y); ep:=tco[indextco,x,y].epaisseurs; with canvas do @@ -3519,7 +3523,7 @@ begin x3:=x0;y3:=yc; x4:=xf;y4:=y0; - position:=positionTCO(indexTCO,x,y); + position:=position_Aig_TCO(indexTCO,x,y); fond:=tco[indextco,x,y].CouleurFond; with canvas do @@ -3666,7 +3670,7 @@ begin xf:=x0+LargeurCell[indexTCO]; // x fin yf:=y0+hauteurCell[indexTCO]; // y fin fond:=tco[indextco,x,y].CouleurFond; - position:=positionTCO(indexTCO,x,y); + position:=position_Aig_TCO(indexTCO,x,y); ep:=tco[indextco,x,y].epaisseurs; with canvas do @@ -3813,7 +3817,7 @@ begin x3:=xf;y3:=yf; x4:=x0;y4:=yc; - position:=positionTCO(indexTCO,x,y); + position:=position_Aig_TCO(indexTCO,x,y); fond:=tco[indextco,x,y].CouleurFond; with canvas do @@ -3959,7 +3963,7 @@ begin xf:=x0+LargeurCell[indexTCO]; // x fin yf:=y0+hauteurCell[indexTCO]; // y fin fond:=tco[indextco,x,y].CouleurFond; - position:=positionTCO(indexTCO,x,y); + position:=position_Aig_TCO(indexTCO,x,y); ep:=tco[indextco,x,y].epaisseurs; with canvas do @@ -4100,7 +4104,7 @@ begin xc:=x0+(LargeurCell[indexTCO] div 2); // x centre xf:=x0+LargeurCell[indexTCO]; // x fin yf:=y0+hauteurCell[indexTCO]; // y fin - position:=positionTCO(indexTCO,x,y); + position:=position_Aig_TCO(indexTCO,x,y); fond:=tco[indextco,x,y].CouleurFond; ep:=tco[indextco,x,y].epaisseurs; @@ -4715,7 +4719,7 @@ begin xc:=x0+(LargeurCell[indexTCO] div 2); // x centre xf:=x0+LargeurCell[indexTCO]; // x fin yf:=y0+hauteurCell[indexTCO]; // y fin - position:=positionTCO(indexTCO,x,y); + position:=position_Aig_TCO(indexTCO,x,y); fond:=tco[indextco,x,y].CouleurFond; ep:=tco[indextco,x,y].epaisseurs; @@ -4794,7 +4798,7 @@ begin pen.width:=epaisseur div 2; moveTo(x0,y0);LineTo(xf,yf); end; - end; + end; end; end; @@ -4858,7 +4862,7 @@ begin x3:=x0;y3:=y0; x4:=xf;y4:=yc; - position:=positionTCO(indexTCO,x,y); + position:=position_Aig_TCO(indexTCO,x,y); fond:=tco[indextco,x,y].CouleurFond; with canvas do @@ -5004,7 +5008,7 @@ begin xc:=x0+(LargeurCell[indexTCO] div 2); // x centre xf:=x0+LargeurCell[indexTCO]; // x fin yf:=y0+hauteurCell[indexTCO]; // y fin - position:=positionTCO(indexTco,x,y); + position:=position_Aig_TCO(indexTco,x,y); fond:=tco[indextco,x,y].CouleurFond; ep:=tco[indextco,x,y].epaisseurs; @@ -5148,7 +5152,7 @@ begin x3:=x0;y3:=yc; x4:=xf;y4:=y0; - position:=positionTCO(indexTco,x,y); + position:=position_Aig_TCO(indexTco,x,y); fond:=tco[indextco,x,y].CouleurFond; ep:=tco[indextco,x,y].epaisseurs; @@ -5287,7 +5291,7 @@ var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,y4,position,ep : integer; end; end; - + begin x0:=(x-1)*LargeurCell[indexTCO]; // x origine y0:=(y-1)*hauteurCell[indexTCO]; // y origine @@ -5295,7 +5299,7 @@ begin xc:=x0+(LargeurCell[indexTCO] div 2); // x centre xf:=x0+LargeurCell[indexTCO]; // x fin yf:=y0+hauteurCell[indexTCO]; // y fin - position:=positionTCO(indexTco,x,y); + position:=position_Aig_TCO(indexTco,x,y); fond:=tco[indextco,x,y].CouleurFond; ep:=tco[indextco,x,y].epaisseurs; @@ -5437,7 +5441,7 @@ begin x3:=xf;y3:=yf; x4:=x0;y4:=yc; - position:=positionTCO(indexTco,x,y); + position:=position_Aig_TCO(indexTco,x,y); fond:=tco[indextco,x,y].CouleurFond; with canvas do @@ -5586,7 +5590,7 @@ begin xc:=x0+(LargeurCell[indexTCO] div 2); // x centre xf:=x0+LargeurCell[indexTCO]; // x fin yf:=y0+hauteurCell[indexTCO]; // y fin - position:=positionTCO(indexTco,x,y); + position:=position_Aig_TCO(indexTco,x,y); fond:=tco[indextco,x,y].CouleurFond; ep:=tco[indextco,x,y].epaisseurs; @@ -5729,7 +5733,7 @@ begin x3:=xf;y3:=yc; x4:=x0;y4:=yf; - position:=positionTCO(indexTco,x,y); + position:=position_Aig_TCO(indexTco,x,y); fond:=tco[indextco,x,y].CouleurFond; ep:=tco[indextco,x,y].epaisseurs; with canvas do @@ -6710,7 +6714,7 @@ begin end; if position1=const_devie then with canvas do - begin + begin // donne l'équation de droite y=ax+b passant par les points (x1,y1) (x2,y2) equation_droite(x0,y0,xc,yc,a1,b1); moveTo(x0,y0);LineTo(xc-epaisseur,round((xc-epaisseur)*a1+b1) ); LineTo(xc+epaisseur,yc); LineTo(xf,yc); @@ -6718,12 +6722,2906 @@ begin moveTo(x0,yc);lineTo(xc-epaisseur,yc); LineTo(xc+epaisseur,round((xc+epaisseur)*a1+b1) ); LineTo(xf,yf); - end; + end; end; end; - end; +// Element 23 croisement +procedure dessin_23(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); +var x1,x2,y1,y2,xp,x0,y0,x3,y3,x4,y4,xf,yf,xc,yc,trajet,ep,pont, + adr1,adr2,index1,index2,position1,position2,EtatTJD,sHG,sBD : integer; + a1,b1,a2,b2 : single; + md,tHG,tBD : tEquipement; + fond : tcolor; + procedure verticale; + begin + with canvas do + begin + if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveTo(xc,y0);LineTo(xc,yc); + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + LineTo(xc,yf); + end; + end; + + procedure diagonale; + begin + with canvas do + begin + if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveTo(xf,y0);LineTo(xc,yc); + if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + LineTo(x0,yf); + end; + end; + + procedure tjd_d(dessin : integer); + begin + x1:=x0+(LargeurCell[indexTCO] div 2);y1:=y0-(hauteurCell[indexTCO] div 3); + x2:=xf+(2*LargeurCell[indexTCO])+(LargeurCell[indexTCO] div 2);y2:=yf+hauteurCell[indexTCO]+(hauteurCell[indexTCO] div 3); + x3:=xf;y3:=y0; + x4:=xc;y4:=yf; + ep:=tco[indextco,x,y].epaisseurs; + + with canvas do + begin + if dessin=1 then + begin + if testbit(ep,2) or testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + end; + Arc(x1,y1,x2,y2,x3,y3,x4,y4); + end; + end; + + procedure tjd_G(dessin : integer); + begin + x1:=x0-(2*LargeurCell[indexTCO])-(LargeurCell[indexTCO] div 2);y1:=y0-hauteurCell[indexTCO]-(hauteurCell[indexTCO] div 3); + x2:=x0+(LargeurCell[indexTCO] div 2);y2:=yf+round(hauteurCell[indexTCO] / 2.5); + x3:=x0;y3:=yf; + x4:=xc;y4:=y0; + ep:=tco[indextco,x,y].epaisseurs; + + with canvas do + begin + if dessin=1 then + begin + if testbit(ep,1) or testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + end; + Arc(x1,y1,x2,y2,x3,y3,x4,y4); + end; + end; + +begin + x0:=(x-1)*LargeurCell[indexTCO]; + y0:=(y-1)*hauteurCell[indexTCO]; + xc:=x0+(LargeurCell[indexTCO] div 2); + yc:=y0+(hauteurCell[indexTCO] div 2); + xf:=x0+LargeurCell[indexTCO]; + yf:=y0+hauteurCell[indexTCO]; + ep:=tco[indextco,x,y].epaisseurs; + pont:=tco[indextco,x,y].pont; + fond:=tco[indextco,x,y].CouleurFond; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=tco[indextco,x,y].CouleurFond; + //r:=Rect(x0,y0,x0+LargeurCell[indexTCO],y0+hauteurCell[indexTCO]); + //FillRect(r); + + Brush.Color:=clvoies[indexTCO]; + pen.color:=clvoies[indexTCO]; + pen.width:=epaisseur; + + diagonale; + verticale; + md:=aiguillage[index_aig(tco[indextco,x,y].Adresse)].modele; + if (md=tjd) or (md=tjs) then + begin + tjd_G(1); + tjd_D(1); + end; + + // verticale + if testbit(pont,1) or testbit(pont,5) then + begin + // masquages + pen.color:=clfond[indexTCO]; + xp:=xc-(epaisseur); + moveto(xp,y0+epaisseur);lineTo(xp,yf-epaisseur); + xp:=xc+(epaisseur); + moveto(xp,y0+epaisseur);lineTo(xp,yf-epaisseur); + + // barrières du pont + pen.color:=clBarriere[indexTCO]; + pen.Width:=epaisseur div 2; + xp:=xc-(epaisseur); + moveto(xp,y0+epaisseur);lineTo(xp,yf-epaisseur); + xp:=xc+(epaisseur); + moveto(xp,y0+epaisseur);lineTo(xp,yf-epaisseur); + end; + + // diagonale + if testbit(pont,2) or testbit(pont,6) then + begin + pen.color:=clfond[indexTCO]; + equation_droite(xf,y0,x0,yf,a1,b1); + // droite a2,b2 // passant par x2,y2 + a2:=a1; + + // masquage G + x2:=xf-round(21*frxGlob[indexTCO]);y2:=y0+round(12*fryGlob[indexTCO]); + b2:=y2-a2*x2; + x1:=x0+round(6*frxGlob[indexTCO]); + y1:=round(a2*x1+b2); + moveto(x1,y1);lineTo(x2,y2); + + // barrière + pen.width:=epaisseur div 2; + pen.color:=clBarriere[indexTCO]; + x2:=xf-round(21*frxGlob[indexTCO]);y2:=y0+round(12*fryGlob[indexTCO]); + b2:=y2-a2*x2; + x1:=x0+round(6*frxGlob[indexTCO]); + y1:=round(a2*x1+b2); + moveto(x1,y1);lineTo(x2,y2); + + // masquage D + pen.Width:=epaisseur; + pen.color:=clFond[indexTCO]; + x2:=xf-round(10*frxGlob[indexTCO]);y2:=y0+round(18*fryGlob[indexTCO]); + b2:=y2-a2*x2; + x1:=x0+round(16*frxGlob[indexTCO]); + y1:=round(a2*x1+b2); + moveto(x1,y1);lineTo(x2,y2); + + // barrière + pen.width:=epaisseur div 2; + pen.color:=clBarriere[indexTCO]; + x2:=xf-round(10*frxGlob[indexTCO]);y2:=y0+round(18*fryGlob[indexTCO]); + b2:=y2-a2*x2; + x1:=x0+round(16*frxGlob[indexTCO]); + y1:=round(a2*x1+b2); + moveto(x1,y1);lineTo(x2,y2); + end; + + // regarder d'ou on vient de la route du tco + if mode>0 then + begin + trajet:=tco[indextco,x,y].trajet; + case mode of + 0: couleur:=clVoies[indexTCO]; + 1: couleur:=ClCanton[indexTCO]; + 2: couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + Brush.Color:=couleur; + pen.color:=couleur; + if trajet=1 then verticale; + if trajet=2 then diagonale; + if trajet=3 then // NE C S + begin + {if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(xf,y0);LineTo(xc,yc); + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineTo(xc,yf);} + tjd_d(1); + end; + if trajet=4 then // N C SO + begin + {if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(xc,y0);LineTo(xc,yc); + if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineTo(x0,yf);} + tjd_g(1); + end; + end; + end; + + // dessin position de la tjd + adr1:=tco[indexTCO,x,y].Adresse; + Index1:=Index_aig(adr1); + md:=aiguillage[Index1].modele; + if (md=tjd) or (md=tjs) then + begin + EtatTJD:=aiguillage[index1].EtatTJD; // nombre d'états de la tjd (2 ou 4) + position1:=aiguillage[index1].position; + sHG:=TCO[indexTCO,x,y].suivHG;tHG:=TCO[indexTCO,x,y].typHG; + sBD:=TCO[indexTCO,x,y].suivBD;tBD:=TCO[indexTCO,x,y].typBD; + canvas.pen.color:=clfond[indexTCO];; + canvas.pen.Width:=epaisseur div 2; + if etatTJD=4 then + begin + adr2:=aiguillage[index1].DDevie; // homologue + Index2:=Index_aig(adr2); + position2:=aiguillage[index2].position; + + if (position1=const_devie) and (position2=const_devie) then + begin + with canvas do begin + moveTo(xc,y0);LineTo(xc,yf); + end; + end; + + if (position1=const_droit) and (position2=const_droit) then + begin + with canvas do begin + moveTo(x0,yf);LineTo(xf,y0); + end; + end; + + if (position1=const_droit) and (position2=const_devie) then + begin + if tco[indexTCO,x,y].tjdS=adr1 then + {with canvas do begin + moveTo(xf,y0);LineTo(xc,yc);Lineto(xc,yf); + end;} + tjd_d(2); + if tco[indexTCO,x,y].tjdS=adr2 then + {with canvas do begin + moveTo(xc,y0);LineTo(xc,yc);Lineto(x0,yf); + end;} + tjd_g(2); + end; + + if (position1=const_devie) and (position2=const_droit) then + begin + if tco[indexTCO,x,y].tjdS=adr1 then + {with canvas do begin + moveTo(xc,y0);LineTo(xc,yc);Lineto(x0,yf); + end; } + tjd_g(2); + if tco[indexTCO,x,y].tjdS=adr2 then + {with canvas do begin + moveTo(xf,y0);LineTo(xc,yc);Lineto(xc,yf); + end;} + tjd_d(2); + end; + end; + + if etatTJD=2 then + begin + if position1=const_droit then + with canvas do + begin + moveTo(xc,y0);LineTo(xc,yf); + moveTo(xf,y0);LineTo(x0,yf); + end; + if position1=const_devie then + with canvas do + begin + // donne l'équation de droite y=ax+b passant par les points (x1,y1) (x2,y2) + equation_droite(xc,yc,x0,yf,a1,b1); + //gauche + moveTo(xc,y0); LineTo(xc,yc-epaisseur); + LineTo(xc-epaisseur,round((xc-epaisseur)*a1+b1) ); LineTo(x0,yf); + //droite + moveTo(xc,yf); + lineTo(xc,yc+epaisseur); + LineTo(xc+epaisseur,round((xc+epaisseur)*a1+b1) ); + LineTo(xf,y0); + end; + end; + end; +end; + +// Element 24 +procedure dessin_24L(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); +var x0,y0,xc,yc,jx1,jy1,xf,yf,position,ep : integer; + r : Trect; + fond: tcolor; + + procedure trajet_droit; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_droit then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + with canvas do + begin + if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + pen.color:=couleur; + moveto(xc,y0);lineto(xc,yc); + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xc,yf); + end; + end; + + procedure trajet_devie; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_devie then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + with canvas do + begin + pen.color:=couleur; + if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(x0,y0);lineto(xc,yc); + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xc,yf); + end; + end; + +begin + x0:=(x-1)*LargeurCell[indexTCO]; // x origine + y0:=(y-1)*hauteurCell[indexTCO]; // y origine + yc:=y0+(hauteurCell[indexTCO] div 2); // y centre + xc:=x0+(LargeurCell[indexTCO] div 2); // x centre + xf:=x0+LargeurCell[indexTCO]; // x fin + yf:=y0+hauteurCell[indexTCO]; // y fin + position:=position_Aig_TCO(indexTco,x,y); + ep:=tco[indextco,x,y].epaisseurs; + fond:=tco[indextco,x,y].CouleurFond; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=fond; + Pen.Color:=Fond;; + + Pen.Width:=epaisseur; + Brush.Color:=clVoies[indexTCO]; + Pen.Color:=clVoies[indexTCO]; + Pen.Mode:=pmCopy; + + if mode>0 then + begin + if (position=const_devie) or (position=const_inconnu) then + begin + trajet_droit; + trajet_devie; + end; + if (position=const_droit) then + begin + trajet_devie; + trajet_droit; + end; + end + + else + begin + trajet_devie; + trajet_droit; + end; + + if (position=const_Devie) then + begin + if not(affposFil) then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.width:=1; + jy1:=yc - Epaisseur-1; + jx1:=xc-(Epaisseur div 2); + pen.width:=1; + Polygon([point(jx1,jy1),Point(jx1+epaisseur,jy1+epaisseur),Point(jx1+epaisseur,jy1-epaisseur),Point(jx1,jy1-epaisseur)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(xc,yf);LineTo(xc,yc);LineTo(x0,y0); + end; + end; + + if position=const_droit then + begin + if not(affposFil) then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.Width:=1; + jx1:=xc-(Epaisseur div 2); // pos Y de la bande inf + r:=rect(jx1,yc-10,jx1-Epaisseur,yc+10); + FillRect(r); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(xc,yf);LineTo(xc,y0); + end; + end; + end; +end; + +// Element 24 +procedure dessin_24C(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); +var x0,y0,xc,yc,jx1,jy1,xf,yf,x1,y1,x2,y2,x3,y3,x4,y4,position,ep : integer; + r : Trect; + fond: tcolor; + +procedure trajet_droit; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_droit then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(xc,y0);lineto(xc,yc); + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xc,yf); // partie droite + end; + end; + + procedure trajet_devie; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_devie then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + Arc(x1,y1,x2,y2,x3,y3,x4,y4); //courbe + end; + end; + +begin + x0:=(x-1)*LargeurCell[indexTCO]; // x origine + y0:=(y-1)*hauteurCell[indexTCO]; // y origine + yc:=y0+(hauteurCell[indexTCO] div 2); // y centre + xc:=x0+(LargeurCell[indexTCO] div 2); // x centre + xf:=x0+LargeurCell[indexTCO]; // x fin + yf:=y0+hauteurCell[indexTCO]; // y fin + position:=position_Aig_TCO(indexTco,x,y); + fond:=tco[indextco,x,y].CouleurFond; + ep:=tco[indextco,x,y].epaisseurs; + + // mode rond + x1:=x0-(2*LargeurCell[indexTCO])-(LargeurCell[indexTCO] div 2);y1:=y0-(hauteurCell[indexTCO] div 3); + x2:=x0+(LargeurCell[indexTCO] div 2);y2:=yf+hauteurCell[indexTCO]+(hauteurCell[indexTCO] div 3); + x3:=xc;y3:=yf; + x4:=x0;y4:=y0; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=fond; + Pen.Color:=Fond;; + + Pen.Width:=epaisseur; + Brush.Color:=clVoies[indexTCO]; + Pen.Color:=clVoies[indexTCO]; + Pen.Mode:=pmCopy; + + if mode>0 then + begin + if (position=const_devie) or (position=const_inconnu) then + begin + trajet_droit; + trajet_devie; + end; + if (position=const_droit) then + begin + trajet_devie; + trajet_droit; + end; + end + + else + begin + trajet_devie; + trajet_droit; + end; + + + if (position=const_Devie) then + begin + if not(affPosFil) then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.width:=1; + jx1:=xc-(Epaisseur div 2); jy1:=yc - Epaisseur+5; + pen.width:=1; + Polygon([point(jx1,jy1),Point(jx1+epaisseur,jy1+epaisseur+10),Point(jx1+epaisseur,jy1-epaisseur),Point(jx1,jy1-epaisseur)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + //moveTo(xc,yf);LineTo(xc,yc+round(8*fryGlob[indexTCO]));LineTo(x0,y0); + Arc(x1,y1,x2,y2,x3,y3,x4,y4); + end; + end; + + if position=const_droit then + begin + if not(affPosFil) then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.Width:=1; + jx1:=xc-(Epaisseur div 2); // pos Y de la bande inf + r:=rect(jx1,yc-15,jx1-Epaisseur,yf); + FillRect(r); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(xc,yf);LineTo(xc,y0); + end; + end; + end; +end; + + +procedure dessin_24(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); +begin + if graphisme=1 then dessin_24L(indexTco,Canvas,x,y,Mode); + if graphisme=2 then dessin_24C(indexTco,Canvas,x,y,Mode); +end; + +// Element 25 croisement +procedure dessin_25(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); +var xp,x0,y0,x3,y3,x4,y4,xf,yf,xc,yc,trajet,ep,pont,x1,x2,y1,y2, + adr1,adr2,index1,index2,position1,position2,EtatTJD,sHG,sBD : integer; + a1,b1,a2,b2 : single; + md,tHG,tBD : tEquipement; + fond : tcolor; + procedure verticale; + begin + with canvas do + begin + if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveTo(xc,y0);LineTo(xc,yc); + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + LineTo(xc,yf); + end; + end; + + procedure diagonale; + begin + with canvas do + begin + if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveTo(x0,y0);LineTo(xc,yc); + if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + LineTo(xf,yf); + end; + end; + + procedure tjd_g(dessin : integer); + begin + x1:=x0-(2*LargeurCell[indexTCO])-(LargeurCell[indexTCO] div 2);y1:=y0-(hauteurCell[indexTCO] div 3); + x2:=x0+(LargeurCell[indexTCO] div 2);y2:=yf+hauteurCell[indexTCO]+(hauteurCell[indexTCO] div 3); + x3:=xc;y3:=yf; + x4:=x0;y4:=y0; + ep:=tco[indextco,x,y].epaisseurs; + + with canvas do + begin + if dessin=1 then + begin + if testbit(ep,0) or testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + end; + Arc(x1,y1,x2,y2,x3,y3,x4,y4); + end; + end; + + procedure tjd_d(dessin : integer); + begin + x1:=x0+(LargeurCell[indexTCO] div 2);y1:=y0-hauteurCell[indexTCO]-(hauteurCell[indexTCO] div 3); + x2:=xf+(2*LargeurCell[indexTCO])+(LargeurCell[indexTCO] div 2);y2:=yf+round(hauteurCell[indexTCO] / 3); + x3:=xc;y3:=y0; + x4:=xf;y4:=yf; + ep:=tco[indextco,x,y].epaisseurs; + + with canvas do + begin + if dessin=1 then + begin + if testbit(ep,1) or testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + end; + Arc(x1,y1,x2,y2,x3,y3,x4,y4); + end; + end; + +begin + x0:=(x-1)*LargeurCell[indexTCO]; + y0:=(y-1)*hauteurCell[indexTCO]; + xc:=x0+(LargeurCell[indexTCO] div 2); + yc:=y0+(hauteurCell[indexTCO] div 2); + xf:=x0+LargeurCell[indexTCO]; + yf:=y0+hauteurCell[indexTCO]; + ep:=tco[indextco,x,y].epaisseurs; + pont:=tco[indextco,x,y].pont; + fond:=tco[indexTco,x,y].CouleurFond; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=tco[indextco,x,y].CouleurFond; + //r:=Rect(x0,y0,x0+LargeurCell[indexTCO],y0+hauteurCell[indexTCO]); + //FillRect(r); + + Brush.Color:=clvoies[indexTCO]; + pen.color:=clvoies[indexTCO]; + pen.width:=epaisseur; + + verticale; + diagonale; + md:=aiguillage[index_aig(tco[indextco,x,y].Adresse)].modele; + if (md=tjd) or (md=tjs) then + begin + tjd_g(1); + tjd_d(1); + end; + + // verticale + if testbit(pont,1) or testbit(pont,5) then + begin + // masquages + pen.color:=clfond[indexTCO]; + xp:=xc-(epaisseur); + moveto(xp,y0+epaisseur);lineTo(xp,yf-epaisseur); + xp:=xc+(epaisseur); + moveto(xp,y0+epaisseur);lineTo(xp,yf-epaisseur); + + // barrières du pont + pen.color:=clBarriere[indexTCO]; + pen.Width:=epaisseur div 2; + xp:=xc-(epaisseur); + moveto(xp,y0+epaisseur);lineTo(xp,yf-epaisseur); + xp:=xc+(epaisseur); + moveto(xp,y0+epaisseur);lineTo(xp,yf-epaisseur); + end; + + // diagonale + if testbit(pont,0) or testbit(pont,4) then + begin + pen.color:=clfond[indexTCO]; + equation_droite(x0,y0,xf,yf,a1,b1); + // droite a2,b2 // passant par x2,y2 + a2:=a1; + + // masquage G + x2:=x0+round(8*frxGlob[indexTCO]);y2:=y0+round(18*fryGlob[indexTCO]); + b2:=y2-a2*x2; + x1:=xf-round(18*frxGlob[indexTCO]); + y1:=round(a2*x1+b2); + moveto(x1,y1);lineTo(x2,y2); + + // barrière + pen.width:=epaisseur div 2; + pen.color:=clBarriere[indexTCO]; + x2:=x0+round(8*frxGlob[indexTCO]);y2:=y0+round(18*fryGlob[indexTCO]); + b2:=y2-a2*x2; + x1:=xf-round(18*frxGlob[indexTCO]); + y1:=round(a2*x1+b2); + moveto(x1,y1);lineTo(x2,y2); + + // masquage D + pen.Width:=epaisseur; + pen.color:=clfond[indexTCO]; + x2:=x0+round(20*frxGlob[indexTCO]);y2:=y0+round(11*fryGlob[indexTCO]); + b2:=y2-a2*x2; + x1:=xf-round(8*frxGlob[indexTCO]); + y1:=round(a2*x1+b2); + moveto(x1,y1);lineTo(x2,y2); + + pen.width:=epaisseur div 2; + pen.color:=clBarriere[indexTCO]; + x2:=x0+round(20*frxGlob[indexTCO]);y2:=y0+round(11*fryGlob[indexTCO]); + b2:=y2-a2*x2; + x1:=xf-round(8*frxGlob[indexTCO]); + y1:=round(a2*x1+b2); + moveto(x1,y1);lineTo(x2,y2); + end; + + // regarder d'ou on vient de la route du tco + if mode>0 then + begin + trajet:=tco[indextco,x,y].trajet; + case mode of + 0: couleur:=clVoies[indexTCO]; + 1: couleur:=ClCanton[indexTCO]; + 2: couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + + Brush.Color:=couleur; + pen.color:=couleur; + if trajet=1 then verticale; + if trajet=2 then diagonale; + if trajet=3 then // NO C S + begin + {if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(x0,y0);LineTo(xc,yc); + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineTo(xc,yf);} + tjd_g(1); + end; + if trajet=4 then + begin + {if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(xc,y0);LineTo(xc,yc); + if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineTo(xf,yf);} + tjd_d(1); + end; + end; + end; + + // dessin position de la tjd + adr1:=tco[indexTCO,x,y].Adresse; + Index1:=Index_aig(adr1); + md:=aiguillage[Index1].modele; + if (md=tjd) or (md=tjs) then + begin + EtatTJD:=aiguillage[index1].EtatTJD; // nombre d'états de la tjd (2 ou 4) + position1:=aiguillage[index1].position; + sHG:=TCO[indexTCO,x,y].suivHG;tHG:=TCO[indexTCO,x,y].typHG; + sBD:=TCO[indexTCO,x,y].suivBD;tBD:=TCO[indexTCO,x,y].typBD; + canvas.pen.color:=clfond[indexTCO]; + canvas.pen.Width:=epaisseur div 2; + if etatTJD=4 then + begin + adr2:=aiguillage[index1].DDevie; // homologue + Index2:=Index_aig(adr2); + position2:=aiguillage[index2].position; + + if (position1=const_devie) and (position2=const_devie) then + begin + with canvas do begin + moveTo(x0,y0);LineTo(xf,yf); + end; + end; + + if (position1=const_droit) and (position2=const_droit) then + begin + with canvas do begin + moveTo(xc,yf);LineTo(xc,y0); + end; + end; + + if (position1=const_droit) and (position2=const_devie) then + begin + if tco[indexTCO,x,y].tjdS=adr1 then + {with canvas do begin + moveTo(xc,y0);LineTo(xc,yc);Lineto(xf,yf); + end;} + tjd_d(2); + if tco[indexTCO,x,y].tjdS=adr2 then + {with canvas do begin + moveTo(x0,y0);LineTo(xc,yc);Lineto(xc,yf); + end; } + tjd_g(2); + end; + + if (position1=const_devie) and (position2=const_droit) then + begin + if tco[indexTCO,x,y].tjdS=adr1 then + {with canvas do begin + moveTo(x0,y0);LineTo(xc,yc);Lineto(xc,yf); + end; } + tjd_g(2); + if tco[indexTCO,x,y].tjdS=adr2 then + {with canvas do begin + moveTo(xc,y0);LineTo(xc,yc);Lineto(xf,yf); + end; } + tjd_d(2); + end; + end; + + if etatTJD=2 then + begin + if position1=const_droit then + with canvas do + begin + moveTo(xc,y0);LineTo(xc,yf); + moveTo(x0,y0);LineTo(xf,yf); + end; + if position1=const_devie then + with canvas do + begin + // donne l'équation de droite y=ax+b passant par les points (x1,y1) (x2,y2) + equation_droite(x0,y0,xf,yf,a1,b1); + //gauche + moveTo(xc,yf); LineTo(xc,yc+epaisseur); + LineTo(xc-epaisseur,round((xc-epaisseur)*a1+b1) ); LineTo(x0,y0); + //droite + moveTo(xc,y0); + lineTo(xc,yc-epaisseur); + LineTo(xc+epaisseur,round((xc+epaisseur)*a1+b1) ); + LineTo(xf,yf); + end; + end; + end; +end; + +// Element 26 +procedure dessin_26L(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); +var x0,y0,xc,yc,jx1,jy1,xf,yf,position,ep : integer; + r : Trect; + fond: tcolor; + + procedure trajet_droit; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_droit then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(xc,y0);lineto(xc,yc); + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xc,yf); + end; + end; + + procedure trajet_devie; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_devie then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(xc,yf);lineto(xc,yc); + if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineTo(xf,y0); + end; + end; + +begin + x0:=(x-1)*LargeurCell[indexTCO]; // x origine + y0:=(y-1)*hauteurCell[indexTCO]; // y origine + yc:=y0+(hauteurCell[indexTCO] div 2); // y centre + xc:=x0+(LargeurCell[indexTCO] div 2); // x centre + xf:=x0+LargeurCell[indexTCO]; // x fin + yf:=y0+hauteurCell[indexTCO]; // y fin + position:=position_Aig_TCO(indexTco,x,y); + fond:=tco[indextco,x,y].CouleurFond; + ep:=tco[indextco,x,y].epaisseurs; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=fond; + Pen.Color:=Fond;; + //r:=Rect(x0,y0,xf,yf); + //FillRect(r); // efface la cellule + + Pen.Width:=epaisseur; + Brush.Color:=clVoies[indexTCO]; + Pen.Color:=clVoies[indexTCO]; + Pen.Mode:=pmCopy; + + if mode>0 then + begin + if (position=const_devie) or (position=const_inconnu) then + begin + trajet_droit; + trajet_devie; + end; + if (position=const_droit) then + begin + trajet_devie; + trajet_droit; + end; + end + + else + begin + trajet_devie; + trajet_droit; + end; + + if (position=const_Devie) then + begin + if not affposFil then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.width:=1; + jy1:=yc - 2*Epaisseur-1; + jx1:=xc- (Epaisseur div 2); + pen.width:=1; + Polygon([point(jx1,jy1),Point(jx1+epaisseur,jy1),Point(jx1+epaisseur,jy1+epaisseur),Point(jx1,jy1+2*epaisseur)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(xc,yf);LineTo(xc,yc);LineTo(xf,y0); + end; + end; + + if position=const_droit then + begin + if not affposfil then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.Width:=1; + jx1:=xc+(Epaisseur div 2)+1; + r:=rect(jx1,yc-15,jx1+Epaisseur,yc+10); + FillRect(r); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(xc,yf);LineTo(xc,y0); + end; + end; + end; +end; + +// Element 26 +procedure dessin_26C(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); +var x0,y0,xc,yc,jx1,jy1,xf,yf,x1,y1,x2,y2,x3,y3,x4,y4,position,ep : integer; + r : Trect; + fond: tcolor; + +procedure trajet_droit; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_droit then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(xc,y0);lineto(xc,yc); + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xc,yf); + end; + end; + + procedure trajet_devie; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_devie then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + Arc(x1,y1,x2,y2,x3,y3,x4,y4); //courbe + end; + end; + +begin + x0:=(x-1)*LargeurCell[indexTCO]; // x origine + y0:=(y-1)*hauteurCell[indexTCO]; // y origine + yc:=y0+(hauteurCell[indexTCO] div 2); // y centre + xc:=x0+(LargeurCell[indexTCO] div 2); // x centre + xf:=x0+LargeurCell[indexTCO]; // x fin + yf:=y0+hauteurCell[indexTCO]; // y fin + position:=position_Aig_TCO(indexTco,x,y); + fond:=tco[indextco,x,y].CouleurFond; + ep:=tco[indextco,x,y].epaisseurs; + + // mode rond + x1:=x0+(LargeurCell[indexTCO] div 2);y1:=y0-(hauteurCell[indexTCO] div 3); + x2:=xf+(2*LargeurCell[indexTCO])+(LargeurCell[indexTCO] div 2);y2:=yf+hauteurCell[indexTCO]+(hauteurCell[indexTCO] div 3); + x3:=xf;y3:=y0; + x4:=xc;y4:=yf; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=fond; + Pen.Color:=Fond;; + + Pen.Width:=epaisseur; + Brush.Color:=clVoies[indexTCO]; + Pen.Color:=clVoies[indexTCO]; + Pen.Mode:=pmCopy; + + if mode>0 then + begin + if (position=const_devie) or (position=const_inconnu) then + begin + trajet_droit; + trajet_devie; + end; + if (position=const_droit) then + begin + trajet_devie; + trajet_droit; + end; + end + + else + begin + trajet_devie; + trajet_droit; + end; + + if (position=const_Devie) then + begin + if not AffPosFil then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.width:=1; + jx1:=xc-(Epaisseur div 2); jy1:=yc - Epaisseur-5; + pen.width:=1; + Polygon([point(jx1,jy1),Point(jx1+epaisseur,jy1),Point(jx1+epaisseur,jy1+epaisseur),Point(jx1,jy1+4*epaisseur)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + //moveTo(xc,yf);LineTo(xc,yc+round(4*FryGlob[indexTCO]));LineTo(xf,y0); + Arc(x1,y1,x2,y2,x3,y3,x4,y4); + end; + end; + + if position=const_droit then + begin + if not affposfil then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.Width:=1; + jx1:=xc+(Epaisseur div 2); + r:=rect(jx1+1,yc-15,jx1+Epaisseur,yf); + FillRect(r); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(xc,yf);LineTo(xc,y0); + end; + end; + end; +end; + +procedure dessin_26(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); +begin + if graphisme=1 then dessin_26L(indexTco,Canvas,x,y,Mode); + if graphisme=2 then dessin_26C(indexTco,Canvas,x,y,Mode); +end; + +// Element 27 +procedure dessin_27L(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); +var x0,y0,jx2,jy2,jx3,jy3,xc,yc,jx1,jy1,xf,yf,position,ep : integer; + r : Trect; + fond: tcolor; + + procedure trajet_droit; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_droit then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + pen.color:=couleur; + moveto(xc,y0);lineto(xc,yc); + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xc,yf); + end; + end; + + procedure trajet_devie; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_devie then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(xc,y0);lineto(xc,yc); // verticale complete + if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineTo(x0,yf); + end; + end; + +begin + x0:=(x-1)*LargeurCell[indexTCO]; // x origine + y0:=(y-1)*hauteurCell[indexTCO]; // y origine + yc:=y0+(hauteurCell[indexTCO] div 2); // y centre + xc:=x0+(LargeurCell[indexTCO] div 2); // x centre + xf:=x0+LargeurCell[indexTCO]; // x fin + yf:=y0+hauteurCell[indexTCO]; // y fin + position:=position_Aig_TCO(indexTco,x,y); + fond:=tco[indextco,x,y].CouleurFond; + ep:=tco[indextco,x,y].epaisseurs; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=fond; + Pen.Color:=Fond;; + //r:=Rect(x0,y0,xf,yf); + //FillRect(r); // efface la cellule + + Pen.Width:=epaisseur; + Brush.Color:=clVoies[indexTCO]; + Pen.Color:=clVoies[indexTCO]; + Pen.Mode:=pmCopy; + + if mode>0 then + begin + if (position=const_devie) or (position=const_inconnu) then + begin + trajet_droit; + trajet_devie; + end; + if (position=const_droit) then + begin + trajet_devie; + trajet_droit; + end; + end + + else + begin + trajet_devie; + trajet_droit; + end; + + if (position=const_Devie) then + begin + if not affPosFil then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.width:=1; + jx1:=xc-(Epaisseur div 2); jy1:=yc + Epaisseur+2; + jx2:=jx1+epaisseur;jy2:=jy1-epaisseur; + jx3:=jx2;jy3:=yc+2*epaisseur; + pen.width:=1; + Polygon([point(jx1,jy1),Point(jx2,jy2),Point(jx3,jy3),Point(jx1,jy3)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(xc,y0);LineTo(xc,yc);LineTo(x0,yf); + end; + end; + + if position=const_droit then + begin + if not affposfil then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.Width:=1; + jx1:=xc-(Epaisseur div 2); + r:=rect(jx1,yc-3*epaisseur,jx1-Epaisseur,yf); + FillRect(r); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(xc,y0);LineTo(xc,yf); + end; + end; + end; +end; + +// Element 27c +procedure dessin_27C(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); +var x0,y0,xc,yc,jx1,jy1,jx2,jy2,xf,yf,x1,y1,x2,y2,x3,y3,x4,y4,position,ep, + jx3,jy3 : integer; + r : Trect; + fond: tcolor; + +procedure trajet_droit; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_droit then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + pen.color:=couleur; + moveto(xc,y0);lineto(xc,yc); + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xc,yf); + end; + end; + + procedure trajet_devie; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_devie then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + Arc(x1,y1,x2,y2,x3,y3,x4,y4); //courbe + end; + end; + +begin + x0:=(x-1)*LargeurCell[indexTCO]; // x origine + y0:=(y-1)*hauteurCell[indexTCO]; // y origine + yc:=y0+(hauteurCell[indexTCO] div 2); // y centre + xc:=x0+(LargeurCell[indexTCO] div 2); // x centre + xf:=x0+LargeurCell[indexTCO]; // x fin + yf:=y0+hauteurCell[indexTCO]; // y fin + position:=position_Aig_TCO(indexTco,x,y); + fond:=tco[indextco,x,y].CouleurFond; + ep:=tco[indextco,x,y].epaisseurs; + + // mode rond + x1:=x0-(2*LargeurCell[indexTCO])-(LargeurCell[indexTCO] div 3);y1:=y0-hauteurCell[indexTCO]-(hauteurCell[indexTCO] div 3); + x2:=xc;y2:=yf+round(hauteurCell[indexTCO] / 2.9); + + x3:=x0;y3:=yf; + x4:=xc;y4:=y0; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=fond; + Pen.Color:=Fond;; + + Pen.Width:=epaisseur; + Brush.Color:=clVoies[indexTCO]; + Pen.Color:=clVoies[indexTCO]; + Pen.Mode:=pmCopy; + + if mode>0 then + begin + if (position=const_devie) or (position=const_inconnu) then + begin + trajet_droit; + trajet_devie; + end; + if (position=const_droit) then + begin + trajet_devie; + trajet_droit; + end; + end + + else + begin + trajet_devie; + trajet_droit; + end; + + if (position=const_Devie) then + begin + if not affposfil then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.width:=1; + jx1:=xc-(Epaisseur div 2); jy1:=yc + Epaisseur; + jx2:=jx1+epaisseur;jy2:=jy1-3*epaisseur; + jx3:=jx2;jy3:=yc+2*epaisseur; + pen.width:=1; + Polygon([point(jx1,jy1),Point(jx2,jy2),Point(jx3,jy3),Point(jx1,jy3)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + //moveTo(xc,y0);LineTo(xc,yc-round(4*frxGlob[indexTCO]));LineTo(x0,yf); + Arc(x1,y1,x2,y2,x3,y3,x4,y4); + end; + end; + + if position=const_droit then + begin + if not affposfil then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.Width:=1; + jx1:=xc-(Epaisseur div 2); + r:=rect(jx1,yc-3*epaisseur,jx1-Epaisseur,yf); + FillRect(r); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(xc,y0);LineTo(xc,yf); + end; + end; + end; +end; + +procedure dessin_27(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); +begin + if graphisme=1 then dessin_27L(indexTco,Canvas,x,y,Mode); + if graphisme=2 then dessin_27C(indexTco,Canvas,x,y,Mode); +end; + +// Element 28 +procedure dessin_28L(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); +var x0,y0,jx2,jy2,jx3,jy3,xc,yc,jx1,jy1,xf,yf,position,ep : integer; + r : Trect; + fond: tcolor; + + procedure trajet_droit; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_droit then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + pen.color:=couleur; + moveto(xc,y0);lineto(xc,yc); + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xc,yf); + end; + end; + + procedure trajet_devie; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_devie then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(xc,y0);lineto(xc,yc); + if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineTo(xf,yf); + end; + end; + + +begin + x0:=(x-1)*LargeurCell[indexTCO]; // x origine + y0:=(y-1)*hauteurCell[indexTCO]; // y origine + yc:=y0+(hauteurCell[indexTCO] div 2); // y centre + xc:=x0+(LargeurCell[indexTCO] div 2); // x centre + xf:=x0+LargeurCell[indexTCO]; // x fin + yf:=y0+hauteurCell[indexTCO]; // y fin + position:=position_aig_TCO(indexTco,x,y); + fond:=tco[indextco,x,y].CouleurFond; + ep:=tco[indextco,x,y].epaisseurs; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=fond; + Pen.Color:=Fond;; + Pen.Width:=epaisseur; + Brush.Color:=clVoies[indexTCO]; + Pen.Color:=clVoies[indexTCO]; + Pen.Mode:=pmCopy; + + if mode>0 then + begin + if (position=const_Devie) or (position=const_inconnu) then + begin + trajet_droit; + trajet_devie; // affiche la position de la branche déviée + end; + + if (position=const_droit) then + begin + trajet_devie; + trajet_droit; + end; + end + else + begin + trajet_devie; + trajet_droit; + end; + + if (position=const_Devie) then + begin + if not(AffPoSFil) then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.width:=1; + jx1:=xc-(Epaisseur div 2); jy1:=yc + (Epaisseur div 2); + jx2:=jx1+epaisseur;jy2:=jy1+epaisseur; + jx3:=jx2;jy3:=yc+2*epaisseur; + pen.width:=1; + Polygon([point(jx1,jy1),Point(jx2,jy2),Point(jx3,jy3),Point(jx1,jy3)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(xc,y0);LineTo(xc,yc);LineTo(xf,yf); + end; + end; + + if position=const_droit then + begin + if not(AffPoSFil) then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.Width:=1; + jx1:=xc+(Epaisseur div 2); + r:=rect(jx1,yc-3*epaisseur,jx1+Epaisseur,yf); + FillRect(r); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(xc,y0);LineTo(xc,yf); + end; + end; + end; +end; + +// Element 28 +procedure dessin_28C(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); +var x0,y0,xc,yc,jx1,jy1,jx2,jy2,xf,yf,x1,y1,x2,y2,x3,y3,x4,y4,position,ep, + jx3,jy3 : integer; + r : Trect; + fond: tcolor; + +procedure trajet_droit; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_droit then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + pen.color:=couleur; + moveto(xc,y0);lineto(xc,yc); + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xc,yf); + end; + end; + + procedure trajet_devie; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_devie then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + Arc(x1,y1,x2,y2,x3,y3,x4,y4); //courbe + end; + end; + +begin + x0:=(x-1)*LargeurCell[indexTCO]; // x origine + y0:=(y-1)*hauteurCell[indexTCO]; // y origine + yc:=y0+(hauteurCell[indexTCO] div 2); // y centre + xc:=x0+(LargeurCell[indexTCO] div 2); // x centre + xf:=x0+LargeurCell[indexTCO]; // x fin + yf:=y0+hauteurCell[indexTCO]; // y fin + position:=position_aig_TCO(indexTco,x,y); + fond:=tco[indextco,x,y].CouleurFond; + ep:=tco[indextco,x,y].epaisseurs; + + // mode rond + x1:=x0+(LargeurCell[indexTCO] div 2);y1:=y0-hauteurCell[indexTCO]-(hauteurCell[indexTCO] div 3); + x2:=xf+(2*LargeurCell[indexTCO])+(LargeurCell[indexTCO] div 2);y2:=yf+(hauteurCell[indexTCO] div 3); + x3:=xc;y3:=y0; + x4:=xf;y4:=yf; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=fond; + Pen.Color:=Fond;; + + Pen.Width:=epaisseur; + Brush.Color:=clVoies[indexTCO]; + Pen.Color:=clVoies[indexTCO]; + Pen.Mode:=pmCopy; + + if mode>0 then + begin + if (position=const_devie) or (position=const_inconnu) then + begin + trajet_droit; + trajet_devie; + end; + if (position=const_droit) then + begin + trajet_devie; + trajet_droit; + end; + end + + else + begin + trajet_devie; + trajet_droit; + end; + + + if (position=const_Devie) then + begin + if not(affPosFil) then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.width:=1; + jx1:=xc-(Epaisseur div 2); jy1:=yc - (2*Epaisseur ); + jx2:=jx1+epaisseur;jy2:=yc+epaisseur; + jx3:=jx2;jy3:=yc+2*epaisseur; + pen.width:=1; + Polygon([point(jx1,jy1),Point(jx2,jy2),Point(jx3,jy3),Point(jx1,jy3)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + //moveTo(xc,y0);LineTo(xc,yc-round(4*fryGlob[indexTCO]));LineTo(xf,yf); + Arc(x1,y1,x2,y2,x3,y3,x4,y4); + end; + end; + + if position=const_droit then + begin + if not(affPosFil) then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.Width:=1; + jx1:=xc+(Epaisseur div 2); + r:=rect(jx1,yc-3*epaisseur,jx1+Epaisseur,yf); + FillRect(r); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(xc,y0);LineTo(xc,yf); + end; + end; + end; +end; + +procedure dessin_28(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); +begin + if graphisme=1 then dessin_28L(indexTco,Canvas,x,y,Mode); + if graphisme=2 then dessin_28C(indexTco,Canvas,x,y,Mode); +end; + +// Element 29 +procedure dessin_29L(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); +var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,y4,position,ep : integer; + fond : tcolor; + + procedure trajet_droit; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_droit then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + pen.color:=couleur; + moveto(x0,y0);lineto(xc,yc); + if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xf,yf); + end; + end; + + procedure trajet_devie; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_devie then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(x0,y0);lineto(xc,yc); + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xc,yf); + end; + end; + + +begin + x0:=(x-1)*LargeurCell[indexTCO]; // x origine + y0:=(y-1)*hauteurCell[indexTCO]; // y origine + yc:=y0+(hauteurCell[indexTCO] div 2); // y centre + xc:=x0+(LargeurCell[indexTCO] div 2); // x centre + xf:=x0+LargeurCell[indexTCO]; // x fin + yf:=y0+hauteurCell[indexTCO]; // y fin + position:=position_aig_TCO(indexTco,x,y); + fond:=tco[indextco,x,y].CouleurFond; + ep:=tco[indextco,x,y].epaisseurs; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=fond; + Pen.Color:=fond; + Pen.Width:=epaisseur; + Brush.Color:=clVoies[indexTCO]; + Pen.Color:=clVoies[indexTCO]; + Pen.Mode:=pmCopy; + + if mode>0 then + begin + if (position=const_Devie) or (position=const_inconnu) then + begin + trajet_droit; + trajet_devie; // affiche la position de la branche déviée + end; + + if (position=const_droit) then + begin + trajet_devie; + trajet_droit; + end; + end + + else + + begin + trajet_devie; + trajet_droit; + end; + + if (position=const_Devie) then + begin + if not(AffPosFil) then + begin + // effacement du morceau + pen.width:=1; + x1:=xc+(epaisseur div 2)+1;y1:=yc-epaisseur; + x2:=x1+epaisseur;y2:=y1; + x3:=x2;y3:=y2+4*epaisseur; + x4:=x1;y4:=y3; + pen.color:=fond; + Brush.Color:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(x0,y0);lineTo(xc,yc);LineTo(xc,yf); + end; + end; + if position=const_droit then + begin + if not(AffPosFil) then + begin + // effacement du morceau + pen.Width:=1; + x1:=xc-(epaisseur div 2);y1:=yc+(epaisseur div 2); + x2:=x1+epaisseur;y2:=y1+epaisseur; + x3:=x2;y3:=y2+(epaisseur div 2); + x4:=x1;y4:=y3; + pen.color:=fond; + Brush.Color:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(x0,y0);LineTo(xf,yf); + end; + end; + end; +end; + +procedure dessin_29C(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); +var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,y4,position,ep : integer; + fond : tcolor; + procedure trajet_droit; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_droit then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(x0,y0);lineto(xc,yc); + if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xf,yf); + end; + end; + + procedure trajet_devie; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_devie then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + Arc(x1,y1,x2,y2,x3,y3,x4,y4); //courbe + end; + end; + +begin + x0:=(x-1)*LargeurCell[indexTCO]; // x origine + y0:=(y-1)*hauteurCell[indexTCO]; // y origine + yc:=y0+(hauteurCell[indexTCO] div 2); // y centre + xc:=x0+(LargeurCell[indexTCO] div 2); // x centre + xf:=x0+LargeurCell[indexTCO]; // x fin + yf:=y0+hauteurCell[indexTCO]; // y fin + // mode rond + x1:=x0-(2*LargeurCell[indexTCO])-(LargeurCell[indexTCO] div 2);y1:=y0-(hauteurCell[indexTCO] div 3); + x2:=x0+(LargeurCell[indexTCO] div 2);y2:=yf+hauteurCell[indexTCO]+(hauteurCell[indexTCO] div 3); + x3:=xc;y3:=yf; + x4:=x0;y4:=y0; + ep:=tco[indextco,x,y].epaisseurs; + + position:=position_aig_TCO(indexTco,x,y); + fond:=tco[indextco,x,y].CouleurFond; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=fond; + Pen.Color:=fond; + Pen.Width:=epaisseur; + Brush.Color:=clVoies[indexTCO]; + Pen.Color:=clVoies[indexTCO]; + Pen.Mode:=pmCopy; + + if mode>0 then + begin + if (position=const_devie) or (position=const_inconnu) then + begin + trajet_droit; + trajet_devie; + end; + if (position=const_droit) then + begin + trajet_devie; + trajet_droit; + end; + end + + else + begin + trajet_devie; + trajet_droit; + end; + + if (position=const_Devie) then + begin + if not(AffPosFil) then + begin + // effacement du morceau + pen.width:=1; + x1:=xc-round(epaisseur*1);y1:=yc-round(2.2*epaisseur); + x2:=xc+round(epaisseur*0.7);y2:=y1; + x3:=x2-round(epaisseur*0.2);y3:=yc+round(1.8*epaisseur); + x4:=x1;y4:=yc-round(1.5*epaisseur); + pen.color:=fond; + Brush.Color:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + //moveTo(x0,y0);LineTo(xc-round(6*FrxGlob[indexTCO]),yc);LineTo(xc,yf); + Arc(x1,y1,x2,y2,x3,y3,x4,y4); + end; + end; + + if position=const_droit then + begin + if not(AffPosFil) then + begin + // effacement du morceau + pen.Width:=1; + x1:=xc-round(epaisseur*2.3);y1:=yc-round(epaisseur*1.4); + x2:=x1+3*epaisseur;y2:=y1+3*epaisseur; + x3:=x2;y3:=y2+(epaisseur div 2); + x4:=x1;y4:=y3; + pen.color:=fond; + Brush.Color:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(x0,y0);LineTo(xf,yf); + end; + end; + end; +end; + +procedure dessin_29(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); +begin + if graphisme=1 then dessin_29L(indexTco,Canvas,x,y,Mode); + if graphisme=2 then dessin_29C(indexTco,Canvas,x,y,Mode); +end; + +// Elément 32 +procedure dessin_32L(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); +var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,position,ep : integer; + r : Trect; + fond : tcolor; + + procedure trajet_droit; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_droit then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(xf,y0);lineto(xc,yc); + if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(x0,yf); + end; + end; + + procedure trajet_devie; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_devie then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(xf,y0);lineto(xc,yc); + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xc,yf); + end; + end; + + +begin + x0:=(x-1)*LargeurCell[indexTCO]; // x origine + y0:=(y-1)*hauteurCell[indexTCO]; // y origine + yc:=y0+(hauteurCell[indexTCO] div 2); // y centre + xc:=x0+(LargeurCell[indexTCO] div 2); // x centre + xf:=x0+LargeurCell[indexTCO]; // x fin + yf:=y0+hauteurCell[indexTCO]; // y fin + position:=position_aig_TCO(indexTco,x,y); + fond:=tco[indextco,x,y].CouleurFond; + ep:=tco[indextco,x,y].epaisseurs; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=fond; + Pen.Color:=fond; + Pen.Width:=epaisseur; + Brush.Color:=clVoies[indexTCO]; + Pen.Color:=clVoies[indexTCO]; + Pen.Mode:=pmCopy; + + if mode>0 then + begin + if (position=const_devie) or (position=const_inconnu) then + begin + trajet_droit; + trajet_devie; + end; + if (position=const_droit) then + begin + trajet_devie; + trajet_droit; + end; + end + + else + begin + trajet_devie; + trajet_droit; + end; + + if (position=const_Devie) then + begin + if not affposfil then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.width:=1; + x1:=xc-round(1.5*epaisseur);y1:=yc-(epaisseur)+1; + x2:=xc-(epaisseur div 2);y2:=y1+4*epaisseur; + r:=rect(x1,y1,x2,y2); + rectangle(r); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(xf,y0);LineTo(xc,yc);LineTo(xc,yf); + end; + end; + + if position=const_droit then + begin + if not affposfil then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.width:=1; + x1:=xc+round(0.9*epaisseur);y1:=yc; + x2:=x1+round(1.0*epaisseur); + x3:=xc-round(0.5*epaisseur);y3:=y1+round(2.2*epaisseur); + x4:=x3-round(0.9*epaisseur); + polygon([point(x1,y1),point(x2,y1),point(x3,y3),point(x4,y3)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(xf,y0);LineTo(x0,yf); + end; + end; + end; +end; + +procedure dessin_32C(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); +var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,y4,position,ep : integer; + fond : tcolor; + + procedure trajet_droit; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_droit then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(xf,y0);lineto(xc,yc); + if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(x0,yf); + end; + end; + + procedure trajet_devie; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_devie then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + Arc(x1,y1,x2,y2,x3,y3,x4,y4); //courbe + end; + end; + +begin + x0:=(x-1)*LargeurCell[indexTCO]; // x origine + y0:=(y-1)*hauteurCell[indexTCO]; // y origine + yc:=y0+(hauteurCell[indexTCO] div 2); // y centre + xc:=x0+(LargeurCell[indexTCO] div 2); // x centre + xf:=x0+LargeurCell[indexTCO]; // x fin + yf:=y0+hauteurCell[indexTCO]; // y fin + // mode rond + x1:=x0+(LargeurCell[indexTCO] div 2);y1:=y0-(hauteurCell[indexTCO] div 3); + x2:=xf+(2*LargeurCell[indexTCO])+(LargeurCell[indexTCO] div 2);y2:=yf+hauteurCell[indexTCO]+(hauteurCell[indexTCO] div 3); + x3:=xf;y3:=y0; + x4:=xc;y4:=yf; + + position:=position_aig_TCO(indexTco,x,y); + fond:=tco[indextco,x,y].CouleurFond; + ep:=tco[indextco,x,y].epaisseurs; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=fond; + Pen.Color:=fond; + + Pen.Width:=epaisseur; + Brush.Color:=clVoies[indexTCO]; + Pen.Color:=clVoies[indexTCO]; + Pen.Mode:=pmCopy; + + if mode>0 then + begin + if (position=const_devie) or (position=const_inconnu) then + begin + trajet_droit; + trajet_devie; + end; + if (position=const_droit) then + begin + trajet_devie; + trajet_droit; + end; + end + + else + begin + trajet_devie; + trajet_droit; + end; + + + if (position=const_Devie) then + begin + if not affposfil then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.width:=1; + x1:=xc-round(0.7*epaisseur);y1:=yc-round(1.6*epaisseur); + x2:=xc+round(0.9*epaisseur);y2:=y1; + x3:=xc-round(0.3*epaisseur);y3:=yc+round(1.4*epaisseur); + x4:=xc-round(0.7*epaisseur);y4:=y3; + polygon([point(x1,y1),point(x2,y2),point(x3,y3),point(x4,y4)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + //moveTo(xf,y0);LineTo(xc+round(4*frxGlob[indexTCO]),yc);LineTo(xc,yf); + Arc(x1,y1,x2,y2,x3,y3,x4,y4); + end; + end; + + if position=const_droit then + begin + if not affposfil then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.width:=1; + x1:=xc+round(2.8*epaisseur);y1:=yc-(2*epaisseur); + x2:=xc+(4*epaisseur); + x3:=xc+(1*epaisseur);y3:=yc+(epaisseur); + x4:=xc-round(0.2*epaisseur);y4:=y3; + polygon([point(x1,y1),point(x2,y1),point(x3,y3),point(x4,y4)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(xf,y0);LineTo(x0,yf); + end; + end; + end; +end; + +procedure dessin_32(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); +begin + if graphisme=1 then dessin_32L(indexTco,Canvas,x,y,Mode); + if graphisme=2 then dessin_32C(indexTco,Canvas,x,y,Mode); +end; + +// Element 33 +procedure dessin_33L(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); +var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,y4,position,ep : integer; + r : Trect; + fond : tcolor; + + procedure trajet_droit; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_droit then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + pen.color:=couleur; + moveto(x0,y0);lineto(xc,yc); + if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xf,yf); + end; + end; + + procedure trajet_devie; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_devie then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(xf,yf);lineto(xc,yc); + if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xc,y0); + end; + end; + + +begin + x0:=(x-1)*LargeurCell[indexTCO]; // x origine + y0:=(y-1)*hauteurCell[indexTCO]; // y origine + yc:=y0+(hauteurCell[indexTCO] div 2); // y centre + xc:=x0+(LargeurCell[indexTCO] div 2); // x centre + xf:=x0+LargeurCell[indexTCO]; // x fin + yf:=y0+hauteurCell[indexTCO]; // y fin + position:=position_aig_TCO(indexTco,x,y); + fond:=tco[indextco,x,y].CouleurFond; + ep:=tco[indextco,x,y].epaisseurs; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=fond; + Pen.Color:=fond; + //r:=Rect(x0,y0,xf,yf); + //FillRect(r); // efface la cellule + + Pen.Width:=epaisseur; + Brush.Color:=clVoies[indexTCO]; + Pen.Color:=clVoies[indexTCO]; + Pen.Mode:=pmCopy; + + if mode>0 then + begin + if (position=const_devie) or (position=const_inconnu) then + begin + trajet_droit; + trajet_devie; + end; + if (position=const_droit) then + begin + trajet_devie; + trajet_droit; + end; + end + + else + begin + trajet_devie; + trajet_droit; + end; + + if (position=const_Devie) then + begin + if not(affPosFil) then + begin + // effacement du morceau + pen.width:=1; + x1:=xc-2*epaisseur;y1:=yc-(3*epaisseur); + x2:=xc-(epaisseur div 2);y2:=yc+epaisseur; + pen.color:=fond; + Brush.Color:=fond; + r:=rect(x1,y1,x2,y2); + rectangle(r); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(xf,yf);lineTo(x0,y0); + end; + end; + + if position=const_droit then + begin + if not(affPosFil) then + begin + // effacement du morceau + pen.Width:=1; + x1:=xc-round(1.3*epaisseur);y1:=yc-(2*epaisseur) ; + x2:=xc+round(0.6*epaisseur);y2:=y1; + x3:=xc+round(2.5*epaisseur);y3:=yc+(epaisseur div 2); + x4:=xc+round(1.2*epaisseur);y4:=y3; + pen.color:=fond; + Brush.Color:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(xf,yf);LineTo(xc,yc);LineTo(xc,y0); + end; + end; + end; +end; + +procedure dessin_33c(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); +var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,y4,position,ep : integer; + r : Trect; + fond : tcolor; + + procedure trajet_droit; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_droit then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(x0,y0);lineto(xc,yc); + if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xf,yf); + end; + end; + + procedure trajet_devie; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_devie then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + Arc(x1,y1,x2,y2,x3,y3,x4,y4); //courbe + end; + end; + +begin + x0:=(x-1)*LargeurCell[indexTCO]; // x origine + y0:=(y-1)*hauteurCell[indexTCO]; // y origine + yc:=y0+(hauteurCell[indexTCO] div 2); // y centre + xc:=x0+(LargeurCell[indexTCO] div 2); // x centre + xf:=x0+LargeurCell[indexTCO]; // x fin + yf:=y0+hauteurCell[indexTCO]; // y fin + // mode rond + x1:=x0+(LargeurCell[indexTCO] div 2);y1:=y0-hauteurCell[indexTCO]-(hauteurCell[indexTCO] div 3); + x2:=xf+(2*LargeurCell[indexTCO])+(LargeurCell[indexTCO] div 2);y2:=yf+(hauteurCell[indexTCO] div 3); + x3:=xc;y3:=y0; + x4:=xf;y4:=yf; + ep:=tco[indextco,x,y].epaisseurs; + + position:=position_aig_TCO(indexTco,x,y); + fond:=tco[indextco,x,y].CouleurFond; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=fond; + Pen.Color:=fond; + //r:=Rect(x0,y0,xf,yf); + //FillRect(r); // efface la cellule + + Pen.Width:=epaisseur; + Brush.Color:=clVoies[indexTCO]; + Pen.Color:=clVoies[indexTCO]; + Pen.Mode:=pmCopy; + + if mode>0 then + begin + if (position=const_devie) or (position=const_inconnu) then + begin + trajet_droit; + trajet_devie; + end; + if (position=const_droit) then + begin + trajet_devie; + trajet_droit; + end; + end + + else + begin + trajet_devie; + trajet_droit; + end; + + if (position=const_Devie) then + begin + if not(AffPosFil) then + begin + // effacement du morceau + pen.width:=1; + x1:=xc-round(1.5*epaisseur);y1:=yc-round(2.5*epaisseur); + x2:=xc-round(0.6*epaisseur);y2:=y1; + x3:=xc+round(1.3*epaisseur);y3:=yc+2*epaisseur; + x4:=xc+round(0.4*epaisseur);y4:=y3; + pen.color:=fond; + Brush.Color:=fond; + r:=rect(x1,y1,x2,y2); + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + //moveTo(xf,yf);LineTo(xc+round(4*FrxGlob[indexTCO]),yc);LineTo(xc,y0); + Arc(x1,y1,x2,y2,x3,y3,x4,y4); + end; + end; + + if position=const_droit then + begin + if not(AffPosFil) then + begin + // effacement du morceau + pen.Width:=1; + x1:=xc-round(1.3*epaisseur);y1:=yc-(2*epaisseur); + x2:=xc+round(0.9*epaisseur);y2:=y1; + x3:=xc+round(3.5*epaisseur);y3:=yc+2*epaisseur; + x4:=xc+round(2.9*epaisseur);y4:=y3; + pen.color:=fond; + Brush.Color:=fond; + Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(x0,y0);LineTo(xf,yf); + end; + end; + end; +end; + +procedure dessin_33(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); +begin + if graphisme=1 then dessin_33L(indexTco,Canvas,x,y,Mode); + if graphisme=2 then dessin_33C(indexTco,Canvas,x,y,Mode); +end; + +// Element 34 +procedure dessin_34L(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); +var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,y4,position,ep : integer; + fond : Tcolor; + + procedure trajet_droit; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_droit then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + pen.color:=couleur; + moveto(x0,yf);lineto(xc,yc); + if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xf,y0); + end; + end; + + procedure trajet_devie; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_devie then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(x0,yf);lineto(xc,yc); // diag complete + if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xc,y0); // partie droite + end; + end; + +begin + x0:=(x-1)*LargeurCell[indexTCO]; // x origine + y0:=(y-1)*hauteurCell[indexTCO]; // y origine + yc:=y0+(hauteurCell[indexTCO] div 2); // y centre + xc:=x0+(LargeurCell[indexTCO] div 2); // x centre + xf:=x0+LargeurCell[indexTCO]; // x fin + yf:=y0+hauteurCell[indexTCO]; // y fin + position:=position_aig_TCO(indexTco,x,y); + fond:=tco[indextco,x,y].CouleurFond; + ep:=tco[indextco,x,y].epaisseurs; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=fond; + Pen.Color:=fond; + Pen.Width:=epaisseur; + Brush.Color:=clVoies[indexTCO]; + Pen.Color:=clVoies[indexTCO]; + Pen.Mode:=pmCopy; + + if mode>0 then + begin + if (position=const_Devie) or (position=const_inconnu) then + begin + trajet_droit; + trajet_devie; // affiche la position de la branche déviée + end; + + if (position=const_droit) then + begin + trajet_devie; + trajet_droit; + end; + end + else + begin + trajet_devie; + trajet_droit; + end; + + if (position=const_Devie) then + begin + if not affposFil then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.width:=1; + x1:=xc+round(0.5*epaisseur);y1:=yc-round(3*epaisseur); + x2:=xc+round(1.5*epaisseur);y2:=yc+epaisseur; + polygon([point(x1,y1),point(x2,y1),point(x2,y2),point(x1,y2)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(x0,yf);LineTo(xc,yc);LineTo(xc,y0); + end; + end; + + if position=const_droit then + begin + if not affposfil then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.Width:=1; + x1:=xc-round(0.5*epaisseur);y1:=yc-round(2*epaisseur); + x2:=xc+round(0.5*epaisseur);y2:=y1; + x3:=x2;y3:=yc-round(1.3*epaisseur); + x4:=x1;y4:=yc-round(0.3*epaisseur); + polygon([point(x1,y1),point(x2,y2),point(x3,y3),point(x4,y4)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(x0,yf);LineTo(xf,y0); + end; + end; + end; +end; + +procedure dessin_34C(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); +var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,y4,position,ep : integer; + fond : Tcolor; + +procedure trajet_droit; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_droit then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + moveto(x0,yf);lineto(xc,yc); + if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + lineto(xf,y0); + end; + end; + + procedure trajet_devie; + begin + couleur:=clvoies[indexTCO]; + if mode>0 then + begin + if position=const_devie then + begin + if mode=1 then couleur:=clcanton[indexTCO]; + if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; + end; + end; + + with canvas do + begin + pen.color:=couleur; + if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; + Arc(x1,y1,x2,y2,x3,y3,x4,y4); //courbe + end; + end; + +begin + x0:=(x-1)*LargeurCell[indexTCO]; // x origine + y0:=(y-1)*hauteurCell[indexTCO]; // y origine + yc:=y0+(hauteurCell[indexTCO] div 2); // y centre + xc:=x0+(LargeurCell[indexTCO] div 2); // x centre + xf:=x0+LargeurCell[indexTCO]; // x fin + yf:=y0+hauteurCell[indexTCO]; // y fin + // mode rond + x1:=x0-(2*LargeurCell[indexTCO])-(LargeurCell[indexTCO] div 2);y1:=y0-hauteurCell[indexTCO]-(hauteurCell[indexTCO] div 3); + x2:=x0+(LargeurCell[indexTCO] div 2);y2:=yf+(hauteurCell[indexTCO] div 3); + x3:=x0;y3:=yf; + x4:=xc;y4:=y0; + + position:=position_aig_TCO(indexTco,x,y); + fond:=tco[indextco,x,y].CouleurFond; + ep:=tco[indextco,x,y].epaisseurs; + + with canvas do + begin + Pen.Width:=1; + Brush.Color:=fond; + Pen.Color:=fond; + //r:=Rect(x0,y0,xf,yf); + //FillRect(r); // efface la cellule + + Pen.Width:=epaisseur; + Brush.Color:=clVoies[indexTCO]; + Pen.Color:=clVoies[indexTCO]; + Pen.Mode:=pmCopy; + + if mode>0 then + begin + if (position=const_devie) or (position=const_inconnu) then + begin + trajet_droit; + trajet_devie; + end; + if (position=const_droit) then + begin + trajet_devie; + trajet_droit; + end; + end + + else + begin + trajet_devie; + trajet_droit; + end; + + if (position=const_Devie) then + begin + if not affPosFil then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.width:=1; + x1:=xc+round(0.1*epaisseur);y1:=yc-round(1*epaisseur); + x2:=xc+round(2*epaisseur);y2:=y1; + x3:=xc-round(0.5*epaisseur);y3:=yc+round(3*epaisseur); + x4:=xc-round(2*epaisseur);y4:=y3; + polygon([point(x1,y1),point(x2,y2),point(x3,y3),point(x4,y4)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + //moveTo(x0,yf);LineTo(xc-round(6*frxGlob[indexTCO]),yc);LineTo(xc,y0); + Arc(x1,y1,x2,y2,x3,y3,x4,y4); + end; + end; + + if position=const_droit then + begin + if not affposfil then + begin + // effacement du morceau + pen.color:=fond; + Brush.Color:=fond; + pen.Width:=1; + x1:=xc-round(2.3*epaisseur);y1:=yc-round(2*epaisseur); + x2:=xc+round(epaisseur);y2:=y1; + x3:=x2;y3:=yc-round(2*epaisseur); + x4:=x1;y4:=yc+round(1.1*epaisseur); + polygon([point(x1,y1),point(x2,y2),point(x3,y3),point(x4,y4)]); + end + else + begin + pen.color:=fond; + Brush.Color:=fond; + pen.width:=epaisseur div 2; + moveTo(x0,yf);LineTo(xf,y0); + end; + end; + end; +end; + +procedure dessin_34(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); +begin + if graphisme=1 then dessin_34L(indexTco,Canvas,x,y,Mode); + if graphisme=2 then dessin_34C(indexTco,Canvas,x,y,Mode); +end; + +// calcul des facteurs de réductions X et Y pour l'adapter à l'image de destination +procedure calcul_reduction(Var frx,fry : single;DimDestX,DimDestY : integer); +begin + frx:=DimDestX/ZoomMax; + fry:=DimDestY/ZoomMax; + //Affiche(formatfloat('0.000000',frY),clyellow); +end; + + // Element 51 (quai) procedure dessin_Quai(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); var x0,y0,x1,x2,jy1,jy2 : integer; @@ -7361,8 +10259,6 @@ begin // pas d'icone if (trains[indexTrain].icone=nil) or (Trains[indexTrain].Icone.height=0) then exit; - - // ----- prépare l'icone du train hautdest:=round(haut/1.2); @@ -7528,2899 +10424,7 @@ begin dessin_cantonH(indexTCO,Canvas,x,y,mode); end; -// Element 24 -procedure dessin_24L(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); -var x0,y0,xc,yc,jx1,jy1,xf,yf,position,ep : integer; - r : Trect; - fond: tcolor; - procedure trajet_droit; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_droit then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - with canvas do - begin - if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - pen.color:=couleur; - moveto(xc,y0);lineto(xc,yc); - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xc,yf); - end; - end; - - procedure trajet_devie; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_devie then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - with canvas do - begin - pen.color:=couleur; - if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(x0,y0);lineto(xc,yc); - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xc,yf); - end; - end; - -begin - x0:=(x-1)*LargeurCell[indexTCO]; // x origine - y0:=(y-1)*hauteurCell[indexTCO]; // y origine - yc:=y0+(hauteurCell[indexTCO] div 2); // y centre - xc:=x0+(LargeurCell[indexTCO] div 2); // x centre - xf:=x0+LargeurCell[indexTCO]; // x fin - yf:=y0+hauteurCell[indexTCO]; // y fin - position:=positionTCO(indexTco,x,y); - ep:=tco[indextco,x,y].epaisseurs; - fond:=tco[indextco,x,y].CouleurFond; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=fond; - Pen.Color:=Fond;; - - Pen.Width:=epaisseur; - Brush.Color:=clVoies[indexTCO]; - Pen.Color:=clVoies[indexTCO]; - Pen.Mode:=pmCopy; - - if mode>0 then - begin - if (position=const_devie) or (position=const_inconnu) then - begin - trajet_droit; - trajet_devie; - end; - if (position=const_droit) then - begin - trajet_devie; - trajet_droit; - end; - end - - else - begin - trajet_devie; - trajet_droit; - end; - - if (position=const_Devie) then - begin - if not(affposFil) then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.width:=1; - jy1:=yc - Epaisseur-1; - jx1:=xc-(Epaisseur div 2); - pen.width:=1; - Polygon([point(jx1,jy1),Point(jx1+epaisseur,jy1+epaisseur),Point(jx1+epaisseur,jy1-epaisseur),Point(jx1,jy1-epaisseur)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(xc,yf);LineTo(xc,yc);LineTo(x0,y0); - end; - end; - - if position=const_droit then - begin - if not(affposFil) then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.Width:=1; - jx1:=xc-(Epaisseur div 2); // pos Y de la bande inf - r:=rect(jx1,yc-10,jx1-Epaisseur,yc+10); - FillRect(r); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(xc,yf);LineTo(xc,y0); - end; - end; - end; -end; - -// Element 24 -procedure dessin_24C(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); -var x0,y0,xc,yc,jx1,jy1,xf,yf,x1,y1,x2,y2,x3,y3,x4,y4,position,ep : integer; - r : Trect; - fond: tcolor; - -procedure trajet_droit; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_droit then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(xc,y0);lineto(xc,yc); - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xc,yf); // partie droite - end; - end; - - procedure trajet_devie; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_devie then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - Arc(x1,y1,x2,y2,x3,y3,x4,y4); //courbe - end; - end; - -begin - x0:=(x-1)*LargeurCell[indexTCO]; // x origine - y0:=(y-1)*hauteurCell[indexTCO]; // y origine - yc:=y0+(hauteurCell[indexTCO] div 2); // y centre - xc:=x0+(LargeurCell[indexTCO] div 2); // x centre - xf:=x0+LargeurCell[indexTCO]; // x fin - yf:=y0+hauteurCell[indexTCO]; // y fin - position:=positionTCO(indexTco,x,y); - fond:=tco[indextco,x,y].CouleurFond; - ep:=tco[indextco,x,y].epaisseurs; - - // mode rond - x1:=x0-(2*LargeurCell[indexTCO])-(LargeurCell[indexTCO] div 2);y1:=y0-(hauteurCell[indexTCO] div 3); - x2:=x0+(LargeurCell[indexTCO] div 2);y2:=yf+hauteurCell[indexTCO]+(hauteurCell[indexTCO] div 3); - x3:=xc;y3:=yf; - x4:=x0;y4:=y0; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=fond; - Pen.Color:=Fond;; - - Pen.Width:=epaisseur; - Brush.Color:=clVoies[indexTCO]; - Pen.Color:=clVoies[indexTCO]; - Pen.Mode:=pmCopy; - - if mode>0 then - begin - if (position=const_devie) or (position=const_inconnu) then - begin - trajet_droit; - trajet_devie; - end; - if (position=const_droit) then - begin - trajet_devie; - trajet_droit; - end; - end - - else - begin - trajet_devie; - trajet_droit; - end; - - - if (position=const_Devie) then - begin - if not(affPosFil) then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.width:=1; - jx1:=xc-(Epaisseur div 2); jy1:=yc - Epaisseur+5; - pen.width:=1; - Polygon([point(jx1,jy1),Point(jx1+epaisseur,jy1+epaisseur+10),Point(jx1+epaisseur,jy1-epaisseur),Point(jx1,jy1-epaisseur)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - //moveTo(xc,yf);LineTo(xc,yc+round(8*fryGlob[indexTCO]));LineTo(x0,y0); - Arc(x1,y1,x2,y2,x3,y3,x4,y4); - end; - end; - - if position=const_droit then - begin - if not(affPosFil) then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.Width:=1; - jx1:=xc-(Epaisseur div 2); // pos Y de la bande inf - r:=rect(jx1,yc-15,jx1-Epaisseur,yf); - FillRect(r); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(xc,yf);LineTo(xc,y0); - end; - end; - end; -end; - -// Element 23 croisement -procedure dessin_23(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); -var x1,x2,y1,y2,xp,x0,y0,x3,y3,x4,y4,xf,yf,xc,yc,trajet,ep,pont, - adr1,adr2,index1,index2,position1,position2,EtatTJD,sHG,sBD : integer; - a1,b1,a2,b2 : single; - md,tHG,tBD : tEquipement; - fond : tcolor; - procedure verticale; - begin - with canvas do - begin - if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveTo(xc,y0);LineTo(xc,yc); - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - LineTo(xc,yf); - end; - end; - - procedure diagonale; - begin - with canvas do - begin - if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveTo(xf,y0);LineTo(xc,yc); - if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - LineTo(x0,yf); - end; - end; - - procedure tjd_d(dessin : integer); - begin - x1:=x0+(LargeurCell[indexTCO] div 2);y1:=y0-(hauteurCell[indexTCO] div 3); - x2:=xf+(2*LargeurCell[indexTCO])+(LargeurCell[indexTCO] div 2);y2:=yf+hauteurCell[indexTCO]+(hauteurCell[indexTCO] div 3); - x3:=xf;y3:=y0; - x4:=xc;y4:=yf; - ep:=tco[indextco,x,y].epaisseurs; - - with canvas do - begin - if dessin=1 then - begin - if testbit(ep,2) or testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - end; - Arc(x1,y1,x2,y2,x3,y3,x4,y4); - end; - end; - - procedure tjd_G(dessin : integer); - begin - x1:=x0-(2*LargeurCell[indexTCO])-(LargeurCell[indexTCO] div 2);y1:=y0-hauteurCell[indexTCO]-(hauteurCell[indexTCO] div 3); - x2:=x0+(LargeurCell[indexTCO] div 2);y2:=yf+round(hauteurCell[indexTCO] / 2.5); - x3:=x0;y3:=yf; - x4:=xc;y4:=y0; - ep:=tco[indextco,x,y].epaisseurs; - - with canvas do - begin - if dessin=1 then - begin - if testbit(ep,1) or testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - end; - Arc(x1,y1,x2,y2,x3,y3,x4,y4); - end; - end; - -begin - x0:=(x-1)*LargeurCell[indexTCO]; - y0:=(y-1)*hauteurCell[indexTCO]; - xc:=x0+(LargeurCell[indexTCO] div 2); - yc:=y0+(hauteurCell[indexTCO] div 2); - xf:=x0+LargeurCell[indexTCO]; - yf:=y0+hauteurCell[indexTCO]; - ep:=tco[indextco,x,y].epaisseurs; - pont:=tco[indextco,x,y].pont; - fond:=tco[indextco,x,y].CouleurFond; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=tco[indextco,x,y].CouleurFond; - //r:=Rect(x0,y0,x0+LargeurCell[indexTCO],y0+hauteurCell[indexTCO]); - //FillRect(r); - - Brush.Color:=clvoies[indexTCO]; - pen.color:=clvoies[indexTCO]; - pen.width:=epaisseur; - - diagonale; - verticale; - md:=aiguillage[index_aig(tco[indextco,x,y].Adresse)].modele; - if (md=tjd) or (md=tjs) then - begin - tjd_G(1); - tjd_D(1); - end; - - // verticale - if testbit(pont,1) or testbit(pont,5) then - begin - // masquages - pen.color:=clfond[indexTCO]; - xp:=xc-(epaisseur); - moveto(xp,y0+epaisseur);lineTo(xp,yf-epaisseur); - xp:=xc+(epaisseur); - moveto(xp,y0+epaisseur);lineTo(xp,yf-epaisseur); - - // barrières du pont - pen.color:=clBarriere[indexTCO]; - pen.Width:=epaisseur div 2; - xp:=xc-(epaisseur); - moveto(xp,y0+epaisseur);lineTo(xp,yf-epaisseur); - xp:=xc+(epaisseur); - moveto(xp,y0+epaisseur);lineTo(xp,yf-epaisseur); - end; - - // diagonale - if testbit(pont,2) or testbit(pont,6) then - begin - pen.color:=clfond[indexTCO]; - equation_droite(xf,y0,x0,yf,a1,b1); - // droite a2,b2 // passant par x2,y2 - a2:=a1; - - // masquage G - x2:=xf-round(21*frxGlob[indexTCO]);y2:=y0+round(12*fryGlob[indexTCO]); - b2:=y2-a2*x2; - x1:=x0+round(6*frxGlob[indexTCO]); - y1:=round(a2*x1+b2); - moveto(x1,y1);lineTo(x2,y2); - - // barrière - pen.width:=epaisseur div 2; - pen.color:=clBarriere[indexTCO]; - x2:=xf-round(21*frxGlob[indexTCO]);y2:=y0+round(12*fryGlob[indexTCO]); - b2:=y2-a2*x2; - x1:=x0+round(6*frxGlob[indexTCO]); - y1:=round(a2*x1+b2); - moveto(x1,y1);lineTo(x2,y2); - - // masquage D - pen.Width:=epaisseur; - pen.color:=clFond[indexTCO]; - x2:=xf-round(10*frxGlob[indexTCO]);y2:=y0+round(18*fryGlob[indexTCO]); - b2:=y2-a2*x2; - x1:=x0+round(16*frxGlob[indexTCO]); - y1:=round(a2*x1+b2); - moveto(x1,y1);lineTo(x2,y2); - - // barrière - pen.width:=epaisseur div 2; - pen.color:=clBarriere[indexTCO]; - x2:=xf-round(10*frxGlob[indexTCO]);y2:=y0+round(18*fryGlob[indexTCO]); - b2:=y2-a2*x2; - x1:=x0+round(16*frxGlob[indexTCO]); - y1:=round(a2*x1+b2); - moveto(x1,y1);lineTo(x2,y2); - end; - - // regarder d'ou on vient de la route du tco - if mode>0 then - begin - trajet:=tco[indextco,x,y].trajet; - case mode of - 0: couleur:=clVoies[indexTCO]; - 1: couleur:=ClCanton[indexTCO]; - 2: couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - Brush.Color:=couleur; - pen.color:=couleur; - if trajet=1 then verticale; - if trajet=2 then diagonale; - if trajet=3 then // NE C S - begin - {if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(xf,y0);LineTo(xc,yc); - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineTo(xc,yf);} - tjd_d(1); - end; - if trajet=4 then // N C SO - begin - {if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(xc,y0);LineTo(xc,yc); - if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineTo(x0,yf);} - tjd_g(1); - end; - end; - end; - - // dessin position de la tjd - adr1:=tco[indexTCO,x,y].Adresse; - Index1:=Index_aig(adr1); - md:=aiguillage[Index1].modele; - if (md=tjd) or (md=tjs) then - begin - EtatTJD:=aiguillage[index1].EtatTJD; // nombre d'états de la tjd (2 ou 4) - position1:=aiguillage[index1].position; - sHG:=TCO[indexTCO,x,y].suivHG;tHG:=TCO[indexTCO,x,y].typHG; - sBD:=TCO[indexTCO,x,y].suivBD;tBD:=TCO[indexTCO,x,y].typBD; - canvas.pen.color:=clfond[indexTCO];; - canvas.pen.Width:=epaisseur div 2; - if etatTJD=4 then - begin - adr2:=aiguillage[index1].DDevie; // homologue - Index2:=Index_aig(adr2); - position2:=aiguillage[index2].position; - - if (position1=const_devie) and (position2=const_devie) then - begin - with canvas do begin - moveTo(xc,y0);LineTo(xc,yf); - end; - end; - - if (position1=const_droit) and (position2=const_droit) then - begin - with canvas do begin - moveTo(x0,yf);LineTo(xf,y0); - end; - end; - - if (position1=const_droit) and (position2=const_devie) then - begin - if tco[indexTCO,x,y].tjdS=adr1 then - {with canvas do begin - moveTo(xf,y0);LineTo(xc,yc);Lineto(xc,yf); - end;} - tjd_d(2); - if tco[indexTCO,x,y].tjdS=adr2 then - {with canvas do begin - moveTo(xc,y0);LineTo(xc,yc);Lineto(x0,yf); - end;} - tjd_g(2); - end; - - if (position1=const_devie) and (position2=const_droit) then - begin - if tco[indexTCO,x,y].tjdS=adr1 then - {with canvas do begin - moveTo(xc,y0);LineTo(xc,yc);Lineto(x0,yf); - end; } - tjd_g(2); - if tco[indexTCO,x,y].tjdS=adr2 then - {with canvas do begin - moveTo(xf,y0);LineTo(xc,yc);Lineto(xc,yf); - end;} - tjd_d(2); - end; - end; - - if etatTJD=2 then - begin - if position1=const_droit then - with canvas do - begin - moveTo(xc,y0);LineTo(xc,yf); - moveTo(xf,y0);LineTo(x0,yf); - end; - if position1=const_devie then - with canvas do - begin - // donne l'équation de droite y=ax+b passant par les points (x1,y1) (x2,y2) - equation_droite(xc,yc,x0,yf,a1,b1); - //gauche - moveTo(xc,y0); LineTo(xc,yc-epaisseur); - LineTo(xc-epaisseur,round((xc-epaisseur)*a1+b1) ); LineTo(x0,yf); - //droite - moveTo(xc,yf); - lineTo(xc,yc+epaisseur); - LineTo(xc+epaisseur,round((xc+epaisseur)*a1+b1) ); - LineTo(xf,y0); - end; - end; - end; -end; - -procedure dessin_24(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); -begin - if graphisme=1 then dessin_24L(indexTco,Canvas,x,y,Mode); - if graphisme=2 then dessin_24C(indexTco,Canvas,x,y,Mode); -end; - -// Element 25 croisement -procedure dessin_25(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); -var xp,x0,y0,x3,y3,x4,y4,xf,yf,xc,yc,trajet,ep,pont,x1,x2,y1,y2, - adr1,adr2,index1,index2,position1,position2,EtatTJD,sHG,sBD : integer; - a1,b1,a2,b2 : single; - md,tHG,tBD : tEquipement; - fond : tcolor; - procedure verticale; - begin - with canvas do - begin - if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveTo(xc,y0);LineTo(xc,yc); - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - LineTo(xc,yf); - end; - end; - - procedure diagonale; - begin - with canvas do - begin - if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveTo(x0,y0);LineTo(xc,yc); - if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - LineTo(xf,yf); - end; - end; - - procedure tjd_g(dessin : integer); - begin - x1:=x0-(2*LargeurCell[indexTCO])-(LargeurCell[indexTCO] div 2);y1:=y0-(hauteurCell[indexTCO] div 3); - x2:=x0+(LargeurCell[indexTCO] div 2);y2:=yf+hauteurCell[indexTCO]+(hauteurCell[indexTCO] div 3); - x3:=xc;y3:=yf; - x4:=x0;y4:=y0; - ep:=tco[indextco,x,y].epaisseurs; - - with canvas do - begin - if dessin=1 then - begin - if testbit(ep,0) or testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - end; - Arc(x1,y1,x2,y2,x3,y3,x4,y4); - end; - end; - - procedure tjd_d(dessin : integer); - begin - x1:=x0+(LargeurCell[indexTCO] div 2);y1:=y0-hauteurCell[indexTCO]-(hauteurCell[indexTCO] div 3); - x2:=xf+(2*LargeurCell[indexTCO])+(LargeurCell[indexTCO] div 2);y2:=yf+round(hauteurCell[indexTCO] / 3); - x3:=xc;y3:=y0; - x4:=xf;y4:=yf; - ep:=tco[indextco,x,y].epaisseurs; - - with canvas do - begin - if dessin=1 then - begin - if testbit(ep,1) or testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - end; - Arc(x1,y1,x2,y2,x3,y3,x4,y4); - end; - end; - -begin - x0:=(x-1)*LargeurCell[indexTCO]; - y0:=(y-1)*hauteurCell[indexTCO]; - xc:=x0+(LargeurCell[indexTCO] div 2); - yc:=y0+(hauteurCell[indexTCO] div 2); - xf:=x0+LargeurCell[indexTCO]; - yf:=y0+hauteurCell[indexTCO]; - ep:=tco[indextco,x,y].epaisseurs; - pont:=tco[indextco,x,y].pont; - fond:=tco[indexTco,x,y].CouleurFond; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=tco[indextco,x,y].CouleurFond; - //r:=Rect(x0,y0,x0+LargeurCell[indexTCO],y0+hauteurCell[indexTCO]); - //FillRect(r); - - Brush.Color:=clvoies[indexTCO]; - pen.color:=clvoies[indexTCO]; - pen.width:=epaisseur; - - verticale; - diagonale; - md:=aiguillage[index_aig(tco[indextco,x,y].Adresse)].modele; - if (md=tjd) or (md=tjs) then - begin - tjd_g(1); - tjd_d(1); - end; - - // verticale - if testbit(pont,1) or testbit(pont,5) then - begin - // masquages - pen.color:=clfond[indexTCO]; - xp:=xc-(epaisseur); - moveto(xp,y0+epaisseur);lineTo(xp,yf-epaisseur); - xp:=xc+(epaisseur); - moveto(xp,y0+epaisseur);lineTo(xp,yf-epaisseur); - - // barrières du pont - pen.color:=clBarriere[indexTCO]; - pen.Width:=epaisseur div 2; - xp:=xc-(epaisseur); - moveto(xp,y0+epaisseur);lineTo(xp,yf-epaisseur); - xp:=xc+(epaisseur); - moveto(xp,y0+epaisseur);lineTo(xp,yf-epaisseur); - end; - - // diagonale - if testbit(pont,0) or testbit(pont,4) then - begin - pen.color:=clfond[indexTCO]; - equation_droite(x0,y0,xf,yf,a1,b1); - // droite a2,b2 // passant par x2,y2 - a2:=a1; - - // masquage G - x2:=x0+round(8*frxGlob[indexTCO]);y2:=y0+round(18*fryGlob[indexTCO]); - b2:=y2-a2*x2; - x1:=xf-round(18*frxGlob[indexTCO]); - y1:=round(a2*x1+b2); - moveto(x1,y1);lineTo(x2,y2); - - // barrière - pen.width:=epaisseur div 2; - pen.color:=clBarriere[indexTCO]; - x2:=x0+round(8*frxGlob[indexTCO]);y2:=y0+round(18*fryGlob[indexTCO]); - b2:=y2-a2*x2; - x1:=xf-round(18*frxGlob[indexTCO]); - y1:=round(a2*x1+b2); - moveto(x1,y1);lineTo(x2,y2); - - // masquage D - pen.Width:=epaisseur; - pen.color:=clfond[indexTCO]; - x2:=x0+round(20*frxGlob[indexTCO]);y2:=y0+round(11*fryGlob[indexTCO]); - b2:=y2-a2*x2; - x1:=xf-round(8*frxGlob[indexTCO]); - y1:=round(a2*x1+b2); - moveto(x1,y1);lineTo(x2,y2); - - pen.width:=epaisseur div 2; - pen.color:=clBarriere[indexTCO]; - x2:=x0+round(20*frxGlob[indexTCO]);y2:=y0+round(11*fryGlob[indexTCO]); - b2:=y2-a2*x2; - x1:=xf-round(8*frxGlob[indexTCO]); - y1:=round(a2*x1+b2); - moveto(x1,y1);lineTo(x2,y2); - end; - - // regarder d'ou on vient de la route du tco - if mode>0 then - begin - trajet:=tco[indextco,x,y].trajet; - case mode of - 0: couleur:=clVoies[indexTCO]; - 1: couleur:=ClCanton[indexTCO]; - 2: couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - - Brush.Color:=couleur; - pen.color:=couleur; - if trajet=1 then verticale; - if trajet=2 then diagonale; - if trajet=3 then // NO C S - begin - {if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(x0,y0);LineTo(xc,yc); - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineTo(xc,yf);} - tjd_g(1); - end; - if trajet=4 then - begin - {if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(xc,y0);LineTo(xc,yc); - if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineTo(xf,yf);} - tjd_d(1); - end; - end; - end; - - // dessin position de la tjd - adr1:=tco[indexTCO,x,y].Adresse; - Index1:=Index_aig(adr1); - md:=aiguillage[Index1].modele; - if (md=tjd) or (md=tjs) then - begin - EtatTJD:=aiguillage[index1].EtatTJD; // nombre d'états de la tjd (2 ou 4) - position1:=aiguillage[index1].position; - sHG:=TCO[indexTCO,x,y].suivHG;tHG:=TCO[indexTCO,x,y].typHG; - sBD:=TCO[indexTCO,x,y].suivBD;tBD:=TCO[indexTCO,x,y].typBD; - canvas.pen.color:=clfond[indexTCO]; - canvas.pen.Width:=epaisseur div 2; - if etatTJD=4 then - begin - adr2:=aiguillage[index1].DDevie; // homologue - Index2:=Index_aig(adr2); - position2:=aiguillage[index2].position; - - if (position1=const_devie) and (position2=const_devie) then - begin - with canvas do begin - moveTo(x0,y0);LineTo(xf,yf); - end; - end; - - if (position1=const_droit) and (position2=const_droit) then - begin - with canvas do begin - moveTo(xc,yf);LineTo(xc,y0); - end; - end; - - if (position1=const_droit) and (position2=const_devie) then - begin - if tco[indexTCO,x,y].tjdS=adr1 then - {with canvas do begin - moveTo(xc,y0);LineTo(xc,yc);Lineto(xf,yf); - end;} - tjd_d(2); - if tco[indexTCO,x,y].tjdS=adr2 then - {with canvas do begin - moveTo(x0,y0);LineTo(xc,yc);Lineto(xc,yf); - end; } - tjd_g(2); - end; - - if (position1=const_devie) and (position2=const_droit) then - begin - if tco[indexTCO,x,y].tjdS=adr1 then - {with canvas do begin - moveTo(x0,y0);LineTo(xc,yc);Lineto(xc,yf); - end; } - tjd_g(2); - if tco[indexTCO,x,y].tjdS=adr2 then - {with canvas do begin - moveTo(xc,y0);LineTo(xc,yc);Lineto(xf,yf); - end; } - tjd_d(2); - end; - end; - - if etatTJD=2 then - begin - if position1=const_droit then - with canvas do - begin - moveTo(xc,y0);LineTo(xc,yf); - moveTo(x0,y0);LineTo(xf,yf); - end; - if position1=const_devie then - with canvas do - begin - // donne l'équation de droite y=ax+b passant par les points (x1,y1) (x2,y2) - equation_droite(x0,y0,xf,yf,a1,b1); - //gauche - moveTo(xc,yf); LineTo(xc,yc+epaisseur); - LineTo(xc-epaisseur,round((xc-epaisseur)*a1+b1) ); LineTo(x0,y0); - //droite - moveTo(xc,y0); - lineTo(xc,yc-epaisseur); - LineTo(xc+epaisseur,round((xc+epaisseur)*a1+b1) ); - LineTo(xf,yf); - end; - end; - end; - -end; - -// Element 26 -procedure dessin_26L(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); -var x0,y0,xc,yc,jx1,jy1,xf,yf,position,ep : integer; - r : Trect; - fond: tcolor; - - procedure trajet_droit; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_droit then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(xc,y0);lineto(xc,yc); - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xc,yf); - end; - end; - - procedure trajet_devie; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_devie then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(xc,yf);lineto(xc,yc); - if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineTo(xf,y0); - end; - end; - -begin - x0:=(x-1)*LargeurCell[indexTCO]; // x origine - y0:=(y-1)*hauteurCell[indexTCO]; // y origine - yc:=y0+(hauteurCell[indexTCO] div 2); // y centre - xc:=x0+(LargeurCell[indexTCO] div 2); // x centre - xf:=x0+LargeurCell[indexTCO]; // x fin - yf:=y0+hauteurCell[indexTCO]; // y fin - position:=positionTCO(indexTco,x,y); - fond:=tco[indextco,x,y].CouleurFond; - ep:=tco[indextco,x,y].epaisseurs; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=fond; - Pen.Color:=Fond;; - //r:=Rect(x0,y0,xf,yf); - //FillRect(r); // efface la cellule - - Pen.Width:=epaisseur; - Brush.Color:=clVoies[indexTCO]; - Pen.Color:=clVoies[indexTCO]; - Pen.Mode:=pmCopy; - - if mode>0 then - begin - if (position=const_devie) or (position=const_inconnu) then - begin - trajet_droit; - trajet_devie; - end; - if (position=const_droit) then - begin - trajet_devie; - trajet_droit; - end; - end - - else - begin - trajet_devie; - trajet_droit; - end; - - if (position=const_Devie) then - begin - if not affposFil then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.width:=1; - jy1:=yc - 2*Epaisseur-1; - jx1:=xc- (Epaisseur div 2); - pen.width:=1; - Polygon([point(jx1,jy1),Point(jx1+epaisseur,jy1),Point(jx1+epaisseur,jy1+epaisseur),Point(jx1,jy1+2*epaisseur)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(xc,yf);LineTo(xc,yc);LineTo(xf,y0); - end; - end; - - if position=const_droit then - begin - if not affposfil then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.Width:=1; - jx1:=xc+(Epaisseur div 2)+1; - r:=rect(jx1,yc-15,jx1+Epaisseur,yc+10); - FillRect(r); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(xc,yf);LineTo(xc,y0); - end; - end; - end; -end; - -// Element 26 -procedure dessin_26C(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); -var x0,y0,xc,yc,jx1,jy1,xf,yf,x1,y1,x2,y2,x3,y3,x4,y4,position,ep : integer; - r : Trect; - fond: tcolor; - -procedure trajet_droit; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_droit then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(xc,y0);lineto(xc,yc); - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xc,yf); - end; - end; - - procedure trajet_devie; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_devie then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - Arc(x1,y1,x2,y2,x3,y3,x4,y4); //courbe - end; - end; - -begin - x0:=(x-1)*LargeurCell[indexTCO]; // x origine - y0:=(y-1)*hauteurCell[indexTCO]; // y origine - yc:=y0+(hauteurCell[indexTCO] div 2); // y centre - xc:=x0+(LargeurCell[indexTCO] div 2); // x centre - xf:=x0+LargeurCell[indexTCO]; // x fin - yf:=y0+hauteurCell[indexTCO]; // y fin - position:=positionTCO(indexTco,x,y); - fond:=tco[indextco,x,y].CouleurFond; - ep:=tco[indextco,x,y].epaisseurs; - - // mode rond - x1:=x0+(LargeurCell[indexTCO] div 2);y1:=y0-(hauteurCell[indexTCO] div 3); - x2:=xf+(2*LargeurCell[indexTCO])+(LargeurCell[indexTCO] div 2);y2:=yf+hauteurCell[indexTCO]+(hauteurCell[indexTCO] div 3); - x3:=xf;y3:=y0; - x4:=xc;y4:=yf; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=fond; - Pen.Color:=Fond;; - - Pen.Width:=epaisseur; - Brush.Color:=clVoies[indexTCO]; - Pen.Color:=clVoies[indexTCO]; - Pen.Mode:=pmCopy; - - if mode>0 then - begin - if (position=const_devie) or (position=const_inconnu) then - begin - trajet_droit; - trajet_devie; - end; - if (position=const_droit) then - begin - trajet_devie; - trajet_droit; - end; - end - - else - begin - trajet_devie; - trajet_droit; - end; - - if (position=const_Devie) then - begin - if not AffPosFil then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.width:=1; - jx1:=xc-(Epaisseur div 2); jy1:=yc - Epaisseur-5; - pen.width:=1; - Polygon([point(jx1,jy1),Point(jx1+epaisseur,jy1),Point(jx1+epaisseur,jy1+epaisseur),Point(jx1,jy1+4*epaisseur)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - //moveTo(xc,yf);LineTo(xc,yc+round(4*FryGlob[indexTCO]));LineTo(xf,y0); - Arc(x1,y1,x2,y2,x3,y3,x4,y4); - end; - end; - - if position=const_droit then - begin - if not affposfil then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.Width:=1; - jx1:=xc+(Epaisseur div 2); - r:=rect(jx1+1,yc-15,jx1+Epaisseur,yf); - FillRect(r); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(xc,yf);LineTo(xc,y0); - end; - end; - end; -end; - -procedure dessin_26(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); -begin - if graphisme=1 then dessin_26L(indexTco,Canvas,x,y,Mode); - if graphisme=2 then dessin_26C(indexTco,Canvas,x,y,Mode); -end; - -// Element 27 -procedure dessin_27L(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); -var x0,y0,jx2,jy2,jx3,jy3,xc,yc,jx1,jy1,xf,yf,position,ep : integer; - r : Trect; - fond: tcolor; - - procedure trajet_droit; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_droit then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - pen.color:=couleur; - moveto(xc,y0);lineto(xc,yc); - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xc,yf); - end; - end; - - procedure trajet_devie; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_devie then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(xc,y0);lineto(xc,yc); // verticale complete - if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineTo(x0,yf); - end; - end; - -begin - x0:=(x-1)*LargeurCell[indexTCO]; // x origine - y0:=(y-1)*hauteurCell[indexTCO]; // y origine - yc:=y0+(hauteurCell[indexTCO] div 2); // y centre - xc:=x0+(LargeurCell[indexTCO] div 2); // x centre - xf:=x0+LargeurCell[indexTCO]; // x fin - yf:=y0+hauteurCell[indexTCO]; // y fin - position:=positionTCO(indexTco,x,y); - fond:=tco[indextco,x,y].CouleurFond; - ep:=tco[indextco,x,y].epaisseurs; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=fond; - Pen.Color:=Fond;; - //r:=Rect(x0,y0,xf,yf); - //FillRect(r); // efface la cellule - - Pen.Width:=epaisseur; - Brush.Color:=clVoies[indexTCO]; - Pen.Color:=clVoies[indexTCO]; - Pen.Mode:=pmCopy; - - if mode>0 then - begin - if (position=const_devie) or (position=const_inconnu) then - begin - trajet_droit; - trajet_devie; - end; - if (position=const_droit) then - begin - trajet_devie; - trajet_droit; - end; - end - - else - begin - trajet_devie; - trajet_droit; - end; - - if (position=const_Devie) then - begin - if not affPosFil then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.width:=1; - jx1:=xc-(Epaisseur div 2); jy1:=yc + Epaisseur+2; - jx2:=jx1+epaisseur;jy2:=jy1-epaisseur; - jx3:=jx2;jy3:=yc+2*epaisseur; - pen.width:=1; - Polygon([point(jx1,jy1),Point(jx2,jy2),Point(jx3,jy3),Point(jx1,jy3)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(xc,y0);LineTo(xc,yc);LineTo(x0,yf); - end; - end; - - if position=const_droit then - begin - if not affposfil then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.Width:=1; - jx1:=xc-(Epaisseur div 2); - r:=rect(jx1,yc-3*epaisseur,jx1-Epaisseur,yf); - FillRect(r); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(xc,y0);LineTo(xc,yf); - end; - end; - end; -end; - -// Element 27c -procedure dessin_27C(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); -var x0,y0,xc,yc,jx1,jy1,jx2,jy2,xf,yf,x1,y1,x2,y2,x3,y3,x4,y4,position,ep, - jx3,jy3 : integer; - r : Trect; - fond: tcolor; - -procedure trajet_droit; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_droit then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - pen.color:=couleur; - moveto(xc,y0);lineto(xc,yc); - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xc,yf); - end; - end; - - procedure trajet_devie; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_devie then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - Arc(x1,y1,x2,y2,x3,y3,x4,y4); //courbe - end; - end; - -begin - x0:=(x-1)*LargeurCell[indexTCO]; // x origine - y0:=(y-1)*hauteurCell[indexTCO]; // y origine - yc:=y0+(hauteurCell[indexTCO] div 2); // y centre - xc:=x0+(LargeurCell[indexTCO] div 2); // x centre - xf:=x0+LargeurCell[indexTCO]; // x fin - yf:=y0+hauteurCell[indexTCO]; // y fin - position:=positionTCO(indexTco,x,y); - fond:=tco[indextco,x,y].CouleurFond; - ep:=tco[indextco,x,y].epaisseurs; - - // mode rond - x1:=x0-(2*LargeurCell[indexTCO])-(LargeurCell[indexTCO] div 3);y1:=y0-hauteurCell[indexTCO]-(hauteurCell[indexTCO] div 3); - x2:=xc;y2:=yf+round(hauteurCell[indexTCO] / 2.9); - - x3:=x0;y3:=yf; - x4:=xc;y4:=y0; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=fond; - Pen.Color:=Fond;; - - Pen.Width:=epaisseur; - Brush.Color:=clVoies[indexTCO]; - Pen.Color:=clVoies[indexTCO]; - Pen.Mode:=pmCopy; - - if mode>0 then - begin - if (position=const_devie) or (position=const_inconnu) then - begin - trajet_droit; - trajet_devie; - end; - if (position=const_droit) then - begin - trajet_devie; - trajet_droit; - end; - end - - else - begin - trajet_devie; - trajet_droit; - end; - - if (position=const_Devie) then - begin - if not affposfil then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.width:=1; - jx1:=xc-(Epaisseur div 2); jy1:=yc + Epaisseur; - jx2:=jx1+epaisseur;jy2:=jy1-3*epaisseur; - jx3:=jx2;jy3:=yc+2*epaisseur; - pen.width:=1; - Polygon([point(jx1,jy1),Point(jx2,jy2),Point(jx3,jy3),Point(jx1,jy3)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - //moveTo(xc,y0);LineTo(xc,yc-round(4*frxGlob[indexTCO]));LineTo(x0,yf); - Arc(x1,y1,x2,y2,x3,y3,x4,y4); - end; - end; - - if position=const_droit then - begin - if not affposfil then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.Width:=1; - jx1:=xc-(Epaisseur div 2); - r:=rect(jx1,yc-3*epaisseur,jx1-Epaisseur,yf); - FillRect(r); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(xc,y0);LineTo(xc,yf); - end; - end; - end; -end; - -procedure dessin_27(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); -begin - if graphisme=1 then dessin_27L(indexTco,Canvas,x,y,Mode); - if graphisme=2 then dessin_27C(indexTco,Canvas,x,y,Mode); -end; - -// Element 28 -procedure dessin_28L(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); -var x0,y0,jx2,jy2,jx3,jy3,xc,yc,jx1,jy1,xf,yf,position,ep : integer; - r : Trect; - fond: tcolor; - - procedure trajet_droit; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_droit then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - pen.color:=couleur; - moveto(xc,y0);lineto(xc,yc); - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xc,yf); - end; - end; - - procedure trajet_devie; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_devie then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(xc,y0);lineto(xc,yc); - if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineTo(xf,yf); - end; - end; - - -begin - x0:=(x-1)*LargeurCell[indexTCO]; // x origine - y0:=(y-1)*hauteurCell[indexTCO]; // y origine - yc:=y0+(hauteurCell[indexTCO] div 2); // y centre - xc:=x0+(LargeurCell[indexTCO] div 2); // x centre - xf:=x0+LargeurCell[indexTCO]; // x fin - yf:=y0+hauteurCell[indexTCO]; // y fin - position:=positionTCO(indexTco,x,y); - fond:=tco[indextco,x,y].CouleurFond; - ep:=tco[indextco,x,y].epaisseurs; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=fond; - Pen.Color:=Fond;; - Pen.Width:=epaisseur; - Brush.Color:=clVoies[indexTCO]; - Pen.Color:=clVoies[indexTCO]; - Pen.Mode:=pmCopy; - - if mode>0 then - begin - if (position=const_Devie) or (position=const_inconnu) then - begin - trajet_droit; - trajet_devie; // affiche la position de la branche déviée - end; - - if (position=const_droit) then - begin - trajet_devie; - trajet_droit; - end; - end - else - begin - trajet_devie; - trajet_droit; - end; - - if (position=const_Devie) then - begin - if not(AffPoSFil) then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.width:=1; - jx1:=xc-(Epaisseur div 2); jy1:=yc + (Epaisseur div 2); - jx2:=jx1+epaisseur;jy2:=jy1+epaisseur; - jx3:=jx2;jy3:=yc+2*epaisseur; - pen.width:=1; - Polygon([point(jx1,jy1),Point(jx2,jy2),Point(jx3,jy3),Point(jx1,jy3)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(xc,y0);LineTo(xc,yc);LineTo(xf,yf); - end; - end; - - if position=const_droit then - begin - if not(AffPoSFil) then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.Width:=1; - jx1:=xc+(Epaisseur div 2); - r:=rect(jx1,yc-3*epaisseur,jx1+Epaisseur,yf); - FillRect(r); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(xc,y0);LineTo(xc,yf); - end; - end; - end; -end; - -// Element 28 -procedure dessin_28C(indexTCO : integer;Canvas : Tcanvas;x,y,mode: integer); -var x0,y0,xc,yc,jx1,jy1,jx2,jy2,xf,yf,x1,y1,x2,y2,x3,y3,x4,y4,position,ep, - jx3,jy3 : integer; - r : Trect; - fond: tcolor; - -procedure trajet_droit; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_droit then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - pen.color:=couleur; - moveto(xc,y0);lineto(xc,yc); - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xc,yf); - end; - end; - - procedure trajet_devie; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_devie then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - Arc(x1,y1,x2,y2,x3,y3,x4,y4); //courbe - end; - end; - -begin - x0:=(x-1)*LargeurCell[indexTCO]; // x origine - y0:=(y-1)*hauteurCell[indexTCO]; // y origine - yc:=y0+(hauteurCell[indexTCO] div 2); // y centre - xc:=x0+(LargeurCell[indexTCO] div 2); // x centre - xf:=x0+LargeurCell[indexTCO]; // x fin - yf:=y0+hauteurCell[indexTCO]; // y fin - position:=positionTCO(indexTco,x,y); - fond:=tco[indextco,x,y].CouleurFond; - ep:=tco[indextco,x,y].epaisseurs; - - // mode rond - x1:=x0+(LargeurCell[indexTCO] div 2);y1:=y0-hauteurCell[indexTCO]-(hauteurCell[indexTCO] div 3); - x2:=xf+(2*LargeurCell[indexTCO])+(LargeurCell[indexTCO] div 2);y2:=yf+(hauteurCell[indexTCO] div 3); - x3:=xc;y3:=y0; - x4:=xf;y4:=yf; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=fond; - Pen.Color:=Fond;; - - Pen.Width:=epaisseur; - Brush.Color:=clVoies[indexTCO]; - Pen.Color:=clVoies[indexTCO]; - Pen.Mode:=pmCopy; - - if mode>0 then - begin - if (position=const_devie) or (position=const_inconnu) then - begin - trajet_droit; - trajet_devie; - end; - if (position=const_droit) then - begin - trajet_devie; - trajet_droit; - end; - end - - else - begin - trajet_devie; - trajet_droit; - end; - - - if (position=const_Devie) then - begin - if not(affPosFil) then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.width:=1; - jx1:=xc-(Epaisseur div 2); jy1:=yc - (2*Epaisseur ); - jx2:=jx1+epaisseur;jy2:=yc+epaisseur; - jx3:=jx2;jy3:=yc+2*epaisseur; - pen.width:=1; - Polygon([point(jx1,jy1),Point(jx2,jy2),Point(jx3,jy3),Point(jx1,jy3)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - //moveTo(xc,y0);LineTo(xc,yc-round(4*fryGlob[indexTCO]));LineTo(xf,yf); - Arc(x1,y1,x2,y2,x3,y3,x4,y4); - end; - end; - - if position=const_droit then - begin - if not(affPosFil) then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.Width:=1; - jx1:=xc+(Epaisseur div 2); - r:=rect(jx1,yc-3*epaisseur,jx1+Epaisseur,yf); - FillRect(r); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(xc,y0);LineTo(xc,yf); - end; - end; - end; -end; - -procedure dessin_28(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); -begin - if graphisme=1 then dessin_28L(indexTco,Canvas,x,y,Mode); - if graphisme=2 then dessin_28C(indexTco,Canvas,x,y,Mode); -end; - -// Element 29 -procedure dessin_29L(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); -var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,y4,position,ep : integer; - fond : tcolor; - - procedure trajet_droit; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_droit then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - pen.color:=couleur; - moveto(x0,y0);lineto(xc,yc); - if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xf,yf); - end; - end; - - procedure trajet_devie; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_devie then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(x0,y0);lineto(xc,yc); - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xc,yf); - end; - end; - - -begin - x0:=(x-1)*LargeurCell[indexTCO]; // x origine - y0:=(y-1)*hauteurCell[indexTCO]; // y origine - yc:=y0+(hauteurCell[indexTCO] div 2); // y centre - xc:=x0+(LargeurCell[indexTCO] div 2); // x centre - xf:=x0+LargeurCell[indexTCO]; // x fin - yf:=y0+hauteurCell[indexTCO]; // y fin - position:=positionTCO(indexTco,x,y); - fond:=tco[indextco,x,y].CouleurFond; - ep:=tco[indextco,x,y].epaisseurs; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=fond; - Pen.Color:=fond; - Pen.Width:=epaisseur; - Brush.Color:=clVoies[indexTCO]; - Pen.Color:=clVoies[indexTCO]; - Pen.Mode:=pmCopy; - - if mode>0 then - begin - if (position=const_Devie) or (position=const_inconnu) then - begin - trajet_droit; - trajet_devie; // affiche la position de la branche déviée - end; - - if (position=const_droit) then - begin - trajet_devie; - trajet_droit; - end; - end - - else - - begin - trajet_devie; - trajet_droit; - end; - - if (position=const_Devie) then - begin - if not(AffPosFil) then - begin - // effacement du morceau - pen.width:=1; - x1:=xc+(epaisseur div 2)+1;y1:=yc-epaisseur; - x2:=x1+epaisseur;y2:=y1; - x3:=x2;y3:=y2+4*epaisseur; - x4:=x1;y4:=y3; - pen.color:=fond; - Brush.Color:=fond; - Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(x0,y0);lineTo(xc,yc);LineTo(xc,yf); - end; - end; - if position=const_droit then - begin - if not(AffPosFil) then - begin - // effacement du morceau - pen.Width:=1; - x1:=xc-(epaisseur div 2);y1:=yc+(epaisseur div 2); - x2:=x1+epaisseur;y2:=y1+epaisseur; - x3:=x2;y3:=y2+(epaisseur div 2); - x4:=x1;y4:=y3; - pen.color:=fond; - Brush.Color:=fond; - Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(x0,y0);LineTo(xf,yf); - end; - end; - end; -end; - -procedure dessin_29C(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); -var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,y4,position,ep : integer; - fond : tcolor; - procedure trajet_droit; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_droit then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(x0,y0);lineto(xc,yc); - if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xf,yf); - end; - end; - - procedure trajet_devie; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_devie then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - Arc(x1,y1,x2,y2,x3,y3,x4,y4); //courbe - end; - end; - -begin - x0:=(x-1)*LargeurCell[indexTCO]; // x origine - y0:=(y-1)*hauteurCell[indexTCO]; // y origine - yc:=y0+(hauteurCell[indexTCO] div 2); // y centre - xc:=x0+(LargeurCell[indexTCO] div 2); // x centre - xf:=x0+LargeurCell[indexTCO]; // x fin - yf:=y0+hauteurCell[indexTCO]; // y fin - // mode rond - x1:=x0-(2*LargeurCell[indexTCO])-(LargeurCell[indexTCO] div 2);y1:=y0-(hauteurCell[indexTCO] div 3); - x2:=x0+(LargeurCell[indexTCO] div 2);y2:=yf+hauteurCell[indexTCO]+(hauteurCell[indexTCO] div 3); - x3:=xc;y3:=yf; - x4:=x0;y4:=y0; - ep:=tco[indextco,x,y].epaisseurs; - - position:=positionTCO(indexTco,x,y); - fond:=tco[indextco,x,y].CouleurFond; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=fond; - Pen.Color:=fond; - Pen.Width:=epaisseur; - Brush.Color:=clVoies[indexTCO]; - Pen.Color:=clVoies[indexTCO]; - Pen.Mode:=pmCopy; - - if mode>0 then - begin - if (position=const_devie) or (position=const_inconnu) then - begin - trajet_droit; - trajet_devie; - end; - if (position=const_droit) then - begin - trajet_devie; - trajet_droit; - end; - end - - else - begin - trajet_devie; - trajet_droit; - end; - - if (position=const_Devie) then - begin - if not(AffPosFil) then - begin - // effacement du morceau - pen.width:=1; - x1:=xc-round(epaisseur*1);y1:=yc-round(2.2*epaisseur); - x2:=xc+round(epaisseur*0.7);y2:=y1; - x3:=x2-round(epaisseur*0.2);y3:=yc+round(1.8*epaisseur); - x4:=x1;y4:=yc-round(1.5*epaisseur); - pen.color:=fond; - Brush.Color:=fond; - Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - //moveTo(x0,y0);LineTo(xc-round(6*FrxGlob[indexTCO]),yc);LineTo(xc,yf); - Arc(x1,y1,x2,y2,x3,y3,x4,y4); - end; - end; - - if position=const_droit then - begin - if not(AffPosFil) then - begin - // effacement du morceau - pen.Width:=1; - x1:=xc-round(epaisseur*2.3);y1:=yc-round(epaisseur*1.4); - x2:=x1+3*epaisseur;y2:=y1+3*epaisseur; - x3:=x2;y3:=y2+(epaisseur div 2); - x4:=x1;y4:=y3; - pen.color:=fond; - Brush.Color:=fond; - Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(x0,y0);LineTo(xf,yf); - end; - end; - end; -end; - -procedure dessin_29(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); -begin - if graphisme=1 then dessin_29L(indexTco,Canvas,x,y,Mode); - if graphisme=2 then dessin_29C(indexTco,Canvas,x,y,Mode); -end; - -// Elément 32 -procedure dessin_32L(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); -var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,position,ep : integer; - r : Trect; - fond : tcolor; - - procedure trajet_droit; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_droit then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(xf,y0);lineto(xc,yc); - if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(x0,yf); - end; - end; - - procedure trajet_devie; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_devie then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(xf,y0);lineto(xc,yc); - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xc,yf); - end; - end; - - -begin - x0:=(x-1)*LargeurCell[indexTCO]; // x origine - y0:=(y-1)*hauteurCell[indexTCO]; // y origine - yc:=y0+(hauteurCell[indexTCO] div 2); // y centre - xc:=x0+(LargeurCell[indexTCO] div 2); // x centre - xf:=x0+LargeurCell[indexTCO]; // x fin - yf:=y0+hauteurCell[indexTCO]; // y fin - position:=positionTCO(indexTco,x,y); - fond:=tco[indextco,x,y].CouleurFond; - ep:=tco[indextco,x,y].epaisseurs; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=fond; - Pen.Color:=fond; - Pen.Width:=epaisseur; - Brush.Color:=clVoies[indexTCO]; - Pen.Color:=clVoies[indexTCO]; - Pen.Mode:=pmCopy; - - if mode>0 then - begin - if (position=const_devie) or (position=const_inconnu) then - begin - trajet_droit; - trajet_devie; - end; - if (position=const_droit) then - begin - trajet_devie; - trajet_droit; - end; - end - - else - begin - trajet_devie; - trajet_droit; - end; - - if (position=const_Devie) then - begin - if not affposfil then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.width:=1; - x1:=xc-round(1.5*epaisseur);y1:=yc-(epaisseur)+1; - x2:=xc-(epaisseur div 2);y2:=y1+4*epaisseur; - r:=rect(x1,y1,x2,y2); - rectangle(r); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(xf,y0);LineTo(xc,yc);LineTo(xc,yf); - end; - end; - - if position=const_droit then - begin - if not affposfil then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.width:=1; - x1:=xc+round(0.9*epaisseur);y1:=yc; - x2:=x1+round(1.0*epaisseur); - x3:=xc-round(0.5*epaisseur);y3:=y1+round(2.2*epaisseur); - x4:=x3-round(0.9*epaisseur); - polygon([point(x1,y1),point(x2,y1),point(x3,y3),point(x4,y3)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(xf,y0);LineTo(x0,yf); - end; - end; - end; -end; - -procedure dessin_32C(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); -var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,y4,position,ep : integer; - fond : tcolor; - - procedure trajet_droit; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_droit then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(xf,y0);lineto(xc,yc); - if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(x0,yf); - end; - end; - - procedure trajet_devie; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_devie then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,5) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - Arc(x1,y1,x2,y2,x3,y3,x4,y4); //courbe - end; - end; - -begin - x0:=(x-1)*LargeurCell[indexTCO]; // x origine - y0:=(y-1)*hauteurCell[indexTCO]; // y origine - yc:=y0+(hauteurCell[indexTCO] div 2); // y centre - xc:=x0+(LargeurCell[indexTCO] div 2); // x centre - xf:=x0+LargeurCell[indexTCO]; // x fin - yf:=y0+hauteurCell[indexTCO]; // y fin - // mode rond - x1:=x0+(LargeurCell[indexTCO] div 2);y1:=y0-(hauteurCell[indexTCO] div 3); - x2:=xf+(2*LargeurCell[indexTCO])+(LargeurCell[indexTCO] div 2);y2:=yf+hauteurCell[indexTCO]+(hauteurCell[indexTCO] div 3); - x3:=xf;y3:=y0; - x4:=xc;y4:=yf; - - position:=positionTCO(indexTco,x,y); - fond:=tco[indextco,x,y].CouleurFond; - ep:=tco[indextco,x,y].epaisseurs; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=fond; - Pen.Color:=fond; - - Pen.Width:=epaisseur; - Brush.Color:=clVoies[indexTCO]; - Pen.Color:=clVoies[indexTCO]; - Pen.Mode:=pmCopy; - - if mode>0 then - begin - if (position=const_devie) or (position=const_inconnu) then - begin - trajet_droit; - trajet_devie; - end; - if (position=const_droit) then - begin - trajet_devie; - trajet_droit; - end; - end - - else - begin - trajet_devie; - trajet_droit; - end; - - - if (position=const_Devie) then - begin - if not affposfil then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.width:=1; - x1:=xc-round(0.7*epaisseur);y1:=yc-round(1.6*epaisseur); - x2:=xc+round(0.9*epaisseur);y2:=y1; - x3:=xc-round(0.3*epaisseur);y3:=yc+round(1.4*epaisseur); - x4:=xc-round(0.7*epaisseur);y4:=y3; - polygon([point(x1,y1),point(x2,y2),point(x3,y3),point(x4,y4)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - //moveTo(xf,y0);LineTo(xc+round(4*frxGlob[indexTCO]),yc);LineTo(xc,yf); - Arc(x1,y1,x2,y2,x3,y3,x4,y4); - end; - end; - - if position=const_droit then - begin - if not affposfil then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.width:=1; - x1:=xc+round(2.8*epaisseur);y1:=yc-(2*epaisseur); - x2:=xc+(4*epaisseur); - x3:=xc+(1*epaisseur);y3:=yc+(epaisseur); - x4:=xc-round(0.2*epaisseur);y4:=y3; - polygon([point(x1,y1),point(x2,y1),point(x3,y3),point(x4,y4)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(xf,y0);LineTo(x0,yf); - end; - end; - end; -end; - -procedure dessin_32(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); -begin - if graphisme=1 then dessin_32L(indexTco,Canvas,x,y,Mode); - if graphisme=2 then dessin_32C(indexTco,Canvas,x,y,Mode); -end; - -// Element 33 -procedure dessin_33L(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); -var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,y4,position,ep : integer; - r : Trect; - fond : tcolor; - - procedure trajet_droit; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_droit then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - pen.color:=couleur; - moveto(x0,y0);lineto(xc,yc); - if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xf,yf); - end; - end; - - procedure trajet_devie; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_devie then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(xf,yf);lineto(xc,yc); - if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xc,y0); - end; - end; - - -begin - x0:=(x-1)*LargeurCell[indexTCO]; // x origine - y0:=(y-1)*hauteurCell[indexTCO]; // y origine - yc:=y0+(hauteurCell[indexTCO] div 2); // y centre - xc:=x0+(LargeurCell[indexTCO] div 2); // x centre - xf:=x0+LargeurCell[indexTCO]; // x fin - yf:=y0+hauteurCell[indexTCO]; // y fin - position:=positionTCO(indexTco,x,y); - fond:=tco[indextco,x,y].CouleurFond; - ep:=tco[indextco,x,y].epaisseurs; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=fond; - Pen.Color:=fond; - //r:=Rect(x0,y0,xf,yf); - //FillRect(r); // efface la cellule - - Pen.Width:=epaisseur; - Brush.Color:=clVoies[indexTCO]; - Pen.Color:=clVoies[indexTCO]; - Pen.Mode:=pmCopy; - - if mode>0 then - begin - if (position=const_devie) or (position=const_inconnu) then - begin - trajet_droit; - trajet_devie; - end; - if (position=const_droit) then - begin - trajet_devie; - trajet_droit; - end; - end - - else - begin - trajet_devie; - trajet_droit; - end; - - if (position=const_Devie) then - begin - if not(affPosFil) then - begin - // effacement du morceau - pen.width:=1; - x1:=xc-2*epaisseur;y1:=yc-(3*epaisseur); - x2:=xc-(epaisseur div 2);y2:=yc+epaisseur; - pen.color:=fond; - Brush.Color:=fond; - r:=rect(x1,y1,x2,y2); - rectangle(r); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(xf,yf);lineTo(x0,y0); - end; - end; - - if position=const_droit then - begin - if not(affPosFil) then - begin - // effacement du morceau - pen.Width:=1; - x1:=xc-round(1.3*epaisseur);y1:=yc-(2*epaisseur) ; - x2:=xc+round(0.6*epaisseur);y2:=y1; - x3:=xc+round(2.5*epaisseur);y3:=yc+(epaisseur div 2); - x4:=xc+round(1.2*epaisseur);y4:=y3; - pen.color:=fond; - Brush.Color:=fond; - Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(xf,yf);LineTo(xc,yc);LineTo(xc,y0); - end; - end; - end; -end; - -procedure dessin_33c(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); -var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,y4,position,ep : integer; - r : Trect; - fond : tcolor; - - procedure trajet_droit; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_droit then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,0) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(x0,y0);lineto(xc,yc); - if testbit(ep,4) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xf,yf); - end; - end; - - procedure trajet_devie; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_devie then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - Arc(x1,y1,x2,y2,x3,y3,x4,y4); //courbe - end; - end; - -begin - x0:=(x-1)*LargeurCell[indexTCO]; // x origine - y0:=(y-1)*hauteurCell[indexTCO]; // y origine - yc:=y0+(hauteurCell[indexTCO] div 2); // y centre - xc:=x0+(LargeurCell[indexTCO] div 2); // x centre - xf:=x0+LargeurCell[indexTCO]; // x fin - yf:=y0+hauteurCell[indexTCO]; // y fin - // mode rond - x1:=x0+(LargeurCell[indexTCO] div 2);y1:=y0-hauteurCell[indexTCO]-(hauteurCell[indexTCO] div 3); - x2:=xf+(2*LargeurCell[indexTCO])+(LargeurCell[indexTCO] div 2);y2:=yf+(hauteurCell[indexTCO] div 3); - x3:=xc;y3:=y0; - x4:=xf;y4:=yf; - ep:=tco[indextco,x,y].epaisseurs; - - position:=positionTCO(indexTco,x,y); - fond:=tco[indextco,x,y].CouleurFond; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=fond; - Pen.Color:=fond; - //r:=Rect(x0,y0,xf,yf); - //FillRect(r); // efface la cellule - - Pen.Width:=epaisseur; - Brush.Color:=clVoies[indexTCO]; - Pen.Color:=clVoies[indexTCO]; - Pen.Mode:=pmCopy; - - if mode>0 then - begin - if (position=const_devie) or (position=const_inconnu) then - begin - trajet_droit; - trajet_devie; - end; - if (position=const_droit) then - begin - trajet_devie; - trajet_droit; - end; - end - - else - begin - trajet_devie; - trajet_droit; - end; - - if (position=const_Devie) then - begin - if not(AffPosFil) then - begin - // effacement du morceau - pen.width:=1; - x1:=xc-round(1.5*epaisseur);y1:=yc-round(2.5*epaisseur); - x2:=xc-round(0.6*epaisseur);y2:=y1; - x3:=xc+round(1.3*epaisseur);y3:=yc+2*epaisseur; - x4:=xc+round(0.4*epaisseur);y4:=y3; - pen.color:=fond; - Brush.Color:=fond; - r:=rect(x1,y1,x2,y2); - Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - //moveTo(xf,yf);LineTo(xc+round(4*FrxGlob[indexTCO]),yc);LineTo(xc,y0); - Arc(x1,y1,x2,y2,x3,y3,x4,y4); - end; - end; - - if position=const_droit then - begin - if not(AffPosFil) then - begin - // effacement du morceau - pen.Width:=1; - x1:=xc-round(1.3*epaisseur);y1:=yc-(2*epaisseur); - x2:=xc+round(0.9*epaisseur);y2:=y1; - x3:=xc+round(3.5*epaisseur);y3:=yc+2*epaisseur; - x4:=xc+round(2.9*epaisseur);y4:=y3; - pen.color:=fond; - Brush.Color:=fond; - Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(x0,y0);LineTo(xf,yf); - end; - end; - end; -end; - -procedure dessin_33(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); -begin - if graphisme=1 then dessin_33L(indexTco,Canvas,x,y,Mode); - if graphisme=2 then dessin_33C(indexTco,Canvas,x,y,Mode); -end; - -// Element 34 -procedure dessin_34L(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); -var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,y4,position,ep : integer; - fond : Tcolor; - - procedure trajet_droit; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_droit then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - pen.color:=couleur; - moveto(x0,yf);lineto(xc,yc); - if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xf,y0); - end; - end; - - procedure trajet_devie; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_devie then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(x0,yf);lineto(xc,yc); // diag complete - if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xc,y0); // partie droite - end; - end; - -begin - x0:=(x-1)*LargeurCell[indexTCO]; // x origine - y0:=(y-1)*hauteurCell[indexTCO]; // y origine - yc:=y0+(hauteurCell[indexTCO] div 2); // y centre - xc:=x0+(LargeurCell[indexTCO] div 2); // x centre - xf:=x0+LargeurCell[indexTCO]; // x fin - yf:=y0+hauteurCell[indexTCO]; // y fin - position:=positionTCO(indexTco,x,y); - fond:=tco[indextco,x,y].CouleurFond; - ep:=tco[indextco,x,y].epaisseurs; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=fond; - Pen.Color:=fond; - Pen.Width:=epaisseur; - Brush.Color:=clVoies[indexTCO]; - Pen.Color:=clVoies[indexTCO]; - Pen.Mode:=pmCopy; - - if mode>0 then - begin - if (position=const_Devie) or (position=const_inconnu) then - begin - trajet_droit; - trajet_devie; // affiche la position de la branche déviée - end; - - if (position=const_droit) then - begin - trajet_devie; - trajet_droit; - end; - end - else - begin - trajet_devie; - trajet_droit; - end; - - if (position=const_Devie) then - begin - if not affposFil then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.width:=1; - x1:=xc+round(0.5*epaisseur);y1:=yc-round(3*epaisseur); - x2:=xc+round(1.5*epaisseur);y2:=yc+epaisseur; - polygon([point(x1,y1),point(x2,y1),point(x2,y2),point(x1,y2)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(x0,yf);LineTo(xc,yc);LineTo(xc,y0); - end; - end; - - if position=const_droit then - begin - if not affposfil then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.Width:=1; - x1:=xc-round(0.5*epaisseur);y1:=yc-round(2*epaisseur); - x2:=xc+round(0.5*epaisseur);y2:=y1; - x3:=x2;y3:=yc-round(1.3*epaisseur); - x4:=x1;y4:=yc-round(0.3*epaisseur); - polygon([point(x1,y1),point(x2,y2),point(x3,y3),point(x4,y4)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(x0,yf);LineTo(xf,y0); - end; - end; - end; -end; - -procedure dessin_34C(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); -var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,y4,position,ep : integer; - fond : Tcolor; - -procedure trajet_droit; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_droit then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,6) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - moveto(x0,yf);lineto(xc,yc); - if testbit(ep,2) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - lineto(xf,y0); - end; - end; - - procedure trajet_devie; - begin - couleur:=clvoies[indexTCO]; - if mode>0 then - begin - if position=const_devie then - begin - if mode=1 then couleur:=clcanton[indexTCO]; - if mode=2 then couleur:=couleurTrain[TCO[IndexTCO,x,y].train]; - end; - end; - - with canvas do - begin - pen.color:=couleur; - if testbit(ep,1) then pen.Width:=epaisseur div 2 else pen.Width:=epaisseur; - Arc(x1,y1,x2,y2,x3,y3,x4,y4); //courbe - end; - end; - -begin - x0:=(x-1)*LargeurCell[indexTCO]; // x origine - y0:=(y-1)*hauteurCell[indexTCO]; // y origine - yc:=y0+(hauteurCell[indexTCO] div 2); // y centre - xc:=x0+(LargeurCell[indexTCO] div 2); // x centre - xf:=x0+LargeurCell[indexTCO]; // x fin - yf:=y0+hauteurCell[indexTCO]; // y fin - // mode rond - x1:=x0-(2*LargeurCell[indexTCO])-(LargeurCell[indexTCO] div 2);y1:=y0-hauteurCell[indexTCO]-(hauteurCell[indexTCO] div 3); - x2:=x0+(LargeurCell[indexTCO] div 2);y2:=yf+(hauteurCell[indexTCO] div 3); - x3:=x0;y3:=yf; - x4:=xc;y4:=y0; - - position:=positionTCO(indexTco,x,y); - fond:=tco[indextco,x,y].CouleurFond; - ep:=tco[indextco,x,y].epaisseurs; - - with canvas do - begin - Pen.Width:=1; - Brush.Color:=fond; - Pen.Color:=fond; - //r:=Rect(x0,y0,xf,yf); - //FillRect(r); // efface la cellule - - Pen.Width:=epaisseur; - Brush.Color:=clVoies[indexTCO]; - Pen.Color:=clVoies[indexTCO]; - Pen.Mode:=pmCopy; - - if mode>0 then - begin - if (position=const_devie) or (position=const_inconnu) then - begin - trajet_droit; - trajet_devie; - end; - if (position=const_droit) then - begin - trajet_devie; - trajet_droit; - end; - end - - else - begin - trajet_devie; - trajet_droit; - end; - - if (position=const_Devie) then - begin - if not affPosFil then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.width:=1; - x1:=xc+round(0.1*epaisseur);y1:=yc-round(1*epaisseur); - x2:=xc+round(2*epaisseur);y2:=y1; - x3:=xc-round(0.5*epaisseur);y3:=yc+round(3*epaisseur); - x4:=xc-round(2*epaisseur);y4:=y3; - polygon([point(x1,y1),point(x2,y2),point(x3,y3),point(x4,y4)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - //moveTo(x0,yf);LineTo(xc-round(6*frxGlob[indexTCO]),yc);LineTo(xc,y0); - Arc(x1,y1,x2,y2,x3,y3,x4,y4); - end; - end; - - if position=const_droit then - begin - if not affposfil then - begin - // effacement du morceau - pen.color:=fond; - Brush.Color:=fond; - pen.Width:=1; - x1:=xc-round(2.3*epaisseur);y1:=yc-round(2*epaisseur); - x2:=xc+round(epaisseur);y2:=y1; - x3:=x2;y3:=yc-round(2*epaisseur); - x4:=x1;y4:=yc+round(1.1*epaisseur); - polygon([point(x1,y1),point(x2,y2),point(x3,y3),point(x4,y4)]); - end - else - begin - pen.color:=fond; - Brush.Color:=fond; - pen.width:=epaisseur div 2; - moveTo(x0,yf);LineTo(xf,y0); - end; - end; - end; -end; - -procedure dessin_34(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer); -begin - if graphisme=1 then dessin_34L(indexTco,Canvas,x,y,Mode); - if graphisme=2 then dessin_34C(indexTco,Canvas,x,y,Mode); -end; - -// calcul des facteurs de réductions X et Y pour l'adapter à l'image de destination -procedure calcul_reduction(Var frx,fry : single;DimDestX,DimDestY : integer); -begin - frx:=DimDestX/ZoomMax; - fry:=DimDestY/ZoomMax; - //Affiche(formatfloat('0.000000',frY),clyellow); -end; procedure Signal_180(index : integer;ImageSource : TImage;x,y : integer;FrX,FrY : real;inverse : boolean); var p : array[0..2] of TPoint; @@ -11973,8 +11977,6 @@ begin end; {$IFEND} - - Label1.Font.Size:=round(12*RedFonte); Label2.Font.Size:=round(12*RedFonte); Label3.Font.Size:=round(12*RedFonte); @@ -12302,7 +12304,6 @@ begin begin //Affiche('Affecte train canton'+intToSTR(canton[idcanton].numero),clYellow); sens:=sens_train_canton(AdrTrain,Idcanton); - affecte_train_canton(AncTrain,idcanton,sens); end; end; @@ -13986,7 +13987,7 @@ end; // affiche le tracé de det1 à det2; n°Train n°i (pas son index), adresseTrain, mode=0=éteint =1 allumejaune =2 allume selon index, // posAig=false : ne tient pas compte de la position des aiguillages pour le tracé (cherche en récursif det2 // = true : suit le tracé suivant la position des aiguillages jusque det2 -// affecte_loco=true : affecte loco si on rencontre un canton. Si mode=0 çà désaffecte la loco au canton +// affecte_loco=true : affecte loco si on rencontre un canton. Si mode=0 çà désaffecte la loco du canton // =false : ne change pas l'affectation d'un canton rencontré function zone_tco(indexTCO,det1,det2,train,adrTrain,mode: integer;posAig,affecte_loco : boolean) : boolean; overload; begin @@ -18339,7 +18340,7 @@ begin end; procedure TFormTCO.PopupMenu1Popup(Sender: TObject); -var Bim,oriente,piedFeu,indexTCO : integer; +var Bim,oriente,piedFeu,indexTCO,idc,idt : integer; c : Tcomponent; begin if affevt then Affiche('on popup',clyellow); @@ -18411,12 +18412,23 @@ begin if iscanton(Bim) then begin PopUpMenu1.Items[12].Enabled:=true; - PopUpMenu1.Items[13].Enabled:=true + PopUpMenu1.Items[13].Enabled:=true; + idc:=index_canton(indexTCO,XClicCell[indexTCO],YClicCell[indexTCO]); + PopUpMenu1.Items[14].Enabled:=false; + if idc<>0 then + begin + idt:=canton[idc].indexTrain; + if idt<>0 then + begin + PopUpMenu1.Items[14].Enabled:=true; + end; + end; end else begin PopUpMenu1.Items[12].Enabled:=false; PopUpMenu1.Items[13].Enabled:=false; + PopUpMenu1.Items[14].Enabled:=false; end; end; @@ -19646,16 +19658,15 @@ var x,y : integer; trouve : boolean; begin IndexTCOCourant:=index_TCOMainMenu; - AchercherDet:=0; + AchercherDetAig:=0; AchercherCanton:=0; FormIntro.showmodal; y:=1; repeat x:=1; repeat - if AchercherDet<>0 then trouve:=tco[IndexTCOCourant,x,y].Adresse=AchercherDet; - if AchercherCanton<>0 then - trouve:=tco[IndexTCOCourant,x,y].NumCanton=Acherchercanton; + if AchercherDetAig<>0 then trouve:=tco[IndexTCOCourant,x,y].Adresse=AchercherDetAig; + if AchercherCanton<>0 then trouve:=tco[IndexTCOCourant,x,y].NumCanton=Acherchercanton; inc(x); until (x>NbreCellX[IndexTCOCourant]) or trouve; inc(y); @@ -19710,6 +19721,23 @@ begin trackBarZoom.Left:=i; end; +procedure TFormTCO.Afficherlecompteurdevitessedutrain1Click(Sender: TObject); +var idc,IndexTCO : integer; + c : Tcomponent; +begin + c:=popupmenu1.PopupComponent ; // imageTCO + c:=c.GetParentComponent; // scrollBox + c:=c.GetParentComponent; // formTCO + indexTCO:=index_tco(c); + idc:=index_canton(indexTCO,XClicCell[indexTCO],YClicCell[indexTCO]); + if idc=0 then exit; + Idc:=canton[idc].indexTrain; + if idc=0 then exit; + + change_clic_train(Idc); + formCompteur[1].Show; +end; + end. diff --git a/selection_train.pas b/selection_train.pas index 2d3d33f..ae7d876 100644 --- a/selection_train.pas +++ b/selection_train.pas @@ -251,7 +251,8 @@ procedure affecte_Train_canton(AdrTrain,idcanton,sens : integer); var idTrain,t,el1,el2 : integer; t1,t2 : tequipement; begin - if ProcPrinc then AfficheDebug('Affecte_train_canton: @='+intToSTR(AdrTrain)+' Idcanton='+intToSTR(idcanton),clorange); + if ProcPrinc then + AfficheDebug('Affecte_train_canton: @='+intToSTR(AdrTrain)+' Idcanton='+intToSTR(idcanton),clorange); //Affiche('Affecte_train_canton: @='+intToSTR(AdrTrain)+' Idcanton='+intToSTR(idcanton),clyellow); if (IdCanton>0) and (idCanton<=nCantons) then begin @@ -284,13 +285,14 @@ begin TCO[t,canton[idCanton].x,canton[idCanton].y].train:=idTrain; end; - if AdrTrain=0 then + if AdrTrain=0 then // effacement train du canton begin - idTrain:=0; + idTrain:=canton[Idcanton].indexTrain; + trains[idTrain].canton:=0; canton[Idcanton].NomTrain:=''; canton[Idcanton].indexTrain:=0; canton[IdCanton].adresseTrain:=0; - // a revoir IDTrain=0 !!!! Maj_icone_train(Image_Train[idTrain],idTrain,clWhite); + idTrain:=0; end; // si l'un des deux éléments adjacents au canton est un détecteur à 1, affecter la loco au détecteur @@ -641,7 +643,7 @@ begin //raz_trains_idcanton(IdCantonSelect); // au retour, route contient la route du train razé du canton raz_cantons_train(trains[AutreTrain].adresse,true); //Affiche('Et 1',clYellow); - maj_signaux(true); + maj_signaux(false); end; @@ -655,7 +657,7 @@ begin affecte_Train_canton(trains[indexTrainClic].adresse,IdCantonSelect,sensLoco); // le train affecté contient la route du train razé LabelInfo.caption:='Affectation du train '+intToSTR(IndexTrainClic)+' '+trains[indexTrainClic].nom_train+' au canton '+intToSTR(canton[idcantonSelect].numero); - maj_signaux(true); + maj_signaux(false); end; end; end; @@ -701,10 +703,10 @@ begin exit; end; - renseigne_canton(IdAutreCanton); //?? pourquoi faire le canton est normalement déje renseigné + renseigne_canton(IdAutreCanton); //?? pourquoi faire le canton est normalement déjà renseigné affecte_Train_canton(AdrTrain,idAutreCanton,f); //Affiche('Et 3',clYellow); - maj_signaux(true); + maj_signaux(false); end; end; @@ -722,6 +724,7 @@ begin begin dessin_canton(i,0); end; + maj_signaux(false); end; @@ -739,8 +742,8 @@ begin end; end; - Quel_canton(x,y,el); - FormSelTrain.caption:=s; // s est indéfini !! + Quel_canton(x,y,el); // renvoie le canton en fonction de la var globale IdCantonSelect + FormSelTrain.caption:=''; // s est indéfini !! with formSelTrain.ComboBoxCanton do begin @@ -784,7 +787,7 @@ begin until trouve or (i>=n); if trouve then begin - Positionne_SG(i-1); + Positionne_SG(i-1); // positionne la scrollbar end; end; end; diff --git a/verif_version.pas b/verif_version.pas index b41b96f..3c6589c 100644 --- a/verif_version.pas +++ b/verif_version.pas @@ -26,7 +26,7 @@ var f : textFile; Const -VersionSC = '10.6'; // sert à la comparaison de la version publiée +VersionSC = '10.7'; // sert à la comparaison de la version publiée SousVersion=' '; // A B C ... en cas d'absence de sous version mettre un espace // pour unzip SHCONTCH_NOPROGRESSBOX=4; @@ -574,58 +574,29 @@ begin if V_utile=V_publie then Affiche('Votre version '+Version+SousVersion+' est à jour',clLime); if V_utile>V_publie then Affiche('Votre version '+version+SousVersion+' est plus récente que la version publiée '+s,clLime); end; - end; -{ -procedure TFormVersion.TimerVerifTimer(Sender: TObject); -var V_utile,V_publie : real; - erreur: integer; - s : string; -begin - if lance_verif>0 then dec(lance_verif); - if lance_verif=0 then - begin - if not(verifVersion) then exit; - if debug=1 then Affiche('Vérification version en ligne',clLime); - V_publie:=verifie_version; - if notificationVersion and (v_publie>0) then - begin - val(version,V_utile,erreur); - str(v_publie:2:2,s); - if V_utile=V_publie then Affiche('Votre version '+Version+SousVersion+' est à jour',clLime); - if V_utile>V_publie then Affiche('Votre version '+version+SousVersion+' est plus récente que la version publiée '+s,clLime); - end; - end; -end; -} -// ne parche pas pour les répertoires non vides +// ne marche pas pour les répertoires non vides procedure DeleteDirectory(const DirName: string); -var - FileFolderOperation: TSHFileOpStruct; +var fos: TSHFileOpStruct; begin - FillChar(FileFolderOperation, SizeOf(FileFolderOperation), 0); - FileFolderOperation.wFunc := FO_DELETE; - FileFolderOperation.pFrom := PChar(ExcludeTrailingPathDelimiter(DirName) + #0); - FileFolderOperation.fFlags := FOF_SILENT or FOF_NOERRORUI or FOF_NOCONFIRMATION; - SHFileOperation(FileFolderOperation); + FillChar(Fos, SizeOf(Fos),0); + Fos.wFunc:=FO_DELETE; + Fos.pFrom:=PChar(ExcludeTrailingPathDelimiter(DirName) + #0); + Fos.fFlags:=FOF_SILENT or FOF_NOERRORUI or FOF_NOCONFIRMATION; + SHFileOperation(Fos); end; function DelDir(Dir: String): Boolean; var fos: TSHFileOpStruct; begin ZeroMemory(@fos,SizeOf(fos)); - with fos do - begin - wFunc:=FO_DELETE; - fFlags:=FOF_SILENT or FOF_NOCONFIRMATION; - pFrom:=PChar(Dir + #0); - end; + fos.wFunc:=FO_DELETE; + fos.pFrom:=PChar(Dir + #0); + fos.fFlags:=FOF_SILENT or FOF_NOCONFIRMATION; Result:=(0=ShFileOperation(fos)); end; - - begin end. diff --git a/versions.txt b/versions.txt index 982d211..cc6ca3e 100644 --- a/versions.txt +++ b/versions.txt @@ -338,18 +338,12 @@ version 10.6 : Modification pour l'affichage de la barre de zoom du TCO pour les versions les plus récentes de W11. Ajout des touches + et - pour le zoom du TCO. Correction des affichages lors des mises à l'échelle du texte dans win10/11. - - - +version 10.7 : Affichage du compteur de train depuis le menu contextuel des cantons du tco. + En roulage ou RUN CDM, suppression d'un train non suivi de la liste des trains en roulage. + Correction désaffectation trains sur cantons. - - - - - - -- \ No newline at end of file + \ No newline at end of file