From cb3bcb8c253ccf7ac437eec4143a64fec7e86c14 Mon Sep 17 00:00:00 2001 From: Tiago Garcia Date: Wed, 6 Nov 2024 01:37:12 +0000 Subject: [PATCH] [SO] Add pratice exam Signed-off-by: Tiago Garcia --- .../so/practice-exam/so+fso-1920-epnm-v2.pdf | Bin 0 -> 71715 bytes 3ano/1semestre/so/practice-exam/src/Makefile | 21 + .../so/practice-exam/src/doc/html/bc_s.png | Bin 0 -> 676 bytes .../so/practice-exam/src/doc/html/bdwn.png | Bin 0 -> 147 bytes .../so/practice-exam/src/doc/html/closed.png | Bin 0 -> 132 bytes .../so/practice-exam/src/doc/html/dbc_8h.html | 108 + .../so/practice-exam/src/doc/html/dbc_8h.js | 7 + .../src/doc/html/dbc_8h_source.html | 203 ++ .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 95 + .../so/practice-exam/src/doc/html/doc.png | Bin 0 -> 746 bytes .../so/practice-exam/src/doc/html/doxygen.css | 1771 +++++++++++++++++ .../so/practice-exam/src/doc/html/doxygen.png | Bin 0 -> 3779 bytes .../practice-exam/src/doc/html/dynsections.js | 120 ++ .../so/practice-exam/src/doc/html/files.html | 86 + .../practice-exam/src/doc/html/files_dup.js | 7 + .../src/doc/html/folderclosed.png | Bin 0 -> 616 bytes .../practice-exam/src/doc/html/folderopen.png | Bin 0 -> 597 bytes .../practice-exam/src/doc/html/globals.html | 439 ++++ .../src/doc/html/globals_defs.html | 127 ++ .../src/doc/html/globals_func.html | 376 ++++ .../src/doc/html/group___db_c.html | 305 +++ .../src/doc/html/group___db_c.js | 8 + .../src/doc/html/group__process.html | 1255 ++++++++++++ .../src/doc/html/group__process.js | 36 + .../src/doc/html/group__thread.html | 1417 +++++++++++++ .../src/doc/html/group__thread.js | 42 + .../src/doc/html/group__utils.html | 1619 +++++++++++++++ .../src/doc/html/group__utils.js | 38 + .../so/practice-exam/src/doc/html/index.html | 78 + .../so/practice-exam/src/doc/html/jquery.js | 35 + .../so/practice-exam/src/doc/html/menu.js | 50 + .../so/practice-exam/src/doc/html/menudata.js | 50 + .../practice-exam/src/doc/html/modules.html | 86 + .../so/practice-exam/src/doc/html/modules.js | 7 + .../so/practice-exam/src/doc/html/nav_f.png | Bin 0 -> 153 bytes .../so/practice-exam/src/doc/html/nav_g.png | Bin 0 -> 95 bytes .../so/practice-exam/src/doc/html/nav_h.png | Bin 0 -> 98 bytes .../so/practice-exam/src/doc/html/navtree.css | 146 ++ .../so/practice-exam/src/doc/html/navtree.js | 544 +++++ .../practice-exam/src/doc/html/navtreedata.js | 44 + .../src/doc/html/navtreeindex0.js | 238 +++ .../so/practice-exam/src/doc/html/open.png | Bin 0 -> 123 bytes .../src/doc/html/process_8h.html | 296 +++ .../practice-exam/src/doc/html/process_8h.js | 35 + .../src/doc/html/process_8h_source.html | 201 ++ .../so/practice-exam/src/doc/html/resize.js | 137 ++ .../practice-exam/src/doc/html/splitbar.png | Bin 0 -> 314 bytes .../practice-exam/src/doc/html/sync_off.png | Bin 0 -> 853 bytes .../so/practice-exam/src/doc/html/sync_on.png | Bin 0 -> 845 bytes .../so/practice-exam/src/doc/html/tab_a.png | Bin 0 -> 142 bytes .../so/practice-exam/src/doc/html/tab_b.png | Bin 0 -> 169 bytes .../so/practice-exam/src/doc/html/tab_h.png | Bin 0 -> 177 bytes .../so/practice-exam/src/doc/html/tab_s.png | Bin 0 -> 184 bytes .../so/practice-exam/src/doc/html/tabs.css | 1 + .../practice-exam/src/doc/html/thread_8h.html | 263 +++ .../practice-exam/src/doc/html/thread_8h.js | 41 + .../src/doc/html/thread_8h_source.html | 207 ++ .../practice-exam/src/doc/html/utils_8h.html | 208 ++ .../so/practice-exam/src/doc/html/utils_8h.js | 37 + .../src/doc/html/utils_8h_source.html | 330 +++ .../so/practice-exam/src/include/dbc.h | 186 ++ .../so/practice-exam/src/include/process.h | 531 +++++ .../so/practice-exam/src/include/thread.h | 665 +++++++ .../so/practice-exam/src/include/utils.h | 658 ++++++ .../practice-exam/src/lib/libsoconcur-excp.a | Bin 0 -> 256594 bytes .../so/practice-exam/src/lib/libsoconcur.a | Bin 0 -> 205322 bytes 3ano/1semestre/so/practice-exam/src/pfifo.cpp | 171 ++ 3ano/1semestre/so/practice-exam/src/pfifo.h | 47 + .../1semestre/so/practice-exam/src/settings.h | 96 + 3ano/1semestre/so/practice-exam/src/urgency | Bin 0 -> 152776 bytes .../so/practice-exam/src/urgency.cpp | 374 ++++ 71 files changed, 13842 insertions(+) create mode 100644 3ano/1semestre/so/practice-exam/so+fso-1920-epnm-v2.pdf create mode 100644 3ano/1semestre/so/practice-exam/src/Makefile create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/bc_s.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/bdwn.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/closed.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/dbc_8h.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/dbc_8h.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/dbc_8h_source.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/doc.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/doxygen.css create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/doxygen.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/dynsections.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/files.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/files_dup.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/folderclosed.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/folderopen.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/globals.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/globals_defs.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/globals_func.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/group___db_c.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/group___db_c.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/group__process.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/group__process.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/group__thread.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/group__thread.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/group__utils.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/group__utils.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/index.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/jquery.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/menu.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/menudata.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/modules.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/modules.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/nav_f.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/nav_g.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/nav_h.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/navtree.css create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/navtree.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/navtreedata.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/navtreeindex0.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/open.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/process_8h.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/process_8h.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/process_8h_source.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/resize.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/splitbar.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/sync_off.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/sync_on.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/tab_a.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/tab_b.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/tab_h.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/tab_s.png create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/tabs.css create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/thread_8h.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/thread_8h.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/thread_8h_source.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/utils_8h.html create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/utils_8h.js create mode 100644 3ano/1semestre/so/practice-exam/src/doc/html/utils_8h_source.html create mode 100644 3ano/1semestre/so/practice-exam/src/include/dbc.h create mode 100644 3ano/1semestre/so/practice-exam/src/include/process.h create mode 100644 3ano/1semestre/so/practice-exam/src/include/thread.h create mode 100644 3ano/1semestre/so/practice-exam/src/include/utils.h create mode 100644 3ano/1semestre/so/practice-exam/src/lib/libsoconcur-excp.a create mode 100644 3ano/1semestre/so/practice-exam/src/lib/libsoconcur.a create mode 100644 3ano/1semestre/so/practice-exam/src/pfifo.cpp create mode 100644 3ano/1semestre/so/practice-exam/src/pfifo.h create mode 100644 3ano/1semestre/so/practice-exam/src/settings.h create mode 100755 3ano/1semestre/so/practice-exam/src/urgency create mode 100644 3ano/1semestre/so/practice-exam/src/urgency.cpp diff --git a/3ano/1semestre/so/practice-exam/so+fso-1920-epnm-v2.pdf b/3ano/1semestre/so/practice-exam/so+fso-1920-epnm-v2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..812305c6c69e1ca715846feb68798120bbec7c33 GIT binary patch literal 71715 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
  • 53Wom5Q>r4Ia70TP9dC9*eTv*7SRpuhn$I3x2o9 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 literal 0 HcmV?d00001 diff --git a/3ano/1semestre/so/practice-exam/src/Makefile b/3ano/1semestre/so/practice-exam/src/Makefile new file mode 100644 index 0000000..f45931a --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/Makefile @@ -0,0 +1,21 @@ +CXX = g++ +CPPFLAGS=-Wall -Wfatal-errors -Wno-write-strings -Wno-unused-function -ggdb -pthread -Iinclude # -DEXCEPTION_POLICY or -DEXIT_POLICY +LDFLAGS = -Llib -lsoconcur + +OBJS=pfifo.o urgency.o + +TARGET = urgency + +.PHONY: all clean cleanall + +all: $(TARGET) + +urgency: $(OBJS) + $(CXX) $(CPPFLAGS) -o $@ $^ $(LDFLAGS) + +clean: + rm -fv *.o core + +cleanall: clean + rm -f $(TARGET) + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/bc_s.png b/3ano/1semestre/so/practice-exam/src/doc/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/bdwn.png b/3ano/1semestre/so/practice-exam/src/doc/html/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/dbc_8h.html b/3ano/1semestre/so/practice-exam/src/doc/html/dbc_8h.html new file mode 100644 index 0000000..f8495c8 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/dbc_8h.html @@ -0,0 +1,108 @@ + + + + + + + +C++ Library, mos@ua: dbc.h File Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      + +
      +
      dbc.h File Reference
      +
      +
      + +

      Design-by-Contract module. +More...

      +
      #include <stdio.h>
      +#include <stdlib.h>
      +#include <assert.h>
      +#include "utils.h"
      +
      +

      Go to the source code of this file.

      + + + + + + + + + + + + + + +

      +Macros

      #define check(condition, message)
       Checks the verification of an general algorithm assertion. More...
       
      #define require(condition, message)
       Checks the verification of a precondition. More...
       
      #define ensure(condition, message)
       Checks the verification of a postcondition. More...
       
      #define invariant(condition, message)
       Checks the verification of an invariant. More...
       
      +

      Detailed Description

      +

      Design-by-Contract module.

      +
      +
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/dbc_8h.js b/3ano/1semestre/so/practice-exam/src/doc/html/dbc_8h.js new file mode 100644 index 0000000..8d4c28c --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/dbc_8h.js @@ -0,0 +1,7 @@ +var dbc_8h = +[ + [ "check", "group___db_c.html#gac101c8ba449f6f8c71b3789a9c489221", null ], + [ "require", "group___db_c.html#ga5bf1825f80465097d4b753a001cf1af8", null ], + [ "ensure", "group___db_c.html#ga5d17c602c4f191371a5fec5af7adc3cf", null ], + [ "invariant", "group___db_c.html#gaf9d59b04beef1bf139e10fc44c6f9725", null ] +]; \ No newline at end of file diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/dbc_8h_source.html b/3ano/1semestre/so/practice-exam/src/doc/html/dbc_8h_source.html new file mode 100644 index 0000000..1e46f7e --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/dbc_8h_source.html @@ -0,0 +1,203 @@ + + + + + + + +C++ Library, mos@ua: dbc.h Source File + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      dbc.h
      +
      +
      +Go to the documentation of this file.
      1 
      +
      34 #ifndef DBC_H
      +
      35 #define DBC_H
      +
      36 
      +
      37 #include <stdio.h>
      +
      38 #include <stdlib.h>
      +
      39 #include <assert.h>
      +
      40 #include "utils.h"
      +
      41 
      +
      42 #ifdef NDEBUG
      +
      43 #define NDEBUG_CHECKS
      +
      44 #define NDEBUG_PRECONDITIONS
      +
      45 #define NDEBUG_POSTCONDITIONS
      +
      46 #define NDEBUG_INVARIANTS
      +
      47 #endif
      +
      48 
      +
      49 #ifdef DEBUG_ONLY_PRECONDITIONS
      +
      50 #ifdef NDEBUG_PRECONDITIONS
      +
      51 #undef NDEBUG_PRECONDITIONS
      +
      52 #endif
      +
      53 #ifndef NDEBUG_CHECKS
      +
      54 #define NDEBUG_CHECKS
      +
      55 #endif
      +
      56 #ifndef NDEBUG_POSTCONDITIONS
      +
      57 #define NDEBUG_POSTCONDITIONS
      +
      58 #endif
      +
      59 #ifndef NDEBUG_INVARIANTS
      +
      60 #define NDEBUG_INVARIANTS
      +
      61 #endif
      +
      62 #endif
      +
      63 
      +
      64 // check:
      +
      65 #ifdef NDEBUG_CHECKS
      +
      66 #define check(condition, message)
      +
      67 #else
      +
      68 #if defined __cplusplus && defined EXCEPTION_POLICY
      +
      69 #define check(condition, message) \
      +
      70  if (!(condition)) \
      +
      71  throw string_concat(NULL, 0, (char*)"Assertion fail", message[0] ? (char*)": " : (char*)"", message, (char*)", assertion: \"", #condition, (char*)"\", function: \"", __FUNCTION__, (char*)"\":", int2str(__LINE__), (char*)", file: \"", __FILE__, (char*)"\"\n", NULL)
      +
      72 #else // EXIT_POLICY (default)
      +
      73 
      +
      81 #define check(condition, message) \
      +
      82  if (!(condition)) \
      +
      83  do { \
      +
      84  fprintf (stderr, "Assertion fail%s%s, assertion: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \
      +
      85  message[0] ? ": " : "", message, #condition, __FUNCTION__, __LINE__ , __FILE__); \
      +
      86  *((int*)0) = 0; \
      +
      87  abort (); \
      +
      88  } while (0)
      +
      89 #endif
      +
      90 #endif
      +
      91 
      +
      92 
      +
      93 // precondition:
      +
      94 #ifdef NDEBUG_PRECONDITIONS
      +
      95 #define require(condition, message)
      +
      96 #else
      +
      97 #if defined __cplusplus && defined EXCEPTION_POLICY
      +
      98 #define require(condition, message) \
      +
      99  if (!(condition)) \
      +
      100  throw string_concat(NULL, 0, (char*)"Precondition fail", message[0] ? (char*)": " : (char*)"", message, (char*)", assertion: \"", #condition, (char*)"\", function: \"", __FUNCTION__, (char*)"\":", int2str(__LINE__), (char*)", file: \"", __FILE__, (char*)"\"\n", NULL)
      +
      101 #else // EXIT_POLICY (default)
      +
      102 
      +
      110 #define require(condition, message) \
      +
      111  if (!(condition)) \
      +
      112  do { \
      +
      113  fprintf (stderr, "Precondition fail%s%s, assertion: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \
      +
      114  message[0] ? ": " : "", message, #condition, __FUNCTION__, __LINE__ , __FILE__); \
      +
      115  *((int*)0) = 0; \
      +
      116  abort (); \
      +
      117  } while (0)
      +
      118 #endif
      +
      119 #endif
      +
      120 
      +
      121 
      +
      122 // postcondition:
      +
      123 #ifdef NDEBUG_POSTCONDITIONS
      +
      124 #define ensure(condition, message)
      +
      125 #else
      +
      126 #if defined __cplusplus && defined EXCEPTION_POLICY
      +
      127 #define ensure(condition, message) \
      +
      128  if (!(condition)) \
      +
      129  throw string_concat(NULL, 0, (char*)"Postcondition fail", message[0] ? (char*)": " : (char*)"", message, (char*)", assertion: \"", #condition, (char*)"\", function: \"", __FUNCTION__, (char*)"\":", int2str(__LINE__), (char*)", file: \"", __FILE__, (char*)"\"\n", NULL)
      +
      130 #else // EXIT_POLICY (default)
      +
      131 
      +
      139 #define ensure(condition, message) \
      +
      140  if (!(condition)) \
      +
      141  do { \
      +
      142  fprintf (stderr, "Postcondition fail%s%s, assertion: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \
      +
      143  message[0] ? ": " : "", message, #condition, __FUNCTION__, __LINE__ , __FILE__); \
      +
      144  *((int*)0) = 0; \
      +
      145  abort (); \
      +
      146  } while (0)
      +
      147 #endif
      +
      148 #endif
      +
      149 
      +
      150 //
      +
      151 // invariant:
      +
      152 #ifdef NDEBUG_INVARIANTS
      +
      153 #define invariant(condition, message)
      +
      154 #else
      +
      155 #if defined __cplusplus && defined EXCEPTION_POLICY
      +
      156 #define invariant(condition, message) \
      +
      157  if (!(condition)) \
      +
      158  throw string_concat(NULL, 0, (char*)"Invariant fail", message[0] ? (char*)": " : (char*)"", message, (char*)", assertion: \"", #condition, (char*)"\", function: \"", __FUNCTION__, (char*)"\":", int2str(__LINE__), (char*)", file: \"", __FILE__, (char*)"\"\n", NULL)
      +
      159 #else // EXIT_POLICY (default)
      +
      160 
      +
      168 #define invariant(condition, message) \
      +
      169  if (!(condition)) \
      +
      170  do { \
      +
      171  fprintf (stderr, "Invariant fail%s%s, assertion: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \
      +
      172  message[0] ? ": " : "", message, #condition, __FUNCTION__, __LINE__ , __FILE__); \
      +
      173  *((int*)0) = 0; \
      +
      174  abort (); \
      +
      175  } while (0)
      +
      176 #endif
      +
      177 #endif
      +
      178 
      +
      179 #endif
      +
      180 
      +
      181 /* ************************************************** */
      +
      185 /* ************************************************** */
      +
      186 
      +
      +
      +
      Useful common functions and macros.
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/3ano/1semestre/so/practice-exam/src/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html new file mode 100644 index 0000000..ba0809c --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,95 @@ + + + + + + + +C++ Library, mos@ua: src Directory Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      src Directory Reference
      +
      +
      + + + + + + + + + + + + + + +

      +Files

      file  dbc.h [code]
       Design-by-Contract module.
       
      file  process.h [code]
       Process, System-V, and POSIX libraries wrapper module.
       
      file  thread.h [code]
       POSIX threads library wrapper module.
       
      file  utils.h [code]
       Useful common functions and macros.
       
      +
      +
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/doc.png b/3ano/1semestre/so/practice-exam/src/doc/html/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/doxygen.css b/3ano/1semestre/so/practice-exam/src/doc/html/doxygen.css new file mode 100644 index 0000000..73ecbb2 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/doxygen.css @@ -0,0 +1,1771 @@ +/* The standard CSS for doxygen 1.8.17 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, p.intertd, p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #FFFFFF; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +/* +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTableHead tr { +} + +table.markdownTableBodyLeft td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft { + text-align: left +} + +th.markdownTableHeadRight { + text-align: right +} + +th.markdownTableHeadCenter { + text-align: center +} +*/ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/doxygen.png b/3ano/1semestre/so/practice-exam/src/doc/html/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff17d807fd8aa003bed8bb2a69e8f0909592fd1 GIT binary patch literal 3779 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 literal 0 HcmV?d00001 diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/dynsections.js b/3ano/1semestre/so/practice-exam/src/doc/html/dynsections.js new file mode 100644 index 0000000..ea0a7b3 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/dynsections.js @@ -0,0 +1,120 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +C++ Library, mos@ua: File List + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      File List
      +
      +
      +
      Here is a list of all documented files with brief descriptions:
      + + + + + +
       dbc.hDesign-by-Contract module
       process.hProcess, System-V, and POSIX libraries wrapper module
       thread.hPOSIX threads library wrapper module
       utils.hUseful common functions and macros
      +
      +
      +
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/files_dup.js b/3ano/1semestre/so/practice-exam/src/doc/html/files_dup.js new file mode 100644 index 0000000..fa08b09 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/files_dup.js @@ -0,0 +1,7 @@ +var files_dup = +[ + [ "dbc.h", "dbc_8h.html", "dbc_8h" ], + [ "process.h", "process_8h.html", "process_8h" ], + [ "thread.h", "thread_8h.html", "thread_8h" ], + [ "utils.h", "utils_8h.html", "utils_8h" ] +]; \ No newline at end of file diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/folderclosed.png b/3ano/1semestre/so/practice-exam/src/doc/html/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/globals.html b/3ano/1semestre/so/practice-exam/src/doc/html/globals.html new file mode 100644 index 0000000..73e09d1 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/globals.html @@ -0,0 +1,439 @@ + + + + + + + +C++ Library, mos@ua: Globals + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      +
      Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
      + +

      - c -

      + + +

      - e -

      + + +

      - h -

      + + +

      - i -

      + + +

      - l -

      + + +

      - m -

      + + +

      - n -

      + + +

      - p -

      + + +

      - r -

      + + +

      - s -

      + + +

      - t -

      +
      +
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/globals_defs.html b/3ano/1semestre/so/practice-exam/src/doc/html/globals_defs.html new file mode 100644 index 0000000..5a31dc1 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/globals_defs.html @@ -0,0 +1,127 @@ + + + + + + + +C++ Library, mos@ua: Globals + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/globals_func.html b/3ano/1semestre/so/practice-exam/src/doc/html/globals_func.html new file mode 100644 index 0000000..49ef70b --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/globals_func.html @@ -0,0 +1,376 @@ + + + + + + + +C++ Library, mos@ua: Globals + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      +  + +

      - c -

      + + +

      - h -

      + + +

      - i -

      + + +

      - m -

      + + +

      - p -

      + + +

      - r -

      + + +

      - s -

      + + +

      - t -

      +
      +
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/group___db_c.html b/3ano/1semestre/so/practice-exam/src/doc/html/group___db_c.html new file mode 100644 index 0000000..0796ad0 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/group___db_c.html @@ -0,0 +1,305 @@ + + + + + + + +C++ Library, mos@ua: DbC + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      + +
      +
      DbC
      +
      +
      + +

      Design-by-Contract module. +More...

      + + + + + +

      +Files

      file  dbc.h
       Design-by-Contract module.
       
      + + + + + + + + + + + + + +

      +Macros

      #define check(condition, message)
       Checks the verification of an general algorithm assertion. More...
       
      #define require(condition, message)
       Checks the verification of a precondition. More...
       
      #define ensure(condition, message)
       Checks the verification of a postcondition. More...
       
      #define invariant(condition, message)
       Checks the verification of an invariant. More...
       
      +

      Detailed Description

      +

      Design-by-Contract module.

      +

      This module gives a better support for DbC in C++.

      +

      When compared with assert.h this module offers the following functionalities:

        +
      • separates different assertion types (preconditions, postconditions, invariants, and others);
      • +
      • augments assert with error message strings;
      • +
      • implements two error handling policies:
          +
        1. EXIT_POLICY (default): describes the failed assertion in stderr (with the identification and the precise location of the assertion), generates a segmentation fault (enabling a stack trace within a debugger like gdb), and exits program execution;
        2. +
        3. EXCEPTION_POLICY: throws a char* exception with the description of the failed assertion.
        4. +
        +
      • +
      +

      Debug settings:

        +
      • As happens with assert.h, this module accepts NDEBUG macro definition to disable all assertion run-time verification.
      • +
      • Also, each assertion type verification can be disabled with macros: NDEBUG_CHECKS, NDEBUG_PRECONDITIONS, NDEBUG_POSTCONDITIONS, and NDEBUG_INVARIANTS.
      • +
      • A special (high priority) macro named DEBUG_ONLY_PRECONDITIONS ensures that only precondition debugging remains active (regardless of other debug definitions).
      • +
      +
      Author
      Miguel Oliveira e Silva, 2018
      +

      Macro Definition Documentation

      + +

      ◆ check

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      #define check( condition,
       message 
      )
      +
      +Value:
      if (!(condition)) \
      +
      do { \
      +
      fprintf (stderr, "Assertion fail%s%s, assertion: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \
      +
      message[0] ? ": " : "", message, #condition, __FUNCTION__, __LINE__ , __FILE__); \
      +
      *((int*)0) = 0; \
      +
      abort (); \
      +
      } while (0)
      +
      +

      Checks the verification of an general algorithm assertion.

      +

      This assertion verification can be disabled at compile time by defining the macro NDEBUG_CHECKS.

      +
      Parameters
      + + + +
      [in]conditionexpression to assert its truthness
      [in]messagetext to be presented with error information when the assertion fails
      +
      +
      + +
      +
      + +

      ◆ require

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      #define require( condition,
       message 
      )
      +
      +Value:
      if (!(condition)) \
      +
      do { \
      +
      fprintf (stderr, "Precondition fail%s%s, assertion: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \
      +
      message[0] ? ": " : "", message, #condition, __FUNCTION__, __LINE__ , __FILE__); \
      +
      *((int*)0) = 0; \
      +
      abort (); \
      +
      } while (0)
      +
      +

      Checks the verification of a precondition.

      +

      This assertion verification can be disabled at compile time by defining the macro NDEBUG_PRECONDITIONS.

      +
      Parameters
      + + + +
      [in]conditionexpression to assert its truthness
      [in]messagetext to be presented with error information when the assertion fails
      +
      +
      + +
      +
      + +

      ◆ ensure

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      #define ensure( condition,
       message 
      )
      +
      +Value:
      if (!(condition)) \
      +
      do { \
      +
      fprintf (stderr, "Postcondition fail%s%s, assertion: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \
      +
      message[0] ? ": " : "", message, #condition, __FUNCTION__, __LINE__ , __FILE__); \
      +
      *((int*)0) = 0; \
      +
      abort (); \
      +
      } while (0)
      +
      +

      Checks the verification of a postcondition.

      +

      This assertion verification can be disabled at compile time by defining the macro NDEBUG_POSTCONDITIONS.

      +
      Parameters
      + + + +
      [in]conditionexpression to assert its truthness
      [in]messagetext to be presented with error information when the assertion fails
      +
      +
      + +
      +
      + +

      ◆ invariant

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      #define invariant( condition,
       message 
      )
      +
      +Value:
      if (!(condition)) \
      +
      do { \
      +
      fprintf (stderr, "Invariant fail%s%s, assertion: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \
      +
      message[0] ? ": " : "", message, #condition, __FUNCTION__, __LINE__ , __FILE__); \
      +
      *((int*)0) = 0; \
      +
      abort (); \
      +
      } while (0)
      +
      +

      Checks the verification of an invariant.

      +

      This assertion verification can be disabled at compile time by defining the macro NDEBUG_INVARIANTS.

      +
      Parameters
      + + + +
      [in]conditionexpression to assert its truthness
      [in]messagetext to be presented with error information when the assertion fails
      +
      +
      + +
      +
      +
      +
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/group___db_c.js b/3ano/1semestre/so/practice-exam/src/doc/html/group___db_c.js new file mode 100644 index 0000000..61e00c4 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/group___db_c.js @@ -0,0 +1,8 @@ +var group___db_c = +[ + [ "dbc.h", "dbc_8h.html", null ], + [ "check", "group___db_c.html#gac101c8ba449f6f8c71b3789a9c489221", null ], + [ "require", "group___db_c.html#ga5bf1825f80465097d4b753a001cf1af8", null ], + [ "ensure", "group___db_c.html#ga5d17c602c4f191371a5fec5af7adc3cf", null ], + [ "invariant", "group___db_c.html#gaf9d59b04beef1bf139e10fc44c6f9725", null ] +]; \ No newline at end of file diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/group__process.html b/3ano/1semestre/so/practice-exam/src/doc/html/group__process.html new file mode 100644 index 0000000..89d2fff --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/group__process.html @@ -0,0 +1,1255 @@ + + + + + + + +C++ Library, mos@ua: process + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      + +
      +
      process
      +
      +
      + +

      Process, System-V, and POSIX libraries wrapper module. +More...

      + + + + + +

      +Files

      file  process.h
       Process, System-V, and POSIX libraries wrapper module.
       
      + + + + + + + + + + + + + + + + + + + + +

      +Process handling

      +
      pid_t pfork (void)
       fork wrapper function. More...
       
      pid_t pwait (int *status)
       wait wrapper function. More...
       
      pid_t pwaitpid (pid_t pid, int *status, int options)
       waitpid wrapper function. More...
       
      void pkill (pid_t pid, int sig)
       kill wrapper function. More...
       
      void pexecl (const char *pathname, const char *arg,...)
       execl wrapper function. More...
       
      void psigaction (int signum, const struct sigaction *act, struct sigaction *oldact)
       sigaction wrapper function. More...
       
      + + + + + + + + + + + + + + +

      +System V - shared memory

      Example
      #include <process.h> // #include <sys/shm.h>
      +
      ...
      +
      int shmid;
      +
      // creation:
      +
      shmid = pshmget(key, size, 0600 | IPC_CREAT | IPC_EXCL);
      +
      // or, use existing:
      +
      shmid = pshmget(key, 0, 0);
      +
      ...
      +
      // attach shm to pointer address:
      +
      void* p = pshmat(shmid, NULL, 0);
      +
      ...
      +
      // detach shm from pointer address:
      +
      pshmdt(p);
      +
      ...
      +
      // destroy shm:
      +
      pshmctl(shmid, IPC_RMID, NULL);
      +
      +
      int pshmget (key_t key, size_t size, int shmflg)
       shmget wrapper function. More...
       
      int pshmctl (int shmid, int cmd, struct shmid_ds *buf)
       shmctl wrapper function. More...
       
      void * pshmat (int shmid, const void *shmaddr, int shmflg)
       shmat wrapper function. More...
       
      void pshmdt (const void *shmaddr)
       shmdt wrapper function. More...
       
      + + + + + + + + + + + + + + + + + + + + + + +

      +System V - semaphores

      Example
      #include <process.h> // #include <sys/sem.h>
      +
      ...
      +
      int semid;
      +
      // creation:
      +
      semid = psemget(key, 1, 0600 | IPC_CREAT | IPC_EXCL); // 1 semaphore!
      +
      // or, use existing:
      +
      semid = psemget(key, 0, 0);
      +
      ...
      +
      // decrement:
      +
      struct sembuf down = {0, -1, 0};
      +
      psemop(semid, &down, 1);
      +
      // or, simply use provided function:
      +
      psem_down(semid, 0); // NOTE: there is no sem_down in default library!
      +
      ...
      +
      // increment:
      +
      struct sembuf up = {0, 1, 0};
      +
      psemop(semid, &up, 1);
      +
      // or, simply use provided function:
      +
      psem_up(semid, 0); // NOTE: there is no sem_up in default library!
      +
      ...
      +
      // destroy sem 0:
      +
      psemctl(semid, 0, IPC_RMID, NULL);
      +
      +
      int psemget (key_t key, int nsems, int semflg)
       semget wrapper function. More...
       
      int psemctl (int semid, int semnum, int cmd)
       semctl wrapper function. More...
       
      +int psemctl (int semid, int semnum, int cmd, void *u)
       
      void psemop (int semid, struct sembuf *sops, size_t nsops)
       semop wrapper function. More...
       
      +void psem_up (int semid, short unsigned int index)
       Increment a semaphore (uses psemop()).
       
      +void psem_down (int semid, short unsigned int index)
       Decrements a semaphore (uses psemop()).
       
      +void psem_down2 (int semid, short unsigned int index1, unsigned int index2)
       Decrements atomically two semaphores in a System V semaphore array (uses psemop()).
       
      + + + + + + + + + + + + + + +

      +System V - message queues

      Example
      #include <process.h> // #include <sys/msg.h>
      +
      ...
      +
      typedef struct Item
      +
      {
      +
      ...
      +
      } Item;
      +
      typedef struct Message
      +
      {
      +
      long type;
      +
      Item item;
      +
      } Message;
      +
      ...
      +
      int msgid;
      +
      // creation:
      +
      msgid = pmsgget(key, 0600 | IPC_CREAT | IPC_EXCL);
      +
      // or, use existing:
      +
      msgid = pmsgget(key, 0);
      +
      ...
      +
      Message msg;
      +
      // send msg:
      +
      msg = ...;
      +
      pmsgsnd(msgid, &msg, sizeof(Item), 0);
      +
      ...
      +
      // receive msg:
      +
      pmsgrcv(msgid, &msg, sizeof(Item), type, 0);
      +
      ...
      +
      // destroy msg:
      +
      pmsgctl(msgid, IPC_RMID, NULL);
      +
      +
      int pmsgget (key_t key, int msgflg)
       msgget wrapper function. More...
       
      int pmsgctl (int msqid, int cmd, struct msqid_ds *buf)
       msgctl wrapper function. More...
       
      void pmsgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg)
       msgsnd wrapper function. More...
       
      size_t pmsgrcv (int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg)
       msgrcv wrapper function. More...
       
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +POSIX semaphores

      +
      sem_t * psem_open (const char *name, int oflag)
       sem_open wrapper function. More...
       
      +sem_t * psem_open (const char *name, int oflag, mode_t mode, unsigned int value)
       
      void psem_close (sem_t *sem)
       sem_close wrapper function. More...
       
      void psem_unlink (const char *name)
       sem_unlink wrapper function. More...
       
      void psem_init (sem_t *sem, int pshared, unsigned int value)
       sem_init wrapper function. More...
       
      void psem_destroy (sem_t *sem)
       sem_destroy wrapper function. More...
       
      void psem_wait (sem_t *sem)
       sem_wait wrapper function. More...
       
      int psem_trywait (sem_t *sem)
       sem_trywait wrapper function. More...
       
      int psem_timedwait (sem_t *sem, const struct timespec *abs_timeout)
       sem_timedwait wrapper function. More...
       
      void psem_post (sem_t *sem)
       sem_post wrapper function. More...
       
      + + + + + + + + + + + +

      +UNIX pipes

      +
      void ppipe (int pipefd[2])
       pipe wrapper function. More...
       
      FILE * ppopen (const char *command, const char *type)
       popen wrapper function. More...
       
      void ppclose (FILE *stream)
       pclose wrapper function. More...
       
      +

      Detailed Description

      +

      Process, System-V, and POSIX libraries wrapper module.

      +

      This module removes defensive programming approach of native libraries.

      +

      All implemented functions, have exactly the same arguments and/or result of the original function, with the exception of returning an error indication.

      +

      Errors are handled by the implementation of two policies:

        +
      1. EXIT_POLICY (default): describes the failed call in stderr (with the identification of the errno error, and the precise location the call), generates a segmentation fault (enabling a stack trace within a debugger like gdb), and exits program execution;
      2. +
      3. EXCEPTION_POLICY: throws a int exception with the (errno) status error returned by the original function.
      4. +
      +

      System V group of IPC mechanisms

      +

      There are three resources for IPC: shared memory, semaphores, and message queues.

      +

      Common to all, is resource handling through a non-negative integer identifier. After proper creation and initialization, different processes can establish communication using the same integer identifier.

      +

      A key (key_t) is used to establish this common identifier. There are three possibilities to define a key:

      +
        +
      1. IPC_PRIVATE: In this case an alternative channel to communicate the identifier between processes is necessary (parent/child fork, file system, ...).
      2. +
      3. A fixed predetermined key number (may collide with other existing keys).
      4. +
      5. ftok function to generate a key from a path and a byte integer.
      6. +
      +

      Usage:

      +
        +
      • create new identifier: msgget/semget/shmget with a key and IPC_CREAT and IPC_EXCL flags
      • +
      • get existing identifier: msgget/semget/shmget with a key and other arguments as zero
      • +
      +
      Author
      Miguel Oliveira e Silva, 2017-2018
      +

      Function Documentation

      + +

      ◆ pfork()

      + +
      +
      + + + + + + + + +
      pid_t pfork (void )
      +
      + +

      fork wrapper function.

      +

      Other documentation in

      man 2 fork 
      See also
      https://man.cx/fork(2)
      + +
      +
      + +

      ◆ pwait()

      + +
      +
      + + + + + + + + +
      pid_t pwait (int * status)
      +
      + +

      wait wrapper function.

      +

      Other documentation in

      man 2 wait 
      See also
      https://man.cx/wait(2)
      + +
      +
      + +

      ◆ pwaitpid()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      pid_t pwaitpid (pid_t pid,
      int * status,
      int options 
      )
      +
      + +

      waitpid wrapper function.

      +

      Other documentation in

      man 2 waitpid 
      See also
      https://man.cx/waitpid(2)
      + +
      +
      + +

      ◆ pkill()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void pkill (pid_t pid,
      int sig 
      )
      +
      + +

      kill wrapper function.

      +

      Other documentation in

      man 2 kill 
      See also
      https://man.cx/kill(2)
      + +
      +
      + +

      ◆ pexecl()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      void pexecl (const char * pathname,
      const char * arg,
       ... 
      )
      +
      + +

      execl wrapper function.

      +

      Other documentation in

      man 3 execl 
      See also
      https://man.cx/execl(3)
      + +
      +
      + +

      ◆ psigaction()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      void psigaction (int signum,
      const struct sigaction * act,
      struct sigaction * oldact 
      )
      +
      + +

      sigaction wrapper function.

      +

      Other documentation in

      man 2 sigaction 
      See also
      https://man.cx/sigaction(2)
      + +
      +
      + +

      ◆ pshmget()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      int pshmget (key_t key,
      size_t size,
      int shmflg 
      )
      +
      + +

      shmget wrapper function.

      +
      +
      Precondition:
      +
      (size > 0) || !(shmflg & IPC_CREAT)
      +
      +

      Other documentation in

      man 2 shmget 
      See also
      https://man.cx/shmget(2)
      + +
      +
      + +

      ◆ pshmctl()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      int pshmctl (int shmid,
      int cmd,
      struct shmid_ds * buf 
      )
      +
      + +

      shmctl wrapper function.

      +

      Other documentation in

      man 2 shmctl 
      See also
      https://man.cx/shmctl(2)
      + +
      +
      + +

      ◆ pshmat()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      void* pshmat (int shmid,
      const void * shmaddr,
      int shmflg 
      )
      +
      + +

      shmat wrapper function.

      +

      Other documentation in

      man 2 shmat 
      See also
      https://man.cx/shmat(2)
      + +
      +
      + +

      ◆ pshmdt()

      + +
      +
      + + + + + + + + +
      void pshmdt (const void * shmaddr)
      +
      + +

      shmdt wrapper function.

      +

      Other documentation in

      man 2 shmdt 
      See also
      https://man.cx/shmdt(2)
      + +
      +
      + +

      ◆ psemget()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      int psemget (key_t key,
      int nsems,
      int semflg 
      )
      +
      + +

      semget wrapper function.

      +
      +
      Precondition:
      +
      nsems > 0
      +
      +

      Other documentation in

      man 2 semget 
      See also
      https://man.cx/semget(2)
      + +
      +
      + +

      ◆ psemctl()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      int psemctl (int semid,
      int semnum,
      int cmd 
      )
      +
      + +

      semctl wrapper function.

      +

      Other documentation in

      man 2 semctl 
      See also
      https://man.cx/semctl(2)
      + +
      +
      + +

      ◆ psemop()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      void psemop (int semid,
      struct sembuf * sops,
      size_t nsops 
      )
      +
      + +

      semop wrapper function.

      +

      Other documentation in

      man 2 semop 
      See also
      https://man.cx/semop(2)
      + +
      +
      + +

      ◆ pmsgget()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      int pmsgget (key_t key,
      int msgflg 
      )
      +
      + +

      msgget wrapper function.

      +

      Other documentation in

      man 2 msgget 
      See also
      https://man.cx/msgget(2)
      + +
      +
      + +

      ◆ pmsgctl()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      int pmsgctl (int msqid,
      int cmd,
      struct msqid_ds * buf 
      )
      +
      + +

      msgctl wrapper function.

      +

      Other documentation in

      man 2 msgctl 
      See also
      https://man.cx/msgctl(2)
      + +
      +
      + +

      ◆ pmsgsnd()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      void pmsgsnd (int msqid,
      const void * msgp,
      size_t msgsz,
      int msgflg 
      )
      +
      + +

      msgsnd wrapper function.

      +

      Other documentation in

      man 2 msgsnd 
      See also
      https://man.cx/msgsnd(2)
      + +
      +
      + +

      ◆ pmsgrcv()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      size_t pmsgrcv (int msqid,
      void * msgp,
      size_t msgsz,
      long msgtyp,
      int msgflg 
      )
      +
      + +

      msgrcv wrapper function.

      +

      Other documentation in

      man 2 msgrcv 
      See also
      https://man.cx/msgrcv(2)
      + +
      +
      + +

      ◆ psem_open()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      sem_t* psem_open (const char * name,
      int oflag 
      )
      +
      + +

      sem_open wrapper function.

      +

      Other documentation in

      man 3 sem_open 
      See also
      https://man.cx/sem_open(3)
      + +
      +
      + +

      ◆ psem_close()

      + +
      +
      + + + + + + + + +
      void psem_close (sem_t * sem)
      +
      + +

      sem_close wrapper function.

      +
      +
      Precondition:
      +
      sem != NULL
      +
      +

      Other documentation in

      man 3 sem_close 
      See also
      https://man.cx/sem_close(3)
      + +
      +
      + +

      ◆ psem_unlink()

      + +
      +
      + + + + + + + + +
      void psem_unlink (const char * name)
      +
      + +

      sem_unlink wrapper function.

      +

      Other documentation in

      man 3 sem_unlink 
      See also
      https://man.cx/sem_unlink(3)
      + +
      +
      + +

      ◆ psem_init()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      void psem_init (sem_t * sem,
      int pshared,
      unsigned int value 
      )
      +
      + +

      sem_init wrapper function.

      +
      +
      Precondition:
      +
      sem != NULL
      +
      +

      Other documentation in

      man 3 sem_init 
      See also
      https://man.cx/sem_init(3)
      + +
      +
      + +

      ◆ psem_destroy()

      + +
      +
      + + + + + + + + +
      void psem_destroy (sem_t * sem)
      +
      + +

      sem_destroy wrapper function.

      +
      +
      Precondition:
      +
      sem != NULL
      +
      +

      Other documentation in

      man 3 sem_destroy 
      See also
      https://man.cx/sem_destroy(3)
      + +
      +
      + +

      ◆ psem_wait()

      + +
      +
      + + + + + + + + +
      void psem_wait (sem_t * sem)
      +
      + +

      sem_wait wrapper function.

      +
      +
      Precondition:
      +
      sem != NULL
      +
      +

      Other documentation in

      man 3 sem_wait 
      See also
      https://man.cx/sem_wait(3)
      + +
      +
      + +

      ◆ psem_trywait()

      + +
      +
      + + + + + + + + +
      int psem_trywait (sem_t * sem)
      +
      + +

      sem_trywait wrapper function.

      +
      +
      Precondition:
      +
      sem != NULL
      +
      +

      Other documentation in

      man 3 sem_trywait 
      See also
      https://man.cx/sem_trywait(3)
      +
      Returns
      true (!=0) on success, false (0) if semaphore is zero
      + +
      +
      + +

      ◆ psem_timedwait()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      int psem_timedwait (sem_t * sem,
      const struct timespec * abs_timeout 
      )
      +
      + +

      sem_timedwait wrapper function.

      +
      +
      Precondition:
      +
      sem != NULL
      +
      +

      Other documentation in

      man 3 sem_timedwait 
      See also
      https://man.cx/sem_timedwait(3)
      +
      Returns
      true (!=0) on success, false (0) if timeout has expired before being able to decrement the semaphore
      + +
      +
      + +

      ◆ psem_post()

      + +
      +
      + + + + + + + + +
      void psem_post (sem_t * sem)
      +
      + +

      sem_post wrapper function.

      +
      +
      Precondition:
      +
      sem != NULL
      +
      +

      Other documentation in

      man 3 sem_post 
      See also
      https://man.cx/sem_post(3)
      + +
      +
      + +

      ◆ ppipe()

      + +
      +
      + + + + + + + + +
      void ppipe (int pipefd[2])
      +
      + +

      pipe wrapper function.

      +

      Other documentation in

      man 3 pipe 
      See also
      https://man.cx/pipe
      + +
      +
      + +

      ◆ ppopen()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      FILE* ppopen (const char * command,
      const char * type 
      )
      +
      + +

      popen wrapper function.

      +
      +
      Precondition:
      +
      command != NULL type != NULL
      +
      +

      Other documentation in

      man 3 popen 
      See also
      https://man.cx/popen
      + +
      +
      + +

      ◆ ppclose()

      + +
      +
      + + + + + + + + +
      void ppclose (FILE * stream)
      +
      + +

      pclose wrapper function.

      +
      +
      Precondition:
      +
      stream != NULL
      +
      +

      Other documentation in

      man 3 pclose 
      See also
      https://man.cx/pclose
      + +
      +
      +
      +
      +
      void * pshmat(int shmid, const void *shmaddr, int shmflg)
      shmat wrapper function.
      +
      Process, System-V, and POSIX libraries wrapper module.
      +
      int psemget(key_t key, int nsems, int semflg)
      semget wrapper function.
      +
      int pshmget(key_t key, size_t size, int shmflg)
      shmget wrapper function.
      +
      void pmsgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)
      msgsnd wrapper function.
      +
      int pmsgget(key_t key, int msgflg)
      msgget wrapper function.
      +
      void psem_down(int semid, short unsigned int index)
      Decrements a semaphore (uses psemop()).
      +
      void psem_up(int semid, short unsigned int index)
      Increment a semaphore (uses psemop()).
      +
      void psemop(int semid, struct sembuf *sops, size_t nsops)
      semop wrapper function.
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/group__process.js b/3ano/1semestre/so/practice-exam/src/doc/html/group__process.js new file mode 100644 index 0000000..efd6fbb --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/group__process.js @@ -0,0 +1,36 @@ +var group__process = +[ + [ "process.h", "process_8h.html", null ], + [ "pfork", "group__process.html#ga67e00aff1839b1ba68c83947593f625b", null ], + [ "pwait", "group__process.html#gad27b81fee9a0f792c4ba29fd95c967e1", null ], + [ "pwaitpid", "group__process.html#gac926bd7ccd173f742b5d58f51cabcb48", null ], + [ "pkill", "group__process.html#gab546ccee89e3159ea7c23aa3a463a0d8", null ], + [ "pexecl", "group__process.html#gae5d3e8ac00f0e788f21020699bac758a", null ], + [ "psigaction", "group__process.html#ga7c7f6de68bd3dea8a702668090a65854", null ], + [ "pshmget", "group__process.html#gaff71624be0fc9c76e0c72295721875e6", null ], + [ "pshmctl", "group__process.html#ga3119bdf5486059aee6ec3ed65a01b319", null ], + [ "pshmat", "group__process.html#ga0cdba7faa458e7fb57c31d3cd8788480", null ], + [ "pshmdt", "group__process.html#ga1682328cd34b592404ff030779b0428f", null ], + [ "psemget", "group__process.html#gaada159a0fe725ed843ac358be6e6a9d3", null ], + [ "psemctl", "group__process.html#gac42e869afba098ec9bdd77444ba790c5", null ], + [ "psemop", "group__process.html#ga0e2534c82b54573590d913c297cc4840", null ], + [ "psem_up", "group__process.html#gaa00610fec639ef123819ceee2ef00da3", null ], + [ "psem_down", "group__process.html#gac2b930e9aceda9ef276b21ae8e839c16", null ], + [ "psem_down2", "group__process.html#ga47891b55ba91af98c5b45cbcf154bc20", null ], + [ "pmsgget", "group__process.html#gad426e03bc9b8dae5f1fbf889ce2dd8f7", null ], + [ "pmsgctl", "group__process.html#ga13bfac41329ec74b2aa4950f9586ae9f", null ], + [ "pmsgsnd", "group__process.html#gaeeb6cd0ab585a7769cd17405f600e56a", null ], + [ "pmsgrcv", "group__process.html#gacd4e4161a46bfa2e1f23eb1d49aaa07b", null ], + [ "psem_open", "group__process.html#ga7bf7fce2d1f344e7dfeeb1b46a9ee7ba", null ], + [ "psem_close", "group__process.html#ga41a884c3a9d9ac6a31fc6ab27ae1d668", null ], + [ "psem_unlink", "group__process.html#ga0415c9c4fab4baafef6cd2d40becd05e", null ], + [ "psem_init", "group__process.html#gac49ddb266cec5493ebd756cd9382f99d", null ], + [ "psem_destroy", "group__process.html#ga82e3d1015521711a2a6374d6c3771491", null ], + [ "psem_wait", "group__process.html#gae2c867f9f66e74fad44df3f32f87a8c6", null ], + [ "psem_trywait", "group__process.html#ga04cb3c84545fe7707c63578e1d59b689", null ], + [ "psem_timedwait", "group__process.html#gac8b2b3d1e18b385f10b389ce2ea734ef", null ], + [ "psem_post", "group__process.html#gad63921c4ec6f0845b752eb59a8935b8e", null ], + [ "ppipe", "group__process.html#ga013466fa89ac97a0db0ccd78168a8456", null ], + [ "ppopen", "group__process.html#ga2d9df322812707050312aa24d15a4360", null ], + [ "ppclose", "group__process.html#ga1490f6e0ca0ebf607d1f5ff431c79b68", null ] +]; \ No newline at end of file diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/group__thread.html b/3ano/1semestre/so/practice-exam/src/doc/html/group__thread.html new file mode 100644 index 0000000..b86770c --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/group__thread.html @@ -0,0 +1,1417 @@ + + + + + + + +C++ Library, mos@ua: thread + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      + +
      +
      thread
      +
      +
      + +

      POSIX threads library wrapper module. +More...

      + + + + + +

      +Files

      file  thread.h
       POSIX threads library wrapper module.
       
      + + + + + + + + + + + + + + + + + + + + + + + +

      +Thread handling

      Variable type: pthread_t

      +

      +
      int thread_equal (pthread_t t1, pthread_t t2)
       pthread_equal wrapper function. More...
       
      void thread_create (pthread_t *t, pthread_attr_t *attr, void *(*thread_main)(void *), void *arg)
       pthread_create wrapper function. More...
       
      pthread_t thread_self ()
       pthread_self wrapper function. More...
       
      void thread_sched_yield (void)
       sched_yield wrapper function. More...
       
      void thread_exit (void *retval)
       pthread_exit wrapper function. More...
       
      void thread_detach (pthread_t thread)
       pthread_detach wrapper function. More...
       
      void thread_join (pthread_t t, void **result)
       pthread_join wrapper function. More...
       
      + + + + + + + + + + + + + + + + + +

      +Mutexes

      Variable type: pthread_mutex_t

      +

      Initialization of mutexes can be static or dynamic.

      +

      In static initialization the following initialization macros are suggested:

        +
      • PTHREAD_MUTEX_INITIALIZER - standard initializer
      • +
      • PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP - initializer that ensures error checking
      • +
      • PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP - for recursive mutexes (note that recursive mutexes should be avoid)
      • +
      +

      Dynamic initialization is done by mutex_init() and mutex_destroy().

      +

      +
      void mutex_init (pthread_mutex_t *pmtx, pthread_mutexattr_t *attr)
       pthread_mutex_init wrapper function. More...
       
      void mutex_destroy (pthread_mutex_t *pmtx)
       pthread_mutex_destroy wrapper function. More...
       
      void mutex_lock (pthread_mutex_t *pmtx)
       pthread_mutex_lock wrapper function. More...
       
      int mutex_trylock (pthread_mutex_t *pmtx)
       pthread_mutex_trylock wrapper function. More...
       
      void mutex_unlock (pthread_mutex_t *pmtx)
       pthread_mutex_unlock wrapper function. More...
       
      + + + + + + + + + + + + + + + + + + + + + + + +

      +Condition variables

      Variable type: pthread_cond_t

      +

      Initialization of condition variables can be static or dynamic.

      +

      In static initialization the following initialization macros should be used:

        +
      • PTHREAD_COND_INITIALIZER - standard initializer
      • +
      +

      Dynamic initialization is done by cond_init() and cond_destroy().

      +

      +
      void cond_init (pthread_cond_t *pcvar, pthread_condattr_t *attr)
       pthread_cond_init wrapper function. More...
       
      void cond_destroy (pthread_cond_t *pcvar)
       pthread_cond_destroy wrapper function. More...
       
      void cond_wait (pthread_cond_t *pcvar, pthread_mutex_t *pmtx)
       pthread_cond_wait wrapper function. More...
       
      int cond_timedwait (pthread_cond_t *pcvar, pthread_mutex_t *pmtx, const struct timespec *abstime)
       pthread_cond_timedwait wrapper function. More...
       
      int cond_timedwait (pthread_cond_t *pcvar, pthread_mutex_t *pmtx, long relative_time_us)
       pthread_cond_timedwait wrapper function accepting relative time (in microseconds) instead of absolute time. More...
       
      void cond_signal (pthread_cond_t *pcvar)
       pthread_cond_signal wrapper function. More...
       
      void cond_broadcast (pthread_cond_t *pcvar)
       pthread_cond_broadcast wrapper function. More...
       
      + + + + + +

      +One-time initialization

      Variable type: pthread_once_t

      +

      POSIX thread library support a mechanism that ensures a one-time execution of a function. It does it through pthread_once_t variables, and by passing a callback function (in C/C++ is simply a function pointer).

      +
      Example
         void once_init_routine(void) { ... }
      +   ...
      +   pthread_once_t once_control = PTHREAD_ONCE_INIT;
      +   thread_once(&once_control, &once_init_routine); // one time execution over pthread_once_t
      +                                                   // variable is guaranteed, regardless of the
      +                                                   // number of threads that execute over that
      +                                                   // variable.
      +
      +

      +
      void thread_once (pthread_once_t *once_control, void(*init_routine)(void))
       pthread_once wrapper function. More...
       
      + + + + + + + + + + + + + + +

      +Thread-specific data

      Variable type: pthread_key_t

      +

      Thread-specific data allows the definition of variable whose scope is limited to each thread. In practice, we will have a common variable, with a common access, but with different values for each thread.

      +

      +
      void thread_key_create (pthread_key_t *key, void(*destr_function)(void *))
       pthread_key_create wrapper function. More...
       
      void thread_key_delete (pthread_key_t key)
       pthread_key_delete wrapper function. More...
       
      void thread_setspecific (pthread_key_t key, void *pointer)
       pthread_setspecific wrapper function. More...
       
      void * thread_getspecific (pthread_key_t key)
       pthread_getspecific wrapper function. More...
       
      + + + + + + + + + + + + + + +

      +Mutex attributes

      Variable type: pthread_mutexattr_t

      +

      +
      void mutexattr_init (pthread_mutexattr_t *attr)
       pthread_mutexattr_init wrapper function. More...
       
      void mutexattr_destroy (pthread_mutexattr_t *attr)
       pthread_mutexattr_destroy wrapper function. More...
       
      void mutexattr_settype (pthread_mutexattr_t *attr, int type)
       pthread_mutexattr_settype wrapper function. More...
       
      void mutexattr_gettype (const pthread_mutexattr_t *attr, int *kind)
       pthread_mutexattr_gettype wrapper function. More...
       
      + + + + + + + + +

      +Condition variables attributes

      Variable type: pthread_condattr_t

      +

      +
      void condattr_init (pthread_condattr_t *attr)
       pthread_condattr_init wrapper function. More...
       
      void condattr_destroy (pthread_condattr_t *attr)
       pthread_condattr_destroy wrapper function. More...
       
      + + + + + + + + + + + + + + +

      +Thread attributes

      Variable type: pthread_attr_t

      +

      +
      void thread_attr_init (pthread_attr_t *attr)
       pthread_attr_init wrapper function. More...
       
      void thread_attr_destroy (pthread_attr_t *attr)
       pthread_attr_destroy wrapper function. More...
       
      void thread_attr_setdetachstate (pthread_attr_t *attr, int detachstate)
       pthread_attr_setdetachstate wrapper function. More...
       
      void thread_attr_getdetachstate (const pthread_attr_t *attr, int *pdetachstate)
       pthread_attr_getdetachstate wrapper function. More...
       
      + + + + + + + + + + + + + + +

      +Cancellation

      +
      void thread_cancel (pthread_t thread)
       pthread_cancel wrapper function. More...
       
      void thread_setcancelstate (int state, int *oldstate)
       pthread_setcancelstate wrapper function. More...
       
      void thread_setcanceltype (int type, int *oldtype)
       pthread_setcanceltype wrapper function. More...
       
      void thread_testcancel (void)
       pthread_testcancel wrapper function. More...
       
      +

      Detailed Description

      +

      POSIX threads library wrapper module.

      +

      This module removes defensive programming approach of native POSIX threads library.

      +

      All implemented functions, have exactly the same arguments and/or result of the original function, with the exception of returning an error indication.

      +

      Errors are handled by the implementation of two policies:

        +
      1. EXIT_POLICY (default): describes the failed call in stderr (with the identification of the errno error, and the precise location the call), generates a segmentation fault (enabling a stack trace within a debugger like gdb), and exits program execution;
      2. +
      3. EXCEPTION_POLICY: throws a int exception with the (errno) status error returned by the original function.
      4. +
      +
      Author
      Miguel Oliveira e Silva, 2017-2018
      +

      Function Documentation

      + +

      ◆ thread_equal()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      int thread_equal (pthread_t t1,
      pthread_t t2 
      )
      +
      + +

      pthread_equal wrapper function.

      +

      Other documentation in

      man 3 pthread_equal 
      See also
      https://man.cx/pthread_equal(3)
      + +
      +
      + +

      ◆ thread_create()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      void thread_create (pthread_t * t,
      pthread_attr_t * attr,
      void *(*)(void *) thread_main,
      void * arg 
      )
      +
      + +

      pthread_create wrapper function.

      +
      +
      Precondition:
      +
      t != NULL
      + thread_main != NULL
      +
      +

      Other documentation in

      man 3 pthread_create 
      See also
      https://man.cx/pthread_create(3)
      + +
      +
      + +

      ◆ thread_self()

      + +
      +
      + + + + + + + +
      pthread_t thread_self ()
      +
      + +

      pthread_self wrapper function.

      +

      Other documentation in

      man 3 pthread_self 
      See also
      https://man.cx/pthread_self(3)
      + +
      +
      + +

      ◆ thread_sched_yield()

      + +
      +
      + + + + + + + + +
      void thread_sched_yield (void )
      +
      + +

      sched_yield wrapper function.

      +

      Other documentation in

      man 3 sched_yield 
      See also
      https://man.cx/sched_yield(3)
      + +
      +
      + +

      ◆ thread_exit()

      + +
      +
      + + + + + + + + +
      void thread_exit (void * retval)
      +
      + +

      pthread_exit wrapper function.

      +

      Other documentation in

      man 3 pthread_exit 
      See also
      https://man.cx/pthread_exit(3)
      + +
      +
      + +

      ◆ thread_detach()

      + +
      +
      + + + + + + + + +
      void thread_detach (pthread_t thread)
      +
      + +

      pthread_detach wrapper function.

      +

      Other documentation in

      man 3 pthread_detach 
      See also
      https://man.cx/pthread_detach(3)
      + +
      +
      + +

      ◆ thread_join()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void thread_join (pthread_t t,
      void ** result 
      )
      +
      + +

      pthread_join wrapper function.

      +

      Other documentation in

      man 3 pthread_join 
      See also
      https://man.cx/pthread_join(3)
      + +
      +
      + +

      ◆ mutex_init()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void mutex_init (pthread_mutex_t * pmtx,
      pthread_mutexattr_t * attr 
      )
      +
      + +

      pthread_mutex_init wrapper function.

      +
      +
      Precondition:
      +
      pmtx != NULL
      +
      +

      Other documentation in

      man 3 pthread_mutex_init 
      See also
      https://man.cx/pthread_mutex_init(3)
      + +
      +
      + +

      ◆ mutex_destroy()

      + +
      +
      + + + + + + + + +
      void mutex_destroy (pthread_mutex_t * pmtx)
      +
      + +

      pthread_mutex_destroy wrapper function.

      +
      +
      Precondition:
      +
      pmtx != NULL
      +
      +

      Other documentation in

      man 3 pthread_mutex_destroy 
      See also
      https://man.cx/pthread_mutex_destroy(3)
      + +
      +
      + +

      ◆ mutex_lock()

      + +
      +
      + + + + + + + + +
      void mutex_lock (pthread_mutex_t * pmtx)
      +
      + +

      pthread_mutex_lock wrapper function.

      +
      +
      Precondition:
      +
      pmtx != NULL
      +
      +

      Other documentation in

      man 3 pthread_mutex_lock 
      See also
      https://man.cx/pthread_mutex_lock(3)
      + +
      +
      + +

      ◆ mutex_trylock()

      + +
      +
      + + + + + + + + +
      int mutex_trylock (pthread_mutex_t * pmtx)
      +
      + +

      pthread_mutex_trylock wrapper function.

      +
      +
      Precondition:
      +
      pmtx != NULL
      +
      +

      Other documentation in

      man 3 pthread_mutex_trylock 
      See also
      https://man.cx/pthread_mutex_trylock(3)
      +
      Returns
      true (!=0) if lock succeeds, false (0) otherwise
      + +
      +
      + +

      ◆ mutex_unlock()

      + +
      +
      + + + + + + + + +
      void mutex_unlock (pthread_mutex_t * pmtx)
      +
      + +

      pthread_mutex_unlock wrapper function.

      +
      +
      Precondition:
      +
      pmtx != NULL
      +
      +

      Other documentation in

      man 3 pthread_mutex_unlock 
      See also
      https://man.cx/pthread_mutex_unlock(3)
      + +
      +
      + +

      ◆ cond_init()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void cond_init (pthread_cond_t * pcvar,
      pthread_condattr_t * attr 
      )
      +
      + +

      pthread_cond_init wrapper function.

      +
      +
      Precondition:
      +
      pcvar != NULL
      +
      +

      Other documentation in

      man 3 pthread_cond_init 
      See also
      https://man.cx/pthread_cond_init(3)
      + +
      +
      + +

      ◆ cond_destroy()

      + +
      +
      + + + + + + + + +
      void cond_destroy (pthread_cond_t * pcvar)
      +
      + +

      pthread_cond_destroy wrapper function.

      +
      +
      Precondition:
      +
      pcvar != NULL
      +
      +

      Other documentation in

      man 3 pthread_cond_destroy 
      See also
      https://man.cx/pthread_cond_destroy(3)
      + +
      +
      + +

      ◆ cond_wait()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void cond_wait (pthread_cond_t * pcvar,
      pthread_mutex_t * pmtx 
      )
      +
      + +

      pthread_cond_wait wrapper function.

      +
      +
      Precondition:
      +
      pcvar != NULL
      + pmtx != NULL
      +
      +

      Other documentation in

      man 3 pthread_cond_wait 
      See also
      https://man.cx/pthread_cond_wait(3)
      + +
      +
      + +

      ◆ cond_timedwait() [1/2]

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      int cond_timedwait (pthread_cond_t * pcvar,
      pthread_mutex_t * pmtx,
      const struct timespec * abstime 
      )
      +
      + +

      pthread_cond_timedwait wrapper function.

      +
      +
      Precondition:
      +
      pcvar != NULL
      + pmtx != NULL
      + abstime != NULL
      +
      +
      Returns
      true (!=0) if condition variable was signaled, false (0) it time out has expired.
      +

      Other documentation in

      man 3 pthread_cond_timedwait 
      See also
      https://man.cx/pthread_cond_wait(3)
      + +
      +
      + +

      ◆ cond_timedwait() [2/2]

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      int cond_timedwait (pthread_cond_t * pcvar,
      pthread_mutex_t * pmtx,
      long relative_time_us 
      )
      +
      + +

      pthread_cond_timedwait wrapper function accepting relative time (in microseconds) instead of absolute time.

      +
      +
      Precondition:
      +
      pcvar != NULL
      + pmtx != NULL
      + relative_time_us > 0L
      +
      +
      Returns
      true (!=0) if condition variable was signaled, false (0) it time out has expired.
      +

      Documentation in

      man 3 pthread_cond_timedwait 
      See also
      https://man.cx/pthread_cond_wait(3)
      + +
      +
      + +

      ◆ cond_signal()

      + +
      +
      + + + + + + + + +
      void cond_signal (pthread_cond_t * pcvar)
      +
      + +

      pthread_cond_signal wrapper function.

      +
      +
      Precondition:
      +
      pcvar != NULL
      +
      +

      Other documentation in

      man 3 pthread_cond_signal 
      See also
      https://man.cx/pthread_cond_signal(3)
      + +
      +
      + +

      ◆ cond_broadcast()

      + +
      +
      + + + + + + + + +
      void cond_broadcast (pthread_cond_t * pcvar)
      +
      + +

      pthread_cond_broadcast wrapper function.

      +
      +
      Precondition:
      +
      pcvar != NULL
      +
      +

      Other documentation in

      man 3 pthread_cond_broadcast 
      See also
      https://man.cx/pthread_cond_broadcast(3)
      + +
      +
      + +

      ◆ thread_once()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void thread_once (pthread_once_t * once_control,
      void(*)(void) init_routine 
      )
      +
      + +

      pthread_once wrapper function.

      +
      +
      Precondition:
      +
      once_control != NULL
      + init_routine != NULL
      +
      +

      Other documentation in

      man 3 pthread_once 
      See also
      https://man.cx/pthread_once(3)
      + +
      +
      + +

      ◆ thread_key_create()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void thread_key_create (pthread_key_t * key,
      void(*)(void *) destr_function 
      )
      +
      + +

      pthread_key_create wrapper function.

      +

      This function should be executed once for each key (use thread_once()).

      +
      +
      Precondition:
      +
      key != NULL
      +
      +

      Other documentation in

      man 3 pthread_key_create 
      See also
      https://man.cx/pthread_key_create(3)
      + +
      +
      + +

      ◆ thread_key_delete()

      + +
      +
      + + + + + + + + +
      void thread_key_delete (pthread_key_t key)
      +
      + +

      pthread_key_delete wrapper function.

      +

      This function should be executed once for each key (use thread_once()).

      +
      +
      Precondition:
      +
      key != NULL
      +
      +

      Other documentation in

      man 3 pthread_key_delete 
      See also
      https://man.cx/pthread_key_delete(3)
      + +
      +
      + +

      ◆ thread_setspecific()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void thread_setspecific (pthread_key_t key,
      void * pointer 
      )
      +
      + +

      pthread_setspecific wrapper function.

      +
      +
      Precondition:
      +
      pointer != NULL
      +
      +

      Other documentation in

      man 3 pthread_setspecific 
      See also
      https://man.cx/pthread_setspecific(3)
      + +
      +
      + +

      ◆ thread_getspecific()

      + +
      +
      + + + + + + + + +
      void* thread_getspecific (pthread_key_t key)
      +
      + +

      pthread_getspecific wrapper function.

      +
      +
      Precondition:
      +
      key != NULL
      +
      +

      Other documentation in

      man 3 pthread_getspecific 
      See also
      https://man.cx/pthread_getspecific(3)
      + +
      +
      + +

      ◆ mutexattr_init()

      + +
      +
      + + + + + + + + +
      void mutexattr_init (pthread_mutexattr_t * attr)
      +
      + +

      pthread_mutexattr_init wrapper function.

      +
      +
      Precondition:
      +
      attr != NULL
      +
      +

      Other documentation in

      man 3 pthread_mutexattr_init 
      See also
      https://man.cx/pthread_mutexattr_init(3)
      + +
      +
      + +

      ◆ mutexattr_destroy()

      + +
      +
      + + + + + + + + +
      void mutexattr_destroy (pthread_mutexattr_t * attr)
      +
      + +

      pthread_mutexattr_destroy wrapper function.

      +
      +
      Precondition:
      +
      attr != NULL
      +
      +

      Other documentation in

      man 3 pthread_mutexattr_destroy 
      See also
      https://man.cx/pthread_mutexattr_destroy(3)
      + +
      +
      + +

      ◆ mutexattr_settype()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void mutexattr_settype (pthread_mutexattr_t * attr,
      int type 
      )
      +
      + +

      pthread_mutexattr_settype wrapper function.

      +
      +
      Precondition:
      +
      attr != NULL
      +
      +

      Other documentation in

      man 3 pthread_mutexattr_settype 
      See also
      https://man.cx/pthread_mutexattr_settype(3)
      + +
      +
      + +

      ◆ mutexattr_gettype()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void mutexattr_gettype (const pthread_mutexattr_t * attr,
      int * kind 
      )
      +
      + +

      pthread_mutexattr_gettype wrapper function.

      +
      +
      Precondition:
      +
      attr != NULL
      + kind != NULL
      +
      +

      Other documentation in

      man 3 pthread_mutexattr_gettype 
      See also
      https://man.cx/pthread_mutexattr_gettype(3)
      + +
      +
      + +

      ◆ condattr_init()

      + +
      +
      + + + + + + + + +
      void condattr_init (pthread_condattr_t * attr)
      +
      + +

      pthread_condattr_init wrapper function.

      +
      +
      Precondition:
      +
      attr != NULL
      +
      +

      Other documentation in

      man 3 pthread_condattr_init 
      See also
      https://man.cx/pthread_condattr_init(3)
      + +
      +
      + +

      ◆ condattr_destroy()

      + +
      +
      + + + + + + + + +
      void condattr_destroy (pthread_condattr_t * attr)
      +
      + +

      pthread_condattr_destroy wrapper function.

      +
      +
      Precondition:
      +
      attr != NULL
      +
      +

      Other documentation in

      man 3 pthread_condattr_destroy 
      See also
      https://man.cx/pthread_condattr_destroy(3)
      + +
      +
      + +

      ◆ thread_attr_init()

      + +
      +
      + + + + + + + + +
      void thread_attr_init (pthread_attr_t * attr)
      +
      + +

      pthread_attr_init wrapper function.

      +
      +
      Precondition:
      +
      attr != NULL
      +
      +

      Other documentation in

      man 3 pthread_attr_init 
      See also
      https://man.cx/pthread_attr_init(3)
      + +
      +
      + +

      ◆ thread_attr_destroy()

      + +
      +
      + + + + + + + + +
      void thread_attr_destroy (pthread_attr_t * attr)
      +
      + +

      pthread_attr_destroy wrapper function.

      +
      +
      Precondition:
      +
      attr != NULL
      +
      +

      Other documentation in

      man 3 pthread_attr_destroy 
      See also
      https://man.cx/pthread_attr_destroy(3)
      + +
      +
      + +

      ◆ thread_attr_setdetachstate()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void thread_attr_setdetachstate (pthread_attr_t * attr,
      int detachstate 
      )
      +
      + +

      pthread_attr_setdetachstate wrapper function.

      +
      +
      Precondition:
      +
      attr != NULL
      + detachstate == PTHREAD_CREATE_DETACHED || detachstate == PTHREAD_CREATE_JOINABLE
      +
      +

      Other documentation in

      man 3 pthread_attr_setdetachstate 
      See also
      https://man.cx/pthread_attr_setdetachstate(3)
      + +
      +
      + +

      ◆ thread_attr_getdetachstate()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void thread_attr_getdetachstate (const pthread_attr_t * attr,
      int * pdetachstate 
      )
      +
      + +

      pthread_attr_getdetachstate wrapper function.

      +
      +
      Precondition:
      +
      attr != NULL
      + pdetachstate != NULL
      +
      +

      Other documentation in

      man 3 pthread_attr_getdetachstate 
      See also
      https://man.cx/pthread_attr_getdetachstate(3)
      + +
      +
      + +

      ◆ thread_cancel()

      + +
      +
      + + + + + + + + +
      void thread_cancel (pthread_t thread)
      +
      + +

      pthread_cancel wrapper function.

      +

      Other documentation in

      man 3 pthread_cancel 
      See also
      https://man.cx/pthread_cancel(3)
      + +
      +
      + +

      ◆ thread_setcancelstate()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void thread_setcancelstate (int state,
      int * oldstate 
      )
      +
      + +

      pthread_setcancelstate wrapper function.

      +
      +
      Precondition:
      +
      state == PTHREAD_CANCEL_ENABLE || state == PTHREAD_CANCEL_DISABLE
      + oldstate != NULL
      +
      +

      Other documentation in

      man 3 pthread_setcancelstate 
      See also
      https://man.cx/pthread_setcancelstate(3)
      + +
      +
      + +

      ◆ thread_setcanceltype()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void thread_setcanceltype (int type,
      int * oldtype 
      )
      +
      + +

      pthread_setcanceltype wrapper function.

      +
      +
      Precondition:
      +
      type == PTHREAD_CANCEL_DEFERRED || type == PTHREAD_CANCEL_ASYNCHRONOUS
      + oldtype != NULL
      +
      +

      Other documentation in

      man 3 pthread_setcanceltype 
      See also
      https://man.cx/pthread_setcanceltype(3)
      + +
      +
      + +

      ◆ thread_testcancel()

      + +
      +
      + + + + + + + + +
      void thread_testcancel (void )
      +
      + +

      pthread_testcancel wrapper function.

      +

      Other documentation in

      man 3 pthread_testcancel 
      See also
      https://man.cx/pthread_testcancel(3)
      + +
      +
      +
      +
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/group__thread.js b/3ano/1semestre/so/practice-exam/src/doc/html/group__thread.js new file mode 100644 index 0000000..c5ad3e5 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/group__thread.js @@ -0,0 +1,42 @@ +var group__thread = +[ + [ "thread.h", "thread_8h.html", null ], + [ "thread_equal", "group__thread.html#gadca8bdcec91b8985370d904591d342b8", null ], + [ "thread_create", "group__thread.html#ga3a0f9920a321b54c41c098d3461d3889", null ], + [ "thread_self", "group__thread.html#ga606fdef53f997c231e0e1e9e54b350d4", null ], + [ "thread_sched_yield", "group__thread.html#ga952c63101c667d247f0923b609710c72", null ], + [ "thread_exit", "group__thread.html#ga19b16adf05364471bae2840aa564329a", null ], + [ "thread_detach", "group__thread.html#ga86aa7989874009c886bea9d41700e25c", null ], + [ "thread_join", "group__thread.html#ga2b2370a45c1518f777493526b2e4f46d", null ], + [ "mutex_init", "group__thread.html#ga3f227a19d6a339ce0aeda15775e5e6e6", null ], + [ "mutex_destroy", "group__thread.html#ga5ebb836d0f83eac719f2cdd336497b01", null ], + [ "mutex_lock", "group__thread.html#ga87086ba0f13f6ddc479a6bc803a10c39", null ], + [ "mutex_trylock", "group__thread.html#ga8bd074884e1c92e88ca8ea0552d9a928", null ], + [ "mutex_unlock", "group__thread.html#ga95235231165ebda870afa10ba5fd6c41", null ], + [ "cond_init", "group__thread.html#ga31e5eaf158d118d0e4ef7fd47368eaad", null ], + [ "cond_destroy", "group__thread.html#gad663c43fbfbb4f660d48b07e110c8f80", null ], + [ "cond_wait", "group__thread.html#ga1123643838d5174ccd41f52f4169e896", null ], + [ "cond_timedwait", "group__thread.html#ga8cd2040836c30e4f0ea17abe4f66b8e2", null ], + [ "cond_timedwait", "group__thread.html#ga4b41089ba3cd8ad0a539b42bc8b95d6b", null ], + [ "cond_signal", "group__thread.html#ga9624688b577fb653af7a528848cc53d5", null ], + [ "cond_broadcast", "group__thread.html#ga6459039ab27da7237dda2bbc866eb2d0", null ], + [ "thread_once", "group__thread.html#gad0428e8a0809704f4b3d682f26d3ef1c", null ], + [ "thread_key_create", "group__thread.html#ga7df1983f57dca40a86a55d215d13d42b", null ], + [ "thread_key_delete", "group__thread.html#ga65a50dfc97c087a28cb916e0f30f760e", null ], + [ "thread_setspecific", "group__thread.html#ga3008b033f2830e79179a882a2b74c8ba", null ], + [ "thread_getspecific", "group__thread.html#ga0d207f1bb2e1d493b68a026b8650cb16", null ], + [ "mutexattr_init", "group__thread.html#ga9fb2733a01e8d668a2022005ea5dbebd", null ], + [ "mutexattr_destroy", "group__thread.html#ga07bf0e49b1f2cb99d3a2955641c676d5", null ], + [ "mutexattr_settype", "group__thread.html#ga601a6a9527d7d5ee2ca2870cddc4afc2", null ], + [ "mutexattr_gettype", "group__thread.html#gadf741e1818d53c5b7d71cd68e161b215", null ], + [ "condattr_init", "group__thread.html#gab8073c72be896ba9d711d887a5405a74", null ], + [ "condattr_destroy", "group__thread.html#ga4644f4989b30ccfb2e908017c43bd0d0", null ], + [ "thread_attr_init", "group__thread.html#gaaf2db7012069f0006e7ffaf257d8ccc6", null ], + [ "thread_attr_destroy", "group__thread.html#gaf3a9c2c051deee01e21c75f0fa8b2e9c", null ], + [ "thread_attr_setdetachstate", "group__thread.html#gabc82fea1785fc82aeb2f43cdd77b9b0f", null ], + [ "thread_attr_getdetachstate", "group__thread.html#gaae83c8617612c1bb481fec2b382ac9c4", null ], + [ "thread_cancel", "group__thread.html#ga1b3cb53565eabe02a36e000e5244dfd1", null ], + [ "thread_setcancelstate", "group__thread.html#ga98baffe08beec792f3428ae9ddad966e", null ], + [ "thread_setcanceltype", "group__thread.html#gab4ec114c7b59f8f4185bac648b256d0c", null ], + [ "thread_testcancel", "group__thread.html#ga81bdb13d62e16ad7cb3cbd263c9a5671", null ] +]; \ No newline at end of file diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/group__utils.html b/3ano/1semestre/so/practice-exam/src/doc/html/group__utils.html new file mode 100644 index 0000000..ed6d68c --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/group__utils.html @@ -0,0 +1,1619 @@ + + + + + + + +C++ Library, mos@ua: utils + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      + +
      +
      utils
      +
      +
      + +

      Useful common functions and macros. +More...

      + + + + + +

      +Files

      file  utils.h
       Useful common functions and macros.
       
      + + + + + + + + + + + + + + + + + + + + + + +

      +Macros

      #define int2str(num)
       Converts an int value to a stack allocated string. More...
       
      #define int2nstr(num, len)
       Converts an int value to a stack allocated string. More...
       
      #define long2str(num)
       Converts an long value to a stack allocated string. More...
       
      #define long2nstr(num, len)
       Converts an long value to a stack allocated string. More...
       
      #define perc2str(percentage)
       Converts an int percentage to a stack allocated string. More...
       
      #define length_vargs_string_list(first)
       Determines the length of all strings passed as a NULL terminated variable list of arguments (vargs). More...
       
      #define not_null(pnt)
       Checks if address is not NULL, before its application. More...
       
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Functions

      void * mem_alloc (int size)
       A replacement for malloc function. More...
       
      void mem_free (void *pnt)
       A replacement for free function. More...
       
      char * string_clone (char *str)
       Replicates a string. More...
       
      int string_num_lines (char *text)
       Number of lines of a string. More...
       
      int string_num_columns (char *text)
       Maximum number of columns of a string (not counting character ‘’\n'`). More...
       
      int string_count_char (char *text, char *ch)
       Counts the number of occurrences of an UTF8 character in a text. More...
       
      int string_starts_with (char *text, char *prefix)
       Tests if a string starts with a prefix. More...
       
      int string_ends_with (char *text, char *suffix)
       Tests if a string ends with a suffix. More...
       
      char * string_concat (char *res, int max_length, char *text,...)
       Concatenates a NULL terminated list of string arguments. More...
       
      int random_boolean (int trueProb)
       Generates a random boolean value. More...
       
      int random_int (int min, int max)
       Generates a random integer value within a given interval. More...
       
      char * random_string (char **list, int *used, int length)
       Returns a random string from a given string list. More...
       
      +void clear_console ()
       Clears the terminal.
       
      void move_cursor (int line, int column)
       Moves the cursor to a position in terminal. More...
       
      +void hide_cursor ()
       Hides the terminal cursor.
       
      +void show_cursor ()
       Shows the terminal cursor.
       
      int string_list_length (char **list)
       Number of elements of a NULL terminated list of strings. More...
       
      char ** string_list_clone (char **list)
       Replicates a NULL terminated list of strings. More...
       
      char ** string_list_free (char **list)
       Frees the memory allocated to a NULL terminated list of strings. More...
       
      char * int2nstring (char *res, int num, int len)
       Converts an int value to a string. More...
       
      char * percentage2string (char *res, int percentage)
       Converts an int percentage to a string. More...
       
      + + + + + + + + + + + + + + + + + + + + +

      +String concatenation in stack memory

      +
      #define concat_2str(str1, str2)
       Concatenates two strings in the stack memory (thus it cannot be implemented in a function). More...
       
      #define concat_3str(str1, str2, str3)
       Concatenates three strings in the stack memory (thus it cannot be implemented in a function). More...
       
      #define concat_4str(str1, str2, str3, str4)
       Concatenates four strings in the stack memory (thus it cannot be implemented in a function). More...
       
      #define concat_5str(str1, str2, str3, str4, str5)
       Concatenates five strings in the stack memory (thus it cannot be implemented in a function). More...
       
      #define concat_6str(str1, str2, str3, str4, str5, str6)
       Concatenates six strings in the stack memory (thus it cannot be implemented in a function). More...
       
      #define concat_7str(str1, str2, str3, str4, str5, str6, str7)
       Concatenates seven strings in the stack memory (thus it cannot be implemented in a function). More...
       
      +

      Detailed Description

      +

      Useful common functions and macros.

      +
      Author
      Miguel Oliveira e Silva, 2017-2018
      +

      Macro Definition Documentation

      + +

      ◆ concat_2str

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      #define concat_2str( str1,
       str2 
      )
      +
      +Value:
      ({ \
      +
      char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
      +
      char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
      +
      char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+1); \
      +
      strcpy(__res__, s1); \
      +
      strcat(__res__, s2); \
      +
      __res__; \
      +
      })
      +
      +

      Concatenates two strings in the stack memory (thus it cannot be implemented in a function).

      +

      A NULL reference is treated as an empty string.

      +
      Parameters
      + + + +
      [in]str1string 1
      [in]str2string 2
      +
      +
      +
      Returns
      the concatenated string
      + +
      +
      + +

      ◆ concat_3str

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      #define concat_3str( str1,
       str2,
       str3 
      )
      +
      +Value:
      ({ \
      +
      char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
      +
      char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
      +
      char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
      +
      char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+1); \
      +
      strcpy(__res__, s1); \
      +
      strcat(__res__, s2); \
      +
      strcat(__res__, s3); \
      +
      __res__; \
      +
      })
      +
      +

      Concatenates three strings in the stack memory (thus it cannot be implemented in a function).

      +

      A NULL reference is treated as an empty string.

      +
      Parameters
      + + + + +
      [in]str1string 1
      [in]str2string 2
      [in]str3string 3
      +
      +
      +
      Returns
      the concatenated string
      + +
      +
      + +

      ◆ concat_4str

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      #define concat_4str( str1,
       str2,
       str3,
       str4 
      )
      +
      +Value:
      ({ \
      +
      char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
      +
      char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
      +
      char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
      +
      char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \
      +
      char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+1); \
      +
      strcpy(__res__, s1); \
      +
      strcat(__res__, s2); \
      +
      strcat(__res__, s3); \
      +
      strcat(__res__, s4); \
      +
      __res__; \
      +
      })
      +
      +

      Concatenates four strings in the stack memory (thus it cannot be implemented in a function).

      +

      A NULL reference is treated as an empty string.

      +
      Parameters
      + + + + + +
      [in]str1string 1
      [in]str2string 2
      [in]str3string 3
      [in]str4string 4
      +
      +
      +
      Returns
      the concatenated string
      + +
      +
      + +

      ◆ concat_5str

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      #define concat_5str( str1,
       str2,
       str3,
       str4,
       str5 
      )
      +
      +Value:
      ({ \
      +
      char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
      +
      char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
      +
      char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
      +
      char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \
      +
      char* s5 = (str5) == NULL ? (char*)"" : (char*)(str5); \
      +
      char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+1); \
      +
      strcpy(__res__, s1); \
      +
      strcat(__res__, s2); \
      +
      strcat(__res__, s3); \
      +
      strcat(__res__, s4); \
      +
      strcat(__res__, s5); \
      +
      __res__; \
      +
      })
      +
      +

      Concatenates five strings in the stack memory (thus it cannot be implemented in a function).

      +

      A NULL reference is treated as an empty string.

      +
      Parameters
      + + + + + + +
      [in]str1string 1
      [in]str2string 2
      [in]str3string 3
      [in]str4string 4
      [in]str5string 5
      +
      +
      +
      Returns
      the concatenated string
      + +
      +
      + +

      ◆ concat_6str

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      #define concat_6str( str1,
       str2,
       str3,
       str4,
       str5,
       str6 
      )
      +
      +Value:
      ({ \
      +
      char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
      +
      char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
      +
      char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
      +
      char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \
      +
      char* s5 = (str5) == NULL ? (char*)"" : (char*)(str5); \
      +
      char* s6 = (str6) == NULL ? (char*)"" : (char*)(str6); \
      +
      char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+strlen(s6)+1); \
      +
      strcpy(__res__, s1); \
      +
      strcat(__res__, s2); \
      +
      strcat(__res__, s3); \
      +
      strcat(__res__, s4); \
      +
      strcat(__res__, s5); \
      +
      strcat(__res__, s6); \
      +
      __res__; \
      +
      })
      +
      +

      Concatenates six strings in the stack memory (thus it cannot be implemented in a function).

      +

      A NULL reference is treated as an empty string.

      +
      Parameters
      + + + + + + + +
      [in]str1string 1
      [in]str2string 2
      [in]str3string 3
      [in]str4string 4
      [in]str5string 5
      [in]str6string 6
      +
      +
      +
      Returns
      the concatenated string
      + +
      +
      + +

      ◆ concat_7str

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      #define concat_7str( str1,
       str2,
       str3,
       str4,
       str5,
       str6,
       str7 
      )
      +
      +Value:
      ({ \
      +
      char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
      +
      char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
      +
      char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
      +
      char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \
      +
      char* s5 = (str5) == NULL ? (char*)"" : (char*)(str5); \
      +
      char* s6 = (str6) == NULL ? (char*)"" : (char*)(str6); \
      +
      char* s7 = (str7) == NULL ? (char*)"" : (char*)(str7); \
      +
      char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+strlen(s6)+strlen(s7)+1); \
      +
      strcpy(__res__, s1); \
      +
      strcat(__res__, s2); \
      +
      strcat(__res__, s3); \
      +
      strcat(__res__, s4); \
      +
      strcat(__res__, s5); \
      +
      strcat(__res__, s6); \
      +
      strcat(__res__, s7); \
      +
      __res__; \
      +
      })
      +
      +

      Concatenates seven strings in the stack memory (thus it cannot be implemented in a function).

      +

      A NULL reference is treated as an empty string.

      +
      Parameters
      + + + + + + + + +
      [in]str1string 1
      [in]str2string 2
      [in]str3string 3
      [in]str4string 4
      [in]str5string 5
      [in]str6string 6
      [in]str7string 7
      +
      +
      +
      Returns
      the concatenated string
      + +
      +
      + +

      ◆ int2str

      + +
      +
      + + + + + + + + +
      #define int2str( num)
      +
      +Value:
      ({ \
      +
      char* __res__ = (char*)alloca(numDigits((int)num)+1); \
      +
      sprintf(__res__, "%d", (int)num); \
      +
      __res__; \
      +
      })
      +
      +

      Converts an int value to a stack allocated string.

      +
      Parameters
      + + +
      [in]numinteger number
      +
      +
      +
      Returns
      the converted string
      + +
      +
      + +

      ◆ int2nstr

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      #define int2nstr( num,
       len 
      )
      +
      +Value:
      ({ \
      +
      require (len > 0, concat_3str("invalid length value (", int2str(len), ")")); \
      +
      int d = numDigits((int)num); \
      +
      if (len > d) \
      +
      d = len; \
      +
      char* __res__ = (char*)alloca(d+1); \
      +
      sprintf(__res__, "%0*d", d, (int)num); \
      +
      __res__; \
      +
      })
      +
      +

      Converts an int value to a stack allocated string.

      +

      If necessary, fills the result string with left zeros.

      +
      Parameters
      + + + +
      [in]numinteger number
      [in]lenminimum length of result string
      +
      +
      +
      +
      Precondition:
      +
      len > 0
      +
      +
      Returns
      the converted string
      + +
      +
      + +

      ◆ long2str

      + +
      +
      + + + + + + + + +
      #define long2str( num)
      +
      +Value:
      ({ \
      +
      char* __res__ = (char*)alloca(numDigits((long)num)+1); \
      +
      sprintf(__res__, "%ld", (long)num); \
      +
      __res__; \
      +
      })
      +
      +

      Converts an long value to a stack allocated string.

      +
      Parameters
      + + +
      [in]numlong integer number
      +
      +
      +
      Returns
      the converted string
      + +
      +
      + +

      ◆ long2nstr

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      #define long2nstr( num,
       len 
      )
      +
      +Value:
      ({ \
      +
      require (len > 0, concat_3str("invalid length value (", int2str(len), ")")); \
      +
      int d = numDigits((int)num); \
      +
      if (len > d) \
      +
      d = len; \
      +
      char* __res__ = (char*)alloca(d+1); \
      +
      sprintf(__res__, "%0*ld", d, (long)num); \
      +
      __res__; \
      +
      })
      +
      +

      Converts an long value to a stack allocated string.

      +

      If necessary, fills the result string with left zeros.

      +
      Parameters
      + + + +
      [in]numlong integer number
      [in]lenminimum length of result string
      +
      +
      +
      +
      Precondition:
      +
      len > 0
      +
      +
      Returns
      the converted string
      + +
      +
      + +

      ◆ perc2str

      + +
      +
      + + + + + + + + +
      #define perc2str( percentage)
      +
      +Value:
      ({ \
      +
      require (percentage >= 0 && percentage <= 100, concat_3str("invalid percentage value (", int2str(percentage), ")")); \
      +
      char* __res__ = (char*)alloca(4+1); \
      +
      sprintf(__res__, "%3d%%", (int)percentage); \
      +
      __res__; \
      +
      })
      +
      +

      Converts an int percentage to a stack allocated string.

      +
      Parameters
      + + +
      [in]percentagean integer number with a percentage value
      +
      +
      +
      +
      Precondition:
      +
      percentage >= 0 && percentage <= 100
      +
      +
      Returns
      the converted string
      + +
      +
      + +

      ◆ length_vargs_string_list

      + +
      +
      + + + + + + + + +
      #define length_vargs_string_list( first)
      +
      +Value:
      ({ \
      +
      int __res__ = 0; \
      +
      va_list ap; \
      +
      va_start(ap, first); \
      +
      char* t = first; \
      +
      while (t != NULL) \
      +
      { \
      +
      __res__ += strlen(t); \
      +
      t = va_arg(ap, char*); \
      +
      } \
      +
      va_end(ap); \
      +
      __res__; \
      +
      })
      +
      +

      Determines the length of all strings passed as a NULL terminated variable list of arguments (vargs).

      +
      Parameters
      + + +
      [in]firstthe argument that precedes the vargs argument list.
      +
      +
      +
      Returns
      the sum of the length of all strings (not counting terminator ‘’\0'`)
      + +
      +
      + +

      ◆ not_null

      + +
      +
      + + + + + + + + +
      #define not_null( pnt)
      +
      +Value:
      ({ \
      +
      if ((pnt) == NULL) \
      +
      { \
      +
      fprintf (stderr, "Null pointer error, pointer: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \
      +
      #pnt, __FUNCTION__, __LINE__ , __FILE__); \
      +
      *((int*)0) = 0; \
      +
      abort (); \
      +
      } \
      +
      pnt; \
      +
      })
      +
      +

      Checks if address is not NULL, before its application.

      +

      This macro is a non-defensive implementation of a null pointer verification. It implements two error handling policies:

        +
      • EXIT_POLICY (default): describes the error in stderr (with the identification and the precise location of the failure), generates a segmentation fault (enabling a stack trace within a debugger like gdb), and exits program execution;
      • +
      • EXCEPTION_POLICY: throws a char* exception with the description of the failure.
      • +
      +
      Example
      not_null(pnt)->something();
      +
      Parameters
      + + +
      [in]pntmemory address
      +
      +
      + +
      +
      +

      Function Documentation

      + +

      ◆ mem_alloc()

      + +
      +
      + + + + + + + + +
      void* mem_alloc (int size)
      +
      + +

      A replacement for malloc function.

      +

      This function is a non-defensive implementation of malloc error verification. It implements two error handling policies:

        +
      • EXIT_POLICY (default): describes the error in stderr (with the identification and the precise location of the failure), generates a segmentation fault (enabling a stack trace within a debugger like gdb), and exits program execution;
      • +
      • EXCEPTION_POLICY: throws a char* exception with the description of the failure.
      • +
      +
      Parameters
      + + +
      [in]sizenumber of bytes to be allocated
      +
      +
      +
      +
      Precondition:
      +
      size >= 0
      +
      +
      Returns
      address of the allocated memory
      + +
      +
      + +

      ◆ mem_free()

      + +
      +
      + + + + + + + + +
      void mem_free (void * pnt)
      +
      + +

      A replacement for free function.

      +
      Parameters
      + + +
      [in]pntmemory address to be freed
      +
      +
      +
      +
      Precondition:
      +
      pnt != NULL
      +
      + +
      +
      + +

      ◆ string_clone()

      + +
      +
      + + + + + + + + +
      char* string_clone (char * str)
      +
      + +

      Replicates a string.

      +

      The memory is allocated in the heap (using mem_alloc()).

      +
      Parameters
      + + +
      [in]strstring to be replicated
      +
      +
      +
      +
      Precondition:
      +
      str != NULL
      +
      +
      Returns
      pointer to the replicated string
      + +
      +
      + +

      ◆ string_num_lines()

      + +
      +
      + + + + + + + + +
      int string_num_lines (char * text)
      +
      + +

      Number of lines of a string.

      +
      Parameters
      + + +
      [in]textstring text to process
      +
      +
      +
      +
      Precondition:
      +
      text != NULL
      +
      +
      Returns
      number of counted lines
      + +
      +
      + +

      ◆ string_num_columns()

      + +
      +
      + + + + + + + + +
      int string_num_columns (char * text)
      +
      + +

      Maximum number of columns of a string (not counting character ‘’\n'`).

      +
      Parameters
      + + +
      [in]textstring text to process
      +
      +
      +
      +
      Precondition:
      +
      text != NULL
      +
      +
      Returns
      maximum number of counted columns
      + +
      +
      + +

      ◆ string_count_char()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      int string_count_char (char * text,
      char * ch 
      )
      +
      + +

      Counts the number of occurrences of an UTF8 character in a text.

      +
      Parameters
      + + + +
      [in]textstring text to process
      [in]chstring containing the sequence of bytes (one or more) of an UTF8 single character
      +
      +
      +
      +
      Precondition:
      +
      text != NULL
      + ch != NULL && num_chars_utf8(ch) == 1
      +
      +
      Returns
      number of counted occurrences
      + +
      +
      + +

      ◆ string_starts_with()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      int string_starts_with (char * text,
      char * prefix 
      )
      +
      + +

      Tests if a string starts with a prefix.

      +
      Parameters
      + + + +
      [in]textstring text to process
      [in]prefixstring to test if is a prefix
      +
      +
      +
      +
      Precondition:
      +
      text != NULL
      + prefix != NULL
      +
      +
      Returns
      true (!=0) if prefix starts text, false (0) otherwise
      + +
      +
      + +

      ◆ string_ends_with()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      int string_ends_with (char * text,
      char * suffix 
      )
      +
      + +

      Tests if a string ends with a suffix.

      +
      Parameters
      + + + +
      [in]textstring text to process
      [in]suffixstring to test if is a suffix
      +
      +
      +
      +
      Precondition:
      +
      text != NULL
      + suffix != NULL
      +
      +
      Returns
      true (!=0) if suffix ends text, false (0) otherwise
      + +
      +
      + +

      ◆ string_concat()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      char* string_concat (char * res,
      int max_length,
      char * text,
       ... 
      )
      +
      + +

      Concatenates a NULL terminated list of string arguments.

      +

      This function treats all vargs arguments as strings (char*), and requires that the list is terminated with a NULL argument.

      +

      It allocates memory in heap (using mem_alloc()) if NULL is passed in the res argument.

      +
      Parameters
      + + + + +
      [in,out]resaddress of result string (if not NULL)
      [in]max_lengthres input argument maximum length (not counting terminator ‘’\0'), only applies if(res != NULL)`
      [in]textthe first string to be used in concatenation
      +
      +
      +
      +
      Precondition:
      +
      text != NULL
      + res == NULL || (max_length > 0 && length_vargs_string_list(text) <= max_length)
      +
      +
      Returns
      the concatenated string
      + +
      +
      + +

      ◆ random_boolean()

      + +
      +
      + + + + + + + + +
      int random_boolean (int trueProb)
      +
      + +

      Generates a random boolean value.

      +

      This function generates boolean values with defined probabilities for true (!=0) and false (0) values.

      +
      Parameters
      + + +
      [in]trueProbprobability (in interval [0;100]).
      +
      +
      +
      +
      Precondition:
      +
      trueProb >= 0 && trueProb <= 100
      +
      +
      Returns
      the random boolean value
      + +
      +
      + +

      ◆ random_int()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      int random_int (int min,
      int max 
      )
      +
      + +

      Generates a random integer value within a given interval.

      +

      This function generates integer values in the interval [min;max]with an uniform distribution for all values.

      +
      Parameters
      + + + +
      [in]minlower value of interval
      [in]maxhigher value of interval
      +
      +
      +
      +
      Precondition:
      +
      max >= min
      +
      +
      Returns
      the random integer value
      + +
      +
      + +

      ◆ random_string()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      char* random_string (char ** list,
      int * used,
      int length 
      )
      +
      + +

      Returns a random string from a given string list.

      +

      This function stores the previous randomly selected string's (using the integer indexes of the string list) to disallow its repeated generation.

      +
      Parameters
      + + + + +
      [in]listlist of strings to be selected (NULL terminated)
      [in,out]usedindexes of strings already selected
      [in]lengthnumber of elements of lists list (not counting NULL entry) and used
      +
      +
      +
      +
      Precondition:
      +
      list != NULL
      + used != NULL
      +
      +
      Returns
      the random string
      + +
      +
      + +

      ◆ move_cursor()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void move_cursor (int line,
      int column 
      )
      +
      + +

      Moves the cursor to a position in terminal.

      +
      Parameters
      + + + +
      [in]lineposition in the terminal
      [in]columnposition in the terminal
      +
      +
      +
      +
      Precondition:
      +
      line >= 0 && column >= 0
      +
      + +
      +
      + +

      ◆ string_list_length()

      + +
      +
      + + + + + + + + +
      int string_list_length (char ** list)
      +
      + +

      Number of elements of a NULL terminated list of strings.

      +
      Parameters
      + + +
      [in]listNULL terminated array of strings
      +
      +
      +
      +
      Precondition:
      +
      list != NULL
      +
      +
      Returns
      number of elements of list (not counting NULL)
      + +
      +
      + +

      ◆ string_list_clone()

      + +
      +
      + + + + + + + + +
      char** string_list_clone (char ** list)
      +
      + +

      Replicates a NULL terminated list of strings.

      +

      The memory is allocated in the heap (using mem_alloc()).

      +
      Parameters
      + + +
      [in]listNULL terminated array of strings
      +
      +
      +
      +
      Precondition:
      +
      list != NULL
      +
      +
      Returns
      pointer to the replicated list
      + +
      +
      + +

      ◆ string_list_free()

      + +
      +
      + + + + + + + + +
      char** string_list_free (char ** list)
      +
      + +

      Frees the memory allocated to a NULL terminated list of strings.

      +

      This function is totally compatible with string_list_clone(), and always returns NULL.

      +
      Parameters
      + + +
      [in]listNULL terminated array of strings
      +
      +
      +
      +
      Precondition:
      +
      list != NULL
      +
      +
      Returns
      NULL
      + +
      +
      + +

      ◆ int2nstring()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      char* int2nstring (char * res,
      int num,
      int len 
      )
      +
      + +

      Converts an int value to a string.

      +

      If necessary, fills the result string with left zeros. It allocates memory in heap (using mem_alloc()) if NULL is passed in the res argument.

      +
      Parameters
      + + + + +
      [in,out]resaddress of result string (if not NULL)
      [in]numinteger number
      [in]lenminimum length of result string (not counting terminator ‘’\0'`)
      +
      +
      +
      +
      Precondition:
      +
      len >= numDigits(num)
      +
      +
      Returns
      the converted string
      + +
      +
      + +

      ◆ percentage2string()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      char* percentage2string (char * res,
      int percentage 
      )
      +
      + +

      Converts an int percentage to a string.

      +

      It allocates memory in heap (using mem_alloc()) if NULL is passed in the res argument.

      +
      Parameters
      + + + +
      [in,out]resaddress of result string (if not NULL)
      [in]percentagean integer number with a percentage value
      +
      +
      +
      +
      Precondition:
      +
      percentage >= 0 && percentage <= 100
      +
      +
      Returns
      the converted string (if not NULL, it returns res)
      + +
      +
      +
      +
      +
      #define concat_3str(str1, str2, str3)
      Concatenates three strings in the stack memory (thus it cannot be implemented in a function).
      Definition: utils.h:57
      +
      #define int2str(num)
      Converts an int value to a stack allocated string.
      Definition: utils.h:199
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/group__utils.js b/3ano/1semestre/so/practice-exam/src/doc/html/group__utils.js new file mode 100644 index 0000000..324e2fb --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/group__utils.js @@ -0,0 +1,38 @@ +var group__utils = +[ + [ "utils.h", "utils_8h.html", null ], + [ "concat_2str", "group__utils.html#ga22347cbf977a0300726f06257edd79d6", null ], + [ "concat_3str", "group__utils.html#ga123e40006d54612c48c2660432dfeb23", null ], + [ "concat_4str", "group__utils.html#ga69037999e65cdb42d39988e0fec48af4", null ], + [ "concat_5str", "group__utils.html#ga580d1897bc7a8cef16d5a16a2373b876", null ], + [ "concat_6str", "group__utils.html#ga34f8c2fcee597a99c5f4c66f2119bca9", null ], + [ "concat_7str", "group__utils.html#ga01d1ea65eb6780d91705484dd46833bf", null ], + [ "int2str", "group__utils.html#ga3c545b669dff7d67e5ed3c58233ccf4b", null ], + [ "int2nstr", "group__utils.html#ga858ece77e79fb78d3db0f1851bf7fe09", null ], + [ "long2str", "group__utils.html#ga69373a612a7b4d264371f727217f9954", null ], + [ "long2nstr", "group__utils.html#ga50cea1f8154c7c7d2abd68f1ddb33086", null ], + [ "perc2str", "group__utils.html#ga59cd66180162d107cf86a51c21d7e6f5", null ], + [ "length_vargs_string_list", "group__utils.html#ga7bffda236a079c26302722c7d155f7a5", null ], + [ "not_null", "group__utils.html#gadfa0375f8178c737deae23ffa8d152f4", null ], + [ "mem_alloc", "group__utils.html#gadce4d1c428f979bf1cf8e1582d2f4052", null ], + [ "mem_free", "group__utils.html#gabe60e8350f3e3b07ed5002ee3449a6ae", null ], + [ "string_clone", "group__utils.html#ga825354891d287cc86d2b4ed1b600175a", null ], + [ "string_num_lines", "group__utils.html#ga15630ddb64e977c8243892556feedfd8", null ], + [ "string_num_columns", "group__utils.html#ga0ca31b2a579b6ef7c75c41324ed5367c", null ], + [ "string_count_char", "group__utils.html#gad643e0fcac9e59c1a171c460633e8637", null ], + [ "string_starts_with", "group__utils.html#ga3ec2b60d1636397119c5e0c21987f791", null ], + [ "string_ends_with", "group__utils.html#ga1c5ba308f71c323fbbd7eb9bb34285d4", null ], + [ "string_concat", "group__utils.html#gaa23a827164f7039b9770379cbf008905", null ], + [ "random_boolean", "group__utils.html#gabe3e28fe49daaf3530e203c4aed1d15f", null ], + [ "random_int", "group__utils.html#gad7954e6a1b9ea073c7bc894dc5af85a9", null ], + [ "random_string", "group__utils.html#gaa820c93c2f719401b4b1ca54f6ea5c75", null ], + [ "clear_console", "group__utils.html#ga3cffe15b7e5d10a108f1734a9640a2c7", null ], + [ "move_cursor", "group__utils.html#gad3d324aed0ec686314cb0f68dfde9853", null ], + [ "hide_cursor", "group__utils.html#ga42702791e6da9510e4f44f33d2dad8f1", null ], + [ "show_cursor", "group__utils.html#ga1bdd62a6bef7cfd6522dc1412e162559", null ], + [ "string_list_length", "group__utils.html#gab8050db5b87bfdee91ee92e67b063478", null ], + [ "string_list_clone", "group__utils.html#ga41163cf3a95e702f12506cd54ba3c70c", null ], + [ "string_list_free", "group__utils.html#gaacf77b3345bbca43767b08ec0583fe3c", null ], + [ "int2nstring", "group__utils.html#ga824373ca8e0b2fdfe3f5c4805cf2ab7e", null ], + [ "percentage2string", "group__utils.html#gacf6edf10cb84412b6bfb431ef87b56d6", null ] +]; \ No newline at end of file diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/index.html b/3ano/1semestre/so/practice-exam/src/doc/html/index.html new file mode 100644 index 0000000..eed0bec --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/index.html @@ -0,0 +1,78 @@ + + + + + + + +C++ Library, mos@ua: Main Page + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      C++ Library, mos@ua Documentation
      +
      +
      +
      +
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/jquery.js b/3ano/1semestre/so/practice-exam/src/doc/html/jquery.js new file mode 100644 index 0000000..103c32d --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
      ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
      ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
      "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
      ").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
      "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
      "),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
      ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/menu.js b/3ano/1semestre/so/practice-exam/src/doc/html/menu.js new file mode 100644 index 0000000..433c15b --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/menu.js @@ -0,0 +1,50 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
    1. '); + } else { + $('#main-menu').append('
    2. '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/menudata.js b/3ano/1semestre/so/practice-exam/src/doc/html/menudata.js new file mode 100644 index 0000000..749943c --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/menudata.js @@ -0,0 +1,50 @@ +/* +@licstart The following is the entire license notice for the +JavaScript code in this file. + +Copyright (C) 1997-2019 by Dimitri van Heesch + +This program is free software; you can redistribute it and/or modify +it under the terms of version 2 of the GNU General Public License as published by +the Free Software Foundation + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +@licend The above is the entire license notice +for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Modules",url:"modules.html"}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"c",url:"globals.html#index_c"}, +{text:"e",url:"globals.html#index_e"}, +{text:"h",url:"globals.html#index_h"}, +{text:"i",url:"globals.html#index_i"}, +{text:"l",url:"globals.html#index_l"}, +{text:"m",url:"globals.html#index_m"}, +{text:"n",url:"globals.html#index_n"}, +{text:"p",url:"globals.html#index_p"}, +{text:"r",url:"globals.html#index_r"}, +{text:"s",url:"globals.html#index_s"}, +{text:"t",url:"globals.html#index_t"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"c",url:"globals_func.html#index_c"}, +{text:"h",url:"globals_func.html#index_h"}, +{text:"i",url:"globals_func.html#index_i"}, +{text:"m",url:"globals_func.html#index_m"}, +{text:"p",url:"globals_func.html#index_p"}, +{text:"r",url:"globals_func.html#index_r"}, +{text:"s",url:"globals_func.html#index_s"}, +{text:"t",url:"globals_func.html#index_t"}]}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/modules.html b/3ano/1semestre/so/practice-exam/src/doc/html/modules.html new file mode 100644 index 0000000..ffdac9c --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/modules.html @@ -0,0 +1,86 @@ + + + + + + + +C++ Library, mos@ua: Modules + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      Modules
      +
      +
      +
      Here is a list of all modules:
      + + + + + +
       DbCDesign-by-Contract module
       processProcess, System-V, and POSIX libraries wrapper module
       threadPOSIX threads library wrapper module
       utilsUseful common functions and macros
      +
      +
      +
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/modules.js b/3ano/1semestre/so/practice-exam/src/doc/html/modules.js new file mode 100644 index 0000000..6341813 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/modules.js @@ -0,0 +1,7 @@ +var modules = +[ + [ "DbC", "group___db_c.html", "group___db_c" ], + [ "process", "group__process.html", "group__process" ], + [ "thread", "group__thread.html", "group__thread" ], + [ "utils", "group__utils.html", "group__utils" ] +]; \ No newline at end of file diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/nav_f.png b/3ano/1semestre/so/practice-exam/src/doc/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/nav_g.png b/3ano/1semestre/so/practice-exam/src/doc/html/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL=0 ? varName.substring(i+1) : varName; + return eval(n.replace(/\-/g,'_')); +} + +function stripPath(uri) +{ + return uri.substring(uri.lastIndexOf('/')+1); +} + +function stripPath2(uri) +{ + var i = uri.lastIndexOf('/'); + var s = uri.substring(i+1); + var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; +} + +function hashValue() +{ + return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,''); +} + +function hashUrl() +{ + return '#'+hashValue(); +} + +function pathName() +{ + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, ''); +} + +function localStorageSupported() +{ + try { + return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem; + } + catch(e) { + return false; + } +} + +function storeLink(link) +{ + if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) { + window.localStorage.setItem('navpath',link); + } +} + +function deleteLink() +{ + if (localStorageSupported()) { + window.localStorage.setItem('navpath',''); + } +} + +function cachedLink() +{ + if (localStorageSupported()) { + return window.localStorage.getItem('navpath'); + } else { + return ''; + } +} + +function getScript(scriptName,func,show) +{ + var head = document.getElementsByTagName("head")[0]; + var script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = func; + script.src = scriptName+'.js'; + head.appendChild(script); +} + +function createIndent(o,domNode,node,level) +{ + var level=-1; + var n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + var imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=arrowRight; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast"); + node.plus_img.innerHTML=arrowRight; + node.expanded = false; + } else { + expandNode(o, node, false, false); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + var span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } +} + +var animationInProgress = false; + +function gotoAnchor(anchor,aname,updateLocation) +{ + var pos, docContent = $('#doc-content'); + var ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || + ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || + ancParent.hasClass('fieldtype') || + ancParent.is(':header')) + { + pos = ancParent.position().top; + } else if (anchor.position()) { + pos = anchor.position().top; + } + if (pos) { + var dist = Math.abs(Math.min( + pos-docContent.offset().top, + docContent[0].scrollHeight- + docContent.height()-docContent.scrollTop())); + animationInProgress=true; + docContent.animate({ + scrollTop: pos + docContent.scrollTop() - docContent.offset().top + },Math.max(50,Math.min(500,dist)),function(){ + if (updateLocation) window.location.href=aname; + animationInProgress=false; + }); + } +} + +function newNode(o, po, text, link, childrenData, lastNode) +{ + var node = new Object(); + node.children = Array(); + node.childrenData = childrenData; + node.depth = po.depth + 1; + node.relpath = po.relpath; + node.isLast = lastNode; + + node.li = document.createElement("li"); + po.getChildrenUL().appendChild(node.li); + node.parentNode = po; + + node.itemDiv = document.createElement("div"); + node.itemDiv.className = "item"; + + node.labelSpan = document.createElement("span"); + node.labelSpan.className = "label"; + + createIndent(o,node.itemDiv,node,0); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + var a = document.createElement("a"); + node.labelSpan.appendChild(a); + node.label = document.createTextNode(text); + node.expanded = false; + a.appendChild(node.label); + if (link) { + var url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + var aname = '#'+link.split('#')[1]; + var srcPage = stripPath(pathName()); + var targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : "javascript:void(0)"; + a.onclick = function(){ + storeLink(link); + if (!$(a).parent().parent().hasClass('selected')) + { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + $(a).parent().parent().addClass('selected'); + $(a).parent().parent().attr('id','selected'); + } + var anchor = $(aname); + gotoAnchor(anchor,aname,true); + }; + } else { + a.href = url; + a.onclick = function() { storeLink(link); } + } + } else { + if (childrenData != null) + { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + } + + node.childrenUL = null; + node.getChildrenUL = function() { + if (!node.childrenUL) { + node.childrenUL = document.createElement("ul"); + node.childrenUL.className = "children_ul"; + node.childrenUL.style.display = "none"; + node.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }; + + return node; +} + +function showRoot() +{ + var headerHeight = $("#top").height(); + var footerHeight = $("#nav-path").height(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + (function (){ // retry until we can scroll to the selected item + try { + var navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); +} + +function expandNode(o, node, imm, showRoot) +{ + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + expandNode(o, node, imm, showRoot); + }, showRoot); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast"); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + } + } +} + +function glowEffect(n,duration) +{ + n.addClass('glow').delay(duration).queue(function(next){ + $(this).removeClass('glow');next(); + }); +} + +function highlightAnchor() +{ + var aname = hashUrl(); + var anchor = $(aname); + if (anchor.parent().attr('class')=='memItemLeft'){ + var rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname'){ + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype'){ + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } +} + +function selectAndHighlight(hash,n) +{ + var a; + if (hash) { + var link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + $('#nav-sync').css('top','30px'); + } else { + $('#nav-sync').css('top','5px'); + } + showRoot(); +} + +function showNode(o, node, index, hash) +{ + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + showNode(o,node,index,hash); + },true); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + var n = node.children[o.breadcrumbs[index]]; + if (index+11) hash = '#'+parts[1].replace(/[^\w\-]/g,''); + else hash=''; + } + if (hash.match(/^#l\d+$/)) { + var anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + var url=root+hash; + var i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function(){ + navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + },true); + } +} + +function showSyncOff(n,relpath) +{ + n.html(''); +} + +function showSyncOn(n,relpath) +{ + n.html(''); +} + +function toggleSyncButton(relpath) +{ + var navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } +} + +var loadTriggered = false; +var readyTriggered = false; +var loadObject,loadToRoot,loadUrl,loadRelPath; + +$(window).on('load',function(){ + if (readyTriggered) { // ready first + navTo(loadObject,loadToRoot,loadUrl,loadRelPath); + showRoot(); + } + loadTriggered=true; +}); + +function initNavTree(toroot,relpath) +{ + var o = new Object(); + o.toroot = toroot; + o.node = new Object(); + o.node.li = document.getElementById("nav-tree-contents"); + o.node.childrenData = NAVTREE; + o.node.children = new Array(); + o.node.childrenUL = document.createElement("ul"); + o.node.getChildrenUL = function() { return o.node.childrenUL; }; + o.node.li.appendChild(o.node.childrenUL); + o.node.depth = 0; + o.node.relpath = relpath; + o.node.expanded = false; + o.node.isLast = true; + o.node.plus_img = document.createElement("span"); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = arrowRight; + + if (localStorageSupported()) { + var navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + navSync.click(function(){ toggleSyncButton(relpath); }); + } + + if (loadTriggered) { // load before ready + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + } else { // ready before load + loadObject = o; + loadToRoot = toroot; + loadUrl = hashUrl(); + loadRelPath = relpath; + readyTriggered=true; + } + + $(window).bind('hashchange', function(){ + if (window.location.hash && window.location.hash.length>1){ + var a; + if ($(location).attr('hash')){ + var clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + + +C++ Library, mos@ua: process.h File Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      process.h File Reference
      +
      +
      + +

      Process, System-V, and POSIX libraries wrapper module. +More...

      +
      #include <stdio.h>
      +#include <unistd.h>
      +#include <sys/ipc.h>
      +#include <sys/shm.h>
      +#include <sys/sem.h>
      +#include <semaphore.h>
      +#include <signal.h>
      +
      +

      Go to the source code of this file.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Functions

      Process handling

      +
      pid_t pfork (void)
       fork wrapper function. More...
       
      pid_t pwait (int *status)
       wait wrapper function. More...
       
      pid_t pwaitpid (pid_t pid, int *status, int options)
       waitpid wrapper function. More...
       
      void pkill (pid_t pid, int sig)
       kill wrapper function. More...
       
      void pexecl (const char *pathname, const char *arg,...)
       execl wrapper function. More...
       
      void psigaction (int signum, const struct sigaction *act, struct sigaction *oldact)
       sigaction wrapper function. More...
       
      System V - shared memory

      Example
      #include <process.h> // #include <sys/shm.h>
      +
      ...
      +
      int shmid;
      +
      // creation:
      +
      shmid = pshmget(key, size, 0600 | IPC_CREAT | IPC_EXCL);
      +
      // or, use existing:
      +
      shmid = pshmget(key, 0, 0);
      +
      ...
      +
      // attach shm to pointer address:
      +
      void* p = pshmat(shmid, NULL, 0);
      +
      ...
      +
      // detach shm from pointer address:
      +
      pshmdt(p);
      +
      ...
      +
      // destroy shm:
      +
      pshmctl(shmid, IPC_RMID, NULL);
      +
      +
      int pshmget (key_t key, size_t size, int shmflg)
       shmget wrapper function. More...
       
      int pshmctl (int shmid, int cmd, struct shmid_ds *buf)
       shmctl wrapper function. More...
       
      void * pshmat (int shmid, const void *shmaddr, int shmflg)
       shmat wrapper function. More...
       
      void pshmdt (const void *shmaddr)
       shmdt wrapper function. More...
       
      System V - semaphores

      Example
      #include <process.h> // #include <sys/sem.h>
      +
      ...
      +
      int semid;
      +
      // creation:
      +
      semid = psemget(key, 1, 0600 | IPC_CREAT | IPC_EXCL); // 1 semaphore!
      +
      // or, use existing:
      +
      semid = psemget(key, 0, 0);
      +
      ...
      +
      // decrement:
      +
      struct sembuf down = {0, -1, 0};
      +
      psemop(semid, &down, 1);
      +
      // or, simply use provided function:
      +
      psem_down(semid, 0); // NOTE: there is no sem_down in default library!
      +
      ...
      +
      // increment:
      +
      struct sembuf up = {0, 1, 0};
      +
      psemop(semid, &up, 1);
      +
      // or, simply use provided function:
      +
      psem_up(semid, 0); // NOTE: there is no sem_up in default library!
      +
      ...
      +
      // destroy sem 0:
      +
      psemctl(semid, 0, IPC_RMID, NULL);
      +
      +
      int psemget (key_t key, int nsems, int semflg)
       semget wrapper function. More...
       
      int psemctl (int semid, int semnum, int cmd)
       semctl wrapper function. More...
       
      +int psemctl (int semid, int semnum, int cmd, void *u)
       
      void psemop (int semid, struct sembuf *sops, size_t nsops)
       semop wrapper function. More...
       
      +void psem_up (int semid, short unsigned int index)
       Increment a semaphore (uses psemop()).
       
      +void psem_down (int semid, short unsigned int index)
       Decrements a semaphore (uses psemop()).
       
      +void psem_down2 (int semid, short unsigned int index1, unsigned int index2)
       Decrements atomically two semaphores in a System V semaphore array (uses psemop()).
       
      System V - message queues

      Example
      #include <process.h> // #include <sys/msg.h>
      +
      ...
      +
      typedef struct Item
      +
      {
      +
      ...
      +
      } Item;
      +
      typedef struct Message
      +
      {
      +
      long type;
      +
      Item item;
      +
      } Message;
      +
      ...
      +
      int msgid;
      +
      // creation:
      +
      msgid = pmsgget(key, 0600 | IPC_CREAT | IPC_EXCL);
      +
      // or, use existing:
      +
      msgid = pmsgget(key, 0);
      +
      ...
      +
      Message msg;
      +
      // send msg:
      +
      msg = ...;
      +
      pmsgsnd(msgid, &msg, sizeof(Item), 0);
      +
      ...
      +
      // receive msg:
      +
      pmsgrcv(msgid, &msg, sizeof(Item), type, 0);
      +
      ...
      +
      // destroy msg:
      +
      pmsgctl(msgid, IPC_RMID, NULL);
      +
      +
      int pmsgget (key_t key, int msgflg)
       msgget wrapper function. More...
       
      int pmsgctl (int msqid, int cmd, struct msqid_ds *buf)
       msgctl wrapper function. More...
       
      void pmsgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg)
       msgsnd wrapper function. More...
       
      size_t pmsgrcv (int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg)
       msgrcv wrapper function. More...
       
      POSIX semaphores

      +
      sem_t * psem_open (const char *name, int oflag)
       sem_open wrapper function. More...
       
      +sem_t * psem_open (const char *name, int oflag, mode_t mode, unsigned int value)
       
      void psem_close (sem_t *sem)
       sem_close wrapper function. More...
       
      void psem_unlink (const char *name)
       sem_unlink wrapper function. More...
       
      void psem_init (sem_t *sem, int pshared, unsigned int value)
       sem_init wrapper function. More...
       
      void psem_destroy (sem_t *sem)
       sem_destroy wrapper function. More...
       
      void psem_wait (sem_t *sem)
       sem_wait wrapper function. More...
       
      int psem_trywait (sem_t *sem)
       sem_trywait wrapper function. More...
       
      int psem_timedwait (sem_t *sem, const struct timespec *abs_timeout)
       sem_timedwait wrapper function. More...
       
      void psem_post (sem_t *sem)
       sem_post wrapper function. More...
       
      UNIX pipes

      +
      void ppipe (int pipefd[2])
       pipe wrapper function. More...
       
      FILE * ppopen (const char *command, const char *type)
       popen wrapper function. More...
       
      void ppclose (FILE *stream)
       pclose wrapper function. More...
       
      +

      Detailed Description

      +

      Process, System-V, and POSIX libraries wrapper module.

      +
      Remarks
      Removes defensive programming from native libraries
      +
      +
      +
      void * pshmat(int shmid, const void *shmaddr, int shmflg)
      shmat wrapper function.
      +
      Process, System-V, and POSIX libraries wrapper module.
      +
      int psemget(key_t key, int nsems, int semflg)
      semget wrapper function.
      +
      int pshmget(key_t key, size_t size, int shmflg)
      shmget wrapper function.
      +
      void pmsgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)
      msgsnd wrapper function.
      +
      int pmsgget(key_t key, int msgflg)
      msgget wrapper function.
      +
      void psem_down(int semid, short unsigned int index)
      Decrements a semaphore (uses psemop()).
      +
      void psem_up(int semid, short unsigned int index)
      Increment a semaphore (uses psemop()).
      +
      void psemop(int semid, struct sembuf *sops, size_t nsops)
      semop wrapper function.
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/process_8h.js b/3ano/1semestre/so/practice-exam/src/doc/html/process_8h.js new file mode 100644 index 0000000..9a0053b --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/process_8h.js @@ -0,0 +1,35 @@ +var process_8h = +[ + [ "pfork", "group__process.html#ga67e00aff1839b1ba68c83947593f625b", null ], + [ "pwait", "group__process.html#gad27b81fee9a0f792c4ba29fd95c967e1", null ], + [ "pwaitpid", "group__process.html#gac926bd7ccd173f742b5d58f51cabcb48", null ], + [ "pkill", "group__process.html#gab546ccee89e3159ea7c23aa3a463a0d8", null ], + [ "pexecl", "group__process.html#gae5d3e8ac00f0e788f21020699bac758a", null ], + [ "psigaction", "group__process.html#ga7c7f6de68bd3dea8a702668090a65854", null ], + [ "pshmget", "group__process.html#gaff71624be0fc9c76e0c72295721875e6", null ], + [ "pshmctl", "group__process.html#ga3119bdf5486059aee6ec3ed65a01b319", null ], + [ "pshmat", "group__process.html#ga0cdba7faa458e7fb57c31d3cd8788480", null ], + [ "pshmdt", "group__process.html#ga1682328cd34b592404ff030779b0428f", null ], + [ "psemget", "group__process.html#gaada159a0fe725ed843ac358be6e6a9d3", null ], + [ "psemctl", "group__process.html#gac42e869afba098ec9bdd77444ba790c5", null ], + [ "psemop", "group__process.html#ga0e2534c82b54573590d913c297cc4840", null ], + [ "psem_up", "group__process.html#gaa00610fec639ef123819ceee2ef00da3", null ], + [ "psem_down", "group__process.html#gac2b930e9aceda9ef276b21ae8e839c16", null ], + [ "psem_down2", "group__process.html#ga47891b55ba91af98c5b45cbcf154bc20", null ], + [ "pmsgget", "group__process.html#gad426e03bc9b8dae5f1fbf889ce2dd8f7", null ], + [ "pmsgctl", "group__process.html#ga13bfac41329ec74b2aa4950f9586ae9f", null ], + [ "pmsgsnd", "group__process.html#gaeeb6cd0ab585a7769cd17405f600e56a", null ], + [ "pmsgrcv", "group__process.html#gacd4e4161a46bfa2e1f23eb1d49aaa07b", null ], + [ "psem_open", "group__process.html#ga7bf7fce2d1f344e7dfeeb1b46a9ee7ba", null ], + [ "psem_close", "group__process.html#ga41a884c3a9d9ac6a31fc6ab27ae1d668", null ], + [ "psem_unlink", "group__process.html#ga0415c9c4fab4baafef6cd2d40becd05e", null ], + [ "psem_init", "group__process.html#gac49ddb266cec5493ebd756cd9382f99d", null ], + [ "psem_destroy", "group__process.html#ga82e3d1015521711a2a6374d6c3771491", null ], + [ "psem_wait", "group__process.html#gae2c867f9f66e74fad44df3f32f87a8c6", null ], + [ "psem_trywait", "group__process.html#ga04cb3c84545fe7707c63578e1d59b689", null ], + [ "psem_timedwait", "group__process.html#gac8b2b3d1e18b385f10b389ce2ea734ef", null ], + [ "psem_post", "group__process.html#gad63921c4ec6f0845b752eb59a8935b8e", null ], + [ "ppipe", "group__process.html#ga013466fa89ac97a0db0ccd78168a8456", null ], + [ "ppopen", "group__process.html#ga2d9df322812707050312aa24d15a4360", null ], + [ "ppclose", "group__process.html#ga1490f6e0ca0ebf607d1f5ff431c79b68", null ] +]; \ No newline at end of file diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/process_8h_source.html b/3ano/1semestre/so/practice-exam/src/doc/html/process_8h_source.html new file mode 100644 index 0000000..d4429d3 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/process_8h_source.html @@ -0,0 +1,201 @@ + + + + + + + +C++ Library, mos@ua: process.h Source File + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      process.h
      +
      +
      +Go to the documentation of this file.
      1 
      +
      54 #ifndef PROCESS_H
      +
      55 #define PROCESS_H
      +
      56 
      +
      57 #include <stdio.h>
      +
      58 #include <unistd.h>
      +
      59 #include <sys/ipc.h>
      +
      60 #include <sys/shm.h>
      +
      61 #include <sys/sem.h>
      +
      62 #include <semaphore.h>
      +
      63 #include <signal.h>
      +
      64 
      +
      65 //#define EXCEPTION_POLICY
      +
      66 //#define EXIT_POLICY // DEFAULT
      +
      67 
      +
      68 
      +
      80 pid_t pfork(void);
      +
      81 
      +
      89 pid_t pwait(int *status);
      +
      90 
      +
      98 pid_t pwaitpid(pid_t pid, int *status, int options);
      +
      99 
      +
      107 void pkill(pid_t pid, int sig);
      +
      108 
      +
      116 void pexecl(const char *pathname, const char *arg, ... /* (char *) NULL */);
      +
      117 
      +
      125 void psigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
      +
      126 
      +
      167 int pshmget(key_t key, size_t size, int shmflg);
      +
      168 
      +
      176 int pshmctl(int shmid, int cmd, struct shmid_ds *buf);
      +
      177 
      +
      185 void *pshmat(int shmid, const void *shmaddr, int shmflg);
      +
      186 
      +
      194 void pshmdt(const void *shmaddr);
      +
      195 
      +
      242 int psemget(key_t key, int nsems, int semflg);
      +
      243 
      +
      251 int psemctl(int semid, int semnum, int cmd);
      +
      252 int psemctl(int semid, int semnum, int cmd, void *u);
      +
      253 
      +
      261 void psemop(int semid, struct sembuf *sops, size_t nsops);
      +
      262 
      +
      266 void psem_up(int semid, short unsigned int index);
      +
      267 
      +
      271 void psem_down(int semid, short unsigned int index);
      +
      272 
      +
      276 void psem_down2(int semid, short unsigned int index1, unsigned int index2);
      +
      277 
      +
      326 int pmsgget(key_t key, int msgflg);
      +
      327 
      +
      335 int pmsgctl(int msqid, int cmd, struct msqid_ds *buf);
      +
      336 
      +
      344 void pmsgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
      +
      345 
      +
      353 size_t pmsgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
      +
      354 
      +
      362 // named:
      +
      370 sem_t *psem_open(const char *name, int oflag);
      +
      371 sem_t *psem_open(const char *name, int oflag, mode_t mode, unsigned int value);
      +
      372 
      +
      384 void psem_close(sem_t *sem);
      +
      385 
      +
      393 void psem_unlink(const char *name);
      +
      394 
      +
      395 // unnamed:
      +
      407 void psem_init(sem_t *sem, int pshared, unsigned int value);
      +
      408 
      +
      420 void psem_destroy(sem_t *sem);
      +
      421 
      +
      422 // named and unnamed:
      +
      434 void psem_wait(sem_t *sem);
      +
      435 
      +
      449 int psem_trywait(sem_t *sem);
      +
      450 
      +
      464 int psem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
      +
      465 
      +
      477 void psem_post(sem_t *sem);
      +
      478 
      +
      492 void ppipe(int pipefd[2]);
      +
      493 
      +
      506 FILE *ppopen(const char *command, const char *type);
      +
      507 
      +
      519 void ppclose(FILE *stream);
      +
      520 
      +
      524 #endif
      +
      525 
      +
      526 /* ************************************************** */
      +
      530 /* ************************************************** */
      +
      531 
      +
      +
      +
      int psem_timedwait(sem_t *sem, const struct timespec *abs_timeout)
      sem_timedwait wrapper function.
      +
      void pkill(pid_t pid, int sig)
      kill wrapper function.
      +
      void psem_init(sem_t *sem, int pshared, unsigned int value)
      sem_init wrapper function.
      +
      void psem_down2(int semid, short unsigned int index1, unsigned int index2)
      Decrements atomically two semaphores in a System V semaphore array (uses psemop()).
      +
      int psem_trywait(sem_t *sem)
      sem_trywait wrapper function.
      +
      int psemctl(int semid, int semnum, int cmd)
      semctl wrapper function.
      +
      void psem_wait(sem_t *sem)
      sem_wait wrapper function.
      +
      void psem_unlink(const char *name)
      sem_unlink wrapper function.
      +
      void * pshmat(int shmid, const void *shmaddr, int shmflg)
      shmat wrapper function.
      +
      void ppclose(FILE *stream)
      pclose wrapper function.
      +
      int psemget(key_t key, int nsems, int semflg)
      semget wrapper function.
      +
      void psem_destroy(sem_t *sem)
      sem_destroy wrapper function.
      +
      void ppipe(int pipefd[2])
      pipe wrapper function.
      +
      sem_t * psem_open(const char *name, int oflag)
      sem_open wrapper function.
      +
      void pexecl(const char *pathname, const char *arg,...)
      execl wrapper function.
      +
      pid_t pfork(void)
      fork wrapper function.
      +
      FILE * ppopen(const char *command, const char *type)
      popen wrapper function.
      +
      void psem_post(sem_t *sem)
      sem_post wrapper function.
      +
      int pshmget(key_t key, size_t size, int shmflg)
      shmget wrapper function.
      +
      pid_t pwaitpid(pid_t pid, int *status, int options)
      waitpid wrapper function.
      +
      void pmsgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)
      msgsnd wrapper function.
      +
      int pmsgget(key_t key, int msgflg)
      msgget wrapper function.
      +
      void psem_down(int semid, short unsigned int index)
      Decrements a semaphore (uses psemop()).
      +
      int pshmctl(int shmid, int cmd, struct shmid_ds *buf)
      shmctl wrapper function.
      +
      void pshmdt(const void *shmaddr)
      shmdt wrapper function.
      +
      void psem_close(sem_t *sem)
      sem_close wrapper function.
      +
      void psigaction(int signum, const struct sigaction *act, struct sigaction *oldact)
      sigaction wrapper function.
      +
      size_t pmsgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg)
      msgrcv wrapper function.
      +
      void psem_up(int semid, short unsigned int index)
      Increment a semaphore (uses psemop()).
      +
      int pmsgctl(int msqid, int cmd, struct msqid_ds *buf)
      msgctl wrapper function.
      +
      pid_t pwait(int *status)
      wait wrapper function.
      +
      void psemop(int semid, struct sembuf *sops, size_t nsops)
      semop wrapper function.
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/resize.js b/3ano/1semestre/so/practice-exam/src/doc/html/resize.js new file mode 100644 index 0000000..a0bb5f4 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/resize.js @@ -0,0 +1,137 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function initResizable() +{ + var cookie_namespace = 'doxygen'; + var sidenav,navtree,content,header,collapsed,collapsedWidth=0,barWidth=6,desktop_vp=768,titleHeight; + + function readCookie(cookie) + { + var myCookie = cookie_namespace+"_"+cookie+"="; + if (document.cookie) { + var index = document.cookie.indexOf(myCookie); + if (index != -1) { + var valStart = index + myCookie.length; + var valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + var val = document.cookie.substring(valStart, valEnd); + return val; + } + } + return 0; + } + + function writeCookie(cookie, val, expiration) + { + if (val==undefined) return; + if (expiration == null) { + var date = new Date(); + date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week + expiration = date.toGMTString(); + } + document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; expires=" + expiration+"; path=/"; + } + + function resizeWidth() + { + var windowWidth = $(window).width() + "px"; + var sidenavWidth = $(sidenav).outerWidth(); + content.css({marginLeft:parseInt(sidenavWidth)+"px"}); + writeCookie('width',sidenavWidth-barWidth, null); + } + + function restoreWidth(navWidth) + { + var windowWidth = $(window).width() + "px"; + content.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + sidenav.css({width:navWidth + "px"}); + } + + function resizeHeight() + { + var headerHeight = header.outerHeight(); + var footerHeight = footer.outerHeight(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + content.css({height:windowHeight + "px"}); + navtree.css({height:windowHeight + "px"}); + sidenav.css({height:windowHeight + "px"}); + var width=$(window).width(); + if (width!=collapsedWidth) { + if (width=desktop_vp) { + if (!collapsed) { + collapseExpand(); + } + } else if (width>desktop_vp && collapsedWidth0) { + restoreWidth(0); + collapsed=true; + } + else { + var width = readCookie('width'); + if (width>200 && width<$(window).width()) { restoreWidth(width); } else { restoreWidth(200); } + collapsed=false; + } + } + + header = $("#top"); + sidenav = $("#side-nav"); + content = $("#doc-content"); + navtree = $("#nav-tree"); + footer = $("#nav-path"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); + $(sidenav).resizable({ minWidth: 0 }); + $(window).resize(function() { resizeHeight(); }); + var device = navigator.userAgent.toLowerCase(); + var touch_device = device.match(/(iphone|ipod|ipad|android)/); + if (touch_device) { /* wider split bar for touch only devices */ + $(sidenav).css({ paddingRight:'20px' }); + $('.ui-resizable-e').css({ width:'20px' }); + $('#nav-sync').css({ right:'34px' }); + barWidth=20; + } + var width = readCookie('width'); + if (width) { restoreWidth(width); } else { resizeWidth(); } + resizeHeight(); + var url = location.href; + var i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + var _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(".ui-resizable-handle").dblclick(collapseExpand); + $(window).on('load',resizeHeight); +} +/* @license-end */ diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/splitbar.png b/3ano/1semestre/so/practice-exam/src/doc/html/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/sync_off.png b/3ano/1semestre/so/practice-exam/src/doc/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/sync_on.png b/3ano/1semestre/so/practice-exam/src/doc/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/tab_a.png b/3ano/1semestre/so/practice-exam/src/doc/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/tab_b.png b/3ano/1semestre/so/practice-exam/src/doc/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/tabs.css b/3ano/1semestre/so/practice-exam/src/doc/html/tabs.css new file mode 100644 index 0000000..7d45d36 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283A5D transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/thread_8h.html b/3ano/1semestre/so/practice-exam/src/doc/html/thread_8h.html new file mode 100644 index 0000000..805fef9 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/thread_8h.html @@ -0,0 +1,263 @@ + + + + + + + +C++ Library, mos@ua: thread.h File Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      thread.h File Reference
      +
      +
      + +

      POSIX threads library wrapper module. +More...

      +
      #include <pthread.h>
      +
      +

      Go to the source code of this file.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Functions

      Thread handling

      Variable type: pthread_t

      +

      +
      int thread_equal (pthread_t t1, pthread_t t2)
       pthread_equal wrapper function. More...
       
      void thread_create (pthread_t *t, pthread_attr_t *attr, void *(*thread_main)(void *), void *arg)
       pthread_create wrapper function. More...
       
      pthread_t thread_self ()
       pthread_self wrapper function. More...
       
      void thread_sched_yield (void)
       sched_yield wrapper function. More...
       
      void thread_exit (void *retval)
       pthread_exit wrapper function. More...
       
      void thread_detach (pthread_t thread)
       pthread_detach wrapper function. More...
       
      void thread_join (pthread_t t, void **result)
       pthread_join wrapper function. More...
       
      Mutexes

      Variable type: pthread_mutex_t

      +

      Initialization of mutexes can be static or dynamic.

      +

      In static initialization the following initialization macros are suggested:

        +
      • PTHREAD_MUTEX_INITIALIZER - standard initializer
      • +
      • PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP - initializer that ensures error checking
      • +
      • PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP - for recursive mutexes (note that recursive mutexes should be avoid)
      • +
      +

      Dynamic initialization is done by mutex_init() and mutex_destroy().

      +

      +
      void mutex_init (pthread_mutex_t *pmtx, pthread_mutexattr_t *attr)
       pthread_mutex_init wrapper function. More...
       
      void mutex_destroy (pthread_mutex_t *pmtx)
       pthread_mutex_destroy wrapper function. More...
       
      void mutex_lock (pthread_mutex_t *pmtx)
       pthread_mutex_lock wrapper function. More...
       
      int mutex_trylock (pthread_mutex_t *pmtx)
       pthread_mutex_trylock wrapper function. More...
       
      void mutex_unlock (pthread_mutex_t *pmtx)
       pthread_mutex_unlock wrapper function. More...
       
      Condition variables

      Variable type: pthread_cond_t

      +

      Initialization of condition variables can be static or dynamic.

      +

      In static initialization the following initialization macros should be used:

        +
      • PTHREAD_COND_INITIALIZER - standard initializer
      • +
      +

      Dynamic initialization is done by cond_init() and cond_destroy().

      +

      +
      void cond_init (pthread_cond_t *pcvar, pthread_condattr_t *attr)
       pthread_cond_init wrapper function. More...
       
      void cond_destroy (pthread_cond_t *pcvar)
       pthread_cond_destroy wrapper function. More...
       
      void cond_wait (pthread_cond_t *pcvar, pthread_mutex_t *pmtx)
       pthread_cond_wait wrapper function. More...
       
      int cond_timedwait (pthread_cond_t *pcvar, pthread_mutex_t *pmtx, const struct timespec *abstime)
       pthread_cond_timedwait wrapper function. More...
       
      int cond_timedwait (pthread_cond_t *pcvar, pthread_mutex_t *pmtx, long relative_time_us)
       pthread_cond_timedwait wrapper function accepting relative time (in microseconds) instead of absolute time. More...
       
      void cond_signal (pthread_cond_t *pcvar)
       pthread_cond_signal wrapper function. More...
       
      void cond_broadcast (pthread_cond_t *pcvar)
       pthread_cond_broadcast wrapper function. More...
       
      One-time initialization

      Variable type: pthread_once_t

      +

      POSIX thread library support a mechanism that ensures a one-time execution of a function. It does it through pthread_once_t variables, and by passing a callback function (in C/C++ is simply a function pointer).

      +
      Example
         void once_init_routine(void) { ... }
      +   ...
      +   pthread_once_t once_control = PTHREAD_ONCE_INIT;
      +   thread_once(&once_control, &once_init_routine); // one time execution over pthread_once_t
      +                                                   // variable is guaranteed, regardless of the
      +                                                   // number of threads that execute over that
      +                                                   // variable.
      +
      +

      +
      void thread_once (pthread_once_t *once_control, void(*init_routine)(void))
       pthread_once wrapper function. More...
       
      Thread-specific data

      Variable type: pthread_key_t

      +

      Thread-specific data allows the definition of variable whose scope is limited to each thread. In practice, we will have a common variable, with a common access, but with different values for each thread.

      +

      +
      void thread_key_create (pthread_key_t *key, void(*destr_function)(void *))
       pthread_key_create wrapper function. More...
       
      void thread_key_delete (pthread_key_t key)
       pthread_key_delete wrapper function. More...
       
      void thread_setspecific (pthread_key_t key, void *pointer)
       pthread_setspecific wrapper function. More...
       
      void * thread_getspecific (pthread_key_t key)
       pthread_getspecific wrapper function. More...
       
      Mutex attributes

      Variable type: pthread_mutexattr_t

      +

      +
      void mutexattr_init (pthread_mutexattr_t *attr)
       pthread_mutexattr_init wrapper function. More...
       
      void mutexattr_destroy (pthread_mutexattr_t *attr)
       pthread_mutexattr_destroy wrapper function. More...
       
      void mutexattr_settype (pthread_mutexattr_t *attr, int type)
       pthread_mutexattr_settype wrapper function. More...
       
      void mutexattr_gettype (const pthread_mutexattr_t *attr, int *kind)
       pthread_mutexattr_gettype wrapper function. More...
       
      Condition variables attributes

      Variable type: pthread_condattr_t

      +

      +
      void condattr_init (pthread_condattr_t *attr)
       pthread_condattr_init wrapper function. More...
       
      void condattr_destroy (pthread_condattr_t *attr)
       pthread_condattr_destroy wrapper function. More...
       
      Thread attributes

      Variable type: pthread_attr_t

      +

      +
      void thread_attr_init (pthread_attr_t *attr)
       pthread_attr_init wrapper function. More...
       
      void thread_attr_destroy (pthread_attr_t *attr)
       pthread_attr_destroy wrapper function. More...
       
      void thread_attr_setdetachstate (pthread_attr_t *attr, int detachstate)
       pthread_attr_setdetachstate wrapper function. More...
       
      void thread_attr_getdetachstate (const pthread_attr_t *attr, int *pdetachstate)
       pthread_attr_getdetachstate wrapper function. More...
       
      Cancellation

      +
      void thread_cancel (pthread_t thread)
       pthread_cancel wrapper function. More...
       
      void thread_setcancelstate (int state, int *oldstate)
       pthread_setcancelstate wrapper function. More...
       
      void thread_setcanceltype (int type, int *oldtype)
       pthread_setcanceltype wrapper function. More...
       
      void thread_testcancel (void)
       pthread_testcancel wrapper function. More...
       
      +

      Detailed Description

      +

      POSIX threads library wrapper module.

      +
      Remarks
      Removes defensive programming from native libraries
      +
      +
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/thread_8h.js b/3ano/1semestre/so/practice-exam/src/doc/html/thread_8h.js new file mode 100644 index 0000000..afcfcb2 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/thread_8h.js @@ -0,0 +1,41 @@ +var thread_8h = +[ + [ "thread_equal", "group__thread.html#gadca8bdcec91b8985370d904591d342b8", null ], + [ "thread_create", "group__thread.html#ga3a0f9920a321b54c41c098d3461d3889", null ], + [ "thread_self", "group__thread.html#ga606fdef53f997c231e0e1e9e54b350d4", null ], + [ "thread_sched_yield", "group__thread.html#ga952c63101c667d247f0923b609710c72", null ], + [ "thread_exit", "group__thread.html#ga19b16adf05364471bae2840aa564329a", null ], + [ "thread_detach", "group__thread.html#ga86aa7989874009c886bea9d41700e25c", null ], + [ "thread_join", "group__thread.html#ga2b2370a45c1518f777493526b2e4f46d", null ], + [ "mutex_init", "group__thread.html#ga3f227a19d6a339ce0aeda15775e5e6e6", null ], + [ "mutex_destroy", "group__thread.html#ga5ebb836d0f83eac719f2cdd336497b01", null ], + [ "mutex_lock", "group__thread.html#ga87086ba0f13f6ddc479a6bc803a10c39", null ], + [ "mutex_trylock", "group__thread.html#ga8bd074884e1c92e88ca8ea0552d9a928", null ], + [ "mutex_unlock", "group__thread.html#ga95235231165ebda870afa10ba5fd6c41", null ], + [ "cond_init", "group__thread.html#ga31e5eaf158d118d0e4ef7fd47368eaad", null ], + [ "cond_destroy", "group__thread.html#gad663c43fbfbb4f660d48b07e110c8f80", null ], + [ "cond_wait", "group__thread.html#ga1123643838d5174ccd41f52f4169e896", null ], + [ "cond_timedwait", "group__thread.html#ga8cd2040836c30e4f0ea17abe4f66b8e2", null ], + [ "cond_timedwait", "group__thread.html#ga4b41089ba3cd8ad0a539b42bc8b95d6b", null ], + [ "cond_signal", "group__thread.html#ga9624688b577fb653af7a528848cc53d5", null ], + [ "cond_broadcast", "group__thread.html#ga6459039ab27da7237dda2bbc866eb2d0", null ], + [ "thread_once", "group__thread.html#gad0428e8a0809704f4b3d682f26d3ef1c", null ], + [ "thread_key_create", "group__thread.html#ga7df1983f57dca40a86a55d215d13d42b", null ], + [ "thread_key_delete", "group__thread.html#ga65a50dfc97c087a28cb916e0f30f760e", null ], + [ "thread_setspecific", "group__thread.html#ga3008b033f2830e79179a882a2b74c8ba", null ], + [ "thread_getspecific", "group__thread.html#ga0d207f1bb2e1d493b68a026b8650cb16", null ], + [ "mutexattr_init", "group__thread.html#ga9fb2733a01e8d668a2022005ea5dbebd", null ], + [ "mutexattr_destroy", "group__thread.html#ga07bf0e49b1f2cb99d3a2955641c676d5", null ], + [ "mutexattr_settype", "group__thread.html#ga601a6a9527d7d5ee2ca2870cddc4afc2", null ], + [ "mutexattr_gettype", "group__thread.html#gadf741e1818d53c5b7d71cd68e161b215", null ], + [ "condattr_init", "group__thread.html#gab8073c72be896ba9d711d887a5405a74", null ], + [ "condattr_destroy", "group__thread.html#ga4644f4989b30ccfb2e908017c43bd0d0", null ], + [ "thread_attr_init", "group__thread.html#gaaf2db7012069f0006e7ffaf257d8ccc6", null ], + [ "thread_attr_destroy", "group__thread.html#gaf3a9c2c051deee01e21c75f0fa8b2e9c", null ], + [ "thread_attr_setdetachstate", "group__thread.html#gabc82fea1785fc82aeb2f43cdd77b9b0f", null ], + [ "thread_attr_getdetachstate", "group__thread.html#gaae83c8617612c1bb481fec2b382ac9c4", null ], + [ "thread_cancel", "group__thread.html#ga1b3cb53565eabe02a36e000e5244dfd1", null ], + [ "thread_setcancelstate", "group__thread.html#ga98baffe08beec792f3428ae9ddad966e", null ], + [ "thread_setcanceltype", "group__thread.html#gab4ec114c7b59f8f4185bac648b256d0c", null ], + [ "thread_testcancel", "group__thread.html#ga81bdb13d62e16ad7cb3cbd263c9a5671", null ] +]; \ No newline at end of file diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/thread_8h_source.html b/3ano/1semestre/so/practice-exam/src/doc/html/thread_8h_source.html new file mode 100644 index 0000000..c0e7fab --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/thread_8h_source.html @@ -0,0 +1,207 @@ + + + + + + + +C++ Library, mos@ua: thread.h Source File + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      thread.h
      +
      +
      +Go to the documentation of this file.
      1 
      +
      28 #ifndef THREAD_H
      +
      29 #define THREAD_H
      +
      30 
      +
      31 #include <pthread.h>
      +
      32 
      +
      33 //#define EXCEPTION_POLICY
      +
      34 //#define EXIT_POLICY // DEFAULT
      +
      35 
      +
      52 int thread_equal(pthread_t t1, pthread_t t2);
      +
      53 
      +
      66 void thread_create(pthread_t* t, pthread_attr_t* attr, void *(*thread_main)(void*), void* arg);
      +
      67 
      +
      75 pthread_t thread_self();
      +
      76 
      +
      84 void thread_sched_yield(void);
      +
      85 
      +
      93 void thread_exit(void *retval);
      +
      94 
      +
      102 void thread_detach(pthread_t thread);
      +
      103 
      +
      111 void thread_join(pthread_t t, void** result);
      +
      112 
      +
      145 void mutex_init(pthread_mutex_t* pmtx, pthread_mutexattr_t* attr);
      +
      146 
      +
      158 void mutex_destroy(pthread_mutex_t* pmtx);
      +
      159 
      +
      171 void mutex_lock(pthread_mutex_t* pmtx);
      +
      172 
      +
      186 int mutex_trylock(pthread_mutex_t* pmtx);
      +
      187 
      +
      199 void mutex_unlock(pthread_mutex_t* pmtx);
      +
      200 
      +
      231 void cond_init(pthread_cond_t* pcvar, pthread_condattr_t* attr);
      +
      232 
      +
      244 void cond_destroy(pthread_cond_t* pcvar);
      +
      245 
      +
      258 void cond_wait(pthread_cond_t* pcvar, pthread_mutex_t* pmtx);
      +
      259 
      +
      275 int cond_timedwait(pthread_cond_t* pcvar, pthread_mutex_t* pmtx, const struct timespec *abstime);
      +
      276 
      +
      292 int cond_timedwait(pthread_cond_t* pcvar, pthread_mutex_t* pmtx, long relative_time_us);
      +
      293 
      +
      305 void cond_signal(pthread_cond_t* pcvar);
      +
      306 
      +
      318 void cond_broadcast(pthread_cond_t* pcvar);
      +
      319 
      +
      359 void thread_once(pthread_once_t *once_control, void (*init_routine) (void));
      +
      360 
      +
      389 void thread_key_create(pthread_key_t *key, void (*destr_function) (void *));
      +
      390 
      +
      404 void thread_key_delete(pthread_key_t key);
      +
      405 
      +
      417 void thread_setspecific(pthread_key_t key, void* pointer);
      +
      418 
      +
      430 void* thread_getspecific(pthread_key_t key);
      +
      431 
      +
      455 void mutexattr_init(pthread_mutexattr_t *attr);
      +
      456 
      +
      468 void mutexattr_destroy(pthread_mutexattr_t *attr);
      +
      469 
      +
      481 void mutexattr_settype(pthread_mutexattr_t *attr, int type);
      +
      482 
      +
      495 void mutexattr_gettype(const pthread_mutexattr_t *attr, int *kind);
      +
      496 
      +
      520 void condattr_init(pthread_condattr_t *attr);
      +
      521 
      +
      533 void condattr_destroy(pthread_condattr_t *attr);
      +
      534 
      +
      558 void thread_attr_init(pthread_attr_t *attr);
      +
      559 
      +
      571 void thread_attr_destroy(pthread_attr_t *attr);
      +
      572 
      +
      585 void thread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
      +
      586 
      +
      599 void thread_attr_getdetachstate(const pthread_attr_t *attr, int *pdetachstate);
      +
      600 
      +
      616 void thread_cancel(pthread_t thread);
      +
      617 
      +
      630 void thread_setcancelstate(int state, int *oldstate);
      +
      631 
      +
      644 void thread_setcanceltype(int type, int *oldtype);
      +
      645 
      +
      653 void thread_testcancel(void);
      +
      654 
      +
      655 
      +
      658 #endif
      +
      659 
      +
      660 /* ************************************************** */
      +
      664 /* ************************************************** */
      +
      665 
      +
      +
      +
      void cond_init(pthread_cond_t *pcvar, pthread_condattr_t *attr)
      pthread_cond_init wrapper function.
      +
      void thread_setspecific(pthread_key_t key, void *pointer)
      pthread_setspecific wrapper function.
      +
      void cond_destroy(pthread_cond_t *pcvar)
      pthread_cond_destroy wrapper function.
      +
      void thread_key_create(pthread_key_t *key, void(*destr_function)(void *))
      pthread_key_create wrapper function.
      +
      void thread_exit(void *retval)
      pthread_exit wrapper function.
      +
      void mutexattr_destroy(pthread_mutexattr_t *attr)
      pthread_mutexattr_destroy wrapper function.
      +
      void thread_setcancelstate(int state, int *oldstate)
      pthread_setcancelstate wrapper function.
      +
      void thread_attr_getdetachstate(const pthread_attr_t *attr, int *pdetachstate)
      pthread_attr_getdetachstate wrapper function.
      +
      void thread_key_delete(pthread_key_t key)
      pthread_key_delete wrapper function.
      +
      void thread_testcancel(void)
      pthread_testcancel wrapper function.
      +
      void condattr_init(pthread_condattr_t *attr)
      pthread_condattr_init wrapper function.
      +
      void thread_join(pthread_t t, void **result)
      pthread_join wrapper function.
      +
      void condattr_destroy(pthread_condattr_t *attr)
      pthread_condattr_destroy wrapper function.
      +
      void cond_signal(pthread_cond_t *pcvar)
      pthread_cond_signal wrapper function.
      +
      void thread_attr_init(pthread_attr_t *attr)
      pthread_attr_init wrapper function.
      +
      void mutex_init(pthread_mutex_t *pmtx, pthread_mutexattr_t *attr)
      pthread_mutex_init wrapper function.
      +
      void cond_wait(pthread_cond_t *pcvar, pthread_mutex_t *pmtx)
      pthread_cond_wait wrapper function.
      +
      void thread_detach(pthread_t thread)
      pthread_detach wrapper function.
      +
      void cond_broadcast(pthread_cond_t *pcvar)
      pthread_cond_broadcast wrapper function.
      +
      void mutexattr_init(pthread_mutexattr_t *attr)
      pthread_mutexattr_init wrapper function.
      +
      void mutexattr_gettype(const pthread_mutexattr_t *attr, int *kind)
      pthread_mutexattr_gettype wrapper function.
      +
      void thread_attr_destroy(pthread_attr_t *attr)
      pthread_attr_destroy wrapper function.
      +
      void * thread_getspecific(pthread_key_t key)
      pthread_getspecific wrapper function.
      +
      void mutex_destroy(pthread_mutex_t *pmtx)
      pthread_mutex_destroy wrapper function.
      +
      void thread_once(pthread_once_t *once_control, void(*init_routine)(void))
      pthread_once wrapper function.
      +
      void thread_create(pthread_t *t, pthread_attr_t *attr, void *(*thread_main)(void *), void *arg)
      pthread_create wrapper function.
      +
      void thread_setcanceltype(int type, int *oldtype)
      pthread_setcanceltype wrapper function.
      +
      void thread_sched_yield(void)
      sched_yield wrapper function.
      +
      void mutexattr_settype(pthread_mutexattr_t *attr, int type)
      pthread_mutexattr_settype wrapper function.
      +
      int thread_equal(pthread_t t1, pthread_t t2)
      pthread_equal wrapper function.
      +
      void thread_cancel(pthread_t thread)
      pthread_cancel wrapper function.
      +
      pthread_t thread_self()
      pthread_self wrapper function.
      +
      void thread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
      pthread_attr_setdetachstate wrapper function.
      +
      void mutex_lock(pthread_mutex_t *pmtx)
      pthread_mutex_lock wrapper function.
      +
      int cond_timedwait(pthread_cond_t *pcvar, pthread_mutex_t *pmtx, const struct timespec *abstime)
      pthread_cond_timedwait wrapper function.
      +
      void mutex_unlock(pthread_mutex_t *pmtx)
      pthread_mutex_unlock wrapper function.
      +
      int mutex_trylock(pthread_mutex_t *pmtx)
      pthread_mutex_trylock wrapper function.
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/utils_8h.html b/3ano/1semestre/so/practice-exam/src/doc/html/utils_8h.html new file mode 100644 index 0000000..acbf5ff --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/utils_8h.html @@ -0,0 +1,208 @@ + + + + + + + +C++ Library, mos@ua: utils.h File Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      + +
      +
      utils.h File Reference
      +
      +
      + +

      Useful common functions and macros. +More...

      +
      #include <stdio.h>
      +#include <string.h>
      +#include <errno.h>
      +#include "dbc.h"
      +
      +

      Go to the source code of this file.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Macros

      #define int2str(num)
       Converts an int value to a stack allocated string. More...
       
      #define int2nstr(num, len)
       Converts an int value to a stack allocated string. More...
       
      #define long2str(num)
       Converts an long value to a stack allocated string. More...
       
      #define long2nstr(num, len)
       Converts an long value to a stack allocated string. More...
       
      #define perc2str(percentage)
       Converts an int percentage to a stack allocated string. More...
       
      #define length_vargs_string_list(first)
       Determines the length of all strings passed as a NULL terminated variable list of arguments (vargs). More...
       
      #define not_null(pnt)
       Checks if address is not NULL, before its application. More...
       
      String concatenation in stack memory

      +
      #define concat_2str(str1, str2)
       Concatenates two strings in the stack memory (thus it cannot be implemented in a function). More...
       
      #define concat_3str(str1, str2, str3)
       Concatenates three strings in the stack memory (thus it cannot be implemented in a function). More...
       
      #define concat_4str(str1, str2, str3, str4)
       Concatenates four strings in the stack memory (thus it cannot be implemented in a function). More...
       
      #define concat_5str(str1, str2, str3, str4, str5)
       Concatenates five strings in the stack memory (thus it cannot be implemented in a function). More...
       
      #define concat_6str(str1, str2, str3, str4, str5, str6)
       Concatenates six strings in the stack memory (thus it cannot be implemented in a function). More...
       
      #define concat_7str(str1, str2, str3, str4, str5, str6, str7)
       Concatenates seven strings in the stack memory (thus it cannot be implemented in a function). More...
       
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Functions

      void * mem_alloc (int size)
       A replacement for malloc function. More...
       
      void mem_free (void *pnt)
       A replacement for free function. More...
       
      char * string_clone (char *str)
       Replicates a string. More...
       
      int string_num_lines (char *text)
       Number of lines of a string. More...
       
      int string_num_columns (char *text)
       Maximum number of columns of a string (not counting character ‘’\n'`). More...
       
      int string_count_char (char *text, char *ch)
       Counts the number of occurrences of an UTF8 character in a text. More...
       
      int string_starts_with (char *text, char *prefix)
       Tests if a string starts with a prefix. More...
       
      int string_ends_with (char *text, char *suffix)
       Tests if a string ends with a suffix. More...
       
      char * string_concat (char *res, int max_length, char *text,...)
       Concatenates a NULL terminated list of string arguments. More...
       
      int random_boolean (int trueProb)
       Generates a random boolean value. More...
       
      int random_int (int min, int max)
       Generates a random integer value within a given interval. More...
       
      char * random_string (char **list, int *used, int length)
       Returns a random string from a given string list. More...
       
      +void clear_console ()
       Clears the terminal.
       
      void move_cursor (int line, int column)
       Moves the cursor to a position in terminal. More...
       
      +void hide_cursor ()
       Hides the terminal cursor.
       
      +void show_cursor ()
       Shows the terminal cursor.
       
      int string_list_length (char **list)
       Number of elements of a NULL terminated list of strings. More...
       
      char ** string_list_clone (char **list)
       Replicates a NULL terminated list of strings. More...
       
      char ** string_list_free (char **list)
       Frees the memory allocated to a NULL terminated list of strings. More...
       
      char * int2nstring (char *res, int num, int len)
       Converts an int value to a string. More...
       
      char * percentage2string (char *res, int percentage)
       Converts an int percentage to a string. More...
       
      +

      Detailed Description

      +

      Useful common functions and macros.

      +
      +
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/utils_8h.js b/3ano/1semestre/so/practice-exam/src/doc/html/utils_8h.js new file mode 100644 index 0000000..accef9d --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/utils_8h.js @@ -0,0 +1,37 @@ +var utils_8h = +[ + [ "concat_2str", "group__utils.html#ga22347cbf977a0300726f06257edd79d6", null ], + [ "concat_3str", "group__utils.html#ga123e40006d54612c48c2660432dfeb23", null ], + [ "concat_4str", "group__utils.html#ga69037999e65cdb42d39988e0fec48af4", null ], + [ "concat_5str", "group__utils.html#ga580d1897bc7a8cef16d5a16a2373b876", null ], + [ "concat_6str", "group__utils.html#ga34f8c2fcee597a99c5f4c66f2119bca9", null ], + [ "concat_7str", "group__utils.html#ga01d1ea65eb6780d91705484dd46833bf", null ], + [ "int2str", "group__utils.html#ga3c545b669dff7d67e5ed3c58233ccf4b", null ], + [ "int2nstr", "group__utils.html#ga858ece77e79fb78d3db0f1851bf7fe09", null ], + [ "long2str", "group__utils.html#ga69373a612a7b4d264371f727217f9954", null ], + [ "long2nstr", "group__utils.html#ga50cea1f8154c7c7d2abd68f1ddb33086", null ], + [ "perc2str", "group__utils.html#ga59cd66180162d107cf86a51c21d7e6f5", null ], + [ "length_vargs_string_list", "group__utils.html#ga7bffda236a079c26302722c7d155f7a5", null ], + [ "not_null", "group__utils.html#gadfa0375f8178c737deae23ffa8d152f4", null ], + [ "mem_alloc", "group__utils.html#gadce4d1c428f979bf1cf8e1582d2f4052", null ], + [ "mem_free", "group__utils.html#gabe60e8350f3e3b07ed5002ee3449a6ae", null ], + [ "string_clone", "group__utils.html#ga825354891d287cc86d2b4ed1b600175a", null ], + [ "string_num_lines", "group__utils.html#ga15630ddb64e977c8243892556feedfd8", null ], + [ "string_num_columns", "group__utils.html#ga0ca31b2a579b6ef7c75c41324ed5367c", null ], + [ "string_count_char", "group__utils.html#gad643e0fcac9e59c1a171c460633e8637", null ], + [ "string_starts_with", "group__utils.html#ga3ec2b60d1636397119c5e0c21987f791", null ], + [ "string_ends_with", "group__utils.html#ga1c5ba308f71c323fbbd7eb9bb34285d4", null ], + [ "string_concat", "group__utils.html#gaa23a827164f7039b9770379cbf008905", null ], + [ "random_boolean", "group__utils.html#gabe3e28fe49daaf3530e203c4aed1d15f", null ], + [ "random_int", "group__utils.html#gad7954e6a1b9ea073c7bc894dc5af85a9", null ], + [ "random_string", "group__utils.html#gaa820c93c2f719401b4b1ca54f6ea5c75", null ], + [ "clear_console", "group__utils.html#ga3cffe15b7e5d10a108f1734a9640a2c7", null ], + [ "move_cursor", "group__utils.html#gad3d324aed0ec686314cb0f68dfde9853", null ], + [ "hide_cursor", "group__utils.html#ga42702791e6da9510e4f44f33d2dad8f1", null ], + [ "show_cursor", "group__utils.html#ga1bdd62a6bef7cfd6522dc1412e162559", null ], + [ "string_list_length", "group__utils.html#gab8050db5b87bfdee91ee92e67b063478", null ], + [ "string_list_clone", "group__utils.html#ga41163cf3a95e702f12506cd54ba3c70c", null ], + [ "string_list_free", "group__utils.html#gaacf77b3345bbca43767b08ec0583fe3c", null ], + [ "int2nstring", "group__utils.html#ga824373ca8e0b2fdfe3f5c4805cf2ab7e", null ], + [ "percentage2string", "group__utils.html#gacf6edf10cb84412b6bfb431ef87b56d6", null ] +]; \ No newline at end of file diff --git a/3ano/1semestre/so/practice-exam/src/doc/html/utils_8h_source.html b/3ano/1semestre/so/practice-exam/src/doc/html/utils_8h_source.html new file mode 100644 index 0000000..822c7d0 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/doc/html/utils_8h_source.html @@ -0,0 +1,330 @@ + + + + + + + +C++ Library, mos@ua: utils.h Source File + + + + + + + + + + +
      +
      + + + + + + +
      +
      C++ Library, mos@ua +  0.9 +
      +
      cpplib-mos
      +
      +
      + + + + + + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      utils.h
      +
      +
      +Go to the documentation of this file.
      1 
      +
      15 #ifndef UTILS_H
      +
      16 #define UTILS_H
      +
      17 
      +
      18 #include <stdio.h>
      +
      19 #include <string.h>
      +
      20 #include <errno.h>
      +
      21 #include "dbc.h"
      +
      22 
      +
      36 #define concat_2str(str1,str2) \
      +
      37  ({ \
      +
      38  char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
      +
      39  char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
      +
      40  char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+1); \
      +
      41  strcpy(__res__, s1); \
      +
      42  strcat(__res__, s2); \
      +
      43  __res__; \
      +
      44  })
      +
      45 
      +
      57 #define concat_3str(str1,str2,str3) \
      +
      58  ({ \
      +
      59  char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
      +
      60  char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
      +
      61  char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
      +
      62  char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+1); \
      +
      63  strcpy(__res__, s1); \
      +
      64  strcat(__res__, s2); \
      +
      65  strcat(__res__, s3); \
      +
      66  __res__; \
      +
      67  })
      +
      68 
      +
      81 #define concat_4str(str1,str2,str3,str4) \
      +
      82  ({ \
      +
      83  char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
      +
      84  char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
      +
      85  char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
      +
      86  char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \
      +
      87  char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+1); \
      +
      88  strcpy(__res__, s1); \
      +
      89  strcat(__res__, s2); \
      +
      90  strcat(__res__, s3); \
      +
      91  strcat(__res__, s4); \
      +
      92  __res__; \
      +
      93  })
      +
      94 
      +
      108 #define concat_5str(str1,str2,str3,str4,str5) \
      +
      109  ({ \
      +
      110  char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
      +
      111  char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
      +
      112  char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
      +
      113  char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \
      +
      114  char* s5 = (str5) == NULL ? (char*)"" : (char*)(str5); \
      +
      115  char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+1); \
      +
      116  strcpy(__res__, s1); \
      +
      117  strcat(__res__, s2); \
      +
      118  strcat(__res__, s3); \
      +
      119  strcat(__res__, s4); \
      +
      120  strcat(__res__, s5); \
      +
      121  __res__; \
      +
      122  })
      +
      123 
      +
      138 #define concat_6str(str1,str2,str3,str4,str5,str6) \
      +
      139  ({ \
      +
      140  char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
      +
      141  char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
      +
      142  char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
      +
      143  char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \
      +
      144  char* s5 = (str5) == NULL ? (char*)"" : (char*)(str5); \
      +
      145  char* s6 = (str6) == NULL ? (char*)"" : (char*)(str6); \
      +
      146  char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+strlen(s6)+1); \
      +
      147  strcpy(__res__, s1); \
      +
      148  strcat(__res__, s2); \
      +
      149  strcat(__res__, s3); \
      +
      150  strcat(__res__, s4); \
      +
      151  strcat(__res__, s5); \
      +
      152  strcat(__res__, s6); \
      +
      153  __res__; \
      +
      154  })
      +
      155 
      +
      171 #define concat_7str(str1,str2,str3,str4,str5,str6,str7) \
      +
      172  ({ \
      +
      173  char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
      +
      174  char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
      +
      175  char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
      +
      176  char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \
      +
      177  char* s5 = (str5) == NULL ? (char*)"" : (char*)(str5); \
      +
      178  char* s6 = (str6) == NULL ? (char*)"" : (char*)(str6); \
      +
      179  char* s7 = (str7) == NULL ? (char*)"" : (char*)(str7); \
      +
      180  char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+strlen(s6)+strlen(s7)+1); \
      +
      181  strcpy(__res__, s1); \
      +
      182  strcat(__res__, s2); \
      +
      183  strcat(__res__, s3); \
      +
      184  strcat(__res__, s4); \
      +
      185  strcat(__res__, s5); \
      +
      186  strcat(__res__, s6); \
      +
      187  strcat(__res__, s7); \
      +
      188  __res__; \
      +
      189  })
      +
      190 
      +
      199 #define int2str(num) \
      +
      200  ({ \
      +
      201  char* __res__ = (char*)alloca(numDigits((int)num)+1); \
      +
      202  sprintf(__res__, "%d", (int)num); \
      +
      203  __res__; \
      +
      204  })
      +
      205 
      +
      220 #define int2nstr(num, len) \
      +
      221  ({ \
      +
      222  require (len > 0, concat_3str("invalid length value (", int2str(len), ")")); \
      +
      223  int d = numDigits((int)num); \
      +
      224  if (len > d) \
      +
      225  d = len; \
      +
      226  char* __res__ = (char*)alloca(d+1); \
      +
      227  sprintf(__res__, "%0*d", d, (int)num); \
      +
      228  __res__; \
      +
      229  })
      +
      230 
      +
      238 #define long2str(num) \
      +
      239  ({ \
      +
      240  char* __res__ = (char*)alloca(numDigits((long)num)+1); \
      +
      241  sprintf(__res__, "%ld", (long)num); \
      +
      242  __res__; \
      +
      243  })
      +
      244 
      +
      259 #define long2nstr(num, len) \
      +
      260  ({ \
      +
      261  require (len > 0, concat_3str("invalid length value (", int2str(len), ")")); \
      +
      262  int d = numDigits((int)num); \
      +
      263  if (len > d) \
      +
      264  d = len; \
      +
      265  char* __res__ = (char*)alloca(d+1); \
      +
      266  sprintf(__res__, "%0*ld", d, (long)num); \
      +
      267  __res__; \
      +
      268  })
      +
      269 
      +
      281 #define perc2str(percentage) \
      +
      282  ({ \
      +
      283  require (percentage >= 0 && percentage <= 100, concat_3str("invalid percentage value (", int2str(percentage), ")")); \
      +
      284  char* __res__ = (char*)alloca(4+1); \
      +
      285  sprintf(__res__, "%3d%%", (int)percentage); \
      +
      286  __res__; \
      +
      287  })
      +
      288 
      +
      296 #define length_vargs_string_list(first) \
      +
      297  ({ \
      +
      298  int __res__ = 0; \
      +
      299  va_list ap; \
      +
      300  va_start(ap, first); \
      +
      301  char* t = first; \
      +
      302  while (t != NULL) \
      +
      303  { \
      +
      304  __res__ += strlen(t); \
      +
      305  t = va_arg(ap, char*); \
      +
      306  } \
      +
      307  va_end(ap); \
      +
      308  __res__; \
      +
      309  })
      +
      310 
      +
      311 #if defined __cplusplus && defined EXCEPTION_POLICY
      +
      312 #define not_null(pnt) \
      +
      313  ({ \
      +
      314  if ((pnt) == NULL) \
      +
      315  throw string_concat(NULL, 0, (char*)"Null pointer error", (char*)", pointer: \"", #pnt, (char*)"\", function: \"", __FUNCTION__, (char*)"\":", int2str(__LINE__), (char*)", file: \"", __FILE__, (char*)"\"\n", NULL); \
      +
      316  pnt; \
      +
      317  })
      +
      318 #else
      +
      319 
      +
      336 #define not_null(pnt) \
      +
      337  ({ \
      +
      338  if ((pnt) == NULL) \
      +
      339  { \
      +
      340  fprintf (stderr, "Null pointer error, pointer: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \
      +
      341  #pnt, __FUNCTION__, __LINE__ , __FILE__); \
      +
      342  *((int*)0) = 0; \
      +
      343  abort (); \
      +
      344  } \
      +
      345  pnt; \
      +
      346  })
      +
      347 #endif
      +
      348 
      +
      367 void* mem_alloc(int size);
      +
      368 
      +
      378 void mem_free(void* pnt);
      +
      379 
      +
      393 char* string_clone(char* str);
      +
      394 
      +
      406 int string_num_lines(char* text);
      +
      407 
      +
      419 int string_num_columns(char* text);
      +
      420 
      +
      434 int string_count_char(char* text, char* ch);
      +
      435 
      +
      449 int string_starts_with(char* text, char* prefix);
      +
      450 
      +
      464 int string_ends_with(char* text, char* suffix);
      +
      465 
      +
      487 char* string_concat(char* res, int max_length, char* text, ...);
      +
      488 
      +
      504 int random_boolean(int trueProb);
      +
      505 
      +
      521 int random_int(int min, int max);
      +
      522 
      +
      541 char* random_string(char** list, int* used, int length);
      +
      542 
      +
      546 void clear_console();
      +
      547 
      +
      558 void move_cursor(int line,int column);
      +
      559 
      +
      563 void hide_cursor();
      +
      564 
      +
      568 void show_cursor();
      +
      569 
      +
      581 int string_list_length(char** list);
      +
      582 
      +
      596 char** string_list_clone(char** list);
      +
      597 
      +
      611 char** string_list_free(char** list);
      +
      612 
      +
      613 int numDigits(int num);
      +
      614 
      +
      632 char* int2nstring(char* res, int num, int len);
      +
      633 
      +
      649 char* percentage2string(char* res, int percentage);
      +
      650 
      +
      651 #endif
      +
      652 
      +
      653 /* ************************************************** */
      +
      657 /* ************************************************** */
      +
      658 
      +
      +
      +
      int random_int(int min, int max)
      Generates a random integer value within a given interval.
      +
      int string_list_length(char **list)
      Number of elements of a NULL terminated list of strings.
      +
      char * string_clone(char *str)
      Replicates a string.
      +
      Design-by-Contract module.
      +
      void mem_free(void *pnt)
      A replacement for free function.
      +
      int string_ends_with(char *text, char *suffix)
      Tests if a string ends with a suffix.
      +
      char ** string_list_free(char **list)
      Frees the memory allocated to a NULL terminated list of strings.
      +
      int string_count_char(char *text, char *ch)
      Counts the number of occurrences of an UTF8 character in a text.
      +
      void show_cursor()
      Shows the terminal cursor.
      +
      char * percentage2string(char *res, int percentage)
      Converts an int percentage to a string.
      +
      int random_boolean(int trueProb)
      Generates a random boolean value.
      +
      int string_num_lines(char *text)
      Number of lines of a string.
      +
      void clear_console()
      Clears the terminal.
      +
      int string_starts_with(char *text, char *prefix)
      Tests if a string starts with a prefix.
      +
      void * mem_alloc(int size)
      A replacement for malloc function.
      +
      void move_cursor(int line, int column)
      Moves the cursor to a position in terminal.
      +
      char * random_string(char **list, int *used, int length)
      Returns a random string from a given string list.
      +
      char * int2nstring(char *res, int num, int len)
      Converts an int value to a string.
      +
      char * string_concat(char *res, int max_length, char *text,...)
      Concatenates a NULL terminated list of string arguments.
      +
      char ** string_list_clone(char **list)
      Replicates a NULL terminated list of strings.
      +
      int string_num_columns(char *text)
      Maximum number of columns of a string (not counting character ‘’\n'`).
      +
      void hide_cursor()
      Hides the terminal cursor.
      + + + + diff --git a/3ano/1semestre/so/practice-exam/src/include/dbc.h b/3ano/1semestre/so/practice-exam/src/include/dbc.h new file mode 100644 index 0000000..83bfcc9 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/include/dbc.h @@ -0,0 +1,186 @@ +/** + * \defgroup DbC DbC + * \ingroup concurrency-library + * \brief Design-by-Contract module. + * + * \details This module gives a better support for DbC in C++. + * + * When compared with `assert.h` this module offers the following functionalities: + * - separates different assertion types (preconditions, postconditions, invariants, and others); + * - augments assert with error message strings; + * - implements two error handling policies: + * -# EXIT_POLICY (default): describes the failed assertion in `stderr` (with the identification + * and the precise location of the assertion), generates a segmentation fault + * (enabling a stack trace within a debugger like `gdb`), and exits program execution; + * -# EXCEPTION_POLICY: throws a `char*` exception with the description of the failed assertion. + * + * Debug settings: + * - As happens with `assert.h`, this module accepts `NDEBUG` macro definition to disable all + * assertion run-time verification. + * - Also, each assertion type verification can be disabled with macros: `NDEBUG_CHECKS`, + * `NDEBUG_PRECONDITIONS`, `NDEBUG_POSTCONDITIONS`, and `NDEBUG_INVARIANTS`. + * - A special (high priority) macro named `DEBUG_ONLY_PRECONDITIONS` ensures that only precondition + * debugging remains active (regardless of other debug definitions). + * + * \author Miguel Oliveira e Silva, 2018 + * @{ + **/ + +/*! + * \file + * \brief Design-by-Contract module. + */ + +#ifndef DBC_H +#define DBC_H + +#include +#include +#include +#include "utils.h" + +#ifdef NDEBUG +#define NDEBUG_CHECKS +#define NDEBUG_PRECONDITIONS +#define NDEBUG_POSTCONDITIONS +#define NDEBUG_INVARIANTS +#endif + +#ifdef DEBUG_ONLY_PRECONDITIONS +#ifdef NDEBUG_PRECONDITIONS +#undef NDEBUG_PRECONDITIONS +#endif +#ifndef NDEBUG_CHECKS +#define NDEBUG_CHECKS +#endif +#ifndef NDEBUG_POSTCONDITIONS +#define NDEBUG_POSTCONDITIONS +#endif +#ifndef NDEBUG_INVARIANTS +#define NDEBUG_INVARIANTS +#endif +#endif + +// check: +#ifdef NDEBUG_CHECKS +#define check(condition, message) +#else +#if defined __cplusplus && defined EXCEPTION_POLICY +#define check(condition, message) \ + if (!(condition)) \ + throw string_concat(NULL, 0, (char*)"Assertion fail", message[0] ? (char*)": " : (char*)"", message, (char*)", assertion: \"", #condition, (char*)"\", function: \"", __FUNCTION__, (char*)"\":", int2str(__LINE__), (char*)", file: \"", __FILE__, (char*)"\"\n", NULL) +#else // EXIT_POLICY (default) +/** + * \brief Checks the verification of an general algorithm assertion. + * + * \details This assertion verification can be disabled at compile time by defining the macro `NDEBUG_CHECKS`. + * + * \param [in] condition expression to assert its truthness + * \param [in] message text to be presented with error information when the assertion fails + */ +#define check(condition, message) \ + if (!(condition)) \ + do { \ + fprintf (stderr, "Assertion fail%s%s, assertion: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \ + message[0] ? ": " : "", message, #condition, __FUNCTION__, __LINE__ , __FILE__); \ + *((int*)0) = 0; \ + abort (); \ + } while (0) +#endif +#endif + + +// precondition: +#ifdef NDEBUG_PRECONDITIONS +#define require(condition, message) +#else +#if defined __cplusplus && defined EXCEPTION_POLICY +#define require(condition, message) \ + if (!(condition)) \ + throw string_concat(NULL, 0, (char*)"Precondition fail", message[0] ? (char*)": " : (char*)"", message, (char*)", assertion: \"", #condition, (char*)"\", function: \"", __FUNCTION__, (char*)"\":", int2str(__LINE__), (char*)", file: \"", __FILE__, (char*)"\"\n", NULL) +#else // EXIT_POLICY (default) +/** + * \brief Checks the verification of a precondition. + * + * \details This assertion verification can be disabled at compile time by defining the macro `NDEBUG_PRECONDITIONS`. + * + * \param [in] condition expression to assert its truthness + * \param [in] message text to be presented with error information when the assertion fails + */ +#define require(condition, message) \ + if (!(condition)) \ + do { \ + fprintf (stderr, "Precondition fail%s%s, assertion: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \ + message[0] ? ": " : "", message, #condition, __FUNCTION__, __LINE__ , __FILE__); \ + *((int*)0) = 0; \ + abort (); \ + } while (0) +#endif +#endif + + +// postcondition: +#ifdef NDEBUG_POSTCONDITIONS +#define ensure(condition, message) +#else +#if defined __cplusplus && defined EXCEPTION_POLICY +#define ensure(condition, message) \ + if (!(condition)) \ + throw string_concat(NULL, 0, (char*)"Postcondition fail", message[0] ? (char*)": " : (char*)"", message, (char*)", assertion: \"", #condition, (char*)"\", function: \"", __FUNCTION__, (char*)"\":", int2str(__LINE__), (char*)", file: \"", __FILE__, (char*)"\"\n", NULL) +#else // EXIT_POLICY (default) +/** + * \brief Checks the verification of a postcondition. + * + * \details This assertion verification can be disabled at compile time by defining the macro `NDEBUG_POSTCONDITIONS`. + * + * \param [in] condition expression to assert its truthness + * \param [in] message text to be presented with error information when the assertion fails + */ +#define ensure(condition, message) \ + if (!(condition)) \ + do { \ + fprintf (stderr, "Postcondition fail%s%s, assertion: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \ + message[0] ? ": " : "", message, #condition, __FUNCTION__, __LINE__ , __FILE__); \ + *((int*)0) = 0; \ + abort (); \ + } while (0) +#endif +#endif + +// +// invariant: +#ifdef NDEBUG_INVARIANTS +#define invariant(condition, message) +#else +#if defined __cplusplus && defined EXCEPTION_POLICY +#define invariant(condition, message) \ + if (!(condition)) \ + throw string_concat(NULL, 0, (char*)"Invariant fail", message[0] ? (char*)": " : (char*)"", message, (char*)", assertion: \"", #condition, (char*)"\", function: \"", __FUNCTION__, (char*)"\":", int2str(__LINE__), (char*)", file: \"", __FILE__, (char*)"\"\n", NULL) +#else // EXIT_POLICY (default) +/** + * \brief Checks the verification of an invariant. + * + * \details This assertion verification can be disabled at compile time by defining the macro `NDEBUG_INVARIANTS`. + * + * \param [in] condition expression to assert its truthness + * \param [in] message text to be presented with error information when the assertion fails + */ +#define invariant(condition, message) \ + if (!(condition)) \ + do { \ + fprintf (stderr, "Invariant fail%s%s, assertion: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \ + message[0] ? ": " : "", message, #condition, __FUNCTION__, __LINE__ , __FILE__); \ + *((int*)0) = 0; \ + abort (); \ + } while (0) +#endif +#endif + +#endif + +/* ************************************************** */ +/** + * @} close group DbC + **/ +/* ************************************************** */ + diff --git a/3ano/1semestre/so/practice-exam/src/include/process.h b/3ano/1semestre/so/practice-exam/src/include/process.h new file mode 100644 index 0000000..9f236ef --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/include/process.h @@ -0,0 +1,531 @@ +/** + * \defgroup process process + * \ingroup concurrency-library + * + * \brief \ref process "Process", \ref sysV "System-V", and \ref posix_sem "POSIX libraries" wrapper module. + * + * \details This module removes defensive programming approach of native libraries. + * + * All implemented functions, have exactly the same arguments and/or result of the original function, + * with the exception of returning an error indication. + * + * Errors are handled by the implementation of two policies: + * -# EXIT_POLICY (default): describes the failed call in `stderr` (with the identification + * of the errno error, and the precise location the call), generates a segmentation fault + * (enabling a stack trace within a debugger like `gdb`), and exits program execution; + * -# EXCEPTION_POLICY: throws a `int` exception with the (errno) status error returned by the original function. + * + *

      System V group of IPC mechanisms + * + * @anchor sysV + * + * There are three resources for IPC: \ref shm "shared memory", \ref sem "semaphores", and \ref msg "message queues". + * + * Common to all, is resource handling through a non-negative integer identifier. + * After proper creation and initialization, different processes can establish communication + * using the same integer identifier. + * + * A key (`key_t`) is used to establish this common identifier. + * There are three possibilities to define a key: + * + * 1. `IPC_PRIVATE`: In this case an alternative channel to communicate the identifier + * between processes is necessary (parent/child fork, file system, ...). + * + * 2. A fixed predetermined key number (may collide with other existing keys). + * + * 3. `ftok` function to generate a key from a path and a byte integer. + * + * Usage: + * + * - create new identifier: `msgget`/`semget`/`shmget` with a key and `IPC_CREAT` and `IPC_EXCL` flags + * - get existing identifier: `msgget`/`semget`/`shmget` with a key and other arguments as zero + * + * \author Miguel Oliveira e Silva, 2017-2018 + * @{ + **/ + +/*! + * \file + * + * \brief \ref process "Process", \ref sysV "System-V", and \ref posix_sem "POSIX libraries" wrapper module. + * \remarks Removes defensive programming from native libraries + **/ + +#ifndef PROCESS_H +#define PROCESS_H + +#include +#include +#include +#include +#include +#include +#include + +//#define EXCEPTION_POLICY +//#define EXIT_POLICY // DEFAULT + + +/** @name Process handling + * @anchor process @{ + */ + +/** + * \brief `fork` wrapper function. + * + * \details Other documentation in @verbatim man 2 fork @endverbatim + * + * @see https://man.cx/fork(2) + */ +pid_t pfork(void); + +/** + * \brief `wait` wrapper function. + * + * \details Other documentation in @verbatim man 2 wait @endverbatim + * + * @see https://man.cx/wait(2) + */ +pid_t pwait(int *status); + +/** + * \brief `waitpid` wrapper function. + * + * \details Other documentation in @verbatim man 2 waitpid @endverbatim + * + * @see https://man.cx/waitpid(2) + */ +pid_t pwaitpid(pid_t pid, int *status, int options); + +/** + * \brief `kill` wrapper function. + * + * \details Other documentation in @verbatim man 2 kill @endverbatim + * + * @see https://man.cx/kill(2) + */ +void pkill(pid_t pid, int sig); + +/** + * \brief `execl` wrapper function. + * + * \details Other documentation in @verbatim man 3 execl @endverbatim + * + * @see https://man.cx/execl(3) + */ +void pexecl(const char *pathname, const char *arg, ... /* (char *) NULL */); + +/** + * \brief `sigaction` wrapper function. + * + * \details Other documentation in @verbatim man 2 sigaction @endverbatim + * + * @see https://man.cx/sigaction(2) + */ +void psigaction(int signum, const struct sigaction *act, struct sigaction *oldact); + +/** @} */ + + +/** @name System V - shared memory + * @anchor shm + * + * \par Example + * @code + #include // #include + ... + int shmid; + // creation: + shmid = pshmget(key, size, 0600 | IPC_CREAT | IPC_EXCL); + // or, use existing: + shmid = pshmget(key, 0, 0); + ... + // attach shm to pointer address: + void* p = pshmat(shmid, NULL, 0); + ... + // detach shm from pointer address: + pshmdt(p); + ... + // destroy shm: + pshmctl(shmid, IPC_RMID, NULL); + @endcode + * + * @{ + */ + +/** + * \brief `shmget` wrapper function. + * + *

      Precondition:
      + *
      (size > 0) || !(shmflg & IPC_CREAT)
      + *
      + * + * \details Other documentation in @verbatim man 2 shmget @endverbatim + * + * @see https://man.cx/shmget(2) + */ +int pshmget(key_t key, size_t size, int shmflg); + +/** + * \brief `shmctl` wrapper function. + * + * \details Other documentation in @verbatim man 2 shmctl @endverbatim + * + * @see https://man.cx/shmctl(2) + */ +int pshmctl(int shmid, int cmd, struct shmid_ds *buf); + +/** + * \brief `shmat` wrapper function. + * + * \details Other documentation in @verbatim man 2 shmat @endverbatim + * + * @see https://man.cx/shmat(2) + */ +void *pshmat(int shmid, const void *shmaddr, int shmflg); + +/** + * \brief `shmdt` wrapper function. + * + * \details Other documentation in @verbatim man 2 shmdt @endverbatim + * + * @see https://man.cx/shmdt(2) + */ +void pshmdt(const void *shmaddr); + +/** @} */ + + +/** @name System V - semaphores + * @anchor sem + * + * \par Example + * @code + #include // #include + ... + int semid; + // creation: + semid = psemget(key, 1, 0600 | IPC_CREAT | IPC_EXCL); // 1 semaphore! + // or, use existing: + semid = psemget(key, 0, 0); + ... + // decrement: + struct sembuf down = {0, -1, 0}; + psemop(semid, &down, 1); + // or, simply use provided function: + psem_down(semid, 0); // NOTE: there is no sem_down in default library! + ... + // increment: + struct sembuf up = {0, 1, 0}; + psemop(semid, &up, 1); + // or, simply use provided function: + psem_up(semid, 0); // NOTE: there is no sem_up in default library! + ... + // destroy sem 0: + psemctl(semid, 0, IPC_RMID, NULL); + @endcode + * + * @{ + */ + +/** + * \brief `semget` wrapper function. + * + *
      Precondition:
      + *
      nsems > 0
      + *
      + * + * \details Other documentation in @verbatim man 2 semget @endverbatim + * + * @see https://man.cx/semget(2) + */ +int psemget(key_t key, int nsems, int semflg); + +/** + * \brief `semctl` wrapper function. + * + * \details Other documentation in @verbatim man 2 semctl @endverbatim + * + * @see https://man.cx/semctl(2) + */ +int psemctl(int semid, int semnum, int cmd); +int psemctl(int semid, int semnum, int cmd, void *u); + +/** + * \brief `semop` wrapper function. + * + * \details Other documentation in @verbatim man 2 semop @endverbatim + * + * @see https://man.cx/semop(2) + */ +void psemop(int semid, struct sembuf *sops, size_t nsops); + +/** + * \brief Increment a semaphore (uses psemop()). + */ +void psem_up(int semid, short unsigned int index); + +/** + * \brief Decrements a semaphore (uses psemop()). + */ +void psem_down(int semid, short unsigned int index); + +/** + * \brief Decrements atomically two semaphores in a System V semaphore array (uses psemop()). + */ +void psem_down2(int semid, short unsigned int index1, unsigned int index2); + +/** @} */ + + +/** @name System V - message queues + * @anchor msg + * + * \par Example + * @code + #include // #include + ... + typedef struct Item + { + ... + } Item; + typedef struct Message + { + long type; + Item item; + } Message; + ... + int msgid; + // creation: + msgid = pmsgget(key, 0600 | IPC_CREAT | IPC_EXCL); + // or, use existing: + msgid = pmsgget(key, 0); + ... + Message msg; + // send msg: + msg = ...; + pmsgsnd(msgid, &msg, sizeof(Item), 0); + ... + // receive msg: + pmsgrcv(msgid, &msg, sizeof(Item), type, 0); + ... + // destroy msg: + pmsgctl(msgid, IPC_RMID, NULL); + @endcode + * + * @{ + */ + +/** + * \brief `msgget` wrapper function. + * + * \details Other documentation in @verbatim man 2 msgget @endverbatim + * + * @see https://man.cx/msgget(2) + */ +int pmsgget(key_t key, int msgflg); + +/** + * \brief `msgctl` wrapper function. + * + * \details Other documentation in @verbatim man 2 msgctl @endverbatim + * + * @see https://man.cx/msgctl(2) + */ +int pmsgctl(int msqid, int cmd, struct msqid_ds *buf); + +/** + * \brief `msgsnd` wrapper function. + * + * \details Other documentation in @verbatim man 2 msgsnd @endverbatim + * + * @see https://man.cx/msgsnd(2) + */ +void pmsgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); + +/** + * \brief `msgrcv` wrapper function. + * + * \details Other documentation in @verbatim man 2 msgrcv @endverbatim + * + * @see https://man.cx/msgrcv(2) + */ +size_t pmsgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); + +/** @} */ + + +/** @name POSIX semaphores + * @anchor posix_sem @{ + */ + +// named: +/** + * \brief `sem_open` wrapper function. + * + * \details Other documentation in @verbatim man 3 sem_open @endverbatim + * + * @see https://man.cx/sem_open(3) + */ +sem_t *psem_open(const char *name, int oflag); +sem_t *psem_open(const char *name, int oflag, mode_t mode, unsigned int value); + +/** + * \brief `sem_close` wrapper function. + * + *
      Precondition:
      + *
      sem != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 sem_close @endverbatim + * + * @see https://man.cx/sem_close(3) + */ +void psem_close(sem_t *sem); + +/** + * \brief `sem_unlink` wrapper function. + * + * \details Other documentation in @verbatim man 3 sem_unlink @endverbatim + * + * @see https://man.cx/sem_unlink(3) + */ +void psem_unlink(const char *name); + +// unnamed: +/** + * \brief `sem_init` wrapper function. + * + *
      Precondition:
      + *
      sem != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 sem_init @endverbatim + * + * @see https://man.cx/sem_init(3) + */ +void psem_init(sem_t *sem, int pshared, unsigned int value); + +/** + * \brief `sem_destroy` wrapper function. + * + *
      Precondition:
      + *
      sem != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 sem_destroy @endverbatim + * + * @see https://man.cx/sem_destroy(3) + */ +void psem_destroy(sem_t *sem); + +// named and unnamed: +/** + * \brief `sem_wait` wrapper function. + * + *
      Precondition:
      + *
      sem != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 sem_wait @endverbatim + * + * @see https://man.cx/sem_wait(3) + */ +void psem_wait(sem_t *sem); + +/** + * \brief `sem_trywait` wrapper function. + * + *
      Precondition:
      + *
      sem != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 sem_trywait @endverbatim + * + * @see https://man.cx/sem_trywait(3) + * + * \return true (`!=0`) on success, false (`0`) if semaphore is zero + */ +int psem_trywait(sem_t *sem); + +/** + * \brief `sem_timedwait` wrapper function. + * + *
      Precondition:
      + *
      sem != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 sem_timedwait @endverbatim + * + * @see https://man.cx/sem_timedwait(3) + * + * \return true (`!=0`) on success, false (`0`) if timeout has expired before being able to decrement the semaphore + */ +int psem_timedwait(sem_t *sem, const struct timespec *abs_timeout); + +/** + * \brief `sem_post` wrapper function. + * + *
      Precondition:
      + *
      sem != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 sem_post @endverbatim + * + * @see https://man.cx/sem_post(3) + */ +void psem_post(sem_t *sem); + +/** @} */ + +/** @name UNIX pipes + * @anchor pipes @{ + */ + +/** + * \brief `pipe` wrapper function. + * + * \details Other documentation in @verbatim man 3 pipe @endverbatim + * + * @see https://man.cx/pipe + */ +void ppipe(int pipefd[2]); + +/** + * \brief `popen` wrapper function. + * + *
      Precondition:
      + *
      command != NULL
      + *
      type != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 popen @endverbatim + * + * @see https://man.cx/popen + */ +FILE *ppopen(const char *command, const char *type); + +/** + * \brief `pclose` wrapper function. + * + *
      Precondition:
      + *
      stream != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pclose @endverbatim + * + * @see https://man.cx/pclose + */ +void ppclose(FILE *stream); + +/** @} */ + + +#endif + +/* ************************************************** */ +/** + * @} close group process + **/ +/* ************************************************** */ + diff --git a/3ano/1semestre/so/practice-exam/src/include/thread.h b/3ano/1semestre/so/practice-exam/src/include/thread.h new file mode 100644 index 0000000..64ea295 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/include/thread.h @@ -0,0 +1,665 @@ +/** + * \defgroup thread thread + * \ingroup concurrency-library + * \brief POSIX threads library wrapper module. + * + * \details This module removes defensive programming approach of native POSIX threads library. + * + * All implemented functions, have exactly the same arguments and/or result of the original function, + * with the exception of returning an error indication. + * + * Errors are handled by the implementation of two policies: + * -# EXIT_POLICY (default): describes the failed call in `stderr` (with the identification + * of the errno error, and the precise location the call), generates a segmentation fault + * (enabling a stack trace within a debugger like `gdb`), and exits program execution; + * -# EXCEPTION_POLICY: throws a `int` exception with the (errno) status error returned by the original function. + * + * \author Miguel Oliveira e Silva, 2017-2018 + * + * @{ + **/ +/*! + * \file + * + * \brief POSIX threads library wrapper module. + * \remarks Removes defensive programming from native libraries + **/ + +#ifndef THREAD_H +#define THREAD_H + +#include + +//#define EXCEPTION_POLICY +//#define EXIT_POLICY // DEFAULT + +/** @name Thread handling + * + * @details + * + * Variable type: `pthread_t` + * + * @anchor thread @{ + */ + +/** + * \brief `pthread_equal` wrapper function. + * + * \details Other documentation in @verbatim man 3 pthread_equal @endverbatim + * + * @see https://man.cx/pthread_equal(3) + */ +int thread_equal(pthread_t t1, pthread_t t2); + +/** + * \brief `pthread_create` wrapper function. + * + *
      Precondition:
      + *
      t != NULL

      + *
      thread_main != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_create @endverbatim + * + * @see https://man.cx/pthread_create(3) + */ +void thread_create(pthread_t* t, pthread_attr_t* attr, void *(*thread_main)(void*), void* arg); + +/** + * \brief `pthread_self` wrapper function. + * + * \details Other documentation in @verbatim man 3 pthread_self @endverbatim + * + * @see https://man.cx/pthread_self(3) + */ +pthread_t thread_self(); + +/** + * \brief `sched_yield` wrapper function. + * + * \details Other documentation in @verbatim man 3 sched_yield @endverbatim + * + * @see https://man.cx/sched_yield(3) + */ +void thread_sched_yield(void); + +/** + * \brief `pthread_exit` wrapper function. + * + * \details Other documentation in @verbatim man 3 pthread_exit @endverbatim + * + * @see https://man.cx/pthread_exit(3) + */ +void thread_exit(void *retval); + +/** + * \brief `pthread_detach` wrapper function. + * + * \details Other documentation in @verbatim man 3 pthread_detach @endverbatim + * + * @see https://man.cx/pthread_detach(3) + */ +void thread_detach(pthread_t thread); + +/** + * \brief `pthread_join` wrapper function. + * + * \details Other documentation in @verbatim man 3 pthread_join @endverbatim + * + * @see https://man.cx/pthread_join(3) + */ +void thread_join(pthread_t t, void** result); + +/** @} */ + + +/** @name Mutexes + * + * @details + * + * Variable type: `pthread_mutex_t` + * + * Initialization of mutexes can be static or dynamic. + * + * In static initialization the following initialization macros are suggested: + * - `PTHREAD_MUTEX_INITIALIZER` - standard initializer + * - `PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP` - initializer that ensures error checking + * - `PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP` - for recursive mutexes (note that recursive mutexes should be avoid) + * + * Dynamic initialization is done by mutex_init() and mutex_destroy(). + * + * @anchor mutex @{ + */ + +/** + * \brief `pthread_mutex_init` wrapper function. + * + *
      Precondition:
      + *
      pmtx != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_mutex_init @endverbatim + * + * @see https://man.cx/pthread_mutex_init(3) + */ +void mutex_init(pthread_mutex_t* pmtx, pthread_mutexattr_t* attr); + +/** + * \brief `pthread_mutex_destroy` wrapper function. + * + *
      Precondition:
      + *
      pmtx != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_mutex_destroy @endverbatim + * + * @see https://man.cx/pthread_mutex_destroy(3) + */ +void mutex_destroy(pthread_mutex_t* pmtx); + +/** + * \brief `pthread_mutex_lock` wrapper function. + * + *
      Precondition:
      + *
      pmtx != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_mutex_lock @endverbatim + * + * @see https://man.cx/pthread_mutex_lock(3) + */ +void mutex_lock(pthread_mutex_t* pmtx); + +/** + * \brief `pthread_mutex_trylock` wrapper function. + * + *
      Precondition:
      + *
      pmtx != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_mutex_trylock @endverbatim + * + * @see https://man.cx/pthread_mutex_trylock(3) + * + * \return true (`!=0`) if lock succeeds, false (`0`) otherwise + */ +int mutex_trylock(pthread_mutex_t* pmtx); + +/** + * \brief `pthread_mutex_unlock` wrapper function. + * + *
      Precondition:
      + *
      pmtx != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_mutex_unlock @endverbatim + * + * @see https://man.cx/pthread_mutex_unlock(3) + */ +void mutex_unlock(pthread_mutex_t* pmtx); + +/** @} */ + + +/** @name Condition variables + * + * @details + * + * Variable type: `pthread_cond_t` + * + * Initialization of condition variables can be static or dynamic. + * + * In static initialization the following initialization macros should be used: + * - `PTHREAD_COND_INITIALIZER` - standard initializer + * + * Dynamic initialization is done by cond_init() and cond_destroy(). + * + * @anchor cvar @{ + */ + +/** + * \brief `pthread_cond_init` wrapper function. + * + *
      Precondition:
      + *
      pcvar != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_cond_init @endverbatim + * + * @see https://man.cx/pthread_cond_init(3) + */ +void cond_init(pthread_cond_t* pcvar, pthread_condattr_t* attr); + +/** + * \brief `pthread_cond_destroy` wrapper function. + * + *
      Precondition:
      + *
      pcvar != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_cond_destroy @endverbatim + * + * @see https://man.cx/pthread_cond_destroy(3) + */ +void cond_destroy(pthread_cond_t* pcvar); + +/** + * \brief `pthread_cond_wait` wrapper function. + * + *
      Precondition:
      + *
      pcvar != NULL

      + *
      pmtx != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_cond_wait @endverbatim + * + * @see https://man.cx/pthread_cond_wait(3) + */ +void cond_wait(pthread_cond_t* pcvar, pthread_mutex_t* pmtx); + +/** + * \brief `pthread_cond_timedwait` wrapper function. + * + *
      Precondition:
      + *
      pcvar != NULL

      + *
      pmtx != NULL

      + *
      abstime != NULL
      + *
      + * + * \return true (`!=0`) if condition variable was signaled, false (`0`) it time out has expired. + * + * \details Other documentation in @verbatim man 3 pthread_cond_timedwait @endverbatim + * + * @see https://man.cx/pthread_cond_wait(3) + */ +int cond_timedwait(pthread_cond_t* pcvar, pthread_mutex_t* pmtx, const struct timespec *abstime); + +/** + * \brief `pthread_cond_timedwait` wrapper function accepting relative time (in microseconds) instead of absolute time. + * + *
      Precondition:
      + *
      pcvar != NULL

      + *
      pmtx != NULL

      + *
      relative_time_us > 0L
      + *
      + * + * \return true (`!=0`) if condition variable was signaled, false (`0`) it time out has expired. + * + * \details Documentation in @verbatim man 3 pthread_cond_timedwait @endverbatim + * + * @see https://man.cx/pthread_cond_wait(3) + */ +int cond_timedwait(pthread_cond_t* pcvar, pthread_mutex_t* pmtx, long relative_time_us); + +/** + * \brief `pthread_cond_signal` wrapper function. + * + *
      Precondition:
      + *
      pcvar != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_cond_signal @endverbatim + * + * @see https://man.cx/pthread_cond_signal(3) + */ +void cond_signal(pthread_cond_t* pcvar); + +/** + * \brief `pthread_cond_broadcast` wrapper function. + * + *
      Precondition:
      + *
      pcvar != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_cond_broadcast @endverbatim + * + * @see https://man.cx/pthread_cond_broadcast(3) + */ +void cond_broadcast(pthread_cond_t* pcvar); + +/** @} */ + + +/** @name One-time initialization + * + * @details + * + * Variable type: `pthread_once_t` + * + * POSIX thread library support a mechanism that ensures a one-time execution of a function. + * It does it through `pthread_once_t` variables, and by passing a callback function + * (in C/C++ is simply a function pointer). + * + * \par Example + * @verbatim + void once_init_routine(void) { ... } + ... + pthread_once_t once_control = PTHREAD_ONCE_INIT; + thread_once(&once_control, &once_init_routine); // one time execution over pthread_once_t + // variable is guaranteed, regardless of the + // number of threads that execute over that + // variable. + @endverbatim + * + * @anchor thread_once @{ + */ + +/** + * \brief `pthread_once` wrapper function. + * + *
      Precondition:
      + *
      once_control != NULL

      + *
      init_routine != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_once @endverbatim + * + * @see https://man.cx/pthread_once(3) + */ +void thread_once(pthread_once_t *once_control, void (*init_routine) (void)); + +/** @} */ + + +/** @name Thread-specific data + * + * @details + * + * Variable type: `pthread_key_t` + * + * Thread-specific data allows the definition of variable whose scope is limited to each thread. + * In practice, we will have a common variable, with a common access, but with different values for each thread. + * + * @anchor thread_specific @{ + */ + +/** + * \brief `pthread_key_create` wrapper function. + * + * \details This function should be executed once for each key (use thread_once()). + * + *
      Precondition:
      + *
      key != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_key_create @endverbatim + * + * @see https://man.cx/pthread_key_create(3) + */ +void thread_key_create(pthread_key_t *key, void (*destr_function) (void *)); + +/** + * \brief `pthread_key_delete` wrapper function. + * + * \details This function should be executed once for each key (use thread_once()). + * + *
      Precondition:
      + *
      key != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_key_delete @endverbatim + * + * @see https://man.cx/pthread_key_delete(3) + */ +void thread_key_delete(pthread_key_t key); + +/** + * \brief `pthread_setspecific` wrapper function. + * + *
      Precondition:
      + *
      pointer != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_setspecific @endverbatim + * + * @see https://man.cx/pthread_setspecific(3) + */ +void thread_setspecific(pthread_key_t key, void* pointer); + +/** + * \brief `pthread_getspecific` wrapper function. + * + *
      Precondition:
      + *
      key != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_getspecific @endverbatim + * + * @see https://man.cx/pthread_getspecific(3) + */ +void* thread_getspecific(pthread_key_t key); + +/** @} */ + + +/** @name Mutex attributes + * + * @details + * + * Variable type: `pthread_mutexattr_t` + * + * @anchor mutex_attr @{ + */ + +/** + * \brief `pthread_mutexattr_init` wrapper function. + * + *
      Precondition:
      + *
      attr != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_mutexattr_init @endverbatim + * + * @see https://man.cx/pthread_mutexattr_init(3) + */ +void mutexattr_init(pthread_mutexattr_t *attr); + +/** + * \brief `pthread_mutexattr_destroy` wrapper function. + * + *
      Precondition:
      + *
      attr != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_mutexattr_destroy @endverbatim + * + * @see https://man.cx/pthread_mutexattr_destroy(3) + */ +void mutexattr_destroy(pthread_mutexattr_t *attr); + +/** + * \brief `pthread_mutexattr_settype` wrapper function. + * + *
      Precondition:
      + *
      attr != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_mutexattr_settype @endverbatim + * + * @see https://man.cx/pthread_mutexattr_settype(3) + */ +void mutexattr_settype(pthread_mutexattr_t *attr, int type); + +/** + * \brief `pthread_mutexattr_gettype` wrapper function. + * + *
      Precondition:
      + *
      attr != NULL

      + *
      kind != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_mutexattr_gettype @endverbatim + * + * @see https://man.cx/pthread_mutexattr_gettype(3) + */ +void mutexattr_gettype(const pthread_mutexattr_t *attr, int *kind); + +/** @} */ + + +/** @name Condition variables attributes + * + * @details + * + * Variable type: `pthread_condattr_t` + * + * @anchor cond_attr @{ + */ + +/** + * \brief `pthread_condattr_init` wrapper function. + * + *
      Precondition:
      + *
      attr != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_condattr_init @endverbatim + * + * @see https://man.cx/pthread_condattr_init(3) + */ +void condattr_init(pthread_condattr_t *attr); + +/** + * \brief `pthread_condattr_destroy` wrapper function. + * + *
      Precondition:
      + *
      attr != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_condattr_destroy @endverbatim + * + * @see https://man.cx/pthread_condattr_destroy(3) + */ +void condattr_destroy(pthread_condattr_t *attr); + +/** @} */ + + +/** @name Thread attributes + * + * @details + * + * Variable type: `pthread_attr_t` + * + * @anchor thread_attr @{ + */ + +/** + * \brief `pthread_attr_init` wrapper function. + * + *
      Precondition:
      + *
      attr != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_attr_init @endverbatim + * + * @see https://man.cx/pthread_attr_init(3) + */ +void thread_attr_init(pthread_attr_t *attr); + +/** + * \brief `pthread_attr_destroy` wrapper function. + * + *
      Precondition:
      + *
      attr != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_attr_destroy @endverbatim + * + * @see https://man.cx/pthread_attr_destroy(3) + */ +void thread_attr_destroy(pthread_attr_t *attr); + +/** + * \brief `pthread_attr_setdetachstate` wrapper function. + * + *
      Precondition:
      + *
      attr != NULL

      + *
      detachstate == PTHREAD_CREATE_DETACHED || detachstate == PTHREAD_CREATE_JOINABLE
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_attr_setdetachstate @endverbatim + * + * @see https://man.cx/pthread_attr_setdetachstate(3) + */ +void thread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); + +/** + * \brief `pthread_attr_getdetachstate` wrapper function. + * + *
      Precondition:
      + *
      attr != NULL

      + *
      pdetachstate != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_attr_getdetachstate @endverbatim + * + * @see https://man.cx/pthread_attr_getdetachstate(3) + */ +void thread_attr_getdetachstate(const pthread_attr_t *attr, int *pdetachstate); + +/** @} */ + + +/** @name Cancellation + * + * @anchor thread_cancellation @{ + */ + +/** + * \brief `pthread_cancel` wrapper function. + * + * \details Other documentation in @verbatim man 3 pthread_cancel @endverbatim + * + * @see https://man.cx/pthread_cancel(3) + */ +void thread_cancel(pthread_t thread); + +/** + * \brief `pthread_setcancelstate` wrapper function. + * + *
      Precondition:
      + *
      state == PTHREAD_CANCEL_ENABLE || state == PTHREAD_CANCEL_DISABLE

      + *
      oldstate != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_setcancelstate @endverbatim + * + * @see https://man.cx/pthread_setcancelstate(3) + */ +void thread_setcancelstate(int state, int *oldstate); + +/** + * \brief `pthread_setcanceltype` wrapper function. + * + *
      Precondition:
      + *
      type == PTHREAD_CANCEL_DEFERRED || type == PTHREAD_CANCEL_ASYNCHRONOUS

      + *
      oldtype != NULL
      + *
      + * + * \details Other documentation in @verbatim man 3 pthread_setcanceltype @endverbatim + * + * @see https://man.cx/pthread_setcanceltype(3) + */ +void thread_setcanceltype(int type, int *oldtype); + +/** + * \brief `pthread_testcancel` wrapper function. + * + * \details Other documentation in @verbatim man 3 pthread_testcancel @endverbatim + * + * @see https://man.cx/pthread_testcancel(3) + */ +void thread_testcancel(void); + + +/** @} */ + +#endif + +/* ************************************************** */ +/** + * @} close group thread + **/ +/* ************************************************** */ + diff --git a/3ano/1semestre/so/practice-exam/src/include/utils.h b/3ano/1semestre/so/practice-exam/src/include/utils.h new file mode 100644 index 0000000..aa3674c --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/include/utils.h @@ -0,0 +1,658 @@ +/** + * \defgroup utils utils + * \ingroup concurrency-library + * \brief Useful common functions and macros. + * \author Miguel Oliveira e Silva, 2017-2018 + * @{ + **/ + +/*! + * \file + * + * \brief Useful common functions and macros. + **/ + +#ifndef UTILS_H +#define UTILS_H + +#include +#include +#include +#include "dbc.h" + +/** @name String concatenation in stack memory + * @anchor concat @{ + */ +/** + * \brief Concatenates two strings in the stack memory (thus it cannot be implemented in a function). + * + * \details A `NULL` reference is treated as an empty string. + * + * \param [in] str1 string 1 + * \param [in] str2 string 2 + * + * \return the concatenated string + */ +#define concat_2str(str1,str2) \ + ({ \ + char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \ + char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \ + char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+1); \ + strcpy(__res__, s1); \ + strcat(__res__, s2); \ + __res__; \ + }) + +/** + * \brief Concatenates three strings in the stack memory (thus it cannot be implemented in a function). + * + * \details A `NULL` reference is treated as an empty string. + * + * \param [in] str1 string 1 + * \param [in] str2 string 2 + * \param [in] str3 string 3 + * + * \return the concatenated string + */ +#define concat_3str(str1,str2,str3) \ + ({ \ + char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \ + char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \ + char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \ + char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+1); \ + strcpy(__res__, s1); \ + strcat(__res__, s2); \ + strcat(__res__, s3); \ + __res__; \ + }) + +/** + * \brief Concatenates four strings in the stack memory (thus it cannot be implemented in a function). + * + * \details A `NULL` reference is treated as an empty string. + * + * \param [in] str1 string 1 + * \param [in] str2 string 2 + * \param [in] str3 string 3 + * \param [in] str4 string 4 + * + * \return the concatenated string + */ +#define concat_4str(str1,str2,str3,str4) \ + ({ \ + char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \ + char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \ + char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \ + char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \ + char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+1); \ + strcpy(__res__, s1); \ + strcat(__res__, s2); \ + strcat(__res__, s3); \ + strcat(__res__, s4); \ + __res__; \ + }) + +/** + * \brief Concatenates five strings in the stack memory (thus it cannot be implemented in a function). + * + * \details A `NULL` reference is treated as an empty string. + * + * \param [in] str1 string 1 + * \param [in] str2 string 2 + * \param [in] str3 string 3 + * \param [in] str4 string 4 + * \param [in] str5 string 5 + * + * \return the concatenated string + */ +#define concat_5str(str1,str2,str3,str4,str5) \ + ({ \ + char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \ + char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \ + char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \ + char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \ + char* s5 = (str5) == NULL ? (char*)"" : (char*)(str5); \ + char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+1); \ + strcpy(__res__, s1); \ + strcat(__res__, s2); \ + strcat(__res__, s3); \ + strcat(__res__, s4); \ + strcat(__res__, s5); \ + __res__; \ + }) + +/** + * \brief Concatenates six strings in the stack memory (thus it cannot be implemented in a function). + * + * \details A `NULL` reference is treated as an empty string. + * + * \param [in] str1 string 1 + * \param [in] str2 string 2 + * \param [in] str3 string 3 + * \param [in] str4 string 4 + * \param [in] str5 string 5 + * \param [in] str6 string 6 + * + * \return the concatenated string + */ +#define concat_6str(str1,str2,str3,str4,str5,str6) \ + ({ \ + char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \ + char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \ + char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \ + char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \ + char* s5 = (str5) == NULL ? (char*)"" : (char*)(str5); \ + char* s6 = (str6) == NULL ? (char*)"" : (char*)(str6); \ + char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+strlen(s6)+1); \ + strcpy(__res__, s1); \ + strcat(__res__, s2); \ + strcat(__res__, s3); \ + strcat(__res__, s4); \ + strcat(__res__, s5); \ + strcat(__res__, s6); \ + __res__; \ + }) + +/** + * \brief Concatenates seven strings in the stack memory (thus it cannot be implemented in a function). + * + * \details A `NULL` reference is treated as an empty string. + * + * \param [in] str1 string 1 + * \param [in] str2 string 2 + * \param [in] str3 string 3 + * \param [in] str4 string 4 + * \param [in] str5 string 5 + * \param [in] str6 string 6 + * \param [in] str7 string 7 + * + * \return the concatenated string + */ +#define concat_7str(str1,str2,str3,str4,str5,str6,str7) \ + ({ \ + char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \ + char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \ + char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \ + char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \ + char* s5 = (str5) == NULL ? (char*)"" : (char*)(str5); \ + char* s6 = (str6) == NULL ? (char*)"" : (char*)(str6); \ + char* s7 = (str7) == NULL ? (char*)"" : (char*)(str7); \ + char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+strlen(s6)+strlen(s7)+1); \ + strcpy(__res__, s1); \ + strcat(__res__, s2); \ + strcat(__res__, s3); \ + strcat(__res__, s4); \ + strcat(__res__, s5); \ + strcat(__res__, s6); \ + strcat(__res__, s7); \ + __res__; \ + }) +/** @} */ + +/** + * \brief Converts an `int` value to a stack allocated string. + * + * \param [in] num integer number + * + * \return the converted string + */ +#define int2str(num) \ + ({ \ + char* __res__ = (char*)alloca(numDigits((int)num)+1); \ + sprintf(__res__, "%d", (int)num); \ + __res__; \ + }) + +/** + * \brief Converts an `int` value to a stack allocated string. + * + * \details If necessary, fills the result string with left zeros. + * + * \param [in] num integer number + * \param [in] len minimum length of result string + * + *
      Precondition:
      + *
      len > 0
      + *
      + * + * \return the converted string + */ +#define int2nstr(num, len) \ + ({ \ + require (len > 0, concat_3str("invalid length value (", int2str(len), ")")); \ + int d = numDigits((int)num); \ + if (len > d) \ + d = len; \ + char* __res__ = (char*)alloca(d+1); \ + sprintf(__res__, "%0*d", d, (int)num); \ + __res__; \ + }) + +/** + * \brief Converts an `long` value to a stack allocated string. + * + * \param [in] num long integer number + * + * \return the converted string + */ +#define long2str(num) \ + ({ \ + char* __res__ = (char*)alloca(numDigits((long)num)+1); \ + sprintf(__res__, "%ld", (long)num); \ + __res__; \ + }) + +/** + * \brief Converts an `long` value to a stack allocated string. + * + * \details If necessary, fills the result string with left zeros. + * + * \param [in] num long integer number + * \param [in] len minimum length of result string + * + *
      Precondition:
      + *
      len > 0
      + *
      + * + * \return the converted string + */ +#define long2nstr(num, len) \ + ({ \ + require (len > 0, concat_3str("invalid length value (", int2str(len), ")")); \ + int d = numDigits((int)num); \ + if (len > d) \ + d = len; \ + char* __res__ = (char*)alloca(d+1); \ + sprintf(__res__, "%0*ld", d, (long)num); \ + __res__; \ + }) + +/** + * \brief Converts an `int` percentage to a stack allocated string. + * + * \param [in] percentage an integer number with a percentage value + * + *
      Precondition:
      + *
      percentage >= 0 && percentage <= 100
      + *
      + * + * \return the converted string + */ +#define perc2str(percentage) \ + ({ \ + require (percentage >= 0 && percentage <= 100, concat_3str("invalid percentage value (", int2str(percentage), ")")); \ + char* __res__ = (char*)alloca(4+1); \ + sprintf(__res__, "%3d%%", (int)percentage); \ + __res__; \ + }) + +/** + * \brief Determines the length of all strings passed as a NULL terminated variable list of arguments (vargs). + * + * \param [in] first the argument that precedes the vargs argument list. + * + * \return the sum of the length of all strings (not counting terminator `'\0'`) + */ +#define length_vargs_string_list(first) \ + ({ \ + int __res__ = 0; \ + va_list ap; \ + va_start(ap, first); \ + char* t = first; \ + while (t != NULL) \ + { \ + __res__ += strlen(t); \ + t = va_arg(ap, char*); \ + } \ + va_end(ap); \ + __res__; \ + }) + +#if defined __cplusplus && defined EXCEPTION_POLICY +#define not_null(pnt) \ + ({ \ + if ((pnt) == NULL) \ + throw string_concat(NULL, 0, (char*)"Null pointer error", (char*)", pointer: \"", #pnt, (char*)"\", function: \"", __FUNCTION__, (char*)"\":", int2str(__LINE__), (char*)", file: \"", __FILE__, (char*)"\"\n", NULL); \ + pnt; \ + }) +#else +/** + * \brief Checks if address is not `NULL`, before its application. + * + * \details This macro is a non-defensive implementation of a null pointer verification. + * It implements two error handling policies: + * - EXIT_POLICY (default): describes the error in `stderr` (with the identification + * and the precise location of the failure), generates a segmentation fault + * (enabling a stack trace within a debugger like `gdb`), and exits program execution; + * - EXCEPTION_POLICY: throws a `char*` exception with the description of the failure. + * + * \par Example + * @skipline\code + * not_null(pnt)->something(); + * \endcode + * + * \param [in] pnt memory address + */ +#define not_null(pnt) \ + ({ \ + if ((pnt) == NULL) \ + { \ + fprintf (stderr, "Null pointer error, pointer: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \ + #pnt, __FUNCTION__, __LINE__ , __FILE__); \ + *((int*)0) = 0; \ + abort (); \ + } \ + pnt; \ + }) +#endif + +/** + * \brief A replacement for `malloc` function. + * + * \details This function is a non-defensive implementation of `malloc` error verification. + * It implements two error handling policies: + * - EXIT_POLICY (default): describes the error in `stderr` (with the identification + * and the precise location of the failure), generates a segmentation fault + * (enabling a stack trace within a debugger like `gdb`), and exits program execution; + * - EXCEPTION_POLICY: throws a `char*` exception with the description of the failure. + * + * \param [in] size number of bytes to be allocated + * + *
      Precondition:
      + *
      size >= 0
      + *
      + * + * \return address of the allocated memory + */ +void* mem_alloc(int size); + +/** + * \brief A replacement for `free` function. + * + * \param [in] pnt memory address to be freed + * + *
      Precondition:
      + *
      pnt != NULL
      + *
      + */ +void mem_free(void* pnt); + +/** + * \brief Replicates a string. + * + * \details The memory is allocated in the heap (using mem_alloc()). + * + * \param [in] str string to be replicated + * + *
      Precondition:
      + *
      str != NULL
      + *
      + * + * \return pointer to the replicated string + */ +char* string_clone(char* str); + +/** + * \brief Number of lines of a string. + * + * \param [in] text string text to process + * + *
      Precondition:
      + *
      text != NULL
      + *
      + * + * \return number of counted lines + */ +int string_num_lines(char* text); + +/** + * \brief Maximum number of columns of a string (not counting character `'\\n'`). + * + * \param [in] text string text to process + * + *
      Precondition:
      + *
      text != NULL
      + *
      + * + * \return maximum number of counted columns + */ +int string_num_columns(char* text); + +/** + * \brief Counts the number of occurrences of an UTF8 character in a text. + * + * \param [in] text string text to process + * \param [in] ch string containing the sequence of bytes (one or more) of an UTF8 single character + * + *
      Precondition:
      + *
      text != NULL

      + *
      ch != NULL && num_chars_utf8(ch) == 1
      + *
      + * + * \return number of counted occurrences + */ +int string_count_char(char* text, char* ch); + +/** + * \brief Tests if a string starts with a prefix. + * + * \param [in] text string text to process + * \param [in] prefix string to test if is a prefix + * + *
      Precondition:
      + *
      text != NULL

      + *
      prefix != NULL
      + *
      + * + * \return true (`!=0`) if prefix starts text, false (`0`) otherwise + */ +int string_starts_with(char* text, char* prefix); + +/** + * \brief Tests if a string ends with a suffix. + * + * \param [in] text string text to process + * \param [in] suffix string to test if is a suffix + * + *
      Precondition:
      + *
      text != NULL

      + *
      suffix != NULL
      + *
      + * + * \return true (`!=0`) if suffix ends text, false (`0`) otherwise + */ +int string_ends_with(char* text, char* suffix); + +/** + * \brief Concatenates a `NULL` terminated list of string arguments. + * + * \details + * This function treats all vargs arguments as strings (`char*`), + * and requires that the list is terminated with a NULL argument. + * + * It allocates memory in heap (using mem_alloc()) if `NULL` + * is passed in the `res` argument. + * + * \param [in,out] res address of result string (if not `NULL`) + * \param [in] max_length `res` input argument maximum length (not counting terminator `'\0'`), only applies if `(res != NULL)` + * \param [in] text the first string to be used in concatenation + * + *
      Precondition:
      + *
      text != NULL

      + *
      res == NULL || (max_length > 0 && length_vargs_string_list(text) <= max_length)
      + *
      + * + * \return the concatenated string + */ +char* string_concat(char* res, int max_length, char* text, ...); + +/** + * \brief Generates a random boolean value. + * + * \details + * This function generates boolean values with defined probabilities + * for true (`!=0`) and false (`0`) values. + * + * \param [in] trueProb probability (in interval `[0;100]`). + * + *
      Precondition:
      + *
      trueProb >= 0 && trueProb <= 100
      + *
      + * + * \return the random boolean value + */ +int random_boolean(int trueProb); + +/** + * \brief Generates a random integer value within a given interval. + * + * \details + * This function generates integer values in the interval `[min;max]`with an uniform distribution for all values. + * + * \param [in] min lower value of interval + * \param [in] max higher value of interval + * + *
      Precondition:
      + *
      max >= min
      + *
      + * + * \return the random integer value + */ +int random_int(int min, int max); + +/** + * \brief Returns a random string from a given string list. + * + * \details + * This function stores the previous randomly selected string's (using the integer indexes of the string list) + * to disallow its repeated generation. + * + * \param [in] list list of strings to be selected (`NULL` terminated) + * \param [in,out] used indexes of strings already selected + * \param [in] length number of elements of lists `list` (not counting `NULL` entry) and `used` + * + *
      Precondition:
      + *
      list != NULL

      + *
      used != NULL
      + *
      + * + * \return the random string + */ +char* random_string(char** list, int* used, int length); + +/** + * \brief Clears the terminal. + */ +void clear_console(); + +/** + * \brief Moves the cursor to a position in terminal. + * + * \param [in] line position in the terminal + * \param [in] column position in the terminal + * + *
      Precondition:
      + *
      line >= 0 && column >= 0
      + *
      + */ +void move_cursor(int line,int column); + +/** + * \brief Hides the terminal cursor. + */ +void hide_cursor(); + +/** + * \brief Shows the terminal cursor. + */ +void show_cursor(); + +/** + * \brief Number of elements of a `NULL` terminated list of strings. + * + * \param [in] list `NULL` terminated array of strings + * + *
      Precondition:
      + *
      list != NULL
      + *
      + * + * \return number of elements of list (not counting `NULL`) + */ +int string_list_length(char** list); + +/** + * \brief Replicates a `NULL` terminated list of strings. + * + * \details The memory is allocated in the heap (using mem_alloc()). + * + * \param [in] list `NULL` terminated array of strings + * + *
      Precondition:
      + *
      list != NULL
      + *
      + * + * \return pointer to the replicated list + */ +char** string_list_clone(char** list); + +/** + * \brief Frees the memory allocated to a `NULL` terminated list of strings. + * + * \details This function is totally compatible with string_list_clone(), and always returns `NULL`. + * + * \param [in] list `NULL` terminated array of strings + * + *
      Precondition:
      + *
      list != NULL
      + *
      + * + * \return `NULL` + */ +char** string_list_free(char** list); + +int numDigits(int num); + +/** + * \brief Converts an `int` value to a string. + * + * \details If necessary, fills the result string with left zeros. + * It allocates memory in heap (using mem_alloc()) if `NULL` + * is passed in the `res` argument. + * + * \param [in,out] res address of result string (if not `NULL`) + * \param [in] num integer number + * \param [in] len minimum length of result string (not counting terminator `'\0'`) + * + *
      Precondition:
      + *
      len >= numDigits(num)
      + *
      + * + * \return the converted string + */ +char* int2nstring(char* res, int num, int len); + +/** + * \brief Converts an `int` percentage to a string. + * + * \details It allocates memory in heap (using mem_alloc()) if `NULL` + * is passed in the `res` argument. + * + * \param [in,out] res address of result string (if not `NULL`) + * \param [in] percentage an integer number with a percentage value + * + *
      Precondition:
      + *
      percentage >= 0 && percentage <= 100
      + *
      + * + * \return the converted string (if not `NULL`, it returns `res`) + */ +char* percentage2string(char* res, int percentage); + +#endif + +/* ************************************************** */ +/** + * @} close group utils + **/ +/* ************************************************** */ + diff --git a/3ano/1semestre/so/practice-exam/src/lib/libsoconcur-excp.a b/3ano/1semestre/so/practice-exam/src/lib/libsoconcur-excp.a new file mode 100644 index 0000000000000000000000000000000000000000..19df3c2e9319e277349b84bcd228d3e97184beed GIT binary patch literal 256594 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ⅆ9V%jt`RjJ}@q=YVbM?t%2T3 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
      wGs za9w#ZoSYkVimS?_L26o*q}i{VUYIEy8^ftZJD;dEy_@4mRExe<;W|NkN2z6SbJFaHlmSc<2Zkgi() zGRm*WoMj^|(zQ=wiq1bDlH0TYHfnJBMK(X$A9ZK_X&Kh^Pnsv@XkLbY9p^8~u$s0J zXf%fT&Y+HO7)C_Uv}Z$Fd;0JBlg-5WQGY-D*ZOY-O!LH?my!H`a0Ub+XxhzywI}}w z$!9yEe4H{eJH~%NJXueOns9#DUZ>Lf1Hm!*tjBIhz01 z-j4oRK+E}A|K|Wh`C9)YBp=(C46HX_k3u5fOS-Qqzr^rf)4mHB&S#bS@L(0G9Vcl1 z#{aPXjC>6@$W!MJQvN0yhnQaH{{j-)tA7U-gHVf!5U~C`!+*}t_G?cz((l-Sf5EQw pI}+(}X-4PAWDoq;;m`#Z;d5&^UE41k657jOd)($oR~b~)`9IH51IhpZ literal 0 HcmV?d00001 diff --git a/3ano/1semestre/so/practice-exam/src/lib/libsoconcur.a b/3ano/1semestre/so/practice-exam/src/lib/libsoconcur.a new file mode 100644 index 0000000000000000000000000000000000000000..69255220d7c0cf3dc3bcf091e67d2b7e79fccdca GIT binary patch literal 205322 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 Y?ANZbcAKhO{x9pZC7$7e_|*9SFB+j;M*si- literal 0 HcmV?d00001 diff --git a/3ano/1semestre/so/practice-exam/src/pfifo.cpp b/3ano/1semestre/so/practice-exam/src/pfifo.cpp new file mode 100644 index 0000000..657d5e7 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/pfifo.cpp @@ -0,0 +1,171 @@ +#include "pfifo.h" +#include +#include +#include + +static void print_pfifo(PriorityFIFO *pfifo); +static int empty_pfifo(PriorityFIFO *pfifo); +static int full_pfifo(PriorityFIFO *pfifo); + +// TODO: point: initialization changes may be required in this function +void init_pfifo(PriorityFIFO *pfifo) { + require(pfifo != NULL, + "NULL pointer to FIFO"); // a false value indicates a program error + + memset(pfifo->array, 0, sizeof(pfifo->array)); + pfifo->inp = pfifo->out = pfifo->cnt = 0; + pfifo->is_closed = 0; + + pthread_mutex_init(&pfifo->mutex, NULL); + pthread_cond_init(&pfifo->not_full, NULL); + pthread_cond_init(&pfifo->not_empty, NULL); +} + +/* --------------------------------------- */ + +// TODO: point: termination changes may be required in this function +void term_pfifo(PriorityFIFO *pfifo) { + require(pfifo != NULL, + "NULL pointer to FIFO"); // a false value indicates a program error + require(is_closed_pfifo(pfifo), "FIFO open"); + + pthread_mutex_destroy(&pfifo->mutex); + pthread_cond_destroy(&pfifo->not_full); + pthread_cond_destroy(&pfifo->not_empty); +} + +/* --------------------------------------- */ + +// TODO: point: synchronization changes may be required in this function +void insert_pfifo(PriorityFIFO *pfifo, int id, int priority) { + require(pfifo != NULL, "NULL pointer to FIFO"); + require(id >= 0 && id <= MAX_ID, "invalid id"); + require(priority > 0 && priority <= MAX_PRIORITY, "invalid priority value"); + + // printf("[insert_pfifo] value=%d, priority=%d, pfifo->inp=%d, + // pfifo->out=%d\n", id, priority, pfifo->inp, pfifo->out); + + pthread_mutex_lock(&pfifo->mutex); + while(!pfifo->is_closed && full_pfifo(pfifo)) { + pthread_cond_wait(&pfifo->not_full, &pfifo->mutex); + } + require(pfifo->is_closed || !full_pfifo(pfifo), "open FIFO is full"); + + if (!pfifo->is_closed) { + int idx = pfifo->inp; + int prev = (idx + FIFO_MAXSIZE - 1) % FIFO_MAXSIZE; + while ((idx != pfifo->out) && + (pfifo->array[prev].priority > priority)) { + // printf("[insert_pfifo] idx=%d, prev=%d\n", idx, prev); + pfifo->array[idx] = pfifo->array[prev]; + idx = prev; + prev = (idx + FIFO_MAXSIZE - 1) % FIFO_MAXSIZE; + } + // printf("[insert_pfifo] idx=%d, prev=%d\n", idx, prev); + pfifo->array[idx].id = id; + pfifo->array[idx].priority = priority; + pfifo->inp = (pfifo->inp + 1) % FIFO_MAXSIZE; + pfifo->cnt++; + // printf("[insert_pfifo] pfifo->inp=%d, pfifo->out=%d\n", pfifo->inp, + // pfifo->out); + } + + pthread_cond_broadcast(&pfifo->not_empty); + pthread_mutex_unlock(&pfifo->mutex); +} + +/* --------------------------------------- */ + +// TODO: point: synchronization changes may be required in this function +int retrieve_pfifo(PriorityFIFO *pfifo) { + require(pfifo != NULL, "NULL pointer to FIFO"); + + pthread_mutex_lock(&pfifo->mutex); + while(!pfifo->is_closed && empty_pfifo(pfifo)) { + pthread_cond_wait(&pfifo->not_empty, &pfifo->mutex); + } + require(pfifo->is_closed || !empty_pfifo(pfifo), "FIFO is empty"); + + int result = -1; + if (!pfifo->is_closed) { + check_valid_patient_id(pfifo->array[pfifo->out].id); + check_valid_priority(pfifo->array[pfifo->out].priority); + + result = pfifo->array[pfifo->out].id; + pfifo->array[pfifo->out].id = INVALID_ID; + pfifo->array[pfifo->out].priority = INVALID_PRIORITY; + pfifo->out = (pfifo->out + 1) % FIFO_MAXSIZE; + pfifo->cnt--; + + // update priority of all remaing elements (increase priority by one) + int idx = pfifo->out; + for (int i = 1; i <= pfifo->cnt; i++) { + if (pfifo->array[idx].priority > 1 && + pfifo->array[idx].priority != INVALID_PRIORITY) + pfifo->array[idx].priority--; + idx = (idx + 1) % FIFO_MAXSIZE; + } + } + + ensure((result >= 0 && result <= MAX_ID) || is_closed_pfifo(pfifo), "OPEN FIFO with an invalid id"); + + pthread_cond_broadcast(&pfifo->not_full); + pthread_mutex_unlock(&pfifo->mutex); + + return result; +} + +// TODO: point: synchronization changes may be required in this function +void close_pfifo(PriorityFIFO *pfifo) { + require(pfifo != NULL, + "NULL pointer to FIFO"); // a false value indicates a program error + require(!is_closed_pfifo(pfifo), + "FIFO already closed"); // a false value indicates a program error + + pthread_mutex_lock(&pfifo->mutex); + pfifo->is_closed = 1; + pthread_cond_broadcast(&pfifo->not_empty); + pthread_mutex_unlock(&pfifo->mutex); +} + +// TODO: point: synchronization changes may be required in this function +int is_closed_pfifo(PriorityFIFO *pfifo) { + require(pfifo != NULL, + "NULL pointer to FIFO"); // a false value indicates a program error + + return pfifo->is_closed; +} + +/* --------------------------------------- */ + +static int empty_pfifo(PriorityFIFO *pfifo) { + require(pfifo != NULL, + "NULL pointer to FIFO"); // a false value indicates a program error + + return pfifo->cnt == 0; +} + +/* --------------------------------------- */ + +static int full_pfifo(PriorityFIFO *pfifo) { + require(pfifo != NULL, + "NULL pointer to FIFO"); // a false value indicates a program error + + return pfifo->cnt == FIFO_MAXSIZE; +} + +/* --------------------------------------- */ + +static void print_pfifo(PriorityFIFO *pfifo) { + require(pfifo != NULL, + "NULL pointer to FIFO"); // a false value indicates a program error + + int idx = pfifo->out; + for (int i = 1; i <= pfifo->cnt; i++) { + check_valid_patient_id(pfifo->array[pfifo->out].id); + check_valid_priority(pfifo->array[pfifo->out].priority); + printf("[%02d] value = %d, priority = %d\n", i, pfifo->array[idx].id, + pfifo->array[idx].priority); + idx = (idx + 1) % FIFO_MAXSIZE; + } +} diff --git a/3ano/1semestre/so/practice-exam/src/pfifo.h b/3ano/1semestre/so/practice-exam/src/pfifo.h new file mode 100644 index 0000000..09f0447 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/pfifo.h @@ -0,0 +1,47 @@ +/* + * @brief A priority FIFO (implemented with a circular array), + * whose elements are pairs of integers, one being an + * non-negative id and the other a positive priority value. + * + * The following operations are defined: + * \li initialization + * \li destruction + * \li insertion of a value with a given priority + * \li retrieval of a value. + * \li close + * \li check is it is closed + **/ + +#ifndef PFIFO_H +#define PFIFO_H + +#include "settings.h" +#include + +// TODO: point: uncomment the desired implementation +#include "thread.h" +// #include "process.h" + +typedef struct { + struct { + int id; // element ID (works as an index in array all_patients) + int priority; // patient priority in FIFO + } array[FIFO_MAXSIZE]; + int inp; ///< point of insertion (queue tail) + int out; ///< point of retrieval (queue head) + int cnt; ///< number of items stored + int is_closed; ///< true when closed + // TODO: point: if necessary, add synchronization declarations here + pthread_mutex_t mutex; + pthread_cond_t not_full; + pthread_cond_t not_empty; +} PriorityFIFO; + +void init_pfifo(PriorityFIFO *pfifo); +void term_pfifo(PriorityFIFO *pfifo); +void insert_pfifo(PriorityFIFO *pfifo, int id, int priority); +int retrieve_pfifo(PriorityFIFO *pfifo); +void close_pfifo(PriorityFIFO *pfifo); +int is_closed_pfifo(PriorityFIFO *pfifo); + +#endif diff --git a/3ano/1semestre/so/practice-exam/src/settings.h b/3ano/1semestre/so/practice-exam/src/settings.h new file mode 100644 index 0000000..7fda72c --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/settings.h @@ -0,0 +1,96 @@ +/** + * @brief Simulation parameter values. + */ + +#ifndef SETTINGS_H +#define SETTINGS_H + +#include +#include + +/** + * \brief maximum patient name length + */ +#define MAX_NAME 31 + +/** + * \brief maximum number of patients + */ +#define MAX_PATIENTS 100 + +/** + * \brief maximum number of nurses + */ +#define MAX_NURSES 20 + +/** + * \brief maximum number of doctors + */ +#define MAX_DOCTORS 20 + +/** + * \brief maximum time (in microseconds) in random waits + */ +#define MAX_WAIT 100000 + +/** + * \brief initial priority value for Manchester system colors + */ +#define RED 1 +#define ORANGE 2 +#define YELLOW 4 +#define GREEN 8 +#define BLUE 16 + +/** + * \brief maximum elements in FIFO + */ +#define FIFO_MAXSIZE 5 + +/** + * \brief maximum value accepted for an id + */ +#define MAX_ID (MAX_PATIENTS-1) + +/** + * \brief invalid id number + */ +#define INVALID_ID 99999999 + +/** + * \brief maximum value accepted for a priority + */ +#define MAX_PRIORITY BLUE + +/** + * \brief invalid priority number + */ +#define INVALID_PRIORITY 55555555 + +/** + * \brief patient id verification test + */ +#define check_valid_patient_id(id) do { if(id < 0 || id > MAX_ID) { printf("\e[31;01m[%s, line %d, function %s] ERROR: invalid patient ID %d!\e[0m\n", __FILE__, __LINE__, __FUNCTION__, id); exit(EXIT_FAILURE); } } while(0) + +/** + * \brief nurse id verification test + */ +#define check_valid_nurse_id(id) do { if(id < 0 || id >= MAX_NURSES) { printf("\e[31;01m[%s, line %d, function %s] ERROR: invalid nurse ID %d!\e[0m\n", __FILE__, __LINE__, __FUNCTION__, id); exit(EXIT_FAILURE); } } while(0) + +/** + * \brief doctor id verification test + */ +#define check_valid_doctor_id(id) do { if(id < 0 || id >= MAX_DOCTORS) { printf("\e[31;01m[%s, line %d, function %s] ERROR: invalid doctor ID %d!\e[0m\n", __FILE__, __LINE__, __FUNCTION__, id); exit(EXIT_FAILURE); } } while(0) + +/** + * \brief priority verification test + */ +#define check_valid_priority(priority) do { if(priority < 1 || priority > MAX_PRIORITY) { printf("\e[31;01m[%s, line %d, function %s] ERROR: invalid priority %d!\e[0m\n", __FILE__, __LINE__, __FUNCTION__, priority); exit(EXIT_FAILURE); } } while(0) + +/** + * \brief patient name verification test + */ +#define check_valid_name(name) do { if(name[0] == '\0') { printf("\e[31;01m[%s, line %d, function %s] ERROR: invalid patient with name \"%s\"!\e[0m\n", __FILE__, __LINE__, __FUNCTION__, name); exit(EXIT_FAILURE); } } while(0) + +#endif + diff --git a/3ano/1semestre/so/practice-exam/src/urgency b/3ano/1semestre/so/practice-exam/src/urgency new file mode 100755 index 0000000000000000000000000000000000000000..2d451e04ec528f5f77b7473f83f5761c6a568e0a GIT binary patch literal 152776 zcmeFa2YeLe_CGwco6T-A*(8txfk2jOB1L)?1SPQa7(hXU5RwfErkO%fKs3b5x~^hD zv0l`B6+0Fb5hWA}_F%<&V^0JX5jA?b=KnqCd1iKYN&H=}^6KaPu$no~DbIP%InQ~@ zJTtpol0Id;MO793V^u~ggstu>C}SjJ-(-s{DasgSnBv5>yV6Yw2Q>_TVnjJzCJ3LhQn?VXK!6qo<@ zBg3g=%Jy38hXpd8I+V>Trxg|~95U#%!rVTE1;v%i`YanZq|cB+ealPw4qy|=E^32v zYQnTxieFa<8@f>< z?3tOpu+SrTEpyJBQ8A!@K}mVm!t8QS7UtZt?6T!q1;qswOO(=z{4!5=ZkA_RL4{IY zQI=D>Tq&)rC|9zm)tn2ma`G?8%F8Y&RPxF^9wjfYu(CX#1PeXIM&+E6;#}5eP!^XI z6f2eGg&t2S3FCi*Ra9BwSq3jaD?wYb{Tx_P;ZYWODoP7-Q6;yevO*~-h2x718Bw#a zB;&nYTZvKN+=1q9i>rP-ouiir>FVQ@~bUbIRMA+*RSEy{so zg!LzSj-XGNGV#o_X3x$V*mqFhfddpqvj+4XWRwP)idc7bfdPF7BY7>R|E#8R7|Qf# z!P+cj%v>`i9DJ2!!T?pQ)w)hvZ&f7@Yl}YK&uqF8Shz9{SNf=EV}#@r9$!%4q}{*_ zNqhX78?ao5Df1*=mQ)ZyyMcU(S9T!WqErB&YI>F$pNU#IK% zf)M&@iR)08-~E)Rzcxg^R?^pn&|i`C4I%W`C4FNE{eYxz3ZZ`}>6=67pGx}H5c-#r zUK2t;Eb03~=uMJd7eZII34afS&~1`lA41n8y&;62AnAug=$$0JDTLll(rf-D+NV97 z-Ume4XQCs4j8C13-rb-o$^jES)kLp1(bG(HeV(UnBdsC&N1xA$PJ2lGqtE|D@1qk5 z)(gZApo$`29rXesx=dvz#G2?oU=)ZT*v4FG{4JVyA!l)r%6*=}-R* zs~07rVSpK*G4-NI^hkrMC~gy7Gto0l^e7X3wuv5XqAxJfV@&jX6P@M~{Zm>mN@S0` zWo5!L6WzR@SZ$)mv81@HHPPvQL;tL+7bVi4pc4T%)C+{@iK58Yjr9T{dOK0%>!x~v z5WT%9@^y2)K!~0sihSK#FA$=45JkS$)C+{@9Yv9^`|1Tkbp2kRD0TI86@A-D6#06f zULYjjSrqwNUoQ}%r-&k78|no@beAad^>DpFh~7mM`Px)35TeVeRuJU4CVCG+;j6<$ z?`fjPn&_vP=fs+w98G(}# zI2nOIA_CvVbpF|0b;#lN*`D8l+m)L6s#qlD8DP~&FC?<1U!ei}D2ekb8{_&m^3Va2o3vA3-=B-89xPK7epK zvT5AR_^E``QBC7U#=8LJ=81Fzh9nCbZX1p!obR^SQ%6KH_NT{9uZ!JM9;@_pp2C*JrqQHd)>3UibcAD&nEw&Fw;gqq#mWCS_cp zKH0Z=)F{+dDhJMTSB<&?l8W2=S%uT>8x;;;niH0R)R2SN?6t*1P@T6sVDIj{K$*r5 z>1$jB*;&wmffwucu55Bwt!z>%i?&XK>NW5J-W6V{CpycxX-_yq7~q!Ly;W{@uCuBsVksJVg~1Rul&2Jw5T+ihEi zN(T8ukk>uG`~Qf=0-ub1=)sDxNdAhthY8UZ~P=QAQ>v4gA# ziN%ZmmgXV?M=*_4*Th_3gH9;gIv$qF-uUneX~6*$U_nn|!FVXoT-+HJPze@HqSnwG z+^Fo0cd3e3S}>{w3nuCoAd1uvHwEwogg+G&JEGhZ6gC%9sKHzLsdrXA5~(31k-F)o zcM_&wK$-4O@BzzQoCedMLhR0DO{)AcFmW;pL*?n}B65?uCY*LkSIkOKg8aoVnpXMAI8yhekp@zV#WV8NbFd@wy}|9z7{(BJ@Ake$%&SQOSiUiXs%t9SF&E_fv3g;$vTvnT^Pr7K=9-$y zZ7qndZc!A;SrQ2J*tIgyBT+!0y?EpVzwQN=xp)x#eG?`4J68Cc%`VD7kD@BNzZ=Q7 zkRE=Z$>c&zbz7J$%uMxSLP&4&XN0+PcDV~`7UkvTxpy|W_BVO=@BAqxZJ#&&m~ZMa z@4lV&7Ik0RF7K>k2hZlJvzpvFuep6w8+?_=+&MqEeNo@Ky-{_(^kctWrLd*<@bspN zIH4RWU-ONt3mcwZzhYgWJ>S$%(S{kX_fDw`6ZKR5Zq=Q$)8vJB*Z!YjdQ%DvuOkoY z(sp`ZAZaoCp-cPuGgLvKIkG{_Y}D(+e+*8M<-h}zoQp zik`O({7Tvn=sAVpUVls>#Pu$9ik9 zzV>HJc5a)CF$i>wumz_cb)WgGP9RLq=b$pWG@Ew7O;$&j`WPs;1agQ$pH> zuxNNIx3qKH`J&-kY>5yAG~CzR@EoJzs}Y0{U14?J^rOMF+OWFj`tNNaL^S%zmg!ce zj_LiI1_*5y!~o&ey}XG4p*O~NZTc~u^)6x=o(gERRyC=s1_hHwQS%ik!9>4XIK&lc z0P_@t!Q09d)a0AmWSWASs?fZ&Zg~2!n5&i`KdM$9S>qd4KMixHK##{+3bMZ15`H3)6Bep-GEdhO6aWNvN zl`1kQWRP7gjA|kSpFm)+cUphk-s#RuWteV70b%;`F>Wc6Ew~64WD5)OM3|Nm&@H%~ zs_4U9ZNUPkZh>5m|08j1PSJxj)|&zo^TuyEhO{%~7}f(1Ow6X8c&T|O{_$#Q|NAJw z{!@khlVDnAKDrTI?0gG-j-K9268?mj3Ft1o$A}E#XfiJ(h?AsMm_b|W%^+LOfik`; z$RMr0QMW(J4L%DjGyf`uZ8=ZaGJ+)h31bQ9woGS4+VUv18)D0|hed?2y74|Z=82mB z)23aQNSn5!0GlF(O{b!*%={Y_w&^u=HsW(PN%#{UB%s^$G$Ycc&MnwA zW}{qgV>Jy5R3B*NK%GMBeWNNL;g;6}%go;>jB*R3+K_}lp*;cJsGf{Sqr7B5NTAk# z!+{E()Edu0&hhN>yOx*Dob)@l{S#(lZvSW%8Ah|bvYJYAc`5%|UtaFjZ3(pczb!9A zWy5!ihVzYvU*&MfhJXG_Z@8b{u$ad6?Ucacc|%8Le`_{-J8J*VIs0ZDORO`ETkpza zXyq}{N<%LgwPWo-EW6uqNaOa}u6P*0XR89(Ms(xmb0SMd^sSv!))>JFAKVe~1&Q-D+-C z>{CvK2yD(FOAObiW9NX?8s`$tm62O%7uD!Oa??2l-Rog<1WTHPB_3%B_NQb?o?*!W zvn9I^>X!T@8a(nK#hvd3c7AMkt2lJ5al|}JwbX6N zEwM$n)yr;^4URS%Y~qq^@Rmm1_5Em?qb$1ZRI~S$kZRZ-CA&cg3^xnRgaE?hzdy*@ zs$DLTXjtrP8|p*|3xZ`h5mRgVEk|gW9L%lSl_67=G)xn%oDwQyZsj7#1Sdx<%~(F$ zxAz6vCI$d$eN01F_-y-I;s*xEqb;#Tq|cL)#*9NF@{No2uDxmnm1Ly*H|UXGB-~hV zoJPOfLAT|*+}>B9r@c8bzWag$+#7W;B52Bl!zgjjbv>M;{twm|(*KY-cow7Y5Qf}{Vlx$i1J z4~;JMQ*Fb|ID8eQDy))d`O09e!7ZOATFwuZF{k)Q;orDm8Ii2pR--qb#UCYA!-YXM zxoBsW>-L59NM(L{Q~w&?8)2qBiaQrn7>#A6HvKTy$6T80?j?jPYz@`W<@To^CcR!* zDNl%hRp~mRbvI6|s+yYlPNecsEBbqw^r!tc{T=A&@&D5Q+-Cv%pGR9{|JYe$XU=e6 zdI*tJyw6O5^KS1JdPZfA(t-Xpjae3~w9iz4Q(7@z7Gkb`j3#oX7RRiirB6q$zRBR^ z#;n0}*ESQoOP_5Tt~iH?@!7_qRMnIlbJcr7dK^pd z+?EV=&w@mQZp%eN!!T&zv&+V_!&&u@s7$JNz-zDVKmQ=rKjJD>e}z(2Q+&)-RYG+m zOYhu9&!}|OOQq@$ph2kq!N#g@m8x@D_1&y`qoMj*U3D*^`YNfqqe=BpsroWQ^(|06 z&evlODv$H^nMOK0jl z5ij4xChY?7b=rz+uq{g< zMbCDy-a{8#G)veu_9-%GEXU0Ij@v)@0<$@e_-tFD(v;A@> zEYHDC?n~9}UB8Tixxwv^e-5oHTd^Hi+*J)K*3W0Dyp5>tAAfLPP!sD;+e134YV0^e zwz_xLTixFD)jr!JW`(oX{vK`XFwX~R+wgm|ZG`_p+BUJaYVzs7^Auh-Sm3Dzo^JNp zYVRIMWW~#vD6WGif&00)#O8e!6ZN}=ogmg$7ovvI&^q6G!b2O{`yn+% z95mF48zN-I%eB>|=IR@L>j@97{x_~p98~}Kc5;)D6)*d2F9E|O^59{)Np^eRcl%}? zz+NDpHxAefEJtm(-_tO6?D=Eo%`+YrKT8we4zj%A&C{TSZ+jvxiKtC)qS@}?AlwCY zV$?!t51{=S#Vn{COawZKQ3s)R)S|J4ZHTysn;~9`>2x~m^VtUAikZv1SG4Crd&qX0 zrPKqoT=?e6YWfrX2D)eF85;+X;$h&mAAkb=wPRdpNWaB@b|Y@kgw`1HqP8It?yj4+ zn_d*)T?6(EReM%@pIHHo=AA-A|C%Z$Dly*mHW-BG4@&^N>1%z}Bn(}1C&2C+l}2WU z!#piLZJJ2F&!{4ZAi~S0H2hv@2W%s5Sn0>GjUS0Ze zGs^C?Hv;AA*D7LrFtw_|;Z`w~J75aU=rNe*!Vs%4Scdc>%MgZjSgLkclDTs0{@8nx zj)TWF&!Q#6i5tfMFHU^oPJ7*rHTsWtVuRrX!aDeu3X>CGzspW+;G@Scn3KK{9rJ-G zZi3@$X`|GWob~Pox{=U!gsOyYBGkd?0mM%Ii}c%OjLEeyZ?nwhz3k_#jV97}+<&vk zMO~_%N%J-%0MC_El+w2vow{>eE1i1$qV)esW@2TLnOTEQO=ELqW+uJEomztzj6yQ= z*jcSOar`=Ma^iD$8r}{#aso1QpW(zlIFVas%FLMu*ol3dnNyjQUWbl3OB6ASrEjI& zyApB}y?cPx5xSC4mCyr(76Y9^gZuc*{FC~v9+^oGpzCF3_GUk4)tN|hxc_F6i@MZ! z(WUi#^uX_1jk=Il0R*H!3V2{J?j`_#!Wv+ii&OB3Cj})u!stqDY_!pz{=q~O`+g5K z8}f|c!nbLI%~`d9g4c#*u&c$x|J6$6`8#lWr8FFSi-@$de{BOa)0>!nXEgMlJ@%=t z5I~dvEG1K%R%+Qln1McNevKwVoBf$I(oV}a5BJ{#ll5hE0Ll72hp~(XRu_G}5^ta_ z+M10f6Uu;PE>1;6?nepcJxFZ7^HBmEl?aqXRHnCJ-dtfG zR>j(eS5d|pk-pTy7#E!yh_@paZN(tejk&!<8gnfQFy^0lumod11D3h?G#HaEjF~Kq z$uNvr0SRHuE^0WWi(Yw?W7R;$T#GXD8l_8{K*i}dQmX-xgsJ>C&we3{mHxjl_^V=R z@JA@X;G;LN!GqY~;V^hFN{C(^0HXJI0vx>;AukMW(}KaBU<0-)2#kU!=>%}vLw8*C z28voI^0{*;?exgXuqtee=;`;tSFrO@R&^v9+7?i*$f~DDRT z3Li5-&Rpz%m{phN2 zK%6zna2*Up;K^VCevE#cyWUDnbM!V{P#z}2avl_s!sSlu$+d)ez%m!lhs!QFiEjOg z*myCK0K0s&P<d3th99Bsp8FcnRvr!s?o$`Y)*eIwt<_w|tts5vQndCaN@(pP zYR2!pfB?64BjiPEAF$@&w_O|eqcxv6OMH;ZsNA>Y<7{C*e}kuGi|g)dNAf zoW7qAkyvan>Zm|Fjr&mvCcnE5!0+q;?Ckt2gvouO1}0BnTg59wgC9jbVQv$f7Tk|v zpjAC{K3N-c^#*Y}IE<^)?I6+7qf>^rvS0o4ZU@OSqz~N=KE4Qn(04Zfcv;c|n{MgE z--i7!PMpx&LFokD4t|qoa^hbvu@mBU@BnktH=^fX5k=#6upK!YxE*v58n_+&iL~IH zp@mKNpVV)mw}VfzpFy{SpK|{N-45<&65kHq&RtEngR)Z}9nwmt{_367i94vk?V#+` z8gyz0jAJ7+BVXiBHQx?OC%zioiW7g*y%BB)r4w{JI1A@xh7;*8uoL2Ta5QuHc5sj= z8n=ThA!oWBEG9H?JD3HumD|Bz?Y9$m2V5U=JJ^Z+47weh#Qhg^J2+Hysp)pGZ;qU# zyP|+edaw_`pHK-bGaqGISGYngn*c&XHd%_Yf9Ghbl|!SQyzV=rieu^ zeRVD0CPFP158ND9j1u>aBYAkNJk2eSz3Hw_+>5N=hx+=xWQEOLmA+c7VkPRq?LtSQ zyQ*k4z3jT$-HRLYa?3uxhTa?|z_R0R4#oQH!tp8A=LS6g@oxDPSGRZl0S5lr@M4OW zSH>w`KRJWNu3JnRpYFz_O+PsZ1X`an7X+KSrQiMeVYklN~FgmB3P1KV?{J4*dfa{JSh_Cg zhTiIag!!sPXsT0xVf_S@iVHwz0@mPOXxNKKBcxxg^D^{RQyW!Hr!DOUNmArnPZaNK zxTh1vs$C8*(+<*JM6{gYKv!^)o>+1V2Yo{G$ZB$CRml6xF>Ah#A?s~L6fAG`YFJlW zO<()_9iC`x37G~8}$K(1t z!a5t(k)Q-bSeXECzuY6jO8P0R1pk<@QVR&{deVp_BR8;abed1OBF{pdXk2H}&TJ$m zhuZ4)ko+C4E}(|6X(lZ^R+s=+n|BLWNk6$t@Q-noTA&Ofjc90K-@jG{t%F&$)ycU2 zjJgogp~>KcGE5qR?<&lCHTjLm0F+-B8^BBaswIk-ds}#y|~k0@yx!HnbjLu z)b`apo|rZQ^YIi0b8qPV*Xo>2WZZgQ34PUsz{RHXOfELmu#3#1K~jrOG`!i@>wod) zgx$VWZ#H{F2)sGf>`e#Z4Y9bxVwqXJl|^kVu}LsE2tkainQbGqYp|67}wbcr)zhkcGNB&ejLqN6|}l zcsG%8`XWvUTpY+=$enJtr`Sbi9k+;ETl3~uQ|*KudsHiY%P6-bguok5rm4ebZDntW z#T_=8nbi&!wT%{7EMdOtI*JA|>{8U>v!812S5QibLdQScwLrh|^VFn{2n<2v*b4my73&XVU%w?SMSa(qIj zha7Tz^90f4AxHHGP*Yp&f(yT6J}RXMR6RpL%tuT>FV8?*G|iKKnvV$nG4m0%K+`;F z^zu!Cm{r8X`Zo^1Aa6AtPt{g;hsf`6ZW*e>IRZEoqNhAQR>_ZExe2`8iT-Cf@vwFK z7F5wGwGC5&QWVG#iUPquCJNMMV-`~Nc$4b(QqBnb&=b!;ZcJ@>UvzlglEs`M@;TJZ zX)@E?C?M13F5yhO1z2W22_nf~yMtIysOG?mNj+;CEwVVik%dx%L35Re(Jl0Z~lfDtBia$=~jxioa3v0TF%FqWPZ!>XO0Fx))FJd^p@j$9b4(t zKWE`f4}Qz>tVyQK9JrZ0!@KjxWoBY)PW);&ov?j%`o5sI99K;=IZ^yDJ0TuxEn*Ho z)|w}Z#$&C!A!mB5bt9pH$69NF{x2Jr6Slv@t3APQIgV#PgC1*@bN>ZB)>E zT(_M3C!>JLe|{-|KjC&@nfW`!7g1J z=zZpNEG*tFVtEOCyAW@~`}k4P$Z8UZ@m~``uG!w?9Itls!pT)@8`9giGAjR^^`bh1 zj9X8}VfiEkOYJ@5O=*4O0|8dxUPOAcwB29Jo7rY>2!S{6q?^2X{(km`SbQ(CgPHsk z5gj&^hblj?6dj5k&Gm_YEf-7KMM^<*7$I=+hjAtsKff=)3UnA%fH!*+{#xEFGkZe_ zyh$~C(_VN(Ebg#qX5zWB-{!*?OlU8LIM5KITf#{s&1b(0BxM*;`0O`dQhMqXdZ3N( zKN#p*LLH2@xHI_G5qjcw2J3K($NtgQP24K(z86jz&*gRMS7f^UvQ|L$ZKlpz%{xC) zeUBg^aE8W5m^2TsLfKMy^rvs|@nnXOTpQO)&iqLm34GB@%vb5y_znJftSR@uyoW*n zdSD|VXR4Rmw&KK}w2|0kII#&%3^qH_LpZUC^Sv{3us!tKZW5`F7nkH<{;5qXKK)4@ zgB>1O#ydIx;OsG`jyd~oNe^_4bYf6zPW)=eoVe}IKEnxmap~4GOio<+Pj*7=@T!@^ zJ3Px-B!q9N_|iAf9I^*;Vu!bx&@F`W4sR==cN=IOp*I@n0YcXT{a^NfCvMA2`@aov ztzJ$(<6$94xM49!<=neL--THqNOdNuse(jd(shjxX<^zW_8%>Gi9JxjE^$~MfIndw zu+02@VwZS5#sqeW8+d5QU1BT*#4hn1vM*$pxbPp?CI08Gz%DTjT_$&l{0@y6Q@wb~ zqn%`4OzOTPF?0Bf>exKmB3OPlc9p&B#KeeSp$Pes%TzRS-0l(Yarbk}_qe^Y-pA`v zc&&f2`MWM>jFKJ?L;)U;rx*VG36}%Q%-=6O-iomVk9W|J@;hH5;H5*64iFMvFQCRl zye@>p;%)B5TMMB`p2ECxx@>S43TW`nTy8Ld8+;9NIE9&jCeUCtwd8mD2ylbZk;;)79 zk0H=6y$V*fWKkvg6FL0b)s}BX6*Gms= zhGy}r7~U*t5elpAGR8=6$~cM+*C;o@VFe<>H~`}SlRQhGI<>u7dPW9L8*tfJD1uaS_y z{WY``w`pB#II$K^oHNYSL*s8}=hkxfoWUGyLw!7oXoOx)eBQ(J-3=%eMBzRBG71bR z3v~)@U~&G>=x^V&pRiGfeSmL0O$+EnYzg=)e9>g2{EdPDbr^T4__>k*wJTF+AuLAq z7$(ib>}l&glERt3(U@}%+gs`VKWQVlNgty4PC1_c4>9$=`&JIhCQ}N_sixOo%!$p0 z6WDwYz7Fr#8{I!8e%wwnure;-r&rNRgQ5hPTo&zq+|SacQ~F7?!lT z-7(1I)5ABjPy0+ABj=WDZLK)*tJ!tpcIbF3Sx%63aN_5ICMUkUiJhq9j`@T+ye;2I zvqT?wD7NLi5ARGUZ_8_l8)Kln4_AP;vJd~0`mSC+4yc#&$+PTh(5Cw!jD}PVrVU-{ zfFPMS-On*8-L&c6K0xjWH=}?Z;cj}n%b#FH05kIsVsnHYVLe7Mc7&htV3wQiTOcl$ z-H*taknQJJ8)#cZU4>t(7jqRoHpS1fj@k+>qGBq9usv(T?~~Owq(KkOdi3pa;|JM} zl1%91J7~Gs(DLz(tmVZyoC^(~pn_?W2hnp4(IJMP+ zPP=-zGrAR?Z`P;u6F&Z^H%S4qxxwvEZbKvV>>AQ-txEq?J$QF$ZTcFyyOye;4(=ZK zS8?<&dj@~GKd4uCo+hKT1qDQD-?rl%1e(i-8otZ}j4h3x*=thi>xL z4NO0jR!1)l6uc(>S&T1TJAbz96#trp_@N@DqC0&ZTYi1L6}f|N;hrk+V-4c_IP}A$ z_&!b(I^DbFC|&url#u%+Up2F88)jqd59jxFVs5QjgQw1)IVps;a1J5A0VH1Mfor`X z``dT0Cv2&#j)grw{iPd1(BW70A@}8-#;WT;!}mal6}WFYOhKt_m=Ew*@}|An8$#es zO>dJoo3CYWh{cQN-OS|g2BE_i(Ud2?bYyhy#dz!GujFDsc9AjQ}w}Pe=To@nY|$d-o%)_XW?Pd2`rx~;;mx>m}btSI()C}k`y;l_+B|x zQid25&JEP+Zcu1*Mta&Blm(Ka7!+<2GGAXsnt%IE_KC}!QnJ-}|B*3qt9=)lD!#jj zV3`;%kXJtWy+t$Q5y9XH1=ZLf7#ye|#wCKm@d{$(2?mEPh%uEJx3M{Xn?+2p%ix2t z2BtQ(lDvP?EeDRGXg$O3V>PmMT~AZCuD(*z14mJE>C5@C6(@f6cJYLbK>P%S?gSl0 zz1YL##M3@@LL5as&Kw*l`EAR1)}cqBa_YSLhgN+0lR5^EK*d6rz7anC*xlsQ7gw-P z=0~9V{QrF`PW(w7v&nFRPKgGXo#-l@5RX7RGKU|5exFL7(o1gAryuCKLT$r004>h? zzuG@1?uY^>K+?cjWFY-IO$~gU*3HyWqrKcwHN1Iz#k`bt5l(ez&8a`BzxEkUt^Q6r zMW;y1yPBLTSj$d{N2Cjx!;eU3iz1F8#7_XA&u)jPIF8{n+^Y%Y;}{&6);6p*(9MKi zXrO#{v(P~6h&#hT`RryK(EsJ^=EUVgJr*6B>5&KZ^7y9tZ-nv@uTJXC84>ibHA#>* zn<|D2(pD4cJ2(toxV1La*9(&Q+~;K`na_Rpxa7_6Rupja`yyVo!_BYOg>HWPh@0PQ zF)iZe_eP!_<+;yY5EnPTjpRkhxzG2Po3=c&zD253hZ(EfNG`96l4~AgcZf2=p zyjv=84Y`dKzd_EA{g`XK1pc^4=CwZlsdAWFdbpM8=g)cOM?ZB-79$<7nhieC*)%}+ zt&#M=x=o^R;{I>`T2A04aOngN#0JNiov;cg#7p4EI+1(nSO{%LM3LT*=9jrfl3d^= z@ZN+5UIOpLXp0-#U!7r3*oOAFm%!hvqRt9>3EaVX9`xHr-*YthCGZY3j(L5Qo%+^S zt#s z`!DDv@VTN(O-~v!JIEDhJPKHG=9~%OPq+zKX8s7V;!H^473UlPX$huwjTb$U0Ad1u_rH~9&7Q3iB^zW{ka2l(s445 zk{xK?u^afw&&dd!jKIkVoQ%N92%L<-$q1Z`z{v=ljKIkVoQ%N92%L<-{~ZBUv9Qnx zm!cFD7gS`G<`v|XD13Ew8ReQbYswUbF0Rs&g5nBKnX972HGbmw=~8t@nJ1^DIJcmp zprqK9mt9cUqr69XZ&!ACxu=Y1BV1j3ly~jz%Bw8S3E(4oh?qf|9a=isi1+Le#)zg^bLJ(=#W|oMTio1fZqTBMj{`+Az(vVuhC7S%GJXM_S9igzE7Wl~ybdR>aOi2eV**$GHRhkL=gK zXf8#$u%OuE;!w)yx_Xq)bERiyPR|_S()}*Yt|;&nSGXpQgJ_qIbNdzH%NGBO9zAj< zEsBy_<|(f%tS~|^Q6v0m6d)s7!M;t;NS`Kxw6vfi-<4f#*ev>r`YWTPyyA~YFis>H z`!226!?DgTEc0aNE_aE{Q$j=)Qx_?LZl|;=))SG;R_6BTHz0SOi<8DRiaW{3BtoeV z=ra*xt^oOYQ9s<%9Y~EvT{#W0Y-?BsVrOM zDb88W!{)c=1#1h*3eJl`lwZ@RE!a82wa8Q9D)ua^aLGgx8T8xR`@`~3<}>F^adwf1 zXBa)PVONO#9_oYa3Xg6-oO0=1p^t`^{LapWoNNnKxH-KZ>A*agTar^zQs%m_(o^XX zsszQj zc&9lNvJ z=?3*z3xB9heM()37us7vkb2n^R99+lULgX4HNL0-I{+?ZFQYH3@jZ{JR)~Q zzB0BrTbWw0sM1rYOsOm=S0TWMo$sifgu_s(3O)dqiPHcG;rJBHC7@Dm}2VN>i|b zEbrMW!Iay*{ga#vCIGHic}bROmtxtG+dkvO)|<*rfUwuE+;si>7DwaFd5 zz_OO0T6vZ85?VZ00;W_>t}Qj-;`lYy5=gqm3g`N zfJxMb?l*F%99yQ+l5)Of6!$PAl-@2eI7TQ%CAdctQZN+vH~LMT5D>FU$GJUnNA}3g z!?xp$0fP$#$k&GvnIn@Th-8du8sIF%^MOnsQ<|l@3QLw^O{>VqJ&7CvsYums6rkLK zMFkZ!1Q6o^#d=6_y9YxdJC513_eoQF^gA_I3H0;;DNOMQPz?u7B-zJ32Ils_3s&M& zgI9$9HCB}8j1jQ@47H9|n9bx4AhMxB16B z_~&Z??<;6-&Hz-4o104k&nm%J^#ET5+zgn5*Q4tIn*a|3{<{qIt%|a&9Q6U;0n7kg zSBd(74=zQ0z>Ro~Yct?4%TXWj+KW&h@C(4GFh!YgadUGj;5~rj0FU6+ghIfXc*W*Q zKp)@(fZG9I0(=MXFyK(Ui5ia=3ibdF0<6Rz-|H-URqG;6A|0ea+2> z05<|g;TzE}0`>;H=y|*n0(i#@@EdUDi|`xpQ^3uDkH3p{0qGMjfTCWMsi@0h)s9hi z$2#-{(ecKO;>d1p?nyG^?6Cy8;}2hPQ`XIIZeDD#zx0pZaK>tZndjug83^zeh@h@G>AXI;NJ@Vo}A|9htM~H`uAG( z`rARyT-4lrE@B_xXNKwg_d)hv(A<1xkp5AI{$t?ZUx+>hH0oRaM%CHAWYlX{ggy)6 zUv2PD2j2(&`XK%~gMU7?i`=zRoDBbeG1^}N{wK)gl|l8F8TD@ke++UvJBWY2!QT%4 zrQkma7|{Qyq5pl*+ha_03TnT-g%l*C$}#X0@ZQvSLHfTo^e3ZU1NifU^v^N$pALS{ zB`wFNJ#?NA{>|XeGV4c~c+0?h9lQlC@U9219mZ-Xk8+R3{ao-SQ~v5Po#MA%8CGSp zj<6fHAAsDdRn5%{&H63#41N>%HQ*05^V6%WMUbG_v`5ap4L;3RMmvREU2%al4EzT0 z@fKl#KU?sLZt$rHBf6w68gZ}~e-vseLH~0$1&I5Qcw>7>C{EP82a5Ck9?t?Xs zbHD}C81R?kE#qu6A91wKU=fZ(E@U3ZoVbztOxH1q|0A=F`qJVei`J*p5cn6$6n z4-$rVQTUT6VNVH%NH|`?b0o}@aEXMMOL&8XcT4z$gnK1?OTy13{6WI-uCjdzdrCM& z!toNGBVnF|OC%JvTfe$L5+YuntyaQUBz#@M0}_5H;inRQ zDdAxWn?C0~33ZDmoORX+SL%dmv(jAs2lXA$x4&yZzX5~#4eK{p zX@xbse?Q5ZwGd~)m9F7^2legOr++15{Z|d>*S8-ur3pF?Cl$rQt%)JGyqjqH%oyE- zU?}9(w))iaG=ArbJ|FUNi71<|LVk}|m%r&O!Hu71mI{>r(}pG|m5u501L$4SC9@^V z>{BqmSl((k0y5zaJIxm1VfKFlbajNQj#n|wg*2Wd~gz#9st8XjS4K1m{3lf5#xSXr-wy zY@j_4K(Rgz!@`C{T#2&7`aK#68_Gzmbq;ZcG1A`Jg*d|*aalirwy+V5q*^I)!bURE z&)N<~g`LjGFl#n(MlmwRnobJFFygj;3^T&UGLm7PMaY?q%(l|^hr-4sP6cg&^>w%# zHa#c+gVZ@hjD{&gU?&p~A*h#Gpgzb(6NwZo4>s~bESQtxEu~rNCjvPkX zTem}jBbQBZSwBZbhli2w*6zf~W3g1lLDui5rfH5)l{R6KT`q;vA3%!y7Lt)&9k+oK z`689Ou@{QH3KEgstyC|HBvI?sp=iA~(YaPHQ?1^z)^JEf_OaR_6h)G4QX|K;fj7le zYYbh|lRqXI)-c||bZ&P-6ek@g`YH&rv8O0@+P_A+t)oa;zsM;x-#u+8o7$1OOemY? zU^*+Cp2FG4%3jo!ou=5YBR4awSAf*>I@An*+#2&Kkg!HvPRRrJKPafiMG3PYCaG!V z6}d{=L8|sT62+obX*9kp+8T|IswMQA=roF=OcI``sf7g<+%d}{BXrmbZLz~C&9<7++z1qbL@6)bic)#`l z!w0li89t~TVfe5Xfla1G+pL|&@Mz+hZ1+!z>lptz@jiyf68AFvPhwYWS}ocyiSIMs zoY)L_s-~!kJ$u8_=;tr-GnQ-vN3S&^bh>f}l@+ z9`sQ_FC;n@1bxC5(7PZEUZPV$&_{Jc=&5t>AUgLl+cWF~$WsPAMRZQ34!H$Olr5Ko zM%~0T!BA{2^m6!zmMH4+FR21ul(27b?bUk%F+Z`iB}f9)nL;4?L1aUCUJRK-e=5z$ zn2N%_MlMA^O3VV*N&PLD(N7Y!unk#6y)US?MX)Fwi-sFyN`^qnseM5bm$zYn(uceV zueU~1&QZRoWD{SoEx{+;W{svropMNOPbBRhTVu#?N-2}?w#TSS&oJS-UWMDkf<;53 ze^?BepdocszL1kbAS@Qd@G#rg;73u}b{2TyX+j$%X=sg(LlDvztdzH^8?{2cOP&ND zezs6P3zz!NB-=-cuIV@f$Qc&OZgnhbE73%>@Gi9yYU1|wl6 zy#6j_GOn};lO>@d(f_7iSrJX6m;M5LBum%|#3T9(m>YgcJdJz$GfTvVHKKWo^OPu_ zU7fw6c@}l{jpo_TIV6f_Tj$UyO6Ty{u!{gJ&f!sQkXqrfwr9{dp)?T@q=|RXo}-;-MDg4RNE3<$kmqdY*eIT}oo7Yy zob4PR#dEfELKM&0PInZ~+0IE(G#o6>$x%F4JEunRT@ z@m%ek5yf-0b7mCH)$ujaNwEcRFy4vnQgnx?`=hYO!b{K59i21{DAsG%AiBwngelfR zE?}MPBn`3RQYE@GZ~0PVN-8Uq=oChJ$K>EnBihACKkF7mKe`JegRGZPXLU=U1$dbC zAgq6I9o^9iuhQ61UO=Kftt&uIUXS5()G`)aIZJg#hsEIO z4p}^h$TVs@DKmYRQAs*|r4T1Hs^F)>R^eT$24-AQIE2NJEq!$u-wvdjFmW``a!hI51un!)^Iz_$H zNPx|!5_Sv}iigHwyE2NW_nE}!xsUu86KTKxl*;c~oVG3$8;^+1MI=f4cp0GnMO5MM z&aLuQD}Ibkq+36Sq;?FFe?NtamTP7^mxJ+dlq0MYXo|HP({ z3=yJF+XCeu(PWb4nnIXOz3HI43RXf>qozb1gu>1xF!2Tw>?ZA4k1~DKTj`#h?YNKDILY_>?8E?D-0;A zw+_L%0{gtwWmYSUYj{+MD=F`WD@w+N7+YlA;xs|#7bRHBK3z*jSD{7p-~o^$tObt< zaTh&^pCfxPH}S}+f=nA~`fvw(cja<<&TC7pa|erFVEyE1v=T)ow8!M8 zq1b*fY2pCPJZfrhp>w82b5H6Zfn{*VFGrOK>oc2$s>Fe* zqR`ezIb`He-C);eNUUKJLke zLS)}H(gW(o4uE3B0nn_>m2kwOEJ2F{YA;o|pbU6*q9}z87`Y1X2!ZJsFjbafl^Ahq zbdDoNoEpW5Q==GhY7}GPQ=`cAc^JBB@eiP~^A=pr6~{<1;utBCj*-GPBvGzM(lJul zO&z&>y$9u+lc-wc--=Pbqca&7aTFKlm$;xAI%9GY;S`50THSSuqD+F@v%_p{tf!&S z?)1?JOWQcA*Y54kD91&TfMTb6W?PJ%lq>dsodG1?<^(59X-n$PLotDR*s4VCfmYhJ zfYfo_G|Z{tk+D|+v7euV`7uhIN!rhx1;iOc6&*_ChvR@nTl0WLz6=}ewxqkMKA(I! z`aAj{{&qU~atxFEz2Xl97IPI{9*(&d4x(HgQHVGR96PUyd=1xb1ZE~2r;{&-o2@Rj)5(`(A|n-cI{9);;&?2x)5(`(YTL`v_G&wwd^x7Y z_<>wzA4uj*cVs|MmHkPob9T%EAZzV(^5vN0+zWwqb~^cT%x$+AoDFt5`Es0}Q~_k8 zeLpFf$L4IZ)5(`(egtLaX8S1OWF;(z*j788d^r}dZ8df}`Eo3DtO9M15=kdt5q9p9 zIkf6IdPNVVldp)ebfKQ&EFh~m3qYhpgQ0Zt72%;0oqR>mq7y+;VQJddvviyi@oy+~ z5+U+BWK86&wv;f=4J1!pf94GEBX6WLo>Lr}I1c*=h@FnZa3jrW*@KS5w9$;i^QJq*#9ET;qc~K`ln#PPG>WpUuX-LOm+63EIqK-HYn`qRT9!F(aCxa1(f>BAw zVUctkrk!o0e2esA^hI5s_#uRcIh=enwi)!ZoSm#U0@~?l%-OjujWWefM`O+uM#7YK zHzH2Xj;SQxj*iBhE?Wfvn&G3dNIDvGcCqGz){&3Kq6fwv1Y)P7vFO3wsI1uOXe@dN zBMv2EH)xS`G!{M7O687xG!~QSC_`g*IvR^?w$KzpU52Cw@?&v(2>tX^avFKbj!Das(6{9_jbhp#dSacqX zr79ds+U9a{sY>KT%=NJyJJR%YUQ|5#Bz71de72+Ws@M?@>h*SX#1uO+inD^#vkwTY zVW<*GwPHti{t-%@L?4zK%O_wZRC5ejnx1?Nt_Y3e9ZYA96HFQ}(KVi;MA8XZtlK)8 zl=X|{6EJd5D4W`mdPXRl=3qK2o1Vf6$mYGID?1Hi2A;)cSbZQduR-UfC`oi8rr|{F zd(a|&#$_B078>5FaZw`TfX_XjPQ>DIA~tdo_7`ocG#X--HfuB*HkLM5NV;E}&HQy* zIm2tTbquf7?q+zMww>X6?F)t*H0xxlf3wzs;ceOwhPP{(4F9gJVR(o3Plo@{_Ap!RSCIVr}_IY%S1{4n&L!lEG(UHv;DaASy@( zABxQZUPLvhAQ^lrHWc{f#Gry?@UfT|vHCkPs2~}9E=FCxl^ERj!YV!(dkk{>i9rQ% zg3yLf#;Ci#(HVkki5sK6jTP4t=ht3jc(vBRaGgePl3L=f(K?<(@LKJ3hSzDc8D6hd zFkG*#V|au1Aj2EAR~T;4K4W;3c7);0TKjWJ&n?<$hPP_xF}zKyW_Y`H2g8lpR)%+K z?=rkg`!~aXXzlR8#}aq9Hj3fB+Cqj8Xlofhq&>)Rv-Uj0N3}+Vk7DQGJHYX!0<)wDTXg;?=pN@JHqf4E&6<_ z|BBX!;j7vd2`^w+r(Gf8y$ttj`y~8=;cHqrwvU#$*R)=MiE)~mn8Af8HL;KjPBrlw zE_76*$(O{q&T2FTJ29?{8ck77jO(sOQ+N~OQq^ctJxz@k)lXHUsd^G^iQ|W;9Y!Ge z(htwXo=;2HPRA6hjjtSus-v8farc?J6lF(Zc2AV;^TvRl<6KGkI-D4Zp4dKJ6=l7K zZ3_OZiSv=p%e)v|k4@dgW2dltf_n_Kw_m#t_wY>-7upRhnaD9dZ>lYGN-n~dj+zIZ3h6L+~pKu9u zTxX|$Aao~KFX?RS186~sPs;-P2K!4>@P;i|2X(eeEh_V_?f~|ku@@yP%J=gS;4qjS zi9ZpS`NIc-{iMAu;&K|~)f9uJIP(!cOX9598K7lxGoRbO1&uWe_28e`f#eqS!QFb| z*^Xz%APA6GiKrx9(-9VqP&*w)(*rL!6D#NvFfEDSbr=XZVND5Ex{2zAxIypodIrkp zsx^>&m=p{mbB2=-Nnw4!nyhv?3dBjw_MQusb_-SePcWOjs;3GhD=M@vtWetJsrKd5 z1-m(z9p0-w^cAaiFVdHS*gYCGM^kmaj3v{>JL-^Fu5V}#dzw5&04?EEQB6vNr)r!uxfv~ObESh z2yt^15G7pg15Hn>_WX-P{Jth3H=0wD9$5_56txSv>LhyjLqyrB+E1^-VKE3D(E-xz z=NE$YoN6BpJrvrJ#3DUHS+=JnPigmpYX4W9s2YADmaKNKsCIv(AS}`=DBX5pEK;8- zmiB|SsnB6*KSa9@`D$rDRC@?8X~w0CG-GLgCbH2UT47^DO>U%mz-9zjVG~$wS+tV+eKM%rpVE+;<5+6;v^X-QxW5*PW zb4&cOZZV)@x19p^_zqt}n;LiKXdoAC>?Fj-LUam=zXH`Nm6X^N%nV8H4zCj>cHvMU z6FSh%jI3MIrzcK)Ah{BMYmK^8Qeu;+?!*oUsBYXv=-#AN4_tr;Sl~SXf$bztUaM5% zEt?YCxe{V$rEu5Bj~D>tR{Nu?@s$LKd}UN%>#3F!w`LM#o>ij0WnOSb1JOpuzEKH77{^G<1^4f9qzCfPRINQaxT^V z02V8P^G|!He7xELYL(7WKPEQ!Q-}N7z5{Q*0O1y}?+zBp`D`Y1KVe^u?oyxBd7_gP z=TH#b&GE?H0nXGLkVdh|i{HXr$MH#C=@jv?Bf!aP>|;{!9GEn;#hRidb);{|(9MOQaD2T1TkH&@{Oy;Bsdy*lO$x-GEf^5sm7+5t4EL#Qd53^k}S>RIvtsdr3h8#FdHo zMzE4x(|CzsegMWN1~cv-RP(tjmI>z1U?_2V&A3IUf%(EVskR*$oeXB|bHu#Z`5uC) z#`VW?lKd*|O-W)b{w5fbac$sy@*4{i1#>CHb>P1cSo31&pTyOq!OHzr1n0V7>;%fdG?IJ^7n`d4l;37~cn&*OS^G zPshy;&1-a5*A{;wmOK)ZmpMC7Kg7{Gn*7VAxk6$Hq{ix!qG$Wy>(0sH>O7~Amlm*{X z?ViO#kXE3p3_+8jEcmW!-#1GL-UFfShG3|nEd3$&eq)66n~?nMcxlBJ-4TX3x1{A`(nh9Usc_(V!v&b5bO$}0fwN-P!{ZCv1ed&NE#t!*ju0e88(b-;jiMP z4j8x$TOmuQg&LilTRP=vbc}B4=$*@q{ z&9F%Ol;MS%f+V$cD${y0tk5Pftkm)uF44RUmuVXrF4vx9xJui@uu6N2;Tr7_!)ncr z3Dwf+Z(0(=wOT)hKJ6Taer+MctF>i-6L6BObl#-aBxBP`+w{(lsQhp%oc7M0KTz%3 zQarN2xc?S^>h-9iS|O_>MPjn-e80-OMkg_oXdB(RM&*5?sD4Pb*I@)u^}(nVsIC&K zBt1+GZd09fa@vJ9-klXoO&@H94PmM(8VskMNavvzdwD*x4gxDl=q4D1o3CQ9CRprW zV_qUtHW;iV+5mQbNaY=165UI5eq7}zBS{arfV`?YXxpoJ9*)Nj^jvl984yYJrQ+lw z<(%OtccgzE*O9U zJqjJ|l44MPBaY}|o1T(Cpe?owYSdD6U&^KS_vT`!1@6Q6Q+JV(EF0O36i=Do{w&Bw z?#A4ga_s=h^{6>$Eai54Zv^paRQZUiQ9&90h!dPG_N-ED_CT;<7iz5~g;Ww=cbo`w zVpIMZeFjLw2}#*xnXwe_kpk~e6@H=$tj~VWII!=FVnnfzKO5Lf@$Vp>c$Il3keAz% zrH(}ugV?UOj0EW&d-TQl@f|2yMasB!a!%>`X)mxpwEK}F*MfDM!DerJbL~&;=SGQO zYytae5_t*c;D&7xDmU1Z`w8yr;Jl+NP%QZzW6qAEncvpUrD>~(00$jZ?LQ#f*Gd7r;JQ-=Nsn5+8d+FKW&L;^rF?k0J zO;T?@Pgqz9Mzv9WKgCqEFsLtf|LS-RBLM8%brGdgSr(qNsRtG)$|E3d*BP?fCrE&^ zRTp-RuY&WhAg)R?wh~LDJ!MfhP9rBtBu}isMn$Ess=oyT94;(}_+x(s^E~w>WWal1 z_5h<7G1-|;9T1;vH4HHv4dS>!tI_ z!}%H_KN(`&U>6m8`ILv$MhAKb#);iKuU_0IT_%kNf2(T8@EP6`e;3u?rEXh{GYx~! zhH~V)>?j2PZM6aUx7^@!i7ra)>!*QVJT8awQwYDWPF#Rne?yo{bW!-;IHlBaS%x9} zv04VlUN?llgc$pv2xVWWouhH)WANEC_MBJR6ztu+{S{tmJA{nbQ9sXe|F$ukQs50OUj;>N5}(qyX&BKnemgF^@m-G@-Se}`f&Dq$xNQntcO=){tJXpeI#lm z8R>b=Isu%l0(3_BOSLd37wJy+8pCvJ8x|0XfiT)bl8a6z*A{cjbn9an*oPon4EPBi zjwZ{d=WW3M()_>L5TAb{%;UhIBb)PQn_F0 z7Qb~xR-fbl4}xWh1Xwq$dU!fgXAOb%)*(^6=Sa*z*LdO6an*ej+EH~S*(&6W* zkEH;uNPxNKm78Z+KM70bCjqoI0p_Y#?r_6;X@Ue_0MMlgFxS0uD-0`&Dr3XD1E6~o zV6J@SjyJ50$eZ9_1N1@y%n@hqRKpsJyb1mYprbxGVVVwa5o`vKKJxb{_CHzstdIRtq0K3hDD;cw9gY*f*>S$IJZdyC+gG?^z<^IO7 z7O|e!U<3%zdjyM2#iCyBrqRRM+n8L`%Y6$q+gsv9(ChZbU*Jk9#9Dst#_|CPg1;Kp zQ%fY`Bp}ZrL1L7|b--N98~~5QY}W$1DV3$b=x<($&VZSnhW~lQNbnFVg}EiBbqz)u z#Q72aw|Y2=1dlVV4KrjWj|228f~C20Au)HRX-kmiH{>an!xEat>sk`hudR2eH`i0 z1kPU58j4<&-s<~+U+&{bZ*?C%?3Jc95?+ircLV;gk0a#~IJcSBSKB4dOMw3=1xNOB zv_i!c*bkUi)+UK<3`d*CUzX7CkX*#WrZsJ{L>vL6F)4^H&TGgTE{)$|4)vyl?i{m_R?eetnhZbiU)y+iVN1n{SP9H|R| zvo2s|!?RGJKLY-dk0W~tfpc=ent?`5oB;et4*rQcPS%&eJ||$UI6-1p0CR?qoun^; zcraj<&y}`Gx_&Yw17&j(y6xdrW>+>3k{ZC*z#a^ieb`sl*EbBeD-UkDz(nk~=rLG0X zTP$l}i^p$@Xm@PI6o{W# z)>bSpk?ku$`Y08#t0wfIwHf09j=}>Y@T4ApS^vCqr%mTig@Shspl&p?jGkdy(0cw< zna2d+&G)GUdtMZYcwErR1sU1b0co?3NcJwy#-Mfm@e=23q+XtaqYA`~E7|?-3R=a> z6y;$o! z%Tqz?bU1y|#Xz&*7<5V1CbD`bXuTVkB=tZ)fiVV_1 z)=6V!22TS04WC3*ptwjg71#wKYuy}){W&nx(5og@x4`aNg7G2iHFz8rdKl0reglbH zf+ZpAx0p>6`#4~3J_dHz5}X^dUcjJ>BxeKtx?_-h2xF1+Ik&n))-5qf@(|EpItGa- z1~0B)*N3dvF~ngm9|JuE2i&#fiTS9^<<5}xC)bG$1p0(ykO+Uli<`^Sp`P!;`kBje zpl|d^d_+}vmwq?Sg58D7f)e*s;9cqCCaf@_s{Tu%)dAr@p9ZS{;R?F(@2IMil1=D8BZo5?T0EO1~eYlN}cR`DRJb6BFXW_)9G%(8P1U+;L%RFB~KJ zOaf9h5jpUXD+fM%C4)~9bF0GEUoCh=V72=!DV1V=<^aApY>j}=VkYMTexb)r5zjbt z*MzNG-~b4|1)#gSfE&YBKMD)gc>@h%|!%tuVhS|ENIwkqo-;%h+q*hloU zPG)P_)|I&uJBT*b8~-llm(TWc``Fg^Y>8L~q^Uk)lAwIHl{?I~o{vbxRY2P4BPIzd z5Et0iS?JiQqrE^n;3IYwRA8^Rt;-il?7M*Zv+mf6c(#{&l5NE>m?zuUfb^k{m?S8l zZRMV7TW9W;hHh)IG9#IJ4Z1QeG=e-TI@`iNZx z71$BS`XVf`^-7c<|87+;5c3@C>vV}&45SG@;%5m#`D`n9q+`v1+hP98fmG)sCJ8DK zmpj(q+a=;IAYJ4mb`?}$uXn72F56py`A~Ok`D`zDt7C12xr_1x>0KW&Nl@-Y$ld2y z1smZ<;Z?r|QWR}k7M-MS^WgLU+=Gtw)&@mB{|8dJkH`|qod~)Aa;%+jbGIU49^h+z z9G{sx`VbrkMywl7me|{YdEgtcg%HV-OpRF8D*Gr%0R^0sqj) zNl21}eNM!>WwylDF$nCBe-|YrEnjwjvN++gtuhmWM}CV|vU(2J#6{UaYs+h-L9XX5QG$IzWO07om;iO~}{^sV_ppb(H60`c>Yk z#F2}?d6klHmLQmtv7rTz=Ky`$BTzEAW|CL+1Q?R+5BR@F;AgBfv3n|S&IibbjK9X; zfXEUkc2DIkXrCy7T(-#ff#c&C_y72d-b;fAx&d~<^nW;f-Cf=(VviJpGV_nCcu~Kf5+H>gg1DE?h6vN zt?f#|Pk#iPBk^M%vC>xn?!6NLlD+DYDZTO8ET!Ops^48AX+HC5BiB z`Sk9*1NUGrk33W)&v#S2jJV{mMQ#qqxR|U`LOEAhLZrmr5ki+_FK$z2Z zpC+(i9%ycXeCW4Hbg@q)K{u%S!vK+rE09vYz+X=W)e%+y6umB~o=#8+(A%p1FMvq( zu20psZrf(1;H~qfOPa5J8VPv)G5|=?YrLP&d@L~)6sY=h!zImVf|#Lt2y<>FAmDkb z9&D4O$9tqMJQf4}XjT89Q_^$Oy`-nhR00AXQ}uhdO8U!udI9g<)Y_mF%vJRrut8>f zw@0r?&`ec76Cg_ctVgN@RyQHnHLCtMXo*zs`&1INQq{FnB$YnFFYAjtLA6=c`@3~M zh#*nccSTtRyh+us!l0iSPWMRFPYLh6xpk{jutU`+=gC}aeR?u+;oDT*cIo%}^yH=l zK7o`4kEr^OAw4Os_UK*E1FC*~w#@pc9w}aBhs!DWk^Tid3W}?JqI;Sq6t1xK!8+LALz@#r5&wbi4N`2_?#OVy{ssWP9-JW@B;OJR2f#~XUESaw!-d-O^`fR-Bi-=F{* z%d-TDx1}U#fuZ+xsowXvDuHd#LP3k6|8tLAAJ*a3Tv-HYqoIG~f(8&I846Inq1&fQ zs<8w~y<7|zS8%qW|7N=cElV&IpwkWg7cQtZ!BBv982alj=z9r33@=5CD|pY) ze-1A|39s@Px?BbP9YbHVMZzEUxO(+X`nL>yJFJcLZ+fge*rHu^~n<@{LL=>1$>05|8lZ~|EmlC zzri~fEHd?qz7pPlYO4GKKF`#5^p^06gtKM1`VsJ1rv9Z%zlQK6{k%B{{2NXEDl}Ef zzq1Q}0k1Rl-@CSURTusOUSsMjD<%EIUHDhB-+eTw@4%u8)&7ddUkM1%gF$^CK$PgH zM~c2{9;luV>Jj)JQbnh^rFKEj2K7F!TPh?-8viFJgX*22{%_bKsb(ao1n8}xekq1u zM2;t@j>oX9;PasVGpxyw>f{8K0R1(nKLZe{E=f>bOTAek-GJUmb+1R|+LeIoA^kUi zlk`Q8RLa`BuB~1v$O!3qs29?I;?d)EDS{#)eKni#1}|M^dpbd)k}SIjZ#n>(w}lWz#a$% zY2u>v7D#busE1@Snn>i9xF~_+HbIi+kiO6D6^~EhN7pUl;lt+50>e)qA=_&Nou%U3Cbghobrk5LUF>Dip$RzHS>9 zNcTtei_jx6ry)e@T3ms2YDoXStN58jqTITofXorb3q3^QYG-n08m{W(vP5fU}pCvs08SWkp5SIDC}<&R4?xZ)tw3F$Apph*d;yPE-e0p)^* ziM%pFB|y)G^r`5WDPc!~ss`@7;JuLk!HJUU`~;N%y%W+u1Bg^NC#X88!>>a6d0CR` z@dT9seIC*e07R;{6I8EI8+KTKwnYAVAGwy#XN7|JqGy>u0)DUnZ#L z!v7as64tY7WnR7Kc%{Avg;D|nzCWz@S}!vkLpXDm2MGk$(}CX*)??^bDeDTKp6y$a z@aw`juTau&^XVo0{*|ErX;|Nj?t}CfdGty^fbI?J7XZW@Z}&)X${^fb!LP!4L8GL4 zDnTVcPlol80Fmm5Pn8oo9b)JI*2%`mMK0C6l(baya?ytnST5DPQpA@xm5px)ap=bl zkx5%nBmaa8?ta6qqb9mf95l)TEd^_p7bSE&uA6X}GJx(uqeS2t84|(1EdWq`8Xd84 z#$tIcO&&CA^Po|?QSjt38gkdC&4Whmri^>Qh=*#()F2NUwQhVZ0Od$RU7f-!nSgh!3qTSOIP%txw_j(3VU z$H`&bmS>H!s61dKfg`hUZXu(@VWT{Jq$^Hv6>)Ib=&cBODv7IF9yV&bhmBs!WU5{j zcUY2w5W692kcW-hIBb-}_xV`Vn9}?tE?GEi^xCCZFwA(ymPeet;l|&y<|Xy8tq<>ysypXqo@8<&h7DYRe-ZOx5O*53_H~ zgHi|EITvFPqYfPr<{n-RVR}CqKA$7QX>NQS!g=>2(fKPJ(9oLx=M|!jVotS>S&A*F zC4YuC6#rM1ZtU|qY^~jhBmuj6In;de zKsR{thLjc2k9c1X3O1`Qg zoWjuYl~=FBJ>SqCI-&A9+~-`lnkC;EU5S#1S8fJi*VMZ~ka$gc&}EQCtduVdHelwn z7|WzjqoJ~0Vfqv?exrZQ20ii}|p;(Das;X%|Af(yBzoM)7W z(ArI{9bBdv*1B4W_X2QVBYsSvigjqC{9o{c=H=+ShRrgpBa0-;zkz1rUZR=?WF0o& zuuewrGzP>204g9@$Rxqb468rDtm}yY&Gx{uHJJ6xVU=P1&k)I?2Ji+CN0H!lhIKZ; zWU&XJb3Cxig4^>Sn`QULv!60T^!) zpHfSF^WMF{X)~<3c{1NG2}fNd@if0r(YIoEAMAyt?+5r$;w168l)BzwSk0A^&lJGt zb>XuPPGi`qhV{%~MPY5N2YjQ4qYP?+C9?JhZP*~6LMahyV&VB{ng{V0=0V5fn+IR| zya^2MAd{Zp=$l6+4EPsF{j~>C`x5M#$BAQ-%;V;$#5)SyuZW*3P+jv_N>tB0Dli8i z%77)PfBYq?ZyrT3*8&hv1ZX0t8ES^nWG^i(!#v5bt z(7vLAtY;8eYw>LAqQN3^fzqP@IXsHLIFS#hJ8mNC5WN?Y!VM6qII9;&c;P38V)t^O zCyy14ybNG)1~MqARMU9s*}w6ZP9wIfVUE&*1o#hoQ+~ zDT^<$g3qDmO74}!JS9!#*vy6fov>fYksnV^lcPJqJ$Mr;x#UGTIOS<-g2WZ*QqsL4 zVLV|?!ZL_Cj83RCeiY`x@mnH-#q?y_XQ znub8hMAs)9En_O9N=WGIlpVmDDzSKiTbD7pL=AEsumsghA?3qBvcv2iKn;(ZXOP- zO}g^~gv?^yF))MoQPO`%RyiY;MW6y)uua-BP1)HZkLc&A_bjNApK3Uddf!- z0tHUSxU{5IcTPe`1|OutgMTRke5R}p9+4;K9KvEnwcD|BAZ!=b&ZG0Bm@KhkUorup z(?l)vG`)meirroS(3Jwj1NM?ZuS^DLonXi__mUYNB*Pbk3Gx`eB&y(xGXTnzA7Z%A zC-W;-WttMA=d=&h0QC#O<+mOe#m>z{>Q0gEr#`)?IWob!s&Eq}X9$UT#9tzBIX$&+ zq1`kHdLI3k5Zj&Ko=Vv_OGU0A!iV6hiaQ~tY(&h^{yr`26(Jx`4NPQ(Q+=BNx=lJC%OeIQu|TlPP`4$Y3K4ngV3LRe9(a8s;Gd}(zePwF&m##F z^wQG=-rWPFFVwzoARGrIo>$lv$v$H|kggFW;5mj#ISFM3e>4T~vC;wXfJ4!Slwd!M zZ%T4xGS53ql-yO~-%kQUt}2Rf;8=_oVXjwFAQ5;%Vz-=cqn!+s2s}DbA_#kyqFu%& z{EloaJX2A~04M6eFP7x$j*jqFl$+-)x-e(lXuuxm&wv%kqZg&0b;J`H z6WJhW3P-k6-e2}-Kx!WAn4Gr&|GXCiQuDOO ztf6%9@S}qU7=g9OY z$3SY$OV@8w(+{B;a7WeRw`(z7P$T3SR2Dyv*ez-r2c+rg%I0f!W2Edwp3bg76evtAj7$TAUGZZ)E3Dm_6&jlUrOwR#+>@twuyvS_-+Fbelzvw<@`KiIZD0O(59PXW%NPhb?Bp>Il|M|)GPo^OG&w|G}erk|2jqqgYu&zxc zZ=Z|gnB?(@m#p$m3GqmmU=-~%{C!O*>8!9>62g$tF@ z&v6OygptX#VsWxJPec(@pfq@+{s40~Ziwf;M7ixZ%9Adlf98d0lL?Iq6mDV-akp-W z$Df36hUttPlEdyl+;Tde^NsAAT?^n1NU($30K7)1YZMaY@R&PP6`Kcvl#Ld%CT>ZU zpfK(fdkjGpJs9CGRaf<4^13pE)ZD2mQ^V)MYRa!m$!L>WY=~GWU?^4y5Q-H7gkpsNp;#e6C{_p%iWP#`Q0G|`Uqi_4 zv07}H!_BY^x%E|x6*}DL%8=Vywb*cnn^+lg%c>SDa=15@A$Or_v0{gtP8o8CsTLdI zq(Pkwxp!2Hl{nle%8=VawOFacO`r_9<5P=`bnb9N?&Z{CWezuPGUPr@F+J8|xS` zxrL7*_v>k~DGoR1G2~7>hTL|i#ilykW5KJnOoEDqraH||c?u%o{O>kOly2BlB z47t6HA@{Oru^A3Gt})~;HHO@hrp2n9oo;xQ8$K+;na-PT_%Ao?KZW?SoQZC@#tnCh zaJF-m8$RrYZ;Eh^^Dj5-Kb7=zoQWcw>#T9Zoo;xQ2p2jJyCF9(X|Y8PcPcUDwj?dK z*x?=|hTL$Z#g;g6H{@0#Ew!V{eP+>l#R zwAcxbDw^vF4mXxC&b=dAY_-EZA`H0~M2oF)xbcG_cX?>B6CG~pV95O&S}g8xvj#)% z%+O+M9d5&5$UPTYtj6I63x?cHp~coY+&aOK`y{kjt;0-IK-GL$ZHfXUr zhZ`9fa@T?ut9MRw!)ry@;Beo87He?0zd(y^aJ1Pn94Nv@XPO%}h;XCBNBmlBqr<28 zT5OZ^b2sGkc`erD@L@bdK6%$-%?_WiGvt$WE!N`ji8(_)8P{U14j+Rvfy;fhI7>7&#b=UWUFDONz#tQ!yAbCYNGq()d#^ zELs|Cw_v^BI38ez8%6o@Rvc&>+krjN4G&QsX>y8zYUk(2JHCZ&sj} zF~*>Gi5W$^@SxZjvL3HC7+=A6k1~D)X-6BkfOd>A6*7!9+F>l?jCqB4v}aUjV;#^q z7p0hB+_D{yK@1&LG0C{}WOT8{vLT8x#rPS9=~Io!GMtZMWY=Ns)Ogv(UO{6UWT-N( z>WfjR@o^i@uQML2#X~gXo=i@Ks-WAs#=lWV^Na|}GT#`CT3BG*j#Z9@#!~e9i;M^Q zVH9s1f>cY4w;=6O<95_nwekBN`1XYH+)ymQ8P}}FJGjPDIKtzNzR=PN<2}f^(s*Dv z&f_=cR^p5rqY!nv+K51sHAW{~#EC}d06efT4nmT(#;tH(H3knTUuP_UB(=tBT-O_~ zq2B9^fw?%<#o)m(4aU(dyvkxsL~S-252MC68vG*ICgTazdy{bvQko47x@|Ge1Wv1Q z#R+&f*eJ-u^ID@0x@t4dL)X-9ynzW>hws?N6HrCQRru@F#@IAW(&OIjaA5Hr;&-F)h^>clxVjx11Woq7dByYnQ;&9PcyhKw%2$c+B@Ai zAC`88@j(urIvMG496VwaqwM>POLi#A*~S6X?DvehDEm3ac_S3%T;nb1^E{&x_5OXs zLN4bUxk$gjcnAZg{YF08+J(l`7PhSzAz1#!#_y4GiE-R+OrMPhp#RGZ2d(db!4oMi zH+I5it}uQBTe{L%wFr;2q@ojf(jWF&iR(?r+8p zCF45O<}Zw+uz_D1uR~Xl8(Gla6UHULdD18W|34W^m*D#hMibigN5)9h^5kix`G6XA~B#AROMJ&>@!o4CSF9J)sxn|=-| ztiA>A^Jdt+IxhT506eT!P`Nr@4ASz%GYoa2c!n{|>a`h=N#e1^VkLYosMX1O0T{IJ zi>Xu7C&0SzA-n6*P}FIH10t{)b$Wz=;L>}b^cj5C5iDPNJ50HX_lL`s9u(sj_=^cZ ztrDIDUg|8p4M`mv@DaZ`X-9Ay(l`H66citRLNr%vKucBAxXC4?uXT%-dt^F~u5$~# z+D#4d!DI9y9hiJD9c47cXVuY41n!S8OqB@T!QxuhZB8Ua;t5HP`{@D z_EvbJ(dUT?&@QHah(tL72%L|~8xzvZqi|xkBKc~%73i6D__e{y;W+wBZg!nit$d8(i#YasEdx9`tuwRI< z6;Re#d^(k|_dGg@5aj1r$KrFWgnjMP1vfGoUt(o)Pq;amRq$FS<3p=VE@raGr37tQ zDHPwcf)~7F>ctex_|@0wH+ulZwJ;V;MW2$y8#2 zGUSGRQ1u8YqBM+%cWla0D_?)Pq~|!9YDp4V;38JkJG} z`QQ`4XWNZ%P(aCH1fT3wLTsnoucNy_mgY3M`yg{fz z^0!U~$o?s?%)J<8U8Twi;r~~FkIw~negBbNxi`WU6{%??H1>b8E0EhX5w@VF ztrZD-b_a5Q49XE|T8Buu014BFVzi}(_KAc;NVqtNftMOOC=%{O!rP}{45o(eM1sD5 zN?_!mDHIP1mx02qw!<5hn5Z*-|1-O={xC(tJd|HZlrb*Kb3nUIB_SO~O2sVu>=(MR{YFvSV@=6mVGRg5TbSaWTCK^;0wstc?Bd z?+VB?s>n_I(o3V3+_ZgYy**ehRFs=`z)Pd9+_W3Lv|lFD?nheLP`IY|t#$pRQCn{9 zua)IN?f2-!0K2BGL3uxSClc{R;i-6({{geq_OBoC>@f7cu3fEF%HD#ve9KbcB#3+i z%YxrpaiuM-^|-w?Ac@=C$=r@4xLt)-@v`-ENKE9VE;l%E@ly}p?s0oLFNxbL$=qJ| zxmDhgjbX$;%Q5P}=z+hBWdO0>AR`p(@m`X)NvY&#VD9@fY;G-#nZFa^*Z5Np_TM70 z?<;b#M{P&?2&9JeJwFjhsL+47X`-jiQzE3Q%tpJvtzb3!O}7mnb?Jn2ba+A64 z6bj0ai!$hUy~t<2P78n(!P@QY9a8Sks8t$-7B#M z&;?!LYO6_#PYjV!x)LFevVJ)jC!4G1%8V|LNz(g#&G6h~X0)eIaz?dC4e7Vula$fv zZblmh?1uyUUTU_)7ulvM5pt}IBBQq67@3W6bF7i9P#2dnN9-ACbBorb?3@Jks&#<@ zzwH}0J-B2;`5UHLLG`*basLJSkeO#--0iyBtTmFd5GdMw9hc{O z(R^?a)*9Qtaubt-3;g?ZOvSAqBBM}Hm!JF9<>!8N`MF=+{oJqoy00$3?yIdqUuquc^J_5E z_;p|N@*LjV!K1i>l3(z3cpnkp#toDO&qNl{w~!KuSx+KRq7S01fl;B4a373*ZXhyR zMAD=DHf~^yi1d!;6Eapr@}m4UZeW~<42%Ah+{TN@$SA*!8<-#>W1_6Rz(f(560IVG zDIzjE%5UQari#eo=yFD;iO7oRIM`TVM)oyGTO0iy$`_cKMZIi@7E+wqLh8*?ej7J1 zM?^ZJKcF~s?H7^Vw&<6HEa-7JB734wG1G-<6!A0~ml9YMyan9$M(-odlC%dA*%$pG zBP%0+0Kx^)bC47`q1O`#4n+BF+`#HS&m(du`aBt|5#rn!{Q+5@7-B`<8I8c20`c$& zMDCAXM?u#L*&d5VsgQNSm%-qdigp*+SyrEa121hhxfMmz`E6V~cm)vbAOR*TjB>eF zWd|=rB%PnfwSzz7Ex(Uz2cN;Mze+RL{6m89!sL_hvQ;?8R$NRIRVUZPW zAftdO-xDbr)j$cJBkx~312)*#p>3ES0g>Ol?xAGFVe+Azz7>dNyh@Y-0wv=_rssDWX}@eb@nO| z{?Kj^;g9T-MR6C?qd`oyupXju=ziHmwqPhS!*Iyf|R~bBGKuq+K&TWR(L;FI4*IdWQPyi zQem&yQc>^NQc*{2si1dlsi61l8-$|Xx2Y(Z<%{}s2t#@yqLfq7^K^9|9Glz*s>|)A zx_l=Fi61}M5kt{#CTNoRK19t)k4)G50iQ*b zG&7>2{F0_hM1qROZ~sPSnnVT70{tx9P=k_YVW!Zgq*){)L3AJDi_h9Vk}ftEBS4RG zCF-C*Keihgrl(zlG&}f1TnA9lpW>#se*xrCB;@AtJ)%gpCR*LgMBxR{Hxc9yBBo22tdPdKyLelrV8&=_G<3{1U0Ue1*v2ecp5cBUedw zbPiof2J;o7$Rs^NkI|dO?OMPge1|B~szvBaWVwd&EuzTds?;UlB8ohzM(A65UkeV( zAihQv=@b=k2~&lLyhH6#7lSyfjoc};P8XCwkQofR1xS$}_vILauBj_LZx!L`vRL$4 z0zt{+`$G|I^Q3|@(Xx6ov)&R3zLdP4lx&qgfDMt2H>oiW z${}oX0d1b`S!OzjyUHVnvzf})-Bs2>+)*BRHkV(YW~=W8=Wg=IDN*_|dV>U98N_Ym zkzHAIfN!RPvZF&C(V0YxqM|d2mPCcqkH#F)=|n3W(dk4-IeQ?WE;o*6BT7HakY1M| zeJn$IREG4Q4CyTk=))tkrK(PVhnDq2@C?MVqoW?Tbwn2y9p{KHEIPpv zT?azC*ldKNON&l&M3)ww;)pISI^7XnT6BgZy0mDOBf7NcEJt){(b#KF=!uL!3fa~Gg{BUeTldq_5jk= zF{<@@gtV28D`+NImJ1|e#Q5?yg1C^FAv}mIP*~*ry7#cm%B!^mnX$9*gc{>mJ~m*yJXE-$jB!+w7d8* zm+M24sq#+@-n(G!*{zhGaixTNXkAeD?Z%SCqN^m1Ct#{@H$s?%aN7PU$+BttXQyz~ z_Af48<+Ag#ycFe4LBethB+I?}TP3?6k}2ljaiKcJ7%xL{SPR1rQWr(4b^e*MvaUZz za(XT*L-pX4bg#0C)IM%y?JR8RY$n}6x3YE?Hr2H-p-3jYy;IcQV$g>4@ow#nzlTdv+Lp)jWhY(LzJPkdecwy)Xz59mlvZJ8~FOuSThQ2$ko7O*p0-o)H_M`4-Ujpq1 z?oy4%?b+^V7wm>QFGPFlg&08yjKTWvOUgw4P{$Y!#vr+KR*0 zHS%+KPc>IHe}#~(W1`zI8r%%kgSP-pwz*t2lPKE$)gy!l&6f=di@+n$00(-pCS}-J z^ru;Ba4ecO#|bsxlkDE`xn^fzWwIPy6wvaBg4H_FZifI6(m#DfVwV2VrJU_jj%ZZW z-g2a(?Qe2j3u#2D(y{v(_rsn%3ydu_Scj0z$3Y(chN1)JPd#|CpTDK%%lv02dHuKD z{AEFH)pkW>_KsK3WlGrr7W7}{bmT+ToU>1`SMHDj^7#n)l#6oyD>u2A{5Ee$e>No> z)nnWwJtlEPv3e*D`NUpjvAzgoLaS@toQnLMVzsQwzXmn|TGWL%kn`s%fW^7@_(UusvqRa`2Dg^lwNheD|YcCE~l-iNdC^wMBeNZ z|KxUwhj&%7F?-Rs5rq@=qVFS$rtC%c>>efhM=!o_cQKa6#qV($D1DJZDiT)4i?3iO zgP(^rr5hGjzKeJ65lD*HGV8lxp_!LXJ2e$6H8-?yrL=OdM49WBI;F%H>`p21jff_d z_)bLq62loKbEhww;D4d@{=6KM zbA$5)Bz7as?w!D25G;1GdxlW)xAJ3f!0RX{`E$co<9ktJ@@#Nf-h1ryl%qFFaps#=)BE6IsO2 z_usl}baM@Ic%r|I-zb~IFM$}+pYw%O)TeDuQ~9K+_)VAZPYl6Uxi{Nw9EaV;aldRF zUi3NHIK1d9vT=CPPY^{n=S9EVB`eB{@7Z1aCpW*xWp>I;JdPW~1qoSUDsr-8OfQyTlyR5w2ilLI!99cJg zH-DQ#hsE|yrZ&aGd2x4pJH~Y@4sMIWrw2P zF5Dd^s5^>#trXcSkI6up+}A7hb%xCK&!-3u*BQwiu5)Ytzz(JOsLSGUOY)fA&ovJZ z>60Cz9=zzjox(i4=mm(PHG0t-5rsSQqId3;b>PMC-&w4#lKG5v=gY_Afm|xmmpgnU zuUx&7kYu^`NX;C(T#xNgO8MCy{vH$8L>`j-^lu|SyaV(4>8mB7C+EMDM35D@XQz+k zW%6helFVq|w`KGk{LoO#8a_S zF%F^IEWW?SMX_YK1QsnCq*r;5p>EM2z33~chVXW(A$*x?2z%Uq$s^vktM~~wKTpAH z`*#)m@J=7;F)5RhmxLrW^vSmw_#r5`f32kTSa?O3c*8at5InkB3z7 zb31(`FO$RFNQ=B7E7_skkR>(oHUuflnbs6fN%W1>l@MUy}CrA zd7aBWxvo8*liKfjQMcdoqF%q}#nJB_aXCID87minqtu^=#D4Flr4sC6rDCw(D{fzw zD%!lfE~2@8pJeOxeO}C+9eB~j#k*W~UXH`SE;U#7ebbkJn_TSsO3yrAqAZjFhR=$6 zzF7X}Py4=w-{@AP zQnrj8WrtY|8zA2=7T|(kKc8>Ee2;I(0Lf@W`8(w#8ZM)21z$ORKGWy>4Ee4$RhMtj z<@>Q@k8b;*&v$iy$!Nvs+6|y7lrbr;T=MNmvAbGfci2Ew*`%oJ-AEHPR_8`GC}lC~ zYo@vPELpBT^JT_~{PPBS<(lc1OD=cFg4CqsIM>gyR#E49nUwy}W$HFFQEBr$82WR*)jP~j*sgkCr$S~f^mIa;QMw)OyCKWxx+Hs~FADuo| za=**ZAw6$GDyD@ZqghA~=^sAeB8n*>(*)WF$`6x?j{SqhPfwQ|JZCfo=%RDYO?5_I z)OAK))N@8&9M0%Pm!sF{`-7uw^d1tO(G@dfz8+R8h8TpepP4FJide2Ak}N$(Pa6Z)t~3}7d+J;~OwOl@T+kz${Ss?NzIN+=)M zl!8?_nK#xBOycLO%z93yhDnbzLP{y1$a_p(}2e#Fy0)SACU#= zmzsE%+DE4MhmMp1B`AR`Q@%4NGda&(k4^|=QubtU9<`mKjre$x$t_G3m3M6CE=c~H4Ga9X$!~VTOX(s0I7xH z!U7SY1r}lLNGWz@7AOgAj}XZ&rB}fvB}%GYqUQyFTCvN2WHN@(8+?;cm=HNx8`v?G zuq#?$%$G#eyNCNt&4*2@0>w9mL96|svXoZCl9cDG6Z)(dEhFIbhMKKtEL&mX`%yE~4{817ouu+||tu z@u?DyVQ5!pHB3vmvwYFQ3WbvLhp|Nn6GWqfOt%hVY}bO+x(#+*D!^^b=cxIrRL^)+p6Dwl$XXl# znI`%)vi619dkiN@^BFuof8^NwEEb|)zS;yTyd2=R?kN?@Ea(BB4D`$@KP0PbnjjX2 zj&e!2JH1N>GsE+{Rbx^5arr%I>=Eo}c0D9&idvo}T1UPrd}hAGq}hT%I7qxyDheSx zu5R@{S5{F!Xm|NbplH%6mP$O){q+F3iMLm}jXjoi z@AQ@@Tm}_#oa_USPxOH+e9IBVTA6T|c(!qCf)=RwPVwz*QU}jd*-mdd-6G|Ep5Cm(YKzhia||% zLJe+8L&R;Y8(>7zYLHoDA_6?TTA0fx^VS%n91z4M%q-<0QtQ&@slV zVssbH5hGKM?zDvAvggqgV*rB?G5Gg-_<+|{TdA!hC>j}5C%rUBC(wF0(O7Jzkd-&e zPtZ#r6!kc;-LfgCCB(uuUC&)-_+Afa(&_b}r^$4imS}8QuJb}A2vft$BhoxL!jyvy z=#G(ILQ$@bCPo##<=m)GcPIw!sRoIWg=db^iu$1-E<;(6{>j#evAXAzbLkTD{F)Md zvm6}cvo$0}2*Q@U_AtmNa6KF=zQ7kWiOXOg6N!>>^7z5_&3S0DB}%6`ESWaZDPKBG zH2Fezm@G15Ga261xQkd#iQcw2(ch178<|gA;?}62Q0iIn$YTp}nH0hsIEePzO+=35 z{h6#B$$Rqz;cR8IL3ywO;%Aczp<*jtX@#!IMhqjQ(~!-0w5tmrV+^n`PC++gDnaE+ z+^eek512Osl`)Z!i%AqtV!$6uh01>Xxw`Qa{C|!ApYYezTrDlL3U`XQaQRMMi;FfG z7kxasKs|;#V*=Bb^0I-Kt-PFxi}`(A0z@$n;G!JD#ki3dzBOXpjXTR6qJ*^VSghes z538p6prRRSpaWO!0$g-nOh#30Mh`PH@VRNvHHQcD%^|m%{X5J)9cFrmncZpjy4}nU z&I`^n)nJ1;Wa|IIDDW9M1|Gmw3+Cb4C7-^5&&)nYkAhjgISI^y`2znN#0nfGpFlnN z@L~v|d9ggn{{s}WSKtfNJZknWH8X=(v2eq|L7i*%XFyT)z}yuGj1pV|D@-%6fRMng z1bvzWLEM^)OOPUjc(FY>%nX#w>@XvH&0*J=k$N+v6=s^bWoAb3Hgi~m*`waf)e0kK zLB~pvsV|xX)|v%J%>ltob6|%#bb^_s74$IEJI%}vGv_+95A=fqh6*N@Q{CT-R4d>r(?QJhmNYN+k6_>$*%Kt#J|FS zD{zGyo%jf1in#QI?-P$gq%X~*8!h35PbBq(YZcy7_*eQ|^P8M(fKJw$2HF4}YH$wk z_@<&&$4fh-r|@n!FMMY(bP?0|;$q-OOuLsCo;?tFk#`^S?h9W2&5NlcEu9x4hj}K1 zMX3TKai}@p2~9L?>`Q?rhN~T*kCRxL9}N z62OUmAMhWacrKdf{TFou$wKXk3kp z8GMO&+HA?CGI%?qpt1uK&0fJ*&5RDy32rdel@j8)6G&i1u9Hn zlmMeAS({+Cpw#T!VU`8wG8h z#Be%*)I)TxgQq=UhTb(Z_M4$Y^xcDk?}-HSLg6{JJXsf4yWoNZxF2K#STth~JTUk{ z@B!0&&kU_J`)iA`Wa~a+<}|SB7qc{T&0GfcX7BylpiDF8TC*qPN6bC~XPCqhU9N}I z?^-ik;`9|bg%W1~0}m(jTE+s}kRE1MKpUHR2+UC?@A`o=u7k`VTz z8Tvqcc`MB53Nve~nXjiG7F6|Sng|c07&9`>w8Q9?r+Q(Q89Hp{FpjXl8%DLMS*Cfl z*{9T;9bAcul&((KO42G1KjnCj`u4RC4Q zM#-g}?QNw^jq6GqYHLfkjTsdmRWYKev88j{h=!KV(y^tDEwxRZ>+2MO=SI5Yt!wOP z{|`_~JGO7GOGQkjsx2xi9ea$V(*Ga>K`RlJ&W^^W_LADoV)Go{gB2Ha2yPXl$8;-bxXo0RSJ5hrXS)9r2lS=2syBo;q;{`o>ly8o=7#9wXH4njm#F0u_TtuLr~xzG~m_ZvQ|tLJ%jfw zSMRT)@{M;z?X&4<+H-0Tgu3>K2*uPPpuMOw(Q*@UVhYAt+PNANZ8_93vjf`PEYk>1 zL>eX_aN^qPOcRghA2tn+@4HV*%wRxUm}RODPX0!Wp#r1$0W)uc8HS4vjs(ZDZ$y_2 z!&^+@J38<|59C`fz0cKV`aBLWt*gz*JQJ@58`|tf392{y5OIYWW$=<2o@d&a2u&>i z_KZ5&mfZ1AZ<$kH2FPi?n^PD!drhaov@eob>RadPcD-ruZ2*51#8VgOlILqeHNDIp zoo4WXiDp`-nO<-9xY`^v-|SzHhQ7kIR+y3bkn#)@-}Ihq+IqM|3j7TWp-1UYS#>En z!M&mq%Cvz!%nFV=Dbzd`quV6%n|Wji9{ESi;SWepvceQot0U%2a(ck5U~pJY$d2G1 zGcjC^4zm_P0A0SyaAFhvziW*gAtVbL(3Y?ST7UpuOgiN#g7zooi9tdV!+$YxOX~<| z3uMXv@5~#fwIIt3Ut>DA$sSP12RqNe@f%ifziD@h8rGLxY6iD(SY_YZXsQjtN40e* zlRE+ahC-r{R*JRTGr%Vx~#Vp4uNp z!_9J&Gi7qNRz~C;$-S=&>?47>F3kWp8GRy=dr1+*$Znwaj$k`Tds2jhDNCX27lyfX zLnYk^mtC=&TqKiAqzEx7Lb(eplfcm~%_ujyQYM#55ympNajppCT@fZSaguhna7~kG z1yfnsS!UKNxQFJ1B6Tt}SsabJ6pI1cgJv+;Xc~viur>liisO zrlHM^n!&hfUtmVAHjPOj$2d+bcQ7M&wSzux2^?5w@IB9qY5@UfO&YE%HC?YMZPZm+ z$W0Ur3y$kbBc#PRJVz8GZH0;V(9?ohX6|Wb1TOG2w9eqe!NXn)5p6)z-Vha{yIOG_ zwyZ77O>`ahEe7>qyIG6raa4Ojkf*tc8B}Ty?K$DvGbvBcRC)RbCz-t;Fb95WW;{Uo z)V*}@_^jcvJ%(tr-Cc!|!CUNsk9i4;H_7r`MjwLtn(pQM#Ioz1+7BJ_*JV*H6Z*bG2 zgu*63^DE5oE23uuFOI#zi=7a84MeD6j>2Gt7^rDS#1KxKU^+~!mx-T>o=!VWW&Fy6&Z*Ajp~HeB{i*H*yx8>@B9V!L&JdDl^f(P`ANb zG2^+$3?ox?#KFf+JI1nWgMHs0l)m~ux9p>$mTm225xSOri)i*;EL)m;rd!KBSZu${?}kM(x456Ep(z$-YOeqiapAa z)PLRlMMi>sR`4@$*ZN~<-B8z2*Rn-vY-z7+>xgfzZ>(=s;;YKaYMWZy>tuX!S^46& z#@4pRj_ot&%v_|z+c&hfb*$^GSK^!7>bBHwsKLux@i~j)O|7+?;vF0;VqD0vW(ST; zApp4Xx|a3I=C;NbKa=>(ip*XsfGPAIAW6J=n$L zjqRr)`DR}8S1E}4HT%G_L?oS zYCLwLIvZP{i8!jZ6MIMNn_6o+6v0f8)V8j#tKHI}p!PbOI+Ui?mWDiW>1=6lY-p)l zp9fK4s*RovZLRHSZAOKxDjS(d?Pjhtz?#}kotqIrQH||!q4V{gwZ|Lc?TsfxgYi1p zOk-<{(j-1*T?36ZDfPl=q1F0Em|d$FRvKO+ht1gV>xm<) z##M9sX0&UtVKY@u>TK;$%FE($l&iV1HomoSeVwd`x;E5dJ1ddMDWX6YWGLI2C`epd zNuq98C4PNN6jTQ+s`(qd$Evc5wz`hC#yZ%C@HgEm3{o|3Mmw!a^Ua%n0DOeR>svd4lh7QUlJI82vf}a9t!Va2 zUGwIS?QSjApe4d&6XlT#q3+h#bkrap5!7_VPwH%h`xDqO$Vy+vZz^OReND%Y~yfMU1950y8c+j_4Gzw4DRgv6bw?9vY3+#9{-iTN!RZs~ z;S*8ysQ)CDiKg1FjAAoj6^Itn02e`|rq->#wFyMe52Tt7GlD|v>&akMS$T2~)1}56 z8zrC7m&v}S4Zgp9PHk0Hr6^Vv`r4+}20E?(hPa|0c3)Lp9&c7Qx3)KSG@|j)Co1$1 zHT5u0C0;#U7)N~mqUrPIESx10=2sn8HNPT0ed_etRq^UMt6(~-7FKtRh6~=dt*or9 zJX!W*iCtYo*(=(&)@-g?T3x}e`a95QX7=hZeV9nJ7qbRf|6vXzUgX2cg%Em*X4Wqi@JxmDAbRg2E45oUODU7K{2>s!%B zwZ$<`X{+gA-}0U0D2qXVaBFdNK@A-ns+!R{U~L#}wW440EpZh6escDxy9)M7&I$iw zt_^3ja0$qF>AXgTYJe;IZkdm+_3h)kF(?}?6j9&U22D^bR~z54Qb(dR>l@qApjkoR zO{B^;;Td3?vIU`*%j;YNoxQYb>Wp~x)R|TOSi4$^T2_g{&bHdR%`{2$lx=PUUsxS4 zi=_ans>|f?yrOQ~=JI;QRiUW7@_6;}@flUep^>$;wl!k}Db2j~J68}D0z;MB`0ovM zdWE1I+g#TiuW3RT*{HN`X2WZ3J7J9ypULqih6=)0C+Vx6W9IMR)#x3XTesAC-XYOS zq-~Jvf6+md*L0v^vsFx8I!m+%uiL>uXfwP=9lF3>$qrlkp`}x&SH%}jT~OtT9%CAKbM_Vs=OyM@W$-**jBXAb(|4%Fs;c#(`5}Lft>O@9S=9o18eu{h z0Aeayv$>`g^Isu%_3WujyL*0&E4E;uT(cPlC!{Z{Xl!r53;>?L?xfC|ruCeC{r@UL z3`AqcT@Q0%~f#a$^{_Lt5%jb(x+5fXF zm(G)IbUIquvSXGIj;*6P-n_m>8t&8?$IYqcXl2eqF5?J6y7dHI{J(1)!mnakp}x7M z{=2%%F;EbkF*-XAAJE*;J-z`%6Y!m0DC<$?f);h4eIZK8nxz4MVy6s117wMBM= z3l}e4G`*@C1+R`TS~!0p_?C_26uq^X((Mo`wp>53tyaD41*rS#?T>G9*>F|kg@L2c`14E7-IGHGBl zFmhVDeEPCQOXG8vRV|&$<+N%sC%|mJrcHR9?o*Li9XveR$bvXl3*euWdNEw~3+c{5 zMJk5i$nO80ATVQGm_=Jg^K>~ZKI}| zV^>k2ISbtpC#DDMIvbSaUR6xt6gWT(@-V4}`);X~l_C45=}T8GW_yDK|6A+9fMiCC z(q3EBwC+2O{NcpJ0N$N0Rn+5TEO&gjVp?@&eEwogTo=v!KfQfubD< z*WMLkBZTEc+A+y#Uc=e!D$Apn(;6NvHaRmpvA4F_>?V7cWVgDToEb+^Hn4)o7o-F} zAR}?sfB`9nWv%VNHe|zE=Z_%1uRja~G7Kv|1Q_rE+cAW|R(`+l``)Wp#qMQSEk=zQ zR@JNbUcKXc-}~Tv|DhX%0osHyXe`<#O#>yjfd_ zD^+`3)@^Zg zCgrlyk%arDno%c3;H?Xo9+ZYLWt6=%y1>dF2cIw9%)%kv zT3?TEl`Cu4ceGV)0xPSk655k@n<&`#IdAUwdM?%XMX?6+Y2qx{t)04(P(MOTl zSg7|Yt{Djr3J7`oHEaWsjs{fQ90a~(g=~H+BG74+OII+X;QdUnQ;KV|x^flAl{c@) zmC_%N-R&b8gu?c5Py>LjfNkcCEZqy%leZ@G4+%#+AC2 z7P4HKO3~P_Odmkkq?jO;L%m_q4Y@>!X#(*ep}Yzi@f3Ek#+TaW=R4Pza!UYw*4@>P-`rK{)2rz%NwVUDwshz$MN zINNiyCzwGZ06?Lzg#->GgGio$sJ&hWvCVq(lLiI0J?_Y8f>06_E|fgH{#8|RkQ9bc zS1JOJu(a)2VMp^NqmAV70uv6Rst)WCt8}3&(DQ& zUZFTz`|V>Rwfxj@bAk|;x-#sSRIYJohp*;ypD?kHu z@x%Mw&Y&=JY63yyB?>Hs(rik$Y_wSI`nFNbkc;$snaR#_D6bP-0`%7+!K@-D_J#8T z=I*cw)GL+b-InK-%e|O56$)DVu`m!wR{UlUM9KgaXn!HX-~$m%-nNkGmaddZ1QzQL z_$HAxXz4L{9>wlh7eMY=w563@0nSTN@1w|+dF-C`qq}t)E>nsIaBRW0K~~N#+7+*D zZ|zpWI$|Y37en1wyuGx!hJ6kxvTm1kQ^4SjyH4jDjteO?<|fE}LrC}dSj9WXU_`t3 zMb*a+RVx+lIOXllGIlz_9&V=)MR-h;aFWpXDfDUgPaz|PHBM7ykK>Pk(;BrvkO5zF zOFwGTdZN&RSfErCY@I?8WGWyGD6TA(2pz`LRj*b}#?5}cXKNYE%I41Y)_O!9WOjz? zS?Mt7n9Am=Jk+k2*Vhd!hf-AMaj+1+$?l74M8hZ5i4X`IlW0r542WOV4S?G`9+s7o z@_Y4mIbPkZ2E=LJMe0?<7@B@p_s5jxHfakn0?6@(iN$Gmg9ReY1;^nc33)LLJO}Ye zqM{nMsuNe3n|Y8ZKF=qk_< z)vD!{%CnUf0h9b2Nupb4owv5OSFsEWQri$HZNxCNpcM;P;Ei{Kfuw3p^1n+!$-L z^%3Eu-yEAuwu!^h762VYssEW#qDOU@~^E+jMH5Qm_qD3Fj)rV9=hF z8xh*#wppcQu~TL!#|1OJAQc4`ARd6+>_dytC!pDc=f(Stvr#)TBmn{sY)8<1G;Y7$ zGLf|I^&AF=Y{^LlT>&B6XwvjW6jQJp!TiJIODrZ)@s(thbw0urosuv`DA4?P1F}>{ z$*`%ZEf&(%E#f2WX;k&PWjZe84Y5n%M4)R69yg@KUgbqgZ$hJTCB|Al11l$LY8}iE zWMEf-OpTt=cJgRt{X*WEF3rSCB85AI6tjmhsWvbw6uF_jG_hKp<2Hql7`CoJLFb0c ztEF_jU}si8Xu{sGc`76JI{htO*>9%0T!q*btD}wyNA1db0yQk{l%rtCNJAo*(0&1h zMnHn5h!-{%Z(1Hly@D7j}-|HTT zv7Ty)a>-&;C53@GyX$Oy0g;XkZ$>9ZppyNBX?o{wVmc$E2yzg}6S`ePo`7ZmvlFlJ zmg|rv!5H$JSL4ch71S(rHZVnj*XBtAvSZ4q>B$aKo6%qcmp&t z>Ix(RAjn|<0qZPUzqi_O45=BpnW*hymK-V++iK?BZy%o?Ib%&2a?{@+Noz+(`=Bm> zavJyQ2_~@3I6(46`#8eJkUT*FXKkanY3 z@j)@@$89zL3Ksnc?qP=9L$}xI)(^-qf{>LpV(LlNyVt5)+e@nzY-{ChNSDy;Qpt=k z=*a|IVs2`(;6%@`Tv_9GhKr=B0bRVhw6jEo6BZ)edX6ZVdZ#J3-o=p^fqO|C(bQTe zD=(d;d$|&viV?h}hfe-5bU*K`#yMy6Fy?of4P>xwlk6y%EF?bUyv5RP7S z=vDdI98%X|3r;`*l&KREs^C}5M9pCQB8gW)+QN&x{BmF4Qt+-+Z!QobME%A!4VZz= zQmJeA;Bm$Oi|KN&gsR>%&ld-a%Nh`f^h#1OgM%QB=Bx6CeBGrY(zyb86MX|zyYS00ZG9hem0qP?$T?1tyq_?$1Hk~$j7q=bHF_ckp`u=lLAv5acegz_G|w3< zIYpi03fM;yFly-|Y8*@iY%Sm}z`l!2LRa?Yo$~gUpw{EATqq95nbYa@zp{QK-l4h_ zjYf`@^H=M(E zqFFP3D}p0{u^KP2Nh$dj`Q-u#ht^}^0zKbR%E_o?kIW1KlOd#pObX-)w=1eI25O{g zwa|j|S~v=bJj*Y)y4lvib;D%eEPT-*^^Ppk;{t>-Y#x_Xf|FY<>ljc<6AKQG*(;c` zfTX4eLXaY)PH14L{;|b?z>yuQij;}1JqH!*mg>5kQ4f@*G$Q6=w5`S)Zo=T(dl_~1 zUWCXRs8a~e{%K2?vOBZ0Mp_=%PoStq%m51eMZyJXj6@wcLvIEhSaaYDGx2V<9JN|U zkaa6iV&XDV8IqP4EZ(w>`q-#j-K>lQk{^fpyyXY$u#qih7Pi37pSQ|;myx*Qn9Rx(_>`Y)FZ>JmpkdO- zf;3^5hA31n(KglDr9$<_jjZt8EB#}$kKu;<9i*=uc;4k6n2eRJ5KSBw#KWK>Ux=(x z((&1=p<3w#ZnN-)7X_0-B_qtiUy$;A+HYVIA@ha#cX>l?iAC)qO`oHUhW0{kT{rSF zJ_#oezfXWA9Q(w%AD@OGb-fyLo*Xf_r!=uK0eo8n7;gdnwZN)DEs9dY!66A{P5r#8 zihd)fkZx`caFbqz12{r+z?g`kOjyQH+tSVsY*BY$thKbd3g|b_4~myo;?4DV)BCaJ z?JI=a4d?41_DeOon2Nla7&C0d_SW()TxPRoj~76FF_GVKg`$PT2D%uaJNswZ?>N%1 zLsuXNeV~9ci#s@b$o9aGR8fJ+4aMf>7_ zRD=|PiHf(O^~U=?h5qvq3>^bq#av^r#~m0;KyH;dQc1)HT%TYHz!ALwJ_=$*F|d%O z@<6{qTDu4l=~+nc1(8vn%fjLg?(C}K)wS)V4g1`qq`XiM$v7S=7r};Z0Oq>-~$^zy~`*@1E{;00L6xitcvO8 zm4oJ{baQEa*ZiS@ZLV(tTP7aT2{u13=_~?b&R9+)hte@e)Q<~28F~idPwxmJCNSpq z_T-c2Y-Ha3Z*w+mYFPz|I*Ced-#Wy@EVzW7<)kPhE?cAv91;o~@*+^L zT`jZ@+`a*0d+-1xAQ2))ExNUx)e6`Ff>Ij-3tD!dV!DrMrQ4pv(BZdSSJ}s%Cz8lms zq&=X|q!7h5Ld2|=*LRkb62n%Fm8ht$js3ID3qekq7aaw z|BYdNKz5;BFfMLs+3W@dLgzR5WnBC{-%`mUQsQ9&l8KJ4H#Kyu%7@wyXJWu)n z;Cydt4vDqIm}W{|=>X)#p^MIq5jd}V>Y{SxV(*-5mW7Ql$&uKr)}+nQLi zhB1u#n|;9BwgJHC@v2G=jSSZJwASUzQk(Ei$z8m(va+?ixg)_lEP_Q+)Eu_7XOZ@!D|R;>lmh?Mh-H0qon!kN$Kpk)FlG0@CjVPL*M6B-2;fCGspIpJb1O8dnBtXXB;RO%NfTN`vB83y`D6Jdrq z*{dQtg_Z>Mtm5-W3(7Gl$5rcb~VWQ*sgG zuyVb!j^Kuj$%iM2i$%$2WqEhUyh_vtN@e~DYh7sSz0|>Jlq`s95hMy>fa;^l+qPY7 zY;A7sY;D4vX@yP@0@Mo%%5%9jSRjile}$_StsQydFKOi zMej+h(8t$#jR5+VZUzobNi+vl8s+byqcxq3DkRFrHkzaI)hWoanu$4K(>)Lkg-Yuw zi)FALG5doSO(9O63c%NSPL!UR+i)@fEkV47ut3+hu?kGJp`v0qhuGB6 zPehb7`NtE~r^q~Wk#yO}C1&vVVCZABj>Lq}7{PkXTlCn`KF+y_gO%2CV*Fg76t3zV zR93c=T-G4Bpi8mH>BaUFzf(F~O7e7X9jSeO$tBXkZHbr) zFtX6Vrm<%LHv-qjdsXD+_SRapvT5FVeC?PokXfd%%>!`hK)q@)CoK^jkc6|c7=-!P zxuZVDouLt~6@JB?xlkRs)>Huef_2<>A2r`cBy48*MYiz3!45GeB`oO``qV~wLcJ`DB4udACeN1BxjEPBr^l?K3p7GMO2 z(#-V^ju;u#k5$JgUW<+1>1F#7=$^;@< z!ebE66%j(7mBb}S;BM{KXu3m7A@$C9L$U~2kkXlX@zhk>QSTkhNP^_ybU zX1mCo;}SN`x&;OVbkg*JA#s9)SYlE7AmQK=onC3diCtYLgm2?ius8X^$aM;)t8x%R zfhqtIo8a;RkinS>BnN0CkPRGEtd%m)8k9^a9RS<25O}X`?8tPd4ObE(f9!dnoKhTF z<MZH(W%-vjMFG#EAhnk4vB$ z(~@YaU}TS&E!aZJOZA{hTbNU*we%FEM93UbN-7_NytICgw4&RPMn|On)(I{ehNTt; z1qY@Gb0&Li#-_#zL;ZdaM^1=bJeA{gZclKA@(5do__?XXrO-ylK#jtDl3;Renxs9n z>S28vG|uqN64*^f4YUys0h3rp(uW~|7e(FWiEDwV0z3T>u9XW&#F{C(mZPbgZkAe6 zgpY|sXy>)&$EW0sr2^%_@?ngJ?W!{T3@n5!_y83Jq$nA>0!~Y+jIh&b zBx~*+UShbV14J0rbj@pTN%mqI%kSN-+=TWGW~9pU7TH&v_>lqF1eq2A-dQfPFy@?$ zifptp#T-m;EAqObqZIRK@KNcM+eF1mBLB9T-t4eM(3GLxU5pW)%q6|DFtN#y3;MJp zJcSy!_+|?lDw(|`T`SRMjmD}j-P#01sC})y4~XamNPR?c$El=qvQDJOpG;O|u#3RW zXb9RYAB|VP3trBm^Kusno2`1W9N0H;>CT6>-w+L+xaVFZ(Jkmpp$3&)sY37as2#9R z2gf+~QYS0rr=VseGLncc0Ge4xUGH_o^!d!Q^3e2x~&TGt^H_SA++?g^9ykT8Q; zN(jp;X{I8KVbD%sw}`>P5q}K=Gbq>@_`|9lju6g`YS{!RLX4QLyd9=F>*F1b(iIY) zI0_>1-9?asOkDn%E5iaH$qr!K{_B+%5&*H|XbK)4y5P>uBc_p1&NYdrN!=OcfQTd0 z<}rg3Or_XlL0hd``%uuGX}%Ay1N-Z7hddB=(Mw^!*_xp1wVVMO59$Z$r(#VH6tX6{ zf(-e+yJhF-0?tm(Ou>=bh(-g99-cl|?33Z9D?8o{Rh3KY<<;`D5u6fxUXBznn6paO!(@n-bDgJa%fI9T78>j54u$bxSv0ka+c(URIAP8CEAa&sm zV{pP?mkf02Rn0;Ool=u4L1#7ci1q_PXZ2A#;vZ!%xR_suPA2W93k(Qk$sny%;Gye` z4#^dx9k0NqkjIf?sbs8S$1yudG>pi_|Vr%ams6Zbk7Cu50V&zgIigzYM$xHHJhP~nxRy9YE>NJE08A<&F zN(yc!0tIkzT6!)BxIi^V^MIi)H2f@rhxc*#IF}e=^&`}=dG~_)gIrXqAU&i$C0-P8 z83wUD(4K~82%|%VS4(W{sj0;m6c1H46RTDLBp&pzMdlQH-jfD|oWrbXo+xTZGlMaM z2vL0w%h;_Dp%Jzj^x@;FDY&~Z=m%jiSbxJf?t(tXU0bm?H%;$Jb3bq7M47HxqpbW zNJAXXszWvLX51=nL~#;SnT$w^b_X9Ti28O#uLFv!&gTD!KnJF#;4 za%pbj+SJ_Cm5IsY!Rbl!X#{0$_Sy|R)&coX-&_-UF(RT?l z6H+@4i1#zdD8tQaj}deLPohV1HDMBfc3wK^+&y7C5oT+D-mOgoh+!}*&>Fy$`@Vfz z7YIhVH!wh^+|hdx;e;X0p#z9XuEpQMwmE?E3xI$via$b^YnK)lgG8K&jZoMIM7|Ml zfkKQHwK2xoV=!Dy<-_-)(?R>FKh@~c?8VPb!xxnAa%5edTxH=z1$~peLF4_T5CFIc zu?9IW7~Q?o_R*kylB^4Hs-4@Q*0iq;zdI!@uZVjmB6ohxX*O`Qd ztUWzjKj}=D`b`9W8T6Xd{myh3#3N4$culrXuxlqLg5Y~D3Xa^;mxJv==r)*kuq!6##35LXrf6qk zP_WE`4EBys>b(LF@Zg|Qq)WSSHGn;9H}6Iqn07}a$|p61L@f$Xb{z64sNu-Ry^>h& zVv)dMWqp`aHku8N8pm~Pj%**s^b8r`yn**vudsdY>ck~=Y2yeAgJaw)DS{jA5L2Yq zNf{CUh#P(d7tR|I9&VxGfC39()8o_W36}LfZv>m5#`Yd|B_v>QS z2iQE78jW7>_a?l2OZ3-Y$maQSBs>&dir#TW-~51Oc*4>@Jgo`eZ|U!`^q;r;)px}wj|qdb3qXX!840AJSR=&hLlw?%J{CO)ePZeHGw^kLtf9FhLa zi1eDIUy6RDr}e-4%k;XB^hW?!4}aDgVwcljz?B>Urjm()D~$ z@~6}I^iib04PTC4)prh_KRzP=ui1CMq17xWVSA4~t~Wlh+#^e=m}&hMbA39o#K zUjMnJ|9wTDzt8edBK;feKD=C){9%gT|0}EK(cAjG_o!a`Bl7)(u8*!oG)8?bzalI{vo~IX8J>46}|e3KD)oqTmDB^ zH07$j=t#QDm0Z8q@-NP6THRj#=!pFP!}8a^TQh#f^8as3f3xA|@3r)Qu=HbV2=N+! zkBwLt(<9QCCH+$L3o}~&-{>W}H6s7d2%fnVy==hv&6dACBL4@O{?J!&@uhy>ZQuQ| z@6qJnzNFV5K|1F>yWW3%ME$=$BK;3Xr2o~3^uGZB55r@ZtiK<%dHgwpw|7|j;D@!{ z*YM2WQBqxVR+6Ng`uai3|FI`E{|i>vCy-7& znZ<9PlJvJn_pBbv9(`KsaZkzhcSofE$%ypNOZuhg{yVgeudwz%20X#_`1c!{{&ki< zBk9Ta++BG@`u>RY??n0|!G7fG`S6JRpOExR(c9NG=U-ZZ|2ZQ6?~h3T+=%o?1%56? z)emUJZr}VCOMk!Njjy-wE?W98ev>BrB=8!4cP#zif1^HMwQ;*==?~j@y7vDkOaJ9b z&A)8ybohFCOwun!|JugkQ+Vd@T_f_Z zSpNABX+Ae@JC^=I5~BG1lwP6(OW!v5-?j9Ykv?Jf;pM|4(*K*(6Xw+WUmcNd%$f51 z>p0mAN593wuvJSlRSPw&XMNpShYtI=JGlQk??pg6{C&vZ#dp@PB?n01>1q-Ne0?zq zWp-zMo;*fBnu@`?pTwovS;!kuHXXZlF}A4ev(UdnJ~UE>TzRovMg`Etj$hvY49uxvY+8AepKqo?xiWB;z^9abS zoV^iD-c-jgGTE`BX`}cs>2XTBE2kTQqlP2lcQpOSWw-`B@-3Bw3WtjH&|T^l&gHc+ z!)wZTRirH{RgJWi%8$u}7BZED&v`qBqjn4SZ1p|J(9?P1{eCAt#7P|D;_jg=Em}lP zqeQpE1>?g`lgB72pjo%LWGPpLG=PymAOwX=W;+?N**Q+&`RF2UMn&2LsVw9ZFQxmG zES8kWowY%I1PKk`XVh{T6~e)N^+g;f>%WF3Vsa2{&!=$aK64Oj|pu0jm$nxq3^{@A`2wnXEUV>xQ*#bN)2~y5E~6Ch^>JP*mxP~WnI2jr z`R~~DxP_V4i9l)D_c>W7#JTNM0+swTr8dHTL*R%bhTD6+I%IKd%$a7qeLJ3oCW*e! zL-Zj4PFu)qm1?Qf3~T5B66<4tC05V~YGRav0p&`vXoprD9a4`Lo@<%zW@U$gBw%s_ zA!M_M)k7894pm%!Y#B!{v=|^YObZ_3bcg>kz_xFHZYpnzkh;H=oNubs$LxpWeInWitEr|;Hw?f zh(A;E0j&%RESkcJkjGGYp|Q=qQ`%Z2UN;9l+R!4k#25sjCm4|L0B4>#omR zX4igKox75){KugD8mK;%@$}YP4K4j(H^%Z;JzVFJr{{N7bU$zS0 zX>u!fy=UXe@{i$vw)~GGjpOR-k0$WI--P^)2;bo^JOBR~FT?T^6PnvyUvM3>N*>8v zKZfV9yp!X(>!k7RR*Vwx)bA5`3d=h=sk?q2m5dTfQ`+{Kx;D=6pW0ezN8N<%sfc{g0aSBVYUa-@jqyv*Y)JAJg(b`(4A!>)R;0 zIimb}NdfoMZepz(S1!D|wHtovk$Fw+8b1F9yrjy@!JWh3Uy8KMC#0H}pV9Jvzzo69 Xeb*(u4L8HefBSp1d@EBR^BDbqakhRc literal 0 HcmV?d00001 diff --git a/3ano/1semestre/so/practice-exam/src/urgency.cpp b/3ano/1semestre/so/practice-exam/src/urgency.cpp new file mode 100644 index 0000000..99c9332 --- /dev/null +++ b/3ano/1semestre/so/practice-exam/src/urgency.cpp @@ -0,0 +1,374 @@ +/** + * @file + * + * \brief A hospital pediatric urgency with a Manchester triage system. + */ + +#include "pfifo.h" +#include "settings.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* DO NOT CHANGE THE FOLLOWING VALUES, run program with option -h to set a + * different values */ + +static int npatients = 4; ///< number of patients +static int nnurses = 1; ///< number of triage nurses +static int ndoctors = 1; ///< number of doctors + +#define USAGE \ + "Synopsis: %s [options]\n" \ + "\t----------+-----------------------------------------------------------" \ + "--\n" \ + "\t Option | Description " \ + " \n" \ + "\t----------+-----------------------------------------------------------" \ + "--\n" \ + "\t -p num | number of patients (dfl: %d, min: %d, max: %d) " \ + " \n" \ + "\t -n num | number of nurses (dfl: %d, min: %d, max: %d) " \ + " \n" \ + "\t -d num | number of doctors (dfl: %d, min: %d, max: %d) " \ + " \n" \ + "\t -h | this help " \ + " \n" \ + "\t----------+-----------------------------------------------------------" \ + "--\n", \ + basename(argv[0]), npatients, 1, MAX_PATIENTS, nnurses, 1, MAX_NURSES, \ + ndoctors, 1, MAX_DOCTORS + +// TODO: point: changes may be required in these date structures + +/** + * \brief Patient data structure + */ +typedef struct { + char name[MAX_NAME + 1]; + int done; // 0: waiting for consultation; 1: consultation finished + // TODO: point: if necessary, add new fields here + pthread_mutex_t mutex; + pthread_cond_t cond; +} Patient; + +typedef struct { + int num_patients; + Patient all_patients[MAX_PATIENTS]; + PriorityFIFO triage_queue; + PriorityFIFO doctor_queue; + // TODO: point: if necessary, add new fields here +} HospitalData; + +HospitalData *hd = NULL; + +// TODO: point: if necessary, add module variables here + +/** + * \brief verification tests: + */ +#define check_valid_patient(id) \ + do { \ + check_valid_patient_id(id); \ + check_valid_name(hd->all_patients[id].name); \ + } while (0) +#define check_valid_nurse(id) \ + do { \ + check_valid_nurse_id(id); \ + } while (0) +#define check_valid_doctor(id) \ + do { \ + check_valid_doctor_id(id); \ + } while (0) + +int random_manchester_triage_priority(); +void new_patient(Patient *patient); // initializes a new patient +void random_wait(); + +/* ************************************************* */ + +// TODO: point: changes may be required to this function +void init_simulation(int np) { + printf("Initializing simulation\n"); + hd = (HospitalData *)mem_alloc(sizeof( + HospitalData)); // mem_alloc is a malloc with NULL pointer verification + memset(hd, 0, sizeof(HospitalData)); + hd->num_patients = np; + init_pfifo(&hd->triage_queue); + init_pfifo(&hd->doctor_queue); +} + +/* ************************************************* */ + +// TODO: point: changes may be required to this function +void term_simulation(int np) { + // DO NOT WAIT THE TERMINATION OF ACTIVE ENTITIES IN THIS FUNCTION! + // This function is just to release the allocated resources + + printf("Releasing resources\n"); + term_pfifo(&hd->doctor_queue); + term_pfifo(&hd->triage_queue); + free(hd); + hd = NULL; +} + +/* ************************************************* */ + +// TODO: point: changes may be required to this function +int nurse_iteration(int id) // return value can be used to request termination +{ + check_valid_nurse(id); + printf("\e[34;01mNurse %d: get next patient\e[0m\n", id); + int patient = retrieve_pfifo(&hd->triage_queue); + // TODO: point: PUT YOUR NURSE TERMINATION CODE HERE: + if (patient == -1) return -1; + check_valid_patient(patient); + printf("\e[34;01mNurse %d: evaluate patient %d priority\e[0m\n", id, + patient); + int priority = random_manchester_triage_priority(); + printf("\e[34;01mNurse %d: add patient %d with priority %d to doctor " + "queue\e[0m\n", + id, patient, priority); + insert_pfifo(&hd->doctor_queue, patient, priority); + + return 0; +} + +/* ************************************************* */ + +// TODO: point: changes may be required to this function +int doctor_iteration(int id) // return value can be used to request termination +{ + check_valid_doctor(id); + printf("\e[32;01mDoctor %d: get next patient\e[0m\n", id); + int patient = retrieve_pfifo(&hd->doctor_queue); + // TODO: point: PUT YOUR DOCTOR TERMINATION CODE HERE: + if (patient == -1) return -1; + check_valid_patient(patient); + printf("\e[32;01mDoctor %d: treat patient %d\e[0m\n", id, patient); + random_wait(); + printf("\e[32;01mDoctor %d: patient %d treated\e[0m\n", id, patient); + // TODO: point: PUT YOUR PATIENT CONSULTATION FINISHED NOTIFICATION CODE + // HERE: + pthread_mutex_lock(&hd->all_patients[patient].mutex); + hd->all_patients[patient].done = 1; + pthread_cond_broadcast(&hd->all_patients[patient].cond); + pthread_mutex_unlock(&hd->all_patients[patient].mutex); + + return 0; +} + +/* ************************************************* */ + +void patient_goto_urgency(int id) { + new_patient(&hd->all_patients[id]); + check_valid_name(hd->all_patients[id].name); + printf("\e[30;01mPatient %s (number %d): get to hospital\e[0m\n", + hd->all_patients[id].name, id); + insert_pfifo(&hd->triage_queue, id, + 1); // all elements in triage queue with the same priority! +} + +// TODO: point: changes may be required to this function +void patient_wait_end_of_consultation(int id) { + check_valid_name(hd->all_patients[id].name); + // TODO: point: PUT YOUR WAIT CODE FOR FINISHED CONSULTATION HERE: + + pthread_mutex_lock(&hd->all_patients[id].mutex); + while (!hd->all_patients[id].done) + pthread_cond_wait(&hd->all_patients[id].cond, &hd->all_patients[id].mutex); + pthread_mutex_unlock(&hd->all_patients[id].mutex); + + printf("\e[30;01mPatient %s (number %d): health problems treated\e[0m\n", + hd->all_patients[id].name, id); +} + +// TODO: point: changes are required to this function +void patient_life(int id) { + patient_goto_urgency(id); + // nurse_iteration( + // 0); // TODO: point: to be commented/deleted in concurrent version + // doctor_iteration( + // 0); // TODO: point: to be commented/deleted in concurrent version + patient_wait_end_of_consultation(id); + + pthread_mutex_destroy(&hd->all_patients[id].mutex); + pthread_cond_destroy(&hd->all_patients[id].cond); + + memset(&(hd->all_patients[id]), 0, sizeof(Patient)); // patient finished +} + +/* ************************************************* */ + +// TODO: point: if necessary, add extra functions here: + +void *pthread_fn_patient(void *arg) { + int id = *(int *)arg; + patient_life(id); + + int status = EXIT_SUCCESS; + pthread_exit(&status); +} + +void *pthread_fn_nurse(void *arg) { + int id = *(int *)arg; + + while (nurse_iteration(id) != -1); + + int status = EXIT_SUCCESS; + pthread_exit(&status); +} + +void *pthread_fn_doctor(void *arg) { + int id = *(int *)arg; + + while (doctor_iteration(id) != -1); + + int status = EXIT_SUCCESS; + pthread_exit(&status); +} + +/* ************************************************* */ + +int main(int argc, char *argv[]) { + /* command line processing */ + int option; + while ((option = getopt(argc, argv, "p:n:d:h")) != -1) { + switch (option) { + case 'p': + npatients = atoi(optarg); + if (npatients < 1 || npatients > MAX_PATIENTS) { + fprintf(stderr, "Invalid number of patients!\n"); + return EXIT_FAILURE; + } + break; + case 'n': + nnurses = atoi(optarg); + if (nnurses < 1 || nnurses > MAX_NURSES) { + fprintf(stderr, "Invalid number of nurses!\n"); + return EXIT_FAILURE; + } + break; + case 'd': + ndoctors = atoi(optarg); + if (ndoctors < 1 || nnurses > MAX_DOCTORS) { + fprintf(stderr, "Invalid number of doctors!\n"); + return EXIT_FAILURE; + } + break; + case 'h': + printf(USAGE); + return EXIT_SUCCESS; + default: + fprintf(stderr, "Non valid option!\n"); + fprintf(stderr, USAGE); + return EXIT_FAILURE; + } + } + + /* start random generator */ + srand(getpid()); + + /* init simulation */ + init_simulation(npatients); + + // TODO: point: REPLACE THE FOLLOWING DUMMY CODE WITH code to launch + // active entities and code to properly terminate the simulation. + /* dummy code to show a very simple sequential behavior */ + // for(int i = 0; i < npatients; i++) + // { + // printf("\n"); + // random_wait(); // random wait for patience creation + // patient_life(i); + // } + /* end of dummy code */ + + // ###################################### + // CREATE + + pthread_t patients[npatients]; + pthread_t nurses[nnurses]; + pthread_t doctors[ndoctors]; + + int patients_ids[npatients]; + int nurses_ids[nnurses]; + int doctors_ids[ndoctors]; + + for (int i = 0; i < npatients; i++) { + patients_ids[i] = i; + pthread_create(&patients[i], NULL, pthread_fn_patient, (void *)&patients_ids[i]); + } + + for (int i = 0; i < nnurses; i++) { + nurses_ids[i] = i; + pthread_create(&nurses[i], NULL, pthread_fn_nurse, (void *)&nurses_ids[i]); + } + + for (int i = 0; i < ndoctors; i++) { + doctors_ids[i] = i; + pthread_create(&doctors[i], NULL, pthread_fn_doctor, (void *)&doctors_ids[i]); + } + + // ###################################### + // JOIN + + for (int i = 0; i < npatients; i++) + pthread_join(patients[i], NULL); + + close_pfifo(&hd->triage_queue); + close_pfifo(&hd->doctor_queue); + + for (int i = 0; i < nnurses; i++) + pthread_join(nurses[i], NULL); + + for (int i = 0; i < ndoctors; i++) + pthread_join(doctors[i], NULL); + + /* terminate simulation */ + term_simulation(npatients); + + return EXIT_SUCCESS; +} + +/* IGNORE THE FOLLOWING CODE */ + +int random_manchester_triage_priority() { + int result; + int perc = random_int(0, 100); + if (perc < 10) + result = RED; + else if (perc < 30) + result = ORANGE; + else if (perc < 50) + result = YELLOW; + else if (perc < 75) + result = GREEN; + else + result = BLUE; + return result; +} + +static char **names = + (char *[]){"Ana", "Miguel", "Luis", "Joao", "Artur", "Maria", + "Luisa", "Mario", "Augusto", "Antonio", "Jose", "Alice", + "Almerindo", "Gustavo", "Paulo", "Paula", NULL}; +static int names_len = 16; + +char *random_name() { return names[random_int(0, names_len - 1)]; } + +void new_patient(Patient *patient) { + strcpy(patient->name, random_name()); + patient->done = 0; +} + +void random_wait() { usleep((useconds_t)random_int(0, MAX_WAIT)); }