Index: lams_tool_notebook/conf/hibernate/mappings/org/lamsfoundation/lams/tool/notebook/model/Notebook.hbm.xml =================================================================== diff -u -re64f3e306f3139c78e8917240c33ea232e75e848 -ra74ae929e1b5f6e321e7251fb5bf5f93285c5b92 --- lams_tool_notebook/conf/hibernate/mappings/org/lamsfoundation/lams/tool/notebook/model/Notebook.hbm.xml (.../Notebook.hbm.xml) (revision e64f3e306f3139c78e8917240c33ea232e75e848) +++ lams_tool_notebook/conf/hibernate/mappings/org/lamsfoundation/lams/tool/notebook/model/Notebook.hbm.xml (.../Notebook.hbm.xml) (revision a74ae929e1b5f6e321e7251fb5bf5f93285c5b92) @@ -182,7 +182,7 @@ name="conditions" lazy="true" cascade="all" - sort="unsorted" + sort="org.lamsfoundation.lams.learningdesign.TextSearchConditionComparator" > - + @@ -27,8 +27,8 @@ - + @@ -611,7 +611,7 @@ - + Index: lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/dbupdates/patch20080929_updateFrom21.sql =================================================================== diff -u -re64f3e306f3139c78e8917240c33ea232e75e848 -ra74ae929e1b5f6e321e7251fb5bf5f93285c5b92 --- lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/dbupdates/patch20080929_updateFrom21.sql (.../patch20080929_updateFrom21.sql) (revision e64f3e306f3139c78e8917240c33ea232e75e848) +++ lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/dbupdates/patch20080929_updateFrom21.sql (.../patch20080929_updateFrom21.sql) (revision a74ae929e1b5f6e321e7251fb5bf5f93285c5b92) @@ -7,4 +7,6 @@ REFERENCES lams_branch_condition(condition_id) ON DELETE CASCADE ON UPDATE CASCADE , CONSTRAINT NotebookConditionToNotebook FOREIGN KEY (content_uid) REFERENCES tl_lantbk11_notebook(uid) ON DELETE CASCADE ON UPDATE CASCADE -)TYPE=InnoDB; \ No newline at end of file +)TYPE=InnoDB; + +UPDATE lams_tool SET supports_outputs=1 WHERE tool_signature='lantbk11'; \ No newline at end of file Index: lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/dto/NotebookConditionDTO.java =================================================================== diff -u --- lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/dto/NotebookConditionDTO.java (revision 0) +++ lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/dto/NotebookConditionDTO.java (revision a74ae929e1b5f6e321e7251fb5bf5f93285c5b92) @@ -0,0 +1,39 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ +package org.lamsfoundation.lams.tool.notebook.dto; + +import org.lamsfoundation.lams.learningdesign.TextSearchCondition; +import org.lamsfoundation.lams.learningdesign.dto.TextSearchConditionDTO; +import org.lamsfoundation.lams.tool.notebook.model.NotebookCondition; + +public class NotebookConditionDTO extends TextSearchConditionDTO { + public NotebookConditionDTO(TextSearchCondition condition, Integer toolActivityUIID) { + super(condition, toolActivityUIID); + } + + @Override + public NotebookCondition getCondition() { + return new NotebookCondition(this); + } +} \ No newline at end of file Index: lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/model/Notebook.java =================================================================== diff -u -re64f3e306f3139c78e8917240c33ea232e75e848 -ra74ae929e1b5f6e321e7251fb5bf5f93285c5b92 --- lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/model/Notebook.java (.../Notebook.java) (revision e64f3e306f3139c78e8917240c33ea232e75e848) +++ lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/model/Notebook.java (.../Notebook.java) (revision a74ae929e1b5f6e321e7251fb5bf5f93285c5b92) @@ -32,8 +32,8 @@ import org.apache.log4j.Logger; import org.lamsfoundation.lams.contentrepository.client.IToolContentHandler; +import org.lamsfoundation.lams.learningdesign.TextSearchConditionComparator; import org.lamsfoundation.lams.tool.notebook.service.NotebookService; -import org.lamsfoundation.lams.tool.notebook.util.NotebookConditionComparator; /** * @hibernate.class table="tl_lantbk11_notebook" @@ -84,7 +84,7 @@ private Set notebookSessions; - private Set conditions = new TreeSet(new NotebookConditionComparator()); + private Set conditions = new TreeSet(new TextSearchConditionComparator()); // *********** NON Persisit fields private IToolContentHandler toolContentHandler; @@ -330,6 +330,7 @@ /** * @hibernate.set lazy="true" cascade="all" + * sort="org.lamsfoundation.lams.learningdesign.TextSearchConditionComparator" * @hibernate.collection-key column="content_uid" * @hibernate.collection-one-to-many class="org.lamsfoundation.lams.tool.notebook.model.NotebookCondition" * @@ -417,7 +418,7 @@ notebook.notebookSessions = new HashSet(); if (conditions != null) { - Set set = new TreeSet(new NotebookConditionComparator()); + Set set = new TreeSet(new TextSearchConditionComparator()); for (NotebookCondition condition : conditions) { set.add((NotebookCondition) condition.clone()); } Index: lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/model/NotebookCondition.java =================================================================== diff -u -re64f3e306f3139c78e8917240c33ea232e75e848 -ra74ae929e1b5f6e321e7251fb5bf5f93285c5b92 --- lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/model/NotebookCondition.java (.../NotebookCondition.java) (revision e64f3e306f3139c78e8917240c33ea232e75e848) +++ lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/model/NotebookCondition.java (.../NotebookCondition.java) (revision a74ae929e1b5f6e321e7251fb5bf5f93285c5b92) @@ -1,22 +1,47 @@ package org.lamsfoundation.lams.tool.notebook.model; +import org.lamsfoundation.lams.learningdesign.BranchCondition; +import org.lamsfoundation.lams.learningdesign.LearningDesign; import org.lamsfoundation.lams.learningdesign.TextSearchCondition; -import org.lamsfoundation.lams.learningdesign.dto.BranchConditionDTO; +import org.lamsfoundation.lams.learningdesign.dto.TextSearchConditionDTO; +import org.lamsfoundation.lams.tool.notebook.dto.NotebookConditionDTO; +/** + * Basically the same as {@link TextSearchCondition}. No new functionality was required. + * + * @author Marcin Cieslak + * + */ public class NotebookCondition extends TextSearchCondition { public NotebookCondition() { super(); } - public NotebookCondition(BranchConditionDTO conditionDTO) { + public NotebookCondition(TextSearchConditionDTO conditionDTO) { super(conditionDTO); } public NotebookCondition(Long conditionId, Integer conditionUIID, Integer orderId, String name, String displayName, - String type, String startValue, String endValue, String exactMatchValue, String allWords, String phrase, - String anyWords, String excludedWords) { - super(conditionId, conditionUIID, orderId, name, displayName, type, startValue, endValue, exactMatchValue, - allWords, phrase, anyWords, excludedWords); + String allWords, String phrase, String anyWords, String excludedWords) { + super(conditionId, conditionUIID, orderId, name, displayName, BranchCondition.OUTPUT_TYPE_STRING, null, null, + null, allWords, phrase, anyWords, excludedWords); } + + @Override + public Object clone() { + return new NotebookCondition(null, null, orderId, name, displayName, allWords, phrase, anyWords, excludedWords); + } + + @Override + public NotebookCondition clone(int uiidOffset) { + Integer newConditionUIID = LearningDesign.addOffset(conditionUIID, uiidOffset); + return new NotebookCondition(null, newConditionUIID, orderId, name, displayName, allWords, phrase, anyWords, + excludedWords); + } + + @Override + public NotebookConditionDTO getBranchConditionDTO(Integer toolActivityUIID) { + return new NotebookConditionDTO(this, toolActivityUIID); + } } \ No newline at end of file Index: lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/service/INotebookService.java =================================================================== diff -u -re64f3e306f3139c78e8917240c33ea232e75e848 -ra74ae929e1b5f6e321e7251fb5bf5f93285c5b92 --- lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/service/INotebookService.java (.../INotebookService.java) (revision e64f3e306f3139c78e8917240c33ea232e75e848) +++ lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/service/INotebookService.java (.../INotebookService.java) (revision a74ae929e1b5f6e321e7251fb5bf5f93285c5b92) @@ -161,7 +161,17 @@ */ void updateEntry(Long uid, String entry); + /** + * Creates an unique name for a ChatCondition. It consists of the tool output definition name and a unique positive + * integer number. + * + * @param existingConditions + * existing conditions; required to check if a condition with the same name does not exist. + * @return unique ChatCondition name + */ String createConditionName(Collection existingConditions); void releaseConditionsFromCache(Notebook notebook); + + void deleteCondition(NotebookCondition condition); } \ No newline at end of file Index: lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/service/NotebookOutputFactory.java =================================================================== diff -u -re64f3e306f3139c78e8917240c33ea232e75e848 -ra74ae929e1b5f6e321e7251fb5bf5f93285c5b92 --- lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/service/NotebookOutputFactory.java (.../NotebookOutputFactory.java) (revision e64f3e306f3139c78e8917240c33ea232e75e848) +++ lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/service/NotebookOutputFactory.java (.../NotebookOutputFactory.java) (revision a74ae929e1b5f6e321e7251fb5bf5f93285c5b92) @@ -66,8 +66,8 @@ .getToolContentId().toString()); // Default condition checks if the text contains word "LAMS" NotebookCondition defaultCondition = new NotebookCondition(null, null, 1, name, getI18NText( - NotebookConstants.TEXT_SEARCH_DEFAULT_CONDITION_DISPLAY_NAME_KEY, false), "OUTPUT_STRING", - null, null, null, "LAMS", null, null, null); + NotebookConstants.TEXT_SEARCH_DEFAULT_CONDITION_DISPLAY_NAME_KEY, false), "LAMS", null, null, + null); notebook.getConditions().add(defaultCondition); notebookEntryDefinition.getDefaultConditions().add(defaultCondition); } @@ -79,7 +79,7 @@ } /** - * Follows {@link QaServicePOJO#getToolOutput(List, Long, Long)}. + * Follows {@link NotebookService#getToolOutput(List, Long, Long)}. * */ public SortedMap getToolOutput(List names, INotebookService notebookService, @@ -90,8 +90,8 @@ ToolOutput notebookEntryOutput = null; if (names == null) { // output will be set for all the existing conditions - Notebook qaContent = notebookService.getSessionBySessionId(toolSessionId).getNotebook(); - Set conditions = qaContent.getConditions(); + Notebook notebook = notebookService.getSessionBySessionId(toolSessionId).getNotebook(); + Set conditions = notebook.getConditions(); for (NotebookCondition condition : conditions) { String name = condition.getName(); if (isTextSearchConditionName(name) && notebookEntryOutput != null) { @@ -100,7 +100,7 @@ ToolOutput output = getToolOutput(name, notebookService, toolSessionId, learnerId); if (output != null) { outputs.put(name, output); - if (isTextSearchConditionName(NotebookConstants.TEXT_SEARCH_DEFINITION_NAME)) { + if (isTextSearchConditionName(name)) { notebookEntryOutput = output; } } @@ -114,7 +114,7 @@ ToolOutput output = getToolOutput(name, notebookService, toolSessionId, learnerId); if (output != null) { outputs.put(name, output); - if (isTextSearchConditionName(NotebookConstants.TEXT_SEARCH_DEFINITION_NAME)) { + if (isTextSearchConditionName(name)) { notebookEntryOutput = output; } } @@ -125,13 +125,13 @@ } - public ToolOutput getToolOutput(String name, INotebookService qaService, Long toolSessionId, Long learnerId) { - if (isTextSearchConditionName(NotebookConstants.TEXT_SEARCH_DEFINITION_NAME)) { + public ToolOutput getToolOutput(String name, INotebookService chatService, Long toolSessionId, Long learnerId) { + if (isTextSearchConditionName(name)) { // entry is loaded from DB - Notebook taskList = qaService.getSessionBySessionId(toolSessionId).getNotebook(); + Notebook notebook = chatService.getSessionBySessionId(toolSessionId).getNotebook(); - NotebookUser user = qaService.getUserByUserIdAndSessionId(learnerId, toolSessionId); - NotebookEntry entry = qaService.getEntry(user.getEntryUID()); + NotebookUser user = chatService.getUserByUserIdAndSessionId(learnerId, toolSessionId); + NotebookEntry entry = chatService.getEntry(user.getEntryUID()); String value = entry == null ? null : entry.getEntry(); Index: lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/service/NotebookService.java =================================================================== diff -u -re64f3e306f3139c78e8917240c33ea232e75e848 -ra74ae929e1b5f6e321e7251fb5bf5f93285c5b92 --- lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/service/NotebookService.java (.../NotebookService.java) (revision e64f3e306f3139c78e8917240c33ea232e75e848) +++ lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/service/NotebookService.java (.../NotebookService.java) (revision a74ae929e1b5f6e321e7251fb5bf5f93285c5b92) @@ -651,4 +651,10 @@ } } } + + public void deleteCondition(NotebookCondition condition) { + if (condition != null && condition.getConditionId() != null) { + notebookDAO.delete(condition); + } + } } \ No newline at end of file Fisheye: Tag a74ae929e1b5f6e321e7251fb5bf5f93285c5b92 refers to a dead (removed) revision in file `lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/util/NotebookConditionComparator.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/util/NotebookConstants.java =================================================================== diff -u -re64f3e306f3139c78e8917240c33ea232e75e848 -ra74ae929e1b5f6e321e7251fb5bf5f93285c5b92 --- lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/util/NotebookConstants.java (.../NotebookConstants.java) (revision e64f3e306f3139c78e8917240c33ea232e75e848) +++ lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/util/NotebookConstants.java (.../NotebookConstants.java) (revision a74ae929e1b5f6e321e7251fb5bf5f93285c5b92) @@ -60,6 +60,4 @@ public static final String ERROR_MSG_CONDITION = "error.condition"; public static final String ERROR_MSG_NAME_BLANK = "error.condition.name.blank"; public static final String ERROR_MSG_NAME_DUPLICATED = "error.condition.duplicated.name"; - - public static final String DEFINE_LATER = "defineLater"; } \ No newline at end of file Index: lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/web/actions/AuthoringAction.java =================================================================== diff -u -re64f3e306f3139c78e8917240c33ea232e75e848 -ra74ae929e1b5f6e321e7251fb5bf5f93285c5b92 --- lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/web/actions/AuthoringAction.java (.../AuthoringAction.java) (revision e64f3e306f3139c78e8917240c33ea232e75e848) +++ lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/web/actions/AuthoringAction.java (.../AuthoringAction.java) (revision a74ae929e1b5f6e321e7251fb5bf5f93285c5b92) @@ -46,13 +46,13 @@ import org.apache.struts.upload.FormFile; import org.lamsfoundation.lams.authoring.web.AuthoringConstants; import org.lamsfoundation.lams.contentrepository.client.IToolContentHandler; +import org.lamsfoundation.lams.learningdesign.TextSearchConditionComparator; import org.lamsfoundation.lams.tool.ToolAccessMode; import org.lamsfoundation.lams.tool.notebook.model.Notebook; import org.lamsfoundation.lams.tool.notebook.model.NotebookAttachment; import org.lamsfoundation.lams.tool.notebook.model.NotebookCondition; import org.lamsfoundation.lams.tool.notebook.service.INotebookService; import org.lamsfoundation.lams.tool.notebook.service.NotebookServiceProxy; -import org.lamsfoundation.lams.tool.notebook.util.NotebookConditionComparator; import org.lamsfoundation.lams.tool.notebook.util.NotebookConstants; import org.lamsfoundation.lams.tool.notebook.web.forms.AuthoringForm; import org.lamsfoundation.lams.util.FileValidatorUtil; @@ -177,7 +177,7 @@ Set conditions = notebook.getConditions(); if (conditions == null) { - conditions = new TreeSet(new NotebookConditionComparator()); + conditions = new TreeSet(new TextSearchConditionComparator()); } SortedSet conditionSet = (SortedSet) map .get(NotebookConstants.ATTR_CONDITION_SET); @@ -189,6 +189,7 @@ for (NotebookCondition condition : deletedConditionList) { // remove from db, leave in repository conditions.remove(condition); + notebookService.deleteCondition(condition); } } @@ -432,7 +433,7 @@ } } - SortedSet set = new TreeSet(new NotebookConditionComparator()); + SortedSet set = new TreeSet(new TextSearchConditionComparator()); if (notebook.getConditions() != null) { set.addAll(notebook.getConditions()); @@ -480,4 +481,20 @@ private SessionMap getSessionMap(HttpServletRequest request, AuthoringForm authForm) { return (SessionMap) request.getSession().getAttribute(authForm.getSessionMapID()); } + + /** + * Lists deleted Notebook conditions, which could be persisted or non-persisted items. + * + * @param request + * @return + */ + private List getDeletedNotebookConditionList(SessionMap sessionMap) { + List list = (List) sessionMap.get(NotebookConstants.ATTR_DELETED_CONDITION_LIST); + if (list == null) { + list = new ArrayList(); + sessionMap.put(NotebookConstants.ATTR_DELETED_CONDITION_LIST, list); + } + return list; + + } } \ No newline at end of file Index: lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/web/actions/AuthoringNotebookConditionAction.java =================================================================== diff -u -re64f3e306f3139c78e8917240c33ea232e75e848 -ra74ae929e1b5f6e321e7251fb5bf5f93285c5b92 --- lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/web/actions/AuthoringNotebookConditionAction.java (.../AuthoringNotebookConditionAction.java) (revision e64f3e306f3139c78e8917240c33ea232e75e848) +++ lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/web/actions/AuthoringNotebookConditionAction.java (.../AuthoringNotebookConditionAction.java) (revision a74ae929e1b5f6e321e7251fb5bf5f93285c5b92) @@ -40,10 +40,10 @@ import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionMessage; import org.apache.struts.action.ActionMessages; +import org.lamsfoundation.lams.learningdesign.TextSearchConditionComparator; import org.lamsfoundation.lams.tool.notebook.model.NotebookCondition; import org.lamsfoundation.lams.tool.notebook.service.INotebookService; import org.lamsfoundation.lams.tool.notebook.service.NotebookServiceProxy; -import org.lamsfoundation.lams.tool.notebook.util.NotebookConditionComparator; import org.lamsfoundation.lams.tool.notebook.util.NotebookConstants; import org.lamsfoundation.lams.tool.notebook.util.NotebookException; import org.lamsfoundation.lams.tool.notebook.web.forms.AuthoringForm; @@ -199,6 +199,11 @@ SortedSet conditionSet = getNotebookConditionSet(sessionMap); List conditionList = new ArrayList(conditionSet); NotebookCondition condition = conditionList.remove(orderId); + for (NotebookCondition otherCondition : conditionSet) { + if (otherCondition.getOrderId() > orderId) { + otherCondition.setOrderId(otherCondition.getOrderId() - 1); + } + } conditionSet.clear(); conditionSet.addAll(conditionList); // add to delList @@ -282,7 +287,7 @@ SortedSet set = (SortedSet) sessionMap .get(NotebookConstants.ATTR_CONDITION_SET); if (set == null) { - set = new TreeSet(new NotebookConditionComparator()); + set = new TreeSet(new TextSearchConditionComparator()); sessionMap.put(NotebookConstants.ATTR_CONDITION_SET, set); } return set; Index: lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/web/forms/NotebookConditionForm.java =================================================================== diff -u -re64f3e306f3139c78e8917240c33ea232e75e848 -ra74ae929e1b5f6e321e7251fb5bf5f93285c5b92 --- lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/web/forms/NotebookConditionForm.java (.../NotebookConditionForm.java) (revision e64f3e306f3139c78e8917240c33ea232e75e848) +++ lams_tool_notebook/src/java/org/lamsfoundation/lams/tool/notebook/web/forms/NotebookConditionForm.java (.../NotebookConditionForm.java) (revision a74ae929e1b5f6e321e7251fb5bf5f93285c5b92) @@ -4,7 +4,7 @@ import org.lamsfoundation.lams.web.TextSearchActionForm; /** - * A text search form with additional parameters for Q&A needs. + * A text search form with additional parameters for Notebook needs. * * @author Marcin Cieslak * @struts.form name="notebookConditionForm" @@ -46,8 +46,8 @@ * @return created condition */ public NotebookCondition extractCondition() { - return new NotebookCondition(null, null, getOrderId(), null, getDisplayName(), "OUTPUT_STRING", null, null, - null, getAllWords(), getPhrase(), getAnyWords(), getExcludedWords()); + return new NotebookCondition(null, null, getOrderId(), null, getDisplayName(), getAllWords(), getPhrase(), + getAnyWords(), getExcludedWords()); } public void extractCondition(NotebookCondition condition) { Index: lams_tool_notebook/web/WEB-INF/struts/struts-config.xml =================================================================== diff -u -r56af73875ad9b4f953d2951479e49dbc1f2715f9 -ra74ae929e1b5f6e321e7251fb5bf5f93285c5b92 --- lams_tool_notebook/web/WEB-INF/struts/struts-config.xml (.../struts-config.xml) (revision 56af73875ad9b4f953d2951479e49dbc1f2715f9) +++ lams_tool_notebook/web/WEB-INF/struts/struts-config.xml (.../struts-config.xml) (revision a74ae929e1b5f6e321e7251fb5bf5f93285c5b92) @@ -18,6 +18,10 @@ type="org.lamsfoundation.lams.tool.notebook.web.forms.MonitoringForm" /> + @@ -114,7 +118,46 @@ /> - + + + + + + + + + + + + + + + + + + +