~mjmendoza/quixie/trunk

« back to all changes in this revision

Viewing changes to src/core/kse_Main_Header_Engine.cpp

  • Committer: creek23
  • Date: 2018-06-12 15:52:49 UTC
  • Revision ID: svn-v4:5d579d6f-57a3-4165-9b1e-6dacaf8da75a:quixie:683
* done with partial functional testing
* it's confirmed to be compilable and tested to be partially functional :)
* silenced a huge amount of warning messages
* commented out graphics
* still todo Net/MySQL handling

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
//translated this 09.23.07@4:50PM by mjmendozaIV
 
1
//translated this 18.06.10 by mjmendozaIV
 
2
#include "../../kage.hpp"
2
3
#include "../../kageExterns.hpp"
3
4
 
4
5
//NOTE: this file consists all functions used by engine to work.
221
222
        if (sData.length() == 0) { return; }
222
223
        if (Left(sData, 1) == "#") { return; }
223
224
        
224
 
        Split(sData, "=", sRaw);
225
 
        
 
225
        sRaw = split(sData, "=");
226
226
        sRaw[0] = Trim(sRaw[0]);
227
227
        sRaw[1] = Trim(sRaw[1]);
228
228
        
264
264
        } else if (sRaw[0] == "FULLSCREEN") {
265
265
                iFullScreen = CInt(sRaw[1]);
266
266
        } else {
267
 
                Engine_Log(string("Warning: Got an unknown configuration command named (  ") + sRaw[0] + string("  ]."));
 
267
                Engine_Log(string("Warning: Got an unknown configuration command named (  ") + sRaw[0] + string("  )."));
268
268
//              Engine_Exit(); -- it's a warning, do NOT exit
269
269
        }
270
270
}
271
271
 
272
272
void Engine_Configure() {
273
 
 
274
273
                std::ifstream ifsConfigFile;
275
274
                string sTemp;
276
275
                string sFilePath; //for KONSL_file
310
309
                        }
311
310
                        //override these configurations since engine
312
311
                        //was executed by a file -- mj (11.13.06)
313
 
                                //trace "sStartScript " + sStartScript
314
 
                                sStartScript = Mid(sgblCmd, sFilePath.length() + 1);
315
 
                                if (Left(sStartScript,1) == kseSLASH) { sStartScript = Mid(sgblCmd, sFilePath.length() + 2); }
316
 
                                //trace "sStartScript " + sStartScript
317
 
                                //trace Left(sStartScript,1) + " = " + kseSLASH + " " + (Left(sStartScript,1) = kseSLASH)
 
312
                                sStartScript = Mid(sgblCmd, sFilePath.length());
 
313
                                if (Left(sStartScript,1) == kseSLASH) { sStartScript = Mid(sgblCmd, sFilePath.length() + 1); }
318
314
                                sKonsolPath = sFilePath;
319
315
                        //==========================================
320
316
                        //trace "Executing :" + sgblCmd
386
382
                        if (iNoLogFile < 1) {
387
383
                                ifstream ofsLogFile;
388
384
                                if (sKonsolPath == "") {
 
385
                                        if (fileExists(kseLOG_FILE) == true) {
 
386
                                                        remove(kseLOG_FILE.c_str());
 
387
                                        }
389
388
                                        ofsLogFile.open (kseLOG_FILE, std::ofstream::out);
390
389
                                } else {
391
390
                                        if (InStr(1, kseLOG_FILE, kseCOLON) > 0) {
 
391
                                                if (fileExists(kseLOG_FILE) == true) {
 
392
                                                        remove(kseLOG_FILE.c_str());
 
393
                                                }
392
394
                                                ofsLogFile.open (kseLOG_FILE, std::ofstream::out);
393
395
                                        } else {
 
396
                                                if (fileExists(sKonsolPath + kseSLASH + kseLOG_FILE) == true) {
 
397
                                                        remove(string(sKonsolPath + kseSLASH + kseLOG_FILE).c_str());
 
398
                                                }
394
399
                                                ofsLogFile.open (sKonsolPath + kseSLASH + kseLOG_FILE, std::ofstream::out);
395
400
                                        }
396
401
                                }
454
459
                        //kseSOURCE_SEP
455
460
                        if (sShowAboutKONSoLE == "1") {
456
461
                                Engine_Log(string("Krixware KonsolScript Engine (KWKSE)\r\n") +
457
 
                                                          string("> Quixie v0.3.") + App_Major + string(".") + App_Minor + string(".") + App_Revision + string("\r\n") +
 
462
                                                          string("> Quixie v0.4.") + App_Major + string(".") + App_Minor + string(".") + App_Revision + string("\r\n") +
458
463
                                                          string("> ") + App_Comments);
459
464
                        }
460
465
                } else {
462
467
                        sScriptPath = Left(sScriptPath, sScriptPath.length() - string(".kh").length());
463
468
                        if (sReleaseMode != "1") {
464
469
                                if (fileExists(sScriptPath + ".kh") == false) {
465
 
                                        Engine_Message(string("Unable to find starting script file (  ") + sScriptPath + string(".KH  ]."));
 
470
                                        Engine_Message(string("Unable to find starting script file (  ") + sScriptPath + string(".KH  )."));
466
471
                                        Engine_Exit();
467
472
                                }
468
473
                                sKONSoL = fileOpen(sScriptPath + string(".kh"));//, std::ifstream::in | std::ifstream::binary);
538
543
        trace("sStartScript " + sStartScript);
539
544
        if (LCase(Right(sStartScript, 3)) == ".kh") {
540
545
                
541
 
                for (i = 0; i < iFunctionCtr - 1; ++i) {
 
546
                for (i = 0; i < iFunctionCtr; ++i) {
542
547
                        if (kseFunction[i].fName == "main") {
543
548
                                remove(string(sKonsolPath + kseSLASH + Left(sStartScript, sStartScript.length() - 3) + ".konsl").c_str());
544
549
                                #ifdef QUIXIE_DEBUG
545
 
                                        Engine_Message(KSE_GetErrFileSrc(i) + "A header file could not have a (  function main()  ].");
 
550
                                        Engine_Message(KSE_GetErrFileSrc(i) + "A header file could not have a (  function main()  ).");
546
551
                                #endif
547
552
                                Engine_Exit();
548
553
                        }
551
556
                return;
552
557
        }
553
558
        
554
 
        for (i = 0; i < iFunctionCtr - 1; ++i) {
 
559
        for (i = 0; i < iFunctionCtr; ++i) {
555
560
                if (kseFunction[i].fName == "main" && IsMainFromStartScript(kseFunction[i].sFile)) {
556
561
                        if (kseFunction[i].fParCount == 0) {
557
562
                                if (kseFunction[i].bAccess) {
570
575
                                                kseFunction[i].RunScript();
571
576
                                                //game engine's main loop
572
577
                                                        //pre-check existense of _render_, _mousedown/up/move_, _keydown/up_
573
 
                                                        for (i = 0; i < iFunctionCtr - 1; ++i) {
 
578
                                                        for (i = 0; i < iFunctionCtr; ++i) {
574
579
                                                                if (kseFunction[i].fName == "render") {
575
580
                                                                        iRender = i;
576
581
                                                                } else if (kseFunction[i].fName == "cleanrender") {
624
629
        
625
630
        if (iFunctionCtr == 0) {
626
631
                Engine_Message("Error from " + sStartScript + ":\r\n" +
627
 
                                           "Cannot find KonsolScript's entry point, (  function main()  ].\r\n" +
 
632
                                           "Cannot find KonsolScript's entry point, (  function main()  ).\r\n" +
628
633
                                           "Tip: type this code in " + sStartScript + "\r\n" +
629
634
                                           String(40, "_") + "\r\n" +
630
635
                                           "  function main() {\r\n" +
680
685
                }
681
686
                int iTemp = 0; //reset iTemp to 0
682
687
                
683
 
                //set default Array length
684
 
                kseVarNum.clear();
685
 
                kseVarStr.clear();
686
 
                kseVarBool.clear();
687
 
                
688
 
                //now we can re-dimension our kseArray-array to a closer approximation
689
 
                kseArray.clear();
690
 
                kseFunction.clear();
691
688
                iKONSoLE_LastDeclaredFunction = -1;
692
689
                
693
 
//              trace("Engine_TableLookUp_Create B")
694
690
                for (i = 0; i < iTokenCtr; ++i) {
695
691
                   //Do NOT use //KSE_SkipVoidTokens(i)// -- makes this buggy
696
692
                   if (kseToken[i].sToken != kseTAB
702
698
                                        //# idea is to register in existence of "Var" only if statement is Var:Number... or :String... or :Boolean...
703
699
                                        if (kseToken[iTmpIndex].sToken == kseCOLON) {
704
700
                                                ++iTmpIndex;
705
 
//                                              trace("Engine_TableLookUp_Create B If Var: " + i + " " + (kseToken[iTmpIndex].sToken))
706
701
                                                
707
702
                                                if (kseToken[iTmpIndex].sToken == "Number") {
708
703
                                                        iTmpIndex = RegNum(iTmpIndex);
729
724
                                                
730
725
                                        }
731
726
                                } else if (kseToken[i].sToken == "Array") {
732
 
//                                      trace("Engine_TableLookUp_Create B If Array " + i)
733
727
                                        //# only Array:New... statements can reside outside functions
734
728
                                        ii = i;
735
729
                                        iTmpIndex = i + 1;
762
756
                                        if (kseToken[i].sToken != "function") { i = GetNextIndex(i); }
763
757
                                        
764
758
                                        iKONSoLE_LastDeclaredFunction = iTemp;
765
 
                                        i = kseFunction[iTemp].Register(i, b_access_stat);
 
759
                                        typeFunction l_tmpFunc;
 
760
                                        i = l_tmpFunc.Register(i, b_access_stat);
 
761
                                        kseFunction.push_back(l_tmpFunc);
766
762
//                                      cout << kseFunction[iTemp].fName << endl;
767
763
                                        --i;   //bugfix: not declaring
768
764
        //                              iTmpLast = i;
830
826
                                        i = SynQuotes(i);
831
827
                                        tmpxxx = GetTempString();
832
828
                                } else {
833
 
//                                      trace("Engine_TableLookUp_Create B Else " + i);
834
829
                                        Engine_Message(KSE_GetErrFileSrc(i) + "Unexpected (  " + KSE_GetToken(i) + "  ) at Line " + Str(kseToken[i].iLine) + "; All processes should be inside a function.");
835
830
                                        Engine_Exit();
836
831
                                }
847
842
//      //11.08.06 - prevented the implementation of a un-named variable
848
843
//      //this un-named index is created by the KSE_DeclareXXX function
849
844
        iVarNumCtr = kseVarNum.size();
850
 
        if (iVarNumCtr > 0) { Engine_Log("Implementing Numbers"); }
 
845
        if (iVarNumCtr > 0) {
 
846
                Engine_Log("Implementing Numbers");
851
847
//      trace(iVarNumCtr + " " + kseVarNum.size())
852
 
        for (i = 0; i < iVarNumCtr - 1; ++i) {
 
848
                for (i = 0; i < iVarNumCtr; ++i) {
853
849
//              trace("kseVarNum[" + i + "].sName " + kseVarNum[i].sName);
854
 
                if (kseVarNum[i].bUsed != 0) {
855
 
                        if (kseVarNum[i].sName != kseNULL_STRING) {
856
 
                                if (InStr(kseVarNum[i].sName, "[") > 0) {
857
 
                                        //do nothing
858
 
                                } else if (InStr(kseVarNum[i].sName, ".") > 0) {
859
 
                                        //do nothing
860
 
                                } else if (kseVarNum[i].sFunc == kseNULL_STRING) {
861
 
                                        //replace all global-var name existence in the code
862
 
                                        ReplaceVar(kseVarNum[i].sName, i, "", TAG_NUMBER, (kseVarNum[i].bProtect == false) ? true : false, kseVALUE_ISTOKENNUM);
863
 
                                } else {
864
 
                                        //set all local vars (but not arg-vars) as not being use.
865
 
                                        if (kseVarNum[i].bArgs == false) { kseVarNum[i].bUsed = false; }
866
 
                                        ReplaceVar(kseVarNum[i].sName, i, kseVarNum[i].sFunc, TAG_NUMBER, (kseVarNum[i].bProtect == false) ? true : false, kseVALUE_ISTOKENNUM);
 
850
                        if (kseVarNum[i].bUsed == true) {
 
851
                                if (kseVarNum[i].sName != kseNULL_STRING) {
 
852
                                        if (InStr(kseVarNum[i].sName, "[") > 0) {
 
853
                                                //do nothing
 
854
                                        } else if (InStr(kseVarNum[i].sName, ".") > 0) {
 
855
                                                //do nothing
 
856
                                        } else if (kseVarNum[i].sFunc == kseNULL_STRING) {
 
857
                                                //replace all global-var name existence in the code
 
858
                                                ReplaceVar(kseVarNum[i].sName, i, "", TAG_NUMBER, (kseVarNum[i].bProtect == false) ? true : false, kseVALUE_ISTOKENNUM);
 
859
                                        } else {
 
860
                                                //set all local vars (but not arg-vars) as not being use.
 
861
                                                if (kseVarNum[i].bArgs == false) { kseVarNum[i].bUsed = false; }
 
862
                                                ReplaceVar(kseVarNum[i].sName, i, kseVarNum[i].sFunc, TAG_NUMBER, (kseVarNum[i].bProtect == false) ? true : false, kseVALUE_ISTOKENNUM);
 
863
                                        }
867
864
                                }
868
865
                        }
869
866
                }
870
867
        }
871
868
        iVarStrCtr = kseVarStr.size();
872
 
        if (iVarStrCtr > 0) { Engine_Log("Implementing Strings"); }
873
 
//      trace(iVarStrCtr + " " + kseVarStr.size());
874
 
        for (i = 0; i < iVarStrCtr - 1; ++i) {
875
 
//              trace("kseVarStr[" + i + "].sName " + kseVarStr[i].sName);
876
 
                if (kseVarStr[i].bUsed != 0) {
877
 
                        if (kseVarStr[i].sName != kseNULL_STRING) {
878
 
                                if (InStr(kseVarStr[i].sName, "[") > 0) {
879
 
                                        //do nothing
880
 
                                } else if (InStr(kseVarStr[i].sName, ".") > 0) {
881
 
                                        //do nothing
882
 
                                } else if (kseVarStr[i].sFunc == kseNULL_STRING) {
883
 
                                        //replace all global-var name existence in the code
884
 
                                        ReplaceVar(kseVarStr[i].sName, i, "", TAG_STRING, (kseVarStr[i].bProtect == false) ? true : false, kseVALUE_ISTOKENSTR);
885
 
                                } else {
886
 
                                        //set all local vars (but not arg-vars) as not being use.
887
 
                                        if (kseVarStr[i].bArgs == false) { kseVarStr[i].bUsed = false; }
888
 
                                        ReplaceVar(kseVarStr[i].sName, i, kseVarStr[i].sFunc, TAG_STRING, (kseVarStr[i].bProtect == false) ? true : false, kseVALUE_ISTOKENSTR);
 
869
        if (iVarStrCtr > 0) {
 
870
                Engine_Log("Implementing Strings");
 
871
                for (i = 0; i < iVarStrCtr; ++i) {
 
872
                        if (kseVarStr[i].bUsed != 0) {
 
873
                                if (kseVarStr[i].sName != kseNULL_STRING) {
 
874
                                        if (InStr(kseVarStr[i].sName, "[") > 0) {
 
875
                                                //do nothing
 
876
                                        } else if (InStr(kseVarStr[i].sName, ".") > 0) {
 
877
                                                //do nothing
 
878
                                        } else if (kseVarStr[i].sFunc == kseNULL_STRING) {
 
879
                                                //replace all global-var name existence in the code
 
880
                                                ReplaceVar(kseVarStr[i].sName, i, "", TAG_STRING, (kseVarStr[i].bProtect == false) ? true : false, kseVALUE_ISTOKENSTR);
 
881
                                        } else {
 
882
                                                //set all local vars (but not arg-vars) as not being use.
 
883
                                                if (kseVarStr[i].bArgs == false) { kseVarStr[i].bUsed = false; }
 
884
                                                ReplaceVar(kseVarStr[i].sName, i, kseVarStr[i].sFunc, TAG_STRING, (kseVarStr[i].bProtect == false) ? true : false, kseVALUE_ISTOKENSTR);
 
885
                                        }
889
886
                                }
890
887
                        }
891
888
                }
892
889
        }
893
890
        iVarBoolCtr = kseVarBool.size();
894
 
        if (iVarBoolCtr > 0) { Engine_Log("Implementing Booleans"); }
895
 
//      trace(iVarBoolCtr + " " + kseVarBool.size());
896
 
        for (i = 0; i < iVarBoolCtr - 1; ++i) {
897
 
//              trace("kseVarBool[" + i + "].sName " + kseVarBool[i].sName);
898
 
                if (kseVarBool[i].bUsed != 0) {
899
 
                        if (kseVarBool[i].sName != kseNULL_STRING) {
900
 
                                if (InStr(kseVarBool[i].sName, "[") > 0) {
901
 
                                        //do nothing
902
 
                                } else if (InStr(kseVarBool[i].sName, ".") > 0) {
903
 
                                        //do nothing
904
 
                                } else if (kseVarBool[i].sFunc == kseNULL_STRING) {
905
 
                                        //replace all global-var name existence in the code
906
 
                                        ReplaceVar(kseVarBool[i].sName, i, "", TAG_BOOLEAN, (kseVarBool[i].bProtect == false) ? true : false, kseVALUE_ISTOKENBOOL);
907
 
                                } else {
908
 
                                        //set all local vars (but not arg-vars) as not being use.
909
 
                                        if (kseVarBool[i].bArgs == false) { kseVarBool[i].bUsed = false; }
910
 
                                        ReplaceVar(kseVarBool[i].sName, i, kseVarBool[i].sFunc, TAG_BOOLEAN, (kseVarBool[i].bProtect == false) ? true : false, kseVALUE_ISTOKENBOOL);
 
891
        if (iVarBoolCtr > 0) {
 
892
                Engine_Log("Implementing Booleans");
 
893
                for (i = 0; i < iVarBoolCtr; ++i) {
 
894
                        if (kseVarBool[i].bUsed != 0) {
 
895
                                if (kseVarBool[i].sName != kseNULL_STRING) {
 
896
                                        if (InStr(kseVarBool[i].sName, "[") > 0) {
 
897
                                                //do nothing
 
898
                                        } else if (InStr(kseVarBool[i].sName, ".") > 0) {
 
899
                                                //do nothing
 
900
                                        } else if (kseVarBool[i].sFunc == kseNULL_STRING) {
 
901
                                                //replace all global-var name existence in the code
 
902
                                                ReplaceVar(kseVarBool[i].sName, i, "", TAG_BOOLEAN, (kseVarBool[i].bProtect == false) ? true : false, kseVALUE_ISTOKENBOOL);
 
903
                                        } else {
 
904
                                                //set all local vars (but not arg-vars) as not being use.
 
905
                                                if (kseVarBool[i].bArgs == false) { kseVarBool[i].bUsed = false; }
 
906
                                                ReplaceVar(kseVarBool[i].sName, i, kseVarBool[i].sFunc, TAG_BOOLEAN, (kseVarBool[i].bProtect == false) ? true : false, kseVALUE_ISTOKENBOOL);
 
907
                                        }
911
908
                                }
912
909
                        }
913
910
                }
914
911
        }
915
912
        
916
 
        if (kseArray.size() > 0) { Engine_Log("Implementing Arrays"); }
917
 
//      trace(kseArray.size() + " " + kseArray.size());
918
 
        for (i = 0; i < kseArray.size(); ++i) {
919
 
                //replace all array name existence in the code
920
 
//              trace("kseArray[" + i + "].sName " + kseArray[i].sName);
921
 
                if (kseArray[i].sName != kseNULL_STRING) {
922
 
                        ReplaceVar(kseArray[i].sName, i, "", "A", "", kseVALUE_ISTOKENARRAY);
 
913
        if (kseArray.size() > 0) {
 
914
                Engine_Log("Implementing Arrays");
 
915
                for (i = 0; i < kseArray.size(); ++i) {
 
916
                        //replace all array name existence in the code
 
917
                        if (kseArray[i].sName != kseNULL_STRING) {
 
918
                                ReplaceVar(kseArray[i].sName, i, "", "A", "", kseVALUE_ISTOKENARRAY);
 
919
                        }
923
920
                }
924
921
        }
925
922
        iFunctionCtr = kseFunction.size();
926
 
        if (iFunctionCtr > 0) { Engine_Log("Implementing Functions"); }
927
 
        for (i = 0; i < iFunctionCtr - 1; ++i) {
928
 
                //replace all user-function name existence in the code
929
 
                if (kseFunction[i].fName != kseNULL_STRING) {
930
 
                        ReplaceVar(kseFunction[i].fName, i, "", TAG_USER_FUNCTION);
931
 
//                      trace("G-" + i + " > " + kseFunction[i].fName);
 
923
        if (iFunctionCtr > 0) {
 
924
                Engine_Log("Implementing Functions");
 
925
                for (i = 0; i < iFunctionCtr; ++i) {
 
926
                        //replace all user-function name existence in the code
 
927
                        if (kseFunction[i].fName != kseNULL_STRING) {
 
928
                                ReplaceVar(kseFunction[i].fName, i, "", TAG_USER_FUNCTION);
 
929
                        }
932
930
                }
933
931
        }
934
932
        
935
 
        if (kseUDT_Instance.size() > 0) { Engine_Log("Implementing UDT"); }
936
 
//      trace(kseUDT_Instance.size() + " " + kseUDT_Instance.size());
937
 
        for (i = 0; i < kseUDT_Instance.size(); ++i) {
938
 
                //replace all user-defined-type name existence in the code
939
 
                //trace("kseUDT_Instance[" + i + "].sName " + kseUDT_Instance[i].sName);
940
 
                if (kseUDT_Instance[i].sName != kseNULL_STRING) {
941
 
                        if (InStr(kseUDT_Instance[i].sName, "[") > 0) {
 
933
        if (kseUDT_Instance.size() > 0) {
 
934
                Engine_Log("Implementing UDT");
 
935
                for (i = 0; i < kseUDT_Instance.size(); ++i) {
 
936
                        //replace all user-defined-type name existence in the code
 
937
                        if (kseUDT_Instance[i].sName != kseNULL_STRING) {
 
938
                                if (InStr(kseUDT_Instance[i].sName, "[") > 0) {
 
939
                                                //do nothing
 
940
                                } else if (InStr(kseUDT_Instance[i].sName, ".") > 0) {
942
941
                                        //do nothing
943
 
                        } else if (InStr(kseUDT_Instance[i].sName, ".") > 0) {
944
 
                                //do nothing
945
 
                        } else {
946
 
                                ReplaceVar(kseUDT_Instance[i].sName, i, kseUDT_Instance[i].sFunc, TAG_USER_TYPE, (kseUDT_Instance[i].bProtect == false), kseVALUE_ISTOKENUDT);
 
942
                                } else {
 
943
                                        ReplaceVar(kseUDT_Instance[i].sName, i, kseUDT_Instance[i].sFunc, TAG_USER_TYPE, (kseUDT_Instance[i].bProtect == false), kseVALUE_ISTOKENUDT);
 
944
                                }
947
945
                        }
948
 
//                      trace("G-" + i + " > " + kseFunction[i].fName);
949
946
                }
950
947
        }
951
948
}
1025
1022
                                                                                kseToken[ii].lPtr = iTmpInd;
1026
1023
                                                                                //kseToken[ii].lCmd = lCmd;
1027
1024
                                                                                ++iVarExistsCtr;
1028
 
//trace "ReplaceVar Aaa"
1029
1025
                                                                        }
1030
1026
                                                                }
1031
1027
                                                        } else if (kseToken[ii].sToken == kseSEMICOLON) {
1048
1044
                                                                kseToken[i].lPtr = iTmpInd;
1049
1045
                                                                //kseToken[i].lCmd = lCmd;
1050
1046
                                                                ++iVarExistsCtr;
1051
 
//trace "ReplaceVar A"
1052
1047
                                                        }
1053
1048
                                                }
1054
1049
                                        }
1099
1094
                                                                                                                                        kseToken[iix].lPtr = iTmpInd;
1100
1095
                                                                                                                                        //kseToken[iix].lCmd = lCmd;
1101
1096
                                                                                                                                        ++iVarExistsCtr;
1102
 
//trace "ReplaceVar B"
1103
1097
                                                                                                                                }
1104
1098
                                                                                                                        }
1105
1099
                                                                                                                }
1134
1128
                                                                                kseToken[iii].lPtr = iTmpInd;
1135
1129
                                                                                //kseToken[iii].lCmd = lCmd;
1136
1130
                                                                                ++iVarExistsCtr;
1137
 
//trace "ReplaceVar C"
1138
1131
                                                                        }
1139
1132
                                                                }
1140
1133
                                                        }