From 3fcf040b2acaee1c1be86a6165a053d2821f4870 Mon Sep 17 00:00:00 2001 From: Marco Huber Date: Mon, 15 Aug 2011 02:50:26 +0200 Subject: [PATCH] initial import --- Classes/Controller/PageController.php | 233 ++++++++++++++++++ Classes/Domain/Model/BackendLayout.php | 127 ++++++++++ Classes/Domain/Model/ContentElement.php | 154 ++++++++++++ Classes/Domain/Model/Page.php | 154 ++++++++++++ .../Repository/BackendLayoutRepository.php | 37 +++ .../Repository/ContentElementRepository.php | 37 +++ Classes/Domain/Repository/PageRepository.php | 37 +++ Classes/Hooks/class.tx_sokoban_cmslayout.php | 215 ++++++++++++++++ Configuration/ExtensionBuilder/settings.yaml | 95 +++++++ Configuration/TypoScript/constants.txt | 14 ++ Configuration/TypoScript/setup.txt | 48 ++++ ExtensionBuilder.json | 1 + Resources/Private/.htaccess | 1 + .../Private/Backend/Layouts/Default.html | 33 +++ .../Private/Backend/Partials/FormErrors.html | 13 + .../Backend/Partials/Page/FormFields.html | 8 + .../Private/Backend/Templates/Page/New.html | 42 ++++ Resources/Private/Language/locallang.xml | 20 ++ .../locallang_createsokobanlevels.xml | 14 ++ ..._tx_sokoban_domain_model_backendlayout.xml | 15 ++ ...tx_sokoban_domain_model_contentelement.xml | 14 ++ ...llang_csh_tx_sokoban_domain_model_page.xml | 16 ++ Resources/Private/Language/locallang_db.xml | 23 ++ Resources/Public/Css/sokoban.css | 111 +++++++++ Resources/Public/Icons/relation.gif | Bin 0 -> 233 bytes .../tx_sokoban_domain_model_backendlayout.gif | Bin 0 -> 230 bytes ...tx_sokoban_domain_model_contentelement.gif | Bin 0 -> 230 bytes .../Icons/tx_sokoban_domain_model_page.gif | Bin 0 -> 533 bytes Resources/Public/Javascript/sokoban.js | 184 ++++++++++++++ Tests/Unit/Domain/Model/BackendLayoutTest.php | 112 +++++++++ .../Unit/Domain/Model/ContentElementTest.php | 95 +++++++ Tests/Unit/Domain/Model/PageTest.php | 135 ++++++++++ doc/manual.sxw | Bin 0 -> 93632 bytes ext_emconf.php | 46 ++++ ext_icon.gif | Bin 0 -> 177 bytes ext_tables.php | 35 +++ ext_tables.sql | 0 37 files changed, 2069 insertions(+) create mode 100755 Classes/Controller/PageController.php create mode 100755 Classes/Domain/Model/BackendLayout.php create mode 100755 Classes/Domain/Model/ContentElement.php create mode 100755 Classes/Domain/Model/Page.php create mode 100644 Classes/Domain/Repository/BackendLayoutRepository.php create mode 100644 Classes/Domain/Repository/ContentElementRepository.php create mode 100755 Classes/Domain/Repository/PageRepository.php create mode 100644 Classes/Hooks/class.tx_sokoban_cmslayout.php create mode 100755 Configuration/ExtensionBuilder/settings.yaml create mode 100755 Configuration/TypoScript/constants.txt create mode 100755 Configuration/TypoScript/setup.txt create mode 100755 ExtensionBuilder.json create mode 100755 Resources/Private/.htaccess create mode 100755 Resources/Private/Backend/Layouts/Default.html create mode 100755 Resources/Private/Backend/Partials/FormErrors.html create mode 100755 Resources/Private/Backend/Partials/Page/FormFields.html create mode 100755 Resources/Private/Backend/Templates/Page/New.html create mode 100755 Resources/Private/Language/locallang.xml create mode 100755 Resources/Private/Language/locallang_createsokobanlevels.xml create mode 100755 Resources/Private/Language/locallang_csh_tx_sokoban_domain_model_backendlayout.xml create mode 100755 Resources/Private/Language/locallang_csh_tx_sokoban_domain_model_contentelement.xml create mode 100755 Resources/Private/Language/locallang_csh_tx_sokoban_domain_model_page.xml create mode 100755 Resources/Private/Language/locallang_db.xml create mode 100644 Resources/Public/Css/sokoban.css create mode 100755 Resources/Public/Icons/relation.gif create mode 100755 Resources/Public/Icons/tx_sokoban_domain_model_backendlayout.gif create mode 100755 Resources/Public/Icons/tx_sokoban_domain_model_contentelement.gif create mode 100755 Resources/Public/Icons/tx_sokoban_domain_model_page.gif create mode 100644 Resources/Public/Javascript/sokoban.js create mode 100755 Tests/Unit/Domain/Model/BackendLayoutTest.php create mode 100755 Tests/Unit/Domain/Model/ContentElementTest.php create mode 100755 Tests/Unit/Domain/Model/PageTest.php create mode 100755 doc/manual.sxw create mode 100755 ext_emconf.php create mode 100755 ext_icon.gif create mode 100755 ext_tables.php create mode 100755 ext_tables.sql diff --git a/Classes/Controller/PageController.php b/Classes/Controller/PageController.php new file mode 100755 index 0000000..cc5f370 --- /dev/null +++ b/Classes/Controller/PageController.php @@ -0,0 +1,233 @@ + +* +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 3 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* +* This script is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + + +/** + * + * + * @package sokoban + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Sokoban_Controller_PageController extends Tx_Extbase_MVC_Controller_ActionController { + + /** + * pageRepository + * + * @var Tx_Sokoban_Domain_Repository_PageRepository + */ + protected $pageRepository; + /** + * contentElementRepository + * + * @var Tx_Sokoban_Domain_Repository_ContentElementRepository + */ + protected $contentElementRepository; + /** + * backendLayoutRepository + * + * @var Tx_Sokoban_Domain_Repository_BackendLayoutRepository + */ + protected $backendLayoutRepository; + /** + * persistenceManager + * + * @var Tx_Extbase_Persistence_Manager + */ + protected $persistenceManager; + + /** + * injectPageRepository + * + * @param Tx_Sokoban_Domain_Repository_PageRepository $pageRepository + * @return void + */ + public function injectPageRepository(Tx_Sokoban_Domain_Repository_PageRepository $pageRepository) { + $this->pageRepository = $pageRepository; + } + /** + * injectContentElementRepository + * + * @param Tx_Sokoban_Domain_Repository_ContentElementRepository $contentElementRepository + * @return void + */ + public function injectContentElementRepository(Tx_Sokoban_Domain_Repository_ContentElementRepository $contentElementRepository) { + $this->contentElementRepository = $contentElementRepository; + } + /** + * injectBackendLayoutRepository + * + * @param Tx_Sokoban_Domain_Repository_BackendLayoutRepository $backendLayoutRepository + * @return void + */ + public function injectBackendLayoutRepository(Tx_Sokoban_Domain_Repository_BackendLayoutRepository $backendLayoutRepository) { + $this->backendLayoutRepository = $backendLayoutRepository; + } + /** + * injectPersistenceManager + * + * @param Tx_Extbase_Persistence_ManagerInterface $persistenceManager + * @return void + */ + public function injectPersistenceManager(Tx_Extbase_Persistence_ManagerInterface $persistenceManager) { + $this->persistenceManager = $persistenceManager; + } + + /** + * action new + * + * @return string The rendered new action + */ + public function newAction() { + + } + + /** + * action create + * + * @param integer $parentPageId + * @validate $parentPageId NotEmpty + * @validate $parentPageId Integer + * @param integer $limit + * @validate $limit Integer + * @return string The rendered create action + */ + public function createAction($parentPageId, $limit=999) { + $levels = new SimpleXMLElement($this->processLevelFile()); + + $levelTitel = (String) $levels->Title; + $email = (String) $levels->Email; + $attributes = $levels->LevelCollection->attributes(); + $copyright = (String) $attributes['Copyright']; + + $parentPage = $this->pageRepository->findByUid($parentPageId); + + $levelRootPage = new Tx_Sokoban_Domain_Model_Page(); + $levelRootPage->setTitle($levelTitel); + $levelRootPage->setParentPage($parentPage); + $levelRootPage->setPid($parentPageId); + $this->pageRepository->add($levelRootPage); + $this->persistenceManager->persistAll(); + + $levelRootPageContent = new Tx_Sokoban_Domain_Model_ContentElement(); + $levelRootPageContent->setTitle('Copyright: '.$copyright.' E-Mail: '.$email); + $levelRootPageContent->setCType('header'); + $levelRootPageContent->setParentPage($levelRootPage); + $levelRootPageContent->setPid($levelRootPage->getUid()); + $this->contentElementRepository->add($levelRootPageContent); + $this->persistenceManager->persistAll(); + + $i = 0; + foreach($levels->LevelCollection->Level as $level){ + $colPos = 1; + if($i<$limit){ + $levelPage = new Tx_Sokoban_Domain_Model_Page(); + $levelPage->setTitle($levelTitel.' '.($i+1)); + $levelPage->setParentPage($levelRootPage); + $levelPage->setPid($levelRootPage->getUid()); + $this->pageRepository->add($levelPage); + $this->persistenceManager->persistAll(); + + $attributes = $level->attributes(); + $height = (String) $attributes['Height']; + $width = (String) $attributes['Width']; + $backendLayoutConfig = ' + backend_layout { + rowCount = '.$height.' + colCount = '.$width.' + rows { + '; + $colPosList = array(); + for($r=1; $r<=$height; $r++){ + $backendLayoutConfig .= ' + '.$r.' { + columns { + '; + $rows = $level->children(); + $rowString = (String) $rows->L[($r-1)]; + $cols = str_split($rowString); + for($c=1; $c<=$width; $c++){ + $backendLayoutConfig .= ' + '.$c.' { + name = '.$r.' '.$c.' + colPos = '.$colPos.' + } + '; + $colPosList[] = $colPos; + $content = new Tx_Sokoban_Domain_Model_ContentElement(); + $content->setTitle(($cols[($c-1)]?$cols[($c-1)]:' ')); + $content->setCType('header'); + $content->setColPos($colPos); + $content->setParentPage($levelPage); + $content->setPid($levelPage->getUid()); + $this->contentElementRepository->add($content); + $this->persistenceManager->persistAll(); + + $colPos++; + } + $backendLayoutConfig .= ' + } + } + '; + } + $backendLayoutConfig .= ' + } + } + '; + $backendLayout = new Tx_Sokoban_Domain_Model_BackendLayout(); + $backendLayout->setTitle($levelTitel.' '.($i+1)); + $backendLayout->setConfig($backendLayoutConfig); + $backendLayout->setParentPage($levelPage); + $backendLayout->setPid($levelPage->getUid()); + $this->backendLayoutRepository->add($backendLayout); + $this->persistenceManager->persistAll(); + + $levelPage->setTsConfig(' + SOKOBAN.isLevel = 1 + mod.SHARED.colPos_list = '.implode(',', $colPosList).' + '); + $levelPage->setBackendLayout($backendLayout); + $this->pageRepository->update($levelPage); + $this->persistenceManager->persistAll(); + } + $i++; + } + + $this->flashMessageContainer->add('Your new Page was created.'); + + $this->redirect('new'); + } + + public function processLevelFile(){ + $levelFile = t3lib_div::upload_to_tempfile($_FILES['tx_sokoban_tools_sokobancreatesokobanlevels']['tmp_name']['levelFile']); + + $levelFileContent = file_get_contents($levelFile); + + t3lib_div::unlink_tempfile($levelFile); + return $levelFileContent; + } + +} +?> \ No newline at end of file diff --git a/Classes/Domain/Model/BackendLayout.php b/Classes/Domain/Model/BackendLayout.php new file mode 100755 index 0000000..1fd5c5d --- /dev/null +++ b/Classes/Domain/Model/BackendLayout.php @@ -0,0 +1,127 @@ + +* +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 3 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* +* This script is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + + +/** + * + * + * @package sokoban + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Sokoban_Domain_Model_BackendLayout extends Tx_Extbase_DomainObject_AbstractEntity { + + /** + * title + * + * @var string + */ + protected $title; + + /** + * config + * + * @var string + */ + protected $config; + + /** + * parentPage + * + * @var Tx_Sokoban_Domain_Model_Page + */ + protected $parentPage; + + /** + * __construct + * + * @return void + */ + public function __construct() { + + } + + /** + * Returns the title + * + * @return string $title + */ + public function getTitle() { + return $this->title; + } + + /** + * Sets the title + * + * @param string $title + * @return void + */ + public function setTitle($title) { + $this->title = $title; + return $this; + } + + /** + * Returns the config + * + * @return string $config + */ + public function getConfig() { + return $this->config; + } + + /** + * Sets the config + * + * @param string $config + * @return void + */ + public function setConfig($config) { + $this->config = $config; + return $this; + } + + /** + * Returns the parentPage + * + * @return Tx_Sokoban_Domain_Model_Page $parentPage + */ + public function getParentPage() { + return $this->parentPage; + } + + /** + * Sets the parentPage + * + * @param Tx_Sokoban_Domain_Model_Page $parentPage + * @return void + */ + public function setParentPage(Tx_Sokoban_Domain_Model_Page $parentPage) { + $this->parentPage = $parentPage; + return $this; + } + +} +?> \ No newline at end of file diff --git a/Classes/Domain/Model/ContentElement.php b/Classes/Domain/Model/ContentElement.php new file mode 100755 index 0000000..902c826 --- /dev/null +++ b/Classes/Domain/Model/ContentElement.php @@ -0,0 +1,154 @@ + +* +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 3 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* +* This script is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + + +/** + * + * + * @package sokoban + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Sokoban_Domain_Model_ContentElement extends Tx_Extbase_DomainObject_AbstractEntity { + + /** + * title + * + * @var string + */ + protected $title; + + /** + * cType + * + * @var string + */ + protected $cType; + + /** + * colPos + * + * @var string + */ + protected $colPos; + + /** + * parentPage + * + * @var Tx_Sokoban_Domain_Model_Page + */ + protected $parentPage; + + /** + * __construct + * + * @return void + */ + public function __construct() { + + } + + /** + * Returns the title + * + * @return string $title + */ + public function getTitle() { + return $this->title; + } + + /** + * Sets the title + * + * @param string $title + * @return void + */ + public function setTitle($title) { + $this->title = $title; + return $this; + } + + /** + * Returns the cType + * + * @return string $cType + */ + public function getCType() { + return $this->cType; + } + + /** + * Sets the cType + * + * @param string $cType + * @return void + */ + public function setCType($cType) { + $this->cType = $cType; + return $this; + } + + /** + * Returns the colPos + * + * @return string $colPos + */ + public function getColPos() { + return $this->colPos; + } + + /** + * Sets the colPos + * + * @param string $colPos + * @return void + */ + public function setColPos($colPos) { + $this->colPos = $colPos; + return $this; + } + + /** + * Returns the parentPage + * + * @return Tx_Sokoban_Domain_Model_Page $parentPage + */ + public function getParentPage() { + return $this->parentPage; + } + + /** + * Sets the parentPage + * + * @param Tx_Sokoban_Domain_Model_Page $parentPage + * @return void + */ + public function setParentPage(Tx_Sokoban_Domain_Model_Page $parentPage) { + $this->parentPage = $parentPage; + return $this; + } + +} +?> \ No newline at end of file diff --git a/Classes/Domain/Model/Page.php b/Classes/Domain/Model/Page.php new file mode 100755 index 0000000..e94972d --- /dev/null +++ b/Classes/Domain/Model/Page.php @@ -0,0 +1,154 @@ + +* +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 3 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* +* This script is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + + +/** + * + * + * @package sokoban + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Sokoban_Domain_Model_Page extends Tx_Extbase_DomainObject_AbstractEntity { + + /** + * title + * + * @var string + */ + protected $title; + + /** + * tsConfig + * + * @var string + */ + protected $tsConfig; + + /** + * parentPage + * + * @var Tx_Sokoban_Domain_Model_Page + */ + protected $parentPage; + + /** + * backendLayout + * + * @var Tx_Sokoban_Domain_Model_BackendLayout + */ + protected $backendLayout; + + /** + * __construct + * + * @return void + */ + public function __construct() { + + } + + /** + * Returns the title + * + * @return string $title + */ + public function getTitle() { + return $this->title; + } + + /** + * Sets the title + * + * @param string $title + * @return void + */ + public function setTitle($title) { + $this->title = $title; + return $this; + } + + /** + * Returns the tsConfig + * + * @return string $tsConfig + */ + public function getTsConfig() { + return $this->tsConfig; + } + + /** + * Sets the tsConfig + * + * @param string $tsConfig + * @return void + */ + public function setTsConfig($tsConfig) { + $this->tsConfig = $tsConfig; + return $this; + } + + /** + * Returns the parentPage + * + * @return Tx_Sokoban_Domain_Model_Page $parentPage + */ + public function getParentPage() { + return $this->parentPage; + } + + /** + * Sets the parentPage + * + * @param Tx_Sokoban_Domain_Model_Page $parentPage + * @return void + */ + public function setParentPage(Tx_Sokoban_Domain_Model_Page $parentPage) { + $this->parentPage = $parentPage; + return $this; + } + + /** + * Returns the backendLayout + * + * @return Tx_Sokoban_Domain_Model_BackendLayout $backendLayout + */ + public function getBackendLayout() { + return $this->backendLayout; + } + + /** + * Sets the backendLayout + * + * @param Tx_Sokoban_Domain_Model_BackendLayout $backendLayout + * @return void + */ + public function setBackendLayout(Tx_Sokoban_Domain_Model_BackendLayout $backendLayout) { + $this->backendLayout = $backendLayout; + return $this; + } + +} +?> \ No newline at end of file diff --git a/Classes/Domain/Repository/BackendLayoutRepository.php b/Classes/Domain/Repository/BackendLayoutRepository.php new file mode 100644 index 0000000..54d9414 --- /dev/null +++ b/Classes/Domain/Repository/BackendLayoutRepository.php @@ -0,0 +1,37 @@ + +* +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 3 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* +* This script is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + + +/** + * + * + * @package sokoban + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Sokoban_Domain_Repository_BackendLayoutRepository extends Tx_Extbase_Persistence_Repository { + +} +?> \ No newline at end of file diff --git a/Classes/Domain/Repository/ContentElementRepository.php b/Classes/Domain/Repository/ContentElementRepository.php new file mode 100644 index 0000000..6f80483 --- /dev/null +++ b/Classes/Domain/Repository/ContentElementRepository.php @@ -0,0 +1,37 @@ + +* +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 3 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* +* This script is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + + +/** + * + * + * @package sokoban + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Sokoban_Domain_Repository_ContentElementRepository extends Tx_Extbase_Persistence_Repository { + +} +?> \ No newline at end of file diff --git a/Classes/Domain/Repository/PageRepository.php b/Classes/Domain/Repository/PageRepository.php new file mode 100755 index 0000000..3806e40 --- /dev/null +++ b/Classes/Domain/Repository/PageRepository.php @@ -0,0 +1,37 @@ + +* +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 3 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* +* This script is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + + +/** + * + * + * @package sokoban + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Sokoban_Domain_Repository_PageRepository extends Tx_Extbase_Persistence_Repository { + +} +?> \ No newline at end of file diff --git a/Classes/Hooks/class.tx_sokoban_cmslayout.php b/Classes/Hooks/class.tx_sokoban_cmslayout.php new file mode 100644 index 0000000..1be7813 --- /dev/null +++ b/Classes/Hooks/class.tx_sokoban_cmslayout.php @@ -0,0 +1,215 @@ + +* +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 3 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* +* This script is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + + +/** + * + * + * @package sokoban + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class tx_sokoban_cmslayout implements tx_cms_layout_tt_content_drawItemHook { + var $pObj; + /** + * Preprocesses the preview rendering of a content element. + * + * @param tx_cms_layout $parentObject: Calling parent object + * @param boolean $drawItem: Whether to draw the item using the default functionalities + * @param string $headerContent: Header content + * @param string $itemContent: Item content + * @param array $row: Record row of tt_content + * @return void + */ + public function preProcess(tx_cms_layout &$parentObject, &$drawItem, &$headerContent, &$itemContent, array &$row){ + $this->pObj = $parentObject; + $tsParser = new t3lib_TSparser(); + $tsParser->parse($parentObject->pageRecord['TSconfig']); + $pageTSconfig = $tsParser->setup; + if($pageTSconfig['SOKOBAN.']['isLevel']==1){ + if($row['colPos']==1){ + $GLOBALS['SOBE']->doc->JScodeLibArray[] = ''; + $GLOBALS['SOBE']->doc->styleSheetFile2 = $GLOBALS['BACK_PATH'].'../typo3conf/ext/sokoban/Resources/Public/Css/sokoban.css'; + if(t3lib_div::_GP('sokobanSkipAnimation')==1){ + $GLOBALS['SOBE']->doc->JScodeLibArray[] = ''; + } + } + if($row['header'] == '@' || $row['header'] == '+'){//player + $controls = $this->letTheDragonsFly($row); + $GLOBALS['SOBE']->doc->JScodeLibArray[] = ''; + } + } + } + + public function letTheDragonsFly($row){ + $tsParser = new t3lib_TSparser(); + $backendLayoutRecord = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('*', 'backend_layout', 'pid='.$row['pid']); + $tsParser->parse($backendLayoutRecord[0]['config']); + $backendLayout = $tsParser->setup; + $player['x'] = $row['colPos'] % $backendLayout['backend_layout.']['colCount']; + $player['y'] = ceil($row['colPos'] / $backendLayout['backend_layout.']['colCount']); + $player['row'] = array( + 'uid' => $row['uid'], + 'pid' => $row['pid'], + 'colPos' => $row['colPos'], + 'header' => $row['header'], + ); + $move['up'] = array(); + $this->createMove($player, 'up', $backendLayout, $move['up']); + $move['right'] = array(); + $this->createMove($player, 'right', $backendLayout, $move['right']); + $move['down'] = array(); + $this->createMove($player, 'down', $backendLayout, $move['down']); + $move['left'] = array(); + $this->createMove($player, 'left', $backendLayout, $move['left']); + //t3lib_div::debug($move); + return $this->createControls($move); + } + public function createControls($moves){ + $controls = ''; + + if(t3lib_div::_GP('sokobanSkipAnimation')!=1){ + $controls .= '

Skip animation!

'; + } + + $controls .= '

Sokoban Controller

'; + foreach($moves as $direction => $move){ + $data = ''; + if(count($move)>0 && count($move)<4){ + foreach($move as $uid => $record){ + foreach($record['row'] as $field => $value){ + $data .= '&data[tt_content]['.$uid.']['.$field.']='.urlencode($value); + } + } + $controls .= ' + '.$direction.' +'; + } + } + $controls .= '
'; + + $controls .= ' +

Sokoban Legend

+
Wall #

+
Player @
+
Player on goal +
+
Box $
+
Box on goal *
+
Goal .
'; + return $controls; + } + public function createMove($field, $direction, $backendLayout, &$updatedFields){ + $neighbourCoords = $this->getNeighbourCoords($field, $direction); + if($neighbourCoords['x']>0 + && $neighbourCoords['x']<=$backendLayout['backend_layout.']['colCount'] + && $neighbourCoords['y']>0 + && $neighbourCoords['y']<=$backendLayout['backend_layout.']['rowCount']){//nachbarfeld ist im spielfeld + $neighbourField = $this->getField($neighbourCoords, $backendLayout); + if($neighbourField['row']['header']!='#'){//nachbarfeld ist keine wand + $fieldHeader = $field['row']['header']; + $neighbourFieldHeader = $neighbourField['row']['header']; + $field['row']['header'] = $this->createFieldType($fieldHeader, ' '); + $neighbourField['row']['header'] = $this->createFieldType($neighbourFieldHeader, $fieldHeader); + $updatedFields[$field['row']['uid']] = $field; + $updatedFields[$neighbourField['row']['uid']] = $neighbourField; + + if($neighbourFieldHeader=='$' + || $neighbourFieldHeader=='*'){//nachbarfeld ist eine box + $nextNeighbourCoords = $this->getNeighbourCoords($neighbourField, $direction); + $nextNeighbourField = $this->getField($nextNeighbourCoords, $backendLayout); + if($nextNeighbourField['row']['header']!='#'//next nachbarfeld ist keine wand + && ($nextNeighbourField['row']['header']!='$' + && $nextNeighbourField['row']['header']!='*')){//next nachbarfeld ist keine box + $nextNeighbourFieldHeader = $nextNeighbourField['row']['header']; + $nextNeighbourField['row']['header'] = $this->createFieldType($nextNeighbourFieldHeader, $neighbourFieldHeader); + $updatedFields[$nextNeighbourField['row']['uid']] = $nextNeighbourField; + } else { + $updatedFields = array(); + } + } + } else { + $updatedFields = array(); + } + } else { + $updatedFields = array(); + } + } + public function createFieldType($field, $overlay){ + if($overlay == '@' || $overlay == '+'){ + if($field == '.' || $field == '*'){ + $fieldType = '+'; + } elseif($field == ' ' || $field == '$'){ + $fieldType = '@'; + } + } elseif($overlay == '$' || $overlay == '*'){ + if($field == '.'){ + $fieldType = '*'; + } elseif($field == ' '){ + $fieldType = '$'; + } + } elseif($overlay == ' '){ + if($field == '@'){ + $fieldType = ' '; + } elseif($field == '+'){ + $fieldType = '.'; + } + } + return $fieldType; + } + public function getNeighbourCoords($field, $direction){ + switch($direction){ + case 'up': + $neighbourCoords['x'] = $field['x']; + $neighbourCoords['y'] = $field['y']-1; + break; + case 'right': + $neighbourCoords['x'] = $field['x']+1; + $neighbourCoords['y'] = $field['y']; + break; + case 'down': + $neighbourCoords['x'] = $field['x']; + $neighbourCoords['y'] = $field['y']+1; + break; + case 'left': + $neighbourCoords['x'] = $field['x']-1; + $neighbourCoords['y'] = $field['y']; + break; + } + return $neighbourCoords; + } + public function getField($coords, $backendLayout){ + $colPos = (($coords['y']-1) * $backendLayout['backend_layout.']['colCount'])+$coords['x']; + $fieldRow = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('uid,pid,colPos,header', 'tt_content', 'colPos='.$colPos.' AND pid='.$this->pObj->id); + //t3lib_div::debug($fieldRow); + return array('x'=>$coords['x'], 'y'=>$coords['y'], 'row'=>$fieldRow[0]); + } +} +?> \ No newline at end of file diff --git a/Configuration/ExtensionBuilder/settings.yaml b/Configuration/ExtensionBuilder/settings.yaml new file mode 100755 index 0000000..0904d98 --- /dev/null +++ b/Configuration/ExtensionBuilder/settings.yaml @@ -0,0 +1,95 @@ +# +# Extension Builder settings for extension sokoban +# generated 2011-08-11 +# +# See http://www.yaml.org/spec/1.2/spec.html +# + +--- + +########### Overwrite settings ########### +# +# These settings only apply, if the roundtrip feature of the extension builder +# is enabled in the extension manager +# +# Usage: +# nesting reflects the file structure +# a setting applies to a file or recursive to all files and subfolders +# +# merge: +# means for classes: All properties ,methods and method bodies +# of the existing class will be modified according to the new settings +# but not overwritten +# +# for locallang xml files: Existing keys and labels are always +# preserved (renaming in the GUI has only influence on the property and method names) +# +# for other files: You will find a Split token at the end of the file +# After this token you can write whatever you want and it will be appended +# everytime the code is generated +# +# keep: +# files are never overwritten +# These settings may break the functionality of the extension builder! +# Handle with care! +# +# + +############ extension settings ############## + +emConf: + dependencies: cms,extbase,fluid + +overwriteSettings: + Classes: + Controller: merge + Domain: + Model: merge + Repository: merge + + Configuration: + #TCA: merge + #TypoScript: keep + + Resources: + Private: + Language: + #locallang.xml: merge + #Templates: keep + + ext_icon.gif: keep + +# ext_localconf.php: merge + +# ext_tables.php: merge + +# ext_tables.sql: merge + +## ext_autoload.php is only needed in special cases ## +createAutoloadRegistry: false + +######### settings for classBuilder ############################# +# +# here you may define default parent classes for your classes +# these settings only apply for new generated classes +# you may also just change the parent class in the generated class file. +# It will be kept on next code generation, if the overwrite settings +# are configured to merge it +# +# Experimental!! +################################################################# + +classBuilder: + + Controller: + parentClass: Tx_Extbase_MVC_Controller_ActionController + + Model: + AbstractEntity: + parentClass: Tx_Extbase_DomainObject_AbstractEntity + + AbstractValueObject: + parentClass: Tx_Extbase_DomainObject_AbstractValueObject + + Repository: + parentClass: Tx_Extbase_Persistence_Repository \ No newline at end of file diff --git a/Configuration/TypoScript/constants.txt b/Configuration/TypoScript/constants.txt new file mode 100755 index 0000000..80b0292 --- /dev/null +++ b/Configuration/TypoScript/constants.txt @@ -0,0 +1,14 @@ +module.tx_sokoban { + view { + # cat=module.tx_sokoban/file; type=string; label=Path to template root (BE) + templateRootPath = EXT:sokoban/Resources/Private/Backend/Templates/ + # cat=module.tx_sokoban/file; type=string; label=Path to template partials (BE) + partialRootPath = EXT:sokoban/Resources/Private/Backend/Partials/ + # cat=module.tx_sokoban/file; type=string; label=Path to template layouts (BE) + layoutRootPath = EXT:sokoban/Resources/Private/Backend/Layouts/ + } + persistence { + # cat=module.tx_sokoban//a; type=int+; label=Default storage PID + storagePid = 0 + } +} \ No newline at end of file diff --git a/Configuration/TypoScript/setup.txt b/Configuration/TypoScript/setup.txt new file mode 100755 index 0000000..7d1b54d --- /dev/null +++ b/Configuration/TypoScript/setup.txt @@ -0,0 +1,48 @@ +# Module configuration +module.tx_sokoban { + persistence { + storagePid = {$module.tx_sokoban.persistence.storagePid} + classes { + Tx_Sokoban_Domain_Model_Page { + newRecordStoragePid = {$module.tx_sokoban.persistence.storagePid} + mapping { + tableName = pages + columns { + title.mapOnProperty = title + TSconfig.mapOnProperty = tsConfig + pid.mapOnProperty = parentPage + backend_layout.mapOnProperty = backendLayout + } + } + } + Tx_Sokoban_Domain_Model_ContentElement { + newRecordStoragePid = {$module.tx_sokoban.persistence.storagePid} + mapping { + tableName = tt_content + columns { + header.mapOnProperty = title + CType.mapOnProperty = cType + colPos.mapOnProperty = colPos + pid.mapOnProperty = parentPage + } + } + } + Tx_Sokoban_Domain_Model_BackendLayout { + newRecordStoragePid = {$module.tx_sokoban.persistence.storagePid} + mapping { + tableName = backend_layout + columns { + title.mapOnProperty = title + config.mapOnProperty = config + pid.mapOnProperty = parentPage + } + } + } + } + } + view { + templateRootPath = {$module.tx_sokoban.view.templateRootPath} + partialRootPath = {$module.tx_sokoban.view.partialRootPath} + layoutRootPath = {$module.tx_sokoban.view.layoutRootPath} + } +} \ No newline at end of file diff --git a/ExtensionBuilder.json b/ExtensionBuilder.json new file mode 100755 index 0000000..0577c51 --- /dev/null +++ b/ExtensionBuilder.json @@ -0,0 +1 @@ +{"modules":[{"config":{"position":[16,56]},"name":"New Model Object","value":{"actionGroup":{"actions":["create"]},"name":"Page","objectsettings":{"aggregateRoot":true,"description":"","type":"Entity","uid":"624779408684"},"propertyGroup":{"properties":[{"propertyDescription":"","propertyIsExcludeField":false,"propertyIsRequired":false,"propertyName":"title","propertyType":"String","uid":"26917979526"},{"propertyDescription":"","propertyIsExcludeField":false,"propertyIsRequired":false,"propertyName":"tsConfig","propertyType":"Text","uid":"14184745947"}]},"relationGroup":{"relations":[{"advancedSettings":{"inlineEditing":false,"lazyLoading":true,"propertyIsExcludeField":false,"relationDescription":"","relationType":"zeroToOne"},"relationName":"parentPage","relationWire":"[wired]","uid":"1080414201811","inlineEditing":false,"lazyLoading":true,"propertyIsExcludeField":false,"relationDescription":"","relationType":"zeroToOne"},{"advancedSettings":{"inlineEditing":false,"lazyLoading":true,"propertyIsExcludeField":false,"relationDescription":"","relationType":"zeroToOne"},"relationName":"backendLayout","relationWire":"[wired]","uid":"51657990858","inlineEditing":false,"lazyLoading":true,"propertyIsExcludeField":false,"relationDescription":"","relationType":"zeroToOne"}]}}},{"config":{"position":[16,1019]},"name":"New Model Object","value":{"actionGroup":{"actions":[]},"name":"BackendLayout","objectsettings":{"aggregateRoot":false,"description":"","type":"Entity","uid":"1005810083114"},"propertyGroup":{"properties":[{"propertyDescription":"","propertyIsExcludeField":false,"propertyIsRequired":false,"propertyName":"title","propertyType":"String","uid":"336721276421"},{"propertyDescription":"","propertyIsExcludeField":false,"propertyIsRequired":false,"propertyName":"config","propertyType":"String","uid":"664874820703"}]},"relationGroup":{"relations":[{"advancedSettings":{"inlineEditing":false,"lazyLoading":true,"propertyIsExcludeField":false,"relationDescription":"","relationType":"zeroToOne"},"relationName":"parentPage","relationWire":"[wired]","uid":"940961563104","inlineEditing":false,"lazyLoading":true,"propertyIsExcludeField":false,"relationDescription":"","relationType":"zeroToOne"}]}}},{"config":{"position":[375,78]},"name":"New Model Object","value":{"actionGroup":{"actions":[]},"name":"ContentElement","objectsettings":{"aggregateRoot":false,"description":"","type":"Entity","uid":"842570599920"},"propertyGroup":{"properties":[{"propertyDescription":"","propertyIsExcludeField":false,"propertyIsRequired":false,"propertyName":"title","propertyType":"String","uid":"781062075285"}]},"relationGroup":{"relations":[{"advancedSettings":{"inlineEditing":false,"lazyLoading":true,"propertyIsExcludeField":false,"relationDescription":"","relationType":"zeroToOne"},"relationName":"parentPage","relationWire":"[wired]","uid":"1202234897139","inlineEditing":false,"lazyLoading":true,"propertyIsExcludeField":false,"relationDescription":"","relationType":"zeroToOne"}]}}}],"properties":{"backendModules":[{"description":"","key":"createSokobanLevels","mainModule":"tools","name":"Create Sokoban Levels","tabLabel":"Create Sokoban Levels"}],"description":"Play Sokoban in TYPO3","extensionKey":"sokoban","name":"Sokoban","originalExtensionKey":"","persons":[{"company":"","email":"mail@marco-huber.de","name":"Marco Huber","role":"Developer"}],"plugins":[],"state":"alpha","version":""},"wires":[{"src":{"moduleId":0,"terminal":"relationWire_0","uid":"1080414201811"},"tgt":{"moduleId":0,"terminal":"SOURCES","uid":"624779408684"}},{"src":{"moduleId":0,"terminal":"relationWire_1","uid":"51657990858"},"tgt":{"moduleId":1,"terminal":"SOURCES","uid":"1005810083114"}},{"src":{"moduleId":1,"terminal":"relationWire_0","uid":"940961563104"},"tgt":{"moduleId":0,"terminal":"SOURCES","uid":"624779408684"}},{"src":{"moduleId":2,"terminal":"relationWire_0","uid":"1202234897139"},"tgt":{"moduleId":0,"terminal":"SOURCES","uid":"624779408684"}}],"log":{"last_modified":"2011-08-11 09:00","extension_builder_version":"1.0","be_user":"Marco Huber (2)"}} \ No newline at end of file diff --git a/Resources/Private/.htaccess b/Resources/Private/.htaccess new file mode 100755 index 0000000..dfc0272 --- /dev/null +++ b/Resources/Private/.htaccess @@ -0,0 +1 @@ +deny from all \ No newline at end of file diff --git a/Resources/Private/Backend/Layouts/Default.html b/Resources/Private/Backend/Layouts/Default.html new file mode 100755 index 0000000..44c759a --- /dev/null +++ b/Resources/Private/Backend/Layouts/Default.html @@ -0,0 +1,33 @@ + +
+
+
+
+ +
+
+ +
+
+
+
+ + + + +
+
+ + +
+
+ +
+
+
+ + +
+
+
+
\ No newline at end of file diff --git a/Resources/Private/Backend/Partials/FormErrors.html b/Resources/Private/Backend/Partials/FormErrors.html new file mode 100755 index 0000000..3602f09 --- /dev/null +++ b/Resources/Private/Backend/Partials/FormErrors.html @@ -0,0 +1,13 @@ + +
+ {error.message} + +

+ {error.propertyName}: + + {errorDetail.message} + +

+
+
+
\ No newline at end of file diff --git a/Resources/Private/Backend/Partials/Page/FormFields.html b/Resources/Private/Backend/Partials/Page/FormFields.html new file mode 100755 index 0000000..b6ad364 --- /dev/null +++ b/Resources/Private/Backend/Partials/Page/FormFields.html @@ -0,0 +1,8 @@ +
+
+
+
\ No newline at end of file diff --git a/Resources/Private/Backend/Templates/Page/New.html b/Resources/Private/Backend/Templates/Page/New.html new file mode 100755 index 0000000..ba6e51e --- /dev/null +++ b/Resources/Private/Backend/Templates/Page/New.html @@ -0,0 +1,42 @@ + + +This template displays a NEW form for the current domain object. + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + New.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

+ + + + + + + +
+

+ + +
+

+ + +
+

+ + +
+
\ No newline at end of file diff --git a/Resources/Private/Language/locallang.xml b/Resources/Private/Language/locallang.xml new file mode 100755 index 0000000..0962c4d --- /dev/null +++ b/Resources/Private/Language/locallang.xml @@ -0,0 +1,20 @@ + + + + module + Language labels for the Sokoban extension in the FRONTEND + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Resources/Private/Language/locallang_createsokobanlevels.xml b/Resources/Private/Language/locallang_createsokobanlevels.xml new file mode 100755 index 0000000..b322850 --- /dev/null +++ b/Resources/Private/Language/locallang_createsokobanlevels.xml @@ -0,0 +1,14 @@ + + + + module + Language labels for backend module Create Sokoban Levels belonging to extension 'sokoban' + + + + + + + + + \ No newline at end of file diff --git a/Resources/Private/Language/locallang_csh_tx_sokoban_domain_model_backendlayout.xml b/Resources/Private/Language/locallang_csh_tx_sokoban_domain_model_backendlayout.xml new file mode 100755 index 0000000..5773855 --- /dev/null +++ b/Resources/Private/Language/locallang_csh_tx_sokoban_domain_model_backendlayout.xml @@ -0,0 +1,15 @@ + + + + Context Sensitive Help (CSH) for table tx_sokoban_domain_model_backendlayout + CSH + tx_sokoban_domain_model_backendlayout + + + + + + + + + \ No newline at end of file diff --git a/Resources/Private/Language/locallang_csh_tx_sokoban_domain_model_contentelement.xml b/Resources/Private/Language/locallang_csh_tx_sokoban_domain_model_contentelement.xml new file mode 100755 index 0000000..0d739e8 --- /dev/null +++ b/Resources/Private/Language/locallang_csh_tx_sokoban_domain_model_contentelement.xml @@ -0,0 +1,14 @@ + + + + Context Sensitive Help (CSH) for table tx_sokoban_domain_model_contentelement + CSH + tx_sokoban_domain_model_contentelement + + + + + + + + \ No newline at end of file diff --git a/Resources/Private/Language/locallang_csh_tx_sokoban_domain_model_page.xml b/Resources/Private/Language/locallang_csh_tx_sokoban_domain_model_page.xml new file mode 100755 index 0000000..1e9769b --- /dev/null +++ b/Resources/Private/Language/locallang_csh_tx_sokoban_domain_model_page.xml @@ -0,0 +1,16 @@ + + + + Context Sensitive Help (CSH) for table tx_sokoban_domain_model_page + CSH + tx_sokoban_domain_model_page + + + + + + + + + + \ No newline at end of file diff --git a/Resources/Private/Language/locallang_db.xml b/Resources/Private/Language/locallang_db.xml new file mode 100755 index 0000000..4e91cfe --- /dev/null +++ b/Resources/Private/Language/locallang_db.xml @@ -0,0 +1,23 @@ + + + + database + Language labels for database tables/fields belonging to extension 'sokoban' + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Resources/Public/Css/sokoban.css b/Resources/Public/Css/sokoban.css new file mode 100644 index 0000000..aba74aa --- /dev/null +++ b/Resources/Public/Css/sokoban.css @@ -0,0 +1,111 @@ +table.t3-page-columns, +table.t3-gridTable { + width: auto; +} +.sokoban-skip-animation td.t3-gridCell, +.sokoban-skip-animation td.t3-page-column { + max-width: 50px; min-width: 50px; overflow: hidden; +} +.sokoban-skip-animation td.t3-page-colHeader, +.sokoban-skip-animation td.t3-row-header { + max-width: 50px; min-width: 50px; overflow: hidden; +} +.sokoban-skip-animation div.t3-page-colHeader, +.sokoban-skip-animation div.t3-row-header { + margin: 0; padding: 0; width: 0; height: 0; +} +.sokoban-skip-animation div.t3-page-colHeader-icons { + opacity: 1; visibility: hidden; display: none; +} +.sokoban-skip-animation div.t3-page-colHeader-label { + opacity: 1; visibility: hidden; display: none; +} +.sokoban-skip-animation td.t3-gridCell div.t3-page-ce { + margin: 0; padding: 0; +} +.sokoban-skip-animation h4.t3-page-ce-header { + opacity: 1; visibility: hidden; display: none; +} +.sokoban-skip-animation div.t3-page-ce-body { + margin: 0; padding: 0; width: 50px; height: 50px; +} +.sokoban-skip-animation div.t3-page-ce div.t3-page-ce-type { + opacity: 1; visibility: hidden; display: none; +} +div.t3-page-ce div.sokoban-free, +div.t3-page-ce.active div.sokoban-free { + background-color: transparent; +} +div.t3-page-ce div.sokoban-wall, +div.t3-page-ce.active div.sokoban-wall { + background-color: #FF0000; +} +div.t3-page-ce div.sokoban-player, +div.t3-page-ce.active div.sokoban-player { + background-color: #0000FF; +} +div.t3-page-ce div.sokoban-playergoal, +div.t3-page-ce.active div.sokoban-playergoal { + background-color: #00AA99; +} +div.t3-page-ce div.sokoban-box, +div.t3-page-ce.active div.sokoban-box { + background-color: #FFCC00; +} +div.t3-page-ce div.sokoban-boxgoal, +div.t3-page-ce.active div.sokoban-boxgoal { + background-color: #00CC00; +} +div.t3-page-ce div.sokoban-goal, +div.t3-page-ce.active div.sokoban-goal { + background-color: #CCFFCC; +} + +.sokoban-left { + float: left; +} +.sokoban-right { + float: right; +} +.sokoban-clearfix:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;} +.sokoban-clearfix {display:block;} + +#sokoban-controls { + width: 120px; +} +#sokoban-legend { + width: 110px; +} +#sokoban-legend div { + text-align: center; +} + +#sokoban-controller { + position: relative; + width: 110px; + height: 110px; +} +#sokoban-controller a { + position: absolute; + display: block; + width: 30px; + height: 30px; + background-color: #7F7F7F; + text-align: center; +} +#sokoban-controller a.sokoban-controls-up { + top: 20px; + left: 40px; +} +#sokoban-controller a.sokoban-controls-right { + top: 50px; + right: 10px; +} +#sokoban-controller a.sokoban-controls-down { + bottom: 0; + left: 40px; +} +#sokoban-controller a.sokoban-controls-left { + top: 50px; + left: 10px; +} \ No newline at end of file diff --git a/Resources/Public/Icons/relation.gif b/Resources/Public/Icons/relation.gif new file mode 100755 index 0000000000000000000000000000000000000000..db61d7e18817e2969b740ccc62838a1447cd3c3c GIT binary patch literal 233 zcmZ?wbh9u|6krfwIKsfd$jB%yEgcvb*xK4Ud-m+*V6c9}`t4wF3=FP=!D}%14h9TB zki(G3kjIe9P{N?kkO3r981fmC8H$0t6rgAskS<}UWKjIc!pOiN#GnJx0zsgJEBshvI<>Lne0l)en}fzWvHFt6ysaM@@~DQbVIgvycNT2L~5d538f;ccvU1 zeHPQ2GIn^1cr6p&73IaoD$=91iK~a{(6rVH&ROOxH+%Y4hNqsq`BO~MkEuZ}q3Mby Zn_ZKDm69U|7Z(ptCx?^igb9ia)&LfwP0|1W literal 0 HcmV?d00001 diff --git a/Resources/Public/Icons/tx_sokoban_domain_model_contentelement.gif b/Resources/Public/Icons/tx_sokoban_domain_model_contentelement.gif new file mode 100755 index 0000000000000000000000000000000000000000..37ba37b9b3a220018e3a291bf2ee413d0da30ce0 GIT binary patch literal 230 zcmZ?wbh9u|6krfwIKlt|GBPr{y1EAX`lY3%Jv}|Mz+f2|Yy*R1U~nA_UV_1QFaYW; z2AhC~Q2fcl$iN`NpaW6^vXg-|S;5tE3G-Y5<#kHRdp8`B$dNv*cXpRhl~&t>ccvU1 zeHPQ2GIn^1cr6p&73IaoD$=91iK~a{(6rVH&ROOxH+%Y4hNqsq`BO~MkEuZ}q3Mby Zn_ZKDm69U|7Z(ptCx?^igb9ia)&LfwP0|1W literal 0 HcmV?d00001 diff --git a/Resources/Public/Icons/tx_sokoban_domain_model_page.gif b/Resources/Public/Icons/tx_sokoban_domain_model_page.gif new file mode 100755 index 0000000000000000000000000000000000000000..6cc5f16355d84652db5ce39fcbc7256b7ea457cd GIT binary patch literal 533 zcmZ?wbhEHb6krfwc;>^PT&ti`uNc2IM6Fr5d*_GlT^}Mg`l>Z4?cBL@{mqr@Zmft{ z7wEdsHlXM1p|kH6En2i~+qT*bFHc_i5WY6x!0ESfTY`5SewDjFA!B!R!NKH=-7#5v z<8pIzr=96jYgDqIV-eVU&ToZld3pKFnKKjS+;FNpvSrJblpPUfQw-u~UN@U;5Wc}@ z$BrEa{W=>rZk&4HOZ}!-d-m*!-W0Ir`qGWJ*7TfcZfa@@UE^PKph&A-&32ZV$71`A zWAz0q9tEs&-?wjHUteGDl80Iy>iRueDs>7`>w{xsV{`V!C+`Sfvt~_7N=o9k(EtDc zGYnRs_>+Z^fx(AC2joCdoG`E#HTX0&x3sqT=(8Hwwzskf@u~E-2#Sa)Om246yZMom0cTFy<3E({D?-?uh0SOWmDq@H{L literal 0 HcmV?d00001 diff --git a/Resources/Public/Javascript/sokoban.js b/Resources/Public/Javascript/sokoban.js new file mode 100644 index 0000000..001a748 --- /dev/null +++ b/Resources/Public/Javascript/sokoban.js @@ -0,0 +1,184 @@ +var sokobanSkipAnimation, + sokobanControls, + gridTable, + gridCell, + ceBody, + rowHeader, + colHeader, + colHeaderIcons, + colHeaderLabel, + contentElement, + contentElementHeader, + contentElementType; +function getBackgroundColor(){ + ceBody.select('div strong a').each(function(element){ + ceBodyContent = element; + ceBodyContent.setStyle('display', 'none'); + ceBodyContentText = Ext.getDom(ceBodyContent).innerHTML; + switch(ceBodyContentText){ + case '#': //Wall + cssclass = 'sokoban-wall'; + break; + case '@': //Player + case '+': //Player on goal + if(ceBodyContentText == '@'){ + cssclass = 'sokoban-player'; + } else { + cssclass = 'sokoban-playergoal'; + } + break; + case '$': //Box + cssclass = 'sokoban-box'; + break; + case '*': //Box on goal + cssclass = 'sokoban-boxgoal'; + break; + case '.': //Goal + cssclass = 'sokoban-goal'; + break; + default: //Free + cssclass = 'sokoban-free'; + break; + } + }); + return cssclass; +} +function cleanLayoutRecursive(gridCell){ + if(sokobanSkipAnimation == 1){ + cleanLayout(); + } else { + gridCell.select('.t3-page-colHeader-label').each(function(element){ + colHeaderLabel = element; + colHeaderLabel.hide({ + duration: 0, + callback: function(){ + colHeaderLabel.setStyle('display', 'none'); + } + }); + }); + gridCell.select('.t3-page-colHeader-icons').each(function(element){ + colHeaderIcons = element; + colHeaderIcons.hide({ + duration: 0, + callback: function(){ + colHeaderIcons.setStyle('display', 'none'); + gridCell.select('.t3-page-rowHeader').each(function(element){ + rowHeader = element; + rowHeader.setStyle('margin', 0); + rowHeader.setStyle('padding', 0); + rowHeader.setStyle('width', 0); + rowHeader.setStyle('height', 0); + }); + gridCell.select('.t3-page-colHeader').each(function(element){ + colHeader = element; + colHeader.setStyle('margin', 0); + colHeader.setStyle('padding', 0); + colHeader.animate( + { + width: {to: 0, from: colHeader.getWidth()}, + height: {to: 0, from: colHeader.getHeight()} + }, + 0, + function(){ + colHeader.setStyle('width', 0); + colHeader.setStyle('height', 0); + }, + 'easeOut', + 'run' + ); + }); + + } + }); + }); + gridCell.select('.t3-page-ce').each(function(element){ + contentElement = element; + contentElement.setStyle('margin', 0); + contentElement.setStyle('padding', 0); + }); + gridCell.select('.t3-page-ce-header').each(function(element){ + contentElementHeader = element; + contentElementHeader.hide({ + duration: 0, + callback: function(){ + contentElementHeader.setStyle('display', 'none'); + } + }); + }); + gridCell.select('.t3-page-ce-type').each(function(element){ + contentElementType = element; + contentElementType.hide({ + duration: 0, + callback: function(){ + contentElementType.setStyle('display', 'none'); + gridCell.select('.t3-page-ce-body').each(function(element){ + ceBody = element; + ceBody.setStyle('margin', 0); + ceBody.setStyle('padding', 0); + ceBody.animate( + { + width: {to: 50, from: ceBody.getHeight()}, + height: {to: 50, from: ceBody.getHeight()} + }, + 0, + function(){ + ceBody.addClass(getBackgroundColor()); + gridCell.setStyle('maxWidth', '50px'); + gridCell.setStyle('minWidth', '50px'); + gridCell.setStyle('width', 50); + gridCell.setStyle('height', 50); + gridCell.setStyle('overflow', 'hidden'); + if(Ext.get(gridCell).next('.t3-gridCell')){ + cleanLayoutRecursive(Ext.get(gridCell).next('.t3-gridCell')); + } else { + if(Ext.get(gridCell).parent('tr').next('tr')){ + Ext.get(gridCell).parent('tr').next('tr').select('.t3-gridCell:first').each(function(element){ + cleanLayoutRecursive(element); + }); + } + } + }, + 'easeOut', + 'run' + ); + }); + } + }); + }); + } +} +function cleanLayout(){ + Ext.select('.t3-gridTable').each(function(element){ + gridTable = element; + gridTable.setStyle('width', 'auto'); + gridTable.setStyle('height', 'auto'); + if(sokobanSkipAnimation == 1){ + gridTable.addClass('sokoban-skip-animation'); + Ext.select('.t3-page-ce-body').each(function(element){ + ceBody = element; + ceBody.addClass(getBackgroundColor()); + }); + } else { + element.select('.t3-gridCell:first').each(function(element){ + gridCell = element; + cleanLayoutRecursive(gridCell); + }); + } + + }); +} +function addControls(){ + Ext.select('.t3-gridTable').each(function(element){ + element.addClass('sokoban-left'); + element.parent('.t3-gridContainer').addClass('sokoban-clearfix'); + + Ext.DomHelper.insertBefore(element, {tag: 'div', id: 'sokoban-controls', class: 't3-page-ce'}); + Ext.getDom('sokoban-controls').innerHTML = sokobanControls; + Ext.get('sokoban-controls').addClass('sokoban-left'); + }); +} + +Ext.onReady(function() { + addControls(); + cleanLayout(); +}); \ No newline at end of file diff --git a/Tests/Unit/Domain/Model/BackendLayoutTest.php b/Tests/Unit/Domain/Model/BackendLayoutTest.php new file mode 100755 index 0000000..160aceb --- /dev/null +++ b/Tests/Unit/Domain/Model/BackendLayoutTest.php @@ -0,0 +1,112 @@ + +* +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* +* This script is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + +/** + * Test case for class Tx_Sokoban_Domain_Model_BackendLayout. + * + * @version $Id$ + * @copyright Copyright belongs to the respective authors + * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later + * + * @package TYPO3 + * @subpackage Sokoban + * + * @author Marco Huber + */ +class Tx_Sokoban_Domain_Model_BackendLayoutTest extends Tx_Extbase_Tests_Unit_BaseTestCase { + /** + * @var Tx_Sokoban_Domain_Model_BackendLayout + */ + protected $fixture; + + public function setUp() { + $this->fixture = new Tx_Sokoban_Domain_Model_BackendLayout(); + } + + public function tearDown() { + unset($this->fixture); + } + + + /** + * @test + */ + public function getTitleReturnsInitialValueForString() { } + + /** + * @test + */ + public function setTitleForStringSetsTitle() { + $this->fixture->setTitle('Conceived at T3CON10'); + + $this->assertSame( + 'Conceived at T3CON10', + $this->fixture->getTitle() + ); + } + + /** + * @test + */ + public function getConfigReturnsInitialValueForString() { } + + /** + * @test + */ + public function setConfigForStringSetsConfig() { + $this->fixture->setConfig('Conceived at T3CON10'); + + $this->assertSame( + 'Conceived at T3CON10', + $this->fixture->getConfig() + ); + } + + /** + * @test + */ + public function getParentPageReturnsInitialValueForTx_Sokoban_Domain_Model_Page() { + $this->assertEquals( + NULL, + $this->fixture->getParentPage() + ); + } + + /** + * @test + */ + public function setParentPageForTx_Sokoban_Domain_Model_PageSetsParentPage() { + $dummyObject = new Tx_Sokoban_Domain_Model_Page(); + $this->fixture->setParentPage($dummyObject); + + $this->assertSame( + $dummyObject, + $this->fixture->getParentPage() + ); + } + +} +?> \ No newline at end of file diff --git a/Tests/Unit/Domain/Model/ContentElementTest.php b/Tests/Unit/Domain/Model/ContentElementTest.php new file mode 100755 index 0000000..5499211 --- /dev/null +++ b/Tests/Unit/Domain/Model/ContentElementTest.php @@ -0,0 +1,95 @@ + +* +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* +* This script is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + +/** + * Test case for class Tx_Sokoban_Domain_Model_ContentElement. + * + * @version $Id$ + * @copyright Copyright belongs to the respective authors + * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later + * + * @package TYPO3 + * @subpackage Sokoban + * + * @author Marco Huber + */ +class Tx_Sokoban_Domain_Model_ContentElementTest extends Tx_Extbase_Tests_Unit_BaseTestCase { + /** + * @var Tx_Sokoban_Domain_Model_ContentElement + */ + protected $fixture; + + public function setUp() { + $this->fixture = new Tx_Sokoban_Domain_Model_ContentElement(); + } + + public function tearDown() { + unset($this->fixture); + } + + + /** + * @test + */ + public function getTitleReturnsInitialValueForString() { } + + /** + * @test + */ + public function setTitleForStringSetsTitle() { + $this->fixture->setTitle('Conceived at T3CON10'); + + $this->assertSame( + 'Conceived at T3CON10', + $this->fixture->getTitle() + ); + } + + /** + * @test + */ + public function getParentPageReturnsInitialValueForTx_Sokoban_Domain_Model_Page() { + $this->assertEquals( + NULL, + $this->fixture->getParentPage() + ); + } + + /** + * @test + */ + public function setParentPageForTx_Sokoban_Domain_Model_PageSetsParentPage() { + $dummyObject = new Tx_Sokoban_Domain_Model_Page(); + $this->fixture->setParentPage($dummyObject); + + $this->assertSame( + $dummyObject, + $this->fixture->getParentPage() + ); + } + +} +?> \ No newline at end of file diff --git a/Tests/Unit/Domain/Model/PageTest.php b/Tests/Unit/Domain/Model/PageTest.php new file mode 100755 index 0000000..04ec6fd --- /dev/null +++ b/Tests/Unit/Domain/Model/PageTest.php @@ -0,0 +1,135 @@ + +* +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* +* This script is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + +/** + * Test case for class Tx_Sokoban_Domain_Model_Page. + * + * @version $Id$ + * @copyright Copyright belongs to the respective authors + * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later + * + * @package TYPO3 + * @subpackage Sokoban + * + * @author Marco Huber + */ +class Tx_Sokoban_Domain_Model_PageTest extends Tx_Extbase_Tests_Unit_BaseTestCase { + /** + * @var Tx_Sokoban_Domain_Model_Page + */ + protected $fixture; + + public function setUp() { + $this->fixture = new Tx_Sokoban_Domain_Model_Page(); + } + + public function tearDown() { + unset($this->fixture); + } + + + /** + * @test + */ + public function getTitleReturnsInitialValueForString() { } + + /** + * @test + */ + public function setTitleForStringSetsTitle() { + $this->fixture->setTitle('Conceived at T3CON10'); + + $this->assertSame( + 'Conceived at T3CON10', + $this->fixture->getTitle() + ); + } + + /** + * @test + */ + public function getTsConfigReturnsInitialValueForString() { } + + /** + * @test + */ + public function setTsConfigForStringSetsTsConfig() { + $this->fixture->setTsConfig('Conceived at T3CON10'); + + $this->assertSame( + 'Conceived at T3CON10', + $this->fixture->getTsConfig() + ); + } + + /** + * @test + */ + public function getParentPageReturnsInitialValueForTx_Sokoban_Domain_Model_Page() { + $this->assertEquals( + NULL, + $this->fixture->getParentPage() + ); + } + + /** + * @test + */ + public function setParentPageForTx_Sokoban_Domain_Model_PageSetsParentPage() { + $dummyObject = new Tx_Sokoban_Domain_Model_Page(); + $this->fixture->setParentPage($dummyObject); + + $this->assertSame( + $dummyObject, + $this->fixture->getParentPage() + ); + } + + /** + * @test + */ + public function getBackendLayoutReturnsInitialValueForTx_Sokoban_Domain_Model_BackendLayout() { + $this->assertEquals( + NULL, + $this->fixture->getBackendLayout() + ); + } + + /** + * @test + */ + public function setBackendLayoutForTx_Sokoban_Domain_Model_BackendLayoutSetsBackendLayout() { + $dummyObject = new Tx_Sokoban_Domain_Model_BackendLayout(); + $this->fixture->setBackendLayout($dummyObject); + + $this->assertSame( + $dummyObject, + $this->fixture->getBackendLayout() + ); + } + +} +?> \ No newline at end of file diff --git a/doc/manual.sxw b/doc/manual.sxw new file mode 100755 index 0000000000000000000000000000000000000000..65a9b35a02a47e6ae223842e8c3bcaf9a0080c61 GIT binary patch literal 93632 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 z
  • +w;w&=x|`LOwLZb!E?R ze1E*bJw0=MaQHTm`X>bvyH+$SqE;}A934bR63s!);6B>l!F!lyt5>_)NNf7Kinz4>qma4F<}6ey_P){vamv&22H6nk#8#`I&42kM-duJyPurkafVdyg zV;xxtz;G~No=ToZL6uboL{ebOqru8`Jd}=g!zA+KNW?H+vztOVc`kmi$^1qfXr|p0 zWxZ?;Tgqtd!Wzg=uFH-4s)$C+dpeO(9mY13yh!gqHa-b+w9Sfd1O=ha(L%$y-ciir zaBUpxziHIyv)pj$!Gol%3jqhYK_&ab+wy7e6&Q>8G!zKZymYiLL||KetWqLLbyqvA zwCk@`bac{I+}Zr2Vu(|WS$c4QRnhzP>qp$B_0G?Ft&ss0MaV+ab5*ZTbGP)FGfywg z_Uf(a{4Jf0*e3{snYBMC2;U^-CncO%y=>Q(N?SV9iu{{uRX|gPBTP&~xpA>`nca-B z_mA>#7OOtk%s-`vU+af0`B9n~ja0<0G621%i1DD%WiN4iU^*klc&q-7va;W_wfzyr zX-dGPTXvz!%^dBmU{;sEAAtlBw1)$#(ZlT_E5#}NpgD`IW@tR;<>GtmDJh!(lpPjKgHa4n7RFpZ{12VZI zc_aiP)~apUYFsYkp!vienxiJ$i-zM#c{Hu(HHP3iwJmby85iLJ5Ba4^%y33bYMBmIEN*-d+~pD-Q4R zyja_`7=3%b8@_9C6QsWRu6Wb2{CV+B7gY>qI&31r z^jXu9HKop#bG?)I`syq{l%spS*obPP_XhvG&1}tt-NYKve7x(xl20d`Jc?8d9;P;1 zzeZEZs*DVbbQcWEOjpbb-3m7|Ug|B{98^O(<_wiy{QjuBa`hXj!DnxMx@YSPr z3Jx^BzBCJt7ILn5x3EIl&nG8!C5^KZwqqe@yaP%Hxd5-p1L^UdS@|&H==5_<3W2Fg zHTAGc7;VOqF~}E5afE|9c$mKdnGn#KK}4w?hRIVQ>bgU(!(LddX54g+tyb}~+RF4ll-qW&5 zRE6qNqed}CGC_ymMFs3u>6$J?NHQf%?3>3{5uR;#9 zep<3EG7wXEC2M#+cjm0m$)lJi9S$g4LLR1YgviIO;sZ-CtM|b{VpTP*X!}?2SpP}_ zS(6Z2@aQ`z0twe5YNd5K0SipyV1Eu>9tlpPRS@{-R54%U(*>DAWBBFS)dvy&+QEoM z=;~!O6exZ0lqHBD4iCCT=;&(hL+NKopyO~Cj7Vqy3}0C3*kRKnhA_^xp+pco%D`I& z9!kXKK2O~E*r;lBKG$4|D9BN%@5FszR^m+RJD{I`Qcml2wY*?yL{AuFQRHa%_uyzC z0>r@jXFL4#lI8^cbI{RGjDr!0JZfhI+=f0k>6i5Jx`Um^RKf-*T4j#lKNR3GM<4_g zMWK*C3i>XhsD=1j>uVo)pY733ezCr5NZ0TczS2QLfq$CRZ9jw*+AxnKev*uO{)6=`-BY>)8Qgb%9Fv^-Ww>%;(&)E!;i^m4yJ$TkclkkLAi9~p+NFDxo{TJRpA?D& zU5jo!wOC_j53TsH@Y*J~d$Sp{imMJ+cf+eOmJ~8Y|D9-)nfVrQtKMqO-pv18=d6vF zzZ9BCRg`1csb--6Y~A$FV5i|-CnWHJEK!ABJzf)tLdoi*!+%a+p*9-r3?e95Gkz_vRJ z(*Fxf3J(?1@fq*KtgQo}EJDfNyht^($wejh{xwt1ahfM#dYCvG`ERg?PyaQ?edlk9 zZdlHn<)xPxn6iOE@PrwVPF))TMVUHdXI1cK{AJjWa-4X{{c7a#fO=Vz^9;C3XarT! zkd$~%VT$X0H`-3<@lR_6>34R%@V?i!n7D7}i^v!$yfx18OK^mtGXt5MNKJlD_~Sa( z_G*+CYg`kCWe|_E?aT6j68<*4+WtP@cAi+1Pxx86lq&qk*O^~qF3b|e?U~}phOSw8 zuBZ&`x_ZcDF04_hV1M9~gI2UiqfIb=pa-3k@(5`sbKbM?XQY=MGy6B@7T}TO6M6ZqSKwIIEJ&AUsd5(4)6c5UO zOSW%v9qR_S)jU|x56elbi`m?~>|ks|0y+Va5#e=t0;*8p*#Ci;s86Y|xY9u~0_|^@oL!MxWftKV^bi=%c#0dHJ*QIa{U5&nfd*wX;jL`G4-~=^`bV2#%vAD#FFX7X28o_N7_PM zeq;=dr=1)41d|gtHwl0kI49Vr8UGV2_#F~KJKPEMbnAE3R%9`8%+t&S*J~u*$GqO+ zo7I6SL!X&z3jxQL+x#d~e~FpWBro^yUxm&zw&@AHE#D_?N5M*mYQuEuK?n22vIGYJ zbM@oKy|n7EVvV_ACvbLldX#DTyv_cCu7h$!TtP*uJ!H>fxDc=2@^_przW~*ZdL4!< z_05BnMy%HHF>a|uG!M($*17G>3jZ4xq>g{V?o~K+aj%I!s;F(?lTY*ws-ae}A6W6l z%gTn1yjO8Kt#^pjlb|`jJxD~2ZlGx zT&MT~uHd-d!os$8J7&kGi!6O3y*8OA`dOM})m$bDRdB52)lO^RL5dKZr|ZpVOf6$a z2QS#1p94gQuQJywEWE}I+_wkJdcE%^5orYbKM@Sv@cGA_*&49xW4ntM$|S#*&v!M& zK!ZhlgK-zOegEu)=tR94^Wn`_!SkbD(&9WK!bPyi*{?#}G&~u-2-A~VU`H85Z5|EO zL`O`%(OB2om=U0u(Q7+T9vBZ+W|rk(F{}{bln(P7JUEh*2P@`nga3IX>_6Ym?0X~o zOJSYKV2Dn)02yGH>IWV)N}p`IVaM(E#IlFw`it0=(+ibb!v-ymY{TeJw2!gsN{VS&Qo`$E5dEk zy#a=wz!P^jhDBn^$_PasC&jQ6)8n|9Q50A~)*17r56Z?(vU47H@fsRtiw_0!VZolQYC zh~=S1Cfg~4y=pJ+j+MZH5?odqhLdD`jNOAH*KkN^C+6uuUf=)sUiBS+z- zLg5Y7Z`6p7^qfu$uWbH?OVZIWODfDq?Tj@X9efiF8T4ClIhtBUXQxLM@w<#K!o9N# zS+rg)$BtX8)H@w20VBjE>Hu2!#z#j^1U#Yng1qN=nC@<7pCCGEZ3?|`s#|o}w`>7_ z)5y#F@Rot6x(qWD(zT2YFo~Ay-!UNBvkUX}0QFSNoA(PAyD0IbmoPrwpfL&j?I@-+ zHzpwP&v|Bz4LSYXPCy9Hl#C$@;fzchCn+0(4KoAZ55;B2lL{{7ND#nBHUNPUU;0{} zX2kGa(1kopnMd}A<2x&7Je3#1p9VJLZ_?T1U;gw(9N6->=;#Bzc3b(+ra%yoXI;Hd zW*1uY2WrX-1_~eV=ZrN;PXh5kMp&?)H+Dle6_eJ>RRzoln((G6+E)omV=BBBebtPBISL>f-a+ zdib8Ms?PQ8yNK@rI-c%wi@IP~*Jx&Dxyj|{g?#7(?3el#h4zSAu9FO#|2vPuE(lJy z+S4H;c=jy)=cL z3N98R0m86lpv=x0Nn;hGmXvT={=*5PKSYDUgzo=Aj3E9G_~?Hiw*M1L`hRJ3DElRF z;}hyPnZHdM3d)i}3=fkD8sDuDWgewZ$=))`NvM5!$HV}4A!mLUWZj$dONYAZU4YN| z>34s$lR90TMC0b=a=DWj1+Gw=6LBbk*JdI#Hz|)VE~CwEv2|p=@+3AgCb;B&=j4h9 zIkU6^RyA3E6S}+sGVf-u9226>kqaWlzaC39^!$~BY$jg}eo;q&KE1FSR>6qlTLf$F z{1`0zXRtZ?ZSk?Sc@_==dd20L+saY*f2Z3h)aQ^f;CEQ=CDSiJP5%PIqgvRj%H6Tn;ResW^_<G$p?j>Oe~z?{BZP|dZ#2qZh`8uY>;5*Od*9$!YL1jaE8BLT5B@T$e_>Vq91fE~%tChKYuT2Col5Jb2~r370;8&>=Fv$0teTf-ESf(vvQvw8cO;aN~9W% zK}bflT;DtNhqIjYl6ncim?g~@37?% z0{9;tmfNXCk|lfND1)fQ5)#`{zN5v*bCBC)LH_Z1rgSwjB})`t-7SN$^)P#fW&ZSm zc}WSG;z9`io)ZNg783fO+!IQcs2{cvxSHe#>F2O{Y{fb-S<+NYgYvsk60wx=a@8jb zWd$RCqsw`^o|zppdD{)}L2AD+u9N3}&MX~*4ag`*Pc*GTBkNhJs2{S?0et%htW={S z$vko64UB{&h7;=&eQu_A!r$PDDyWE4vz0)CEmg&6Q})R)W^$QJZfq0N0y|XhRTu8Q z86``;V9aF9>xJMG6`@p|EPJSy$SWagF_F8h2zOSa2Ct5fliA;(4Q3PI0hLnd>LroI z=@Eshch(~~neZIiPLa@r`<3(Mye`-WJZ`PVorM5yE{aH?{cs&;-5 zw(_ld1ATV@j-=H5LF&&imh7loVIU|o|6o<&|D{kv3;Iy^01Hx|oQ&0kivH(fRp`D0 za(9yQ^NKit{>EmCGXh9-S%<{DLZ^R8jrod_9|PJCDkV3`7X%##Nn%G3e7ewC`ny1LkZ2%`k>aCdiZIQX#>YD!5BG>-Z* zCI8%K46Gzryo7n&49%-&YrXSdQfX6=f#bj2(*N`8%Z^F*IpU+_oUNMn=2b#uZ?M10 zatPHh^qpsr9GZ%UcJBPL0I@sU(22=&Vj<*7rflLxj*B$=nYnu+bx2(U1Qk0@EK$T~(Xr~)T z(C^3hr^ul( z=l|LpQpBFc{LbpQbJzyV8a=z(@H&VumcI>^@^Ra->o*GbSiK$ioz4sj|2_8S-j^Df z)_t()7s^L1+d@YYQi;t;q6XgO(VcK&&keNGiLI^l_y+Y<`GJ+bu#6_6k>@pC?< z!~Jg8w|c$XTlL2c_DR571mc~-=|Hf-f8Z3=;DDn4fZ-9@>`3qWb~_N)*orI>T4!!U zkDKu372i6Mj}k;LM?{r(qO!Mu{5I!PlAD556!7Kci|CI}3SL3oA)6=x_R9&&QM;X2 zo%TD{$OQkr%2{out{d;^vEtlm(x+O;`$vpIYNLL!4O2Q-?IYI`FNfVUmsq_-c%N=-u>&<#{dlA!w)XY$x%hK&du32 z*-<6o{S#3SbJgQJpIl>&^|j@0zc@HPhXO42eE-wnGrpOSH3IC{kV}#Nobf4L1yJS} z0-WjEhuuc4hdbk&303?C}>rDjlbJ=J7d z7f$!djy$kg(HrCqe8HLv!Gvr?KF5_QRo*Gz8EnwaEjK~=lADD7K4ZdP_4Xe(u$+no z@QHd{+04iN#oMQQ%FpGzv|Nh1rAls=J5Aq#yaYBcNcv{^4VT@kwjfjx&tgV>N}&Pp z)7uqJCRP?4Tnst!o9(HZp_NN*bdy#xE8T;A=nsWEFajapJQQc1C8GMz*D3OpQzA3fA*~Vm;X>)JNI_M!ncAbw$4gC6rJOAbJ0cooAidl4#K7 zrgIx|psD+73V0jO>$=7857HJ^x`ukH|0RwL5(*4Jot>KYJZPR8Dfayr!vTOy$beal z8H8;U#7Q}BMX&FTUN8^e409$S*!}ztRNR|fQ4w2AKuG?*%1o7LAd%XlZ1??w`;YxZ z^N7vx0`4RV$TSvT+0)S0R3aVUSo+11zihmH#s!$ev{We4*N*n zh90lLA74UuzancwnpKF(xS`?fyUXSLn%{826)o;^E*+@)T(|1!@gkx}UKn22Djd_i zx=#=?RLG9OPS?(%|0a6ta?k6+8a(0epFzJVnEG-R1={}^-Qy1%=(-i)Cv z3zQ<-(zpna=LT{vc?5gP+5|Y@;y>7`lVTO)J-3TlMhPlodJ`iYgO}S|&g{>d|1qPB zAiW|X-XJYpgr$+@Ju)Jeweaj#$%Z`-F&4f%Cg69T?<|J#Pev89=Fb4uPyor$ZfAG~ zeKP9`J0Ukhcs&EmET(;2f&OiHSuw@XTe;m?yGdG^-h7&>H~+WJr*8nyNJ~f#@lm=L zA2BX;>L9v|i`XZS9reusxxWor=%g20Py5G(iA=_d&rZj1?nm``EqYq;+)IsRCss}a zMXsIR?O$1(Lm+Ggfkch@B@&-k*z0h$lTUTFD29hIsfvB|YT6vLPtPL{sX-(O_=juV z+LDk!x39m*L8rTLEYo~n_X*<{b8Cx5LADcaFTHk~<5=(9AO3I&n^tLmo8`$DqWJvyUu> z1e#DdmHqwvQAtDRGyTtlN+B7SBy>#ym%Qun(rVT~yn+~7t&1XmF0WhP>cJXlX(U@TV1Q`_zlm7zj?(;2GmWSa4p+kw`lIG9(uL;{fUX_b zwyNIu!yvDsALMjI+G!pfpZ0{x!Jj9K!iL9dL~EE`ZL_gDtthqT%vK^=m9w`-fjMbK zNiKh%DjLyBl{OoNVXHxAA0#`EggsDY_Jp(r&UKwE+C}*`ztKccy?^EED=p=-V)2 zW)?FrAUz*892XS7dr~R(;m(~Q{63}B93G=o!~%w5lD{VMSjCy=Wa8EGpFrAfHFHQ{ zxJn8HsoG!_r!&D~e2t;NLqk@gAgcxdDR$F++~+SCDynF&3u)R=Hch%vk$GpjcXkBSEt<9l`&*a81)mL7vU$` zDC2n*5325OvHMra;3L<4t6X=O;&Nj6it5z7do`ip+Y$i0JOr|xF?Zd@q3%7uF@OVe~#bK(-5GfEwB2m|Bk z173cdKs2}b9D|^&D7CmR5*F-rHBi4yOVzS~3W}NlA@A&A9BHiaIho&l-rNh)Sq&7! z$l#-&Y%Q6Luu*7NPkPc3SV?UB?ZrXCUMdp)Lk^&q1L7h2tIC;aea#gk)=jBL(-Mvm zA6#>OpUb;_)$=Yu!q8;;v)ZCbp#?AWeIQVl0@<@E^xbjazaColfg%oci2j$q@&DbZ zdRfyO)F_e1m$tSFW!Z2XP85qxVE_fb;}UP6mW@At*+beY)BH02?P|-NA}^#D)-+?) zraHaQWBjG&f|X`|2v9Vzs*&|^x=#n|AfaT=tF^gcb9pX>eVqLW=Wi?%>^SN1o7jA9MC`cL&U7~n(IID;er056k zzYO?^%)T!2^;z;oyj4DY)LHZmWQ)n!y!+EbA7>mRM^A{+q*9G5oKF0KH>cR51O3-^ z<11;D_V?+pUp%^(GZkQas8`I#XxDyvjJ|{>q;Gxmx#_q_SDz|*t`iW2Ig@?iaJutr zJ^Q}#w6)!70>QZu;afrKz(Nv35q+ya2Opk2%h!CYY{>R;29(MqVv2<4Wph7lLNSs!6WI@*St@qD++(3lQRuiHhj z&WIF-c|QmI_;Xp0Ar($~U3CepZ~SVk%E_9{*FzO-#OCOzQz{tPc*jz0dReI5<7Q2u zNIAa`Kynw5VemjE8p1w~F_wAbuBywzAWsS){fBiF3P14ffB^bi)S5Rkr_7{Sj5{1P zEj727sAWPsPP$!nkbH=j4&EbM9N3X>H!pzv7=C$DEdf9Q-2gY!Y;-E1porIXsX((k zoCgLe+;mW>3FE`;2U&2@am|?g609KJS;~6S+RBd4kuzi5q`eE>KhRb$80d1nffs*I zq0ZgnXNP6pOrr9D!ea0((?!sK_pH2IM%l7ZK@3IA#}`! z)XVeTlUCd2b!XdN^KMy`09pkX&6j@}+mluXRQ!=SX>xN)iY>F4x4Jf3OPJECd-my1 zpYR=7^VVjW-|Gar+r#?37&$tI$|juV^bNQ*5<*R87P%-7B5@bgae?mWq`lqKR96F$ZbF^s0PnulUY3`v6y_Jna&0#J{QieiC+ksj#Wsb*ubP)y+ zni*eJ88~u9D4FQfKQ%7!gx|&DOxGfGMkDR`;{>KghM1Q6rXN|ID`F5$s{OZ-?Gman zK6v*V!i@wJ2kS$Wlb0`m#FvEFchCXywxm>+9H@b;3sKHXJj9XocN^}|6;K1gB%4Dg zWIVtY%mFo6Bd=>gC(P0t{iTP5|CkkyQ&yTY-FlrJfTfz=ZFRImr@hw|;N9y6deQqQ zL96aoWeaxpw}gG+o8d}l?Fqx@xh{%iGJCFv!V%DbE;2Tr(wDrLm>B8jEA06KPIotr zDgJ+!gYoCAF|pNcH0ZdITDc zR?Dof|K=PV(#Y0Ft>KWAPe-}c+@I2^h@lx_G#wyBWA7exayPM8W9aO8)+UfZX6Pyi zwEq*<=F@x=?T%=VmJ+=SrwgA6<}hk7G~D|Bm&k|!$>6=nfaFkkVW4#Ndkz+SgbDrg zfVy5?wT*vr*0Y3To?-y6gEEY{Iz|IokcKd7me>5ITy`LwDAYIud5vzT8^-!>&2lMVj_rdXqj&SnT|;VrCI| zmdi=J`mkb*Itf$LBAk!D>4POb_TRBINoAFY#MCO$n#MmY)R#26eN(xC`EbNHc#wf9xK^nu3wKN0U+T<< zN&DZqWk^L*gQAFxZx$l9v_x#s?bMijMz>Hx13w338}X$mtv66&RLBpxVhsdTfq8#b z+gU)VV`HnIr9#m3*yj7A+C6CrxjJ*nPCtUneRlALG4 zacSGy?r8vgB}+}68B>s(1LCBD#l5tNi>Q`DmM~B)F&1saWF!>s5QR8u zDCM(Ijdw)F#Lz$hGjMwfGd1*U_zTNl>%8cdl{54S-&w&~hbWuXX>&9*l7&m*LdGrh zbt}`>O%1L2>HQm?)C({-1jL<1#c2p_NAi0GbZbf1M=TY$V#HDE{%Bx`K|qSv292|v z(Phzl!)8sGS+L+JK_%aR?Bb_PXZZHLQDm5lT|cDwyZA;ph`HQvzC!oHlG<)7UIxR+{oqm*3pD@5?d2f5Vj-A7 zHU%t(@Nt_aV7V*HA}qi* zPXLJ>;2moWnP1DTbnlORGqUG-z=r$oQcKJ8V9yJnIIHnb6r3w1&(lk_oDD=XChhrT z<>lK)z9^zRJ^C?S6#RvNb|4Q$7I6WN(Y!1VO}%E7G6 zbNo~@WkmP=4iQ5@7iZ4JP=#)vZdzAoN$b6cG0C?Tgl*V7)cu)t^9+Ze|9%`LoK74h1q_*m^m0pmFGACrj;EpmoG7aN(oi9cHJAMFE3YbyVd3aB}N zC=n=G6{R{a8eG04EcUPK4aGW34BvtJ(xPT~U4pkQ$)C8fQ5u&?=9X2U%*$OBdord=3B98m-0^UIij zuMkNr4RDsIFhiZKyan|1r7qpmQLNr&LCrvM*inS|8WP% zR6IyfFxp``1K|HZKMOe>It6#O{cyCcW2uHKi^0O?v`Bw~ zB!&serRKFhHX6awo+?c_S@jAQ68f#7sU9y1SCp5Rwz)TM-rSt>m-=?yhWPn9 zw&J(fyw8=B0zNNY##Fcn$pbkUIp`|_abxRV(Qkw5^B{L@hxSaCxy)eB>>B&KmbIEg)w#jhNoQm%={%7Ma3JJ5M|uI_n8Y3#xCC=m?=tc zxmeR*0`2&%m?Nn7vU{+`d&_LfnD;`6=tZ(Q6}{Ddi-vB9ySC-u6`TESFyr`ZX10e@ zlEeM2;ZR+*Sag*qC@WE6Q5q^lQ6rCm0QFl%V2=kf-J(ABG)w2A+tv7o3WBqUiJ?qB z#`s)6%KoPo*a52$bdzB75o`IU+vRBK^G}Jvcx~JJyFcYWerUR6C!|e?)1nd3)!C-Z zN?bbc+j3CS>v3DcsCZUr+Y6Rf8Y#jbwe4Q6T<0=YIXZN2hxC3vfhqDX&-(VgPK|!$ zt)LAfVtITyvDl5;!hVXi>70O=^#)h>ly=iFSRe>!Ya2`^Mu|J(YSq&*)?3?Ise6?& zN;O%^(hvDrxK-FVj&y4<`g*I5#yF$uhRO3t7Lk4OX*|ffTTZ@nhDNU8)4!K%905FZ z1{30QE=p|D1MiUci+3zQUJ*_tNG=6Jn(~Qga>y0-_6%OIb{m~4M1Os=8cE#nk`tGJSs`s?U|iG@5OYAOM82)DWvTuKkxi~qJrx# zOmqTnI#Gt2xYj7m1);_frANw5Tm63z`9MiB6UwtS+FzHj$aFZ?LrC- zp{Qt}MfnNmy$Pus#AYbFt+;u28aVuHov_3ZyNzAYXB{s)j5o`+S>N7Wq23Rh&7|U^ zTlPct8~-OR(j87ActkWV3f*dF86V@gR>uHpDnhKB`|-fj&{(}}L8HxbOb3oFX}9+E zOlJ4`?^P`0%>Z$YgisK;1Zl!L4I5$vVU#7ph#R6}_PEp+6}zLeTC$;TOpDSA1^DVS zC6{*GOi@3xqI){TlbZeBmu-o361nU?k`3{B?#mB%I|Bq$Glw<%xzX*%x?#)bJe5;| zqG#DjhH7G@jHxUh&eu&WNp-&9h@sp2rrDkM<;iK!fme<~&;H@xw#I>(neW@fW*>Hc zB!>rREZ^Glu{pI(E@(|We1`387~HyUx5_{kww~;r58i3vS*uj=4 zKhjdWT74CERc|Ac5B)nh1+@DH6KAi2os5~L4ic_tDLYv$+P3GRr!h6{_sPE>YB*(b= zpe^?Wi!j!#uJQAeRF+kfNfW!9yGka!!A1`!qG!K&zB6ONA0+ALH0EZdv z{dJi^CJsk!Lh+`@;P`+io15G6jniK;p);WF>13}!?%MPbk?G>}5FMkoZvgKbf$Qfc zPS%gdkR4NE6u2QW%DdO~)VojQB!~mnp#Fi6HEKtOOU1;1&)^rwz7F*DHN|MfGfq#X zzJK*L&|KW$;^Eym0|mx*3v5&9xF+OLE(BA(NM?uri@(NmU@2)K2naOY2nfwW ze8~h1Wr*aQjZ93dwoFV^cg##LQ6jB^;nv6IbD+RDW(Vgc0>b7X0)kw(5__Mq%?tKJ z;r7}f(yanJGB`Mhk}Nb#2}JMTAHcpsf`S0s;1C$VvHahofd^h;>geER?%>AYWp8)M zZ~OmH_7+faJj?TrPfxvE1lA09^=T3jr;f8CpHe9sjtAZ6)C&IMly_e zJT<5k)Uj16jc4+a>@k*>3z+V3aY0(O2R*k3<~AH~h>d7T;pylD9)Ax!&ohINIEJ^B z&rCM%QSd*LV@^>G?0s81Y>DjOw)ccP_|~yu5DG*L7k%+DI)YCI;VBnU6Yn1~#X?(Us1*hH?p` zSeG^omNyQvGBH$Q4j2{6-~|bGNLHu;BK>^nx1ZWd(&r}QINXm&H}yA`#n^UqEZjX0 z!%n5x9yvzu^tXGcWR6HJB1m3*sPas&(ITcL><>w%q2l5cNyETYN49u*y4gnP-kcOY z8fL>AhbTod_Ikg>8Cc6?9A65-)r3*nvhY2JEem`1&I6&&_7@e#`!Ys~X*!q|Q%cpc zWA%WlwqwzOKBVwl)!~u_x*27YGrGJZ@y3c`Dc)y-sA33!TV-yDYS@ zp$V14Tmd-U@-0`|E!g4p(Q6+~^dP#@sh2E5t)ynra}AF$nro2Rb3yI@fDk$D5%cGs zH@Z|Q_9lc*38^3QwZK{RSvw$8*1H~Y7kx&2xG-mXG<%bk{_&&Za2lKIJU;DbyZNQw zPZC+TeUvb^m)-Uf3qB#gi?v)N-|+l{j4Y0&`hb&MqHEQ>DukYrrQLTkH?Lct<4K?K z_2y)1wXz{+?mmWNCi8x&U{~h%@h-V#-l{KKz=e-=;O9bFT;nP%0LCW-cxnARkLnwpKNp z7WARkRercC6F1iJ8S&S)w!K6dow}@5D7tPu( zwY2hqUtB9)r4V{GK`wv(?HBT~Dv9GH=%l^_jD90XNce5-?kskt-7MsethR-&{6jePhu>!KmEv9`jDWb9$wK`I@+WkE3vRz_waz5&a^Qp z>Y7pd_L&EH^)wZRa4F!Ng`m1xJe!FvOQYFv%E7){ObE`Cl@s|&M84%UMb)Ig_&Yn^ z0jrxRmRi4p>x(nSfW7~0M1Vc(JRX{7%fg{SBL8JUR>b+ZXHyb<}O7vN{Bqhl)AGMo^=e<1XCJ};JzG&@EUk0Urk_f^~PGayr#(Fe;mNCAx zhxkrEx)dGge=aeq^_Z&CIWc5ev#47ntJ29?C2TP6p5mmZDotKo&1+M#`uQ7tIZft> zY|g~smqb}X@dlmFL~Jx|Ib&vVBNTT9#6vE5p?hmUMzvYQF*7z?V{+$YeaHpJ4!ZW| z=m1pt6ut@@NLZ9g%&VeFHBDag5|M-k#=uiFW4vo#9F#VV7S)Wk;#k#-+XBnDWa&$K zvWmj?Xfp;b-coO2EC@mRN7*|{)CjQhNErZ2Q+caz(xR@WsBEa4zPhC_4f0|wuPQ;J z;~@d(aubT%=PBvX2i>sAB*KBTM}6)y2o95$;feJZY^7{-B^b~f8-E)vPk!%TjUh*zQx9MuqWzRlM90yaS4wYh$QfjV)587aM2Y4C+!kH=u4Dvy0cQ4o<(o}{RjGg8; zG7k@g@yG7^(wG!``y2A1O->q)RbzH!b89==^Ass-$$HRfKUym*Yc`+&j^63nQUsS` z@>5*kLbWKY^U2+>NCNr7HK!z*JzjG?!?e_9rB>j-p0|J>AsY{^1;CBHU55G%$w^km zdOiot`yX3)6w*Lt@IKOFDPAm*Vf9YEU3kj8zk!oR^U~J1@EWCso&Gp}Cg{|oG-phZ zsfc-3$L!vcs`q&ak*w;*;h?yTvsG!FY@t>p99;sYL)KG#c75(*yw5AlnjvUlyicJn zt2e8VmE+Fmv(c$#y(YY7O&kFO@&(}X26WXu4dcNmGwgd(G(acHZFUcefU<(gDf5&c zK5RHcxx0^67&1OHM24P3ZX;$)Skw`UcntDIY>~?gU%~~hxkp+Nq-6&GPBjkMJ&`L! z@ZtD6y2lEG@xgVO6=7OYA98vMMnJg;GORqRikrf?T_h7F&veZEpxrTrxB|6dVPRE+ zokO@_1-n-c(`*&?1-8pjkhr+RJu!BGnc$(?R$EYHWZHV!JkY~DeVwA2QV1>fW0NFF zDjPJ;Rd;&Xdb<8TMA!m2DI=@x*j6WLH(72wX7pEIzJ5WSDC1lM*xyrUEUfp&?$?rv zi&z`yC4O@&;gm~`cZGDB$#Lf34G(uG8DV;x{qmpFo7m>!3$2Tb5N3szte^ug$HER{ z*5lEdykv+a$C;BS)koZCn|2&?(%kFDaO!v%Tp&pfIed0`zlc-DziDSG&f(LfXBks8 zIyGtap*sP1N28Zh+%Wd%!MI@pd8~LTfPRH@4w{X8WXaLaq%FpE!*@f-$l^0^P*_^vQvbt7I^Bb~9(sRDz zn2MuB>HB+U`ikB(GY;foFynQQ#$Y*D+bT9PsgJThunqsLz`QqnAR$T4ZRztn957@d zIWg(i2cAMb@AyN#+kvYBg5T`H#43W6o!MHO#CS}Kh~R>|f(s5?X3)AJJQ+XXphCZ( z!Tp2^TET{662>S~N%#qg(tl$~Qm2;*&PbTE&xlR*Ezm-u&tq>PILWA}9^SUjgFvR* z|C^XLA8tgHwl0eGqfRb{bwX$s`& z?+4;ZigYhlT*+x84P51$2mmDEnRFTnc1lZhQ_Pv+g6VmpoaFdvoRfXJFDq;;E#2U# z$njFq+Ms!zRYnJ^JMp2XfY&)A%aF0b3|P`vmhbWte9%8~rRi8JC@`#f8RutnmM_mT zfHMX+663|`a&-?)=j5oY$`y=}wIokDcb;t1^{Tv9=HK+-yqWEL-Bl0tYRO`?8z1rj zHcMT$hH%*zr_dpnKIE^1a9vFiSKfwjU2MJXxaggqC7-4uT{1pQy;Izr{XQ6Ru8t6Z z?ee@KVy2kd24)FJMGZUOWzZD0%Sa zaq8i>AHQr`HU6%{vy*WkBbN|Z)9zL2V4U5l8dYyZbaS>tm0$f$ zzS3?(Q_sD1U!;E4JMayzCnvTqfAyD3xthh^uS)ot`B-JgSF80_LcRP+%t{q5fzpbZ zEa=kuOO$v8CKcl+tMLb(=1<;A&7U#`^6h-Fd_jpLd49IDxuoH0T$QJ~O)`wvx>j#+ zX>mWUKQ5CAy(~6$61_0OQRCUo@#PWQg@>d5NcProLPO3;f|Qg zb>-fB7ttH(fuYL6_ZsB;SrMX&O;c#sK@83QwS}}!bcYW@WfhDNv~67Q!9hD({nt%N z6$taY<>+wwgO@;6_1S4UI)ZUY6_q*U=^O$ujy)@&yiPsSevw3~$UZ6_b(38XVv)Ir z3D(+TgG`C)AqAm`qgNP>WR0nQ4`zAOw&B;bA({a1x2Gz;Tg-&L?r&xp-f%2%Bi`3R zbiSW*N_>k{)tXthRZ=78qvNcYEX}2xTKd4KHgd@~3SUI3OVp-OSLkR7QALqk61k`( zMForrDYc>TvQp)x7~;Qh_hh$7aU=^=?J>Qy&+-CG$(eb@3nROG<_&xm)HUY6YL9~F2c@u3Asq$OoZYQKX_p@+jnQKkYehVuWT5`=qO7U zB(5&?q4=xqRKq1+>}@}kP~OsjJr=g^*Ff@=7L?)3Pd6E?M=Xetlb54xei zlP#hEEX5C5iSCpnn_QpbZ?32~X@-zBmSnWVWeJh3;H%Bjglm&L$(~CTOGRY8O(|2i zckkIguh4i?y|2WmZ}4>ROosJ#_NBzGFwjR9Qu%JlT;$wgsHKEu`MI~Jtm2Cr_j*x~ zAl9~qCrXR;hSuE$8QAS06*U}V@v8Fhhh(vutZB#hN3>-5h$IW%LZPNH$G{|hkbs(6 zIMmli{~+RvTF&8J%!yWptn8{ektedOy~|M;(#a(47TC!&(Kv#|5Z)yD%_-jP!-kYj z@b{87CD}l`1j^8_Jc&89_-|30?+%iflJgOokmua8(GbPB$JefnL*)wDN>Lt_$XCev z6@{j{u4CLkLnBkC)$Z5Ue{;EO^7{Q|wWa;dW{AJ#XLRw6RJ*OBu?5=pBGSFQ&$m@d z&h+;x*%T7e=|$qB=lQB5gr9g_L&nRG2JeD*UhC{EQa5I1ekO(-AjQY79kUzTeiCsA8|@D3X;ihvfEkW7zq>1a_lwQx?KTx z2q zIv8@9KIOCkQNUD8N_Md6gQ6r`v(w@5zQ;#B9ZLbZelTIH@ca1XW=FyPsT4m-XXI;S z1weu0$uD5oq)XC8N`EM_6bEG5NN2rg0nw(xNzP#J?GgHG>Dt(LL4MjjT)~t8UKa5R zk;QmIS~Y*Bg>C+Mi29zkkeQfcDW1;b^{Q-BbrkQ?a99z>tN6gv&u3UtoQqDr40iUv z51K2wZTJJgcvHK-zZ=1dbSFhf9=U#jjiI0_MNLK&++h=&LizI8W{83Bk6h_r@IE`Q zOz8UE4%H4V4^Iq?%SzM$UjdHWq##j;gxoqFyi%`U+!km(g_(a*J=goeBEVD;0Zr4z za&L4xng)jxW=l}YBSOunpp|E_d}jbD^KeyZ3Bv^@ok?YO4g(IKBD5G|k-Dycltufr z*@@oxVkIP|dn*4?Eq}ZbjU8>a};u`bC?8#c+XhDn-Ae=x_fmnT; z4t9FmAB794;UPY*>7hz!*f_>|;vGK}3RB+Mh}3fiX-?+Wh3eUz{+oCJkgK)pt!f*Ee7hByc5;1;m2nJ zkE@3nQETem2y8WVGfMiNy3Fd|GrUY76l$OjGmp)~0LVQNF5T@#Q$cL{T{zyKbx+@- zoxmNTH+V(gmsUK3s4Mfu%3$DD8JmO4H4tzwj&qP-g`YUz`ujW}2JMEhj^a}l;SR{n zv71o>P9J(`XsW)5EaG*v__~MsCrngLVQ-M-{vv779fZ0keHPRb>Q8z5Y%J&VdQ~Ur z!^PVtJC%LEsgbeeyxy9QNprRfyQ)NCzLuIbjhRK%B_gT$jO1Y*5RJtoYuKAgShuZo zQEI*n#LFQ4f`?kZ5Xe1{Y&q8EXas3}UQW5URq zh(}Pkhd_YtkWXQ?D4XG}LN|Z0I5N>6``mYpAlA^0`5Qi0xnb~k|NE$4yv+BPeZFWi zEZ@g%C0CImR1Hn&==f8E+S9ouTaOyqc*PL43ht}~9Y>i5*pxzQlUv0Rg zW8Py#b4naMp{$DRm~&K4(fjr_z>w~f6n=MaeulgR0Fx^F^Np$kUVkP(W@wz2o&5Oh z`XjJEDt@Un@q={Tc)4oZoTe3>&>R$1HWlU(W#Xkdc4G~)=XGfO7Hw0HvRK>~bhS}Z zEv$hAGdsH0)S9@b3l{iP)f15xqh1M|KGQSwY*xd;lf^JZU50Bxgs*uM@X`kcISxZ` zbtyaK2Q_Ny!#~W%0zGmuLarKo*b~A+X5oq_*c#11YdQDgP%xe4v4(U6QPLAirfO9` z`~9f38-M9>Sv?A+2xuMW0h*}WACgMfI2{!4mg_`Y(H3wP>M%8|3&7+-_!&v>!rEBc zkMq>0b|P#`7wn*T)A)x14$H%(^b6YJ5WOfS;G;}`A&E;PZm88ad7{ze%Dj_pd?lj1 z2(2n!bQcrIc9(kYXA7`o?KX8NtE3E4z-xP^DFYT{@4(%?T{pf33K3rQwsthPWNN+x z*s}Uejwt6IG_GA|&nrdBV^ru>n z4l1J7qDbw_I?Uq8zlMzrEG)o2yoJYV9hQaXn?r6{38oxIN@lV1&n+9)eFBLcBCZ8iAf~I(PgrsvX#Lu{s`Y`OF_!Z#Ij68*g8|m zgGPW)p^wRVP^F>T%|++qQxg3Fzdgm;xE~>zbs#)Szxc?k!p{&pn}NnyjBfzXo!A*+ zEnlo1&#$*8Q0n;{YVl@=no}Mhb+U^)!Bo`cjD^`AEz~;a6_o8wGW2=kS>D<3D>%1&8M0Pw$upT=}ecD5OTcy1YZ&Y z*{G)T*(D=*+{sDQr4y$W>OS!1x8|O@@vqZ|i*&0fEA;xqod=F2!KuIu!Gtf_p9-gd zN6Q-8zs@*zDHm*=l^%CXe!PDgpit(rS;#cFL$ooiz+VGTAf8CcWjzp6RhqIvQuZlg ziCnVOFei{oeJS<*ayZ(2#w!b$NU#e`+*IMf%7LmL>@E1xvH{IBKTi#rF8yHM8ghD` zbLaZOw-vJ$bXL`ub#uA6TG?E0m6uBTy(lD3{O&j85y%YN?mlE&C8|Amhs~eL` zhsOoc)B0q&jmwCa?km&}69G~+?~T-9byeZ)$*j^jdB`iqPrU(i?~5ZtQFCQwq$_Lg zOQb@ZS)DwG+4KfUFz}of#bhwdP_}S7%K;rSI1)XtK10#?k~hm-;9mKW%&DaUSPx5~ zuU4Ok2Oq;x4;2&LyXN_Kw8@zJ!Abj0oZxcBBIJnnv4it0*cQDi69(6a}HkiOmvvPA|}BTkxWB{Ge@g z`o-D^3Wb04i7#g|&wi5VZiM$*?lqDrO2RNe^9@8mF7V|HB~q3iQHknEww7(BFC@9B z4(4`-aEImoy8D6hL9SP@UHTP|m{o1?(K9w!Lep3RJVY;xgpu5zLgNZZRHW(8?jBxT z$l$AB$k5y3nn_SL-8Iu=PMm3$TfN`y?ys=}`74cq&*k%oMM`TsbMdRF;20>$ zJ_{yfHj`BxCn%GPuH~nCwtp1QJzX%`&+gmmOm(tCL>C2D-s)xKoUdgP?$y7rP&9vL zOG2^UUxlS2u^8!$f3=1A&=TopS|ICPoYR&WV2gL$QVjBcJTu3m9>tZch;LkwFwSW$z#V;LC0 zaoSLX@P#-=7KzT}7wkR+Q|s_6qS*mTyjD>$wQYt<#lv5;xi!n9)cXOTZIMWj3UD4$ zT+n1;EYlI~bZ}Nu#~!6&7InD_HCHITP>FP3=J<1Lh)G=J+`2cdu?rtsPhxMQ9^Q4z zycb)R`%ygjY<4P4?6v3C6+}i4DRdO&$)}&xlev8JRKkNN!m5`gyw)proZ?~-OfSl3 zKi$FiX3qvIb4_QTl)t2re=-)EhOT7!t|~vDf-1Fs&nh1Z^J4~!e)kJE?AqWA_SG`B zRIjerZ=cggYJ8#l77h*LAB-48-QCD;33r+J-AV~~Zqn#C4;aHsYQIw|Z=Rgept@n$ zFIQLDk!C0-Qo+WcGZ3i?xI=|1M?PWo(|j0GDrC&*>T@=U`nIV80E)4Z(IAFhAOc>!_DwJV;ofeXhS6T(<7%5Iv5-w^Z+|GCT zA}CnjCsX+ip*n>IIXh}DC01mj-&%z0hrNBZi^uX%%$4C`SWT5Q!{yr8+WYhKFu8n` zln5tuE{k_L$z9`jaAr5xYXyItL)13Dbv@Hl?no#PQ#v!SR)Fcyuo z?x%F0l<8NZJS7ubt!RI4aM+4~WAbLeLMD;8=w@lRDnPogyksR`+v-Q3dpwCWq#Z zek{gev3?OY+_K_dFq3fnLXJf&%J$4?n-TA_y10p0Xi>|T-(lu3J|DV&CIp`*ezHbk zW#!`(Kq?P7;>*PAr~J(nKumoSu4EDBBlk%HcU3+7L;$HoR(G1LMa>Y6#;{#)Lojw3 z1^t!zw zum2ExwYbeQm`fujRxHKp|4b*iDzj%tc4;}kNjNWGN|DTvn?7E@`YXYtRK;ffb$?-) zwf|Z{IQZG*opjPon-@SRfN7EB?{?l|8%R2VUMYL*qKX`-yiH!|#?DyO*`8Ck z7k#Vt)C*cDeS$LXLCdA$_l`a;`_rYYIt3_Bo>+McNsBl#2QJ4_{5`l8uJ!&#RtvA0 zG1`R$Tp76_1v#C7ZJmz-TZZ2``I zEnL!$Z>YU`W<$G+9xUp-1S$J+39y5UbXWkbajO&{J=~@RHzxh8P1y~vQ6vR!(nJZJa_kM!W}imyCXA~N@QMX zx5n}Ql0@4r%QMS?Ad|JzRv(v+Vb*WCq{@^3ZBIzFDSAE;ERp>9(NWUZ+nc{5lS9^` zZDZ2!?aA%o!v~tgYbRWonIF1d$r;z%0GC5Vc>JWx35ST1&V)1$SM&IX5ViSX4(f0H zGyC;@1v=u1c|pAi8No3&_GuaNxSQy4=6$S@dJE275)0143Fw7G1QT}Vmt+ZVmm6#A z%zN|NAE}4;ZlxXU556Z1LpT!gD6`03!JK@MXEJZ1l4esG?vQjs4K*n0e^NIkuzCAO#NsmA&yR$t!Nje*R!E3FK?O^r1$L8?KV&CqPI)chPGL0M_dYNNJsrvAeig`Xm z2X`6eDN8)R0}r#YsRKWinbx??$vvw&!9yjoy(dUP)mgE4E9DZC&{fPSP}t2!(}=>` zO9d81)g&5U-|)iM`3)>##M`HAJG&`w8jsUE(pNqYV&tQ=;1Tl67Rn1T-pLT^%Z~vD zZ>8|ME727|pIQV(*JwrhqXUtH`YRDM>*@ALTkOQq$T4Rr=ENo$S)sGM9O!IbVNYD~ zO}4CdWRxM7o2J$xhLFCsPN6}n8+78^F*|x4WL=tTc&jA)(H@>{6p6=$1Av#!6wxeq zLt&9smfjqGXLO%A8H)L7)f3O%7~lq7LWUR%D?YjNg)hd3i25nevr|$^B&aM9eaz$Q zAQxm+(RFWg7;4C~H0qR|`{wG%pLK`d`{qEYiUOI)iwqN`}elAK}-x8 zA1g}et7{VdPd%aK>JHvyM?OgHd$JhW@XbIfWFvrh3NlMP<<0JAM0%K%;Z|=?fYKp} z2PmXpR6p}rxaT1ocC;D9Ansh z#zZLE_`*=EJczW%=L<#iFQsORSW?Zpg}B+18T&Pn)CWdfh+AK$;3Zt~ z!*o=^2R|$eQ3jTd4~I7}(`nLp{o zCL2PRx@Ya#LKnx%^gmWB2c*=!)_xn28?p6WAyVZk+AjP-f*{&H-z)7w)qMCu#fl!3%+?I)}c0!AufuIk8U zoG}^eA{0CU*j8J}V4a;0j9s1YCQC<+;gFeqQ%+^kNCq~9!$c!?$Z24(!z(hH@C5$==RN#OZ+ z?VtVE@ptT-bjopUHhK%2m6BM5`A7M8t`h(RS5=jde% zE@N7stQ|jj5`2twRoE>}SR&&Pe&*yxcrjI=Y6>CXGbyva3D@>>E<}MtJE<_q(RP)@ zvE)dNZ?Jxcs5;8d+E}7ZT=OR(IoiIz-6nyc7nT(2JcW!)NAvAInX{X4xuC^>&1l8z z5C9qpEXatU9ur{WHj#Nu$*}al)U#utqX>Q0&xN%m)Tg>ZI3}{dW?v)PcrViSxQl(p zuvxIc?j)#3sG{4LtD8WZV^B0a(z7EjASB=$H_8m0^Y>?5(;^-E;j)>Vja)O>dXz6E*TWVkI z16AC^r_x$u6?(FKPOcPTL`Rag>pg%PvSu0{jGZF~c750k zwriO<$$0+=-d~+|HIIai%4jL!Zi%Q?#g zEYjlqH{{)-kIPgjZ1f?mUp8!TKQ(x@0c7>fxqt?)Ztd=B(*a2u!bLG&$c&IKd-59x z)$?_#Gv3@iGsyDq>~e*$HO^AVVoyyeto>G|R+x{XkGu-8pUs75SGXYjo^0gJ$LD`_ ztTJF_qNqwZM$#09yCPw~=t1tD2wpxL0cE4z+|#Z9rs}C z5g)E<7+v>xubrZU2tZ4F~$lbi(YHSDk!uR^b)}bhv0xcsE> z$b%QbeWBG_q#qd!zTNPUX>8j($m(_|mJGKK_y9AzG71vE6ofJ9l8z;Be;nueJdV$N zIqATp6=Mxwi*hs0P9(u=q1~tXHiG>QSA$Vd3e;1NXNbP|7|~941NUM8pJ|w+m8@g; zj5y|kh;f1>AZLDcP|ExiZm_nnBN&8k_*&euUv>w*>G$wztz`gM+dgyImn54((!XFrhxULm(7L@Jz?o{!Rt|-33FUaWhoqkHBxtG?~i0;7HkpM^rE`n7ZKKmisAK7$@kd&M1JD5mp3RszP6WT(W8Bs;AWcq z#bKCnXY~d^nntc<+`6^{z8C*O%Yb5p21XgE@y(&l6ao%$cC-e|qP5ar!Bu4xy=lEZ zKZGO6U5T@*|7=C6@+u6dazzb!bis_7jv|LVReFVFdEykg*TVMn!>50*-qRwW-e5QON2$B46AS3?~w;X;EaaPCKZ*RJWYDy z#05KZHQoirJ9SY-INY{~OFpD!(!fm3=v!n{kCvJGiExACvY@u?nC17OFswcM_+M5l zHf;`v@M|&3fTG_O)wRk@fdZK#lL--{EkJt>L z;SfzMY)kSnjvjI(-ft~DEyko9uuZZOV{@O7l}K$U()^EeLOGCNp4nfmqlz3Ft) z5NOyocJAY4{<91K_~a^I@Vkn`OdPB!$8(-+!D>=~+D!8{`TRK@_dnLNF8} z8Us~3S7pWa_B7U{ZN}+uRoB!tA{|f7>9wLsQx1C4-fi}(-Vy)gY~c?91AEcHz$SeD zo%sMwa{QHnhIk0t+YuHF?9T-Ug4qFFjQ`Ag2nd6|$lL%<&Q?HsK?*izRthqJy(!Sl z%HBedLPK4WiI+lH2tfd7Zf<1?;4=f7y4rzqy_o*clYvO>o%#N*5~Q$nadF^dVF5Y- z?EeNa1Dz~b*jZUwS^h3l{6pYjYh`cqAAC?&7PC9YU$|@^KYnEStM*@1Gt>XzIk-C6 z{)J^`$^x(j{E@<$g^ihw&7jfx!O*F6VzF{-@vnr64v6p?|gU zhoO+bpKm@3fIYy;*ahe$qy*}}(qG#8yZ_9bRPt8#t{!CnYlWeM6VMu9>cYa!%WB8Q zL-onk%GQkOBL^F+0L%ZzQNYZU&&A5c79b>{tR?cLKO6p`*_8@n)0O43Nk~srFIsxecB)1>o-z0s<50gJ2GHk}$IZ*~*!W_KyId-`LJ%ARrmwA1Di%1;7c^ z&Oc040cOTFE&x}jf7sCd;UH>eXJ!AtGx!S#lJ_r9aQ+KV9N-491$pEDt+D^9phNh> z@Dl)}bC45(c>beske)$)_s0ud3I@y8b1)1)@2rPhqu&wM} zfPWjs4B+5m`H#46#`dNFGcwx$F#XH4K#<;z&HkzTyBQat!(YuH{L$wh+wzh96WZ=p zHdf3oo({mj!xc0b7`g!L9Be^CP=b8M`7ibU<$wR}b$`6j+12EavkU#lOF?%23-RBI zzoW?131IxkXPC@DEQQ!v*;tua*_qgQ)!BIXI5_y&c>jrw{}t~qH~$|34klI(b#_)h zRt`Q^_P?e1Q~7rb|GNMGS`_*h{KvKJjG3GP4#prG0?htt@1JU+|F!7+50gJ`1JXN_ zsi!GuHd%<1`yaIb4gR+P{{qciK@I!~N@aCUX*N~`UbX*?>OTm7(}5h-iOCFL4vIT7 zvcCq1KjAM(Az^21WlJISC$dBUf9{zwkm(n~kWeizU#BLg??mWQri( z|Noi%8*OB?0DDFYoApmHU`l}EBEzbXkgfjN# zKr&7WmVeOx^CWV10qN1%#me;W?to(77Qkc*bhUR8q+qA`8)#(*8Uy|X^85n?{^gSY zLP5{Hza(<_FHAPh{{WqgEu4%UEdRx3`^ffB)t|xiKTsZC-haTRmLLZ*1qJDU>R7pX zxc*50&!dI!Piy~E`cHTM0{_3~TjPPA-RhREb|&^9Q#-S`{CmsnU~h4rs>MnKR{uyH z6d`d(5EN2e7Iu_ZzUj?kEJ4#_A|Z}T9kEG~$ILx?LM>a4(eW8aMYFoRHNwgHP-r8Z z-`S$`azEpFa_nPQ3WxJ#U)t~Iq2tq_VNzCMGSFv9S&Qv81sw{?9qt12cbQ@fl?oJ; z{0RZQ?BF*6TcI?r^A800+~u->uVpR2bH2~d%rFHjXk?GIL94PwBQAeIt_*UMN6jl_ z>R=lCj>EmS!EQblegU58xIX-M_*d${>E&R39R1U3^2+9o{HVFR?vsDS@I-|oV zB`BxDmbF<<(p>(XyV#K7end>sdaY6=` zo+2!b0nLDn3c+t#7o|2zhk-@C00Rk$eJLFqCq>iY)ReQQ31WZG-}igV&2Lvw1XS39 zt^g~qHjYx$i`}{MK|uo>(am>M^*;Edc_uRSbK=kfW%D#JRH{J~0wI;J>U+B!U-|kn z?|e>TibD+|e&ug?_%_J>qVwMLYPjCk`fhW$++dSaDpf=@Wmw~gTN=*6^aeYMEdaj*AHojWB_g}b9&*H4|x2gjK&#j%YpQK{c)C={Of=<4km0VQv< zR|{YwT67sucUhpHbr4>D=lRT&!Pj|vjmWc0mZz^+kHHqCz@mzCbGn@J1Wfyj#~e z-+jfs-^%)>T3Br?8}l9RIY(lmA7-f`_db2PPk^!Ze^Ojb#EcuuFMoFuof$Y^a$ zYq_qEL3%^8dU}X*bz;MqmQKcj0fpsa7?A_yi zoLlzw!#0dhO3#lB{-{@n@%HTjXCA-<2QXwT9a_-t)>DjO&^q@V@gAzIww4uPMdE5a1c973|Si z-x|WIS=IeKHRvif8R5Gtyso(yBwF%gf!U|&!DX0& z=5^ZS}YHsW31S`=NQbxd(pIi4)U~rK4@m_DB8r9cy_4B}tajM9!4>3hB(`-fPNAV+1*|`Qd@d+`;<&NsGfNcJCfGqCPq6YUWWdh6ghl;Hvx>V|{#vTUkitFmv z&Z^gm#!c$DlS46KfC*UsR83>`FU42CUYdDg{5EY;UmnH9sgI8`vd!L!^gHjdGa+mK zXylWn;~39NW)lmCG_uRyl1?x8ZBok*#>jqtf|#%^d%e}|sMM(>+wN;ww{E3O&%+v# zq+hX*(W8|k3uJ4r&W|mS*z@sHliTBGw)K$4MJc&B=jq99;oDm0BHVEcQxQI@XcXxo za4or}GSny;@sG5$m#ad*s8YwIeCAuDMuQIIAhJV=!lzNX7~#pFbp^dekB%+Ux@TsX z+t)br(-4yNbovy9NKwI_%Na>$FNf3RkJcHSQyZ=891P( z@~l#_X9SzmK?slB!SC%86O-Oy;@aT(jdz>q6OB$W9ovNbxKtx&b4bbNHc;L0lT5Ej$(m_?117s=)fGMO1}Zde z%w?yiNWZ$BFmzNX4XN*7m<MC-lg3)W;;Hv;!ph84U?u)`rdpJB-+B<_NO;A>=%3`aw z+Y|f#=%U?@CY{JuC`-o&Y%wQoc>wX@SMg$Ck-;gN0codi`vh1E58TIh(D9z! zGSXw~cTL0hRzCOdrR;}MB<)rQ^KH6g%C6e0m`RpjIy*PNF$L8J_dV2Cm9SC+o-^3R zcI!3|<7aR3!t&Fufd|@)J-NhDq9|(eZULFNIEVGufnbZs;aG96Oxi5-7O7=?(S}o z?(Xg`rKB4XkS;;Gkp^iHNjY>k2po8adw>6{KJR<;j5+q&=j{2Nxz<=Y_P6F@Y4@e0 zUnE}8;mok%!7t3zmL8CS^1p%g^nFVbaJF=)>`kJ$r9w>u-nCVz#T8*TTUM)~fJ>n) zv#xuguW-l?oSySR?;7j*BufO?44STvPmpdcy(Kbq@o;}50S_~~v3LO_k{`RZTAfF~ z+>oK}&8@i!X#ss9uCbtjx`~T*93mWvMDAvS!n&D_MeME0$KEtl<&II(iLk2|e>wiV zTT#R7jwUv4`Ica{N_U8b=|kP#NNFLqQR5+&{@wUUG|e-H?U)xa{1c+a8ee)q+wx+J z?YlR7?0TpqpkvZ4tUPSGJypVW)VXCeU%3m2mY{X?C&Py&VwUis;;ts%a3{_m2Qv72 zJ~6t0Se!b%-Sp9lcPk{8V0}6qLSCg1qK$;>YH`h6^1Zs1p4~H@@+7&~wK`{vp?v$b z{{aw$&O`ayt}%tCjpL(%e3tmZJz-qXqVt#YxoT|gbfb1-5QDGv3YbcT{T-y<+^Bpr zq<1Ku$BTEs%QumN<~{fD&76?e3a}1tKXj3P{D!Bk<0Z97TOQa%XaiZaF`E#53~tP@dqhA!ll)8-&7mC8yiZw7cLxvG zoZ#M=)}t>6azP7((j4@lvA`t!`anf(B-`X(3B7DRHL2lYozU#9!;xz+1Mi`t6J%jr#nqRAl$iURcCy!WEA zh1nOUPlsB}%~qeJ$Q6@O7|?|nEn%_>u`^AKvttzu(>vxv2wVh7rB@O3%VxO~%q|(q zz97?<&!O$BxGM_M6igf6aXz>KzA?!#AfLjdVL68ZRo8XHH7lrG43oXJTVy-qgtpS> zLB^WWgM|aa%EFHpt>OISxD8@r-ODR<i zh?iyYSCs3cz$u4X3A{J_EBOHiB3*E0O-5Jhq(0?=2&!-CLvuy~j3~~?_gF~hp=V;l>1hOH@2QmjLYEb@T9nH#aokn<#ssrIxH>9 zS#O|DErNm=z^O=rTbqs!Y3(3DhL+(O8q%3p`&+%Nqr0W*0?j;tzZ0)twUQl$8m<5T# z>$YA_tw43?CUlUsX3s|inLOU$SWkZV_0{uDWE331u+z3sP#86)i&Vi#Sz`kyEV|hU zk5B=M`a+n_pt}el_-1;Cpud(ukk9MQUSi&bx8&W6bDC9(C)3_uCWx}WjJZ2>ax}@1 z`>?$;;_wQ)fQjgCSmLWCp9{~)T{Ek)N)k+HnBzhN=7aKjTY7x?t+AIBE(;ckTl$1v z{=E*MzRf<=`vmh*uNus^pCBpvTMV*Cb6Fay6S2%~nMNp(7T@Iyd-zh7`VO?Wei1mXNQ+Ys zam{K~G#DylG_GHbX*p-mYVZ?FKZ@MQ_pm&47)_5%;27%&M-Pt?82kPLds-t#3lL%$ zfh84wv_+~B8d-^F(4Z_N7}>FNbu=iiTb()JLb3pNSbLMv+rQJ3%kHoAWnIO;E&>C1$;>G*8)BUtE-< zghqq&90fryf-UcBSx(7HLLJAKFrD~)`Bvq{cF~~%;FxyWMpu>Di-R^NQ}zYbr)SUW zBYE*s;)e25US(*{(pNxY8C*Qj_~0}{jfvRN>KTC!^$_H*QjG8<(kHjEp~f~Y*VerK zFK+mP18kZE2zin#tIMQslxeA>B}*BNm+tJzS_4wWOYL(}x=B=aTc`=BGBT4s>OIX> zb%A*an?p~+B0!$P_~v^eK_Z78C9~|eS;*rrb^BYr+RZ6+MMW`|vwN&O%ayi!_{-`o zW(6T$f@NNAyUCo!=1)NHmiI)R0tQ<=r${wpN0RW$=1GB6eytQR+KHKGtfkxWpY=zJ zVjGE5j!aV`F}|KgOfcBgMqm^N2S+npaFVOKnqDY&n!U{!2xG+VzZ9bRo&EZ@KU&v%y(dq{^Zrc>h#MIhz zic2W1vR2GhI24nF6l~8tBGVZFv}_Y%U0cZuGRCGx_8v;p{lwiy^&>*b3g1Y2}`^^KHStB zx)cllP!8HaIH)BLaO;zMrttwbq$15=nmel4z4B>UQ}*Q9Zua&8Ww!I{rVXpW1SmE` z>yVvFY@eu&`)`@)l(gIFpF`opH>5Aiwd8C@fVcCK?zwy(R8nO?`MFnRgGi>Uj!c&m z+iS=R5M3$!sQWIY<69zRBThupCs&Z|)dPu;rzLlBTme-JaI~LF=;#$zZ@zT_DjJPEN5CxDIN7H&of$cJIFIEsi#^YDg z8^0M@xZU9+yzv^Ssv-WW<#XTU=dZV+@K}8cvWf4$#uOZ$Igyh)?Yio0Fs3@^!;;}8 zop6rhfQ*Nk7hpW1fFpRSwm6}|nR;zCp&rN_(<89Z+#u3AbY-0Pip~qjIlLQ-I};gP zld5x_R63r<7l8s(a`}@|x6R*p{9T8CW(SAmA{K+ka?A5R}!lOyW2fl4f4g!tTyI_eS>DIF^l2qZQ&^!Jfym;@rPKvz3#~2?OOjPqHT2N+@;?`Ttg^r;RbKe zq+wx|AmrrF-(}wO#k}&x8I$uj!F5ag3~N_C&z9V(+QF@9EtvSPr0cUpJ_i|fEz05W zr!=(6m?FMITmh{w%IMYV;M{w!zVuZv=-~rQ2^3Z+5jSpfNY6jj*_>xgPjHuxoevU; zu!&?gYpzpm$Zvq=w6R(8wc)jzPHauZ2Dpk6dI?-`N=bxCtvjwxR`#yu0M*MQFmo>) zA21PoaB@A`kW}3d%yVTUN5^a#3##@}g#$yq@dpCgVtpA)&=4%f6&vxiViznz(QCiCUV!Wwdi!kV)9hA}8mHmQe=lMVdbD(9s&? ze3VqHq~f~9-e;<}_Ac*MbE;u+(<0M`5swV@Kc9YLo-U*e7sK}%Qq~cDk+{B~!QnOf zKA9-3s%RJ5{p;2qa84CqAxqYaT3M|<5il6$e3a`&d+k90cfd{?wV7e}RjSNZr7l%~ z=~PBz+l;-vxO^PQ;NgRx7lSpMgRAt6kivoc-hC5qq1=cy=Of@F=}yE%b;*_rZ|@Sa zYQSPLWByhO6@ncq@A%zx3J6vI^v%5i!2VwFUNAhoRdEC|*yO5@jWwB;O$O_0YY^1A zX;xNNnZz&&p&Fc4!sx|io2$_tX|W+lQyC0B%^+?!3IL?`QBp6j>2qnp{#tozZ^lTDW%K!1)eR%W)8P zxbs*K7OeD9vxz|BG2cA_QMneB`B{HsVgGQJi*bj`^eP@p?xdjT9_#DvTWZpD#Bi6N7y_TZv)~#4k_R4)i3>4qc7}~@ z>nS|E-(U=EM!I!%PsKm47|vWA8xm}=<+;$i4ob&|5!xt(pqY8*lvl5MVgkBm+>*w< zAK21{cLhyw_E~%nesA^t;&#!zC;0mOz|W7Me`U?MS%WEc`1|>ed&%(jbS_A^KF5G* z-rg`8WOOmpLW!R%z*V(HtE1R}qG3PR&1tTC^DOw&?d#G0=P*M@O{gb6a?ZDxckTYg zv-ku`xnWHQ7)?ks7`a2bg<6csGQA6T7AywXOQ9u;)VHTH9ql~w=L7wd3pNe<^ov8&^7sn-8hh9E|`PlTndsQ8r-j8>TtqECyOE@ znO=7wDS7UwB0cTQHTftwJjq`w@cq;V-C>nbHEf+W%q5v3?`ePTdfxh!!%#2AC!!ar zbQQ;XbFr9ocL+gprIg88(osbT2cpUE-kpHhCe*1YpI(9&XP$nhF>$z0Z)B$JKYK;f z4N4Ljl1+G7&KigJO2bp$e03UIx9f8~2!BZSJoJbiZ$Q#$BdL0PdPMj$=2 zcrWV!U_K;^y^-1o!XV@93UOJTKYH1WXiV6=PYAUB^f zX0C{?1&=z{8}V`#!33gAXgV8H81x<=NgxZ$N)^!!Hct)MxM8}G_Lp$1 zS=tv&$IuT7It$RH>lG%VCnrryV^|WTU6VXleWpM_8V#zGo(`{rW&yln7#Hj+p+C-~`p`l+q3K z^F@8+;JjBcZO-(fHZ!m_xJffNMxitQY_yU~Ms9~HKHmXk8Mt*@_StA2g$yG?SBnr4 ziJcmn@4q3=xdHOpoQI=<=A&o~lbTkrgs+oy;H{!;eg!KFU z7&xRqTC6l|VOV1{Ht_3q1UO5~vG~{DCVFe{wQBQJuHb|;i}&}qg9Cz1?@3Esm<);Cazet`|erOXXH&*bBU!W>8gHDLd9}*)%&Wi)A#$-A?3hZo>GI1FCrIw2OV8aXp0>zcVO;uuL}p)Wq|iq9k!Pt(Av-|Z*Qwa) zxd&C%J5h|~6yYx_x;5H&PvT)}me8UuxAtz`KhM+pW^iHF@zw@>_o;SH5#-g#4tP~ zDr}*W$K9j`dki+o`fqD2u8pN6X$5i%Wf%CKvYyb0KgXY*0XU7uCr}fV6T)Ee`l=Ky zr*mWEH5-}1(7ItVFeR$6z#BQ00^i8XiRqD~Hy|g%K)&-FL!-+6PJ|G)(GB8iulg0(Xwitj1>|yNVbL z+I4#~_1Q)S6aztuJ21Ek_Z+}-T(vj196t-F&~^+0hn7VN~6I0%IsPG5MKaKelZgkv`8Mzp7o@bCc&Vq^HHj8?U0=qjRuS z1w~P>h$V=JwQH^gs#;^=XO*Bm{8mSEsSE_LiB4H^XlTvld#v%KmW*{7WsYoCKG(2R zwv(b>R0U&}$A>%&xk@9PX%ObK2R8R;@wD?D1DT^8R|bMwp-YUiZqx#o3C!d)qpz!# zU85savSyy>R-M#p!SucAlnx=zfSlPrRyN_j!VJ2=F$x`X&U*h`g{}Of_Z9~Whfrq* z{g?h57 z_$iJpx~7t(Q9J7CbMyvs??+S!T2sN*KP30MCO#Q0>@;qL87<(m>Ps1WGlabV(?N5 z#1XH-!w7rzw`pC11!WTKmZ$Wy^*V^%ja}mr*gEKv$HOS}Fpk(u4S9s$px4gT8M ze!hVa1K)`{*qd8f{D+I;0$_S%Q@FVp8#y!m!1;Od0}ht|mr(!b`u7D)HvC^WMkXd; zlHOlDC?*p(XXpRKhyMZkX!v_z{6}iTKQaYQ{_dQ)tpk{p^N(wfPydecYZei}Mfp35 zql2THBbYwu_TMc235VeE%m0e-pKzQVES$|;ekrU+gWo;+HD5k|KzelM=OX|AQEL8x z;_BdF`~RU3|2IdEiLF1N{6&>UhUuhO@0GGHpE0-v%@FQL2_qqU%Yozmx9s=S~e}%rl_%~=4X70cL zh8rL(#>FZw!OHR{Xq25;EqPRMFALURp;d(b4VszrZ?BmF09H|MQ2;wP>z|Hi8^bjAC^Dw+kQM(;vd-sTmE#)#P5bb)1Du`1@lk{hbv3 zk6n%+B*Y^V>yaY;!|I2dKd%peZQCy;A^(+}^*hSXQ-fcN38)YD`KOiT@0LFg5sy=c ge}vHt^3M|qC0Q8oECd1q3;dA*rwlE?Eg#~40CT` 'Sokoban', + 'description' => 'Play Sokoban in TYPO3', + 'category' => '', + 'author' => 'Marco Huber', + 'author_email' => 'mail@marco-huber.de', + 'author_company' => '', + 'shy' => '', + 'dependencies' => 'cms,extbase,fluid', + 'conflicts' => '', + 'priority' => '', + 'module' => '', + 'state' => 'alpha', + 'internal' => '', + 'uploadfolder' => '0', + 'createDirs' => '', + 'modify_tables' => '', + 'clearCacheOnLoad' => 0, + 'lockType' => '', + 'version' => '', + 'constraints' => array( + 'depends' => array( + 'cms' => '', + 'extbase' => '', + 'fluid' => '', + ), + 'conflicts' => array( + ), + 'suggests' => array( + ), + ), +); + +?> \ No newline at end of file diff --git a/ext_icon.gif b/ext_icon.gif new file mode 100755 index 0000000000000000000000000000000000000000..1a832d4b660d1b498d5f980098a7c3953ff69a8f GIT binary patch literal 177 zcmV;i08al$Nk%w1VG;lk0J8!BWo2cKj*jy3@|l^L$;ruVY;1*vg|V@*=H}+t*Vju+ zOI1}>D=RBPLPGxj{r~^~A^8LW00062EC2ui01^NY000DDP{>KEmFXN=lmdfw08JA} z4Wlvz6_lkRDJ!#33)}#bQJ)i%E+I(Nh?AENSWw+41YJXc5Fk4ec9G3FRl5J_Rh9}OA1rm-a80vh15)lA9z(qn} literal 0 HcmV?d00001 diff --git a/ext_tables.php b/ext_tables.php new file mode 100755 index 0000000..fa67873 --- /dev/null +++ b/ext_tables.php @@ -0,0 +1,35 @@ + 'new, create', + ), + array( + 'access' => 'user,group', + 'icon' => 'EXT:' . $_EXTKEY . '/ext_icon.gif', + 'labels' => 'LLL:EXT:' . $_EXTKEY . '/Resources/Private/Language/locallang_createsokobanlevels.xml', + ) + ); + + $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/layout/class.tx_cms_layout.php']['tt_content_drawItem'][] = 'EXT:sokoban/Classes/Hooks/class.tx_sokoban_cmslayout.php:tx_sokoban_cmslayout'; + +} + + +t3lib_extMgm::addStaticFile($_EXTKEY, 'Configuration/TypoScript', 'Sokoban'); + +?> \ No newline at end of file diff --git a/ext_tables.sql b/ext_tables.sql new file mode 100755 index 0000000..e69de29