diff --git a/SECURITY.md b/SECURITY.md index 31d30021..a8008456 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -8,9 +8,10 @@ Security updates will be applied to certain versions of our software. Please ref | Version | Supported | Notes | |---------|--------------------|----------------------------------------| -| 1.2.x | :white_check_mark: | Current version, fully supported. | -| 1.1.x | :x: | Not supported, please upgrade to 1.2.x | -| 1.0.x | :x: | Not supported, please upgrade to 1.2.x | +| 1.3.x | :white_check_mark: | Current version, fully supported. | +| 1.2.x | :x: | Not supported, please upgrade to 1.3.x | +| 1.1.x | :x: | Not supported, please upgrade to 1.3.x | +| 1.0.x | :x: | Not supported, please upgrade to 1.3.x | ## Reporting a Vulnerability diff --git a/demo/demo6-unified-document-structure/.gitignore b/demo/demo6-unified-document-structure/.gitignore new file mode 100644 index 00000000..79d6c21b --- /dev/null +++ b/demo/demo6-unified-document-structure/.gitignore @@ -0,0 +1,2 @@ +/.bumbleDocGenCache/ +/docs/ diff --git a/demo/demo6-unified-document-structure/demo-config.yaml b/demo/demo6-unified-document-structure/demo-config.yaml new file mode 100644 index 00000000..282d3021 --- /dev/null +++ b/demo/demo6-unified-document-structure/demo-config.yaml @@ -0,0 +1,6 @@ +parent_configuration: '%WORKING_DIR%/bumble_doc_gen.yaml' +demo_dir: '%WORKING_DIR%/demo/demo6-unified-document-structure' # Here I define a template configuration variable +output_dir: "%demo_dir%/docs" +cache_dir: '%demo_dir%/.bumbleDocGenCache' +plugins: # Connecting this built-in plugin will change the structure of the configured document + - class: \BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\EntityDocUnifiedPlace\EntityDocUnifiedPlacePlugin \ No newline at end of file diff --git a/demo/demo6-unified-document-structure/demoScript.php b/demo/demo6-unified-document-structure/demoScript.php new file mode 100644 index 00000000..0681075a --- /dev/null +++ b/demo/demo6-unified-document-structure/demoScript.php @@ -0,0 +1,13 @@ +#!/usr/bin/env php +create(__DIR__ . '/demo-config.yaml'); + $docGen->generate(); +} catch (\Exception | \Psr\Cache\InvalidArgumentException $e) { + die($e->getMessage()); +} diff --git a/docs/README.md b/docs/README.md index 4cd120ae..5fa99ea3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -95,4 +95,4 @@ To update this documentation, run the following command:

-Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Thu Oct 5 17:42:06 2023 +0300
Page content update date: Fri Oct 06 2023
Made with Bumble Documentation Generator
\ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Thu Oct 5 17:42:06 2023 +0300
Page content update date: Sun Oct 15 2023
Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/shared_c.cache b/docs/shared_c.cache index d1bbf22c..f734ecf7 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -eJzsvXlvG0uWL/g+ysMFGq9qBuiKfXFhMLi272LMXdy2u/uP8UMjlhMyuyRRICnXdffUd59IkpK1UMFMMplOZZzb1RYXKZI8+Ys453dW90Iy+eK/ly+4fPHd/AoWbjWbXy7/43x+9h9/WUH49JcFuHgB/3wR/3n199nZd391L2jz+0y8+O7q09Wrc7dc/nC5mq2+vJqfn0No/vy7v/7+Quf1Xl5f+HN4PQ8/weXHV/MFfHzrFktYfNz8wcevf/HL/Oz3m4t/vH20vLPk5qqU3P2UzYchL/77H//4R/789sV3aXYOy/+IcAWXES7DLD956jvwF/89e0Hy51Rk1+d816ywyJ/01fxyBX+sPr6+WfTLxx/zVb4+/e6FWH8wtbn8m/zri0t3/svs8m/f/TV/LP3iu//+pxVcXJ27VfPhZot/+sfuD5UXMS++C80FL1f5Inmhd3AGf3z319/+uvnmF24VPr3J192+lm/BJ7f8tL4Oe/EdI9QkA0FA0jxxEzjl2lgwSnibXPjur/+YvaADfGe26zu/++H717/+0ObrLjMmX3z3lz/99z/9+U//8//+85+WsMoP/vynjJlz+POf/t//+X/97/8z//hf3/3vP//pn/+PP//pf/1/3+X3/+kff/7LdzsENXthHosqyuSITiLJLKMgLajomRPCKK4lEXotKtaIaieMS6J6PVtkyM4XX+7KizXyMvnC/+Poxf5HFudDidNdKGve0LSXS94VnTY0glRaORBMcWKVoiIyoqnWXFKeRfePzW/uPE4u3NVoz5L8DdYfJ0sznM8v4faPlaQJjHM0EE+aT6TswZ/o1b2Vt1vJ7L5PByz4P66X7gxeza8vVw32ab5rhve2eLq+XP/Ob+4C1sDj6yMgo/Hll7du9Wm5Bp3s7XpucbbcwqQ5rm8frDf0X5aLsEGb7U98812AGRKDzcsiI3C2al6G9dJZk2U1HZJRUnJQyvogZJSe8xiDZCIlWH/Gw1H55v7V7uBzfXQdI+Cnlt6FVHuCy8D2lbV088bdHjgPLnO5nJ/Dx++vrprP0gBMPr7hm995Nb+4cJfx4/cx/jpbLmeXZ/kXXp7Pw9+W27duvo5U+5eYNZ/RnW9fuYu5RgFlKDzW1ffXeOmWcOe6vLmu2fM3Wd2ev7l8tzZAfo0ftnrjziqiufJTQrpZJb+2Fvmdv5P573acjbv/7u1i/p/5y95cfvl+tbgOq+vF3QVV83XoEwvmBc4WsFy+dIu7j390a/3V/LneGhN7//z96sv57L8g3nnt1nTgu3bVKxc+wRaS68cZfxdv5/Pz5s9sI4bHN+H2z36Zh3zLNyv8EeBqc0z4Rhq/zVc/5i0Rb19fg4nsFsOuBdcPN2utX1j//RqN+um/f//JLSCj7+Kq+fIQ829cX2zsMvi6SoNHudN23K4yv14EaD5Alv8jodAGmmLnMZrvSJqdXd+cyHefrf9SPP3xn/7LfGpkLdWoJne2XqUBp9n98e+t8vWWvLn87M5ncfey9+9QA1S1Gyn3Fv83d34N7yAD8HM+0r5fnH2+98p6rQa1qsXXvb/WjVH4eL0GxerxLtiz3jtIj5cqILuw1L1n68+Z6cgaU6xBtm772T4s3OUyzRcXN2t+mK+Nxjuvrxdt4K4fH19tF/36wv3PynafJo80VHMkP7Zj8wLNDtA7QfJAxa230/rf/we+3D7YHpzzBx9LbA39jqu+huSuz1ePFl+v2eyVVubE/TVviMWWV+xeWz0JxyfXdvkXN6/e/+p6t7Zrt1S+z7O16cHMkxuuxTL/vnBX2di4o3XYepe0MRgL691+Or4+/LuhplntV1h9mm9sAtpJ4neU2vv8lbKR9jOcX222Fme7NfyB7KdZkbeFWkfLtVlbtN1weyz3e6jjckty+uQDzbrNxjBtbtPudd9nU/QGRO/BLcKn+8JoNotogfIdG42vd8hO3Xn/b/MHOmvA924+X+06ArlteYY+tYAgLbf8rgWWPy3m12sLX9AnLaqnlrknENHsA10S5sallQ/CjYm/tn7nlw9f/dGdN+b79ul65WY/mNIXbLlyNt0+NGdwPordrMHa3Ys0G8OUvn67i6xtPYhvLu+vvt4gj8lP19U/LK4fyEbtJmalhbePvt55/aSl1mqND1+u8h67vliv1WwLWTq7nlzrPpqaXcFL93zLlTbP1kyL7CaYX//knjW+tknuvbJehO6Txf1FbnyD+Zx9vNZaM+w0unau1eBzc3bPF48X40+ahTsXewfherGcfYbiJxT71OD9RTfnafM5Hy+1Jrql/fNgqbvP7t16+TRx2L/SAwUi9dOW4Pn12WzzePvwF7fMcDpbk+3ZKn+ix6+s1zRPf9NHazZ/3fikYYO3r0/XK9mnrazSSs3Dn1cX55unm/fXroFmB6jdO2Dfeu+Wq0fL0SepzXaNHz5nRnxzV37PutfF0t1QbJ/kNgveOuNfQiYd8GoBWWWvnUoN9NYr8Y4r/X75E6yaRRrOtf6E60BBXkm0+5J3Vmq+5kYB5t/e/NKrTdBmvWCzEcTuE3Cz4O+X51+2lskfeZc20llfY/3XDfhF6RZufqz/4PVsedXEdTZoUnq3c+zhn97bbGrtz9l9Atz9o4d30j551n69eU04LyzyLyzvPv5qOWvyJCnYt8iHv8/Ofrj8PFvMLy+2ktN0/2otg1PNauxJ865DVLBZiD95ApUWunnv60t3fXhPG/Hd1rwHBS07fNKtN+zWMfAEHdXqSdv0yTUh3mN962X0kxyr7TIPAKzNk567Rys+oPDrP7f7ZXV7RDz9yj1ZGbL/rrZY88EXNfRJnXC7xo0qyCZVgOVyfl9X3b66Xu5ptltY7qfZ6tO1b15fPl6xxQZ5vOKjV+6LstkgvHwW3DxY//76zC5/hpsHX88vo/Zj6PZOb+26O7vY6P1naHPObS3mJjTSBPAvVz8u5he/QFoD0TxNQ3cu8up6uZpfbJ7cF5l90hTcu9ADyFnypAbcudSPsz/erxbvZ/+1/iC2AawoHxl3//rtAs5+bbTg+o9ZN5nmP75yixtrdmsSWN7tE/zL9XwFF7By6z8WTxKynX/8Di7mn5tLw8uF+1sTk8tryCep+M41svQaDvZh/q+LTbBlDcydxGPn3zek+MP81TzCOmi3XuKJOFF5iZ+zgs6GzXoB8yT5ebDANoB+g6jt03vgtHb/IVZa7AFAKSFtwX6z3uuF+/uNZln7j36Fy+vNWi3sjqfXutFSN9ijpDWCb5ZrbI5s3G5N0OVmFd5V+rchyHyw3jG0NquJ7qut7kmrWXULTkrkk/xu/2o38rpdTD3pb3hiscZ6v7Vpb612SvSTPOCJhd4uZpeP/GnfZwW33K5onozu3V/xV5ft+T/yJ1ne4tO2PACaP91hC9N1eJQ9vPbmx9e4A11HQfnDfXD31+7oK7qJdj68cb+4y7PrhpC6y3i+5sz3nt/bx3Qd8Xx0Ou5Z4uHu3R38fLjI209XTwahNsus7d2Hd3z/Mg+CCvkXNm/cE9VOu7fF2l8Tvjbr7ERlp3UeCm+n96LFivkUXbkbwG+W2mkEd13qwedjO30Y+xd9/eXSXczCJsRz50NuIp/d1/sa8n4HafsB78e3N8HPh0fP/pUff0S+y6buttBDKe70anRb8v7OZTv9e/tXzAZ6NpdXX+5+X3UYbu4v9fAb610R7v2Lfr27Nw/nizvMk64joVmftl/4kYO72Ys3mH/45ptlViOf1ylDd7z6dB0vzZryhFfNNmtYNRkud6+7jqxmG+R0173257Pw4KJ0fdEO967TRf9ttpz52fkaMvcuy3q5bIvL/TqPszTbAmod3bUdDqSHF9js0ZZAWsd7bYeDoP3VdgOoOSbsEbh98nq7gKPWd7CDJdDuao2DtiHZr64Xi2xR3aDr7pWb08b2fuEnoWqOvIs3R2db1GyOn4duhZ4uuBM46yj2MRItXHEHdMTmzOmgdNtebz941pFye4JLPwWfdQD9EZkvXHDz46uni66j44+ij4UV7ofovl9+uQyPQoZ0HRV/lN7RetUNx386kEjFzvSR1uvfpA9ubP244/M3p4DpgNkn1n//ZbmCi6eEtDPjdudFPl1tn27+cCeJLP/h+02QbEP71wF100pTPYourh3In67er669h8WDp19DjHQdb28nwn3XaHJ151nKOy6y3nCtcLDvIvnhjStivutKvDeR5Yf/ejlb7bjGOlOl1fGx9xrLxfp8ajLNH12mvSbfd5n3Xy7S/PLL+gZdZsntuNh6p7YC+b6LNe6QHRfQrY+Cu1HfLUn4/fLVJwh/e7O8y6vd5UtonEmb9U3HG38vdP59yidBs1bee09T93W6wKMUpbbX+P3y+xjvLN44fO8tv84eaHUPuoSj7igR1d7OL1zh7bYs7sP813j75ObdXb6wddZBK4O761WbJ3d+aXM13pZ5F7zD69V/dVebFde6t81+f9p9ullwbXMuX87jl8bXv1lc7nLt3hSg3LoBP7765FY/Xa0+Pqzvue9PVDu9sU+vtqm3uXm/qcG5kaLe5QV6eqHHFTMPPpj56z/+sa6KbsygM1g1mw3i74t1bgn8Bn/ngSbGIAVNgmFCJUe49cA0d5JTJ5tqshNlom4KHq04vNKrsPqOmrJTXWldVvblphCyXFG22ZGn+BQPCzIZ2X3Dm/eapNJTfIYHRZr7hFHCpRKESy4NdT5aiFp7AVwTr4yURASFuOyIy6OqGCuD7VGyKp62loBMzGlPg1XBeqFTfmIFGKIp4Yjqrqg+qrC2NlgfJawSrrX3hBqbiBMejPIhH9Q+aEYiBJlsnAiu5WC47lbsXRmOuwmnhFuWD2JnhNXBSMalljyCEFzGCMkogedx5/P4yIYDlSH5WHGVsO2iSFEo45jjSlrjQAsCjHkWLE8sIba7nsmd22BUhubuAirh1zprqLDGR8Wl1ISSlATnJlAwlkaP+O2I3x7bsVQG7B4lV0I8WB6Yilz5bJUQI6X0gTGl83MWsm2CiO9qjRzaL6gyfB8sp6Jt7bViTLCkZCRgHJWZD1IIRMr8CkyFEw6I5oPbV9UG54MFVbRHVNSeeWsdE0lYamW2RaKwzrmQoQ6I5672dNd2apXBuLN8ymwQlALqHPFRq8SNs1S4SAzLUBbIBrtb07119asM1v0JroR36XQTxGZUQwzMG8dTSJElw4ng1qH10YMtveu2PW46WRm8D5ZTMRqepDCJUSmZItSppAMQ4ZQnlLrkEc2d0XxcC9TaMH2ctErIJpQEyow2ShDpoqXZlvYxcCVAOqMZIrsrsg9sy1sbpA8UU5EhUuK0bQLhNnHKvSeeGABvwEttlUEsd2WI3XtEVwbjAyRUQnBIBIQTErSV2ikSqZBWKKeDiilozLrryc5o26u8MjQfKa0SsqNzQWYeSCyjVCbgOsaY7Q2VLY7IIuY5d0X2afrnVwb40wixGJXhLiQhtG9mxRBJpNFcxSb9CUwiyCS7+wH7GPVQGex7kVkR5RaiI5rSZJjjOnnJXCKMNmPKOIsOUd4V5X0NIakN6X3Jrcg7SbZkdGRBRMutlkyrIBTT1IoQJEervTPaexiRUxvQexBZ0U+oiWjm3QmRD3FColQpusRNJNrSOJkKg28evzxgdlNtSO9NcMUz3VjCXYpRmqSdVi5wKqxUjEhnqaGI945473e0WGWY71d4xRzYYGzyEC3xkgvOGBfSg4PAnfM+oQ+9M+57nn5XG/J7Ft+enBWmrElEBKkV95FacJaZFGgQTE8F++JbZsw+usjuEY2VofxwQRW9MFLHbMSACFbaBsyaG8hnO3gjk8Zq9+5neb8TQysDec/SK5/kyimS2SlVlBoNilsvqBfWKhGIQOu9M/L7nGpbG+77lF0J9d4o6cBqHZkEyAc/IUIaRTKBpRowx7w76k8xd7k29J9ChsVKC828B8F94DRR4ygFyokSxhnilURPZT/e+Cfv4M6RbJWBvg+RFb00IIPxYI2O1AlBmirlZJrC5UxgI0OMd2aqR46urwzfx4qrmANpYG2le588Y0QSIIJEJXS2aQglWOfZT+5Ai5u1nUdSa1V+b3IrxpksJzwSEhzn1AZwnFkdZZSKEhYm43McEO2lofQt7lqdB3pPUisiXTKbJJFW+Iz0pJxTUquUeaq2LCVkp51tlm7+tOaebVpxV4fuIyRVQrQgyQjCUwyCJsKVYEYIqTwFbxwIzPs6HdPcPFk/fp+VbNOQftvwvzJo9yGyok+RUaq0NDx6LZVNGhwYyrQIOnAd0BrvjPE2/rDdF3l1Pr+Er/KpDur9Sa6IeK4Sz/wTuM9gl0JTC9lKifk/DTpgRfRJvOi7L7IZX7+5ygyW9WL/JDIs7YIkQURNjCeSaM14EEyCSl57IZkMWK93ktyB3Re5fVSvQ71n6RX9j44rrzwQlW34/G8+/UnkmlsTPBi0eLojv41vYc+9uzeLvTbs9y2/IqdVjHtmCDjOAyiRn4NXigme94HGeVSd0X8iYdW2CU4lxj3dOEgSkDWG1kqFmJKTWhPKPfWWKsyf7LoXRIuIyuZHvZbOQTIq5kJyFiXTPlpJPTeJqiiSjyG6EISzyGc7e3B2No24f5G89FnjRn43n6+2jrd6DZjjBVbMhdHa0eAYyce0sEYzIkjGNxFRaSr8VOx1NqqqDcT1UYIq9hptGsIwD4G56LzVQJJT2kVrGY9e4XndGc8tkpV23ablT4v5dX0zY48VVzEHgIuoXRDRcJ5N6KQp1SlFzbgzIYJFbHfFdovagq83q16r+mA5FaduUhWMDBAF0d5FH6kQREAAYkQGOuZudfYUlrjPj7Pz1bomIK5npH5sRjrNLx+++qM7b2ZPbp9Wh/MTSLC0AwylIZvbRgqfAe+psMQR2kzyVIZGh32+OnsLS8q35f2bncOHpmxmfrlys8bzW+tmOK0wi170SAMFzT2XglqTnzgZtWU6Ri95RDun874o6e92t3LdTxzim8uKN8RppFjaCVwnGXnkXMnEtJSNK1KJGINLzjoucCd0tZEeD5Hveg8/LK5rNpF6F2DRO0kyzSVUK5YE9wA6OkGskCxxrX3ESr3OjLcUDX98+7aPKnXlHCOrYo01CEtjtvSplIYmq7kDMFZw6rx22Gmge0yplN9UvlMfvlzlS1xfVIfuXmRW7gHJiKCBeRBeg5TgnElMRcOpSIqgJ77z2V3KYn3yjlXstTxWXsWJHFJTyySD6EWCQLwEZVkI1ANJiiK6u6Kbl9wN28n0m2fVAbmLaIpdqDkYzjO2lQyMA9ecKpt8UFbxjGX0q3Q+kUtk6N4ctnX/wXuvVIfi44RVnpchGECgoDT31jIg0JT/WyNiZMAw07BXe/r+rXo9W0DTqGEGy7rh3YvMir5Aylk+sSXIJLNRLTl3ghjCuDDce4m55Z1RvrM58s471gQyNpVg80XlMO9FaEUrRUVrOAskQ93SQIIkIVNH76kzOhj0jnT2eZeEdf+WvYNwvVjOPgMe68XZAYcKr4R7Sq3nAhiTVKZmXLoJ3tvgA4/AosXzvfP53v7WbRZtDqy60d6HyIo2TLDAg5DcSSecYpQ0zhKSrKE0SYdne2eMl2LSD27Y3Wf1egV7kFi5fy5PNhGraYqgwOumvyjPfJRo4yPWC52Si957VnPNcy8yK8+jttHQoFMKzEjBbaSsKXFuMhqD1B5R3tVG330qnV+fzTaPtw9/ccvV2/VHvLiYrfKJ9PiV6tDeq+yKqE/KkMSiE0Zplk0XQm3QTTlzSBn2U6mV++bWy6M719yjX2aXf4ONa/jr0+qw3oPEijX7WscoGCMA2W7hIv9jkiMhg91SIjBC1BnhuysKSverefjz6uJ883Tzfn0470tuxV51oImT0SXqmPKGaMt4Yqzxu0gqMA+rO9p3h/j23bV3y1XdYO9JbMUYKSgZhSGGE2IYiyKj3qZIg/GUJoMne2es707K2NypHz7nX7654u+Xzd1AclqcQH2I4Ip9W6SnzUiAaKRvZu8Gr2PGumpK7ZTUOMOuV1t9c9tuJk99fAkpv7m+F3n9/PuNm7g+oB8vsWKcVFgRaAa41pxrT3z0jIRkBZdeOoXxolMi/PfLn2DV3Kp3sNycT1kTI8K7S6zobzEJuGpKpDmTXkURucqAj0w7DYJjffQJbJY796u5H5tV829vfmk9U/CywgEvvQmuWPcshEnG+eStJ0QkbkFkO4Y50vQUVQHx3hHvYncFwOa2/X55/mW71B8Qrps/X9/J6sB9oJTKtokHpUW0KgJp3IchoxmSsEqFbK3gbJfOSC65CDY/1rfl9Wx55VbhU4Wu8UNEVMzHksFZz0JI2lBh85tUGhJpSkIbBcggO2N4dyPLuzeo3rSUbsIpdkBUgXppmHOGOCIlkSRmA9pT40Fj95QDcLtbWHdvTc3+vK7iKfaEE84r2bRZBp5B7Eh0RBiTKV/j7YgasdsRu7uLrr66nbLgY1jkX1jefVzpNLjjhFW0h71JyfJAqcuWQ9DaJRoE1U4wwRjFM7mzJ2Nnb459t+rD32dnP1x+ni3mlxc1Mr2epFa2mpMUEcBlqAcPRKRm7k8SmfZZoiTmv/aM9LVj6Y/Vx9dw1bx0Gb7clhd++foaIv0wqRVzpTxnDgixzgVNwMtsogQfNYuGS2nQW9cZ6TspUOmeNUGymkF+tMDKk08cy/8LPLh8dmsrlVVEGs5s8oZiPVpnfO/OUy7drpv3vr70o1ufUdVBvVfZFU91CdwCc9RSJiHobLCzmI9zRYyggaPXrzPqd9aidLtz9boFe5Ze0W8YQ5SNqyXbNYZT4mm0KQhtCRALEu2ZU53383Dd8KoPC3e5TPPFRTPIabN+xbjvU3bFSc3c2uiMUho8xACcheiDsKCM5Rp7YnX3OO5MlXjyzsE2U+LfF+6qSp/jkeIq509pRzTXVHHHBTMpAfVEQoypCWti/lRnhrozU6Ltzao5SNSj5Ir9JazQSiYP3MnoTTMXKyXKUvCCZh6LNkzn07ydi+Hmhe3z6uB9qJiK1WmGEENDE8dPxhAqE4hkCTOGJ2AGT++e7fHNEvmtp19Be7wX2RW7hlNBAvfK8iiTIUJwTxgVXCTJnZXof+nZ/9LiztVst/QsvaK1HoW3MiVhJDAigmTaUpn/L5CQJPrbu1vr5XSOm2rat4t5gOVyfr9Twu2r1UG+L7HtqUZOxIcomFNUKZFY/pcB81zabPBg/6Cemenjm/bTbPXp2jevLyuHe3+SK8765EqQbL9bBVIpZ6hqvO15C+QXqQg4ya1na/7xfXv0Clrzvciu6F2PygjhuQq8SQIzXnJjVf4BmhPlMRusK+p5Oa/p5kF1iG4tl/JMH0GyGcKMpk4LmbTiklhJCGFO6oRo7YpWUT5nbh5Umm7eUTpFvzcRxBGjszWhlJFK6mxvkOil5wmMIojcjsjd49C9dWptxxvUmpZ1qJiKNoMHa7nSHjSNKdLoZEzeJW+UpzZg7XBnLJcJfZPevx2H9/H7GN80SUOrHxfzi18gVRjJOUpYxcoI4/MRbYkPjkWjQlIECGPCymwcc6wB6u7zKB8+d2/Vq+vlan6xeVIv7TteYMXaTdI0WaPCWvCSBZICsEzxvKM08OQwXtkZ3zuFtfd21Ryu6UNkxZoIYpx0XCsAR6y1zUBj72QwQoTo0c7uzhDL3te7N+zH2R/vV4v3s/+q7+A+UEpFxsiSScFTylziTDLLg5c8cWDSQbZUEMldkVxO5Lx7j94u4OzXpgVNfUA+SEjlqHlqUqIIGBsYlUkFxZwx1DlplAoYNT8hW8y36MotbuZ/1dgA8zhhFb0gYKjinBtGHaEgiaeGR+6dVi6IFBHXpzuf/+V6voILWLnq8HyYkIqZHlSKZKSiIakoSRBKEO6AKwUyW9OYz9f5fC5Huu7eondwMf/cnDXwcuH+Bsvq4HyUrIq1ksHyREzjqZYmaeKy3WyUDTRbz9mmxjqDzqgux8Lu3qlMbz58uYIP839dnNeH6EPlVPRqgFEsWsdTlJQpJZTxKlDhlKdRCPRqdEbzziHpO+/SB/hj9WH+ah7h5fk8VGhBHyGqYsc1oCGKyLL9bMDnk1oYbYNVOmpjJUP7uTOm27tWNzfqZ3Axr14fog8WVDF/VEqhgYSgOLMhH9NApLVGMEWpBob+us7RlTYHzxZfN8GC7dOKI4i9CK14bkeuNFhjRT6sTWKaReoDN6CF54RhB9jOOG/jotp9y6qOJPYktqLv2lpiwVJjg9GGSeu1FUmk5JvRCQmxfpKI+c1Ne71wf3+97TewXuxXuLyuD+c9iKxstwC1yQtHFXCmfEwpBcUgCJ2IEYjxzhhv49PadcNuempUGajpSWrlzoFUKWUYI1oCaJ+ywd7MEAHCDBDACq+TRCJv7lnT2fQnWG3nbFXo6j5KWMU+JJqpkJKTBqJ0yfJEA4T1gIZ8phuOuD4l88zvN6usC6zv9GSvDt/9CK1oqQRGSZBN8z8qnMyPuWNUaZaf0eAQ5yfG+eqeZdncuhoDPP0Irdhhh4MA50jIZ3iGtQwyeC6c1vlB/omxy844L/eIefKW3ZiWVcK8D5kVI/TOOq+1MCAUYynb35RIJYn0jAilE6K8qzXeJgf55o41t+N29FedI4OPllcxq4o3J7iOXAgmeGr6iPAQhFFacyEpZlV1PsPbJL7d3K23i9nlarPq1wt/v/xltqwP5v0JrpihYkkGuRGKCh0YEwyYJlJIo1Ui3OJp3hXvooU/7Fc3u/zhj3wYLWcVBoAOkFCx+tcSB0QGa0J0QiZhgiYxEqttkoFgVXtne6RFJlxzf2qf+XewnIpoToY6KjVLEmiQkVKVmhoyyxhNFH0lndHMHp42mx/NL1fYk2+PNMrzJ51JkngiHVPZPtZKGKczKCEKEzEK0xmZ/KGw7t6LWvvetBNKMc+J2GbQNbGUORcCYY4FoMozS7l3DruBdLYHHnqUfnGXZ9f5s/zsLuN5vtCD5/Um8R0hqXJ/G0M09TY0GHYZygKMCcoyEpUWAhHdGdEPteCe+1Rzut5RsipXenmiOZAULJFUC00VC5Q4wrOBARo7VXdGtd5zp95+unpwzabB+OZhfbg+TlrFDiDSKsGaEi/tYlQyH93ZbNZK6aSVxx7snZGtH7pC99+rVy58gs2/zeTC/AubN2q1q08hwqIVns0UHiVZZ3uANTRZIyjnkUUmvcCqms6n+wE38Nwtl7Ue70eKq5jnkVK0LpHgUlDJEa9j5pXZdpGCE8YMYrsjth+FujrdrIqN8/4EV7RnsoUeQ8iHOeNCCBO41ZJookEo47D/ZHe8P4wctLht88vlyt3EeOsD+vESK/aEcowzzZSLKmUamjhN1NMUnFRSaYuZe50t9mPvV8WHeq+yK/YVNpFGpRTQxAnR1lNFdcxmTTMlkhKcytH5XH9YKrL/zr3+cukuZuFXWH2ax1oP957EVqwh48E5nRJ1MShDpQkx492qSIWxHLHe/YTvftN++CPA1foy7yBtr377WnWo71+ARRveW5M5q+Zcm+ZxcCJqH6gQiab8u4j/rv6Yh1nI+29f1Yf80fIq99wOngADMEFwQpnXylipDUv5sGcWa+E7WzLH3a2KrfceJVesHTZcOKVBM0spOBs1pJCNeWZ4YEFjd+4BfJB371u9SS/9Ca4cU02Q7RcVXRKJ8Xywu8Rdxr8QzIaEWd4D+CDfLuZ5sdWXSi2YHiRWQngmpoZoSYOlxGovVT7fXbJSei+4D5j5PYAP8v79qtiK6VV2RdQrnoxWAoKVKVqhGVfRG8IcAWU4dpPtjPqHbQ7237mvzoSbh/PFvy/c1VWFo4P7Fl/ZhvcsBhYZeEFk0t7xlKjQMRAauUbsd8U+JfsSsO/cvU2n4FfzyzhbX2YdGL8JpDx8883y7WL2Od+225eq2xnDCre4b7KBxISKMgZBnHAybxoZPEvOZyqA0+QP2Df7kryPubXzVf5wEGveOcOKt1jvz5yyoJNVTQdFqSJQmSx3Xpnkg8G9033vPJRWjzf32p/PQs0bZ0DZljPgwEWnmckmm5NcMytpVkJNtqcUENFS675rOtjZne7sv82WMz87X1PQevfNoNIt2moicSBCN4OQHHMU8n5hlkUJjlPFMe48/M5pcU9/ncdZmlVI/weWblHnKEeMoTwYRw0nhplEFLUKAotGWqz67bpzbIeEm4d3cROxQq/Aow0zjFBL+0SQaIQliVumhNY885vgtBQhSe1SQg3TeZ90COi2v6XVewGGEmtxrwSSmONaxWiUYyKwEJhROltiPhGJlWud98oRnp0nb2rlrH8QmRY7UzAjVYokCkcZzWwlRRcS5yLzfmsoWl7dOUuHZgvtbunvl+dfflzML15dLxb5YjektdItM7yAi/MevM1cnxmT7bJgmLM0OS9E0ElC4ID7p7OW6f3uopdsMKkWu40ryOyFumyKMeU41RE0p8lrownRuFMG5S43CUzI8nvlLl3EWqzgU87ZBJpaS4yLUYIFkTLLF5xrKbHGo7tVRk5zV6un+gNKttinhqVmbKJg4IOIxgA4DYZJrxTTwWGsf0g7rHBba+f7w0i1GKW0JOoQM7/3IkRFgtcQkhI26xdOEk7B6K5bOpTBtb2pyPnvK5nhRVzsoQNEJamCTdrYwE3eQoxQRYPVxgSHFVqdtc0J7i/y/gHlWuzpTSMViTjmoo0KHDdJBk1lkxMjtMH63a67RXZIFdz8+BnOrypMcTlcUMW8Yg/KEaeaulwWgiVMJ+/zS1pypgRWL3bFs+5wm97PrxcBfpmHZkjGx++XXy7DvZeqw3i/wivGCsFaGoKgLEFknHLPo1A+EJKsMR5x3xX3j4TV+ta9ul6u5hf3Xqu3K8OpxFiMZoggmPfRGQGJWsmlEjKmbP1bpyJHFj3cXljfsUt3vmnfHuvWBqcSY5EN2xiACZthLxW3MjpiNaGCKEoCYzhHuPNe6OAlfOImvv+yXMEFmkenlWUxhme5d5khEJCRcGWUSoTI5LjljgVNcFd03BWiVU32p6vt0+qQ3lk+xTNdhsSiV1SCzfaMUyxC0kEKriGagH3wO/tsWnWZub0772G1ymsvq0PxwXIqnsVUMeKZcUQHF4JSxiQempnD2jmIeBZ3tlBalcKcX5/NNtffPmymiuV33q+uvc+/dP/p5neqA/wpRVmcWmUEYZSBll5IETjIxCn1jIVoHBC02k9jte+7ka/mF1fz/LEq3xSnlGW53w5ELiCqtO4WEnkgmd5ypkC7rCtwV3SO7LZySOy7k/lh/vPri7z2vPKtcXqBFrWGNz4QS322nwi3nlhmiAYiiUk0/z/uj29iSeWH/3o5W9W9M04pyiJXNlqz4JWMniRjVfKUS5d4Nqe0ExLZRec90SprZe+NXC7WOV2wrHxbnFaaxalbVKhMuYWRzDEubLLcK58skQkoiTgdurM11apeeN+9fP/lIs0vv6zN48t8gbr3xyAyLdpUjlnJQHBmkjY0G1eZkSeINIZMygVOZOysP1p5wvfd0Q9/n53VvTNOJseiNSVcDJFpF62RnkcwGixYRb3jPkbcDafJrNjcuh8+57+9ufLvl68+Qfjbm+XdOcru8iU096y+zXAiMRYnBnDjTTLUCBAKWMg0I3Nsb41LSRCHPWxOybY3N3H7Ab5PK1g09ydfCuexd2XbXUVZ5BSeMeqD4okrH7PNlLeH9k139CSDAGTbnfdEq4jrjhv5++X3Md65gx/mNW+H00ixnIPKEoTMEYC5IELWFElwIg1POjYJeLgTTsEb3sFlhMXtVfNvPv1KpWU3J5NjcTfwQJW1PEhpfCQxW0qhKcoMwKmUBPvLdN0N7foDF25jfnt9rn2Y/xpvn9y827DCHy4/zxbzyyYIVd0eGVi6pZ0TtZSxaVuWOLGEEc40aJX3EuHWOoHdZjp7aduYxl1vbfPkzi9Vt2GGEWqx7tMZlbdINNoSo400grHEktZNlgjFjrKd90mrcbq3N7A50z7+uIXmx9cL9/f1LfzVXVW3F/oTXDEXyiUqDAhB839Gca255cYDTS6BwjnEnfGu20Rin7htP8GmQ8mmG+Py5Tx+eTWP9RV7nkSGxe4VVkuTmpHzhEetTfJSKc6JBgEyUayE6HzqPzR8P8DF1XkWdn7c/EVTl/vJrX66Wn38dbZc5nXz7708n4e/LW9/ozrY9yO0Yge96JtBeZqCJdqraJh0ILj2TYPwhDO5O+NcPjypnr5l78DFC7h5/8fZeY31a0fLq+wdsgy0oAFMNmu8yBBPMkM8CekUGJyc0vkUf0jHnr5bN+8s368W12F1vYCKz/GexFbCOuiQHFDBITClbBSKKMGV0lJRpQD7bXXD+m+1YVTQF99t09k+3uazfWzGJM7PoXnlIpvaNz/3DOFp0tqMFtmGJo1r3gFRSnkWhLYsKEwARSgWoch1CYrfX12dz8LmdpdzBoBG4ERks9YJKbVW4En+L5u2jsXJZFhyhOGJfM8vvvvhjwBX+5HGlOTWZo1LopSgNQkyEG6CE4xrStFHjEjbh7QPnxbzv7t8pT1IS9QzHTVzkctEnE48UiOZBaqojxi1Q6TtCUBn1bpa5D/ZjzUlqDRGMeOcB6cYYTTzCM6090oqNZXpCmww9sztXbvmcrVwYbXc5IW9ni2v3Cp8aq7WPK+OIneSTdHq457ZQJLgjPmse52MXEtqOYsmWIn5cXhClnmw3UU+dgLx6/MGkv9oUMmzqNLsHJb/EeGqiUddhll+8pcVhE9/uXBX/3wR/3n199lZc0m+ueTvL9TDYTrrr3Ybzmq2A/yx+vj6ZsUvTdd2+Pp0Czy6vfZNC7tfZpd/Wx87GSb//U+rG8fSf8TZ4p/+seMT5RWykENztcvVpv/7OziDPzYgaDTHRfNt3+SLbl/LC39yy0/ri+QtpbxhjnJiQDRtgpXUSUZnJYkCtBSNummAe/ovzHZ94Xc/fP/61x/afN3N4fKXP/33P/35T//z//7zn5awyg/+/KeMn3P485/+3//5f/3v/zP/+F/f/e8//+mf/48//+l//X/f5ff/6R9//st3OwQ1e2EeiyrK5IhOIklOeZAWVPTMCdEE3CVpsq/+0Wim04tKP4mNxdrdPhJ5ZdNWB0o9AcFtoonxpqyYxhgpENZ4N9c6IS81v9nay/84n59td57456t1EvamqeOjr7be/vn8yRe92uYIbU6Lu0nZv7/QD2tG2x9Bt4+Wd5bcXJXe+9DrD6PWnybfmnCej5/bv1WSJsjWGLcCRPOB1MPgSfsP9OreyluUNOnshx6y9xfcoa2a/OCeFn+oOChfozsj8uWXt271ad1Ar7lbPV3vgZJwL9gd5vaX5SL8pVn65os2amz94oMkhQ1GbX8ynu8C1ZA43QfTSCnC9A5MzVeY3nYcPzlWv1o2O1XJtjpl8+NBH/SKsOropsgYsbrFql3b4s24rDeXy5XLa208BicBK3nx3xOEm8hwm62alzfkIzMBCZpYIiCpYIGxILknmnPGXQqR+XW9yqNkt/af8c39q90BI1tT0yME/NTSu2BpT3AZ2L6yli5pvo1+WHx39zy705ngF7dcvV1/xouL2Sqv//iV5pOvA/UPOxA+sWTzx40J3WQeNgp+dXG+eXrT62AjiEdx/3bLvVuuHq7WOKlO2TN0E0Y6aQPG2Qvx1yEa2c1eyN6Etbst2OyF+uvJOyzNXui/DtSmZsO4Ttb3Y/bCbtwj/9g6SZ4sSXI2Ghp0SoEZKRr7MfM8SIbSEKTGvIGuDudeT8jK/IC9yq7YplzrGAVjBEAIwkX+xyRHAiPEUiKwhLUr6ntT4pUhvje5FcuLsgHsZHSJOqa8IdoynhgzwXtJBcNWsp3R3pONWRvYexIbDqAYaSOnrgyoMvzjAIqp7AkcQNHfpsABFBPZFTiAou8UVRxAMaX9gQMoRmZJ4QCKb78ncABFn9sCB1BMZmfgAIoTGFQ4gGJiuwQHUPSkOU45gKKUAmYAU8BmmFU7htSxAkw9s5hVe/fMEndhushn8tpibN4eLre2c/laTYA12iFgMbX2xKm1JETDXWrSar0h1PHINM+kD5RNkW9GhGBq7b7UWt18mUedZu8Gxx/MsWhsxffz60WAX+ahaVN1DxbbYHspl2qz3m1F20tI+c215bnpZ9jUs90m1HZY6PfLn2DVrPEOlpvPt6552+TStviGdxZqvuNGtvm3N7/0alMHd5s5e6I5UZuk2VNO3dmmy55mkEmTKdsq9ZPK4KxnITRUVNj8JpWGRJqS0EYBBsC6ktFuxT6VMczulVBPdoeXnnJqs+qR3jnvg9cxGK+E50JJPRXcDtVjqhdVURmYe5BY0U0orAg0A1xrzrUnPnpGQrKCSy+dmkpfST1KhD9hwyDCu0oMZ8+ua5Zw9uwzgv3pZs9uTHFRaFWzt2HGUM1r5M5eLm0+49HtbEKSyQcAQimz+YywxHgtmfdSW2abVFVsZ/NXbGdzwnY29ol2NvyfF1uJ/aX5Mq+ul6v5xc3Ak+V4+9rIsqdYUEYieorHEIFrQHobgvvLzf78SxNU/csN0G4E0Phid0Xm/pL105N/WlcMRFAvEyJ7NK1wHg3Wua+G7g+Qun+8VtsiJ2M4SsQwxvFOHcfLpqNQQLQyWiodHXCaX9DSyWA5MxjHa98iR+10WxRmRN5UZ6wX/BUur29DeDtR0WIl2EbObqJvzbeXO4tvn1isIQDNDL+Npb68jeB1OcJ/2szQgaaE92XDBMIi/+nyxrXdca3VPSk1a/7r4vwmVqceZq+1XOtGTtulmqDco9lYpaUabr9xBizvxCbVk7HOJ5Z5u5hdrh6ShO+Xv8yWt27S/uaQbrjRSYY7tm86Yy2xYKmxwWjDpPXaisxkk9ci2oQd9Tv7t3s4cyrz9PUhshLGjQRqkxeOKuBM+ZhSCopBEDoRg7Peu2O8H21YG8z7kVpxnikXUbsgouHcW5o0pTqlqBl3JkSYSjMlMRjS5e7Y272LvJvPtyZDvSklB8up2EBGUqWUYYxoCdAMLxW6yZQCwgyQTQ/wCaB5wOm8RxGP2iB9lLCK7S40UyElJw1E6ZLliQYINBN9ny0Ug1OnO9sjvZDhyvDdj9CKdndglATpg7BUOJkfc8eo0iw/o8Ehzk+M8yccNYjzA4RWtrpBgHMk5DM8w1oGGTwXTuv8IP+cSgbVgDjvw4lYG8z7kFl5wrpuTm1GAmhhjWZEkOQjEVFpKjxMBOUDcssWwvrKme5GqSqD9uGCKs73dNZ5rYUBoRhLmU9SIpUk0mdkK41NtTrj+dh4TW2wPlZexUnJvLFIdORCMMGT8SHyEIRRWnMh6VQqcwa0SXoLI1YG8/4EV6xEc0YlTqLRlhhtpBH5TGdJ66aZKJU4g/5ovB8c5q4d7wcLrsg5U4rWJRJcCio54nV0zoZswghOGJsK3tm48P7gmrszyhHvBwqu6DN3iTamuqD5v6auQnPLjQeaXAKV1ETwPuBwpFOkHVUG/ZPIsJzJIoUGEoLizAZJGRBpbbZ1FKUamMNd0PXU7yUTvjLY91U+sE5MVLxQh9m+0ksMVJDZFGM/UWLX9sMeXZlJFc2bXgEVMub/F9oxFbwDJmTynBqszMTKzNNVZjY54yeXlzBtttmoREe0Z8SB1YQIk5r5hSxqqRLTLoSMt61m152KWtffYcQlrfuKprS02FR2NoqSVlIoaV1/otuCVtm+oHX7h5WVAmqwWAo4G085a1kXbezR9cf7ePdYrbeUVUPiiF8sZT1xKatIVDhBg/ASLBPWCypVNJFbKjwNFEtZ25Sy2ubLtEpG3hxx38fYmKnZAF7ML36BtLqpYRVt4s2bNX6c/fF+tXg/+6/b1rOiTRRv88dvF3D2a2Mt3zjwO3z4/LdXbgHv73Ws5d2u/y/X80wcYOVu0nlkm8Kbzd++g4v55+bC8HLh/gbL21rUnfUNO5fIgvvw5Qo+zLelrE0NqmzjMdn8+YdMm5oushFens/D326qTnfnwBRW+BnWbW83ZKVVKWjyYC1X2oOmMUUanYzJu+SN8tQGdLF3Tog5atNW5lQ8TljF1ABinHRcKwBHrLUmMeWdDEaIEL3CSXFdcX2gIqkM0AdKqYRkzpJJwVPKXOJMMsuDlzxxYNKB8Rj+6Yzkg6ya2oB8kJCKTSdiIswYAsYGRmVSQTFnDHVOGqXCVJoqj9LS2GFhV4bn44RVtKDBUMU5N4w6QkESTw2P3DutXBApIq5Pdz7fYX2V4fkwIRWTx6kUyUhFQ1JRkiCUINwBVwpktqYxebzz+XyMB6IyOB8lq2LBT7A8EdN4OaRJmrhsNxtlA83Wc7apsUyzM6oPdYrVhuhD5YTlmAMmgGM5Zls4n6QcU4JRLFrHU5SUKSWU8SpQ4ZSnUQj00nXG8xExh9oQfYSoisOjgIYoIst80IDPlocw2gardNTGSoZ8sJ8zuk0UrDZEHyyom7Rs2jkt+3Gu4lBJ2U0ldaek7Icf9eiUbC1MypTZQkMpoqWJc2Mis1QQSVXgmJKNKdmYkj3SlGzTIiX75mv/m1usc8PGm5O9Tn560iIhVkluiKXMZRkQ5lgAqnw+qbh3bioNYge0SB62XXpYAvjgeb1VY0dICgvhx9b4AQvhT1sIv7HBWUsbvKic5FCVkaSVEV74rEdb4VmxOZ8kQIIQPDOW8KzwqeIpGeUSjqxEKxyt8DFa4U2e9um9BO1Kt2/eH4n0ZLbYtQUatZEi2UaQYLj3jhPrVSRb60h14DCNQLJiGy2D4SUGE7SOUTBGAIQgXOR/TD7KGlhZSgQymM72nt4prM1g7ebx9mHTCrlBTmPINEbN6uJ883Tzfn3mXl9yw9bS2Fp63Eg/dWtpHBTwLdsa4aCAfgcFbLg76cjddxhlQzF32YpTPP1Jj+ftyhspIe937qN1MqTIIlcuGJLZvBbI25G3I29H3j493t64eFvz9tdfLt3FLKwTj8Ybf2zaW6y/muqoAZ/8eoN5sEUnoD3xeY/WhlkXRidFZIJIrh0zwiUCnitrwYXtkYXaELUhakPUhpPShk3JfGttOHoFKNt2tt31jQbjfv3DqaWaM5ZZbRhhTS0WTyxY8FYlCOAclUahmkM1h2puvGquXKa5Q3SvZ4t8cs4XX+7Kb52t2Ph2d7j4Oi72P7J4H94BuguxzRt6d3e4rpe8lwNuaASptHIgmMqKTSmarXiiqdZc0m22qWgRqX2IiLEquJY+zsdfZ6jCgL43YEvVJpUw0nBhdHSR0OCFBmpsPr6TZsGgPxNV2+lVG57PB53PjUG873z2Xyegj/aQLpYBaOF8UweQKHDqpSPRZXVvYpaGsCJqDLh2LQMo9xR6+RUwdx//DOdXTfv0ygKtxwmrOCVMMxVSctJAlC4fjIkGCGuQUwUGEwlOnEhw2awCTSz8zo2rDt/9CO2mW69sZ2Q/oZMGK8HlbSztnR/yaHM7MQATfBBBS219hGwQZdXGbf4vGEvQ3EZzGz1JI/Qklcxt9s9X64P5L8tN88V5cNm2H625zcsjN1RGi8CRG+MZGbOzJdf2Gu/vIu7+s2pnxmTrWeAkr9k3nOR1i91GR3yd5LVZu0I4GhxhNMMRRiceYWQiUdFJ7Z0JyVBHIiEyeq+EF1FxwBFGT10Gtq9sSehTVSQ7Ve6NJzf/+b03biYZ7SbYO5dqrOzNZ5wvHq3VfHldcgfdX+sdhOvFcvYZSp+P/XWT1dnWulg7FppP+Wglfn9sT+kwtFHhYYjG5biP1xKAk/II4DEYl5wWhr/WamsmHGKMtubJbU2ZuKBUWO6p5kpL4YhnLHIfIShPPNqabWzNtXQfGXWFVkz3FfL3yy+XYYfR2WqCIg8WeBCSO+mEU4wSkhQlyRpKk3QJw497r/Qg/Hi8JVVb7LEP23N/4HG/d34Egcd9H/L4wKMXPkYwhOnAGM1HdYrJNyOfmDIqYqUWBh6ffeBR7d9eoxKcdYY7T6IiCaIOXEfLTAiek0i9cltuLcS+sOPIc7BpKb0vSk0tkwyiFwkC8RKUZSFQD41BwtAO6WiH8J0j1rYXebuY/2de/YYcV2ZwdBHN1rIQpo1l8Q2rBno989pOEIgsadrkJ3uVQDCdImEJnNCRUicBbQm0JbBmYKQ1A0/VLd8eFxt1srnx+WPEWfObozUuWNkhql1MBh2io4k3ydJteIC5j7ePqo02aS8ERfiiP3+g09KLiMHN2RiCm/ZO4tw0T70dYSVmCOWcGG+y0QdJmmCUFxIoJ8IEpjGs1CasJNdhpd0tn59StBcX88uHr/7ozpdw+/QmocmUSHTLhTNBaUb5NUaumzWIuXONtYhKkYF211h70CG+uby3eJPxpHeW9HVa/MPi+r5g+F+fGga+z7T5aTG/vmqWEH/dmzyV6TZg8tQojufm8NqTe/KXB/e8mlOcWPBMequiTtIRZ4QCTiIBHlS09vknB7BBkgM2/hyybxTZnfSAR4dMQ87z07Wd/PDNN8u3i9nn/DEenfCUPARQn9ecr7JEID468ynpkAjR9arX/nwWHmkCSh4m5/Z1yX+bLWd+dr72ijxQE/ah+ulwzV9h9Wke291J0Vyrw5iv9tfadQdlc7UjYPPk1R7fObW+cw/Nm6Ov1VDKHxfzi1fXi0Xehze39+t1dfMVe7/sE0gxR969fJfyqfLIjfcEVuxapA890D1dbueGJ0cKs3DBx4ihm/Plocrp4XJ7QUObc8ae4MpP4Ibydulf1jAiaGAehNcgJThnElPRcCqSIhh27Rp2PdqxWVkstgdH8KZ1d6lzafuYxlDxWvV0D9O2H/bo8G02y7kWLGhiHdfAvPRBGhZ8dEoRHGGB4VtMBXuuqWCbs2O00VoqywEIQ5x16OG6o6vFXQ/XrY3ZvD1g0LaFIfhuPl89RtYUPV4F9FLiJKIXo7UndrA6R7lWNlDmrKVcspg4DZ5C4jFZGZ+9g3W46ivVwcdyc83dSvRu5VWBd6cUrUskuBRUti29js7lO0mk4IQxMxHezQbj3f3dwMoIeH+CKwctDc1ME5XiMzTpXroloElnBEP0okl3YpMuJWFDSpRYybz1miuieJRNPbZMylM06do3b+rVpNuk6nddbxsW3rVkI4hHh8n+JTfRw10LssM+401gadeSvIUlS6jyDULXI9DBGpqhKijnkUUmvXATsWQHjCAdhdvq7NdjxbWnOQaJIWRwMy6EMIFbLYkmGoTKRgFiuzNLO/YMrQ7ePUishPDkGGeaKRdVooolThP1NAUnlVR600MKEd4B4b1aCZVhvVfZreNkTcOT2eXWXGLWJ6GzUc04B59AMwKWC6qCBKI5Yn0An9td8/WbJL1QchcSwx7l2dr/2I+89rnaPMHO/bPRFLv2t0+m6HTb4QXRzHltI4REDShiXPIkOdU0mKBOUYJekDZekPWXUR3SzLfXfP3l0l3Mwl0I3vhAHmXrdUPy5qvvcShoE2lUSgFNnJCsr6miOpLguFeWYkpqdzXdEwQqs0b7ElvRwcCCJ7CeBSY4ocxrZazUhqWgDLNTGWo5YBi4P49qbXDvT3JFxHtrrEuac22ax8GJqH2gQiSa8u9OBPHfsOCgq0quDOdHy6uIbpkgo1tFl0RiPB/jLnGnQQvBbEgK0d31PD82oFUdvnuQWAnhLgZDtKQhm+JWe6mEUy5ZKb0X3AccVzyAw/jpkG1lWO9VdiXUg9aOBsdIyEe5NZoRQZKPRESlqfBotXS2Wg4uJagM4sfVXDyF55AISQJchrNWKsRm/rzWhHJPvaUKT/GueBalNkvbizzy5lYG5YNk1Kn/8uaejLX/8sNPd3QBb5DeWQVUC1BUac9ACOOCyhpJSEFxlgMW8GIB7ygLeJ8cIU//OX/uNDu73rz16LuNrI6XFWc6ZIrotCXUWJvytvOeeGIAvAEvtVVTKXIa0MrYeVtf3UXM/Wf12RjdJVSyk2MU3sqUhJGQOV+QTFsq8/8FEpK0EhHc1Z+3s+nmrbp4mz9Vc/Rnlh5guZwv1sVHj16tDtZ9ia2IdWuJBZtP62C0YdJ6bUW2mJLXIto0lVjkgFjfKazbm/YhK/SPP27R9vH1wv09/9r1RV5jvdivcHldH857EFkJ4/kYpzZ54agCzpSPKaWgGAShEzECMd4Z4+XxK0/fMNjG024M/bpg3o/USkj3mqnQuPUMROkyd0s0QKDAqc/YN+jh64z0hz1iS/csv79O0GtU8MuGw4VF/tNlfUDvRWjFRhocBDhHQsZ2cFwGmbm2cFrnB/knJvV3xvnDRtPlW7Z6eDT96+K8Ppj3IbMSypWzzmstDAjFWCIgKJFKEukzK1Uap3QfnTVVumPN7Xh7fn22GVHReBWrQ/jR8iqhm/HmBNeRC8EET8aHyEMQRmnNhaQU0d31DN85m+WJu/V2MXtcP/f98pfZsj6Y9ye4IgsNjJIgfRCWCrdunOAYVZrlZzQbMYj309rmt/p3vVZjblZptPQitGKWiaRKKcMY0RJA+ySFpjI4IMxAtmEQ512tlrIb+P4ta+Ks+bZtNXB93PM4YRWbJniwlivtQdOYIo1OxuRd8kZ5agNmeZ8E1+tA/sfvY2zC75erZtzGL5Dqs1GOE1YJ15IYJx3XCsARa20zCcQ7GYwQIXpFENcdcS3asKbNrfpx9sf71eL97L8qzAs8TErluH3KNoYhYGy2tWVSQTFnDHVOGqUCxu1PeEK/XcCVW8D7+fUiQJXhneOEVbQ8wFDFOTeMOkJBEk8Nj9w7rVwQKSKuu57QbQj/5lb9y/V8BRewctXh+TAhFT1+VIpkpKIhqShJEEoQ7oArBTJbIejx63w+t4kob27RO7iYf27OGni5cH+DConhMbIqRmmC5YmYhh1KkzRxHJhZz2eQzlOKscjOqN45/3vnncpm4YcvV/BhXqMr72A5FdkgGMWidTxFSZlSQhmvAhVOeRqFQDbYGc1tHK6bu/QB/lh9mL+aR3h5Pg8VWtBHiKrYrBpoiCKybD8b8PmkFkbbYJWO2ljJ0H7ujOk2CZt3b9TP4GJevT5EHyyocv+oZFLItgVziTPJLA9e8pTtDunAeGxQfUI+mKn72a9NOVh1WD5MSMVIodYxCsYIQLYsml7rxCRHAiPEUiIs4rgjjtXuWut1Us768fbhTY0IbIpIfl5dnG+ebt6vDtq9ya3onXY2Ghp0SoEZKbiNlHELyWSOGKT2iPaOaH/UB+aJu/aLW67erj/ixcVs1ZxPj16pDvG9yu6mtassdGvYX+LMB2raIPmTxeX7PuTRvRuEddlGowDOCyc0kTEQyYLJ1MRbqyj2bsDeDafr3dB0VNnRgsAt88dZ/iXOw38sV4vrsLpeAPvnq8vxNR5oBsKtv8UTJ82+bzJMU5id50vhox19qqhAuQZrfSCEMceiFtr5QIN33nLGtreetLv1477zov2dH/zG7zxUn/5kR993prnnmgeraQqBJcIZ9UJLRpOzwZnNfeemeN/hD5c/8MjvOtt71x9/jWHuOdlzz+99ruPtB68DA6WDAE8M5SrRbD1YxoLzCug2/sp37PSHun1kd5qVOsrQzJEclZolCTTISKlKjdcrf2+a6GQy59lgzIk9vKubH80vV9hmY480SpyeSmeSJJ5Ix1TkQithXD6NKURh4mRy3YdDJn8orLv34kcX8r/1NXduJ5QtC+dPWEg7FcAgOvJYstlSN2pFqc0MqInrNbXgnEmbKSNRwQSt7Y1utI9044Ovfrmcn8PH76+uRqckRUlJ8pA5H4MUNAmGCZXZM7ceso3oMoN2U0l+FcMpycfR6DvQqOwIKgujpCIFA8GNFs0MXcuDdECUUp4FoS0Laipub27lQMj8rTbsNR64918u0vyyWe/ian6ZxXEXgOezsLnh5fhLSopwrYLiEHlShgvSjF/KPAogksl0UxgKhxvy+/XGXK4W2RRZfnwPi8+z0NgPmQRX3Pe6k3CK6f/KMON11Nq7/NNSLwQILWUIMSY1lfZlw5GMZnj841vzw+f8W69ny6vGzGyudv95vUg+VlxbYtKMqNlBTJ6yKrZxwwt39S2ChFMJkA0RS5xOgGyYgKJ4Ul73wP5tweU9A+qDktlAsgwYTyyJSJlUTgUbNhpLP3Y079zOTa6Au4xNZfKvs+UyHz75F9aJu8vtW6Pj2rzEtbX3TX/zRJzwYJQPxOd/NCMRgkx2KgnFw3Ft8XjL3UdO09n4FiqV6d9uwikPtArJARUcAlPKRqGIElwpLRVtivAmgluuLXLxE2GRlrj4DSBbgTFrFAUqJZeYSCRAdB5ozGomRC+cnAoYh8qHrA6K+TqzbBO5fKFbjmF3JwocaJQgBUEKghRk5BTkcULjvt0+a37VnW9fuUsvnhMH4ZaATMxpT4PN8vBCp/zECjBEUzKVpBhOhnMLPm7g0gE7lWnf44RV7O0OWjghVXQcEgMX8iNmwTGvlbdpMvPDhvJ3V2cY0mwNvFltsmO+PztbwFn+EHs601hDk2MSBPGE2eAkcEcksSRTZSumEhscyqFTH+SyFfJh4T7DYnmfj/CD+MhTBycSEiQkSEjGTUiaKsguhOSe8/Y5ERAMgmAQBIMgo8UtBkEwCDIaMGIQZMAgiNbdSced0xNJBpIMJBnjJhmadyMZ+Vucv7l8t0bFr/HDVgRIO8arMZF2jEK/Iu1A2jEaLCLtQNoxDijuzL3a3ZTpcLsEiQgSESQi4yYismU7hZsNv21bgdRjxFoTqccodCxSD6Qeo8EiUg+kHuOA4i7qYTqUlj9hiSDZQLKBZGPcZMOIw8jG28X8P/Oxc+NeWL6/6cOLLGS8ChRZyCjULbIQZCGjwSKyEGQh44DiLhZCiTqchuyzUZCfID9BfjJufqJUO36S9/rZApbLl25x9/FtJ++RsZHibAawPDSt75X31BEjpfSBMaXzcxa0nEoZOhuqWnfnWO92sKlMBR8sp2IhsNeKMcGSkpGAWU8dIRQCkTK/AlMh1wOi+bGwHt+l96sv57P/gnjntfrgfLCgbpzgpr31Wd4iaGuirYm25shtTd3d1tx5ejwnY7MS7WwMqucpqWd0Q6IbcsBkCHuYHbgDvGgIoiGIhuC4DUH5eLzvY8G9cuETbA+e9eM3+bu/nc/PR2f/yZL9Z1XUnnlrXVaXwlIruQlRWOdcyKYhTERdigFHOPFd0irApTIF21k+JWtPJ2KFjtYEr3SQoLwMjifhKAdD1FS6DNqhWrZWZ+41WuHtcrHF3z3ktZwlZilx2jb5YzZlk8V74okB8Aa81FZNpbnqcP5tsVMvZvskzc6ut6vde1bfEdpdQsUxjlnXS+ZNtogolQm4ztaji1ZZGiKLSJm7ItjsNLXv358f/ghwtX705vKzO5/Fe2/nD5TXyufP7a9VB/LTCBFdR+g6GtR1RNq4jkoGMHqM0GOEHqNxe4zM3uZhtzv8l3lw59vNfqu9fvdNpupv89WP+ZCOd9TVyFxJ5SqarCyBE+FVdEJKrRV4kv8zWVQsijAV9UmQjJ9IgdoX37U01ZiS3FqhCIlSgtYkyEC4CU4wrimdCulGU+10SPvwaTH/+42tVkBaop7pqJmLXCbidOKRGsksUEWzKkWkIdKKc0zyh3i/WuQ/eVDZ0qq310FmAzIGZAzIGMbNGPYXtuza+uuHm12/fmF0BKGYayidBqY5oxpiYN44nkKKLJlMGrh1U8k1ZAPOV3xcsNEONpUp4YPlVLIM81OlgDpH8vmoEjfOUuEiMUzkB2wqsefhwibKtLpLLdwmlcG7P8F1Knxps4XQFkVbFG3RcduimrW2Rd9/cguITaeQJp8ZYv6N64vNF4NxWqRFl7VKUpjEqJRMEepU0gGIcMoTSl3yU7FI1YDFqfppVdQCPJUp7iOlhWlpmJY2IjRjWtq4EYxpaSNOS9sM/BCdeNdeFYHsC9kXsq9xsy+1d7r51/0+v14EaFwsq/niGRedZXEEyow2ShCZNToNXvsYuBIgndFsIpp9wKIzuVsr7UVNZcr7UDFhCRqWoGEJ2reGIHL98YAWuf64Y6nI9UfM9bEEDW2JAUvQdDen0pN2MHqT0JuE3qSRe5NIG29SyUwbmSOJFgP4lTAfqhRyn9Eo2Z65T0j5/HNCgrZSO0UiFdIK5XRQMQWtJoLhb56D8vT9ubXSX7qz6tB8pLRKyK4l4X84ZGO+fztMnyLfn1sCMjGnPQ02W1xe6JSfWAGGaEomM5dlODSrPYMQv49x1vxdvl+bV+6aoLVB+ihhFU9pC06GIIJ0PkhPWcp2dKSGSiaSDXYiuNaD4ZplYb1+c4eN1utBLYmiWHUvmNfSOC01Ux6kjVTaYEI2H0ASjpjsjEmyvhFYK/W0IDA+9YIOl7GCAapnGaCipjF2vQ2eWeqo8tn6NUFZRqLSQkzlYB7QCH7oTPrFXZ5d58/yczbhzvOFHjxf1mwDHyOrEqoNV4JkY9cqkEo5Q1WI0vgQ84tUBIGo7ohqvZOA3wZs3uZP1QRf3i7mAZbL+Y5X7qQ+VYbyXmVXQr1SgXppmHOGOCIlkSQSzjw1HjSPeJZ3Dp3sFtb59dnscvuj5uO7q3iKzTc0TzYRq2lmhAp8tj0I40AJ0cZHO5UU8uGwq3aO5dhe5F5OyP1nNQO6F5kVc8uJD15TYS14yQJJAZjyzDtKA0/OIcq7onynsG5164e/z84+bhI7Pr66Xq7mF5snVYO8B5GVME4iVxqssSJYZRLTLFIfuAEtPCdsKg02B8T440jB4xu2RdrNLds+rRrnPYntJuuStc26fDrSjgmXmHCJCZfjTrhs1zypbTbNyJIvi1W8leStUSMwc22UGvuEmWvZHCXcpRilSdpp5QLPLEwqRqSz1NCJYHtAh/BOYd2/V//mzq/hw8JdLtN8cZEvvnlhvj4G77xeHdD7FR7GuV8Ml02PYe5nGeauJP9ouPMf84+Oyj+qJEdzQDxijma7HM2OfenaGd/o2ELHFjq2xu3Ysq360h1pg43M30VxvuULawZSwtU153g43nIzCI62bs9x1F5DlYsqF1XuuFWuNp1V7trL9w6W8/PPWZbfL84+33tldBq22M2DcReSENpnUpuIJNJormIwkoFJZDLjOIaLJ+1OUOuIoMq0dC8yKyY8aSJAKSsEZesB1ipFl7iJRFsa7VRQPpQZ+eT4s8Idu/es3kqD/gSH/W2wv81IQX50lsB2Xjc5iKbt0RTIypCVISsbNysz3TP87u/6G9k8Z2ZmIeZ9SGkyzHGdvGQuEZYNWE44i1MpRKF8OKO1hVpqBaPK1HlvckOKhhTtGcAdKRpStKmDvC+KdliWSgttgTQNaRrStHHTNK2PpGnvID1jhmZJdFFHFkS03GrJtApCMU2tCEHyqajwAWNnbYsuCgCqTI/3ITKkZUjLngHSkZYhLZs6yPuhZdb2wMoe6gkkZEjIkJCNm5AZfiQhe0pljoyWseKo+zpMVjrcZFu0WdFm/faAR5t1nCDvK5QgezBad28fNF3RdEXTdeSm64GxhFb9d0ZmvhZ7vNXSB2u4sAI2wnoWjbAgGJs8REu85IIzxoX04CBw57xPUxksbYfDvTj41n19oV7y1rf4il3nE0kgQCdmwKpIwHJgnhurGQmOTKXRwXAUjm467DQGlptdVnhuPxYANrt6MZzLDJtd4UDS0WESGwLubwi4dUYdEUFtYQijQwodUuiQGrlDyvblkNrJBkbmkiq2YauEmbPh6AlS85FR821jONqn2t9xKVT8qPhR8Y9b8as2kaj7Z9pLt4TH2ntkKl6UVLx0mWRbk4gIUivuI7XgLDMp0CCYnoqKF8Ml+ssW0tqNm8qU+eGCKo4TAt3kRKnoOCQGLuRHLGOaea28nYzNSocKo1bXOrhpEvxm1bw9X3x/draAs/wh9ngsraHJMQmCeMJscBK4I5JYwiFYkSaCOYmQOxHkMv3IrOEzLJYuX2xv1idJIh9soLVSIabkpNaEck+9pYpPBGzDcXKxM4/x/kU2P+ol3gfJ6GY8b1uf+n7VjzQaaTTS6HHTaNOms/qDE8qFT7D59/+BL7cP8m9vzLDxus+LBUlM6ki4AxFsE8TOzIQb8BDBG5k0mYqmHrAgSe9sGH4wmCpT4j1Lr2SkOs28z2eqD5wmahylQDlRwjhDvJJTqcUbzkjd3e/jyXvX0IjabdY+RHYbIGrbkvrA3YSGLRq2aNiO3LBVxxq2ryG56/PVo2NgdGZtsf2ZdFkqhJtIFaVGg+LWC+qFtUoEIqZSqDRgnRLtbJc9jaTKlHyvsiv6+Osgc8PFSZHLIZcbE/KRy40Y7n1yOWL64HJPaRFkcsjkkMmNm8k1x/xxTO5GqluhPnNG542SDqzWkUmAbOQSIqRRJGlHNbCp5K8MyOhsZ+tsP6IqU/knkSEyPGR4zwX/yPCQ4dUD916jdaoPhrdPmyDTQ6aHTG/cTK/VpKJuh8zIiF2xgLsSxa41avYqNHvrARddVkc9jnoc9fjI9XibARctNv2HhZutnpcOB5DBeLBGR5o3HWFM6WS4ynJTNrKp6HBBBtPhcud0hvboqUx/HyuuG93dts9/25VRb6PeRr09br3dKKY+9Pa/L9xVXuZHF1bzxZfRKfBiGVhoWjuLQLxPnjEiCRBBohJaAmTZwUQU+IBd1FSLauRWMKpMk/cmt2JLaaeBac6ohhiYN46nkCLLJivJx6qbir06HNrlzhTnzX36ZR7c+Z2Hv/v/zNdav1Adug+W021ioOjPQr2/Y9BURVMVTdWRm6qkV1N1nJ6moqFai6dpQNWNnqZhPU2FvoCWEx4JCY5zagM4zqyOMkpFCQuTaXQ55HTgNmfW/hOyMoz3JLVbm5X1brOicxUtVrRYn4HFqo7qtNXs+19h9WkeR2elFuOhVjKbJJFW+KzIk3JOSa0ScKctS2kyxSpDdVvNku6WaX4XOJUp7yMkdRMFPbqR0NdFUUejjkYdPW4dfXAC8lb/No/fr+aLrBp+hvOrEQ41L7qUBElGEJ5iEDQRrgQzQkjlKXjjQKiJKGs13HDn9tm0TyOoMq3dh8iKriUVtWfeWsdEEpZayU2IwjrngtdqMgH+wTAudppZj27Rm6wh3s7n59UBurN8+kiff2pvoBWKVihaoeO2Qs0BDU92n1OvzueX8FX/jM0YLc4684xSpaXh0WupbNLgwFCmRdCB6zAVPS0GDAG16dHRDkiVqfAeJVcyTZMEETUxnkiiNeNBMAkqee2FZDLIiUCeDse/WrXl2HOS1VsL2rP0inOyHFdeeSDKgcj/Wkgkcs2tCR7MdE774ZDfsw6vDvt9y6+EftDa0eAYCaCFNZoRQZKPRESlqfCI/s5BshbCejefrx5bv5XB/HBB3ea0HNi+p425hN4K9Fagt2Lc3opD2rPu3vubOb6bkysfIeP1W5Tbs3KVuAgEuNfgpNA027LAM8SiBh3YRHS5HK4DQKveol0hVZmeP4kM0ZeBvoxnswGG82VUwuYGLMxBNjcUmzu0GWs31YG8Dnkd8rpx87pDJoO3158jY3TFGoZKTNkBW8KgKTsqU/a4qcltr4RKH5U+Kv1xK317QFuNLkHQkal9WewEV0dKghzQg4U5Cccp/iFzEixo4YRU0XFIDFzIj5gFx7xW3qbJtOAYqnL3t9rQSrMZsXEAzRffn50t4Cx/iD1D3ayhyWV2JYgnzAYngbvMuizhEKyYSrW4QsidCHL0xXcfFu4zLJZN4TVGqAZ10yOrHxWrxwAVBqjGBvIeAlQHttBqbxajnwr9VOinGrmf6oBGHd2V1djcVcV6SaEY98wQcJwHUCI/B68Uy5iDpN1UzFkzXKetE0mrNp1/KjEit3vBOJK7Z7EHBiR3lmfkuyCi4dxbmjSlOqWYN4EzIYKdCPQHrCXbOaniKc5SL8YPlhO6KtBVMUI4H++qOLCBU+cPjx4L9Figx2LcHgvVfbbiI0U5MndEeY5iIiQJyJ9ba6VCTMlJrQnlnmarVPGJKO4Be4mKFvMAa7dBD5IR2p9of44Pykfbn+awAYkPtgfalmhbom05btuyMfg62pb5XDprUqR2nyAjMzR1ydCUnEXJtI9WUs9NoiqKrKFDdCEIZ6fSb0MM2LR+58brgp/KVPXxAkMT9IXE7nCjA/YxNihWFpiBAF1fmjdWFjyBuaGMhPog16WyQDrNlDWJiCC14j7SfLpZZlKgQbDJTC8ecuhhC2m9dEtAjX2woDCn5IXGnJKxwfkUOSWVFHYPWPiFdd1HofwEdd3/uMmSPyACUHJVYDgAwwEYDhh3OEB1L455FmGAYvlLJV5SMaCNil7Sb+klrcSJwIdqhoFOhG/tRKjD7Y8u2PF4/dFvhX6r5+a32uTuHVY6gowdGTsy9ufH2Jvy4B4Y+/Knxfz66nnxdqW5isxDYC46bzWQ5JR20VrGo1dTSd/Tw6XvSXMYHb1BT22q+khxIeXJJzRyntFwnkoynYbiPPVBrkumUy1e91H5KNHpfqTTfRMcl71R7I0pgEQbiTYS7XETbaWOINrj7cRQHEiNnRiwE8MEOjFUEstRw81Vx2DOyYM51TMnbCwyPjgf3VjEHMmcsLkIUiakTN9cWC1b7XdoXLf5Bll4cbY+l17NLy7mlw9f/dGdL+H26fMiU9ZkRU0D8yC8BinBOZOYykYpFUmRyYQrh1PbtiCsx3jaPqrYGD1WXiWjVFMVjAwQBdHeRR+pEERAAGJEpl9TiVcOWBlXYsGHnZaV4f0EEizWhtbhLBtuB6Cv7GS+sm2X8Y5tHg/ZM8jTkKchTxs3T6OkQxJpy0MgS+xDFm8jZTdryNOz5GyG0kAEMVL4bMR6KixxhDIutTI0OjcRnU7pYErdlHImj8ZWZdr/tMIshtTQmYHOjMk6M5DKIZV7XlSOdUxJPFI5IKtDVoesbtysznZIWGx3HPwyD1ko8c3leNmcLM65jjRQ0NxzKag1+YmTUVumY/SSx6nkgQ3WPTorx1J+0+Ggqkzzn0iKRf5GidOWUGNtyhrKe+KJAfAGvNRWYbius4W784DLdyPNzq63q917Vh3KD5DQHo4GTYUsaCu1UyRSIa1QTgcVU9AKEdzVA7GTfxTuT75+/tN8DL10Z9Wh+UhpofcBvQ+jwnPvRRfRuSCZN5mgUCoT8GxlRxetsjREFuVEUDxg5GQn871/4vzwR4Cr9aM3l5/d+SzuPoJuf606mJ9GiLcJFR3T2w+17dH9hu43dL+N3P1G+3a/fVhcY+77qI0BDBePVe+fNFzMdZKRR86VTExL2QyVVSLG4JKzjouJoHvA3Hd1tEP0wWFZGdz7FyA6LNBhMSqIH5f5zk9B1O5tGeRoyNGQo42bo2lyDEfbPhpn5+QiHQNiaSJUqywT7gF0dIJYIVniWvsYJ6KwB0xrl6Xbug86lWnuo2SFSemDjYlBL8OovAzIspBlPSuW1bR/OY5k3T36kU8hn0I+NXI+ZfriUx++XOUj6vpidLyKlniVA2FpJJRRKQ1NVnMHYKzg1Hnt2FQGKAyXX674wVThK4IqU9m9yOzGUUpInzr8Zn3U5ajLUZePXJeLHnT5ePveM0xXQUfSaHU4OpLQkTQtRB/lSFI9GaHYPRwNUDRAv7mw2hmgskNTureL+X/mE2rzbHS2pirZmlFqaplkEL1IEIiXoCwLgXogSdGp2JoDNiXgpa5oD5BSmRbuIhpsH4DtA0YE3Z7bB1QyPH7A8bM4O74Twz/h7PhsrjsZggjS+SA9ZSmf0JEaKplINkymz9Fg2GZZWK/f3DHK6y2gLokC2wFgO4DnheZTtQN4eh8wwbyWxmmpmfIgbaTSBhNCiiAJx7O589lM1gfSb/PVj/nisV4sPy2IrRtVd+wRe48PoscUPaboMR23x1R3aDnxfn69CLBuLTNffHzplnDvldH5UIvxesLBcJ5clk9gPNuWnCqbsris4pbJyShVORybLxWQ78VOZZr3OGEVO0sECzwIyZ10wilGSRMTIMkaSpN0U0koHS4RRZVa7d6/Vfee1Ru470FiN2H8jkX3e3YOWqRokaJFOnKLtENByP3t/nq2yCfXfJFPiHEbpsVC+0oM0wETSdEuRbt0MFwP188P7dJvYpcW/PRWMIBAQWnubVZwBChhwRoRY6PtJoLw4TJcimVpbXV/bRjvQ2aHlvK1Wx9ZGLIwZGEjZ2H2UBbWSOzNqvnL+QJp2NiVOdKwUWpxpGFIwyYL7hPTsGwzsXxaS5BJMg+ScyeIIYwLw72XU0kbHJCGidb3q6D8awN5L0K7JWL0GCL25AWQiSETQyY2biZm9KFM7B2E68Vy9hkwMPaM9DoyslHqc2RkyMgmC+4TMzKiojWcBZJJmaWBBEmCc8Z76owOZioIH46R6ZKwOhsBlYG9X+HdMjR7DEPbeyFkasjUkKmNm6npg5na5vxq5Ib8bOxaHvnZKLU68jPkZ5MF94n5GaXWcwGMSSqTSYya4L0NPvAILFqMmHVGeHuK8aTqrw3iPYjspmjsKCr2xOpIwJCAIQEbOQFTBxOwJ7TmyPhXcZJQJXYqFn6PWIn3V/htjtLhOxdHFY4qHFX4yFX4wdXf957dVaZjU+KiOA5Q82QTsZqmCAq8FoIwDlmXa+OjnUyP4eGa/XUoiHsaQrXp8T5kVmwGD1o4IVV0HBIDF/IjZsExr5W3aSrN4CkfCOa/1YZQmk2Em5Tm78/OFnCWP8S+8mxDk2MSBPGE2eAkcEcksYRDsGIq/Gio9u31QS6Tmw8L9xkWS5cvhkGjQWcFIBn/dmT8yD4AT5kIyMeRjyMfHzcfN61c6ufXZ7PN4+3DX9xy9XatKC4uZqv8vR6/MjpeXh655mw0NOiUAjMywysLiltIWZ2HILWfiD5nZDCFrnerp8OgVJlq71V2xREsCihTLGWarkk+WI3gSWTIw5q9azIR2A8VU6qOMzUjq95/uUjzy2a9i6v5ZRbHxx8+539fz5ZXjY5qLtg8f3/tl2Ex89C6zt8KrWTymcXL6A13JqREWQpeZGvJhYlgc7isJdnOKrp5Yfu8usP3UDHhcEwcjjkiGPc8HFNKTzm1IRrpnfM+eB2D8Up4LpTUFBHcj8NrY9itNebXM+clpPzm+l7k9fPvN3S1OkT3IDEcR4jjCJ8X6E81jnDr+G2dhnUI90QHMDqA0QE8bgdwu5zqR7u/2eeNNGBTbvf16ejcvrSYVB2TMiSx6PKe04yQRLKNqz31NqQQJExE6bNvHsjtgqDKVHwPEitW/8ngrGchJG2osPlNKg2JNCWhjQJkbp19DzuVy81NWv+oNyuhm3AwNpH1EwYnnl9wQgvnleQmUeDUS0eiI8KYGBkRVkQ9EXAOGJzY2d/hqz+n4SFhkX9heffxz3B+VaHFcJywSrhWmqvIPATmovNWA0lOaRetZTx6NZX6hAFxbfYL6918vnpIkZY/LebXV/Uh+0hxFYNwHAQ4R0KgEByXQQbPhdM6P8g/MaDcmertLCO5PYY+/H129vHHLco+/gSr/FvXF3kJiJvV/3VxXh3Ae5EZBuowUDdmjJ82UMcE81oap6VmyoO0kUobTAgpgiR8Ko3ohgvUNaB5/ebjb/PVj/nisd5g29OCKJ64FpwMQQTpfMinL0vc+0gNlUwkGxCPnfHI1rfhazimYkQWRFHCZODBOZ0SzeRPZSSaEK2nVkUqjOVkKjxuOEzqh5T7F3d5dp0/y8/uMp7nC739dPXgml/D8u8gba9eL5L7FyAm82Ayz/PaAydN5mnfUql9ZBEzeDCDBzN4xp3B06ix4zJ4moc/ry7ON083748vj4dgHs+Q9ZuYxzOyPJ5K8iGwVhPTIcaKTUyHGCeyMR3i2eAa0yEwHWKi2MZ0iANsZkyHeG4ox3QITIeYdKgD0yEwHWJUeMR0CEyHGBkmMR0C0yFqxj+mQ4w9HYIS0Uc+xK7YKGZFYFYEZkWMPCuC9pEV8W65wqSIsWt9TIoYsY7HpAhMihgxPDEp4hmFHjApApMiJolrTIrApIiJYhuTIg6wmTEp4rmhHJMiMCli0gEPTIrApIhR4RGTIjApYmSYxKQITIqoGf+YFDH+pAjeV1LEg9Ao5kRgTgTmRIw8J4K3z4nYUPDt8fb7ZXMmvp9fLwL8Mg9uNV/czU4YW1aEKCVFMFAyCkMMJ8QwFoVL1KZIg/GUJjMZJmaGc37t9scfgKPKVH1/giu6wli2c4PJZymX3CedGZ/mCbyLTgkepjLaHlMkToRSkbXG2+XiUVLE+9X86srly6/faJkToQSVxihmnPPgFCOMKpCcae+VVJOJHVM+2OnL7d0MlsvVwoXVcncGS3UHbCfZlGDr8olpE7GapggKvBaCMA6UEG18tFOB7YBT4naGOLcXuafnPqK5UAwLd5TZrSNAdnMEdDBH0BWArgB0BYzbFdBl7Gu7aPxz8gFUkv/CFSbAjFebnzgBBlk/sn5k/cj6kfUfzPq5FVrJ5IE7Gb3hzoSUKEvBi2y3TyYZfDjWL9vZ5zcvbJ9XB+BDxXTgIIg2xgZyeuT0yOkny+l/v/wJVs12fwfLjVdvLZ6RcXpe4vRNTW2gmdJrzbn2xOf9R0KygksvnZpKNt9IOf0TAKpMcfcgMeT0yOmR048HjMjpRwHdjpy+Dx6084BGHoQ8CHnQuHlQ9zTnO3u+OeY2Z1L+7c0vvdp82dHRIVmiQ8pZ57UWBoRiLGV4USKz3GRmRULpNBX1PJzv0nZoytDcjg14lrfoqUxjHy2vYumeScBVIIJwJr2KInKVuX9k2ul8kLqJoFsOmJC3Pxe95SlZGc77ExxSf6T+SP3HA0ak/qOAbm/hfMtF1C6IaDj3liZNaT5Go2ZNYD/CVCr/Bgzn73Z3P9GI787hUhmCD5bTccn6rcwOdGihQwsdWuN2aCnR3qH1++X5l+3h9AeE6+YvtqpxZN4rWvJeiby/knE+eesJEYlbEFLmfUc8M0RNJfOODue+EjvdMXtBU5mmPlBKWz1tVDc1/dSCqJNRJ6NOHrlO7jBfaPPjAWMdnUIuhpM098wGkgRnzFNqnIx5q1HLWTTByqlUzAmGDsjTadaWg1bu7pFi/1IhlPBGUqqdE4SKGJzPzwQRlgJMxUjUQ423qg6THYb/fH3e0keelGHG66x4vcs/LfVCgNBShhBjUlMZ/jNgm7H7d6voB955t6oGd3dxFaORIWivedQxpeCD5UZTHYlWPBBrJzPZCqORpzIGxO5o5GFoJMKD0iJaFYGQwEgQiUMSVqmgOVcTQeNwcR2xc3RYmczUhuADRHTjJerYgnnnaugiQhcRuojG7SKSsquL6I7CG5lzqBitqWQI72DRmursweOn8K41q9aHaNbbdVCnok5FnTpynaq76tRnO6ggs1fqpWHOGeKIlESSSDjz1HjQPE4mXXHAHIjd0noSLZVp4a7iKebagl4bfzHbhImBC/kRs+CY18rbZCYC3sFSxKszCWk+6N+smrfni+/PzhZwlj/EHq+0NTQ5JkEQT5gNTgLPByexhEOwYiolj0P5AeuDHH3x3YeF+wyLZVMRUwYblcFZz0JI2lBh85tUGhJpSkKbzIcnArbhug2JnTbwU+6RyqDZTTg3dNgeQoexkT8SYiTEIxBWy6Z/bfIQv/b2bOAQFvkXlncf/wznVyPMSNTFjEThvJLcJAo882RHoiPCmBhZ0wlwMjkIlAzY4mJnULMteCpTyccJq8idKXHaEmqsTVmveJ/pjAHwBrzUVk2FOw+VapsP1p3n1f2RyveeVQfmAyRUQrB0GpjmjGqIgXnjeAopsmQ4yYrfRURw15N5ZwXxKxc+wcdmANf5nYe/+//M11q/UB2OD5ZTMb/Mm5TN1Gy4ukzsg9Yu0SCodoIJxuhUHPHDoVntPG32qc6mY9QPl59ni/nlBVRYm9iT1IoeVMG8lsZpqZnyIG2k0gYT8uENkvCpIF0PhvQGOK/ffPxtvvoxXzz+8EeAqyoNjKcFUbQjLDgZggjS+SA9ZSlbw5EaKplINiAeO+ORrW/DV0dJxYgsiKLYetC5ILNNSyyjVCbgOsboolWWhsjiVOYMDFX7kO/4Tl/ffe5xe28+vrn87M5n8d7b+QPltVawqBfNpxHiTSPtthnr7bwfGFbAsAKGFcYdVjCkh7DCI+4xsvhCMam9FtY/VHU50v5vTPu3rQRZT7r8wRVQqaNSR6U+JaW+Q3CvZ4t8nM0XX+5Ib2xKvZhTnwm7FBHAZa0ePBCR8r8miaC5JUpOpXM1Hy5nYI96agsiVOqHSK3YHUkCt8ActfkUgKCzGcuilEYRI2jgU0lQHQ7pmne9ZzfvfX2p3gzWnqVX9NBKQZRizGTMayGTVlwSKwkhzEmdpnLID9gPZGdU/fbe3TyoNBGso3QwtjBgpgHGFsYeWzjAIdHOOkKHBDok0CExboeEbtMhp4PgnpUvInjOHBBis9LXBHzeczZkkLFoeOZpU2lfK4ebonX0xqtNsx8vMPRAvBgO3+iBQA/EmJCPHohxIBs9EOiBmDTAT5vd2LZrYHu7CH0P6HtA38O4fQ/NsLajfA+PrcMf3doHOTo3RHGyk+SO5f8FHpzmVluprCLScGaTN9RORuMPV9Cgy+ZYNyhVpul7lR1StCGbLCBFG4aiVZLDNppydExh2+07Pn0KGzoj0BkxPuCfyhlRfaRwwBMfA4XDBwq36T6mB2/bkzY/Ot7Q8YaOt5E73kzvjrfxzs1ixQygOhIkBpubhRkSRzrfMEPi2Zq06H7r1f22MVab8/wExipOnENzFc3Vby6sk8aJ5+G6aYvxYeEul2m+uGgmymwOq/Eaq7w4ji6GKJv2+p4zwynxNNoUhLYEiAU5FSeUHq4ZY9tYZysoVabQe5VdyVD1hhBDQzOFMRlDmjCESJYwY3gCZtxEYD+cobrnzm2WyG89/QqivhfZlVAPWjsaHCMBtLBGMyJI8pGIqDQVHhD1HVEvWwjr3Xy+eqz+K4P44YLqIcLQQlsgZUPKhpRt3JSt8WMeTtkgbrb8vy/c1dUIp6IVi4oTtzY6o5QGDzEAZyH6IPIuNDbvv6l0LTXDdS2VphPTeISe2vT3keIqWaWVuCCGK6tED8Qz8EDgMLW+T3QcptbuKD/FMDX0p6E/bTQI79mftiknlse6Hx7YROhxQI8DehzG7XEwokePw10nwNicD8WR7NHovBG5poo7LphJKUuOSIgxsRDSVHT7kN3V7TFs+h6QKlPtPUqumMfIOQOIxHvLAifZiOXSSUhWMi2cFROB/FDF87/VBtOM0rWQG69AGWkWMqCEVNFxSAxcyI+YBce8Vt4mg0hDpJWQRrN1+mbVvD1ffH92toCz/CHKkONWaCWTB+5k9IY7E1KiLAUvsqHtpuJvHdDz1M6gvnlh+7w63X2omNCLil7U8YH5FF5Uy0XULohoOPeWJk2pTilq1pzREaYS5v3WaH4q7ahej+nBciqhuZKkhQHRjDkLw+YsbDMPVc+u/ztuCIwCYBQAowDjjgKog8aZPKIxI3P5F6vCKnERqOGqwtBH8M18BJX04xgwNwXbcTyPdhyVMLDhMmuRgX0LBmYOHuXwQE8g20K2hWxr3GyrW2OOHx5mbhZzOZ8TBasko1qMpiymG5Qq0+SDtSioxGTFoMFIgX7KQkcM72J497mFdw9tvtFFIyAtQ1qGtGzktKxTe+8Wu3/M5TDFyXqWChK4V5bnbWmIENwTRgVvdqezcjLhBDOWeEJXMFWm3HuWHhYrvKBDWbBYrbC/WoFZQ5NjEgTJ56wNTgJ3RBJLOAQr0kQwxxFyJ4Jc5j4fFu5zPub2V2PV4nRFn+szQO5gPlf0S6Ff6nn6pbpP8uhmDqNnCj1T6JkauWeKdvFMvc0aoRHC28U8wHI5X3x86Zbw6NXRuaSKuQIxCm9lSsJIYEQEybSlMv9fICFJO5WJygNOnFOquP1ao6gyhd6X2ErWquFKkMzKrAKplDNUNe1jfYj5RSrCVHqzjGZgzeOb9uiVei3YXmVX5GiUOG0JNdambGp5TzwxAN6Al9qqqbheh+NoYqfivj/v/d6z6rB9gIRu8wV4V17WUjUgIUNChoRs5ISsU9fMxxv/p9nq07VvXl8+Y07GQCWSrVLBnKJKicTyv1lknkvLnPMTUdhUDsfJyr0fuwCpMk3eo+SQmQ3WyxCZGTKz8aAemdl4sH0MM+vczKi9dkByhuQMydnIyVmn8tpuWnJk9IyW6FkltuqAITM0VkdjrB5atNXlOqjsUdmjsh+3speki7K/eTA+RV7U5JXw7+FytpF/n4R/F3peRGWE8FwFDiYJ4yU3GbheguZEeTYRBLPhXEh85w3acdJVBtzWcinO69ZcReYhMBedtxpIckq7aC3j0avJwHUwtO7uOfJUGvzXyy1/Wsyvr6oD8bHiKmGbCA9Ki2hVBEICI0EkDklYpYLmXCG2uxoTOzNC355fn80utz9++Jz/5PVsedUYvRUeyoeICOd74XyvseH4FL27qSUOiAzWhOiEzMZx0CRGYrVNMhA8jztjuexp/PD32dnHX93ssnnww+Xn2WJ+2fQ5qw/Mh8qpeDITQRwxOhKhlJFKasMViV56nsAogmju92S+rYPetpz40YX875f6wHygmIosMElhEqNSMkWoU0kHIMIpTyh1yePkxc5Y1k9PFHz/yS0gvppfXC1guYT4ett+snFsVzp/8ThpFWeKWnAyBBGk80H6bDlz7yM1VDKRbJhKO4ThIsMsC+v1mzsBmR/+CHC18YtWBtuSKIpdkATzWhqnpWbKg7SRShtMCCmCJBwx2RmTZH0jfpuvfswXjxUj8klBlPAYnQuSeUMso02XJK5jjC5aZWmILE6m4nwwPJqdJtr9kNLtvfn45vKzO5/Fe2/nD5TXyiZcvVg+jRC3+TSadU2nuXmAqTKYKoOpMiNPlemUF3vz4Gc4vxphwowoNouRgijFmNHUaSGTVlwSKwkhzEmdphK+FWS4GFfZV/gQLJUp5Y7SwegsRmdHBd+eo7OVpCtiueCIINxvumIl3H84BCP3Hz3371xKc9+sQQ8AegDQAzBuD4CSh3gAHsXMR+YKoMUmRZUkpPDhZhlhRso3y0jBvFfMex0hlg/Ke8UaG6yxmWqNTTQ62/pcU8UdF8yklI0zIiHGxEJIUxmyNBy297T32zOzuubZiT1KDn2+6PMdEbJ79vmGRKAZ/QnaSu0yRaRCWqGcDiqmoDHy1tke2Z2//PT9ufVOvnRn1aH5SGlhHcO3RzbWMXRBdh91DJUk+gxodWCezzB5PpI7lv8XeHCa22xyKKuINJzZ5A2dzDyz4ZC7p7/gjijQzXtfX6rVVd2r7IqodxqY5oxqiIF543gKKbJkOBHcOrREOlsiO+/cRrf+Mg/u/M7D3/1/5mtVaoMcKqcSmsHywFTkynvqiJFS+sCY0vk5C1pyRPPxaL5czs/zdRbzs8ZAfOkWdx/Xel4fLKcSmrUBpqzUNinBuIpr1x2JmlhBBSfos+6KZpqv8uv8cn4+P8sHy9lZhQbzLhFg3uULjnmXzwnFJ827NPrQvMsHmSOYgIkJmJiAOe4EzIZoz28Omr0JmOsOXJsv8vH7GJvL5y+2mF/8Amk1ujRMVsrCTB6s5Up70DSmSKOTMXmXvFGe2jCV4BodTrPL8hz6PdipTIMfJ6xi90bjM/W3xAfHolEhKZIPRyasDBw4nUzXmuF68+/RJnfv1avr5Wp+sXlS72Sd4wW2NUVt55HmxY2DBikapGiQjtwg7VQR1OIoGZlRWhyrU4nuHnAoCerub6a7O7uR9q6N+hv1N+rvketv3Yf+vpflPzINXmz0pbPu9poKa8FLFkgKwJRn3lEaeHJTiVnKATX4Tml1Q1BtOrwHkRVLa0A3dQkqOg6JgQv5EbPgmNfK2zSV0prBXEy/1QZQmpXETbDw+7OzBZzlD7GnGbc1NDkmQRBPmA1OAndEEks4BCvSRDAnEXInghx98d2HhfucjzmXL4Y+9Aw2hTR8rHDtj4bbvmj4HfMAiTgScSTi4ybiShxKxH+c/fF+tXg/+6/xec+LKR2SGCcd1wrAEWutSZl6OxmMECH6yTTWGjClQ5RbNTwFmsp09YFSQgMUkzhGjOreLFCjjrFAv+4YNDrR6ESjc+RGJz/U6Hy7gLNfmw/xvGxOzpJJwVPKXOJMMsuDlzxxYNJBVuJTUdQD2pw7u+Dtw0xlyvkwIaHFiRbniEHdn8Upj7E4bzcMGpxocKLBOW6D8/D6tbzNr9wC3s+vFwE2knlOhmeMiTBjCBgbGJVJBcWcMdQ5aZQKUylMH2f92g7sVKarjxMWGqJoiI4Y3COpX3u0cdAgRYMUDdJxG6SHe0D/5XqeJQAr97wM0QSGKs65YdQRCpJ4anjk3mnlgkhT6aA4Tg/oHcxUpqMPExIanmh4jhjUI/GA3m4YNDjR4ESDc9wGpyaHGpzv4GL+uSGW8HLh/gbL52V3MipFMlLRrKijJEEoQbgDrhRISQydiroe0AG687a2hE5lmvooWaEVilboiLHdn/uTHWOFPtw3aIyiMYrG6LiNUaUONUbfrxYfvlzBh/m/Ls5HZ4jmVwqWqOUgwDkSAoXguAwyeC5cBlfW2WIyM9CHM0QbH/pe2Gw158efYPX6wajYNYRqU9p9yKw4szFYnohp2iZLkzRxHJhRNuQTwHlKp4LyAXvT7R4B1OJ0rAzaB8sJeRbyrBHjug+ehZNIhwvL4iTSUjy2v0mkOPerZ+Ti3K/Oc79Aa0ezaUACaGGNZkSQ5CMRUWkqPCAGuxq7LYT1bj5fPab5lSH1cEEV2+cJ5rU0TkvNlAdpI5U2mBBSBEn4ZMzdwfDcYOX1m4+/zVc/5ovHemfRPS2IEh6bMeNOp0RdDMpQaUK0nloVqTCWk6lYp8PhUT8syPjFXZ5d58/ys7uM5002+aerB9f8OiHwHaTt1evFcf8CLM4dt+BkCCJI54P0lCXufaR5JzCRbMDzuPN5zNbH0NegS71ILokCZ90OiEmcddsDmk8769Yck6Fw19uM2QmYnYDZCSPPTrCHZid8yBL8MH81j/DyfB6eWasACUaxaB1PUVKmlFDGq0CFU55GIbAvandnlmgduXmEnMrU9zGiwvgtxm9HDO3+8mTpMVbog22DhigaomiIjtwQPXhI3maz/5zxkU+q52WGEqAhisgMowa88SCMtsEqHbWxkmGjgJ5iqm1wU5mmPlxQaIKiCTpiYPfXMOCoMVH3Ng0aoGiAogE6bgNUH+AJvSke2R4k26d3jpKRGaO0ZIwaKYUGEoLizAZJGRBprRFMUaqBTSXHlJrhdHcbR99eDNWmv3sR2laHU3KgH2nPBVCho0JHhT5uhW4O6IO+e9vfmwI/MpUuiv6lyJUGa6wIVpnENItZbNyAFp4Tpiei0tWAddhtmny3QFFtSr0nsZV8Tzaj2gmpouOQGLiQHzELjnmtvE1mImCnciCw/1YbSGm2Fd6smrfni+/PzhZwlj/EnhoSa2hyTIIgnmTW5CRwRySxhEOwIk0EcwohdyLIZRvlw8J9hsXS5YuVwVYJQR8KbMjPx8DPDxwHsddWQIaODB0Z+rgZuj4g5+Nm479euL+/3jZsWv/9r3B5PTp2jl3SBq0uwi5pB+jzU3dJi9YSC5YaG4w2TFqvMzMSKXktok1TcUIN2CVNtcnd2XNQ1obyHkSG3GzQxCckZ9+OnBVsFkqctiSf5jZl4uA98cQArBtSaaum4mUd7jAXO03R+8W8955VB+oDJFTspSacV5KbRIFTLx2JjghjYmREWBEnY48MhuA9g29fNjQ+LPIvLO8+rrQp4HHCKuGaW6GVTB64k9Eb7kxIibIUvKA8TIZNDojrdo6cmxe2z+tD9IFiKvYC4o7l/zUtsTS32kplFZEm29bJG2qn0ndlOCzrci/SHU7Jm/e+vvSjC6v54kt1AO9VdtiREDsSPpeOhNiRDTuynQyR2JFtHJjEjmxj78hmDyxELLqzMT8C8yMwP2Lc+RHmgDnGuzb9Tah2I6KRpUiYck0i0Ez5haMKeOZEMaUUFIMgdCJGTMZXO2DsuM2U3v0gqky/9yQ1jCBjBHnsSD99BLmOrLcBj3TMeusO81NnvVkuonZBRMO5tzTpfIqnFDVr4nIRpuI7GzAat9MLf/8iX4cA1XuAHywnjExgZOK5RCZwVlLf8WGclXQcjnFW0rPGP0bmMDI3NkxiZG7skTlKWH+hubuuQozOYXQOo3Pjjs7pI/qLNTL7CVavNt9vObqgHC8F5YKkSinDGNESQPskhaYyuAwkAxlgE1H0Awbl9hQF7MFOZRr9OGFhCA5DcCMH+OlDcCHlY9oJCdpK7RSJVEgrlNNBxRS0mgjQBzzAdccSxVtS8dJVOHvkOGndpEUe2TrqgWpAyoWUCynXyCnXETMa8vvNH8LbrCHuVNaOjnqpEvXymqmQkpMGonQZTokGCOtCdqrA8Kko7gGTZ7oYW09iqDIF3o/QkIohFZsS0A+iYtiNBLuRjNaXht1IRoRr7EbSCtHYjWT8WMZuJM+gGwnm82A+z/jgf+J8niPHBT7BddG3jL5l9C1P2bd8WyC2PWLOYF0h9px8yyYwSoL0QVgqnMyPs81LlWb5GQ1uMr7lkc4XehJDlSn4foSGvmX0LU8J6OhbHoPfAn3Lo/AtY/UbVr+dCrVY/TYSTKK3bMTeMuwUMdzZjJ0i9neK6Mt7u5NNovcWvbfovR2599b04r29195rZM5bWizKTNza6IxSGjzEAJyF2LhyQRmbdyHq3c5c37Tbew+Q8+8Ld1Ul2z9SXEVuZXTWL1xTxR0XzKSUDwQiIcbEsmE5FYctH85fa4+5WXcPq9pg3qPkMHtyyNMcsydbneInyJ6spd/vgHFlbPjb/eA+dcNfjCpjVHkMOD95VDlKQZRizGjqtJBJKy6JlYQQ5qROU+m9OlxUWZQzum8eVBpG7igdnF2Ps+vHhN6eZ9cbYMpmsCYlGFdxDV0SNbGCCk6mYmQMh2Car/Lr/HJ+Pj/7mJc4q/CA3SWCEgZB6yYfmJEAWlijGREk+UhEVJoKD4jBrr6JFsL6OrGhYufb4YLCbDLMJsNssooxidlkmE2G+wCzyXDu0LjwiHOHjsTxKeYObbMpSW/ZlHeCKJhMicmUmEw58mRKcXgyZXMavj2/Pps1OY3r7zi6REpRyqNUzjqvtTAgFGNNn3RKZBaX9IwIpdNENPyQwy3KKVP74VOZRj9aXpilgFkKI8f46bMUiPCgtIiZmwEhgZEgEockrFJBc44jLjrHeneWc2/Onu2PHz7nP3k9W141ZkiFkbRDRIQz5HGG/OiAfMQM+c1oFnWc6+CxVYNuA3QboNtg3G4Dww93G7xdzC4fxe2/X/4yW47PfyBL/gPGm1oHHbkQTPBkfIg8hLwNteZCUjoVnT2c0lblysIOOKpMi/cnOPQooEdh7GA/uUehljq24XCOZWzdYX7qMjbM7sXs3ill92ImJWZSjg/rJ55iIY9zvxW4APrh0A+Hfrhx++EU6eyH+9XNLn/4I3+l5fogGZnDTZccbtKSZLwRigodGBNZKppIIY1WiWQwTUTBSzNcpHfnbS0CpjL1fYCEijZqZM54T2QyxGkTrQ8GjNPaUgY6TsaFNlSHnN9qw2OjG9aguwXcx+/9crVwYdUSglQJEzVnhirwQUiZVPA+KUW1DM5NhSYJghA8EQT5IwjePmrpYK2k6d2AridsetfK8XSKpnfYagZbzYzBKD241UwljtPhwrroOB2x47RgGRtDNPU2eGapo8oLMCYoy0hUWghMwu1slTw8px5WrD54XnO76aNktQ0HNOA8IBpwz3+Bbn90+6Pbf+Ruf3WQ27958MPl59liftkkiozO+V+s1qWWOCAyWBOiEzIJEzSJkVhtkwxkKlVedDjn/+7SjxawqU0zHyon9Bqg12BEOO7Za1BJNPZbIxiDsacLxtbh98KEwWcF8pMmDDbf4kAPwQPzBv0E6CdAP8G4/QRiT3rg5kfz/nwxOm9AeQgqTYY6KjVLEmiQkVKVJLPcMkYTdXwiulsN5w5gD+/rfXRUpoX3SAOp/TcnRkjtT0btsaNW3wjGjlpDd9SKUlPLJIPoRYJAvARlWQjUA0mKTqV/93AY5jt7TGwv8nYx/8+8+uZZddjtIppiAgqNVCTimIs2KnDcJBk0lVRxENpMxSH1DSuyCy3TNz8qHb14uKBKeE5RGSE8V4GDScJ4yU02gPNRrDlRHs/gzmdw2QF+86A6+LaWSwmtSnMVmYeQj1/nrc52glM6H8WW8ejVVNA6XBqsLKnF7UV2tXlY/rSYX19VB+JjxYXTRHGa6JB47TpNtJIJX8Odrzjh66gJX5VMAx0QjzgN9NhpoJVMneODYRKnzh2J5FNMnas+JQtLEZ/VHvgG03Cj0U2dg01SpWgDZdFzo6QVgmuvpsLXhtMDnL747kNeId+Z0OShXH4/+/jqfJZ/qV5Yt5LJNnFQtSgtvJsigemBmB6I6YEjTw/U7dMDf3Qh//tldFmCxQkdVDqTJPFEOqYiF1oJ4zRNFKIwEcREtKgczpzkD6W1EyO16dFWQikG/uvIZh3QFYXJrP0ks1biJB2OiKCT9GgnaSWBpAExiYGkYwJJmPCPCf/PIeF/48ix3Rw5W/sV/Tnoz0F/zrj9Oc0UyJI/Z09HuTu9m5+Tk4cQqyQ3xFLmXAiEORaAqqaHI/fOTcUaFANmzT+cPNceOJWp4SMkhe3Rh8xExvboreB8gvbomvjgNRXWZjbEAkkBMmln3lEaeHJTiWQPdzqrncJ6MN9tbZ/cDL9dP6m5t24fIivWS0euNFhjRch0PzHNYjbWuAEtPCdMI8a7YnxnMXCrEc9V47wnseHUYJwaPD50HzM1eO36smS/66utAY/+MPSHoT9s3P4wvaf9WZcJCyPziJVbpdcxx0QM19gUB5l0UNPHDTIphFmzwemEVNFxSAxcyI+YBce8Vt6mqYRZ6VBx/+oGV9JsCrxZbcKa35+dLeAsf4g9qSbW0OSYBEE8YTY4CdwRSSzhEKyYSpPzoTyx9UGuKbFYuM/5mHP5YnvcSHVEsoaaDY2BrIECWRty3aJAqL0lgPQa6TXS65HTa9aNXj8uFH/pltsDanQEm7ISw1bBE82BpGCJpFpoqligxBEuHQPtJ6KpmRowRK879xm4C5/a9PVx0ipZoU4z7/Mp6QOniRpHKVBOmso5Q7yScSrYHs57tDv8/OAiLnyCzb8NUdi8Wq892ofIin12EiFJQP49rZUKMSUntSaZZ1FvqZpKwd2AlaHi4Ym04yK1o/ogGRWD8SCD8WCNjjQb/4QxpZPhKttvykY2mbOaDGeGtGjCufPg+bBwswozBo8UF/aCeqEHwzb2gnqWvaCwJ2DP+wB7Ah65B4btCUio8jxKIikJHJqAnDWCcp51AJNeYAb50TbO/tt3xx9XHdqPFVex0sdbY13SnGvTPA5ORO0DFSLRlH8Xsd0V27bzzfoVVp/msVZwHyuvIrqz1Z7RraJLIjHOUnCJOw1aCGZDwjlynT2JtPPdertoAhurL5XiuweJFREeLIkhZOOEcSGECdxqSTTRIJRxWN02BMIzuVqu3OUKEX6oxIozvGRILHpFJWTKyZ1iEZIOUnANMdsriPCuFkqr+/Xpavv0PaxWee1ldbg+WE7FHOKUYrZISDZEgkqOeB2ds4GSjGfC2FRyiAc8r48iRxWnyfcnuJsEPNE9Aa+UJYApeJiChyl4407Bs/zYFLwHwbn8C5s3xtrvmxZ7QXFplWDK06hdjEpSb4knWimdtPJuKnl5ZsBYyQFqah+kKtP0pxBhMV5oMlMTgXifPGNEEiCCRCW0BMiHCfqUO9u4LdJ2diY5/PvCXeU1awV+b3IrpqsqnoxWAoKVmdsJvRlvS5gjoAyfTArUcCe+6HxcfQ3p3jycL7b3sDrQ9y0+bDyNjadHBO+DGk8Xxks4DUxzRjXEwLxxPIUUWTKcZJLo8PQ+2ru8uT9rLfvLPLjzOw9/9/+Zr7V+oTocHyynYq/LRBII0Ik1JngkYDkwz43VjARHptK3dTg0082EkMbj42aXFVoTjwWA0Y21uwyjG6PGbZ/RjeozQ+mAHTMwNXQsqaGVTF4b7jDHyWs4eW10mMTJa8dMXqukRHA4woUlgs+yRBDTkDEN+VszvtOmIWsTaVRKAU2cEG09VVRHEhz3+bCfTBHsgAjvXsP5+sulu5iFquul+hIbFgViUeBoQY5Fgc8J3VgU+E2KAtdJ95l19pF1vyffD1PxMRUfU/HHnYqvj0/FvxsZGFnaPePYDvcFtQP2ocN2uF0M1tO1w60kxpzPNgwyjxTcJwwyV9Lsebgei9jruTsbO3GvZ8tF1C6IaDj3liZNqU4pasadCRGmErQeMktoZ/Lsg6KG20ms9SL7YDlh6/LMvAaDM7Yub1H3ga3LDzuVh8slwtblx5nVHcWFhXlYmDciOPdcmFdJ27cB51th27fDbOY+2r5V0iRgODRjk4CjQD5ok4A6igKHwz4WBR7q6BukKJDSSEUijrloowLHTbZlNJVUcRDaYE1AZ8vlobAKt23z42c4r/FUP1xQ2CIDW2SMD86naJFRyTArMZzbD6dZHWuMDzrNqpKybjpcqhTWdWNd9/hAiYXdWNi9F5ADzufGym6s7B7vRhh1tRRWdp90wJRjnGWzw0WVqMrmME3U0xScVFJpi00TOxPCY+9XxS7qXmVXQn02bYihgTlnkjGksXEy/SPMGJ6AGTzXj0b9/Uq1zRL5radfqTe5r1fZYWcD7GwwWqSftrMBC54AAzBBcEKZ18pYqQ1LQRlmNaK7q61+3N2q2I7pUXLYy2Pc7BR7eZxywLeLwRAtabCUWO2lEk65ZKX0fl01iQg/PTu9f78qPtV7ld3N2Nh+Gth8zdPCZjXYrAab1Yy7WY3ps1nN3UNlbG1rSKltjeQsSqZ9tJJ6bhJVUSQfQ3QhCGenkovEh5sWu3sH3r9IXvqsKab7WvhcsUY/XmCY+v+CDolwTP4/EOmDJP+D1o4Gx0gALazRjAiSj3QiotJU+Kk4mPlwDW0eJbUXe1hUDPDDBbUn+58paxIRQWrFfaQWsmliUqBBMD2VI5wPWIjbQlpfm8MhoA8QVNEmyQezE1JFxyExcCE/YhnTTbTE2zQVQNuB8Pxbbaik+sV3b1bN2/PF92dnCzjLHwK7cWA3jlGhFLtxjBvB2I2jpQ1wim4cWKF9apMWK7RbmrS9VGgT4UFpEfPRDIQERoJI2bgVVqmgOZ9KFsRwFE08rMjcXOT8+mx2uf3xw+f8J69ny6smIFIhkg8RUTmTxyrBlKdRuxiVpN5mK1krpVPmZW4qLfwHzHM4wN9ZngJTHcZPIcI9VbAJQgAJzAURvElJcCINTzpaTSjugY57oAkz772BXdLMKzVbTiZH7DuDfWdGh/aT9J0BywNTsekvTR0xUkofmpbTTb/poCXmcfaA5svl/ByajMOzBSyXL93i7uNajZiD5YRDiV58w97pOJKoCOoTjiSqpPXHcNjGzh/PsvNHJZ3ysFHes9kDwzbKq2Rs14CZfDi16wj+2UJOxdPcZeqpPBDlQOR/LSQSuebWBA8mTCUxdUD/es8lJLWhvHf5YdPTAdGPPU+x5+noMIktT/e3PF3XXFPSd9H114+N5ddYfo3l1+Muv26I9PzWiDqo/PpBg82R1V1TXqq7VsETzYGkYImkWmiqWKDEES4dAz2VXCNqhyoCyaJ+OJ53P4S+lu5Up6CPlFaxX5Bm3sO6NRBN1DhKgXKihHGGeCWnkjUxnNdKtRHWrjG99Tqw+hAZ9iTPSowOh3LsSn76vm9dupKHREgSkPeC1kqFmJKTWhPKPfWWqsnkCw3XOUM8VLo7LlL7yX2QjIppbyCD8WCNjjRzXNKkvCXTZMExZSObijlCv2GmUFvl+mHhZqvqEH2suLCuG+u6RwTnnuu6K8njVJjHOU44nzKPE6u8+8Y2Vnm3RDXO4X4WeMZ6qHZwPkU9VCVZ9nQ4RzWm2WOa/Yg3wnCOPsyzf1Z59thb7NR2DfYWa2fX9NFbrJKW58OhGRueHxqg7LHh+WZSj+klafReEBSzRTFbFLNFx50tanrOFr17tIwtb5SW8kYrmRQvyHBUDUfFH87ShhoVX8sIiAGjhDgC4sBISmtB4QgIHAFxKlQeMAKikkSLAZ1cmGgxlkQLdOCiA3c6DlxsRN43x8NG5EdTvYEbkVdSYDUc4cPyqpGVV2HzlZ4Rjs1XWjRfwQZVw+ERG1Qd26Cqksy0AS1hTEw70g4eNDGtkhTl4fCPGcojzlDeNoY7QY7P12+N2T6Y7YPZPiPP9qHHZvu8/nLpLmbhV1h9mscbMj62RB9SSvTRJtKolAKaOCE6W72K6kiC4z4r/8lYvtmkH84D1t1024mjyrR9X2LDVkMv+HBpbdhq6Bu0GvKGC6c0aGYpBWejhhTyKc4MD82IvYnA2Aw3BvuACoK7p0692O5PcNh+CNsPjQjYPbcfwhYtp04sxhYtu4F8mhYtlWR5YjutsaIax6Iei22J0ZDnhPjh+7Vwb411SXOuTfM4OBG1D1SIRFP+3YnsgwFtFnsUWaoO8kfLC3M+XmAzomcD92FzPkBrR4NjJIAW1mhGBEk+EhGVpsLj6X40I91xka/DbLHU9QBB3eZu8D5yN3aEjzBtA9M2MG1j3Gkb9ui0jT1ac2wJHMX8DaAROBFeRSek1FqBJ/k/k0XGophKoxY7VPpGdRX+mWLtSI6kvSjY4j5DVYuqFlXtuFWtFseq2nGnRiqcnfuC2uGyxXB2bieefLrZubW49s1w7k907o/IuY+zoftOkMTZ0J1TI088G7qSLGA24GhozAI+EOqDZAFXUr2Bg6JHhW0cFH0gr8RB0SNFNA6KfkZZBVipMXClBma2Y2b7qE5nHBQ93tMZq5DaohoHRT8LPOOg6HZwxkHRh2ekDwdnLDx6loVHlZRmsOE8JFib8axqMyrp2U2HC+1g025s2j0uQGLX7mO7duM0plOzP5zG1I799TGNyaYUrUskuBRUcsTrzAdtoCTjmTCGkZMBsjmeyEiuDN79CW5bTmJVH9UkWKeJxSNYPDIGYbVsr91r8cjdY2VsZSSsVEbCWcioYgAmZEVOm8nLxkptWFbzhlk9Eb2uBlTsx2WO16zZ+5PcnrAcU9YkIoLUivtILTjLTAo0CKanYsryAXMoDp4OXxnCDxdUkZuBFk5IFR2HxMCF/IhlTDeHubdpKoC2A+G5uiJ7mq3gN6vm7fni+7OzBZzlD4FpaMM6tzANbSxpaOi4RcftdBy3XFolmPI0ahejktRb4olWSqdsHbip9AkYDs2nmAFfGdBPIUKsRR138AJLUYcrRa2kf8ZwA5iwe8aIumfUkn+J6ZfPBe7Dpl9Wku02HP4x2e3oZLdKUoIHxCRmBB+TEVxJsRLWKj0rLJ+qVmk7dqD3PLav3xkz2jCjDTPaRp7RxvvMaLvjahpZQpso5bNV0oVtwK7I2IXtG3RhqyRiQe1wYz4xZjHqmAVmFGFG0VQzinCY4TdIOMZhhkcJ6tarIPv2KtwqBHQqoFMBnQrjdio0oc3jnApvF83fr77cKMqReROoxClLmYcNqLtxylIXBX66KUs4haZvDwNOoensWzjxFBouE1iXVHTZimKcpeASdzrTMMFsSGoiGM+aaTiUt6pSKJoAtYH8eInh4BkcPDMuUOPgmQOPahw8M1JE4+CZZ+QBxsEzew9oHDxzAIJx8MxI4YyDZ57R6YyDZ9qiGgfPPAs84+CZdnDGwTOHo3m47u5YzDHiYo7qC5/pcBEbrHx+VpXPlVSZDpcTjVWmOHdmVHjESnwcOzN27ofdC9txPxw7M0I049iZQ5M4eh87Y/pIrL+fKIIZ9ZhRjxn1486oNz1n1N89WsaWW09LufUuBkO0pMFmaWkvlXDKJSul9+uk5InodjFcqb4+NtGwYv3eq+xw/AyOnxkhxnH8zBGAxvEzJ0Iljp/59m4BTEYbTTIaOnDRgTsdBy6On+mb4+H4maOp3sDjZyopQh2O8GEJ6shKUCtJhBjulMdEiKMTIWpJG8as4eeE5uGzhitJmhzwbMakyWOSJivJYh+QEWIS+5F88ARJ7NvmmSfI8fn6jTHbB7N9MNtn5Nk+9thsn68HzM3D+eLfF+7qqqkCHlvCDykm/CiejFYCgpUpWqEZzxvSEOYIKMOnUpashquX0KKz5irCqTbF37P4imZvPiuiF0RRmcEfY3KOKeqtSSwYG9NEwD9UEXN1WRIiY+Pd3H2Gjy9htVZ0j4H49RF2o8JuVOOCb7/dqDBJApMkppMkQYQHpUXMUAZCAiNBJA5JWKWC5nwqAeIBz+OHHp3NRc6vz2aX2x8/fM5/8nq2vGp4XoW27yEiKqdkkkCZ0UYJIl20NHjtY+CZ7klnNLp1O5/IuyNF60SU9/PrRYCmjVK29dYvvVnBxdv5/Lw6HB8qpmLCTmIKVEouMZFIgOg80JhYCpnBOTmV0PFQDbWr42r5OrMmoT1fCPNmBs0Mw7wZzJsZGyYxbwbzZnAfYN5Mq7yZTd4ApX3kDRRiFZg6gKkDmDow7tQB2nzCA3MHNt8oCzPONq71JjMgP12u3M3X/frmm+XbxexzFtftS6NLLOClvAJvPIuBRQZeEJm0dzwlKnQMhMZsvk5EU9PhGkRTwttHxo/GWmXqf1jhFuPAhhFBA/MgvAYpwTmTmIqGU5HUZFJxh+snLW1BWI9u5c2jeofIHS0vnIs4ZFQNxyLuD6sdNhZxQ/sEOYr2HakrkBMiJ0ROOHJOyMhwnHCeRbSC+FxZYSNGoaKMQRAnnMyUUAbPkvM2pDQV43ZQVvjwvp4WbZWZDkOLF5khMsPRbgZkhsgMp4Xo45ghG5YZPtQWyA2RGyI3HDk3bBrpDsQNr/35LDxTYiiZUxZ0sorK4KSKQGXGnvPKJB/MVGzbQYlhhzHWx0KtMrNhUNkiJURKONqdgJQQKeG0EH0UJeR2UEp4X1UgH0Q+iHxw7Hzw8N5TnU6Hf5stZ352vmZ7z5IR8pC3gtPMeOOd5JpZSbNgmwmzUkDEBNIDGGGH1krHg60yu2Fg6SIrRFY42r2ArBBZ4bQQfVyg8LjKwWOVBfJC5IXICyvjhS3OhV/ncZZmY+xYXEwhbdqw5U0JRjHHHIXMBpllMVu5PGt/mIj6p8P1ADieuXQCW2WWw8DSPaXN0eGDoM2BNgfaHGO3OWhvNsevsPo0j1NrYsCVI8bk/WkcNZwYZhJR1CoILBppp9JuaEAftO0w1udwjFVmYgwjVPQ4o8d5tFsAPc7ocZ4Woo/LQ+K9sr+2SgJZH7I+ZH1jZ318ANb3vNsUCBKNsCRxy5TQmjtlg9NShCS1S2kyPuYBeZ85BUWpvj3BUGJF7ofcb7SbALkfcr9pIfo47icH4n7YjwDZH7K/58b++utV9+TJ8JwbEYhAEnNcqxiNckwEFgIzSmdV7xORUxnDOyT1O6KDWmuIVWYgDCJTJH1I+ka7A5D0IembFqKPI3399qJrqSOQ8SHjQ8Y3csbXzBw9KeP7/fL8y4+L+cWr68Uii+GmPO05sj80a9Gsna5Zq5iRKkUShaOMMstSdCFxLjSz1tCppDMPZ9ZS8tBmO/VhWtl2GF7ASAuRFo5qCxzXeUAMQAuLOwopIlJEpIgjp4j01BTx2XejM94yx5gxRthgmLM0OS9E0ElC4DAV03nIsGDvlh12oRtMqhgaRB/KaPcAhgaRA04L0ceFBofggNh2DpkfMr9nyPz6KwZ8u2gWWn2ZWhMYpoBEQ51jginHqY6gOU1eG02IRup3APU7omqtC8oqsxKGEiuSPyR/o90ESP6Q/E0L0WMqBmyvJpD9IftD9jd29icHYX/PuxlMUM7ZBJpaS4yLUYIFkUKSguedKvVElP6gg6gebtGTAa0yW2FAySILRBY42n2ALBBZ4LQQfRwL1IOxQGwKgzwQeeBz44H95X8Wzobn3BbGsqSUYYKBDyIaA+A0GCa9UkwHNxWL9pnkf3YAWWVmwkBSRfKH5G+0ewDJH5K/aSF6TPmfrbUEMj9kfsj8Rs78GvJ1YuaH7WGem/JH03ashsBJTVtvSdQhama9CFGRkDEekhI2hcRJShNB93CmbT54+2fj2CDmfsB7eBEjPUR6OKpNcFyLGDUIPcQmMUgVkSo+Z6pIT08Vn32bmAREJZmFlrSxgZtsQTNCFQ1WGxOcmoj6HzJMeAL7DhvFDChXDBWiP2W0uwBDhcgFp4Xo40KFw3BBbBaDDBAZ4LNjgEofTAA3P36G8/zno2N0psToKI3ZFiWOuWijAsdNkkFTmfU3CG3kRJQ45Xw4I/WhuFoDpzJdfrigiqSLEqctocbalHWJ98QTA+ANeKmtmsqEywHN0p3nVFYcaXZ2vV3t3rPqgHyAhEoIdoono5WAYGWKVmjGszVkCHMElOEREdwRwVq0P2i213wHaXvNm4fzxb8v3FWN53Tf4ithXzoNTHNGNcTAvHE8hRRZMpxkQ9ch9jtbI3Tn2eTCJ/j4yzy48zsPf/f/ma+1fqE6kB8spxKatQGmbDY7khKbQzwbISRqYgUVnDhEc0c0N0G6X+eX80zO8q04O6vwNN4lghIGCVWeR0kkJYGDNTRZIzIfiiwy6cVUMGiGO1E79KG8ueZXH0B1eD1WXMUQBA/O6ZSoi0EZKk2I1lOrIhXG8skE2MRwlrLqfLN++CPA1V1LLz+8fa06tPcvwBL+o3NBZiuZWEapTMB1jNFFqywN+XyfivdODoZ/s9Nbfp/Jf71fby4/u/NZvPd2/kB5rRUs6t0DpxHiNohn7FExvLt+RAzKYVAOg3LjDsqZw4Ny7+fXiwANYV/NFx+/X365DPdeGl2grph6KT0oR5xKwSUWgiVMJ+/zS1pypsRksm3IcLZuh/DTfixVpuP7FV5xqjvYbM0GQVmCyJqIHo9C+UBIssb4qQB/uCTKR8JqfeteXS9X84t7r9WbiXYqMWJ0BKMjowP7EdGRTeolOY627VMhSOWQyiGVGzeVs31RubL+HBmpoyVSV4ltO2A9HRq3IzduN+YA7dMcKF0SDQM0DNAwqMQwuJHRhpjEcXt7ZXEorwiCeR+dEZColVwqIWMyJlinIp9Mr6rhMhsO12hlVKFh0IsYS14v05wYwFQIyhPPadZKihgIIXrrBZlKlsNgVvJvtYFW5iP93dx9ho8vYbVWgLfZ6fcx+uHLFXzsgEysNcJao+dda5TtskCZ0Ublg9RFS4PXPgauBEhn9FQyKAeMKOxOflq7x++dLOuX3mQD/u18fl4djA8VE2ZDvhjQmYbZkCPPhuzXkVYy0dGRho40dKSN25FGyeGD7p44Cd5/WWbRPIPkSVHsW2ljACZs5EkqbmV0xGpCBVHZ/GWMTsQyYGo406DDILbO0KrNQjilLEsGM4CWIZHkk9amMZG1ymeMzqayp1wlO5VtMVROcXWONcW7ONa+98vVwoUVun4fIXSo7lTVIfRkrl9MxcVU3OeZisuOG5jY0QJBvwH6DdBvMG6/QdOio7Pb4NPV9unoXAGUlXwBwXLvgksEZCRcGaUSIXkPcssdC5pMRHGLAYO2vA1/vYOXyjR2Z/kUA7bEKskNsZQ5FwJhGbRAlWeWZly7qXD2AVPG5b7b8+B5vVnhR0iqmEWTUrT5QM6HclDZGPI6ZiAHSqTghDHMoumKaHVUy627SrsygPcnuBLekwyJRa+oBKsid4pFSDpktGuIJkylI983dB2UFex7WK3y2svq4H2wnEpo5lZoJZMH7mT0hjsTUqIsBS8yn3VhImgeLlN9d2rUI95688L2eX1gPlBMxX69xAevqbAWvGSBpAAsm9beURp4cngyd7ZEdgrr9iZ9+PvsbDtWaVvFt3myrNkG6UFkxcCFBSdDEEE6H6TPJzX3PlJDJRPJhqkQyOHmvbAsrNdv7vgR6811LIkCM3cHxCRm7o44c7dU9sm8lsZpqbPdAdJGKm0wIaQIknA8mzufzWR9IP02X/2YLx7rxfLTgig6myNXGqyxIlhlEtMsUh+4AS08J0xPBI8D2sMP24PvMu62+Lkx77ZPq7aJexJbMRlSa0eDYyRkdFujGREk+UhEVJkRekCsd/VjtBDWu/l8Vb3X+XBB4WyMAavhcDbGkTg/xWyMzUwAcmBG262rG7PUMEsNs9TGnaXWGIGHZ6l9DWaNLVuNFCvX6ogVUzJc33+MFn/DaHFI+UR0QoK2UjtFsjUqrVBOBxVT0GoieB6QZT0sHtzXD+bWJ/nSndWH6eOkhQVBWBA0PkyfYnJxJRE5ixG55wT14SNy1jAiaD7PQXgNUoJzJjEVDaciqcl40QacnmwLwtoQz3zD4uxGFW8eVZxzf6y8MBdowNlamAt0dC5QJTkQA2IScyCOyYHAnGDMCf7WyD11TjDm+WCezyhwPkCej6WCBO6V5VEmQ4TgnjAqeBPadFZOphfgcHkRD6uC79+0zRL5radfqRnyPUvvJiPCHJsRcRPOwcwIzIzAzIhxZ0ZQQg9IjTi/PptthLp9+NItIb/zfnXtff6l+083vzO67AleSp6ICihTLDkOmmTEGcGTyLRtHYFWk2n1M1QQo77mkflC779cpPlls97F1fwyi+PjD5/zv69ny6tm8zYXbJ6/v/bLsJj51k1PAlWMeGay7gguBKWMSTzQIKN2DuJUsDnk6NdW6aWHnXqVAf+Uoiz6IYQVeQ9EozXn2hOfTSkSkhVceunUVKLOA/ohduYGbG/X+uD6alD9fvnTxuZ/B8tNB8+tpVQV9HuQ2G2jVX4gCTtkYyFPQ56GPG3sPO2Q+Sz7ToO1ZZpPwXETteJ8FiRqSNTGStQyGAmjDLT0QorAQSaej0XGspnqgEwmXjBcAUa7eTcHHnuVIf+ksiw2sRQuhsi0i9ZIzyMYDRasot5xH+NU2v4NR9XaTVa/y0O2V/798tUnCH97s7yr493lS2juWX0b4kRiRLcFui1GDPs+3RaHzoc5SMug3wL9Fui3GLvfQp/Ab5Ef5j+/vshfe47Oi9Frf3RePEPnhacQuYCoUgQqU+SBJBs5U6Cddg6dF51NU9uBXxx29lUG/9MLFN0Y6MZ4brsC3RgT2AvoxviWbgx7IjfG06oGfRnoy0Bfxth9GafIlc8P//VytkIvxtiVP3oxnqEXg3jjA7HUJx4Itz7vbkM0EElMovn/J4LNIVMweknw3n3qVQb8U4oSPRfouXh2+wE9F89/L6DnYop1I7uUDPos0GeBPoux+yzEKXwWy8Va08IS3RZj1/zotniGbouUzVEWvJLRk2SsSp5y6RLnlOqMzqlgc0i3xcNmuP0efJVh/8TSROcFOi+e3ZZA58Xz3wvovPiWzgt1KufFbj2D/gv0X6D/YuT+i/ukvif/xZa23bI29GKM3QRAL8Yz9GJoKhTRQRjJHOOiOQy98skSmYCS6CeCzSFLSB4eOac4/irbAYPIFD0a6NF4bhsDPRoT2Avo0fiGHo2G55zEo1HUNujXQL8G+jXG7dew5gRujWbIEboyxq770ZXxDF0ZxDErWT7/mEnaUEu9FzJBpDGATGIyHG3AhIyH06v6OvIqQ/3J5IguC3RZPLvNgC6L578X0GXxLZMwyIlcFo80DLop0E2BboqRuykO797ZRb0+Jy9FJaavQNv3mRkB38L2Zcy5EEw+dbnkPmmdkuYJvItOCR6mkuGBLrsTYVbwF9+9XS4eOener+ZXVy5ffv1GSx+dElQao5hxzoNTjDCqQHKmvVdSKTYRMFI+2MnM7V2P6uVq4cJqudujWt1x20k2Rf8BVdmMkERSEjhYQ5M1gnIeWWTSCzcR2IrBUNvEAfYrwvvX/Kr5qgPyseK68RzQ47pmtjdJ0HGAjgN0HIzbcXBMr8zNSbA9cb5P+ds1uz4faU84Bp6T98Bx400y1AgQCljQLBCTvDUuJUGcmYiyp2Y470GHJnpdkVWZJXBKUaIXAb0I6EUYDxjRizAK6PbmRbApResSCS4Flc1/r6NzNlAiBSeMTcWwGM6LoI6ixRVbEf0Jrqeult1MFfQuoHcBvQvj9i4052kfzoXfL7+P8c4p8GE+Yr+CKvkVtGesERtPXPnImTHUaB8EcUkGAVOpnWBDcaisLx/m1PUDqsqMgRNJsWQJi6yKknE+eesJEYlbEFJmFUU8M0RNJUFHD7YTxMNmj3ezS3+/PP+yXeoPCNfNn9fJ5A6UEvrF0C+GfrHxgBH9YqOALmbXjNUvhtk1A2fXoM8Xfb5jR3n/Pt/GB9WXz7fEJdHdi+5edPeO3N17QLOcWzlutnz+zadf+RnO8+rPy+HLBEsQAkhgLojgTUpZ6UvDk45WEzoV3U+Hc/i2aaRxCKwqswVOJseid0JzFZmHwFx03mogyammRtMyHv1kvBPDFWU+4i07LvJuPl89PCCXPy3m11fVgf5YcRVpHgcBzpEQKATHZZDBc+GymSFD/jmVgMaADUYenlD3La+mU8XHH7co+/gTrPJvXV/kJSBuVv/XxXl1AO9FZiWUg9aOBsdIAC2s0YwIknwkIipNhQdEedcTvIWwdh1J1UH7cEGV8Bx4cE6nRF0MylBpQrSeWhWpMJYTtEi64lm3qk64d80f/ghwtb7MO0jbq9++Vh3O+xdgCf/RuSCZN5nWUyoTcB1jzAa5sjREFrEtWmd+utNf9Gp+mWZn19vVvt6vN5ef3fks3ns7f6C81goW9e6B0wjx2OZp3dkwuq3RbY1u63G7rdcdEXr0W7/d+qQ/zH+Nt09u3m0I2A+Xn2eL+WVDu0bnzGZFZzYPVFmb96k0mfLFQExghKoAnEpJ7FRsheG6a1MijvPCdgNbZVbEwNItmdnSkmS8EYoKHRgT+TDSRApptEokn+FT2TqD7Ryx80C87+j61c0yDcqaZ1mjDX2AhG4MZEF7N5C7bCW0mtFqRqt57FbzAZ2Dup4PzZM7vzQ6a1kW5yRpKWNyXiROLGGEMw1aZfs563vrmk06CZUvhsv7tG08o0djrDIzYRihlmxjbwgxNDDnTDKGNF5okfKOMYYnYGYquf9suFJAvXPQRBf35Z1qo8r2Q6+yK5YNVuJNQWfKJPbFiJwpKRtQ0RmlNHiIeb+wEH0QmQYZmwkQ7px+sggf054HyUL/vnBXNabOHiuuchahiNoFEQ3n3tKkKdUpRc24MyECYrsztncP3Xoibaheu+dgOd1OUT+w/deR3AKdhegsRGfhuJ2FTa3Jwb7C+znLrxfu7+tj4Fd3NTp/oC35A2W2WBMn0WhLjDbSCMaysLSOPBAqJ1MGPlz0vFU5cyscVabr+xNcyZQ1UgoNJATFmQ2SMiDS2gx7lW1aYFPx69EBGx88pOCl6o5X18vV/OLmab2GbT9Cw8ovrPwaN8xPXfmFtbtYuzs+r1tPtbvYoglbNI0C5X22aCq2JfFaGqelZsqDtJFKG0wIKYIkHL3MXfHeYOf1m4+/zVc/5ovHeiu3nhYEVuFiFe7zwfGwVbjSgpMhiCCdD9JTlrj3keadwESyAc/jzucxWx9DX53t9SK5JAqsDMfK8OeF5tNWhhN5ZAz7aV85xqkxTo1x6nHHqRs90FOc+idYbXY+rD7N4/LlPGZyHmF0IWtdCll7lzIBAyFo/q/Zh5pbbjzQ5BKopKZiAgzIyx6On+kDUpWZACeRIQayMZA9ctyfPpCNIT4M8U01xFeJi3m4RuzoYkYXc834Rxfz0S7mSsLQA2ISw9DHhKErCXkMOKwFQx5jD3ncuHV7Cnk84WDB6AdGPzD6Me7oh97TB/fD9kvmx80vzbPwPrnVT1erj7/Olst8ouXfe3k+D39b3v7G6MIdxQo9arMxmjSkQHiGl0leKsU50SBAJjoVP++Aw9oeuSwPwlBl+r4foZXsXBEYD5n7By8UkOA0dzxRwazRQSfFJwL0YdPNPuQVsuUVmgPp8vvZx1fnM6iwT1BJFCVMUhqpSMSxzLeiAsdNkkFTSRUHoc1UuNeAsYeHwiq4Fzc/Kp2EebigsJHPgCVF2MinJZwPb+RTffQMCzSeDcwxevas8Y/RM4yejQ6TGD3D6NmI8IjRsxFHzwrncjQ6RCdskipFGyiLnhslrRBcezUVN/JwXmROn3Ip1QvrVjK5LWtrMc/pACczBnUxqItB3ZEHdfeUtD297d+tkXHzfv525yOcwGRK8VwbvVVUagqWZMUbDZMOGh1ssmJOYTJhrgF9sA9Lr7rCpzItfbS8MIqLUdznFMUFrR0NjpEAWmQgMiJI8pGIqDQVHhCTXU/cFsLaVRJVHWIPFxRyeeTyz4HLVx+dwtquZxSdqiQagLU0zwrN3yAaUEeUFmscn0mUtpJMLuyD8GxwfIpMrnXcy7YobezmkMOIF0a8MOI17oiXoYdGvG7eWb5fLa7D6nrx9XdGF/hSpcBXRhEDLWgA413ygmifpGEyCekUmMl4YQdsWPdQRx2IospUe19iwzAYhsEwDFYxJjEMhmGwKTkNMAx2gjAYurbQtTUuSA9bpIghNwy5jW8PnHhiDz/Gx1sgnejqRVcvunrH7eqlrEWEZ3OsnV+fzTaPtw9/ccvV/9/e+TU3ijN7+BvNYMDG3nM1yUxmU2fyTjbJ7rmZqi0BcsK7NrgAZzdbNd/9SGAcbAOWkMCJ+d3M+E/cLTXSI6kldd9mw8pyGaSscoefbBBgf1hlP7l/SZjVDhoVoAAovHsojCublkjzP6n5rNHUYWu98Xzm2TZrbmQ2o7bBLWi6M9eZF5gwW2OCA4Ebic/V+bw9XS7yt/n3QAQQAUScAyIErkiLIeIuSUEIEAKEODNC2AKEqHTvHQDjgiSUfXOfrl2X/dHuW1AD1AA1zocaAkuPVtS4jJarKKExsAFsABtnhw2nI2ywl+zn6yWregR2gB1gx/mxo6uFCnv5exikoAaoAWqcHTXsrqiRxNltGX7IAuAAOACO8wLH2OgIHPcvy3kUvmSOjpDVH/gAPoCPc8OHNe0IHzwvMZABZAAZ54YMU+DMd/msxpdnVpfiZPv3kB+Hv4/WsUe/RR4/6l26bw9GgBFgxBkwoqi1HCO2xr2gc/ZldmEmT33BTQs4AA6AA+DwPfxKU86FO5rk8whmNcABcAAczgAO7VYXJTjw9UV+N5b9df5Hl3mNwQgwAow4A0ZYasezcmRs7th/Dy+fqPfXdVKOKUjCC8o5AmKAGCDGGRBD8VDWjgvz05zVkNOBLUEqA5GCGqAGqHEG1LAEHBWi1PgefvL9Ei4eIgADwAAwzgkYs7Gc7yL/LzPRnHjY4AAGgIEzwIB4XKytPflpqR9X6zx+4I/PMfm7uCaWheC7oeF6QwfrQ7z50UdukMt1kkbL4pdJGRM2MAFMvG9M2NNae5X6wZsyneG4pkHozDEMezr3TMMwfWc8mZsO8bwpz4fATGd1b7rJSMR0jQg5qR0dMjZGtmW6BrHGNqH2bO6PDNexiOt5tkkL1M70oZZu9o1K+8mgLWgL2oK2oG1+ckd4gVuT8WJ/rQu+gq/gK/gKvuazWYHLnE2zWW7TrzTdnHdKAFlAFpAFZAHZHcgKXHltguwmRwnl0YYveEPyYvZTwBawBWwBW8BWM2zTnZ0wDt3f4wVgC9gCtoAtYLsDW4F7EYKwLfbCwFqwFqwFa8Ha/a0w4UvsR5O/A7AALAALwAKwO5NZ0UAANZNZfkMvP2Cf7N7/B2fBWXAWnAVn80uOphpnb+MgPJjSfkq+BQmAC+ACuAAugCsN3Kpb5Q03GLJ75TdkBeACuAAugAvg6gDurue2KdQPgAvgArgALoCbR1sTcN1KzHD5jYZsgkvTp8hPLiKfEdjHFTKwF+wFe8FerQdudyuP+7qALWAL2AK21YfAWsI2q82PT77Py8BqF0fLb3TevF+W/QaIBWKBWCCWV3Qmidh9gJzUimPfGk3IyJ1Z1CYMru7IGE9tx6UGNXz2qgCsQNz2esBeBf/cp/F98G/z9BVkBVlB1tObDmTtk6wtQ83kZL2N6eMNLwnACrACrAArwGpr8QkwsK5ITO/3E5sCsAAsAAvAArCKM9ff1hGzD00JwAqwAqwAK8C6BWvL8DE5WO/oMnrmU1Z6EZO/aHM8RPAVfAVfT2868LVPvraMaJDz9T6NH15W9CE6FpILbAVbwdbTmw5s7ZOtLVMu5mx9YPblCZl9erGIPPhcgVfgFXgFXl/xaqvj9VfWeoLwEXAFXAFXwBVwlZm77l+X3XvfdE+rMN4fJA4Ik7iD1zHwCrwCr0PFq9g1reL7N2K9sTGbODM68p3p2J7PuCHp1HJdYhkzd+IbmfXsHi65GVLWq+DvSc04MryRZZu+6Vke68vEGc+tKfEcb2Kwwco0iug5Alcw9EXPwWCFwQqD1ZsyHQYrDFYnN6PgYCUc/SKPDJ+93rzkmeW4sfjwxYeydLnI3+bfN4xV/M+C8BEjFUYqjFQYqTBSKVpPqOHV0/ekRrTIzCMua4ZTZzY1zLE/safOfE6njjX1xva0GKda7qesZTP1YYzCGIUx6g2ZDmMUxqh3MkaN+0rdjUEKgxQGqTdkOgxSGKTexyA1MmUHqQve07yY/UFSfv0rXaxofDg4ua9/gmNpGJcwLmFcYhW1RExXiY4TQ9VzKZ04E29iOhahjmHPxubYGDvjqTWxtjHEW0ZYeJ35hzRmhuEz/hJiAVfAFXAFXIcN19FMdIs6P0C1CQUWeSSN4h+fg5h67AX7yc4XG7aaH1bZrz4m5S/BVrD1nNg6qbXXtv2/KcPNyNQiruFPjDn1Hc9y/Jk59TzXMvyROyH0DZD1GDhO21FH/ow1vLk7s+bO3Jt6I38+d8zZ3DCJM3bmstPWSrJyS16nfN4axUAr0Aq0Aq1Aq/S5yiq03lFvHSfBM8XsFYgFYoFYIPYQscJxwysRex+EjwvK7QmwAqwAK8AKsErMXRsusO5y9lPyEnpALBALxAKxQKxs5PDquWv53X4kG3AVXAVXwdUhcnUqidXbOPov9dL83T4/99sP+cUCOAFOgPOtgZNPqGzRvNebnp9Xg1nTD7ITmJfRchmF+59ekUVCt2/3AUGza8R7v8FEC7wAL940L3qZaE3qb2KJAuSkdhwxszk2HY1n1syYeTaZEWc0MV1jNrEnoxHZcHcsep1IjrtM4gOzPn8IJAgTIBgIBoKBYCC4AsG2aNgBKQRny3/qX4dgL9gL9oK9YG8VeyVP0Iux9yFew+sA7AK7wC6wW4Vd2Suhh9jdvPoaR+sVCAvCgrAgLAj7StiJwE56wxnQA+DybCbsbZKSosqvX14nt3HwzKyJOS+IDCKDyCByFZEF5rw6iRwxC6bUB5PBZDAZTAaTq5jcIhGtApPX7iLwAGQAGUAGkAHkKiCrXV2VAvIfQRK4wSJL0AokA8lAMpAMJB8iWeCIhASSb2j6FPlwIQPFb4coQDFQ/C5QLHBZQwuK4TsGjAFjwBgwbrg5p3c/rxbGcBqDxCAxSAwS15HYEYgdoUzi7+Hi5SqOlpfrOGamKDzLoDKoDCqDyqDygbOiDypjDw8sBovBYrC4T8fxbRytaHxgE+ziAcaAMWAMGDfD2O4NxtjHA46BY+AYOO7NT9GAY+zkgcVgMVgMFtfu5Fm9sBh7eeDym7AXuAwuvwcuT/rhMnbzQGPQGDQGjRtpbArQWCh6Zm3qSVAWlAVlQdkhU1YkxW/DnPdLZoE8AkX++jJaLKhXP6kFX8FX8BV8FTHcPjFOari54Zmm6Uw8Z+4a5sjxbMNyXWvszcdkNHGKFJ+GbqACo8AoMAqMDgujI7V4PAVGN0HRQFKQFCQFSYdIUrMDkmKRD6aCqWDqUJk6EkhmfJypn19Csgy8/M4vpqjAKXAKnA4Sp2rx0Dc4LXMUE1QQFUQFUYdKVEM7UcFRcBQcBUeHxVE921DFTQCQFCQFSUHSIZJUzzbULkmxygdTwVQwdahMNQSCupSvSG0gehdF2McHQAFQAHTYAJ0JJEav4Gf+35FrpUAn0Al0Ap1nik7xuScz4Dx4XMekuJX/+m5DztEHr/zpQTsiv1gAKAD6vgE6tmrtdaz9n9R+zphOrenUcujEmzmjmW1avue4pjX15zYhk8K9ZwriYGvQW/JIuXFu48ijSRLFPy5IQg8+BSPACDDiLBghcsxv16APrG4/rtZh5qL68Tkmf7M/Wy9ZFTMr3NBwDT6AD+DDWfDBFF1SCPCBbo6tcdMBEUAEEHEeiBA4RdCECPY9ZdXPlhkX3ABezH6agBAgBAhxFoQYzVQJke7PIX6PFwAEAAFAnAcgBO5uNwHiW0T828X6MQiTy7yigAPgADicBRxMgayVTXC4jYPDGDmfkm9BAkqAEqDEmVBC2QuR7uxjcG8EFhkgBAhxLoQYSR+H2CUEtyWjxGaBAf8kyAAyDJsMWW1+fPJ9XgZWuzhafqNzrCpABpDhPMhgtHRM5mS4Cv65T+P74F8KJAAJQMJZIEFtsnAb0xWJ6X20jj2Kg1AgA8hwNmQwWm5U5GT4bR0xy9CUgAggAohwFkQYtTw9nRPhji6jZz5JoBcx+YvC4wgwAAznAQaRjJT1YLhP44eXFX2IsEEJKAAK5wIFkcC29VB4YJZ9iC4jn14sIg9+BXABXDgPLogkDjjGhV9ZvYPwEVQAFUCF86CCkrfxNqaPN7wkIAKIACKcBRFMSzR0ZnZVKnu9eVmEeNrEgPo1XS7yt/n3gAQgAUicByREPY+HkPhGkpTT4TJaLoOUzyIOPgEoAAqA4hxAMRFwRub/8eAtPCbkfqciv4zQySU6OTe6AJzLRr8iHvv3BbbXYPuRJXrW93InevKXfzy6yl5dh89kEfg7X9+SmCwpq+72zzZDpP1hlY2q9y8JMx5GSIyQZzhCVjYtkeZ/UvNZo6nje5PxfObZNmtuZDajtsEtaLoz15kXvBA43HM8e9orPu7ofBOcAKwAK8CKc2LFSDGGSW2AI6ABaAAa3jMabFE0aFl2WB/izWP5yE10uU7SaFlgJkGCLIDjjMBhT2vtVeoHb8p0huOaBqEzxzDs6dwzDcP0nfFkbjrE81h76ytF1mQkYrpGhJzWyUnGxsi2TNcg1tgm1J7N/ZHhOhZxPc82i4xZtoCXU88aDuAFeAFegBfgbZmbbGvYvUjg/xeT1Wq78wzMArPALDALzOZ7FKJHAkUxm7yGUAZxQVwQF8QFccvEld/pKQxbfLB5D7wCr8Ar8Aq87vgNFDMFNaYSqzZUZgiQFqQFaUFaXtGZJGn3AXJSK459azQhI3dmUZswxrojYzy1HZca1PDZq8JxIBBzoMuNMUAX0AV0T286QLdH6Nqim2IdHgUDeAFegPf0pgN4+wSv6DaZdvAWdv2DxAFhynbIOwZ5QV6Qd6jkFfPoFt+/EeuNjdnEmdGR70zH9nzGDUmnlusSy5i5E9/IrGf34A83pKxXwd+TmnFkeCPLNn3TszzWl4kznltT4jnexGDjmGkUbprZKdw0GLQwaGHQelOmw6CFQevkZhQctISPyOyOUndRlOYvM7PNiUcxNmFswtiEsQljE8YmTQsqgQhs3S2ouK2D8BFDFoYsDFkYsjBkKVpPqOHV0/ekRrTIzCMua4ZTZzY1zLE/safOfE6njjX1xva02LoSTTHZ2dYVBi0MWhi03oDpMGhh0Hofg9ZIYNtKNfoDhicMTxie3pDpMDxheHofw5MlEBVOY9QMjFQYqTBSvSHTYaTCSPU+RqqRqPevRbQRDEsYljAsvSHTYVjCsPQ+hiVrcqJNKZd3WC9menCFFeMVxiuMV//TmKj1GDpODFvPpXTiTLyJ6ViEOoY9G5tjY+yMp9bE2obEEt1M0QJb88MqO+p20NSQagqUff+UndTaq7bhn9RwMzK1iGv4E2NOfcezHH9mTj3PtQx/5E7INs9Jr0mmtqaimRM8twn7qR/wP8LEDMgAMt40Mk4dsVQUIKe9UcDM5th0NJ5ZM2Pm2WRGnNHEdI3ZxJ6MRuS007PccmAtWAvWgrUihtsnxkkNNzc80zTZ0teZu4Y5cjzbsFzXGnvzMRlNHJlw0HquawGsACvA+mYMB7B2C1ZD9AicaIwG8BP8BD/fjOHAz2752e8O+OiDV/477M2AsefH2IZt3GPt/6T2c8Z0ak2nlkMn3swZzWzT8j3HNa2pP7cJmRTEMPtayoIWoAVo8b5p0T7NZPMNWrABbAAb3jcb5HMkSl9fBCaACWDifWPCEHVRCN4dAxPABDDhfTNB5D6pshNivyOSX0YAgwQYsgclOsdT9S/jYak/LFN3PBFkcMS4O6xxF9ffkMGxMV9560AYrUI2gbagLWj7lkwH2vZI25HAXnXbsENAK9AKtL4l0wGtPaKVFTA778h5GtNF5pdJMreLldmGdbe8ykuy2gnJNuZfs4JkfzuZ8XemffA8wiRa0B+fViv+Z2YmcbTR+PJnSJaUF7f5d+wnY27F7fS4/LPV0+pyQZIkn0u/zqFZ7RJexmq5l9FySUL/xyffvwmSJAgf2R9cLCLvr2TzVVNxlcQq1GZyXG12X5UsNp+UBTRUR0lu+/rYh713V+8FSajA45CTo2D/6RE9rIcvrsO7DKU3/sOGGyINSlGywjOo63mFZvYZjcVqIS+rfbkZb8R03cbRf9nvCpMl92m89tJ1LFIhjUoUWt2ophBM6WNMk+SCxOXXV8RLo/ilsbm1FalQC1NA5X36sgj+pX7ps8ZqtJap0F+sqhnHJfGe6GYzKnt9zSYNt1G0aOwusqIUesshX7aqvkUe43qudbtZ893l7fk/UXoVrUN/+3ljZ9GmQ2tfqSpD9jJXn30g2VfERCrUwqlXef9EYsrG3+WKN2bqF85EPq89Xhc1wQo1qpynbxRH69ij3H6MMcKdp61EhZ5/OOk72O3cedfY9+WFaW9P9cq227IX5LFFexIV3L5G0+qnr7Tz3FTRbvQp8Lx66Ngpzx9ksaZ3lA2Iz2wp/Cl+fN75pBHlOsQr1E6gWe2qLxbu4jXUpUKhloezlyNFuKNz8QpqkK59vtGgfefd9ip3i/lGCx3t6+mIWvkhJmEyj+JlUYyHKJNa+ryprnr1KNT3cIUnWo7XD4Serm5NWlcuB1EIuIPh8MdSKxdBmQrPrhLquzrz+VP27//Sl+2LzTI3Enx0ehUp1Lhy6t5YkM90TtaL9KA8jfXVqUahtofOimPF2Nsbk6t1F+p0j6a1xSHsD7/shg2RH03lpGv1O4ppZygMUkm/o5Rk3XM8Ac2b0zICXi5tKhRqWbnMEy/C0QeoSYFC25SDPS/ADU2fomZ3eHuhfRCk5Jy7Zy2En0yni1Wb+bicdK3e8kPt2598ix6/r2ixfl9EId2+lfSWt1XS8ShYXYjrNPPlf9lshgrVuRN1Hc/xqouzfaVvjieuSKHGIgA8UpCkLLOhzrpVKfi/RGhSXZT7IHwsBoF7SmLvSaihd6VRwR8rMLxLTPFaiVMgcqVHcVcds+IjH9teY9yJNVR12d2ulmXr015mt3PuKp3J1zhaN551UZWse3fsaDxF+d0xAZEKxG/qqFe7gduzjfoo3P/0iiz4gZDN20bm61emQP2mliNYmGBBH/jamy3BScCHIwEjdKtXwR5NjU+sXNkmIfWvQzFDdKNQoS8cntySLdBDvBbsCtp1aT3X11SWzavjaFYRq3s3T0jtw8uKzazWS/ndPEnxCs+qaYlUq15s9FEV3b5WVhMTN8fB8ndNFZCRovXc6KuWncMS2abDzieS50Yl5HbUX3b1fg5iyr14bIEtXC0t4hVqV7nzVamej6q5GyGKxaunRb7uPdNK/XfUW8dJ8EzbPEa9ejryK+6WI18pc6uLP00N0hXq1jQh2tNefie26aIuvBfG7LwT9CVpEa99Z3Sxfgzy15uX30jCxp/H7BhzkDKzHn7SYme0nRrtrfSgGFwhv/pD8/Hq9W2LViojXPsuWpNy/vLXdLnI3+bft9hFk1ehUMvqecaxItwlqXAlNWnQfWJqo/bLMytvQYfv4beI+K2go01HR30xL8P2+t4FnbMvL2NK0vwmFR+7WvdFMeH91Ox7+JWmXC8/jZYZObtxqKdmNcI7bZsl5bzl5GLYX+d/dJlfgFRsm4I6FHYUqpeTeRm+h4uXzU7GP2y6yH+UFatxT6GdQIUaNHEs/y/T8TlIVvz6aPPQ1kaaQtmrdy3K2sQ2cqTkKJS3euZd1iPIZVlJuj0Br0x8zUhffn38dIOaXN3na47pffg7ePwSPgdxFC6PYUmPgs5qWHHDvVjDvpSuubevoagC3TuhEnf4pXdCZWTrXmM16S6+e/1I4JSbVjW6T57IFUPh5ElrRd0/3809uu2xdMmjp1rV6N4PF41tJr8fLi5Z96m4FvHa5E/FtVKi8PTEOLh3QFv+/uVxiZ31t+1yoP4THf1NTk1nPBUohuipNr2KdHt5tmoL18ttHHk0SaJdN9r2U3kvj7yGzohzWIKvQfq0dvnniXg19SnprLceFuLgEx29VU6Nwm5w8yS6eNG4FSwqQmHF2mys4sXx5Z6koM7GrS1xN3uUIqFPWkrsbM3N14qbswo8zhIP6BWmV3G0/EbnzSOwktzO1mtlveWoaGJbfsqyde/THtUtOg3UIF23Z7NS+1Xwz30a3wf/NjvZ2glUqEHzKqGs8DamjzfcH9lYgVbyeqEA07cicbFJf2RjQE1uL8/jt3WU0iVNiabnUZKn+wRhpb47uoyeucHoRUz+oon8CUJBsbpPdleqZX2Rn+p7iH6PmwPstBWpUIvKk0mVKvlZ4ofoMvJpFl2xsSIKUnXfg2jQ+islfhA2h9tpLVP3abQ9nevQy49Y5iPX5q3YiK9Ffmerzib9oiO/Jg0dz2yKEnyOyd+FMyq7o3VDw7XyzOaI9M72R+q1F462ozvvehR0PHMoCsC3L77SdLMZ3jxUKcntiShfiwCbbNle2mDTRpRa+b3VL93pDrwcRwZmPfJ1n4w8rr/oD8eqp0O87tsKNer5MZTt/vzRIy7KonWf4KlRfRsH4cHtw0/JtyBpcYKnjQ6FVYkArG9IEH75h1k0OXYsQ15YtzN4rkzi7EJrke1rYe6bLP/veDShIz9U8Mzuz07KggX8hWK/V3ju+7jbT3a5917sXlR7oRpX1EeUCk6flcQq1Gb/2PPxJKSvAdukYqbKCVbYkdnn83HFezF22B/kX4gcS+lAm8bTCwKleRUmdXpBUrLGMV1Kc8sT4611aDxXLVAGtnROSTHBkDpXLS9c4x6prHLBHX6dajR6Wo4X4/MLkx54eWwvgYepSYPCE5UvQWPqaqn7+Mq6NK6ajpdF9KEqi9Z4WkNOdcvzYe2V9DqWlAvRLl5zax29jiW3cbSicfrSyViyL7zXsWRXeWdjSb0ahdru+8COF+OVeMXLKBY4napbU/s6j4xjq7pSUQ6CX3Cxxai+/+V1chsHz1leJoE4MP2WQ8Vex1aOKuWMUqaK50sRsli/JVGx2b67Q2NJ1+4i8AQN1mMxVKwlAQepYv4RJIEbLDKVQvbqtSCntJhAAW8iP5gHzVjvuSDtLTaTmOXvFymfPqnRvh/9CvaRmFWKl0+G7n2VQMFGCsNPbQnFad6LehUmSXhkxcrHr3bzo7aX6zhmxigIKwLyvsui0Kq0F1Vy1OupAKdhU7FqUqR3TyVQ6X37R741FVFugt5bIU7T3xrKKMHxfgqg0pYkfGmiJVRgef+lUWhdHRRWlud9FUHjqd6GIub/CcTOaC1TwX8moXM3Gt2n5CX02sdgVNLTvr4H2QuEy5EfyJUPXtiVxlPYoEh9me/N+8JPvyuNCjaQGMJqSnT/kqR0KdcNOlWrcFpOyJH7tNq8bTwrJytK40m5ZlX3eSy05qPQbUUqtEQhv8pBAMLsRvrT6j5duy6N994ej3PYpdaue+WxUvHU5RHrQeLG6FKtwkxMiJrHisVeFiejI3GTdK/71D2Gvfw9DNKee0y1VgVbCE2Vj5YqiTMVNBE3R7eKu/ZxHivY/ctyHoUvWZ8OWdXFO04f6hXai9DwfKx4/KC4eEvpSmXXM+ByyNHNjv738PKJen9dJ2XZJLyg/JaG+gxYXmM/FN0JCfxpzmaiXDub+UifI+1Sq4IthKZ9leGRP/l+SS6/Myxkhm4UdsyF7Y2RXMTnplhQx90dnansele6oUy3G+kP0Y2/fVN8K3Fjp+eCdLwrLVtO/qb0R8q70sr6Oz5P2XCHOJN8QxqTVenToeBHFJkO1t/dzIuQbcUlF5H/wiMvNLoTu1Cn8JT3e+sDXa4WJKXbC2I/Lp9I+nWV/rgJkiQPM59FlkiELsXpka/xVHe9/jtK/CUtvr8KFkf8RcqiNd5DqFddfMOWKfHaS9cxFXtumjS0rWOVay+7+3mQYPw6pcvbKMouZI94baaVAbguo3AePK43+XxfbxFch89kEfg7X7MZCyslm7UJXWLoRp+C4aovzeaG4y7XRenld5fnZ8s+2Bqw+hb0we9f65QL+U+UXkXr0Bcymj4dKoaqzAuTa75/IjHf9V6uYspW+X7hDeJRJHbNhfZWXaDcjGVHP/prNegqL+nvFmjnHUx3pAfXm26r/4I8woyFGXVkcs8seQ7puWsjnx3Pb35udugsOzW63U/pBLyw2U/9aR9h1J9as0sO9fY4mpDmNJ5oSENtSHozpaIdDbUdacz4mc/pzzCsooZ8iphB/dSZ4xDmrHdINJnzMKEiLFm/XmqyZPFdZQpHGPVni1xJrTy8cjFdG4VhGtHeOd/cfw4PDaGH1O8JHZitIusV7Fe/h7s3I6zOhmJle7hnHeEci7qBdguNaUDOu4egpWhNqgLgDLUZacr0gllNC2vW5pWBNX/qy2IzzpybihnsJaLLS0pWOCWrL21960zVMkoUTjm3zGTfOsdwrUQMNVjTyGJMY2InDAz1B0p3LXqQQgqmE/W71OSwggF/CqfPGibs0Dw05aQathmH2n06SwAGcv/Ul2BsmG0T7UdrMjcLPXK4PelMLs/oS/qHjjDEjtBRdsVhGnPonUh/8sph23Oo/Uhjokw0oIE2IP05SYdpyqF3Ia3JUIdtyqF2oY6yzqIxDbUxaU/qC990ZUAW2aQ1w2yRaDkdpoxBz6yM0iiYgGXYhhsqkNRy36DH/ewh4PkwWyYalv6I32hJA21JXcZUR6MaaKPSGqoerWigrUhXQoBhG3KoHUh/7oVh2nHo/acIIvQxpd7TR/vDKovnlifI/Rhn3Pmw9D+kbGa0vaLJKpAtgqdZs9EbBre2xehUo3CTU3Nw0ap7nLpUKNRSb+RLkawuLTUodHvkDH61BXIGl6yBnMHIGYycwdK9BjmDkTNYNpNjedTfy9HKgwvv7HSKhsHQpkOhnk2T1b2Izxd0zr68ZFPtNHcU8fixjRVUF95Pzb6HX/Mtszua5EYuB7JSrFmN8E7bpnCUboW2KahDgUTI24283WVbCO2Cn3Pebrs659hmAZr9J3S1T06OzoOiai4XHGZA2hi4U7u73abmPEM7Gmo7QtoYse0L2y62L6wP8UblR75hcblO0mhZ6E3K+xijUXkjw87CMOuL6Fw19dcgXWFxozUGcVX19CgYdqiGoymQds3I1/L8jFLeh5LGqijJVWh3moIW1zY7LfJ7q19tGGFN9auRr1C/sw5Nr5JcubantZapUI8zHNj1RmOVc8i10aGxnqqHnUXq2VpHx/UUjMqlVE8hHQrn0To8cly1ZutCXU8j4u4EXWhSpke+yrIMiV+wgBdrKUj8Aj9QB7cNWq6h4OZH4hckfmkjWWE2hMQvu4UoPrhE4pe31p2HOsVQdATlWytn4H1GApwuBkjcZMcyoL+WJOg+Q1D7wY52ZzNWIbIDIKv/KqxtNp8lyRLd75wksUoHSWbZXFBkrz2T8+OT71+zj8P0Ko6W3+i8eT2kJFfheKzIFmCu9yr45z6N74N/m8/JthOoUAORaW2u8Damjzck9Z4aK9BKXsenQrb6ViSm90L3LdTk9vI8fltHKWUdnGh6HiV5Cs9DxLGf67ujy+iZG4xexOQv2nxIR0Ws7vlApVrWFx9eVvQhOrLz1FqkQi1E/Lq5ygf6T8rvDvg0i8nTWBEFqbrPpTRo/ZVmd0Pkz6WIyFTxq7RvWtb5b5BiljnIWSZ2TbBrsiU9dk3eeXceKsaLiNuHi+Ui1NgfJA54ntud1bJZWi1nr8fHohTsvRfzR7UXivON8ESDIPBES3Fw1MRB7i1hC6kyBe0SBfOFzjDCyp31cu687wLhhjzWv1j/Yv2L9S+6M2avOEreQRTqScUs2n29w1C36W4KbLqXrkKUX+/lG5LfIj0iFxfn67eGFB8YOg3uBnWIIPPDKhtFPibl8KA7EWRKCJrUb1ZWJnT8HMSUZ1cNaHKQzFFudSspXjeQKtXz+CHXaZ5dQrx6WuQrzGKargDs6r+j3jpOgmfa5jHq1aPwPMXLcR+EjwuedYaKP00N0jU+S+FMq5+Sl9Br/yyV9Cg8yyan5561y+/ELtyrC1dBsjk7QPJhVpLyrlLGZas6dtomLXMc/ZfpyN81VV1GisIgLldYDNV7Qd+27SIvc36eiOn2A/7ntZuPRuaCrHZp5qbfk/SDB02Nwv1Pr8giodu3jbjQr0zBa9HU6AQLw5jNz4pxHwrJY/4cN0K3ehXs0YQ5sXJl4KP+dShmiG4UavTjyBfoIV4LdgXtunSf5q0ty+bV1zhaN4ZcUhLbvjYjQyjtQ00xuFj2NklJmO5/eZ3cxsEza3BCT7jfcqjYSyhxSMtyRmyEYj1U0GL9lkTFZhITX9mSrt1F4AkarMdiqFhrf2mrq5h/BEngBotMpZC9ei1Ie4vNJLz8+0XJr/Spsasf/Qr2kTiAJV4+GVb1VQIFGynAtLaE4mzqRb0Kk4RS78mU73u4eOHXDS/XccyMUfBCBEt9l0WhVWkvqiTDeyrAadjECLCi8cESXpbePZVApfftu1M0FVFuutlbIU7T3xrKKMHxfgqg0paEEkLKlVCB5f2XRqF1dVBYWZ73VQQF/0jlQbFjjgyx09qqohW87p05/OCgr9u4yctcn4YlezOMazQVx0ulyiB1cFVSssaNSAHNG5fC8WppEK7gHFdVLtYwtapReI7yxyw/vzDpgZevMQQepiYNGg9ZHy9BWXXLQ9btlWgcwOUKITWAy4rulTXFhKkT1uwL75U1u8o7Y029GoXWeSZJeOym3f2Nzvw/sWSybcSpnCTFpV5ci8Cl3m1/0DQ9H2orGHbv17oUGrYph9qFOlpzDtOYQ+9E+pf0w7bnUPtRJ26TYZpy6F1Io19q2IYcagfS6gJEExpoE+rC14rGNNDGhDRiB/foRx+8ckOruLu5cwTAzN7YlVdndhv0zrtGR7q8MI0bp7vxGIrIaAwhHk2SKP5xQRJ68KnUxmlLDQp11JcAW/jmuJx0hbqJpGAQTtlcVT09ChRqeNaBZc49xmT1gbka9d8i4uchF/lxyZSVQv4snoRohWemMe2k8JGv1jp663vvLEKoYD6hQj+/xc3zsOXNpzkxjpLcjuuDTF7SAnt5IsiEJSxP4XkgExYyYSET1tlnIBxGfPoDZ2BNEb6RJOW6+a2QIOVGPvhE6uClihoFd1UrNwtut/zU6wM57wUrWopWj9IwXetoRgj0iwQU0pI13o2S0owEFG0kAo7Yb5bFmEa/OQYGpPTQfsCvvT8N6b/PFFvoFsijh4bU0eFFNX8lBq3s8Br/5ce7L58+33xpzFxt7nt28v/yvCRNVT7yw/Ydwtr3SpYFXxGeQqQx6oHY7xUarJjJwLNhdr2feSnzA6N/PpHkqWiUrmWO3Znrjsee63iGPzZn47k5sYk3MmzPc7K/Yz8N+PHVkCz+9Ij3FISPfyYvSUqXfz7TOMm0BL+Y//Pz/wEWRXNU \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/DocumentedEntityWrapper.md b/docs/tech/1.configuration/classes/DocumentedEntityWrapper.md index 859e4c92..674254c8 100644 --- a/docs/tech/1.configuration/classes/DocumentedEntityWrapper.md +++ b/docs/tech/1.configuration/classes/DocumentedEntityWrapper.md @@ -48,12 +48,15 @@ final class DocumentedEntityWrapper
  • getFileName - The name of the file to be generated
  • -
  • - getInitiatorFilePath -
  • getKey - Get document key
  • +
  • + getParentDocFilePath +
  • +
  • + setParentDocFilePath +
  • @@ -73,7 +76,7 @@ final class DocumentedEntityWrapper ```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface $documentTransformableEntity, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, string $initiatorFilePath); +public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface $documentTransformableEntity, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, string $parentDocFilePath); ``` @@ -100,7 +103,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentTransfor - - $initiatorFilePath + $parentDocFilePath string The file in which the documentation of the entity was requested @@ -219,16 +222,16 @@ public function getFileName(): string;
    ```php -public function getInitiatorFilePath(): string; +public function getKey(): string; ``` - +
    Get document key
    Parameters: not specified @@ -240,22 +243,60 @@ public function getInitiatorFilePath(): string;
    ```php -public function getKey(): string; +public function getParentDocFilePath(): string; ``` -
    Get document key
    + Parameters: not specified Return value: string +
    +
    +
    + + + +```php +public function setParentDocFilePath(string $parentDocFilePath): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parentDocFilePathstring-
    + +Return value: void + +

    diff --git a/docs/tech/1.configuration/classes/DocumentedEntityWrappersCollection.md b/docs/tech/1.configuration/classes/DocumentedEntityWrappersCollection.md index 0edbc843..fd7a969f 100644 --- a/docs/tech/1.configuration/classes/DocumentedEntityWrappersCollection.md +++ b/docs/tech/1.configuration/classes/DocumentedEntityWrappersCollection.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Configuration files / DocumentedEntityWrappersCollection

    - DocumentedEntityWrappersCollection class: + DocumentedEntityWrappersCollection class:

    @@ -60,11 +60,11 @@ final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \T ```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache); +public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher); ``` @@ -89,6 +89,11 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $localObjectCache \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache - + + + $pluginEventDispatcher + \BumbleDocGen\Core\Plugin\PluginEventDispatcher + - @@ -102,7 +107,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext ```php @@ -129,7 +134,7 @@ public function count(): int; ```php @@ -167,7 +172,7 @@ public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\En ```php @@ -188,7 +193,7 @@ public function getDocumentedEntitiesRelations(): array; ```php diff --git a/docs/tech/1.configuration/classes/GeneratePageBreadcrumbs.md b/docs/tech/1.configuration/classes/GeneratePageBreadcrumbs.md index d293832d..2fab1179 100644 --- a/docs/tech/1.configuration/classes/GeneratePageBreadcrumbs.md +++ b/docs/tech/1.configuration/classes/GeneratePageBreadcrumbs.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Configuration files / GeneratePageBreadcrumbs

    - GeneratePageBreadcrumbs class: + GeneratePageBreadcrumbs class:

    @@ -67,7 +67,7 @@ final class GeneratePageBreadcrumbs implements \BumbleDocGen\Core\Renderer\Twig\ ```php @@ -114,7 +114,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsH ```php @@ -160,14 +160,20 @@ public function __invoke(string $currentPageTitle, string $templatePath, bool $s Throws:

    @@ -141,7 +134,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B ```php diff --git a/docs/tech/1.configuration/readme.md b/docs/tech/1.configuration/readme.md index 69fd79e4..05051a2c 100644 --- a/docs/tech/1.configuration/readme.md +++ b/docs/tech/1.configuration/readme.md @@ -222,4 +222,4 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Oct 5 17:42:06 2023 +0300
    Page content update date: Fri Oct 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Oct 5 17:42:06 2023 +0300
    Page content update date: Sun Oct 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/classes/ClassEntity.md b/docs/tech/2.parser/classes/ClassEntity.md index ab6c5060..a1df0337 100644 --- a/docs/tech/2.parser/classes/ClassEntity.md +++ b/docs/tech/2.parser/classes/ClassEntity.md @@ -228,6 +228,9 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
  • implementsInterface
  • +
  • + isAbstract +
  • isClassLoad
  • @@ -368,7 +371,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -636,7 +639,7 @@ public function getCasesNames(): array; ```php @@ -780,7 +783,7 @@ public function getConstantEntityCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1042,7 +1045,7 @@ public function getDocNote(): string; ```php @@ -2207,7 +2210,7 @@ public function hasAnnotationKey(string $annotationKey): bool; ```php @@ -2308,7 +2311,7 @@ public function hasExamples(): bool; ```php @@ -2356,7 +2359,7 @@ public function hasMethod(string $method): bool; ```php @@ -2404,7 +2407,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2506,7 +2509,7 @@ public function hasTraits(): bool; ```php @@ -2537,6 +2540,37 @@ public function implementsInterface(string $interfaceName): bool; Return value: bool +Throws: + + + +
    +
    + + + +```php +public function isAbstract(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + Throws:

    @@ -626,7 +622,7 @@ public function getEntityCollectionName(): string; ```php @@ -759,10 +755,41 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit
    + + +```php +public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + + +Throws: + + +
    +
    +
    + ```php @@ -793,7 +820,7 @@ public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -802,6 +829,37 @@ public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\En +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +``` + + + Parameters: not specified Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection @@ -908,7 +966,7 @@ public function has(string $objectName): bool; ```php diff --git a/docs/tech/2.parser/classes/LocatedInCondition.md b/docs/tech/2.parser/classes/LocatedInCondition.md index 282b2a89..4a32811d 100644 --- a/docs/tech/2.parser/classes/LocatedInCondition.md +++ b/docs/tech/2.parser/classes/LocatedInCondition.md @@ -132,7 +132,7 @@ public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterf Throws: diff --git a/docs/tech/2.parser/classes/LocatedNotInCondition.md b/docs/tech/2.parser/classes/LocatedNotInCondition.md new file mode 100644 index 00000000..0ebcf0d0 --- /dev/null +++ b/docs/tech/2.parser/classes/LocatedNotInCondition.md @@ -0,0 +1,142 @@ + + BumbleDocGen / Technical description of the project / Parser / Entity filter conditions / LocatedNotInCondition
    + +

    + LocatedNotInCondition class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Parser\FilterCondition\CommonFilterCondition; + +final class LocatedNotInCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface +``` + +
    Checking the existence of an entity not in the specified directories
    + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + canAddToCollection +
    2. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, array $directories = [ ]); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
    $directoriesarray-
    + + + +
    +
    +
    + + + +```php +public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    + +Return value: bool + + +Throws: + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/2.parser/entity.md b/docs/tech/2.parser/entity.md index 75efade4..255e91f3 100644 --- a/docs/tech/2.parser/entity.md +++ b/docs/tech/2.parser/entity.md @@ -123,4 +123,4 @@ These classes are a convenient wrapper for accessing data in templates:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Sun Oct 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/entityFilterCondition.md b/docs/tech/2.parser/entityFilterCondition.md index 2273be88..4620de81 100644 --- a/docs/tech/2.parser/entityFilterCondition.md +++ b/docs/tech/2.parser/entityFilterCondition.md @@ -68,7 +68,7 @@ language_handlers: Common filtering conditions that are available for any entity: -
    \ No newline at end of file diff --git a/docs/tech/2.parser/readme.md b/docs/tech/2.parser/readme.md index a8eb5dd3..fc6de6a4 100644 --- a/docs/tech/2.parser/readme.md +++ b/docs/tech/2.parser/readme.md @@ -41,4 +41,4 @@ In this section, we show how the parser works and what components it consists of

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Sun Oct 15 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/sourceLocator.md b/docs/tech/2.parser/sourceLocator.md index 5c874b72..f180ba8f 100644 --- a/docs/tech/2.parser/sourceLocator.md +++ b/docs/tech/2.parser/sourceLocator.md @@ -30,4 +30,4 @@ You can create your own source locators or use any existing ones. All source loc

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:09:56 2023 +0300
    Page content update date: Fri Oct 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:09:56 2023 +0300
    Page content update date: Sun Oct 15 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templates.md b/docs/tech/3.renderer/01_templates.md similarity index 93% rename from docs/tech/3.renderer/templates.md rename to docs/tech/3.renderer/01_templates.md index 18adcb46..ac0359e9 100644 --- a/docs/tech/3.renderer/templates.md +++ b/docs/tech/3.renderer/01_templates.md @@ -101,4 +101,4 @@ Result after starting the documentation generation process:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Sun Oct 15 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/breadcrumbs.md b/docs/tech/3.renderer/02_breadcrumbs.md similarity index 89% rename from docs/tech/3.renderer/breadcrumbs.md rename to docs/tech/3.renderer/02_breadcrumbs.md index d7aacecf..d8b652eb 100644 --- a/docs/tech/3.renderer/breadcrumbs.md +++ b/docs/tech/3.renderer/02_breadcrumbs.md @@ -51,4 +51,4 @@ Here is an example of the result of the `generatePageBreadcrumbs` function:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Sun Oct 15 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/03_documentStructure.md b/docs/tech/3.renderer/03_documentStructure.md new file mode 100644 index 00000000..b05480f0 --- /dev/null +++ b/docs/tech/3.renderer/03_documentStructure.md @@ -0,0 +1,22 @@ + BumbleDocGen / Technical description of the project / Renderer / Document structure of generated entities
    + +

    Document structure of generated entities

    + +*By default, the documentation generator offers two options for organizing the structure of generated entity documents:* + +1) The standard structure is an entity document next to a parent document. If the document template contained +a link to the entity documentation, during the documentation generation process we created a classes directory +in the same directory where the parent document was located, and inside this classes directory we created an entity document. + +2) All entity documents are located in a separate directory with the structure of the entire documented project. **At the moment this is only available for PHP projects** + +To enable the second option, you need to connect the built-in plugin: +```yaml +plugins: + - class: \BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\EntityDocUnifiedPlace\EntityDocUnifiedPlacePlugin +``` + + +
    +
    +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Sun Oct 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/3.renderer/twigCustomFilters.md b/docs/tech/3.renderer/04_twigCustomFilters.md similarity index 97% rename from docs/tech/3.renderer/twigCustomFilters.md rename to docs/tech/3.renderer/04_twigCustomFilters.md index 7543e0ea..7f501e21 100644 --- a/docs/tech/3.renderer/twigCustomFilters.md +++ b/docs/tech/3.renderer/04_twigCustomFilters.md @@ -263,4 +263,4 @@ Here is a list of filters available by default:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Sun Oct 15 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/twigCustomFunctions.md b/docs/tech/3.renderer/05_twigCustomFunctions.md similarity index 97% rename from docs/tech/3.renderer/twigCustomFunctions.md rename to docs/tech/3.renderer/05_twigCustomFunctions.md index e2e992f1..ff557bbf 100644 --- a/docs/tech/3.renderer/twigCustomFunctions.md +++ b/docs/tech/3.renderer/05_twigCustomFunctions.md @@ -177,7 +177,7 @@ Here is a list of functions available by default: - getDocumentationPageUrl
    + getDocumentationPageUrl
    Creates an entity link by object @@ -193,7 +193,7 @@ Here is a list of functions available by default: - getDocumentedEntityUrl
    + getDocumentedEntityUrl
    Get the URL of a documented entity by its name. If the entity is found, next to the file where this method was called, the `EntityDocRendererInterface::getDocFileExtension()` directory will be created, in which the documented entity file will be created
    :warning: This function initiates the creation of documents for the displayed entities
    @@ -344,7 +344,7 @@ Here is a list of functions available by default: $classEntityCollections - ClassEntityCollection + ClassEntityCollection The collection of entities for which the class map will be generated @@ -385,4 +385,4 @@ Here is a list of functions available by default:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Sun Oct 15 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/classes/AddIndentFromLeft.md b/docs/tech/3.renderer/classes/AddIndentFromLeft.md index 3779d94b..423b69fa 100644 --- a/docs/tech/3.renderer/classes/AddIndentFromLeft.md +++ b/docs/tech/3.renderer/classes/AddIndentFromLeft.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template filters / AddIndentFromLeft
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / AddIndentFromLeft

    AddIndentFromLeft class: diff --git a/docs/tech/3.renderer/classes/BreadcrumbsHelper.md b/docs/tech/3.renderer/classes/BreadcrumbsHelper.md index ee9de81d..82c460dc 100644 --- a/docs/tech/3.renderer/classes/BreadcrumbsHelper.md +++ b/docs/tech/3.renderer/classes/BreadcrumbsHelper.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Renderer / Documentation structure and breadcrumbs / BreadcrumbsHelper
    + BumbleDocGen / Technical description of the project / Renderer / Documentation structure and breadcrumbs / BreadcrumbsHelper

    - BreadcrumbsHelper class: + BreadcrumbsHelper class:

    @@ -67,7 +67,7 @@ final class BreadcrumbsHelper @@ -82,11 +82,11 @@ final class BreadcrumbsHelper ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsTwigEnvironment $breadcrumbsTwig, string $prevPageNameTemplate = \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper::DEFAULT_PREV_PAGE_NAME_TEMPLATE); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsTwigEnvironment $breadcrumbsTwig, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, string $prevPageNameTemplate = \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper::DEFAULT_PREV_PAGE_NAME_TEMPLATE); ``` @@ -116,6 +116,11 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $breadcrumbsTwig \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsTwigEnvironment - + + + $pluginEventDispatcher + \BumbleDocGen\Core\Plugin\PluginEventDispatcher + - $prevPageNameTemplate @@ -134,7 +139,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -168,7 +173,7 @@ public function getAllPageLinks(): array; ```php @@ -224,11 +229,11 @@ public function getBreadcrumbs(string $filePatch, bool $fromCurrent = true): arr ```php -public function getBreadcrumbsForTemplates(string $templateFilePatch, bool $fromCurrent = true): array; +public function getBreadcrumbsForTemplates(string $filePatch, bool $fromCurrent = true): array; ``` @@ -245,7 +250,7 @@ public function getBreadcrumbsForTemplates(string $templateFilePatch, bool $from - $templateFilePatch + $filePatch string - @@ -280,7 +285,7 @@ public function getBreadcrumbsForTemplates(string $templateFilePatch, bool $from ```php @@ -331,7 +336,7 @@ public function getPageDataByKey(string $key): array|null; ```php @@ -382,7 +387,7 @@ public function getPageDocFileByKey(string $key): string|null; ```php @@ -433,7 +438,7 @@ public function getPageLinkByKey(string $key): string|null; ```php @@ -478,7 +483,7 @@ public function getTemplateLinkKey(string $templateName): string|null; ```php @@ -534,7 +539,7 @@ $breadcrumbsHelper->getTemplateTitle() == 'Some template title'; // is true ```php diff --git a/docs/tech/3.renderer/classes/ClassEntityCollection.md b/docs/tech/3.renderer/classes/ClassEntityCollection.md index 250fd73f..be77ac0b 100644 --- a/docs/tech/3.renderer/classes/ClassEntityCollection.md +++ b/docs/tech/3.renderer/classes/ClassEntityCollection.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / ClassEntityCollection
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables / ClassEntityCollection

    ClassEntityCollection class: @@ -72,12 +72,18 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
  • getLoadedOrCreateNew
  • +
  • + getOnlyAbstractClasses +
  • getOnlyInstantiable
  • getOnlyInterfaces
  • +
  • + getOnlyTraits +
  • getOperationsLogCollection
  • @@ -333,7 +339,7 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan ```php @@ -364,16 +370,6 @@ public function filterByNameRegularExpression(string $regexPattern): \BumbleDocG Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection -Throws: - -
    @@ -626,7 +622,7 @@ public function getEntityCollectionName(): string; ```php @@ -753,8 +749,39 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit See: +
    +
    +
    + + + +```php +public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + + +Throws: + +

    @@ -762,7 +789,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit ```php @@ -793,7 +820,7 @@ public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -802,6 +829,37 @@ public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\En +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +``` + + + Parameters: not specified Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection @@ -908,7 +966,7 @@ public function has(string $objectName): bool; ```php diff --git a/docs/tech/3.renderer/classes/ClassEntityCollection_2.md b/docs/tech/3.renderer/classes/ClassEntityCollection_2.md index 83388311..c6d11d3c 100644 --- a/docs/tech/3.renderer/classes/ClassEntityCollection_2.md +++ b/docs/tech/3.renderer/classes/ClassEntityCollection_2.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables / ClassEntityCollection
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / ClassEntityCollection

    ClassEntityCollection class: @@ -72,12 +72,18 @@ final class ClassEntityCollection extends \BumbleDocGen\Core\Parser\Entity\Logga
  • getLoadedOrCreateNew
  • +
  • + getOnlyAbstractClasses +
  • getOnlyInstantiable
  • getOnlyInterfaces
  • +
  • + getOnlyTraits +
  • getOperationsLogCollection
  • @@ -333,7 +339,7 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan ```php @@ -364,16 +370,6 @@ public function filterByNameRegularExpression(string $regexPattern): \BumbleDocG Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection -Throws: - -


    @@ -626,7 +622,7 @@ public function getEntityCollectionName(): string; ```php @@ -753,8 +749,39 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit See: +
    +
    +
    + + + +```php +public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + + +Throws: + +

    @@ -762,7 +789,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit ```php @@ -793,7 +820,7 @@ public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -802,6 +829,37 @@ public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\En +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +``` + + + Parameters: not specified Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection @@ -908,7 +966,7 @@ public function has(string $objectName): bool; ```php diff --git a/docs/tech/3.renderer/classes/CustomFunctionInterface.md b/docs/tech/3.renderer/classes/CustomFunctionInterface.md index 6d49d821..f2f47483 100644 --- a/docs/tech/3.renderer/classes/CustomFunctionInterface.md +++ b/docs/tech/3.renderer/classes/CustomFunctionInterface.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / CustomFunctionInterface
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / CustomFunctionInterface

    CustomFunctionInterface class: diff --git a/docs/tech/3.renderer/classes/DocumentedEntityWrapper.md b/docs/tech/3.renderer/classes/DocumentedEntityWrapper.md index a3e2f5e3..14cf61fa 100644 --- a/docs/tech/3.renderer/classes/DocumentedEntityWrapper.md +++ b/docs/tech/3.renderer/classes/DocumentedEntityWrapper.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / DocumentedEntityWrapper
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / DocumentedEntityWrapper

    DocumentedEntityWrapper class: @@ -48,12 +48,15 @@ final class DocumentedEntityWrapper
  • getFileName - The name of the file to be generated
  • -
  • - getInitiatorFilePath -
  • getKey - Get document key
  • +
  • + getParentDocFilePath +
  • +
  • + setParentDocFilePath +
  • @@ -73,7 +76,7 @@ final class DocumentedEntityWrapper ```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface $documentTransformableEntity, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, string $initiatorFilePath); +public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface $documentTransformableEntity, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, string $parentDocFilePath); ``` @@ -100,7 +103,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentTransfor - - $initiatorFilePath + $parentDocFilePath string The file in which the documentation of the entity was requested @@ -219,16 +222,16 @@ public function getFileName(): string;
    ```php -public function getInitiatorFilePath(): string; +public function getKey(): string; ``` - +
    Get document key
    Parameters: not specified @@ -240,22 +243,60 @@ public function getInitiatorFilePath(): string;
    ```php -public function getKey(): string; +public function getParentDocFilePath(): string; ``` -
    Get document key
    + Parameters: not specified Return value: string +
    +
    +
    + + + +```php +public function setParentDocFilePath(string $parentDocFilePath): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parentDocFilePathstring-
    + +Return value: void + +

    diff --git a/docs/tech/3.renderer/classes/DocumentedEntityWrapper_2.md b/docs/tech/3.renderer/classes/DocumentedEntityWrapper_2.md index 7c9c1fcb..c6dfad98 100644 --- a/docs/tech/3.renderer/classes/DocumentedEntityWrapper_2.md +++ b/docs/tech/3.renderer/classes/DocumentedEntityWrapper_2.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / DocumentedEntityWrapper
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / DocumentedEntityWrapper

    DocumentedEntityWrapper class: @@ -48,12 +48,15 @@ final class DocumentedEntityWrapper
  • getFileName - The name of the file to be generated
  • -
  • - getInitiatorFilePath -
  • getKey - Get document key
  • +
  • + getParentDocFilePath +
  • +
  • + setParentDocFilePath +
  • @@ -73,7 +76,7 @@ final class DocumentedEntityWrapper ```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface $documentTransformableEntity, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, string $initiatorFilePath); +public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface $documentTransformableEntity, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, string $parentDocFilePath); ``` @@ -100,7 +103,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentTransfor - - $initiatorFilePath + $parentDocFilePath string The file in which the documentation of the entity was requested @@ -219,16 +222,16 @@ public function getFileName(): string;
    ```php -public function getInitiatorFilePath(): string; +public function getKey(): string; ``` - +
    Get document key
    Parameters: not specified @@ -240,22 +243,60 @@ public function getInitiatorFilePath(): string;
    ```php -public function getKey(): string; +public function getParentDocFilePath(): string; ``` -
    Get document key
    + Parameters: not specified Return value: string +
    +
    +
    + + + +```php +public function setParentDocFilePath(string $parentDocFilePath): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parentDocFilePathstring-
    + +Return value: void + +

    diff --git a/docs/tech/3.renderer/classes/DocumentedEntityWrapper_3.md b/docs/tech/3.renderer/classes/DocumentedEntityWrapper_3.md index 2ecafd8c..f7d977a4 100644 --- a/docs/tech/3.renderer/classes/DocumentedEntityWrapper_3.md +++ b/docs/tech/3.renderer/classes/DocumentedEntityWrapper_3.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template filters / DocumentedEntityWrapper
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / DocumentedEntityWrapper

    DocumentedEntityWrapper class: @@ -48,12 +48,15 @@ final class DocumentedEntityWrapper
  • getFileName - The name of the file to be generated
  • -
  • - getInitiatorFilePath -
  • getKey - Get document key
  • +
  • + getParentDocFilePath +
  • +
  • + setParentDocFilePath +
  • @@ -73,7 +76,7 @@ final class DocumentedEntityWrapper ```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface $documentTransformableEntity, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, string $initiatorFilePath); +public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface $documentTransformableEntity, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, string $parentDocFilePath); ``` @@ -100,7 +103,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentTransfor - - $initiatorFilePath + $parentDocFilePath string The file in which the documentation of the entity was requested @@ -219,16 +222,16 @@ public function getFileName(): string;
    ```php -public function getInitiatorFilePath(): string; +public function getKey(): string; ``` - +
    Get document key
    Parameters: not specified @@ -240,22 +243,60 @@ public function getInitiatorFilePath(): string;
    ```php -public function getKey(): string; +public function getParentDocFilePath(): string; ``` -
    Get document key
    + Parameters: not specified Return value: string +
    +
    +
    + + + +```php +public function setParentDocFilePath(string $parentDocFilePath): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parentDocFilePathstring-
    + +Return value: void + +

    diff --git a/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection.md b/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection.md index 591ffc8a..a0475d57 100644 --- a/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection.md +++ b/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / DocumentedEntityWrappersCollection
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / DocumentedEntityWrappersCollection

    - DocumentedEntityWrappersCollection class: + DocumentedEntityWrappersCollection class:

    @@ -60,11 +60,11 @@ final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \T ```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache); +public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher); ``` @@ -89,6 +89,11 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $localObjectCache \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache - + + + $pluginEventDispatcher + \BumbleDocGen\Core\Plugin\PluginEventDispatcher + - @@ -102,7 +107,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext ```php @@ -129,7 +134,7 @@ public function count(): int; ```php @@ -167,7 +172,7 @@ public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\En ```php @@ -188,7 +193,7 @@ public function getDocumentedEntitiesRelations(): array; ```php diff --git a/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection_2.md b/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection_2.md index e872394e..ff2e994b 100644 --- a/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection_2.md +++ b/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection_2.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / DocumentedEntityWrappersCollection
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / DocumentedEntityWrappersCollection

    - DocumentedEntityWrappersCollection class: + DocumentedEntityWrappersCollection class:

    @@ -60,11 +60,11 @@ final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \T ```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache); +public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher); ``` @@ -89,6 +89,11 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $localObjectCache \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache - + + + $pluginEventDispatcher + \BumbleDocGen\Core\Plugin\PluginEventDispatcher + - @@ -102,7 +107,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext ```php @@ -129,7 +134,7 @@ public function count(): int; ```php @@ -167,7 +172,7 @@ public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\En ```php @@ -188,7 +193,7 @@ public function getDocumentedEntitiesRelations(): array; ```php diff --git a/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection_3.md b/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection_3.md index 75560dd1..54a1ffda 100644 --- a/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection_3.md +++ b/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection_3.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Renderer / Template filters / DocumentedEntityWrappersCollection
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / DocumentedEntityWrappersCollection

    - DocumentedEntityWrappersCollection class: + DocumentedEntityWrappersCollection class:

    @@ -60,11 +60,11 @@ final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \T ```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache); +public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher); ``` @@ -89,6 +89,11 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $localObjectCache \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache - + + + $pluginEventDispatcher + \BumbleDocGen\Core\Plugin\PluginEventDispatcher + - @@ -102,7 +107,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext ```php @@ -129,7 +134,7 @@ public function count(): int; ```php @@ -167,7 +172,7 @@ public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\En ```php @@ -188,7 +193,7 @@ public function getDocumentedEntitiesRelations(): array; ```php diff --git a/docs/tech/3.renderer/classes/DrawClassMap.md b/docs/tech/3.renderer/classes/DrawClassMap.md index 488f196a..e586f3df 100644 --- a/docs/tech/3.renderer/classes/DrawClassMap.md +++ b/docs/tech/3.renderer/classes/DrawClassMap.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / DrawClassMap
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / DrawClassMap

    DrawClassMap class: @@ -165,13 +165,13 @@ public function __invoke(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEn \DI\NotFoundException
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -267,13 +267,13 @@ public function getDirectoryStructure(\BumbleDocGen\LanguageHandler\Php\Parser\E \DI\NotFoundException
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException diff --git a/docs/tech/3.renderer/classes/DrawDocumentationMenu.md b/docs/tech/3.renderer/classes/DrawDocumentationMenu.md index 05797d8b..4ca60643 100644 --- a/docs/tech/3.renderer/classes/DrawDocumentationMenu.md +++ b/docs/tech/3.renderer/classes/DrawDocumentationMenu.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / DrawDocumentationMenu
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / DrawDocumentationMenu

    DrawDocumentationMenu class: @@ -21,7 +21,7 @@ and all links with this page are recursively collected for it, after which the h See: @@ -196,7 +196,7 @@ public function __invoke(string|null $startPageKey = NULL, int|null $maxDeep = N \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException diff --git a/docs/tech/3.renderer/classes/DrawDocumentedEntityLink.md b/docs/tech/3.renderer/classes/DrawDocumentedEntityLink.md index 6b475e45..2a87a2aa 100644 --- a/docs/tech/3.renderer/classes/DrawDocumentedEntityLink.md +++ b/docs/tech/3.renderer/classes/DrawDocumentedEntityLink.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / DrawDocumentedEntityLink
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / DrawDocumentedEntityLink

    DrawDocumentedEntityLink class: @@ -169,13 +169,13 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $e \DI\NotFoundException
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException diff --git a/docs/tech/3.renderer/classes/FileGetContents.md b/docs/tech/3.renderer/classes/FileGetContents.md index d00bf38f..751fa10e 100644 --- a/docs/tech/3.renderer/classes/FileGetContents.md +++ b/docs/tech/3.renderer/classes/FileGetContents.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / FileGetContents
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / FileGetContents

    FileGetContents class: diff --git a/docs/tech/3.renderer/classes/FixStrSize.md b/docs/tech/3.renderer/classes/FixStrSize.md index e1b3bd18..10df8270 100644 --- a/docs/tech/3.renderer/classes/FixStrSize.md +++ b/docs/tech/3.renderer/classes/FixStrSize.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template filters / FixStrSize
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / FixStrSize

    FixStrSize class: diff --git a/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs.md b/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs.md index a6ac987e..a52c69b5 100644 --- a/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs.md +++ b/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / GeneratePageBreadcrumbs
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / GeneratePageBreadcrumbs

    - GeneratePageBreadcrumbs class: + GeneratePageBreadcrumbs class:

    @@ -67,7 +67,7 @@ final class GeneratePageBreadcrumbs implements \BumbleDocGen\Core\Renderer\Twig\ ```php @@ -114,7 +114,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsH ```php @@ -160,16 +160,22 @@ public function __invoke(string $currentPageTitle, string $templatePath, bool $s Throws: @@ -180,7 +186,7 @@ public function __invoke(string $currentPageTitle, string $templatePath, bool $s ```php @@ -201,7 +207,7 @@ public static function getName(): string; ```php diff --git a/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs_2.md b/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs_2.md index 3ce49e61..b8130200 100644 --- a/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs_2.md +++ b/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs_2.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Renderer / Documentation structure and breadcrumbs / GeneratePageBreadcrumbs
    + BumbleDocGen / Technical description of the project / Renderer / Documentation structure and breadcrumbs / GeneratePageBreadcrumbs

    - GeneratePageBreadcrumbs class: + GeneratePageBreadcrumbs class:

    @@ -67,7 +67,7 @@ final class GeneratePageBreadcrumbs implements \BumbleDocGen\Core\Renderer\Twig\ ```php @@ -114,7 +114,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsH ```php @@ -160,14 +160,20 @@ public function __invoke(string $currentPageTitle, string $templatePath, bool $s Throws: diff --git a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md index 0755e794..06db0cda 100644 --- a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md +++ b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / GetDocumentedEntityUrl
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / GetDocumentedEntityUrl

    GetDocumentedEntityUrl class: @@ -211,13 +211,13 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $ \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException diff --git a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md index b4ed9a18..a593c077 100644 --- a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md +++ b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template filters / GetDocumentedEntityUrl
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / GetDocumentedEntityUrl

    GetDocumentedEntityUrl class: @@ -211,13 +211,13 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $ \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • \DI\NotFoundException
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException diff --git a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException.md b/docs/tech/3.renderer/classes/InvalidConfigurationParameterException.md index a4d50e27..f9aa45e6 100644 --- a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException.md +++ b/docs/tech/3.renderer/classes/InvalidConfigurationParameterException.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / InvalidConfigurationParameterException
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables / InvalidConfigurationParameterException

    InvalidConfigurationParameterException class: diff --git a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_2.md b/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_2.md index 11f45ac4..3a56a587 100644 --- a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_2.md +++ b/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_2.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template filters / InvalidConfigurationParameterException
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / InvalidConfigurationParameterException

    InvalidConfigurationParameterException class: diff --git a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_3.md b/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_3.md index 82de65b3..44637b0f 100644 --- a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_3.md +++ b/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_3.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables / InvalidConfigurationParameterException
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / InvalidConfigurationParameterException

    InvalidConfigurationParameterException class: diff --git a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_4.md b/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_4.md index e9c07866..4e84c94a 100644 --- a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_4.md +++ b/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_4.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / InvalidConfigurationParameterException
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / InvalidConfigurationParameterException

    InvalidConfigurationParameterException class: diff --git a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_5.md b/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_5.md index da299758..1bea4efd 100644 --- a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_5.md +++ b/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_5.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Documentation structure and breadcrumbs / InvalidConfigurationParameterException
    + BumbleDocGen / Technical description of the project / Renderer / Documentation structure and breadcrumbs / InvalidConfigurationParameterException

    InvalidConfigurationParameterException class: diff --git a/docs/tech/3.renderer/classes/LanguageHandlerInterface.md b/docs/tech/3.renderer/classes/LanguageHandlerInterface.md index 4dbea3fa..f2ebf676 100644 --- a/docs/tech/3.renderer/classes/LanguageHandlerInterface.md +++ b/docs/tech/3.renderer/classes/LanguageHandlerInterface.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables / LanguageHandlerInterface
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables / LanguageHandlerInterface

    LanguageHandlerInterface class: diff --git a/docs/tech/3.renderer/classes/LoadPluginsContent.md b/docs/tech/3.renderer/classes/LoadPluginsContent.md index de00f64c..ceaccca5 100644 --- a/docs/tech/3.renderer/classes/LoadPluginsContent.md +++ b/docs/tech/3.renderer/classes/LoadPluginsContent.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / LoadPluginsContent
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / LoadPluginsContent

    LoadPluginsContent class: diff --git a/docs/tech/3.renderer/classes/PageHtmlLinkerPlugin.md b/docs/tech/3.renderer/classes/PageHtmlLinkerPlugin.md index 40a6be83..8a27c1d5 100644 --- a/docs/tech/3.renderer/classes/PageHtmlLinkerPlugin.md +++ b/docs/tech/3.renderer/classes/PageHtmlLinkerPlugin.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / PageHtmlLinkerPlugin
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / PageHtmlLinkerPlugin

    PageHtmlLinkerPlugin class: @@ -170,10 +170,10 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B \DI\DependencyException
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException diff --git a/docs/tech/3.renderer/classes/PregMatch.md b/docs/tech/3.renderer/classes/PregMatch.md index 87230b31..8594dfd6 100644 --- a/docs/tech/3.renderer/classes/PregMatch.md +++ b/docs/tech/3.renderer/classes/PregMatch.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template filters / PregMatch
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / PregMatch

    PregMatch class: diff --git a/docs/tech/3.renderer/classes/PrepareSourceLink.md b/docs/tech/3.renderer/classes/PrepareSourceLink.md index f9c3640c..479ebd63 100644 --- a/docs/tech/3.renderer/classes/PrepareSourceLink.md +++ b/docs/tech/3.renderer/classes/PrepareSourceLink.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template filters / PrepareSourceLink
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / PrepareSourceLink

    PrepareSourceLink class: diff --git a/docs/tech/3.renderer/classes/PrintEntityCollectionAsList.md b/docs/tech/3.renderer/classes/PrintEntityCollectionAsList.md index 7b122b2b..c03d19cf 100644 --- a/docs/tech/3.renderer/classes/PrintEntityCollectionAsList.md +++ b/docs/tech/3.renderer/classes/PrintEntityCollectionAsList.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / PrintEntityCollectionAsList
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / PrintEntityCollectionAsList

    PrintEntityCollectionAsList class: @@ -168,7 +168,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $ Throws: diff --git a/docs/tech/3.renderer/classes/Quotemeta.md b/docs/tech/3.renderer/classes/Quotemeta.md index c4ca5fbc..7e722aff 100644 --- a/docs/tech/3.renderer/classes/Quotemeta.md +++ b/docs/tech/3.renderer/classes/Quotemeta.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template filters / Quotemeta
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / Quotemeta

    Quotemeta class: diff --git a/docs/tech/3.renderer/classes/ReflectionException.md b/docs/tech/3.renderer/classes/ReflectionException.md index 4396c3b1..6abd0a00 100644 --- a/docs/tech/3.renderer/classes/ReflectionException.md +++ b/docs/tech/3.renderer/classes/ReflectionException.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / ReflectionException
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables / ReflectionException

    ReflectionException class: diff --git a/docs/tech/3.renderer/classes/ReflectionException_2.md b/docs/tech/3.renderer/classes/ReflectionException_2.md index fb44a626..6fdbe101 100644 --- a/docs/tech/3.renderer/classes/ReflectionException_2.md +++ b/docs/tech/3.renderer/classes/ReflectionException_2.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template filters / ReflectionException
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / ReflectionException

    ReflectionException class: diff --git a/docs/tech/3.renderer/classes/ReflectionException_3.md b/docs/tech/3.renderer/classes/ReflectionException_3.md index 9f952930..29026f64 100644 --- a/docs/tech/3.renderer/classes/ReflectionException_3.md +++ b/docs/tech/3.renderer/classes/ReflectionException_3.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables / ReflectionException
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / ReflectionException

    ReflectionException class: diff --git a/docs/tech/3.renderer/classes/ReflectionException_4.md b/docs/tech/3.renderer/classes/ReflectionException_4.md index e7361253..cc6d9b26 100644 --- a/docs/tech/3.renderer/classes/ReflectionException_4.md +++ b/docs/tech/3.renderer/classes/ReflectionException_4.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / ReflectionException
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / ReflectionException

    ReflectionException class: diff --git a/docs/tech/3.renderer/classes/RemoveLineBrakes.md b/docs/tech/3.renderer/classes/RemoveLineBrakes.md index e1a7b13a..237cbdee 100644 --- a/docs/tech/3.renderer/classes/RemoveLineBrakes.md +++ b/docs/tech/3.renderer/classes/RemoveLineBrakes.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template filters / RemoveLineBrakes
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / RemoveLineBrakes

    RemoveLineBrakes class: diff --git a/docs/tech/3.renderer/classes/RendererContext.md b/docs/tech/3.renderer/classes/RendererContext.md index 4d035ed1..2938cd52 100644 --- a/docs/tech/3.renderer/classes/RendererContext.md +++ b/docs/tech/3.renderer/classes/RendererContext.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / RendererContext
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / RendererContext

    RendererContext class: diff --git a/docs/tech/3.renderer/classes/RendererContext_2.md b/docs/tech/3.renderer/classes/RendererContext_2.md index 4522cdb9..b75cf640 100644 --- a/docs/tech/3.renderer/classes/RendererContext_2.md +++ b/docs/tech/3.renderer/classes/RendererContext_2.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / RendererContext
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / RendererContext

    RendererContext class: diff --git a/docs/tech/3.renderer/classes/RendererContext_3.md b/docs/tech/3.renderer/classes/RendererContext_3.md index e1f353e9..ab188eda 100644 --- a/docs/tech/3.renderer/classes/RendererContext_3.md +++ b/docs/tech/3.renderer/classes/RendererContext_3.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template filters / RendererContext
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / RendererContext

    RendererContext class: diff --git a/docs/tech/3.renderer/classes/RootEntityCollection.md b/docs/tech/3.renderer/classes/RootEntityCollection.md index 68eabdcb..a14453ba 100644 --- a/docs/tech/3.renderer/classes/RootEntityCollection.md +++ b/docs/tech/3.renderer/classes/RootEntityCollection.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / RootEntityCollection
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / RootEntityCollection

    RootEntityCollection class: diff --git a/docs/tech/3.renderer/classes/RootEntityInterface.md b/docs/tech/3.renderer/classes/RootEntityInterface.md index 2d3df749..7d97a5c6 100644 --- a/docs/tech/3.renderer/classes/RootEntityInterface.md +++ b/docs/tech/3.renderer/classes/RootEntityInterface.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / RootEntityInterface
    + BumbleDocGen / Technical description of the project / Renderer / Template functions / RootEntityInterface

    RootEntityInterface class: diff --git a/docs/tech/3.renderer/classes/RootEntityInterface_2.md b/docs/tech/3.renderer/classes/RootEntityInterface_2.md index 0f674832..7badee12 100644 --- a/docs/tech/3.renderer/classes/RootEntityInterface_2.md +++ b/docs/tech/3.renderer/classes/RootEntityInterface_2.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables / RootEntityInterface
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables / RootEntityInterface

    RootEntityInterface class: diff --git a/docs/tech/3.renderer/classes/StrTypeToUrl.md b/docs/tech/3.renderer/classes/StrTypeToUrl.md index 8f4b2be9..a59cf956 100644 --- a/docs/tech/3.renderer/classes/StrTypeToUrl.md +++ b/docs/tech/3.renderer/classes/StrTypeToUrl.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template filters / StrTypeToUrl
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / StrTypeToUrl

    StrTypeToUrl class: @@ -176,13 +176,13 @@ public function __invoke(string $text, \BumbleDocGen\Core\Parser\Entity\RootEnti \DI\NotFoundException
  • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
  • \DI\DependencyException
  • - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException diff --git a/docs/tech/3.renderer/classes/TextToCodeBlock.md b/docs/tech/3.renderer/classes/TextToCodeBlock.md index 69229bd3..e24d5d55 100644 --- a/docs/tech/3.renderer/classes/TextToCodeBlock.md +++ b/docs/tech/3.renderer/classes/TextToCodeBlock.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template filters / TextToCodeBlock
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / TextToCodeBlock

    TextToCodeBlock class: diff --git a/docs/tech/3.renderer/classes/TextToHeading.md b/docs/tech/3.renderer/classes/TextToHeading.md index fe1ea5ce..503e117a 100644 --- a/docs/tech/3.renderer/classes/TextToHeading.md +++ b/docs/tech/3.renderer/classes/TextToHeading.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template filters / TextToHeading
    + BumbleDocGen / Technical description of the project / Renderer / Template filters / TextToHeading

    TextToHeading class: diff --git a/docs/tech/3.renderer/readme.md b/docs/tech/3.renderer/readme.md index 275c4b7b..d5e768e2 100644 --- a/docs/tech/3.renderer/readme.md +++ b/docs/tech/3.renderer/readme.md @@ -10,7 +10,7 @@ We use twig to process templates.

    More detailed description of renderer components

    - +

    Starting the rendering process

    @@ -60,4 +60,4 @@ This process is presented in the form of a diagram below.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Sun Oct 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesDynamicBlocks.md b/docs/tech/3.renderer/templatesDynamicBlocks.md index b3f8bf98..e1781ec5 100644 --- a/docs/tech/3.renderer/templatesDynamicBlocks.md +++ b/docs/tech/3.renderer/templatesDynamicBlocks.md @@ -1,10 +1,10 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates dynamic blocks
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates dynamic blocks

    Templates dynamic blocks

    There are several ways to create dynamic blocks in templates. -* First of all, these are custom twig functions and filters. +* First of all, these are custom twig functions and filters. You can use the built-in functions and filters or add your own, so you can implement any logic for generating dynamically changing content. ```twig @@ -26,4 +26,4 @@ You can use the built-in functions and filters or add your own, so you can imple

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Sun Oct 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesLinking.md b/docs/tech/3.renderer/templatesLinking.md index a7b16b7b..3c365277 100644 --- a/docs/tech/3.renderer/templatesLinking.md +++ b/docs/tech/3.renderer/templatesLinking.md @@ -1,4 +1,4 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates

    Linking templates

    @@ -22,9 +22,9 @@ will be replaced with this link: The second way to relink templates is to generate links through functions. -There are a number of functions that allow you to get a link to an entity, for example GetDocumentedEntityUrl, and there are also functions for getting a link to other documents, for example GetDocumentationPageUrl. +There are a number of functions that allow you to get a link to an entity, for example GetDocumentedEntityUrl, and there are also functions for getting a link to other documents, for example GetDocumentationPageUrl. You can also implement your own functions for relinking if necessary.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Sun Oct 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesVariables.md b/docs/tech/3.renderer/templatesVariables.md index 8aa1ecb1..9847a53c 100644 --- a/docs/tech/3.renderer/templatesVariables.md +++ b/docs/tech/3.renderer/templatesVariables.md @@ -1,4 +1,4 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables
    + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Templates variables

    Templates variables

    @@ -6,9 +6,9 @@ There are several variables available in each processed template. 1) Firstly, these are built-in twig variables, for example `_self`, which returns the path to the processed template. -2) Secondly, variables with collections of processed programming languages are available in the template (see LanguageHandlerInterface). For example, when processing a PHP project collection, a collection ClassEntityCollection will be available in the template under the name phpClassEntityCollection +2) Secondly, variables with collections of processed programming languages are available in the template (see LanguageHandlerInterface). For example, when processing a PHP project collection, a collection ClassEntityCollection will be available in the template under the name phpClassEntityCollection

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Sun Oct 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/AfterRenderingEntities.md b/docs/tech/4.pluginSystem/classes/AfterRenderingEntities.md new file mode 100644 index 00000000..ee57fae3 --- /dev/null +++ b/docs/tech/4.pluginSystem/classes/AfterRenderingEntities.md @@ -0,0 +1,92 @@ + + BumbleDocGen / Technical description of the project / Plugin system / AfterRenderingEntities
    + +

    + AfterRenderingEntities class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Plugin\Event\Renderer; + +final class AfterRenderingEntities extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface +``` + +
    Event is the base class for classes containing event data.
    + + + + + + + +

    Methods:

    + +
      +
    1. + isPropagationStopped + - Is propagation stopped?
    2. +
    3. + stopPropagation + - Stops the propagation of the event to further event listeners.
    4. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function isPropagationStopped(): bool; +``` + +
    Is propagation stopped?
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function stopPropagation(): void; +``` + +
    Stops the propagation of the event to further event listeners.
    + +Parameters: not specified + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/BeforeRenderingDocFiles.md b/docs/tech/4.pluginSystem/classes/BeforeRenderingDocFiles.md new file mode 100644 index 00000000..10df4a78 --- /dev/null +++ b/docs/tech/4.pluginSystem/classes/BeforeRenderingDocFiles.md @@ -0,0 +1,92 @@ + + BumbleDocGen / Technical description of the project / Plugin system / BeforeRenderingDocFiles
    + +

    + BeforeRenderingDocFiles class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Plugin\Event\Renderer; + +final class BeforeRenderingDocFiles extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface +``` + +
    The event occurs before the main documents begin rendering
    + + + + + + + +

    Methods:

    + +
      +
    1. + isPropagationStopped + - Is propagation stopped?
    2. +
    3. + stopPropagation + - Stops the propagation of the event to further event listeners.
    4. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function isPropagationStopped(): bool; +``` + +
    Is propagation stopped?
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function stopPropagation(): void; +``` + +
    Stops the propagation of the event to further event listeners.
    + +Parameters: not specified + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/BeforeRenderingEntities.md b/docs/tech/4.pluginSystem/classes/BeforeRenderingEntities.md new file mode 100644 index 00000000..a57268a7 --- /dev/null +++ b/docs/tech/4.pluginSystem/classes/BeforeRenderingEntities.md @@ -0,0 +1,92 @@ + + BumbleDocGen / Technical description of the project / Plugin system / BeforeRenderingEntities
    + +

    + BeforeRenderingEntities class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Plugin\Event\Renderer; + +final class BeforeRenderingEntities extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface +``` + +
    The event occurs before the rendering of entity documents begins, after the main documents have been created
    + + + + + + + +

    Methods:

    + +
      +
    1. + isPropagationStopped + - Is propagation stopped?
    2. +
    3. + stopPropagation + - Stops the propagation of the event to further event listeners.
    4. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function isPropagationStopped(): bool; +``` + +
    Is propagation stopped?
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function stopPropagation(): void; +``` + +
    Stops the propagation of the event to further event listeners.
    + +Parameters: not specified + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/EntityDocUnifiedPlacePlugin.md b/docs/tech/4.pluginSystem/classes/EntityDocUnifiedPlacePlugin.md new file mode 100644 index 00000000..f1b12b32 --- /dev/null +++ b/docs/tech/4.pluginSystem/classes/EntityDocUnifiedPlacePlugin.md @@ -0,0 +1,196 @@ + + BumbleDocGen / Technical description of the project / Plugin system / EntityDocUnifiedPlacePlugin
    + +

    + EntityDocUnifiedPlacePlugin class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\EntityDocUnifiedPlace; + +final class EntityDocUnifiedPlacePlugin implements \BumbleDocGen\Core\Plugin\PluginInterface, \Symfony\Component\EventDispatcher\EventSubscriberInterface +``` + +
    This plugin changes the algorithm for saving entity documents. The standard system stores each file +in a directory next to the file where it was requested. This behavior changes and all documents are saved +in a separate directory structure, so they are not duplicated.
    + + + + + + + +

    Methods:

    + +
      +
    1. + getSubscribedEvents + - Returns an array of event names this subscriber wants to listen to.
    2. +
    3. + onCreateDocumentedEntityWrapper +
    4. +
    5. + onGetProjectTemplatesDirs +
    6. +
    7. + onGetTemplatePathByRelativeDocPath +
    8. +
    + + +

    Constants:

    + + + + + + +

    Method details:

    + +
    + + + +```php +public static function getSubscribedEvents(): array; +``` + +
    Returns an array of event names this subscriber wants to listen to.
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function onCreateDocumentedEntityWrapper(\BumbleDocGen\Core\Plugin\Event\Renderer\OnCreateDocumentedEntityWrapper $event): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\OnCreateDocumentedEntityWrapper-
    + +Return value: void + + +
    +
    +
    + + + +```php +public function onGetProjectTemplatesDirs(\BumbleDocGen\Core\Plugin\Event\Renderer\OnGetProjectTemplatesDirs $event): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\OnGetProjectTemplatesDirs-
    + +Return value: void + + +
    +
    +
    + + + +```php +public function onGetTemplatePathByRelativeDocPath(\BumbleDocGen\Core\Plugin\Event\Renderer\OnGetTemplatePathByRelativeDocPath $event): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\OnGetTemplatePathByRelativeDocPath-
    + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/LastPageCommitter.md b/docs/tech/4.pluginSystem/classes/LastPageCommitter.md index fc4d781c..8bdd4747 100644 --- a/docs/tech/4.pluginSystem/classes/LastPageCommitter.md +++ b/docs/tech/4.pluginSystem/classes/LastPageCommitter.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Plugin system / LastPageCommitter

    - LastPageCommitter class: + LastPageCommitter class:

    @@ -54,7 +54,7 @@ final class LastPageCommitter implements \BumbleDocGen\Core\Plugin\PluginInterfa ```php @@ -96,7 +96,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext ```php @@ -127,13 +127,6 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B Return value: void -Throws: - -
    @@ -141,7 +134,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B ```php diff --git a/docs/tech/4.pluginSystem/classes/OnCreateDocumentedEntityWrapper.md b/docs/tech/4.pluginSystem/classes/OnCreateDocumentedEntityWrapper.md new file mode 100644 index 00000000..300a593b --- /dev/null +++ b/docs/tech/4.pluginSystem/classes/OnCreateDocumentedEntityWrapper.md @@ -0,0 +1,160 @@ + + BumbleDocGen / Technical description of the project / Plugin system / OnCreateDocumentedEntityWrapper
    + +

    + OnCreateDocumentedEntityWrapper class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Plugin\Event\Renderer; + +final class OnCreateDocumentedEntityWrapper extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface +``` + +
    The event occurs when an entity is added to the list for documentation
    + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + getDocumentedEntityWrapper +
    2. +
    3. + isPropagationStopped + - Is propagation stopped?
    4. +
    5. + stopPropagation + - Stops the propagation of the event to further event listeners.
    6. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper $documentedEntityWrapper); +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $documentedEntityWrapper\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper-
    + + + +
    +
    +
    + + + +```php +public function getDocumentedEntityWrapper(): \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function isPropagationStopped(): bool; +``` + +
    Is propagation stopped?
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function stopPropagation(): void; +``` + +
    Stops the propagation of the event to further event listeners.
    + +Parameters: not specified + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/OnGetProjectTemplatesDirs.md b/docs/tech/4.pluginSystem/classes/OnGetProjectTemplatesDirs.md new file mode 100644 index 00000000..889c3574 --- /dev/null +++ b/docs/tech/4.pluginSystem/classes/OnGetProjectTemplatesDirs.md @@ -0,0 +1,201 @@ + + BumbleDocGen / Technical description of the project / Plugin system / OnGetProjectTemplatesDirs
    + +

    + OnGetProjectTemplatesDirs class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Plugin\Event\Renderer; + +final class OnGetProjectTemplatesDirs extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface +``` + +
    This event occurs when all directories containing document templates are retrieved
    + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + addTemplatesDir +
    2. +
    3. + getTemplatesDirs +
    4. +
    5. + isPropagationStopped + - Is propagation stopped?
    6. +
    7. + stopPropagation + - Stops the propagation of the event to further event listeners.
    8. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(array $templatesDirs); +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $templatesDirsarray-
    + + + +
    +
    +
    + + + +```php +public function addTemplatesDir(string $dirName): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $dirNamestring-
    + +Return value: void + + +
    +
    +
    + + + +```php +public function getTemplatesDirs(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function isPropagationStopped(): bool; +``` + +
    Is propagation stopped?
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function stopPropagation(): void; +``` + +
    Stops the propagation of the event to further event listeners.
    + +Parameters: not specified + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/OnGetTemplatePathByRelativeDocPath.md b/docs/tech/4.pluginSystem/classes/OnGetTemplatePathByRelativeDocPath.md new file mode 100644 index 00000000..ec4c765d --- /dev/null +++ b/docs/tech/4.pluginSystem/classes/OnGetTemplatePathByRelativeDocPath.md @@ -0,0 +1,225 @@ + + BumbleDocGen / Technical description of the project / Plugin system / OnGetTemplatePathByRelativeDocPath
    + +

    + OnGetTemplatePathByRelativeDocPath class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Plugin\Event\Renderer; + +final class OnGetTemplatePathByRelativeDocPath extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface +``` + +
    The event occurs when the path to the template file is obtained relative to the path to the document
    + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + getCustomTemplateFilePath +
    2. +
    3. + getTemplateName +
    4. +
    5. + isPropagationStopped + - Is propagation stopped?
    6. +
    7. + setCustomTemplateFilePath +
    8. +
    9. + stopPropagation + - Stops the propagation of the event to further event listeners.
    10. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(string $templateName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $templateNamestring-
    + + + +
    +
    +
    + + + +```php +public function getCustomTemplateFilePath(): string|null; +``` + + + +Parameters: not specified + +Return value: string | null + + +
    +
    +
    + + + +```php +public function getTemplateName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function isPropagationStopped(): bool; +``` + +
    Is propagation stopped?
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function setCustomTemplateFilePath(string|null $customTemplateFilePath): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $customTemplateFilePathstring | null-
    + +Return value: void + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function stopPropagation(): void; +``` + +
    Stops the propagation of the event to further event listeners.
    + +Parameters: not specified + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/OnGettingResourceLink.md b/docs/tech/4.pluginSystem/classes/OnGettingResourceLink.md index ed006392..c8ede590 100644 --- a/docs/tech/4.pluginSystem/classes/OnGettingResourceLink.md +++ b/docs/tech/4.pluginSystem/classes/OnGettingResourceLink.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Plugin system / OnGettingResourceLink

    - OnGettingResourceLink class: + OnGettingResourceLink class:

    @@ -15,7 +15,7 @@ namespace BumbleDocGen\Core\Plugin\Event\Renderer; final class OnGettingResourceLink extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface ``` -
    Event is the base class for classes containing event data.
    +
    Event occurs when a reference to an entity (resource) is received
    @@ -63,7 +63,7 @@ final class OnGettingResourceLink extends \Symfony\Contracts\EventDispatcher\Eve ```php @@ -100,7 +100,7 @@ public function __construct(string $resourceName); ```php @@ -121,7 +121,7 @@ public function getResourceName(): string; ```php @@ -165,7 +165,7 @@ public function isPropagationStopped(): bool; ```php diff --git a/docs/tech/4.pluginSystem/readme.md b/docs/tech/4.pluginSystem/readme.md index 594b5440..5bc1a94e 100644 --- a/docs/tech/4.pluginSystem/readme.md +++ b/docs/tech/4.pluginSystem/readme.md @@ -149,11 +149,25 @@ Plugins for any programming languages work regardless of which language handler Adding links to the documentation of PHP classes in the \Twig namespace + + EntityDocUnifiedPlacePlugin + PHP + + + + This plugin changes the algorithm for saving entity documents. The standard system stores each file +in a directory next to the file where it was requested. This behavior changes and all documents are saved +in a separate directory structure, so they are not duplicated. +

    Default events

    - +

    Adding a new plugin

    @@ -192,4 +206,4 @@ plugins:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Sun Oct 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/classes/AfterRenderingEntities.md b/docs/tech/classes/AfterRenderingEntities.md new file mode 100644 index 00000000..e8faf6a2 --- /dev/null +++ b/docs/tech/classes/AfterRenderingEntities.md @@ -0,0 +1,92 @@ + + BumbleDocGen / Technical description of the project / Class map / AfterRenderingEntities
    + +

    + AfterRenderingEntities class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Plugin\Event\Renderer; + +final class AfterRenderingEntities extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface +``` + +
    Event is the base class for classes containing event data.
    + + + + + + + +

    Methods:

    + +
      +
    1. + isPropagationStopped + - Is propagation stopped?
    2. +
    3. + stopPropagation + - Stops the propagation of the event to further event listeners.
    4. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function isPropagationStopped(): bool; +``` + +
    Is propagation stopped?
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function stopPropagation(): void; +``` + +
    Stops the propagation of the event to further event listeners.
    + +Parameters: not specified + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/BeforeRenderingDocFiles.md b/docs/tech/classes/BeforeRenderingDocFiles.md new file mode 100644 index 00000000..72b44ec5 --- /dev/null +++ b/docs/tech/classes/BeforeRenderingDocFiles.md @@ -0,0 +1,92 @@ + + BumbleDocGen / Technical description of the project / Class map / BeforeRenderingDocFiles
    + +

    + BeforeRenderingDocFiles class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Plugin\Event\Renderer; + +final class BeforeRenderingDocFiles extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface +``` + +
    The event occurs before the main documents begin rendering
    + + + + + + + +

    Methods:

    + +
      +
    1. + isPropagationStopped + - Is propagation stopped?
    2. +
    3. + stopPropagation + - Stops the propagation of the event to further event listeners.
    4. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function isPropagationStopped(): bool; +``` + +
    Is propagation stopped?
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function stopPropagation(): void; +``` + +
    Stops the propagation of the event to further event listeners.
    + +Parameters: not specified + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/BeforeRenderingEntities.md b/docs/tech/classes/BeforeRenderingEntities.md new file mode 100644 index 00000000..689d8eb5 --- /dev/null +++ b/docs/tech/classes/BeforeRenderingEntities.md @@ -0,0 +1,92 @@ + + BumbleDocGen / Technical description of the project / Class map / BeforeRenderingEntities
    + +

    + BeforeRenderingEntities class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Plugin\Event\Renderer; + +final class BeforeRenderingEntities extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface +``` + +
    The event occurs before the rendering of entity documents begins, after the main documents have been created
    + + + + + + + +

    Methods:

    + +
      +
    1. + isPropagationStopped + - Is propagation stopped?
    2. +
    3. + stopPropagation + - Stops the propagation of the event to further event listeners.
    4. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function isPropagationStopped(): bool; +``` + +
    Is propagation stopped?
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function stopPropagation(): void; +``` + +
    Stops the propagation of the event to further event listeners.
    + +Parameters: not specified + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/BreadcrumbsHelper.md b/docs/tech/classes/BreadcrumbsHelper.md index 5daddcdf..0ed6be72 100644 --- a/docs/tech/classes/BreadcrumbsHelper.md +++ b/docs/tech/classes/BreadcrumbsHelper.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / BreadcrumbsHelper

    - BreadcrumbsHelper class: + BreadcrumbsHelper class:

    @@ -67,7 +67,7 @@ final class BreadcrumbsHelper @@ -82,11 +82,11 @@ final class BreadcrumbsHelper ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsTwigEnvironment $breadcrumbsTwig, string $prevPageNameTemplate = \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper::DEFAULT_PREV_PAGE_NAME_TEMPLATE); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsTwigEnvironment $breadcrumbsTwig, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, string $prevPageNameTemplate = \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper::DEFAULT_PREV_PAGE_NAME_TEMPLATE); ``` @@ -116,6 +116,11 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $breadcrumbsTwig \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsTwigEnvironment - + + + $pluginEventDispatcher + \BumbleDocGen\Core\Plugin\PluginEventDispatcher + - $prevPageNameTemplate @@ -134,7 +139,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -168,7 +173,7 @@ public function getAllPageLinks(): array; ```php @@ -224,11 +229,11 @@ public function getBreadcrumbs(string $filePatch, bool $fromCurrent = true): arr ```php -public function getBreadcrumbsForTemplates(string $templateFilePatch, bool $fromCurrent = true): array; +public function getBreadcrumbsForTemplates(string $filePatch, bool $fromCurrent = true): array; ``` @@ -245,7 +250,7 @@ public function getBreadcrumbsForTemplates(string $templateFilePatch, bool $from - $templateFilePatch + $filePatch string - @@ -280,7 +285,7 @@ public function getBreadcrumbsForTemplates(string $templateFilePatch, bool $from ```php @@ -331,7 +336,7 @@ public function getPageDataByKey(string $key): array|null; ```php @@ -382,7 +387,7 @@ public function getPageDocFileByKey(string $key): string|null; ```php @@ -433,7 +438,7 @@ public function getPageLinkByKey(string $key): string|null; ```php @@ -478,7 +483,7 @@ public function getTemplateLinkKey(string $templateName): string|null; ```php @@ -534,7 +539,7 @@ $breadcrumbsHelper->getTemplateTitle() == 'Some template title'; // is true ```php diff --git a/docs/tech/classes/ClassEntity.md b/docs/tech/classes/ClassEntity.md index d13e3ecf..7ba93dad 100644 --- a/docs/tech/classes/ClassEntity.md +++ b/docs/tech/classes/ClassEntity.md @@ -228,6 +228,9 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
  • implementsInterface
  • +
  • + isAbstract +
  • isClassLoad
  • @@ -368,7 +371,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -636,7 +639,7 @@ public function getCasesNames(): array; ```php @@ -780,7 +783,7 @@ public function getConstantEntityCollection(): \BumbleDocGen\LanguageHandler\Php ```php @@ -1042,7 +1045,7 @@ public function getDocNote(): string; ```php @@ -2207,7 +2210,7 @@ public function hasAnnotationKey(string $annotationKey): bool; ```php @@ -2308,7 +2311,7 @@ public function hasExamples(): bool; ```php @@ -2356,7 +2359,7 @@ public function hasMethod(string $method): bool; ```php @@ -2404,7 +2407,7 @@ public function hasParentClass(string $parentClassName): bool; ```php @@ -2506,7 +2509,7 @@ public function hasTraits(): bool; ```php @@ -2537,6 +2540,37 @@ public function implementsInterface(string $interfaceName): bool; Return value: bool +Throws: + + + +
    +
    + + + +```php +public function isAbstract(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + Throws:

    @@ -626,7 +622,7 @@ public function getEntityCollectionName(): string; ```php @@ -759,10 +755,41 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit
    + + +```php +public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + + +Throws: + + +
    +
    +
    + ```php @@ -793,7 +820,7 @@ public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\ ```php @@ -802,6 +829,37 @@ public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\En +Parameters: not specified + +Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection + + +Throws: + + +
    +
    +
    + + + +```php +public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; +``` + + + Parameters: not specified Return value: \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection @@ -908,7 +966,7 @@ public function has(string $objectName): bool; ```php diff --git a/docs/tech/classes/DocumentedEntityWrapper.md b/docs/tech/classes/DocumentedEntityWrapper.md index 5dbfc8b3..0ef5de59 100644 --- a/docs/tech/classes/DocumentedEntityWrapper.md +++ b/docs/tech/classes/DocumentedEntityWrapper.md @@ -48,12 +48,15 @@ final class DocumentedEntityWrapper
  • getFileName - The name of the file to be generated
  • -
  • - getInitiatorFilePath -
  • getKey - Get document key
  • +
  • + getParentDocFilePath +
  • +
  • + setParentDocFilePath +
  • @@ -73,7 +76,7 @@ final class DocumentedEntityWrapper ```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface $documentTransformableEntity, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, string $initiatorFilePath); +public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface $documentTransformableEntity, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, string $parentDocFilePath); ``` @@ -100,7 +103,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentTransfor - - $initiatorFilePath + $parentDocFilePath string The file in which the documentation of the entity was requested @@ -219,16 +222,16 @@ public function getFileName(): string;
    ```php -public function getInitiatorFilePath(): string; +public function getKey(): string; ``` - +
    Get document key
    Parameters: not specified @@ -240,22 +243,60 @@ public function getInitiatorFilePath(): string;
    ```php -public function getKey(): string; +public function getParentDocFilePath(): string; ``` -
    Get document key
    + Parameters: not specified Return value: string +
    +
    +
    + + + +```php +public function setParentDocFilePath(string $parentDocFilePath): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $parentDocFilePathstring-
    + +Return value: void + +

    diff --git a/docs/tech/classes/DocumentedEntityWrappersCollection.md b/docs/tech/classes/DocumentedEntityWrappersCollection.md index d535f6de..1d16d4c1 100644 --- a/docs/tech/classes/DocumentedEntityWrappersCollection.md +++ b/docs/tech/classes/DocumentedEntityWrappersCollection.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / DocumentedEntityWrappersCollection

    - DocumentedEntityWrappersCollection class: + DocumentedEntityWrappersCollection class:

    @@ -60,11 +60,11 @@ final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \T ```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache); +public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher); ``` @@ -89,6 +89,11 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $localObjectCache \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache - + + + $pluginEventDispatcher + \BumbleDocGen\Core\Plugin\PluginEventDispatcher + - @@ -102,7 +107,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext ```php @@ -129,7 +134,7 @@ public function count(): int; ```php @@ -167,7 +172,7 @@ public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\En ```php @@ -188,7 +193,7 @@ public function getDocumentedEntitiesRelations(): array; ```php diff --git a/docs/tech/classes/EntityDocUnifiedPlacePlugin.md b/docs/tech/classes/EntityDocUnifiedPlacePlugin.md new file mode 100644 index 00000000..d4b0f3d0 --- /dev/null +++ b/docs/tech/classes/EntityDocUnifiedPlacePlugin.md @@ -0,0 +1,196 @@ + + BumbleDocGen / Technical description of the project / Class map / EntityDocUnifiedPlacePlugin
    + +

    + EntityDocUnifiedPlacePlugin class: +

    + + + + + +```php +namespace BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\EntityDocUnifiedPlace; + +final class EntityDocUnifiedPlacePlugin implements \BumbleDocGen\Core\Plugin\PluginInterface, \Symfony\Component\EventDispatcher\EventSubscriberInterface +``` + +
    This plugin changes the algorithm for saving entity documents. The standard system stores each file +in a directory next to the file where it was requested. This behavior changes and all documents are saved +in a separate directory structure, so they are not duplicated.
    + + + + + + + +

    Methods:

    + +
      +
    1. + getSubscribedEvents + - Returns an array of event names this subscriber wants to listen to.
    2. +
    3. + onCreateDocumentedEntityWrapper +
    4. +
    5. + onGetProjectTemplatesDirs +
    6. +
    7. + onGetTemplatePathByRelativeDocPath +
    8. +
    + + +

    Constants:

    + + + + + + +

    Method details:

    + +
    + + + +```php +public static function getSubscribedEvents(): array; +``` + +
    Returns an array of event names this subscriber wants to listen to.
    + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +public function onCreateDocumentedEntityWrapper(\BumbleDocGen\Core\Plugin\Event\Renderer\OnCreateDocumentedEntityWrapper $event): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\OnCreateDocumentedEntityWrapper-
    + +Return value: void + + +
    +
    +
    + + + +```php +public function onGetProjectTemplatesDirs(\BumbleDocGen\Core\Plugin\Event\Renderer\OnGetProjectTemplatesDirs $event): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\OnGetProjectTemplatesDirs-
    + +Return value: void + + +
    +
    +
    + + + +```php +public function onGetTemplatePathByRelativeDocPath(\BumbleDocGen\Core\Plugin\Event\Renderer\OnGetTemplatePathByRelativeDocPath $event): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\OnGetTemplatePathByRelativeDocPath-
    + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/GeneratePageBreadcrumbs.md b/docs/tech/classes/GeneratePageBreadcrumbs.md index 40242f1e..8aa0fd06 100644 --- a/docs/tech/classes/GeneratePageBreadcrumbs.md +++ b/docs/tech/classes/GeneratePageBreadcrumbs.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / GeneratePageBreadcrumbs

    - GeneratePageBreadcrumbs class: + GeneratePageBreadcrumbs class:

    @@ -67,7 +67,7 @@ final class GeneratePageBreadcrumbs implements \BumbleDocGen\Core\Renderer\Twig\ ```php @@ -114,7 +114,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsH ```php @@ -160,14 +160,20 @@ public function __invoke(string $currentPageTitle, string $templatePath, bool $s Throws:

    @@ -141,7 +134,7 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B ```php diff --git a/docs/tech/classes/LocatedNotInCondition.md b/docs/tech/classes/LocatedNotInCondition.md new file mode 100644 index 00000000..f8530f07 --- /dev/null +++ b/docs/tech/classes/LocatedNotInCondition.md @@ -0,0 +1,142 @@ + + BumbleDocGen / Technical description of the project / Class map / LocatedNotInCondition
    + +

    + LocatedNotInCondition class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Parser\FilterCondition\CommonFilterCondition; + +final class LocatedNotInCondition implements \BumbleDocGen\Core\Parser\FilterCondition\ConditionInterface +``` + +
    Checking the existence of an entity not in the specified directories
    + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + canAddToCollection +
    2. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, array $directories = [ ]); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $parameterBag\BumbleDocGen\Core\Configuration\ConfigurationParameterBag-
    $directoriesarray-
    + + + +
    +
    +
    + + + +```php +public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterface $entity): bool; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $entity\BumbleDocGen\Core\Parser\Entity\EntityInterface-
    + +Return value: bool + + +Throws: + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/MainTwigEnvironment.md b/docs/tech/classes/MainTwigEnvironment.md index 1d23e8cb..e358eaee 100644 --- a/docs/tech/classes/MainTwigEnvironment.md +++ b/docs/tech/classes/MainTwigEnvironment.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / MainTwigEnvironment

    - MainTwigEnvironment class: + MainTwigEnvironment class:

    @@ -55,7 +55,7 @@ final class MainTwigEnvironment ```php -public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Renderer\Twig\MainExtension $mainExtension); +public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Renderer\Twig\MainExtension $mainExtension, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher); ``` @@ -80,19 +80,17 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf $mainExtension \BumbleDocGen\Core\Renderer\Twig\MainExtension - + + + $pluginEventDispatcher + \BumbleDocGen\Core\Plugin\PluginEventDispatcher + - -Throws: - -

    @@ -100,7 +98,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php @@ -147,6 +145,9 @@ public function render(mixed $name, array $context = [ ]): string;
  • \Twig\Error\LoaderError
  • +
  • + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • +
    diff --git a/docs/tech/classes/OnCreateDocumentedEntityWrapper.md b/docs/tech/classes/OnCreateDocumentedEntityWrapper.md new file mode 100644 index 00000000..7490327c --- /dev/null +++ b/docs/tech/classes/OnCreateDocumentedEntityWrapper.md @@ -0,0 +1,160 @@ + + BumbleDocGen / Technical description of the project / Class map / OnCreateDocumentedEntityWrapper
    + +

    + OnCreateDocumentedEntityWrapper class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Plugin\Event\Renderer; + +final class OnCreateDocumentedEntityWrapper extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface +``` + +
    The event occurs when an entity is added to the list for documentation
    + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + getDocumentedEntityWrapper +
    2. +
    3. + isPropagationStopped + - Is propagation stopped?
    4. +
    5. + stopPropagation + - Stops the propagation of the event to further event listeners.
    6. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper $documentedEntityWrapper); +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $documentedEntityWrapper\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper-
    + + + +
    +
    +
    + + + +```php +public function getDocumentedEntityWrapper(): \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function isPropagationStopped(): bool; +``` + +
    Is propagation stopped?
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function stopPropagation(): void; +``` + +
    Stops the propagation of the event to further event listeners.
    + +Parameters: not specified + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/OnGetProjectTemplatesDirs.md b/docs/tech/classes/OnGetProjectTemplatesDirs.md new file mode 100644 index 00000000..dc32725c --- /dev/null +++ b/docs/tech/classes/OnGetProjectTemplatesDirs.md @@ -0,0 +1,201 @@ + + BumbleDocGen / Technical description of the project / Class map / OnGetProjectTemplatesDirs
    + +

    + OnGetProjectTemplatesDirs class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Plugin\Event\Renderer; + +final class OnGetProjectTemplatesDirs extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface +``` + +
    This event occurs when all directories containing document templates are retrieved
    + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + addTemplatesDir +
    2. +
    3. + getTemplatesDirs +
    4. +
    5. + isPropagationStopped + - Is propagation stopped?
    6. +
    7. + stopPropagation + - Stops the propagation of the event to further event listeners.
    8. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(array $templatesDirs); +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $templatesDirsarray-
    + + + +
    +
    +
    + + + +```php +public function addTemplatesDir(string $dirName): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $dirNamestring-
    + +Return value: void + + +
    +
    +
    + + + +```php +public function getTemplatesDirs(): array; +``` + + + +Parameters: not specified + +Return value: array + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function isPropagationStopped(): bool; +``` + +
    Is propagation stopped?
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function stopPropagation(): void; +``` + +
    Stops the propagation of the event to further event listeners.
    + +Parameters: not specified + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/OnGetTemplatePathByRelativeDocPath.md b/docs/tech/classes/OnGetTemplatePathByRelativeDocPath.md new file mode 100644 index 00000000..482c6d64 --- /dev/null +++ b/docs/tech/classes/OnGetTemplatePathByRelativeDocPath.md @@ -0,0 +1,225 @@ + + BumbleDocGen / Technical description of the project / Class map / OnGetTemplatePathByRelativeDocPath
    + +

    + OnGetTemplatePathByRelativeDocPath class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Plugin\Event\Renderer; + +final class OnGetTemplatePathByRelativeDocPath extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface +``` + +
    The event occurs when the path to the template file is obtained relative to the path to the document
    + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + getCustomTemplateFilePath +
    2. +
    3. + getTemplateName +
    4. +
    5. + isPropagationStopped + - Is propagation stopped?
    6. +
    7. + setCustomTemplateFilePath +
    8. +
    9. + stopPropagation + - Stops the propagation of the event to further event listeners.
    10. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(string $templateName); +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $templateNamestring-
    + + + +
    +
    +
    + + + +```php +public function getCustomTemplateFilePath(): string|null; +``` + + + +Parameters: not specified + +Return value: string | null + + +
    +
    +
    + + + +```php +public function getTemplateName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function isPropagationStopped(): bool; +``` + +
    Is propagation stopped?
    + +Parameters: not specified + +Return value: bool + + +
    +
    +
    + + + +```php +public function setCustomTemplateFilePath(string|null $customTemplateFilePath): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $customTemplateFilePathstring | null-
    + +Return value: void + + +
    +
    +
    + + + +```php +// Implemented in Symfony\Contracts\EventDispatcher\Event + +public function stopPropagation(): void; +``` + +
    Stops the propagation of the event to further event listeners.
    + +Parameters: not specified + +Return value: void + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/OnGettingResourceLink.md b/docs/tech/classes/OnGettingResourceLink.md index e8c8d7e3..2b6178f0 100644 --- a/docs/tech/classes/OnGettingResourceLink.md +++ b/docs/tech/classes/OnGettingResourceLink.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / OnGettingResourceLink

    - OnGettingResourceLink class: + OnGettingResourceLink class:

    @@ -15,7 +15,7 @@ namespace BumbleDocGen\Core\Plugin\Event\Renderer; final class OnGettingResourceLink extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface ``` -
    Event is the base class for classes containing event data.
    +
    Event occurs when a reference to an entity (resource) is received
    @@ -63,7 +63,7 @@ final class OnGettingResourceLink extends \Symfony\Contracts\EventDispatcher\Eve ```php @@ -100,7 +100,7 @@ public function __construct(string $resourceName); ```php @@ -121,7 +121,7 @@ public function getResourceName(): string; ```php @@ -165,7 +165,7 @@ public function isPropagationStopped(): bool; ```php diff --git a/docs/tech/classes/Renderer.md b/docs/tech/classes/Renderer.md index 2c62f449..093db9ac 100644 --- a/docs/tech/classes/Renderer.md +++ b/docs/tech/classes/Renderer.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / Renderer

    - Renderer class: + Renderer class:

    @@ -59,7 +59,7 @@ See: ```php @@ -136,7 +136,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf ```php diff --git a/docs/tech/classes/RendererIteratorFactory.md b/docs/tech/classes/RendererIteratorFactory.md index 5ca58c0c..31821e94 100644 --- a/docs/tech/classes/RendererIteratorFactory.md +++ b/docs/tech/classes/RendererIteratorFactory.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / RendererIteratorFactory

    - RendererIteratorFactory class: + RendererIteratorFactory class:

    @@ -57,11 +57,11 @@ final class RendererIteratorFactory ```php -public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrappersCollection $documentedEntityWrappersCollection, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Configuration\ConfigurationParameterBag $configurationParameterBag, \BumbleDocGen\Core\Cache\SharedCompressedDocumentFileCache $sharedCompressedDocumentFileCache, \BumbleDocGen\Core\Renderer\RendererHelper $rendererHelper, \BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyFactory $dependencyFactory, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \Symfony\Component\Console\Style\OutputStyle $io, \Monolog\Logger $logger); +public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrappersCollection $documentedEntityWrappersCollection, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Configuration\ConfigurationParameterBag $configurationParameterBag, \BumbleDocGen\Core\Cache\SharedCompressedDocumentFileCache $sharedCompressedDocumentFileCache, \BumbleDocGen\Core\Renderer\RendererHelper $rendererHelper, \BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyFactory $dependencyFactory, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Console\ProgressBar\ProgressBarFactory $progressBarFactory, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher, \Symfony\Component\Console\Style\OutputStyle $io, \Monolog\Logger $logger); ``` @@ -126,6 +126,11 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $progressBarFactory \BumbleDocGen\Console\ProgressBar\ProgressBarFactory - + + + $pluginEventDispatcher + \BumbleDocGen\Core\Plugin\PluginEventDispatcher + - $io @@ -149,7 +154,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext ```php @@ -177,7 +182,7 @@ public function getDocumentedEntityWrappersWithOutdatedCache(): \Generator; ```php @@ -205,7 +210,7 @@ public function getFilesToRemove(): \Generator; ```php diff --git a/docs/tech/classes/TemplateFile.md b/docs/tech/classes/TemplateFile.md new file mode 100644 index 00000000..37062ca4 --- /dev/null +++ b/docs/tech/classes/TemplateFile.md @@ -0,0 +1,359 @@ + + BumbleDocGen / Technical description of the project / Class map / TemplateFile
    + +

    + TemplateFile class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Renderer; + +final class TemplateFile +``` + + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    3. + create +
    4. +
    + +

    Methods:

    + +
      +
    1. + getRealPath +
    2. +
    3. + getRelativeDocPath +
    4. +
    5. + getRelativeDocPathByTemplatePath +
    6. +
    7. + getRelativeTemplatePath +
    8. +
    9. + getTemplatePathByRelativeDocPath +
    10. +
    11. + isTemplate +
    12. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(string $realPath, string $relativeDocPath); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $realPathstring-
    $relativeDocPathstring-
    + + + +
    +
    +
    + + + +```php +public static function create(\Symfony\Component\Finder\SplFileInfo $fileInfo, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher): self; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $fileInfoSymfony\Component\Finder\SplFileInfo-
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    + +Return value: self + + +Throws: + + +
    +
    +
    + + + +```php +public function getRealPath(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function getRelativeDocPath(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public static function getRelativeDocPathByTemplatePath(string $templatePath, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $templatePathstring-
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function getRelativeTemplatePath(): string|null; +``` + + + +Parameters: not specified + +Return value: string | null + + +
    +
    +
    + + + +```php +public static function getTemplatePathByRelativeDocPath(string $relativeDocPath, \BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $relativeDocPathstring-
    $configuration\BumbleDocGen\Core\Configuration\Configuration-
    $pluginEventDispatcher\BumbleDocGen\Core\Plugin\PluginEventDispatcher-
    + +Return value: string + + +Throws: + + +
    +
    +
    + + + +```php +public function isTemplate(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/map.md b/docs/tech/map.md index b1fef760..a064a2e9 100644 --- a/docs/tech/map.md +++ b/docs/tech/map.md @@ -67,6 +67,7 @@ Directory layout ( only documented files shown ): │ │ │ │ │ ├── FalseCondition.php — False conditions, any object is not available │ │ │ │ │ ├── FileTextContainsCondition.php — Checking if a file contains a substring │ │ │ │ │ ├── LocatedInCondition.php — Checking the existence of an entity in the specified directories +│ │ │ │ │ ├── LocatedNotInCondition.php — Checking the existence of an entity not in the specified directories │ │ │ │ │ └── TrueCondition.php — True conditions, any object is available │ │ │ │ ├── ConditionGroup.php — Filter condition to group other filter conditions. A group can have an OR/AND condition test; In ... │ │ │ │ ├── ConditionGroupTypeEnum.php @@ -92,8 +93,14 @@ Directory layout ( only documented files shown ): │ │ │ │ ├──Parser/ │ │ │ │ │ └── OnLoadSourceLocatorsCollection.php — Called when source locators are loaded │ │ │ │ └──Renderer/ +│ │ │ │ │ ├── AfterRenderingEntities.php — Event is the base class for classes containing event data. │ │ │ │ │ ├── BeforeCreatingDocFile.php — Called before the content of the documentation document is saved to a file -│ │ │ │ │ ├── OnGettingResourceLink.php — Event is the base class for classes containing event data. +│ │ │ │ │ ├── BeforeRenderingDocFiles.php — The event occurs before the main documents begin rendering +│ │ │ │ │ ├── BeforeRenderingEntities.php — The event occurs before the rendering of entity documents begins, after the main documents have b... +│ │ │ │ │ ├── OnCreateDocumentedEntityWrapper.php — The event occurs when an entity is added to the list for documentation +│ │ │ │ │ ├── OnGetProjectTemplatesDirs.php — This event occurs when all directories containing document templates are retrieved +│ │ │ │ │ ├── OnGetTemplatePathByRelativeDocPath.php — The event occurs when the path to the template file is obtained relative to the path to the document +│ │ │ │ │ ├── OnGettingResourceLink.php — Event occurs when a reference to an entity (resource) is received │ │ │ │ │ └── OnLoadEntityDocPluginContent.php — Called when entity documentation is generated (plugin content loading) │ │ │ ├── OnlySingleExecutionEvent.php │ │ │ ├── PluginEventDispatcher.php — The EventDispatcherInterface is the central point of Symfony's event listener system. @@ -148,7 +155,8 @@ Directory layout ( only documented files shown ): │ │ │ │ └── MainTwigEnvironment.php │ │ │ ├── Renderer.php — Generates and processes files from directory TemplatesDir saving them to directory OutputDir │ │ │ ├── RendererHelper.php -│ │ │ └── RendererIteratorFactory.php +│ │ │ ├── RendererIteratorFactory.php +│ │ │ └── TemplateFile.php │ ├──LanguageHandler/ │ │ ├──Php/ │ │ │ ├──Parser/ @@ -199,7 +207,7 @@ Directory layout ( only documented files shown ): │ │ │ │ └── ParserHelper.php │ │ │ ├──Plugin/ │ │ │ │ ├──CorePlugin/ -│ │ │ │ │ └──BasePhpStubber/ +│ │ │ │ │ ├──BasePhpStubber/ │ │ │ │ │ │ ├── BasePhpStubberPlugin.php — Adding links to type documentation and documentation of built-in PHP classes │ │ │ │ │ │ ├── ComposerStubberPlugin.php — Adding links to the documentation of PHP classes in the \Composer namespace │ │ │ │ │ │ ├── PhpDocumentorStubberPlugin.php — Adding links to the documentation of PHP classes in the \phpDocumentor namespace @@ -207,6 +215,8 @@ Directory layout ( only documented files shown ): │ │ │ │ │ │ ├── PsrClassesStubberPlugin.php — Adding links to the documentation of PHP classes in the \Psr namespace │ │ │ │ │ │ ├── SymfonyComponentStubberPlugin.php — Adding links to the documentation of PHP classes in the \Symfony\Component namespace │ │ │ │ │ │ └── TwigStubberPlugin.php — Adding links to the documentation of PHP classes in the \Twig namespace +│ │ │ │ │ └──EntityDocUnifiedPlace/ +│ │ │ │ │ │ └── EntityDocUnifiedPlacePlugin.php — This plugin changes the algorithm for saving entity documents. The standard system stores each fi... │ │ │ │ └──Event/ │ │ │ │ │ ├──Entity/ │ │ │ │ │ │ └── OnCheckIsClassEntityCanBeLoad.php — Event is the base class for classes containing event data. @@ -238,4 +248,4 @@ Directory layout ( only documented files shown ):

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Mon Oct 16 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/readme.md b/docs/tech/readme.md index 28e36af4..f081314e 100644 --- a/docs/tech/readme.md +++ b/docs/tech/readme.md @@ -44,4 +44,4 @@ After that, the process of parsing the project code according to the configurati

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Oct 5 17:42:06 2023 +0300
    Page content update date: Fri Oct 06 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Oct 5 17:42:06 2023 +0300
    Page content update date: Sun Oct 15 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/selfdoc/templates/tech/3.renderer/templates.md.twig b/selfdoc/templates/tech/3.renderer/01_templates.md.twig similarity index 100% rename from selfdoc/templates/tech/3.renderer/templates.md.twig rename to selfdoc/templates/tech/3.renderer/01_templates.md.twig diff --git a/selfdoc/templates/tech/3.renderer/breadcrumbs.md.twig b/selfdoc/templates/tech/3.renderer/02_breadcrumbs.md.twig similarity index 100% rename from selfdoc/templates/tech/3.renderer/breadcrumbs.md.twig rename to selfdoc/templates/tech/3.renderer/02_breadcrumbs.md.twig diff --git a/selfdoc/templates/tech/3.renderer/03_documentStructure.md.twig b/selfdoc/templates/tech/3.renderer/03_documentStructure.md.twig new file mode 100644 index 00000000..e5047268 --- /dev/null +++ b/selfdoc/templates/tech/3.renderer/03_documentStructure.md.twig @@ -0,0 +1,19 @@ +{% set title = 'Document structure of generated entities' %} +{% set prevPage = 'Renderer' %} +{{ generatePageBreadcrumbs(title, _self) }} + +{{ "Document structure of generated entities" | textToHeading('H1') }} + +*By default, the documentation generator offers two options for organizing the structure of generated entity documents:* + +1) The standard structure is an entity document next to a parent document. If the document template contained +a link to the entity documentation, during the documentation generation process we created a classes directory +in the same directory where the parent document was located, and inside this classes directory we created an entity document. + +2) All entity documents are located in a separate directory with the structure of the entire documented project. **At the moment this is only available for PHP projects** + +To enable the second option, you need to connect the built-in plugin: +```yaml +plugins: + - class: \BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\EntityDocUnifiedPlace\EntityDocUnifiedPlacePlugin +``` diff --git a/selfdoc/templates/tech/3.renderer/twigCustomFilters.md.twig b/selfdoc/templates/tech/3.renderer/04_twigCustomFilters.md.twig similarity index 100% rename from selfdoc/templates/tech/3.renderer/twigCustomFilters.md.twig rename to selfdoc/templates/tech/3.renderer/04_twigCustomFilters.md.twig diff --git a/selfdoc/templates/tech/3.renderer/twigCustomFunctions.md.twig b/selfdoc/templates/tech/3.renderer/05_twigCustomFunctions.md.twig similarity index 100% rename from selfdoc/templates/tech/3.renderer/twigCustomFunctions.md.twig rename to selfdoc/templates/tech/3.renderer/05_twigCustomFunctions.md.twig diff --git a/src/Core/Parser/FilterCondition/CommonFilterCondition/LocatedInCondition.php b/src/Core/Parser/FilterCondition/CommonFilterCondition/LocatedInCondition.php index 568a8d6c..2e019196 100644 --- a/src/Core/Parser/FilterCondition/CommonFilterCondition/LocatedInCondition.php +++ b/src/Core/Parser/FilterCondition/CommonFilterCondition/LocatedInCondition.php @@ -28,6 +28,9 @@ public function __construct( public function canAddToCollection(EntityInterface $entity): bool { $fileName = $entity->getAbsoluteFileName(); + if (!$fileName) { + return false; + } foreach ($this->directories as $directory) { $directory = $this->parameterBag->resolveValue($directory); if (!str_starts_with($directory, DIRECTORY_SEPARATOR)) { diff --git a/src/Core/Parser/FilterCondition/CommonFilterCondition/LocatedNotInCondition.php b/src/Core/Parser/FilterCondition/CommonFilterCondition/LocatedNotInCondition.php new file mode 100644 index 00000000..e35f72e0 --- /dev/null +++ b/src/Core/Parser/FilterCondition/CommonFilterCondition/LocatedNotInCondition.php @@ -0,0 +1,46 @@ +getAbsoluteFileName(); + if (!$fileName) { + return false; + } + foreach ($this->directories as $directory) { + $directory = $this->parameterBag->resolveValue($directory); + if (!str_starts_with($directory, DIRECTORY_SEPARATOR)) { + $directory = rtrim($this->configuration->getProjectRoot(), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $directory; + } + $directory = realpath($directory); + if (!$directory || str_starts_with($fileName, $directory)) { + return false; + } + } + return true; + } +} diff --git a/src/Core/Plugin/CorePlugin/LastPageCommitter/LastPageCommitter.php b/src/Core/Plugin/CorePlugin/LastPageCommitter/LastPageCommitter.php index a39b2ba6..994a192a 100644 --- a/src/Core/Plugin/CorePlugin/LastPageCommitter/LastPageCommitter.php +++ b/src/Core/Plugin/CorePlugin/LastPageCommitter/LastPageCommitter.php @@ -5,7 +5,6 @@ namespace BumbleDocGen\Core\Plugin\CorePlugin\LastPageCommitter; use BumbleDocGen\Core\Configuration\Configuration; -use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile; use BumbleDocGen\Core\Plugin\PluginInterface; use BumbleDocGen\Core\Renderer\Context\RendererContext; @@ -28,26 +27,27 @@ public static function getSubscribedEvents(): array ]; } - /** - * @throws InvalidConfigurationParameterException - */ final public function beforeCreatingDocFile(BeforeCreatingDocFile $event): void { - $gitClientPath = $this->configuration->getGitClientPath(); - $filePath = str_replace( - "{$this->configuration->getProjectRoot()}/", - '', - "{$this->configuration->getTemplatesDir()}{$this->context->getCurrentTemplateFilePatch()}" - ); - exec("{$gitClientPath} log --no-merges -1 {$filePath}", $output); - - $content = $event->getContent(); - if (isset($output[2]) && str_contains($output[2], 'Date: ')) { - $author = str_replace('Author:', 'Last page committer:', htmlspecialchars($output[1])); - $date = str_replace('Date:', 'Last modified date:', $output[2]); - $contentRegenerationDate = 'Page content update date: ' . date('D M d Y'); - $content .= "\n\n
    \n
    \n{$author}
    {$date}
    {$contentRegenerationDate}
    Made with Bumble Documentation Generator
    "; + try { + $gitClientPath = $this->configuration->getGitClientPath(); + $filePath = str_replace( + "{$this->configuration->getProjectRoot()}/", + '', + "{$this->configuration->getTemplatesDir()}{$this->context->getCurrentTemplateFilePatch()}" + ); + + exec("{$gitClientPath} log --no-merges -1 {$filePath} 2>/dev/null", $output); + + $content = $event->getContent(); + if (isset($output[2]) && str_contains($output[2], 'Date: ')) { + $author = str_replace('Author:', 'Last page committer:', htmlspecialchars($output[1])); + $date = str_replace('Date:', 'Last modified date:', $output[2]); + $contentRegenerationDate = 'Page content update date: ' . date('D M d Y'); + $content .= "\n\n
    \n
    \n{$author}
    {$date}
    {$contentRegenerationDate}
    Made with Bumble Documentation Generator
    "; + } + $event->setContent($content); + } catch (\Exception) { } - $event->setContent($content); } } diff --git a/src/Core/Plugin/Event/Renderer/AfterRenderingEntities.php b/src/Core/Plugin/Event/Renderer/AfterRenderingEntities.php new file mode 100644 index 00000000..e34cfdc4 --- /dev/null +++ b/src/Core/Plugin/Event/Renderer/AfterRenderingEntities.php @@ -0,0 +1,11 @@ +documentedEntityWrapper; + } +} diff --git a/src/Core/Plugin/Event/Renderer/OnGetProjectTemplatesDirs.php b/src/Core/Plugin/Event/Renderer/OnGetProjectTemplatesDirs.php new file mode 100644 index 00000000..dcd059b1 --- /dev/null +++ b/src/Core/Plugin/Event/Renderer/OnGetProjectTemplatesDirs.php @@ -0,0 +1,27 @@ +templatesDirs; + } + + public function addTemplatesDir(string $dirName): void + { + $this->templatesDirs[] = $dirName; + } +} diff --git a/src/Core/Plugin/Event/Renderer/OnGetTemplatePathByRelativeDocPath.php b/src/Core/Plugin/Event/Renderer/OnGetTemplatePathByRelativeDocPath.php new file mode 100644 index 00000000..322a3358 --- /dev/null +++ b/src/Core/Plugin/Event/Renderer/OnGetTemplatePathByRelativeDocPath.php @@ -0,0 +1,34 @@ +templateName; + } + + public function setCustomTemplateFilePath(?string $customTemplateFilePath): void + { + $this->customTemplateFilePath = $customTemplateFilePath; + } + + public function getCustomTemplateFilePath(): ?string + { + return $this->customTemplateFilePath; + } +} diff --git a/src/Core/Plugin/Event/Renderer/OnGettingResourceLink.php b/src/Core/Plugin/Event/Renderer/OnGettingResourceLink.php index d303603c..4c6c6cf7 100644 --- a/src/Core/Plugin/Event/Renderer/OnGettingResourceLink.php +++ b/src/Core/Plugin/Event/Renderer/OnGettingResourceLink.php @@ -6,6 +6,9 @@ use Symfony\Contracts\EventDispatcher\Event; +/** + * Event occurs when a reference to an entity (resource) is received + */ final class OnGettingResourceLink extends Event { private ?string $resourceUrl = null; diff --git a/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php b/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php index aa43054b..1d762c22 100644 --- a/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php +++ b/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php @@ -8,6 +8,9 @@ use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; +use BumbleDocGen\Core\Plugin\Event\Renderer\OnGetProjectTemplatesDirs; +use BumbleDocGen\Core\Plugin\PluginEventDispatcher; +use BumbleDocGen\Core\Renderer\TemplateFile; use DI\DependencyException; use DI\NotFoundException; use Symfony\Component\Finder\Finder; @@ -34,6 +37,7 @@ public function __construct( private Configuration $configuration, private LocalObjectCache $localObjectCache, private BreadcrumbsTwigEnvironment $breadcrumbsTwig, + private PluginEventDispatcher $pluginEventDispatcher, private string $prevPageNameTemplate = self::DEFAULT_PREV_PAGE_NAME_TEMPLATE ) { } @@ -43,20 +47,19 @@ public function __construct( */ private function loadTemplateContent(string $templateName): string { - $outputDir = $this->configuration->getTemplatesDir(); - $filePath = "{$outputDir}{$templateName}"; - if (!str_ends_with($filePath, '.twig')) { - $templateName .= '.twig'; - return $this->loadTemplateContent($templateName); - } + $filePath = TemplateFile::getTemplatePathByRelativeDocPath( + $templateName, + $this->configuration, + $this->pluginEventDispatcher + ); try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, $templateName); + return $this->localObjectCache->getMethodCachedResult(__METHOD__, $filePath); } catch (ObjectNotFoundException) { } $templateContent = file_get_contents($filePath) ?: ''; - $this->localObjectCache->cacheMethodResult(__METHOD__, $templateName, $templateContent); + $this->localObjectCache->cacheMethodResult(__METHOD__, $filePath, $templateContent); return $templateContent; } @@ -180,19 +183,22 @@ public function getBreadcrumbs(string $filePatch, bool $fromCurrent = true): arr * @throws DependencyException * @throws InvalidConfigurationParameterException */ - public function getBreadcrumbsForTemplates(string $templateFilePatch, bool $fromCurrent = true): array + public function getBreadcrumbsForTemplates(string $filePatch, bool $fromCurrent = true): array { $breadcrumbs = []; - $filePatch = $templateFilePatch; do { - $filePatch = str_replace('.twig', '', $filePatch); if (!$fromCurrent) { $fromCurrent = true; continue; } - $templateFilePatch = "{$this->configuration->getTemplatesDir()}{$filePatch}"; + $filePatch = str_replace('.twig', '', $filePatch); + $templateFilePatch = TemplateFile::getTemplatePathByRelativeDocPath( + $filePatch, + $this->configuration, + $this->pluginEventDispatcher + ); $breadcrumbs[] = [ - 'template' => "$templateFilePatch.twig", + 'template' => $templateFilePatch, 'title' => $this->getTemplateTitle($filePatch), ]; } while ($filePatch = $this->getPrevPage($filePatch)); @@ -212,6 +218,8 @@ public function getAllPageLinks(): array } $pageLinks = []; $templatesDir = $this->configuration->getTemplatesDir(); + $event = $this->pluginEventDispatcher->dispatch(new OnGetProjectTemplatesDirs([$templatesDir])); + $templatesDirs = $event->getTemplatesDirs(); $addLinkKey = function (string $key, $value) use (&$pageLinks) { $pageLinks[$key] = $value; @@ -225,15 +233,15 @@ public function getAllPageLinks(): array } }; - /**@var \SplFileInfo[] $allFiles */ - $allFiles = new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator( - $templatesDir, - \FilesystemIterator::SKIP_DOTS - ) - ); - foreach ($allFiles as $file) { - $filePatch = str_replace($templatesDir, '', $file->getRealPath()); + $finder = Finder::create() + ->ignoreVCS(true) + ->ignoreDotFiles(true) + ->ignoreUnreadableDirs() + ->sortByName() + ->in($event->getTemplatesDirs()); + + foreach ($finder->files() as $file) { + $filePatch = str_replace($templatesDirs, '', $file->getRealPath()); if (!str_ends_with($filePatch, '.twig')) { continue; } diff --git a/src/Core/Renderer/Context/Dependency/FileDependency.php b/src/Core/Renderer/Context/Dependency/FileDependency.php index 0af60376..f1a1e3c8 100644 --- a/src/Core/Renderer/Context/Dependency/FileDependency.php +++ b/src/Core/Renderer/Context/Dependency/FileDependency.php @@ -70,10 +70,15 @@ public function isChanged(RendererHelper $rendererHelper): bool $fileName = $rendererHelper->fileInternalLinkToFilePath($this->fileInternalLink); $newHash = ''; if ($this->contentFilterRegex && $this->matchIndex) { + $fileContent = @file_get_contents($fileName); + if (!$fileContent) { + return true; + } + if ( preg_match( $this->contentFilterRegex, - file_get_contents($fileName), + $fileContent, $matches ) && isset($matches[$this->matchIndex]) diff --git a/src/Core/Renderer/Context/DocumentedEntityWrapper.php b/src/Core/Renderer/Context/DocumentedEntityWrapper.php index 51e0cb9e..0f13d6a7 100644 --- a/src/Core/Renderer/Context/DocumentedEntityWrapper.php +++ b/src/Core/Renderer/Context/DocumentedEntityWrapper.php @@ -15,12 +15,12 @@ final class DocumentedEntityWrapper { /** * @param DocumentTransformableEntityInterface $documentTransformableEntity An entity that is allowed to be documented - * @param string $initiatorFilePath The file in which the documentation of the entity was requested + * @param string $parentDocFilePath The file in which the documentation of the entity was requested */ public function __construct( private DocumentTransformableEntityInterface $documentTransformableEntity, private LocalObjectCache $localObjectCache, - private string $initiatorFilePath + private string $parentDocFilePath ) { } @@ -34,7 +34,7 @@ public function getDocRender(): EntityDocRendererInterface */ public function getKey(): string { - return md5("{$this->documentTransformableEntity->getName()}{$this->initiatorFilePath}"); + return md5("{$this->documentTransformableEntity->getName()}{$this->getParentDocFilePath()}"); } public function getEntityName(): string @@ -52,7 +52,7 @@ private function getUniqueFileName(): string } $usedKeysCounter ??= []; $fileName = $this->documentTransformableEntity->getShortName(); - $initiatorFileDir = dirname($this->initiatorFilePath); + $initiatorFileDir = dirname($this->getParentDocFilePath()); $counterKey = "{$initiatorFileDir}{$fileName}"; if (!isset($usedKeysCounter[$counterKey])) { @@ -87,14 +87,19 @@ public function getDocumentTransformableEntity(): DocumentTransformableEntityInt */ public function getDocUrl(): string { - $pathParts = explode('/', $this->initiatorFilePath); + $pathParts = explode('/', $this->getParentDocFilePath()); array_pop($pathParts); $path = implode('/', $pathParts); return "{$path}/{$this->getDocRender()->getDocFileNamespace()}/{$this->getFileName()}"; } - public function getInitiatorFilePath(): string + public function getParentDocFilePath(): string { - return $this->initiatorFilePath; + return $this->parentDocFilePath; + } + + public function setParentDocFilePath(string $parentDocFilePath): void + { + $this->parentDocFilePath = $parentDocFilePath; } } diff --git a/src/Core/Renderer/Context/DocumentedEntityWrappersCollection.php b/src/Core/Renderer/Context/DocumentedEntityWrappersCollection.php index 75cd0630..2e681a0b 100644 --- a/src/Core/Renderer/Context/DocumentedEntityWrappersCollection.php +++ b/src/Core/Renderer/Context/DocumentedEntityWrappersCollection.php @@ -6,6 +6,8 @@ use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache; use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; +use BumbleDocGen\Core\Plugin\Event\Renderer\OnCreateDocumentedEntityWrapper; +use BumbleDocGen\Core\Plugin\PluginEventDispatcher; final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \Countable { @@ -16,7 +18,8 @@ final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \C public function __construct( private RendererContext $rendererContext, - private LocalObjectCache $localObjectCache + private LocalObjectCache $localObjectCache, + private PluginEventDispatcher $pluginEventDispatcher ) { } @@ -38,6 +41,8 @@ public function createAndAddDocumentedEntityWrapper(RootEntityInterface $rootEnt $this->rendererContext->getCurrentTemplateFilePatch() ); + $this->pluginEventDispatcher->dispatch(new OnCreateDocumentedEntityWrapper($documentedEntity)); + $parentEntityName = $this->rendererContext->getCurrentDocumentedEntityWrapper()?->getEntityName(); $this->documentedEntitiesRelations[$this->rendererContext->getCurrentTemplateFilePatch()][$parentEntityName][$documentedEntity->getEntityName()] = [ 'entity_name' => $documentedEntity->getEntityName(), diff --git a/src/Core/Renderer/Context/RendererContext.php b/src/Core/Renderer/Context/RendererContext.php index 5856078a..18a836d9 100644 --- a/src/Core/Renderer/Context/RendererContext.php +++ b/src/Core/Renderer/Context/RendererContext.php @@ -37,7 +37,7 @@ public function getCurrentTemplateFilePatch(): string public function setCurrentDocumentedEntityWrapper(DocumentedEntityWrapper $currentDocumentedEntityWrapper): void { $this->currentDocumentedEntityWrapper = $currentDocumentedEntityWrapper; - $this->setCurrentTemplateFilePatch($currentDocumentedEntityWrapper->getInitiatorFilePath()); + $this->setCurrentTemplateFilePatch($currentDocumentedEntityWrapper->getParentDocFilePath()); } public function getCurrentDocumentedEntityWrapper(): ?DocumentedEntityWrapper diff --git a/src/Core/Renderer/Renderer.php b/src/Core/Renderer/Renderer.php index b4551e50..5fa7c683 100644 --- a/src/Core/Renderer/Renderer.php +++ b/src/Core/Renderer/Renderer.php @@ -8,7 +8,10 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; +use BumbleDocGen\Core\Plugin\Event\Renderer\AfterRenderingEntities; use BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile; +use BumbleDocGen\Core\Plugin\Event\Renderer\BeforeRenderingDocFiles; +use BumbleDocGen\Core\Plugin\Event\Renderer\BeforeRenderingEntities; use BumbleDocGen\Core\Plugin\PluginEventDispatcher; use BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper; use BumbleDocGen\Core\Renderer\Context\RendererContext; @@ -56,7 +59,6 @@ public function __construct( */ public function run(): void { - $templateFolder = $this->configuration->getTemplatesDir(); $outputDir = $this->configuration->getOutputDir(); $templateParams = []; @@ -64,24 +66,21 @@ public function run(): void $templateParams[$collectionName] = $rootEntityCollection; } - foreach ($this->renderIteratorFactory->getTemplatesWithOutdatedCache() as $templateFile) { - /**@var \SplFileInfo $templateFile */ - $filePatch = str_replace($templateFolder, '', $templateFile->getRealPath()); + $this->pluginEventDispatcher->dispatch(new BeforeRenderingDocFiles()); - if (str_ends_with($filePatch, '.twig')) { - $this->rendererContext->setCurrentTemplateFilePatch($filePatch); - $content = $this->twig->render($filePatch, $templateParams); + foreach ($this->renderIteratorFactory->getTemplatesWithOutdatedCache() as $templateFile) { + if ($templateFile->isTemplate()) { + $this->rendererContext->setCurrentTemplateFilePatch($templateFile->getRelativeTemplatePath()); + $content = $this->twig->render($templateFile->getRelativeTemplatePath(), $templateParams); $content = $this->pluginEventDispatcher->dispatch( new BeforeCreatingDocFile($content, $this->rendererContext) )->getContent(); - - $filePatch = str_replace('.twig', '', $filePatch); } else { $content = file_get_contents($templateFile->getRealPath()); } - $filePatch = "{$outputDir}{$filePatch}"; + $filePatch = "{$outputDir}{$templateFile->getRelativeDocPath()}"; $newDirName = dirname($filePatch); if (!is_dir($newDirName)) { $this->fs->mkdir($newDirName, 0755); @@ -90,6 +89,8 @@ public function run(): void $this->logger->info("Saving `{$filePatch}`"); } + $this->pluginEventDispatcher->dispatch(new BeforeRenderingEntities()); + foreach ($this->renderIteratorFactory->getDocumentedEntityWrappersWithOutdatedCache() as $entityWrapper) { /** @var DocumentedEntityWrapper $entityWrapper */ @@ -108,9 +109,15 @@ public function run(): void $this->logger->info("Saving `{$filePatch}`"); } + $this->pluginEventDispatcher->dispatch(new AfterRenderingEntities()); + foreach ($this->renderIteratorFactory->getFilesToRemove() as $file) { + if (!$file->isWritable()) { + continue; + } + $type = $file->getType(); $this->fs->remove($file->getPathname()); - $this->logger->info("Removing `{$file->getPathname()}` file"); + $this->logger->info("Removing `{$file->getPathname()}` {$type}"); } $this->rootEntityCollectionsGroup->updateAllEntitiesCache(); diff --git a/src/Core/Renderer/RendererIteratorFactory.php b/src/Core/Renderer/RendererIteratorFactory.php index 65332edd..cd012551 100644 --- a/src/Core/Renderer/RendererIteratorFactory.php +++ b/src/Core/Renderer/RendererIteratorFactory.php @@ -12,6 +12,8 @@ use BumbleDocGen\Core\Configuration\ConfigurationParameterBag; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; +use BumbleDocGen\Core\Plugin\Event\Renderer\OnGetProjectTemplatesDirs; +use BumbleDocGen\Core\Plugin\PluginEventDispatcher; use BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyFactory; use BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper; use BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrappersCollection; @@ -37,6 +39,7 @@ public function __construct( private RendererDependencyFactory $dependencyFactory, private LocalObjectCache $localObjectCache, private ProgressBarFactory $progressBarFactory, + private PluginEventDispatcher $pluginEventDispatcher, private OutputStyle $io, private Logger $logger, ) { @@ -50,9 +53,11 @@ public function getTemplatesWithOutdatedCache(): \Generator $pb = $this->progressBarFactory->createStylizedProgressBar(); $pb->setName('Generating main documentation pages'); - $templateFolder = $this->configuration->getTemplatesDir(); + $templatesDir = $this->configuration->getTemplatesDir(); + $event = $this->pluginEventDispatcher->dispatch(new OnGetProjectTemplatesDirs([$templatesDir])); + $templatesDirs = $event->getTemplatesDirs(); $finder = Finder::create() - ->in($templateFolder) + ->in($templatesDirs) ->ignoreDotFiles(true) ->ignoreVCSIgnored(true) ->reverseSorting() @@ -61,58 +66,75 @@ public function getTemplatesWithOutdatedCache(): \Generator $skippedCount = 0; foreach ($pb->iterate($finder) as $templateFile) { - $templateFileName = str_replace($templateFolder, '', $templateFile->getRealPath()); - $pb->setStepDescription("Processing {$templateFileName} file"); - $this->rendererContext->clearDependencies(); - $this->rootEntityCollectionsGroup->clearOperationsLog(); - - $this->rendererContext->setCurrentTemplateFilePatch($templateFileName); - $fileDependency = $this->dependencyFactory->createFileDependency( - filePath: $templateFile->getRealPath() + $templateFile = TemplateFile::create( + $templateFile, + $this->configuration, + $this->pluginEventDispatcher ); - $this->rendererContext->addDependency($fileDependency); - - $this->markFileNameAsRendered($templateFileName); + $pb->setStepDescription("Processing {$templateFile->getRelativeDocPath()} file"); - if ( - !$this->configuration->useSharedCache() || - !$this->isGeneratedDocumentExists($templateFileName) || - $this->isInternalCachingVersionChanged() || - $this->isConfigurationVersionChanged() || - $this->isFilesDependenciesCacheOutdated($templateFileName) || - $this->isEntitiesOperationsLogCacheOutdated($templateFileName) - ) { - $this->rendererContext->clearDependencies(); - $this->rootEntityCollectionsGroup->clearOperationsLog(); - $this->rendererContext->setCurrentTemplateFilePatch($templateFileName); - $fileDependency = $this->dependencyFactory->createFileDependency( - filePath: $templateFile->getRealPath() - ); - $this->rendererContext->addDependency($fileDependency); - yield $templateFile; - } else { - $this->moveCachedDataToCurrentData($templateFileName); - $this->logger->info("Use cached version `{$templateFile->getRealPath()}`"); + $file = $this->prepareDocFileForRendering($templateFile); + if (!$file) { ++$skippedCount; continue; } + yield $file; + } + + $processed = $finder->count() - $skippedCount; + $this->io->table([], [ + ['Processed documents:', "{$processed}"], + ['Skipped (without changes):', "{$skippedCount}"], + ]); + } + /** + * @throws InvalidConfigurationParameterException + */ + private function prepareDocFileForRendering(TemplateFile $templateFile): ?TemplateFile + { + $relativeTemplateName = $templateFile->getRelativeTemplatePath() ?: $templateFile->getRelativeDocPath(); + + $this->rendererContext->clearDependencies(); + $this->rootEntityCollectionsGroup->clearOperationsLog(); + + $this->rendererContext->setCurrentTemplateFilePatch($relativeTemplateName); + $fileDependency = $this->dependencyFactory->createFileDependency( + filePath: $templateFile->getRealPath() + ); + $this->rendererContext->addDependency($fileDependency); + + $this->markFileNameAsRendered($relativeTemplateName); + + if ( + !$this->configuration->useSharedCache() || + !$this->isGeneratedDocumentExists($relativeTemplateName) || + $this->isInternalCachingVersionChanged() || + $this->isConfigurationVersionChanged() || + $this->isFilesDependenciesCacheOutdated($relativeTemplateName) || + $this->isEntitiesOperationsLogCacheOutdated($relativeTemplateName) + ) { + $this->rendererContext->clearDependencies(); + $this->rootEntityCollectionsGroup->clearOperationsLog(); + $this->rendererContext->setCurrentTemplateFilePatch($relativeTemplateName); + $fileDependency = $this->dependencyFactory->createFileDependency( + filePath: $templateFile->getRealPath() + ); + $this->rendererContext->addDependency($fileDependency); $this->sharedCompressedDocumentFileCache->set( - $this->getOperationsLogCacheKey($templateFileName), + $this->getOperationsLogCacheKey($relativeTemplateName), $this->rootEntityCollectionsGroup->getOperationsLogWithoutDuplicates() ); $this->sharedCompressedDocumentFileCache->set( - $this->getFilesDependenciesCacheKey($templateFileName), + $this->getFilesDependenciesCacheKey($relativeTemplateName), $this->rendererContext->getDependencies() ); + return $templateFile; } - - $processed = $finder->count() - $skippedCount; - $this->io->table([], [ - ['Processed documents:', "{$processed}"], - ['Skipped (without changes):', "{$skippedCount}"], - ]); + $this->moveCachedDataToCurrentData($relativeTemplateName); + $this->logger->info("Use cached version `{$templateFile->getRealPath()}`"); + return null; } /** @@ -138,7 +160,7 @@ public function getDocumentedEntityWrappersWithOutdatedCache(): \Generator $this->markFileNameAsRendered($entityWrapper->getDocUrl()); - $filesDependenciesKey = "{$entityWrapper->getEntityName()}_{$entityWrapper->getInitiatorFilePath()}"; + $filesDependenciesKey = "{$entityWrapper->getEntityName()}_{$entityWrapper->getParentDocFilePath()}"; if ( !$this->configuration->useSharedCache() || !$this->isGeneratedEntityDocumentExists($entityWrapper) || @@ -153,7 +175,7 @@ public function getDocumentedEntityWrappersWithOutdatedCache(): \Generator $this->rootEntityCollectionsGroup->clearOperationsLog(); yield $entityWrapper; } else { - $this->moveCachedDataToCurrentData($entityWrapper->getInitiatorFilePath(), $entityWrapper->getEntityName()); + $this->moveCachedDataToCurrentData($entityWrapper->getParentDocFilePath(), $entityWrapper->getEntityName()); $this->logger->info("Use cached version `{$this->configuration->getOutputDir()}{$entityWrapper->getDocUrl()}`"); ++$skippedCount; continue; @@ -215,6 +237,21 @@ public function getFilesToRemove(): \Generator } yield $docFile; } + + // check empty directories + $finder = Finder::create() + ->in($outputFolder) + ->ignoreDotFiles(true) + ->ignoreUnreadableDirs() + ->directories(); + + $dirs = []; + foreach ($finder as $dir) { + if (!Finder::create()->in($dir->getRealPath())->files()->count()) { + $dirs[] = $dir; + } + } + yield from $dirs; } private function isInternalCachingVersionChanged(): bool @@ -257,7 +294,7 @@ private function isConfigurationVersionChanged(): bool private function isEntityRelationsCacheOutdated(DocumentedEntityWrapper $entityWrapper): bool { $cachedEntitiesRelations = $this->sharedCompressedDocumentFileCache->get('entities_relations', []); - if (!array_key_exists($entityWrapper->getInitiatorFilePath(), $cachedEntitiesRelations)) { + if (!array_key_exists($entityWrapper->getParentDocFilePath(), $cachedEntitiesRelations)) { return true; } diff --git a/src/Core/Renderer/TemplateFile.php b/src/Core/Renderer/TemplateFile.php new file mode 100644 index 00000000..65089895 --- /dev/null +++ b/src/Core/Renderer/TemplateFile.php @@ -0,0 +1,93 @@ +isTemplate = str_ends_with($realPath, '.twig'); + } + + public function isTemplate(): bool + { + return $this->isTemplate; + } + + /** + * @throws InvalidConfigurationParameterException + */ + public static function create( + SplFileInfo $fileInfo, + Configuration $configuration, + PluginEventDispatcher $pluginEventDispatcher + ): self { + $realPath = $fileInfo->getRealPath(); + return new self( + $realPath, + self::getRelativeDocPathByTemplatePath( + $realPath, + $configuration, + $pluginEventDispatcher + ) + ); + } + + /** + * @throws InvalidConfigurationParameterException + */ + public static function getTemplatePathByRelativeDocPath( + string $relativeDocPath, + Configuration $configuration, + PluginEventDispatcher $pluginEventDispatcher, + ): string { + if (!str_ends_with($relativeDocPath, '.twig')) { + $relativeDocPath .= '.twig'; + } + $outputDir = $configuration->getTemplatesDir(); + $event = $pluginEventDispatcher->dispatch(new OnGetTemplatePathByRelativeDocPath($relativeDocPath)); + $filePath = $event->getCustomTemplateFilePath(); + return $filePath ?: "{$outputDir}{$relativeDocPath}"; + } + + /** + * @throws InvalidConfigurationParameterException + */ + public static function getRelativeDocPathByTemplatePath( + string $templatePath, + Configuration $configuration, + PluginEventDispatcher $pluginEventDispatcher, + ): string { + $templatePath = str_replace('.twig', '', $templatePath); + $templatesDir = $configuration->getTemplatesDir(); + $event = $pluginEventDispatcher->dispatch(new OnGetProjectTemplatesDirs([$templatesDir])); + $templatesDirs = $event->getTemplatesDirs(); + return str_replace($templatesDirs, '', $templatePath); + } + + public function getRealPath(): string + { + return $this->realPath; + } + + public function getRelativeDocPath(): string + { + return str_replace('.twig', '', $this->relativeDocPath); + } + + public function getRelativeTemplatePath(): ?string + { + return $this->isTemplate ? "{$this->getRelativeDocPath()}.twig" : null; + } +} diff --git a/src/Core/Renderer/Twig/Function/GeneratePageBreadcrumbs.php b/src/Core/Renderer/Twig/Function/GeneratePageBreadcrumbs.php index e5c47469..da2aa43f 100644 --- a/src/Core/Renderer/Twig/Function/GeneratePageBreadcrumbs.php +++ b/src/Core/Renderer/Twig/Function/GeneratePageBreadcrumbs.php @@ -8,6 +8,8 @@ use BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper; use BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyFactory; use BumbleDocGen\Core\Renderer\Context\RendererContext; +use DI\DependencyException; +use DI\NotFoundException; use Twig\Error\LoaderError; use Twig\Error\RuntimeError; use Twig\Error\SyntaxError; @@ -45,9 +47,11 @@ public static function getOptions(): array * current template, and the reference to it in breadcrumbs should not be clickable. * * @return string - * @throws SyntaxError * @throws RuntimeError + * @throws DependencyException * @throws LoaderError + * @throws SyntaxError + * @throws NotFoundException * @throws InvalidConfigurationParameterException */ public function __invoke( diff --git a/src/Core/Renderer/Twig/MainTwigEnvironment.php b/src/Core/Renderer/Twig/MainTwigEnvironment.php index 1b3ea973..b57f5e0d 100644 --- a/src/Core/Renderer/Twig/MainTwigEnvironment.php +++ b/src/Core/Renderer/Twig/MainTwigEnvironment.php @@ -6,6 +6,8 @@ use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; +use BumbleDocGen\Core\Plugin\Event\Renderer\OnGetProjectTemplatesDirs; +use BumbleDocGen\Core\Plugin\PluginEventDispatcher; use Twig\Environment; use Twig\Error\LoaderError; use Twig\Error\RuntimeError; @@ -15,27 +17,40 @@ final class MainTwigEnvironment { private Environment $twig; + private bool $isEnvLoaded = false; + + public function __construct( + private Configuration $configuration, + private MainExtension $mainExtension, + private PluginEventDispatcher $pluginEventDispatcher, + ) { + } /** * @throws InvalidConfigurationParameterException */ - public function __construct( - Configuration $configuration, - MainExtension $mainExtension - ) { - $templateFolder = $configuration->getTemplatesDir(); - $loader = new FilesystemLoader([$templateFolder]); - $this->twig = new Environment($loader); - $this->twig->addExtension($mainExtension); + private function loadMainTwigEnvironment(): void + { + if (!$this->isEnvLoaded) { + $templatesDir = $this->configuration->getTemplatesDir(); + $event = $this->pluginEventDispatcher->dispatch(new OnGetProjectTemplatesDirs([$templatesDir])); + $templatesDirs = $event->getTemplatesDirs(); + $loader = new FilesystemLoader($templatesDirs); + $this->twig = new Environment($loader); + $this->twig->addExtension($this->mainExtension); + $this->isEnvLoaded = true; + } } /** * @throws SyntaxError * @throws RuntimeError * @throws LoaderError + * @throws InvalidConfigurationParameterException */ public function render($name, array $context = []): string { + $this->loadMainTwigEnvironment(); return $this->twig->render($name, $context); } } diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 92b3b732..9049c145 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -33,7 +33,7 @@ */ final class DocGenerator { - public const VERSION = '1.2.1'; + public const VERSION = '1.3.0'; public const LOG_FILE_NAME = 'last_run.log'; public function __construct( diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php index f40d19ca..61cf3940 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php @@ -797,6 +797,15 @@ public function getFileContent(): string return $this->getReflection()->isInstantiable(); } + /** + * @throws ReflectionException + * @throws InvalidConfigurationParameterException + */ + #[CacheableMethod] public function isAbstract(): bool + { + return $this->getReflection()->isAbstract(); + } + /** * @throws ReflectionException * @throws InvalidConfigurationParameterException diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php index 4cd1bd6f..717c6635 100644 --- a/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php +++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntityCollection.php @@ -234,10 +234,6 @@ public function filterByPaths(array $paths): ClassEntityCollection return $classEntityCollection; } - /** - * @throws ReflectionException - * @throws InvalidConfigurationParameterException - */ public function filterByNameRegularExpression(string $regexPattern): ClassEntityCollection { $classEntityCollection = $this->cloneForFiltration(); @@ -282,6 +278,38 @@ public function getOnlyInterfaces(): ClassEntityCollection return $classEntityCollection; } + /** + * @throws ReflectionException + * @throws InvalidConfigurationParameterException + */ + public function getOnlyTraits(): ClassEntityCollection + { + $classEntityCollection = $this->cloneForFiltration(); + foreach ($classEntityCollection as $objectId => $classEntity) { + /**@var ClassEntity $classEntity */ + if (!$classEntity->isTrait()) { + $classEntityCollection->remove($objectId); + } + } + return $classEntityCollection; + } + + /** + * @throws ReflectionException + * @throws InvalidConfigurationParameterException + */ + public function getOnlyAbstractClasses(): ClassEntityCollection + { + $classEntityCollection = $this->cloneForFiltration(); + foreach ($classEntityCollection as $objectId => $classEntity) { + /**@var ClassEntity $classEntity */ + if (!$classEntity->isAbstract() || $classEntity->isInterface()) { + $classEntityCollection->remove($objectId); + } + } + return $classEntityCollection; + } + /** * @param string $search * Search query. For the search, only the main part is taken, up to the characters: `::`, `->`, `#`. diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/EntityDocUnifiedPlacePlugin.php b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/EntityDocUnifiedPlacePlugin.php new file mode 100644 index 00000000..ed17c712 --- /dev/null +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/EntityDocUnifiedPlacePlugin.php @@ -0,0 +1,51 @@ + 'onCreateDocumentedEntityWrapper', + OnGetTemplatePathByRelativeDocPath::class => 'onGetTemplatePathByRelativeDocPath', + OnGetProjectTemplatesDirs::class => 'onGetProjectTemplatesDirs' + ]; + } + + public function onCreateDocumentedEntityWrapper(OnCreateDocumentedEntityWrapper $event): void + { + // Here we replace the parent document for all entities so that they are all in the same directory. + $structureDirName = self::ENTITY_DOC_STRUCTURE_DIR_NAME; + $event->getDocumentedEntityWrapper()->setParentDocFilePath("/{$structureDirName}/readme.md"); + } + + public function onGetTemplatePathByRelativeDocPath(OnGetTemplatePathByRelativeDocPath $event): void + { + // When getting the path to the template file, + // we need to take into account that it is located in the plugin directory, and not the standard one. + if (str_starts_with($event->getTemplateName(), '/' . self::ENTITY_DOC_STRUCTURE_DIR_NAME)) { + $event->setCustomTemplateFilePath(self::TEMPLATES_FOLDER . $event->getTemplateName()); + } + } + + public function onGetProjectTemplatesDirs(OnGetProjectTemplatesDirs $event): void + { + $event->addTemplatesDir(self::TEMPLATES_FOLDER); + } +} diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/classes.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/classes.md.twig new file mode 100644 index 00000000..5830ddec --- /dev/null +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/classes.md.twig @@ -0,0 +1,17 @@ +{% set title = 'Project classes' %} +{% set prevPage = 'Project structure' %} +{{ generatePageBreadcrumbs(title, _self) }} + +{{ "Project classes" | textToHeading('H1') }} + + + + +{% for abstractClassEntity in phpClassEntityCollection.getOnlyAbstractClasses() %} + +{% endfor %} + +{% for classEntity in phpClassEntityCollection.getOnlyInstantiable() %} + +{% endfor %} +
    NameNamespace
    Abstract classes
    {{ abstractClassEntity.getName() }}|short_form{{ abstractClassEntity.getNamespaceName() }}
    Classes
    {{ classEntity.getName() }}|short_form{{ classEntity.getNamespaceName() }}
    \ No newline at end of file diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/interfaces.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/interfaces.md.twig new file mode 100644 index 00000000..38043d92 --- /dev/null +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/interfaces.md.twig @@ -0,0 +1,12 @@ +{% set title = 'Project interfaces' %} +{% set prevPage = 'Project structure' %} +{{ generatePageBreadcrumbs(title, _self) }} + +{{ "Project interfaces" | textToHeading('H1') }} + + + +{% for interfaceEntity in phpClassEntityCollection.getOnlyInterfaces() %} + +{% endfor %} +
    NameNamespace
    {{ interfaceEntity.getName() }}|short_form{{ interfaceEntity.getNamespaceName() }}
    \ No newline at end of file diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/map.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/map.md.twig new file mode 100644 index 00000000..7d2885f2 --- /dev/null +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/map.md.twig @@ -0,0 +1,7 @@ +{% set title = 'Project entities map' %} +{% set prevPage = 'Project structure' %} +{{ generatePageBreadcrumbs(title, _self) }} + +{{ "Entities map" | textToHeading('H1') }} + +{{ drawClassMap( phpClassEntityCollection ) }} \ No newline at end of file diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/readme.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/readme.md.twig new file mode 100644 index 00000000..2f31c6a7 --- /dev/null +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/readme.md.twig @@ -0,0 +1,10 @@ +{% set title = 'Project structure' %} +{% set prevPage = '/' %} +{{ generatePageBreadcrumbs(title, _self) }} + +{{ "Project structure" | textToHeading('H1') }} + +* Interfaces +* Classes +* Traits +* All entities map \ No newline at end of file diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/traits.md.twig b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/traits.md.twig new file mode 100644 index 00000000..265b90af --- /dev/null +++ b/src/LanguageHandler/Php/Plugin/CorePlugin/EntityDocUnifiedPlace/templates/__structure/traits.md.twig @@ -0,0 +1,12 @@ +{% set title = 'Project traits' %} +{% set prevPage = 'Project structure' %} +{{ generatePageBreadcrumbs(title, _self) }} + +{{ "Project traits" | textToHeading('H1') }} + + + +{% for traitEntity in phpClassEntityCollection.getOnlyTraits() %} + +{% endfor %} +
    NameNamespace
    {{ traitEntity.getName() }}|short_form{{ traitEntity.getNamespaceName() }}
    \ No newline at end of file diff --git a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/PhpClassToMdDocRenderer.php b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/PhpClassToMdDocRenderer.php index 88aaa972..5c1ffca3 100644 --- a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/PhpClassToMdDocRenderer.php +++ b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/PhpClassToMdDocRenderer.php @@ -50,7 +50,7 @@ public function getRenderedText(DocumentedEntityWrapper $entityWrapper): string { return $this->classRendererTwig->render('class.md.twig', [ 'classEntity' => $entityWrapper->getDocumentTransformableEntity(), - 'generationInitiatorFilePath' => $entityWrapper->getInitiatorFilePath() + 'parentDocFilePath' => $entityWrapper->getParentDocFilePath() ]); } } diff --git a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/class.md.twig b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/class.md.twig index 5239bbbc..540e0be3 100644 --- a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/class.md.twig +++ b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/PhpClassToMd/templates/class.md.twig @@ -1,4 +1,4 @@ -{{ generatePageBreadcrumbs(classEntity.getShortName(), generationInitiatorFilePath, false) }} +{{ generatePageBreadcrumbs(classEntity.getShortName(), parentDocFilePath, false) }} {% include '_classHeader.md.twig' with {'classEntity': classEntity} only %} diff --git a/tests/Unit/Core/Configuration/ValueResolver/ArgvValueResolverTest.php b/tests/Unit/Core/Configuration/ValueResolver/ArgvValueResolverTest.php new file mode 100644 index 00000000..574d9e69 --- /dev/null +++ b/tests/Unit/Core/Configuration/ValueResolver/ArgvValueResolverTest.php @@ -0,0 +1,78 @@ + '/home/john/foo', + 9 => '/bin/phpunit' + ]; + $this->argvValueResolver = new ArgvValueResolver(); + $this->configurationParameterBag = $this->createMock(ConfigurationParameterBag::class); + } + + /** + * @dataProvider dataProviderCollection + */ + public function testArgvValueResolver($value, $expected): void + { + $resolvedValue = $this->argvValueResolver->resolveValue( + $this->configurationParameterBag, + $value + ); + + if (is_array($value) && is_array($expected)) { + foreach ($expected as $key => $val) { + $this->assertEquals($val, $resolvedValue[$key]); + } + + return; + } + + $this->assertEquals($expected, $resolvedValue); + } + + public function dataProviderCollection(): array + { + return [ + 'testSingleValue' => [ + '$value' => '%argv:8%/docs', + '$expected' => '/home/john/foo/docs', + ], + 'testArrayWithPlaceholder' => [ + '$value' => [ + 'project_root' => '%argv:8%/test', + 'output_dir' => '%argv:9%/docs', + ], + '$expected' => [ + 'project_root' => '/home/john/foo/test', + 'output_dir' => '/bin/phpunit/docs', + ], + ], + 'testSingleValueWithoutPlaceholder' => [ + '$value' => 'docs', + '$expected' => 'docs', + ], + 'testDefaultValue' => [ + '$value' => false, + '$expected' => false, + ], + ]; + } +} diff --git a/tests/Unit/Core/Configuration/ValueResolver/InternalValueResolverTest.php b/tests/Unit/Core/Configuration/ValueResolver/InternalValueResolverTest.php new file mode 100644 index 00000000..18db307b --- /dev/null +++ b/tests/Unit/Core/Configuration/ValueResolver/InternalValueResolverTest.php @@ -0,0 +1,77 @@ +internalValueResolver = new InternalValueResolver([ + 'WORKING_DIR' => '/home/john/foo', + 'bin' => '/bin/phpunit' + ]); + $this->configurationParameterBag = $this->createMock(ConfigurationParameterBag::class); + } + + /** + * @dataProvider dataProviderCollection + */ + public function testArgvValueResolver($value, $expected): void + { + $resolvedValue = $this->internalValueResolver->resolveValue( + $this->configurationParameterBag, + $value + ); + + if (is_array($value) && is_array($expected)) { + foreach ($expected as $key => $val) { + $this->assertEquals($val, $resolvedValue[$key]); + } + + return; + } + + $this->assertEquals($expected, $resolvedValue); + } + + public function dataProviderCollection(): array + { + return [ + 'testSingleValue' => [ + '$value' => '%WORKING_DIR%/docs', + '$expected' => '/home/john/foo/docs', + ], + 'testSingleValueWithoutPlaceholder' => [ + '$value' => 'docs', + '$expected' => 'docs', + ], + 'testArrayWithPlaceholder' => [ + '$value' => [ + 'project_root' => '%WORKING_DIR%/test', + 'output_dir' => '%bin%/docs', + ], + '$expected' => [ + 'project_root' => '/home/john/foo/test', + 'output_dir' => '/bin/phpunit/docs', + ], + ], + 'testDefaultValue' => [ + '$value' => false, + '$expected' => false, + ], + ]; + } +} diff --git a/tests/Unit/Core/Configuration/ValueResolver/RefValueResolverTest.php b/tests/Unit/Core/Configuration/ValueResolver/RefValueResolverTest.php new file mode 100644 index 00000000..01f01d13 --- /dev/null +++ b/tests/Unit/Core/Configuration/ValueResolver/RefValueResolverTest.php @@ -0,0 +1,76 @@ +refValueResolver = new RefValueResolver(); + $this->configurationParameterBag = $this->createMock(ConfigurationParameterBag::class); + $this->configurationParameterBag->expects($this->any())->method('get')->willReturn('test'); + } + + /** + * @dataProvider dataProviderCollection + */ + public function testRefValueResolver($value, $expected): void + { + $resolvedValue = $this->refValueResolver->resolveValue( + $this->configurationParameterBag, + $value + ); + + if (is_array($value) && is_array($expected)) { + foreach ($expected as $key => $val) { + $this->assertEquals($val, $resolvedValue[$key]); + } + + return; + } + + $this->assertEquals($expected, $resolvedValue); + } + + public function dataProviderCollection(): array + { + return [ + 'testSingleValue' => [ + '$value' => '%project_root%/docs', + '$expected' => 'test/docs', + ], + 'testArrayWithPlaceholder' => [ + '$value' => [ + 'project_root' => 'test', + 'output_dir' => '%project_root%/docs', + ], + '$expected' => [ + 'project_root' => 'test', + 'output_dir' => 'test/docs', + ], + ], + 'testSingleValueWithoutPlaceholder' => [ + '$value' => 'docs', + '$expected' => 'docs', + ], + 'testDefaultValue' => [ + '$value' => false, + '$expected' => false, + ], + ]; + } +} diff --git a/tests/Unit/Core/Configuration/ValueTransformer/ValueToClassTransformerTest.php b/tests/Unit/Core/Configuration/ValueTransformer/ValueToClassTransformerTest.php new file mode 100644 index 00000000..14b59497 --- /dev/null +++ b/tests/Unit/Core/Configuration/ValueTransformer/ValueToClassTransformerTest.php @@ -0,0 +1,85 @@ +valueToClassTransformer = new ValueToClassTransformer(new Container()); + } + + public function testCanTransform(): void + { + $this->assertFalse($this->valueToClassTransformer->canTransform('')); + + $this->assertFalse($this->valueToClassTransformer->canTransform([])); + + $this->assertFalse($this->valueToClassTransformer->canTransform([ + 'class' => 'ClassThatDoesntExists' + ])); + + $this->assertTrue($this->valueToClassTransformer->canTransform([ + 'class' => ValueToClassTransformer::class + ])); + } + + public function testTransform(): void + { + $value = [ + 'class' => Exception::class, + ]; + + $class = $this->valueToClassTransformer->transform($value); + $this->assertInstanceOf(Exception::class, $class); + + $value = [ + 'class' => DocGeneratorFactory::class, + ]; + + $class = $this->valueToClassTransformer->transform($value); + $this->assertInstanceOf(DocGeneratorFactory::class, $class); + + $value = [ + 'class' => Configuration::class, + 'arguments' => [ + [ + 'class' => ConfigurationParameterBag::class, + 'arguments' => [ + ['class' => ValueToClassTransformer::class], + [] + ] + ], + [ + 'class' => LocalObjectCache::class + ], + [ + 'class' => NullLogger::class + ] + ] + ]; + + $class = $this->valueToClassTransformer->transform($value); + $this->assertInstanceOf(Configuration::class, $class); + + + $this->assertNull($this->valueToClassTransformer->transform('')); + } +}