text:
package org.olat.lms.course.nodes;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.olat.data.basesecurity.Identity;
import org.olat.data.repository.RepositoryEntry;
import org.olat.lms.activitylogging.LoggingResourceable;
import org.olat.lms.commons.ModuleConfiguration;
import org.olat.lms.commons.UsedByXstream;
import org.olat.lms.course.CourseFactory;
import org.olat.lms.course.CourseModule;
import org.olat.lms.course.ICourse;
import org.olat.lms.course.condition.Condition;
import org.olat.lms.course.condition.interpreter.ConditionExpression;
import org.olat.lms.course.condition.interpreter.ConditionInterpreter;
import org.olat.lms.course.editor.CourseEditorEnv;
import org.olat.lms.course.run.scoring.ScoreCalculator;
import org.olat.lms.course.run.scoring.ScoreEvaluation;
import org.olat.lms.course.run.userview.NodeEvaluation;
import org.olat.lms.course.run.userview.UserCourseEnvironment;
import org.olat.lms.course.tree.CourseInternalLinkTreeModel;
import org.olat.lms.group.learn.CourseGroupManager;
import org.olat.lms.group.learn.CourseRights;
import org.olat.presentation.course.editor.NodeEditController;
import org.olat.presentation.course.editor.StatusDescription;
import org.olat.presentation.course.nodes.TitledWrapperHelper;
import org.olat.presentation.course.nodes.sp.SPEditController;
import org.olat.presentation.course.nodes.sp.SPPeekviewController;
import org.olat.presentation.course.nodes.st.STCourseNodeEditController;
import org.olat.presentation.course.nodes.st.STCourseNodeRunController;
import org.olat.presentation.course.nodes.st.STPeekViewController;
import org.olat.presentation.course.run.navigation.NodeRunConstructionResult;
import org.olat.presentation.framework.common.htmlpageview.SinglePageController;
import org.olat.presentation.framework.common.linkchooser.CustomLinkTreeModel;
import org.olat.presentation.framework.core.UserRequest;
import org.olat.presentation.framework.core.control.Controller;
import org.olat.presentation.framework.core.control.WindowControl;
import org.olat.presentation.framework.core.control.creator.ControllerCreator;
import org.olat.presentation.framework.core.control.generic.clone.CloneController;
import org.olat.presentation.framework.core.control.generic.clone.CloneLayoutControllerCreatorCallback;
import org.olat.presentation.framework.core.control.generic.clone.CloneableController;
import org.olat.presentation.framework.core.control.generic.tabbable.TabbableController;
import org.olat.presentation.framework.core.translator.PackageUtil;
import org.olat.presentation.framework.layout.fullWebApp.LayoutMain3ColsController;
import org.olat.presentation.framework.layout.fullWebApp.popup.BaseFullWebappPopupLayoutFactory;
import org.olat.system.commons.StringHelper;
import org.olat.system.commons.resource.OLATResourceable;
import org.olat.system.commons.resource.OresHelper;
import org.olat.system.exception.AssertException;
import org.olat.system.exception.OLATRuntimeException;
import org.olat.system.logging.log4j.LoggerHelper;

/**
 * Description:

 * The structure node (ST) is used to build structures in the course hierarchy. In addition it is also used to calculate score and passed values, to syndicate these
 * values e.g. from children nodes. Example: a lesson with two tests is passed when both tests are passed. This would be designed as an ST node with two IMSTEST nodes as
 * children and a scoring rule on the ST node that syndicates the testresults. In the assessment tool the ST node results can be seen but not changed since these are
 * calculated values and not saved values from properties.
 *

 * Initial Date: Feb 9, 2004

 *
 * @author Mike Stock
 * @author BPS (BPS Bildungsportal Sachsen GmbH)
 */
public class STCourseNode extends AbstractAccessableCourseNode implements AssessableCourseNode, UsedByXstream {

    private static final String TYPE = "st";
    private static final String ICON_CSS_CLASS = "o_st_icon";
    private static final Logger log = LoggerHelper.getLogger();
    private ScoreCalculator scoreCalculator;

    transient private Condition scoreExpression;

    transient private Condition passedExpression;

    /**
     * Constructor for a course building block of the type structure
     */
    public STCourseNode() {
        super(TYPE);
        updateModuleConfigDefaults(true);
    }

    /**
	 */
    @Override
    public TabbableController createEditController(final UserRequest ureq, final WindowControl wControl, final ICourse course, final UserCourseEnvironment euce) {
        updateModuleConfigDefaults(false);
        // only the precondition "access" can be configured till now
        final STCourseNodeEditController childTabCntrllr = new STCourseNodeEditController(ureq, wControl, this, course.getCourseFolderContainer(), course
                .getCourseEnvironment().getCourseGroupManager(), course.getEditorTreeModel(), euce);
        final CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
        return new NodeEditController(ureq, wControl, course.getEditorTreeModel(), course, chosenNode, course.getCourseEnvironment().getCourseGroupManager(), euce,
                childTabCntrllr);
    }

    /**
     * org.olat.lms.course.run.userview.UserCourseEnvironment, org.olat.lms.course.run.userview.NodeEvaluation)
     */
    @Override
    public NodeRunConstructionResult createNodeRunConstructionResult(final UserRequest ureq, final WindowControl wControl, final UserCourseEnvironment userCourseEnv,
            final NodeEvaluation ne, final String nodecmd) {
        updateModuleConfigDefaults(false);
        Controller cont;

        final String displayType = getModuleConfiguration().getStringValue(STCourseNodeEditController.CONFIG_KEY_DISPLAY_TYPE);
        /* STATIC_METHOD_REFACTORING removed call of public static function STCourseNodeEditController.getFileName */
        final String relPath = (String) getModuleConfiguration().get(STCourseNodeEditController.CONFIG_KEY_FILE);

        if (relPath != null && displayType.equals(STCourseNodeEditController.CONFIG_VALUE_DISPLAY_FILE)) {
            // we want a user chosen overview, so display the chosen file from the
            // material folder, otherwise display the normal overview
            // reuse the Run controller from the "Single Page" building block, since
            // we need to do exactly the same task
            final Boolean allowRelativeLinks = getModuleConfiguration().getBooleanEntry(STCourseNodeEditController.CONFIG_KEY_ALLOW_RELATIVE_LINKS);
            final OLATResourceable ores = OresHelper.createOLATResourceableInstance(CourseModule.class, userCourseEnv.getCourseEnvironment().getCourseResourceableId());
            final SinglePageController spCtr = new SinglePageController(ureq, wControl, userCourseEnv.getCourseEnvironment().getCourseFolderContainer(), relPath, null,
                    allowRelativeLinks.booleanValue(), ores);
            // check if user is allowed to edit the page in the run view
            final CourseGroupManager cgm = userCourseEnv.getCourseEnvironment().getCourseGroupManager();
            final boolean hasEditRights = (cgm.isIdentityCourseAdministrator(ureq.getIdentity(), ores) || cgm.hasRight(ureq.getIdentity(),
                    CourseRights.RIGHT_COURSEEDITOR, ores));
            if (hasEditRights) {
                spCtr.allowPageEditing();
                // set the link tree model to internal for the HTML editor
                final CustomLinkTreeModel linkTreeModel = new CourseInternalLinkTreeModel(userCourseEnv.getCourseEnvironment().getRunStructure().getRootNode());
                spCtr.setInternalLinkTreeModel(linkTreeModel);
            }
            spCtr.addLoggingResourceable(LoggingResourceable.wrap(this));
            // create clone wrapper layout, allow popping into second window
            final CloneLayoutControllerCreatorCallback clccc = new CloneLayoutControllerCreatorCallback() {
                @Override
                public ControllerCreator createLayoutControllerCreator(final UserRequest ureq, final ControllerCreator contentControllerCreator) {
                    return BaseFullWebappPopupLayoutFactory.createAuthMinimalPopupLayout(ureq, new ControllerCreator() {
                        @Override
                        @SuppressWarnings("synthetic-access")
                        public Controller createController(final UserRequest lureq, final WindowControl lwControl) {
                            // wrapp in column layout, popup window needs a layout controller
                            final Controller ctr = contentControllerCreator.createController(lureq, lwControl);
                            final LayoutMain3ColsController layoutCtr = new LayoutMain3ColsController(lureq, lwControl, null, null, ctr.getInitialComponent(), null);
                            layoutCtr.setCustomCSS(CourseFactory.getCustomCourseCss(lureq.getUserSession(), userCourseEnv.getCourseEnvironment()));

                            final Controller wrappedCtrl = TitledWrapperHelper.getWrapper(lureq, lwControl, ctr, STCourseNode.this, ICON_CSS_CLASS);
                            layoutCtr.addDisposableChildController(wrappedCtrl);
                            return layoutCtr;
                        }
                    });
                }
            };
            final Controller wrappedCtrl = TitledWrapperHelper.getWrapper(ureq, wControl, spCtr, this, ICON_CSS_CLASS);
            if (wrappedCtrl instanceof CloneableController) {
                cont = new CloneController(ureq, wControl, (CloneableController) wrappedCtrl, clccc);
            } else {
                throw new AssertException("Need to be a cloneable");
            }
        } else {
            // evaluate the score accounting for this node. this uses the score accountings local
            // cache hash map to reduce unnecessary calculations
            final ScoreEvaluation se = userCourseEnv.getScoreAccounting().evalCourseNode(this);
            cont = TitledWrapperHelper.getWrapper(ureq, wControl, new STCourseNodeRunController(ureq, wControl, userCourseEnv, this, se, ne), this, ICON_CSS_CLASS);
        }

        // access the current calculated score, if there is one, so that it can be
        // displayed in the ST-Runcontroller
        return new NodeRunConstructionResult(cont);
    }

    /**
     * org.olat.lms.course.run.userview.UserCourseEnvironment, org.olat.lms.course.run.userview.NodeEvaluation)
     */
    @Override
    public Controller createPreviewController(final UserRequest ureq, final WindowControl wControl, final UserCourseEnvironment userCourseEnv, final NodeEvaluation ne) {
        return createNodeRunConstructionResult(ureq, wControl, userCourseEnv, ne, null).getRunController();
    }

    /**
     * org.olat.lms.course.run.userview.UserCourseEnvironment, org.olat.lms.course.run.userview.NodeEvaluation)
     */
    @Override
    public Controller createPeekViewRunController(final UserRequest ureq, final WindowControl wControl, final UserCourseEnvironment userCourseEnv, final NodeEvaluation ne) {
        if (ne.isAtLeastOneAccessible()) {
            final ModuleConfiguration config = getModuleConfiguration();
            if (STCourseNodeEditController.CONFIG_VALUE_DISPLAY_FILE.equals(config.getStringValue(STCourseNodeEditController.CONFIG_KEY_DISPLAY_TYPE))) {
                final String file = config.getStringValue(SPEditController.CONFIG_KEY_FILE);
                if (file != null) {
                    // use single page preview if a file is configured
                    final OLATResourceable ores = OresHelper.createOLATResourceableInstance(CourseModule.class, userCourseEnv.getCourseEnvironment()
                            .getCourseResourceableId());

                    return new SPPeekviewController(ureq, wControl, userCourseEnv, config, ores);
                }
            }
            // a peekview controller that displays the listing of the next ST level
            return new STPeekViewController(ureq, wControl, ne);
        } else {
            // use standard peekview without content
            return super.createPeekViewRunController(ureq, wControl, userCourseEnv, ne);
        }
    }

    /**
     * the structure node does not have a score itself, but calculates the score/passed info by evaluating the configured expression in the the (condition)interpreter.
     *
     */
    @Override
    public ScoreEvaluation getUserScoreEvaluation(final UserCourseEnvironment userCourseEnv) {
        Float score = null;
        Boolean passed = null;

        if (scoreCalculator == null) {
            // this is a not-computable course node at the moment (no scoring/passing rules defined)
            return null;
        }
        final String scoreExpressionStr = scoreCalculator.getScoreExpression();
        final String passedExpressionStr = scoreCalculator.getPassedExpression();

        final ConditionInterpreter ci = userCourseEnv.getConditionInterpreter();
        userCourseEnv.getScoreAccounting().setEvaluatingCourseNode(this);
        if (scoreExpressionStr != null) {
            score = new Float(ci.evaluateCalculation(scoreExpressionStr));
        }
        if (passedExpressionStr != null) {
            passed = new Boolean(ci.evaluateCondition(passedExpressionStr));
        }
        final ScoreEvaluation se = new ScoreEvaluation(score, passed);
        return se;
    }

    /**
	 */
    @Override
    public StatusDescription isConfigValid() {
        /*
         * first check the one click cache
         */
        if (oneClickStatusCache != null) {
            return oneClickStatusCache[0];
        }

        return StatusDescription.NOERROR;
    }

    /**
	 */
    @Override
    public StatusDescription[] isConfigValid(final CourseEditorEnv cev) {
        oneClickStatusCache = null;
        // only here we know which translator to take for translating condition
        // error messages
        final String translatorStr = PackageUtil.getPackageName(STCourseNodeEditController.class);
        final List sds = isConfigValidWithTranslator(cev, translatorStr, getConditionExpressions());
        oneClickStatusCache = StatusDescriptionHelper.sort(sds);
        return oneClickStatusCache;
    }

    /**
	 */
    @Override
    public RepositoryEntry getReferencedRepositoryEntry() {
        return null;
    }

    /**
	 */
    @Override
    public boolean needsReferenceToARepositoryEntry() {
        return false;
    }

    /**
     * @return Returns the scoreCalculator.
     */
    public ScoreCalculator getScoreCalculator() {
        if (scoreCalculator == null) {
            scoreCalculator = new ScoreCalculator(null, null);
        }
        passedExpression = new Condition();
        passedExpression.setConditionId("passed");
        if (scoreCalculator.getPassedExpression() != null) {
            passedExpression.setConditionExpression(scoreCalculator.getPassedExpression());
            passedExpression.setExpertMode(true);
        }
        scoreExpression = new Condition();
        scoreExpression.setConditionId("score");
        if (scoreCalculator.getScoreExpression() != null) {
            scoreExpression.setConditionExpression(scoreCalculator.getScoreExpression());
            scoreExpression.setExpertMode(true);
        }
        return scoreCalculator;
    }

    /**
     * @param scoreCalculator
     *            The scoreCalculator to set.
     */
    public void setScoreCalculator(final ScoreCalculator scoreCalculatorP) {
        scoreCalculator = scoreCalculatorP;
        if (scoreCalculatorP == null) {
            scoreCalculator = getScoreCalculator();
        }
        String passed, score;
        passed = scoreCalculator.getPassedExpression();
        score = scoreCalculator.getScoreExpression();
        scoreExpression.setExpertMode(true);
        scoreExpression.setConditionExpression(score);
        scoreExpression.setConditionId("score");
        passedExpression.setExpertMode(true);
        passedExpression.setConditionExpression(passed);
        passedExpression.setConditionId("passed");
    }

    /**
	 */
    @Override
    public Float getCutValueConfiguration() {
        throw new OLATRuntimeException(STCourseNode.class, "Cut value never defined for ST nodes", null);
    }

    /**
	 */
    @Override
    public Float getMaxScoreConfiguration() {
        throw new OLATRuntimeException(STCourseNode.class, "Max score never defined for ST nodes", null);
    }

    /**
	 */
    @Override
    public Float getMinScoreConfiguration() {
        throw new OLATRuntimeException(STCourseNode.class, "Min score never defined for ST nodes", null);
    }

    /**
	 */
    @Override
    public String getUserCoachComment(final UserCourseEnvironment userCourseEnvironment) {
        throw new OLATRuntimeException(STCourseNode.class, "No coach comments available in ST nodes", null);
    }

    /**
	 */
    @Override
    public String getUserLog(final UserCourseEnvironment userCourseEnvironment) {
        throw new OLATRuntimeException(STCourseNode.class, "No user logs available in ST nodes", null);
    }

    /**
	 */
    @Override
    public String getUserUserComment(final UserCourseEnvironment userCourseEnvironment) {
        throw new OLATRuntimeException(STCourseNode.class, "No comments available in ST nodes", null);
    }

    /**
	 */
    @Override
    public boolean hasCommentConfigured() {
        // never has comments
        return false;
    }

    /**
	 */
    @Override
    public boolean hasPassedConfigured() {
        if (scoreCalculator != null && StringHelper.containsNonWhitespace(scoreCalculator.getPassedExpression())) {
            return true;
        }
        return false;
    }

    /**
	 */
    @Override
    public boolean hasScoreConfigured() {
        if (scoreCalculator != null && StringHelper.containsNonWhitespace(scoreCalculator.getScoreExpression())) {
            return true;
        }
        return false;
    }

    /**
	 */
    @Override
    public boolean hasStatusConfigured() {
        return false;
    }

    /**
	 */
    @Override
    public boolean isEditableConfigured() {
        // ST nodes never editable, data generated on the fly
        return false;
    }

    /**
	 */
    @Override
    public void updateUserCoachComment(final String coachComment, final UserCourseEnvironment userCourseEnvironment) {
        throw new OLATRuntimeException(STCourseNode.class, "Coach comment variable can't be updated in ST nodes", null);
    }

    /**
     * org.olat.lms.course.run.userview.UserCourseEnvironment, org.olat.data.basesecurity.Identity)
     */
    @Override
    public void updateUserScoreEvaluation(final ScoreEvaluation scoreEvaluation, final UserCourseEnvironment userCourseEnvironment, final Identity coachingIdentity,
            final boolean incrementAttempts) {
        throw new OLATRuntimeException(STCourseNode.class, "Score variable can't be updated in ST nodes", null);
    }

    /**
     * org.olat.data.basesecurity.Identity)
     */
    @Override
    public void updateUserUserComment(final String userComment, final UserCourseEnvironment userCourseEnvironment, final Identity coachingIdentity) {
        throw new OLATRuntimeException(STCourseNode.class, "Comment variable can't be updated in ST nodes", null);
    }

    /**
	 */
    @Override
    public Integer getUserAttempts(final UserCourseEnvironment userCourseEnvironment) {
        throw new OLATRuntimeException(STCourseNode.class, "No attempts available in ST nodes", null);

    }

    /**
	 */
    @Override
    public boolean hasAttemptsConfigured() {
        return false;
    }

    /**
     * org.olat.data.basesecurity.Identity)
     */
    @Override
    public void updateUserAttempts(final Integer userAttempts, final UserCourseEnvironment userCourseEnvironment, final Identity coachingIdentity) {
        throw new OLATRuntimeException(STCourseNode.class, "Attempts variable can't be updated in ST nodes", null);
    }

    /**
	 */
    @Override
    public void incrementUserAttempts(final UserCourseEnvironment userCourseEnvironment) {
        throw new OLATRuntimeException(STCourseNode.class, "Attempts variable can't be updated in ST nodes", null);
    }

    /**
     * org.olat.lms.course.run.userview.UserCourseEnvironment)
     */
    @Override
    public Controller getDetailsEditController(final UserRequest ureq, final WindowControl wControl, final UserCourseEnvironment userCourseEnvironment) {
        throw new OLATRuntimeException(STCourseNode.class, "Details controler not available in ST nodes", null);
    }

    /**
	 */
    @Override
    public String getDetailsListView(final UserCourseEnvironment userCourseEnvironment) {
        throw new OLATRuntimeException(STCourseNode.class, "Details not available in ST nodes", null);
    }

    /**
	 */
    @Override
    public String getDetailsListViewHeaderKey() {
        throw new OLATRuntimeException(STCourseNode.class, "Details not available in ST nodes", null);
    }

    /**
	 */
    @Override
    public boolean hasDetails() {
        return false;
    }

    /**
     * Update the module configuration to have all mandatory configuration flags set to usefull default values
     *
     * @param isNewNode
     *            true: an initial configuration is set; false: upgrading from previous node configuration version, set default to maintain previous behaviour
     */
    @Override
    public void updateModuleConfigDefaults(final boolean isNewNode) {
        final ModuleConfiguration config = getModuleConfiguration();
        if (isNewNode) {
            // use defaults for new course building blocks
            config.setBooleanEntry(STCourseNodeEditController.CONFIG_KEY_ALLOW_RELATIVE_LINKS, Boolean.FALSE.booleanValue());
            // set the default display to peekview in two columns
            config.setStringValue(STCourseNodeEditController.CONFIG_KEY_DISPLAY_TYPE, STCourseNodeEditController.CONFIG_VALUE_DISPLAY_PEEKVIEW);
            config.setIntValue(STCourseNodeEditController.CONFIG_KEY_COLUMNS, 2);
            config.setConfigurationVersion(3);
        } else {
            // update to version 2
            if (config.getConfigurationVersion() < 2) {
                // use values accoring to previous functionality
                config.setBooleanEntry(STCourseNodeEditController.CONFIG_KEY_ALLOW_RELATIVE_LINKS, Boolean.FALSE.booleanValue());
                // previous version of score st node didn't have easy mode on score
                // calculator, se to expert mode
                if (getScoreCalculator() != null) {
                    getScoreCalculator().setExpertMode(true);
                }
                config.setConfigurationVersion(2);
            }
            // update to version 3
            if (config.getConfigurationVersion() < 3) {
                final String fileName = (String) config.get(STCourseNodeEditController.CONFIG_KEY_FILE);
                if (fileName != null) {
                    // set to custom file display config
                    config.setStringValue(STCourseNodeEditController.CONFIG_KEY_DISPLAY_TYPE, STCourseNodeEditController.CONFIG_VALUE_DISPLAY_FILE);
                } else {
                    // set the default display to plain vanilla TOC view in one column
                    config.setStringValue(STCourseNodeEditController.CONFIG_KEY_DISPLAY_TYPE, STCourseNodeEditController.CONFIG_VALUE_DISPLAY_TOC);
                    config.setIntValue(STCourseNodeEditController.CONFIG_KEY_COLUMNS, 1);
                }
                config.setConfigurationVersion(3);
            }
        }
    }

    /**
	 */
    @Override
    public List getConditionExpressions() {
        ArrayList retVal;
        final List parentsConditions = super.getConditionExpressions();
        if (parentsConditions.size() > 0) {
            retVal = new ArrayList(parentsConditions);
        } else {
            retVal = new ArrayList();
        }
        // init passedExpression and scoreExpression
        getScoreCalculator();
        //
        passedExpression.setExpertMode(true);
        String coS = passedExpression.getConditionExpression();
        if (coS != null && !coS.equals("")) {
            // an active condition is defined
            final ConditionExpression ce = new ConditionExpression(passedExpression.getConditionId());
            ce.setExpressionString(passedExpression.getConditionExpression());
            retVal.add(ce);
        }
        scoreExpression.setExpertMode(true);
        coS = scoreExpression.getConditionExpression();
        if (coS != null && !coS.equals("")) {
            // an active condition is defined
            final ConditionExpression ce = new ConditionExpression(scoreExpression.getConditionId());
            ce.setExpressionString(scoreExpression.getConditionExpression());
            retVal.add(ce);
        }
        //
        return retVal;
    }

    /**
	 */
    @Override
    public String getDisplayOption() {
        // if nothing other defined, view content only, when a structure node
        // contains an html-file.

        final ModuleConfiguration config = getModuleConfiguration();
        final String thisConf = super.getDisplayOption(false);
        if (thisConf == null && config.get(STCourseNodeEditController.CONFIG_KEY_DISPLAY_TYPE).equals(STCourseNodeEditController.CONFIG_VALUE_DISPLAY_FILE)) {
            if (log.isDebugEnabled()) {
                log.debug("no displayOption set, use default (content)" + thisConf);
            }
            return CourseNode.DISPLAY_OPTS_CONTENT;
        }
        if (log.isDebugEnabled()) {
            log.debug("there is a config set, use it: " + thisConf);
        }
        return super.getDisplayOption();
    }

}

redpajama_set_name: RedPajamaGithub


Congratulations to Heidi Whitman for the new featured article in New England Home. We were thrilled to share her work inspired by City Grids, Ancient Ruins and how the Mind works this year at Art on Paper Fair and recently at Aqua Art Miami.
Download: Heidi Whitman featured in January/February 2017 issue of New England Home.


text:
Players Guide
Teachers Guide
In Cú Chulainn's FootstepsAn adventure videogame
ICF is the first of a series of videogames inspired by Irish Legends.
English, Irish and SpanishEncourage language learning
Play in English, Irish or Spanish seamlessly and simultaneously. Swap two languages and learning is a matter of play!! .
A new way of teachingICF is more than a videogame
Teachers!!
Educational tool: Change the content, reinforce lessons, and track student progress.
Best Irish MusicFeaturing Big Names on the Irish Scene
Micheál O' Muircheartaigh, Clannad, Kila, Sharon Shannon and more
Share the play and music with friends and family .
Launched in Croke ParkSupported by GAA & Foras Na Gaeilge
...3,2,1,0!
Micheál O' Muircheartaigh officially launched 'ICF' in Croke Park, with Foras Na Gaeilge (CEO) Ferdie Mac an Fhailigh and GAA President Liam O' Neill.
Any platformPlay on line or download your OS version
Windows,Mac,Linux
ICF can be played on line or by downloading a customised version for your PC, available for Linux, Windows and Mac
Android version soon!!!
Real 3D ready!!!:
Cú Chulainn's Intro VideoAn exclusive video for the game
A stunning video presentation for our game, ICF.
In Cú Chulainn's Footsteps An adventure in Irish Mythology
Children's safety is most important
ICF is a game whose original content has been approved and reviewed by Foras Na Gaeilge and has been found suitable for children in all schools where it has been tested.
However, each school is able to modify this content under their own responsability.
Duineacu guarantees the original content is suitable for children of all ages, both in the English and Irish version.
Discover the Druids Island
Help Cú Chulainn to escape from the Island, find and solve mysteries, live a unique experience in a celtic environment, learn more about Irish culture in a new and exciting challenge.
"Read More" for a full description of the game
A new way of teaching
ICF looks like a game, however, it is a powerful educational tool where teachers can modify the game content, the questions and answers, and can track student's progress.
Already a Partner?
Become a partner and help us to boost the Irish Culture.
Offer a 10% discount to your customers, get your business promoted and light up your business with an extra income every month.
Contact us and let's be partners
Ferdie Mac an Fhailigh, CEO, Foras na Gaeilge	+
"Games like this are extremely important in promoting the Irish language among young people and the educational aspect will give it particular importance in the school setting and for young people in the home. I have no doubt that this will greatly enhance language acquisition of pupils. As the language can be changed or the level of language and game material can be adapted to the age of the children, it will be very useful for teachers for a wide range of subjects"
Liam Ó Néill,Uachtarán Chumann Lúthchleas Gael, GAA	+
"It is heartening to see the Irish language and various other aspects of our rich culture sitting at the heart of this exciting project. As a school teacher I am acutely aware of the benefits of modern innovative aids such as these when they are used in the correct way. I laud everyone in the project "
Cóilín Ó Coigligh, Príomh Oide, St Mary's Primary School (Trim)	+
"St Mary's Primary School in Trim used this educational software. The pupils enjoyed the cultural and folklore elements. They found it both fun and challenging and liked that they could choose to play it in either Irish or English. On our experience to date we would recommend it."
Press Room What has been said...
28/01/2014 Spirit Radio
23/1/14 Press Release (Irish)
23/1/14 PR (English)
21/1/14 RTE / TG4
21/1/14 Irish Independent
21/1/14 GAA news
21/1/14 Gaelscoileanna
21/1/14 Belfast Telegraph
13/01/14 LMFM Radio
11/1/14 Meath Chronicles
Our supporters They helped us to be here
Portfolio ...
Teachers. Students Management
Short video describing Students Management process.
Teachers. Creating New Content
A brief video describing step by step how to create new content.
Player Experience Video (1)
A short video review...
Stunning video with fantastic celtic music
Cú Chulainn's Comic Poster
An example of the Comic. (Save image as) if you want to copy the image.
ICF in TG4 (Irish)
We were on TV!!!
ICF in LMFM
ICF in Spirit Radio
Cú Chulainn's Presentation Poster
ICF SCreenshoot
Loughcrew
Game's megalithic cairns are inspired in the real LoughCrew ones
© Copyright . Powered by Duineacu

redpajama_set_name: RedPajamaCommonCrawl


As the sun sets, we will walk in the dunes for 3 hours (goal will be 10 KM). However short it seems, be aware that it will still take a fair bit of effort! It's different walking in the dunes, but the views are amazing and it's a different type of exercise. Walking poles and sand gaiters are highly recommended!
Uganda: Primate Trekking and Safari!


text:
\section{Introduction}

Let $G$ be a finite group and let $p$ be a prime. Let ${\mathbb A}$ be the ring of algebraic integers in ${\mathbb C}$ and let ${\mathfrak M}$ be a maximal ideal of\/ ${\mathbb A}$ containing $p$. Set $R$ as the localisation of ${\mathbb A}$ at ${\mathfrak M}$. So $R$ is a complete discrete valuation ring with unique maximal ideal $J=R{\mathfrak M}$, $F:=\operatorname{Frac}(R)$ is the field of algebraic numbers and $k:=R/J$ is the algebraic closure of $\operatorname{GF}(p)$. Then $(F,R,k)$ is a so-called $p$-modular system for $G$. Note that $F$ and $k$ are splitting fields for all subgroups of $G$. We say that an $RG$-module has quadratic type if it affords a nondegenerate $G$-invariant quadratic form.

Let $P$ be a principal indecomposable $RG$-module. The principal indecomposable character of $P$ is the ordinary character of the $FG$-module $P\otimes_RF$. Now $P$ has a unique maximal submodule $\operatorname{Soc}(P)$ containing $J(R)G$. The irreducible Brauer character corresponding to $P$ is the Brauer character of the $kG$-module $P/\operatorname{Soc}(P)$.

Recall that $g\in G$ is $p$-regular if its order is prime to $p$ and $p$-singular if its order is divisible by $p$. Also an element of $G$ is real if it is conjugate to its inverse, strongly real if it is inverted by an involution and weakly real if it is real but not strongly real. In particular the elements which square to the identity are strongly real.

Our main result is to give an efficient way of determining in characteristic $2$ if a self-dual principal indecomposable module has quadratic type:

\begin{Theorem}\label{T:strong+weak}
Let $p=2$ and let $P$ be a self-dual principal indecomposable $RG$-module with principal indecomposable character $\Phi$ and corresponding irreducible Brauer character $\varphi$. Then the following are equivalent:
\begin{itemize}
\item[(i)] $P$ has quadratic type.
\item[(ii)] $\varphi(g)\not\in2R$, for some strongly real $2$-regular $g\in G$.
\item [(iii)] $\frac{\Phi(g)}{|C_G(g)|}\in2R$, for all weakly real $2$-regular $g\in G$.
\end{itemize}
\end{Theorem}

As a consequence, we obtain:

\begin{Corollary}\label{T:strong_main}
If ${p=2}$ then the number of quadratic type principal indecomposable $RG$-modules equals the number of strongly real $2$-regular conjugacy classes of\/ $G$.
\end{Corollary}

Equivalently the number of non-quadratic type self-dual principal indecomposable $RG$-modules equals the number of weakly real $2$-regular conjugacy classes of $G$.

For $p$ odd, each principal indecomposable $RG$-module affords a non-degenerate $G$-invariant quadratic form or symplectic bilinear form. We do not know how to determine the number of each using the $p$-regular conjugacy classes of $G$.

\section{The type of principal indecomposable modules}

Prior work has classified the type of principal indecomposable $kG$-modules using character theory or ring theory, as we outline in this section. Let $(F,R,k)$ be as in the introduction. Then the group of units $\operatorname{U}(R)$ of $R$ consists of all $p'$-roots of unity in ${\mathbb C}$. So the projection $R\rightarrow k$ induces an isomorphism $\operatorname{U}(R)\cong k^\times$ of multiplicative groups (which of course depends on the choice ${\mathfrak M}$ of maximal ideal).

Let $M$ be an $RG$-module ($kG$-module) which is finitely generated and free as $R$-module. We say that $M$ has quadratic or symplectic type if $M$ affords a non-degenerate $G$-invariant $R$-valued ($k$-valued) quadratic form or symplectic bilinear form, respectively. It is known that when $p\ne2$ each indecomposable $kG$-module is either of quadratic type or of symplectic type. When $p=2$, each quadratic type $kG$-module is of symplectic type, but not conversely.

The ring multiplication in $RG$ makes it into a module over itself, called the regular $RG$-module. The direct summands of this module are called principal indecomposable $RG$-modules. We say that a principal indecomposable $RG$-module $P$ is trivial if $P/\operatorname{Rad}(P)$ is the trivial $kG$-module. As was shown by R. Brauer, the number of principal indecomposable $RG$-modules equals the number of $p$-regular (elements of order prime to $p$) conjugacy classes of $G$ and the number of self-dual principal indecomposable $RG$-modules equals the number of real $p$-regular conjugacy classes of $G$.

Each self-dual irreducible $FG$-module is orthogonal or symplectic as it affords a non-degenerate $G$-invariant $F$-valued symmetric bilinear form or symplectic bilinear form, respectively. We say that the corresponding irreducible character of $G$ has orthogonal or symplectic type, respectively. The type can be detected by computing the Frobenius-Schur (F-S) indicator of the character; symmetric type irreducible characters have F-S indicator $+1$ and symplectic type irreducible characters have F-S indicator $-1$.

Suppose that $P$ is a self-dual principal indecomposable $RG$-module and let $\Phi$ be the principal indecomposable character of $P$. Then $\Phi$ is real-valued. Suppose first that $p$ is odd. Then by \cite{Wi76} and \cite{Th84} some real-valued irreducible character of $G$ occurs with odd multiplicity in $\Phi$. Moreover $P$ has quadratic or symplectic type, as this character has orthogonal or symplectic type, respectively.

Suppose then that $p=2$. Then by \cite{GW93}, some orthogonal irreducible character of $G$ occurs with odd multiplicity in $\Phi$.  As a consequence, $P$ may have quadratic type but it cannot have symplectic type. If some symplectic irreducible character of $G$ occurs with odd multiplicity in $\Phi$, then $P$ cannot have quadratic type. However $P$ may be of non-quadratic type without the occurrence of such a character.

Reduction mod $J$ induces a bijection between the principal indecomposable $RG$-modules and the principal indecomposable $kG$-modules. Under this bijection a principal indecomposable $RG$-module has quadratic type if and only if the corresponding principal indecomposable $kG$-module has quadratic type.  So for convenience we can and do work with principal indecomposable $kG$-modules

Write $1_G=e_1+\dots+e_m$ where the $e_i$ are pairwise orthogonal primitive idempotents in $kG$ (i.e. $e_ie_j=\delta_{ij}e_i$, for $1\leq i,j\leq m$ and $m\geq1$ is as large as possible). Then each $kGe_i$ is a principal indecomposable $kG$-module, and all principal indecomposable $kG$-modules have this form. Now the map $g\rightarrow g^{-1}$, for $g\in G$, extends to an involutary $k$-algebra anti-automorphism $^o$ of $kG$, called the contragredient map. Each $e_i^o$ is a primitive idempotent in $kG$ and $kGe_i^o$ is isomorphic to the dual module $(kGe_i)^*:=\operatorname{Hom}(kGe_i,k)$ of $kGe_i$.

We must distinguish between $p$ odd and $p=2$:

\begin{Lemma}[Landrock-Manz]\label{L:Landrock-Manz}
Let $p$ be an odd prime and let $e$ be a primitive idempotent in $kG$. Then $kGe$ has quadratic type if and only if there is a primitive idempotent $f\in kG$, with $kGf=kGe$, such that $f=f^o$.
\end{Lemma}

In contrast, if $p=2$, Gow and Willems showed that there is a primitive idempotent $f\in kG$,  with $kGf=kGe$, such that $f=f^o$ if and only if $kGe$ is the projective cover of the trivial $kG$-module. Moreover, they proved the following analogue of Lemma \ref{L:Landrock-Manz}:

\begin{Lemma}[Gow-Willems]\label{L:tf^ot=f}
Let $p=2$ and let $e$ be a primitive idempotent in $kG$. Then $kGe$ has quadratic type if and only if there is an involution $t\in G$ and a primitive idempotent $f\in kG$, with $kGf=kGe$, such that $t^{-1}ft=f^o$.
\begin{proof}[Outline Proof]
We may assume that $kGe$ is not the projective cover of the trivial $kG$-module. Then it is known that each $G$-invariant symmetric bilinear form on $kGe$ is symplectic and is the polarization of a $G$-invariant quadratic form on $kGe$ (see \cite[Proposition 2.2]{GW93}).

Let $B_1$ be the symmetric bilinear form on $kG$ with respect to which the elements of $G$ form an orthonormal basis of $kG$. Then $B_1$ is non-degenerate and $G$-invariant. Its adjoint is the contragredient map. Next recall that $\operatorname{End}_{kG}(kG)$ can be identified with the opposite ring $kG^{op}$. Here $x\in kG^{op}$ defines the $kG$-homomorphism $y\rightarrow yx$, for all $y\in kG$. So if we define $B_x(y,z):=B_1(yx,z)$, for all $y,z\in kG$, then $B_x$ is a $G$-invariant bilinear form on $kG$ and $\{B_x\mid x\in kG\}$ give all $G$-invariant bilinear forms on $kG$. Moreover, $B_x$ is non-degenerate, symmetric or symplectic as $x$ is a unit in $kG$, $x=x^o$ or $x=x^o$ and $x_1=0$, respectively.

Next $(kGe)^*\cong kGe^o$. So the space of $G$-invariant bilinear forms on $kGe$ can be identified with $ekGe^o$. As a consequence, each $G$-invariant bilinear form on $kGe$ is the restriction  from $kG$ to $kGe$ of a $G$-invariant bilinear form $B_{exe^o}$, for some unique $exe^o\in ekGe^o$. Now suppose that $B_{exe^o}$ is a non-degenerate symplectic bilinear form on $kGe$. Write $exe^o=\sum_{g\in G}x_gg$. Then $x_1=0_k$ and $x_g=x_{g^{-1}}$, for all $g\in G$. As $kGe$ is indecomposable, $B_{x_g(g+g^{-1})}$ is degenerate on $kGe$. So there is an involution $t\in G$ such that $B_{x_tt}$ restricts to a non-degenerate (symplectic) bilinear form on $kGe$. Thus $x_t\ne0_k$ and $B_t$ restricts to a non-degenerate bilinear form on $kGe$. Let $f\in kG^{op}$ be the projection onto $kGe$, with kernel the complement of $kGe$ with respect to $B_t$. Now $B_t$ has adjoint $x\mapsto tx^ot$ on $kG^{op}$. So $f$ is a primitive idempotent in $kG$ with $kGe=kGf$ such that $tf^ot=f$.

Conversely, given an involution $t\in G$ and an idempotent $f\in kG$ as in the statement, it is easy to see that $B_t$ restricts to a non-degenerate symplectic bilinear form on $kGe$.
\end{proof}
\end{Lemma}

If $kGe$ has quadratic type and $t$ is as in the conclusion of the Lemma, we say that $t$ inverts $e$ or $kGe$, or the projective indecomposable character of $kGe$.

Fong's Lemma states that when $\operatorname{char}(k)=2$ every non-trivial self-dual irreducible $kG$-module affords a non-degenerate $G$-invariant symplectic form. It is clear that this form is unique up to a non-zero scalar. In \cite[Proposition 5.8]{M16} the second author showed:

\begin{Lemma}\label{L:Murray}
Suppose that $p=2$ and that $M$ is a non-trivial self-dual irreducible $kG$-module, with Fong form $B$. Then the projective cover of $M$ has quadratic type if and only if $B(tm,m)\ne0$ for some $m\in M$ and involution $t\in G$.
\begin{proof}[Outline Proof]
The annihilator of $M$ in $kG$ is a maximal $2$-sided ideal $\operatorname{Ann}(M)$ of $kG$ with $kG/\operatorname{Ann}(M)\cong\operatorname{End}_k(M)$. Suppose first that the principal indecomposable module of $M$ is orthogonal. Then by Lemma \ref{L:tf^ot=f} there is an involution $t\in G$ and a primitive idempotent $f\in kG$, such that $kGf/\operatorname{Rad}(kGf)\cong M$ and $t^{-1}ft=f^o$. Set $x^{ot}:=tx^ot$, for all $x\in kG$. Then $^{ot}$ is an involutary $k$-algebra anti-automorphism of $kG$. Now $\operatorname{Ann}(M)$ is invariant under $^{ot}$. So $^{ot}$ induces an involutary $k$-algebra anti-automorphism on $\operatorname{End}_k(M)$. It is readily established that $g^{ot}=g^{-t}$, for all $g\in G$ in $\operatorname{End}_k(M)$.

Next define $B_t(x,y):=B(tx,y)$, for all $x,y\in\operatorname{End}_k(M)$. Then $B_t$ is a non-degenerate $\operatorname{C}_G(t)$-invariant symmetric bilinear form on $M$. Its adjoint coincides with $^{ot}$ on $\operatorname{End}_k(M)$, as by irreducibility of $M$, the image of $G$ spans $\operatorname{End}_k(M)$. Now $f+\operatorname{Ann}(M)$ is a primitive idempotent in $\operatorname{End}_k(M)$ which is $^{ot}$-invariant. It follows that $B_t$ is non-degenerate on the $1$-dimensional subspace $fM$ of $M$ i.e. there is $m\in fM$ such that $B(tm,m)\ne0_k$.

Conversely, suppose that $B(tm,m)\ne0$ for some involution $t\in G$ and some $m\in M$. Let $\hat f$ be orthogonal projection onto $km$ with respect to the non-degenerate symmetric form $B_t$ on $M$. By idempotent lifting (c.f. \cite[Proposition 1.4]{LM}) there is a primitive idempotent $f\in kG$ such that $f^{ot}=f$ and $f+\operatorname{Ann}(M)=\hat f$. Now $kGf/\operatorname{Rad}(kGf)\cong M$. So $kGf$ is orthogonal, according to Lemma \ref{L:tf^ot=f}.
\end{proof}
\end{Lemma}

\section{Type of principal indecomposable modules of ${\mathbb R}$-elementary subgroups}

Recall that a group is elementary if it has the form $C\times P$, where $P$ is a $p$-group, for some prime $p$ and $C$ is a cyclic $p'$-group. Brauer's induction theorem states that every ${\mathbb C}$-character of $G$ is an integer combination of characters induced from linear characters of elementary subgroups of $G$.
For the rest of this section $p=2$.

Now an ${\mathbb R}$-elementary group has the form $C\rtimes P$, where $C$ is cyclic of odd order and $P$ is a $2$-group such that every element of $P$ centralizes or inverts $C$. The real version of Brauer's induction theorem (which is a special case of the Witt-Berman theorem) is that every ${\mathbb R}$-character of $G$ is an integer combination of characters induced from ${\mathbb R}$-characters of ${\mathbb R}$-elementary subgroups of $G$. In this section we determine the type of the principal indecomposable modules of ${\mathbb R}$-elementary groups.

As usual the centralizer $\operatorname{C}_G(g)$ or extended centralizer $\operatorname{C}_G^*(g)$ of $g\in G$ is the normalizer of $\{g\}$ or $\{g,g^{-1}\}$ in $G$, respectively. Then $\operatorname{C}_G(g)\subseteq\operatorname{C}_G^*(g)$ and $|\operatorname{C}_G^*(g):\operatorname{C}_G(g)|\leq2$. Moreover $g$ is strongly real if $g=g^{-1}$ or $\operatorname{C}_G^*(g)\backslash\operatorname{C}_G(g)$ contains an involution and weakly real if $\operatorname{C}_G^*(g)$ does not split over $\operatorname{C}_G(g)$.

Our main result here is a special case of a result on the principal indecomposable modules of solvable groups which is due to G. Navarro and the second author \cite[Theorem 15]{MN16}:

\begin{Proposition}\label{P:E/Dsplits}
Let $g\in G$ and let $E\in\operatorname{Syl}_2(\operatorname{C}_G^*(g))$. Then a non-trivial principal indecomposable $R(\langle g\rangle\rtimes E)$-module has quadratic type if and only if\/ $g$ is strongly real.
\begin{proof}
We may assume that $g$ is real in $G$. Set $C:=\langle g\rangle$ and $H:=C\rtimes E$. Let $P$ be a non-trivial principal indecomposable $RH$-module, and let $\Phi$ be the principal indecomposable character of $P$. Then $P\cong M{\uparrow^H}$, for some non-trivial $1$-dimensional $kC$-module $M$.

Suppose first that $g$ is strongly real. Let $t$ be an involution in $E$ which inverts $g$. Then $M{\uparrow^{\langle g,t\rangle}}$ is a self-dual irreducible $k(\langle g,t\rangle)$-module. Fong's Lemma implies that $M{\uparrow^{\langle g,t\rangle}}$ affords a symplectic geometry. Then the induced module $P\cong(M{\uparrow^{\langle g,t\rangle}}){\uparrow^H}$ affords the induced form. So $P$ has symplectic, hence quadratic type.

Conversely suppose that $P$ has quadratic type. Set $D=\operatorname{C}_E(g)$ and $\hat M:=(\operatorname{Inf}_{C\times D/D}^{C\times D}M){\uparrow^H}$. Then $\hat M$ is a self-dual irreducible $kH$-module which is isomorphic to $P/\operatorname{Rad}(P)$. Let $B$ be a Fong form on $\hat M$. According to Lemma \ref{L:Murray}, $B(tm,m)\ne0_k$, for some involution $t\in H$ and some $m\in\hat M$. Now $\hat M{\downarrow_{C\times D}}=M_1\oplus M_2$, where $M_1$ is an irreducible $k(C\times D)$-module and $M_2\cong M_1^*\not\cong M_1$. Write $m=m_1+m_2$, where $m_1\in M_1$ and $m_2\in M_2$. Then
$$
\begin{aligned}
B(tm,m)
&=B(tm_1,m_1)+B(tm_1,m_2)+B(tm_2,m_1)+B(tm_2,m_2)\\
&=B(tm_1,m_1)+B(tm_2,m_2),\quad\mbox{as $B(tm_1,m_2)=B(tm_2,m_1)$.}
\end{aligned}
$$
So we may assume without loss of generality that $B(tm_1,m_1)\ne0_k$. As $M_1\not\cong M_1^*$, $B$ is identically zero on $M_1$. So $tm_1\not\in M_1$, which forces $t\in H\backslash(C\times D)$. Then $g^t=g^{-1}$. So $g$ is strongly real.
\end{proof}
\end{Proposition}

\section{Values of principal indecomposable and Brauer characters}

In this section $p=2$. We use Proposition \ref{P:E/Dsplits} to clarify the relationship between the strongly and weakly real $2$-regular conjugacy classes of\/ $G$ and the quadratic and non-quadratic self-dual principal indecomposable $RG$-modules.

Each $kG$-module $M$ has a Brauer character $\varphi_M$; if $g\in G$ has odd order then $M$ has a basis of eigenvectors of $g$. Each eigenvalue of $g$ on $M$ is a $2'$-roots of unity in $k$. So they can be lifted to $2'$-roots of unity in $R$, via the isomorphism $\operatorname{U}(R)\cong k^\times$. Then $\varphi_M(g)$ is defined to be the sum of these roots of unity. In particular $\varphi_M$ is an ${\mathbb A}$-valued function defined on the $2$-regular elements of\/ $G$. As is standard, we use $\operatorname{IBr}(G)$ to denote the Brauer characters of the irreducible $kG$-modules.

The restriction $\chi^*$ of an ordinary character $\chi$ of $G$ to the $p$-regular elements of\/ $G$ is a Brauer character. So $\chi^*=\sum_{\varphi\in\operatorname{IBr}(G)}d_{\chi\varphi}\varphi$, where the $d_{\chi\varphi}$ are non-negative integers, called decomposition numbers. For $\varphi\in\operatorname{IBr}(G)$ set $\Phi_\varphi:=\sum_{\chi\in\operatorname{Irr}(G)}d_{\chi\varphi}\chi$. Then $\Phi_\varphi$ is the principal indecomposable character of\/ $G$ corresponding to $\varphi$. It is easy to see that $\Phi_\varphi$ vanishes on all $p$-singular elements of $G$.

Recall that a vertex of an indecomposable $kG$-module $M$ is a subgroup $V$ of\/ $G$ which is minimal subject to $M$ being a direct summand of a module induced from $V$ to $G$. J.~A.~Green showed that $V$ is a $p$-subgroup of\/ $G$, and moreover $V$ is uniquely determined up to $G$-conjugacy. The next result and its corollary are due to Green.

\begin{Lemma}
Let $M$ be an indecomposable $kG$-module, let $g\in G$ be $p$-regular and let $D\in\operatorname{Syl}_p(\operatorname{C}_G(g))$. Then $M$ has a vertex $V$ such that $\frac{\varphi_M(g)}{|D:V\cap D|}$ is an algebraic integer.
\end{Lemma}

In particular if\/ $\varphi_M(g)\not\in 2{\mathbb A}$ then $D$ is contained in some vertex of\/ $M$.

\begin{Corollary}
Let $\Phi$ be a principal indecomposable character of\/ $G$ and let $g\in G$. Then $\frac{\Phi(g)}{|\operatorname{C}_G(g)|_p}$ is an algebraic integer.
\begin{proof}
As $\Phi$ is zero on $p$-singular elements, we may assume that $g$ is $p$-regular. Now $\Phi^*$ is the Brauer character of a principal indecomposable $kG$-module and the trivial group is a vertex of this module. So $|\operatorname{C}_G(g)|_p$ divides $\Phi(g)$ in ${\mathbb A}$.
\end{proof}
\end{Corollary}

Let $\Phi_1$ be the trivial principal indecomposable character of $G$ i.e. $\Phi_1$ corresponds to the trivial $2$-Brauer character $\varphi_1$ of $G$. In \cite{GW93} Gow and Willems proved that $\frac{\Phi_1(1)}{|G|_2}$ is odd. We complement this result with:

\begin{Theorem}\label{T:trivialPIM}
If\/ $g\in G$ is real and non-trivial then $\frac{\Phi_1(g)}{|\operatorname{C}_G(g)|_2}$ is twice an algebraic integer.
\begin{proof}
By the second orthogonality relation $0=\hspace{-.25cm}\sum\limits_{\chi\in\operatorname{Irr}(G)}\chi(1)\chi(g)=\hspace{-.25cm}\sum\limits_{\varphi\in\operatorname{IBr}(G)}\varphi(1)\Phi_\varphi(g)$. So
$$
\frac{\Phi_1(g)}{|\operatorname{C}_G(g)|_2}=-\sum_{\varphi\in\operatorname{IBr}(G)\atop\varphi\ne\varphi_1}\varphi(1)\frac{\Phi_\varphi(g)}{|\operatorname{C}_G(g)|_2}.
$$
For $\varphi\ne\overline\varphi$ we get two equal summands. So their sum cancels mod $2$. If\/ $\varphi=\overline\varphi$ and $\varphi\ne\varphi_1$, Fong's Lemma implies that $\varphi(1)$ is even. The conclusion follows from these facts.
\end{proof}
\end{Theorem}

\begin{Lemma}\label{L:weakly_real}
Let $g$ be a weakly real element of\/ $G$ and let $\Phi$ be a quadratic type principal indecomposable character of\/ $G$. Then $\frac{\Phi(g)}{|\operatorname{C}_G(g)|_2}\in2{\mathbb A}$.
\begin{proof}
We may assume that $g$ is $2$-regular. Suppose for the sake of contradiction that $\frac{\Phi(g)}{|\operatorname{C}_G(g)|_2}\not\in2{\mathbb A}$. Let $E\in\operatorname{Syl}_2(\operatorname{C}_G^*(g))$ and set $H:=\langle g\rangle\rtimes E$. Write $\Phi{\downarrow_H}=\sum\alpha_\Lambda\Lambda$, where $\Lambda$ ranges over the principal indecomposable characters of\/ $H$. Lemma \ref{T:trivialPIM} implies that there is a non-trivial principal indecomposable character $\Lambda$ such that $\alpha_\Lambda$ is odd and $\frac{\Lambda(g)}{|\operatorname{C}_E(g)|}\not\in2{\mathbb A}$.

Let $P$ be the projective indecomposable $kG$-module corresponding to $\Phi$ and let $Q$ be the principal indecomposable $kH$-module corresponding to $\Lambda$. Then $Q$ is a self-dual module which occurs with odd multiplicity $\alpha_\Lambda$ as a direct summand of $P{\downarrow_H}$. As $P$ is orthogonal, so too is $Q$. So $g$ is strongly real, according to Proposition \ref{P:E/Dsplits}. This contradiction completes the proof.
\end{proof}
\end{Lemma}

We can refine this result, using the techniques developed in \cite{M16}:

\begin{Lemma}\label{L:inverts}
Let $g$ be a real element of $G$ and let $\Phi$ be a quadratic principal indecomposable character of\/ $G$ such that $\frac{\Phi(g)}{|\operatorname{C}_G(g)|_2}\not\in2{\mathbb A}$. Suppose that $t\in G$ is an involution which inverts $\Phi$ (c.f. the comment after Lemma \ref{L:tf^ot=f}). Then some conjugate of\/ $t$ inverts $g$.
\begin{proof}[Sketch Proof]
By Lemma \ref{L:tf^ot=f} there is a primitive idempotent $f$ in $kG$ such that $kGf$ is the principal indecomposable $kG$-module corresponding to $\Phi$ and $B_t$ restricts to a non-degenerate symplectic form on $kGf$. Let $H=\langle g\rangle\rtimes E$ and $Q$ be as in Lemma \ref{L:weakly_real}; so $Q$ is a projective indecomposable $kH$-module which occurs with odd multiplicity in $kGf{\downarrow_H}$. Then $Q$ is a non-degenerate component of the symplectic module $(kGf,B_t){\downarrow_H}$. Now $(kG,B_t)=(k\langle t\rangle,B_t){\uparrow^G}$. So $Q$ is a non-degenerate component of
\begin{equation}\label{E:mackey}
(k\langle t\rangle,B_t){\uparrow^G}{\downarrow_H}=\mathop{\perp}\limits_{\langle t\rangle aH\subseteq G}(k\langle t^a\rangle,B_{t^a}){\downarrow_{\langle t^a\rangle\cap H}}{\uparrow^H}.
\end{equation}
Let ${a\in G}$. First suppose that $\langle t^a\rangle\subseteq H$. Then the right hand side has a summand
\begin{equation}\label{E:tinH}
{(k\langle t^a\rangle,B_{t^a}){\uparrow^H}\!\cong\!(kH,B_{t^a})}.
\end{equation}
The other possibility is that $t^a\not\in H$. Then $\langle t^a\rangle\cap H=1$ and $(k\langle t^a\rangle,B_{t^a}){\downarrow_1}\cong(k^2,\hat{B_1})$ is a symplectic plane. Let $1=e_1+\dots+e_u$ be a decomposition of\/ $1$ as a sum of pairwise orthogonal primitive idempotents in $kH$. For each $i$, the bilinear form $B_1$ on $kG$ defines a perfect $G$-pairing $kGe_i\times kGe_i^o\rightarrow k$. We set $(kGe_i\oplus kGe_i^o,\hat{B_1})$ as the corresponding symplectic {\em paired} module. It is important to note that this module has no proper non-degenerate component. Then the summand on the right hand side of \eqref{E:mackey} has the orthogonal decomposition
\begin{equation}\label{E:tnotinH}
(k^2,\hat{B_1}){\uparrow^H}=\mathop{\perp}\limits_{i=1}^u(kHe_i\oplus kHe_i^o,\hat{B_1}).
\end{equation}
Now $Q$ is an indecomposable non-degenerate submodule of an orthogonal sum of modules of the form \eqref{E:tinH} and \eqref{E:tnotinH}. As the modules in \eqref{E:tnotinH} have no such submodules, we deduce that there is $a\in G$ such that $s:=t^a\in H$ and $Q$ is a non-degenerate submodule of\/ $(kH,B_s)$. Equivalently there is a primitive idempotent $e\in kH^{op}$ such that $kHe\cong Q$ and $e^{os}=e$. Now $k(C\times D)e$ is a projective indecomposable $k(C\times D)$-module which is not self-dual (as it is not the projective cover of the trivial $k(C\times D)$-module). So $s\not\in(C\times D)$. We conclude that $g^s=g^{-1}$.
\end{proof}
\end{Lemma}

Complementing Lemma \ref{L:weakly_real}, we have:

\begin{Lemma}\label{L:strongly_real}
Let $g$ be a strongly real $2$-regular element of\/ $G$ and let $P$ be a non-quadratic self-dual principal indecomposable $RG$-module with associated ${\varphi\in\operatorname{IBr}(G)}$. Then ${\varphi(g)\in2{\mathbb A}}$.
\begin{proof}
We note that $\varphi(1)$ is even by Fong's Lemma. So we may assume that $g\ne1$. As before let $E\in\operatorname{Syl}_2(\operatorname{C}_G^*(g))$ and set $H:=\langle g\rangle\rtimes E$.

Suppose for the sake of contradiction that $\varphi(g)\not\in 2{\mathbb A}$. Write $\varphi{\downarrow_H}=\sum\beta_\lambda\lambda$, where $\lambda$ ranges over the irreducible Brauer characters of\/ $H$. So by hypothesis there is $\lambda\in\operatorname{IBr}(H)$ such that $\beta_\lambda$ is odd and $\lambda(g)\not\in 2{\mathbb A}$.

Let $Q$ be the projective indecomposable $kH$-module corresponding to $\lambda$. As $g$ is strongly real, it follows from Proposition \ref{P:E/Dsplits} that $Q$ has quadratic type. Now by Frobenius-Nakayama reciprocity $P$ occurs with odd multiplicity $\beta_\lambda$ in $Q{\uparrow^G}$. As $P\cong P^*$, we conclude that $P$ has quadratic type. This contradiction completes the proof.
\end{proof}
\end{Lemma}

Let $M$ be the irreducible $kG$-module whose Brauer character is $\varphi$. In \cite{M16} the second author assigned a symplectic vertex $T$ to $M$; $T$ is a minimal subgroup of $G$ such that $M$ is an orthogonal direct summand of a symplectic $kT$-module induced up to $G$. Just as with Green vertices, $T$ is uniquely determined up to $G$-conjugacy. In view of Lemma \ref{L:inverts} we hazard the following, which would complement Lemma \ref{L:inverts} and strengthen Lemma \ref{L:strongly_real}:

\begin{Conjecture}
Let $M$ be the irreducible $kG$-module, let $\varphi$ be the Brauer character of $M$ and let $g$ be a real $2$-regular element of\/ $G$ such that $\varphi(g)\not\in2{\mathbb A}$. Then $M$ has an extended defect group which contains an extended defect group of $g$ but which is not contained in $\operatorname{C}_G(g)$.
\end{Conjecture}

\section{Type of principal indecomposable $RG$-modules}

Recall that $R$ is the localisation of the ring of algebraic integers at a maximal ideal containing $2$. In particular $R$ has a unique maximal ideal $J$. Suppose that $G$ has $\ell$\, $2$-regular conjugacy classes, $r$ real $2$-regular conjugacy classes and $s$ strongly real $2$-regular conjugacy classes. So $G$ has $\ell$ irreducible $2$-Brauer characters and $r$ real irreducible $2$-Brauer characters. Suppose also that $G$ has $\sigma$ quadratic type principal indecomposable $RG$-modules.

List the irreducible $2$-Brauer characters of $G$ as $\varphi_1,\dots,\varphi_\ell$ and let $g_1,\dots,g_\ell$ be a set of representatives for the $2$-regular conjugacy classes of $G$. Set $\Phi_k$ as the principal indecomposable character of $G$ corresponding to $\varphi_k$, for $k=1,\dots,\ell$.

The second orthogonality relation (see Theorem \ref{T:trivialPIM}) give equations in $R$:
$$
\sum_{k=1}^\ell\frac{\Phi_k( g_i^{-1} )}{|\operatorname{C}_G(g_i)|}\varphi_k(g_j)=\delta_{ij},\quad\mbox{for $1\leq i,j\leq\ell$}.
$$
Suppose that $g_i$ and $g_j$ are real in $G$. Then $\frac{\Phi_k( g_i^{-1} )}{|\operatorname{C}_G(g_i)|}\varphi_k(g_j)=\frac{\overline\Phi_k( g_i^{-1} )}{|\operatorname{C}_G(g_i)|}\overline\varphi_k(g_j)$. So the contribution of the non-real $\varphi_k$ to the above displayed sum is zero, modulo $J$.

We may choose our notation so that $\varphi_1,\dots,\varphi_r$ are the real irreducible $2$-Brauer characters of $G$ and $g_1,\dots,g_r$ are in the real $2$-regular conjugacy classes of $G$. Define the $r\times r$-matrices:
$$
A=\left[\frac{\Phi_j(g_i^{-1})}{|\operatorname{C}_G(g_i)|}\right],\quad
B=\left[\varphi_i(g_j)\right].
$$
They involve only the real principal indecomposable characters, the real irreducible Brauer characters and the real $2$-regular elements of\/ $G$. By the work above $AB\equiv I$ (mod $J$).

We further refine our notation so that $\varphi_1,\dots,\varphi_\sigma$ are the Brauer characters of the quadratic principal indecomposable $RG$-modules and $g_1,\dots,g_s$ are in the strongly real $2$-regular conjugacy classes of $G$. Thus $\varphi_{\sigma+1},\dots,\varphi_r$  are the Brauer characters of the non-quadratic principal indecomposable $RG$-modules and $g_{s+1},\dots,g_r$ are in the weakly real $2$-regular conjugacy classes of $G$. The matrices $A$ and $B$ have corresponding block forms:
$$
A=\left[\begin{array}{ll}A_{11}&A_{12}\\A_{21}&A_{22}\end{array}\right],\quad
B=\left[\begin{array}{ll}B_{11}&B_{12}\\B_{21}&B_{22}\end{array}\right].
$$
So $A_{11}$ is the $s\times\sigma$ submatrix of\/ $A$ with rows and columns indexed by the strongly real classes and quadratic type principal indecomposable characters. Likewise $B_{11}$ is the $\sigma\times s$ submatrix of $B$ with rows and columns indexed by Brauer characters of quadratic principal indecomposable $RG$-modules and strongly real classes, respectively.

Now each term in $A_{21}$ has the form $\frac{\Phi_k(g_i^{-1})}{|\operatorname{C}_G(g_i)|}$ where $g_i$ is weakly real and $\Phi_k$ has quadratic type. Likewise each term in $B_{21}$ has the form $\varphi_k(g_j)$ where $\varphi_k$ is the Brauer character of a non-quadratic principal indecomposable $RG$-module and $g_j$ is strongly real. So according to Lemmas \ref{L:weakly_real} and \ref{L:strongly_real}, all these terms belong to $J$. Thus
$$
A_{21}\equiv0\,\mbox{(mod $J$)}\quad\mbox{and}\quad
B_{21}\equiv0\,\mbox{(mod $J$)}.
$$
It follows from this that $A_{11}B_{11}\equiv I$ (mod $J$) and $A_{22}B_{22}\equiv I$ (mod $J$). In particular $A_{11}$ and $A_{22}$ have full row rank (mod $J$). So $s\leq\sigma$ and $r-s\leq r-\sigma$. We conclude that $s=\sigma$. This proves our main theorem, which we restate here for the convenience of the reader:

\begin{Theorem}\label{T:=}
The number of strongly real $2$-regular conjugacy classes of\/ $G$ equals the number of quadratic type principal indecomposable $RG$-modules and the number of weakly real $2$-regular conjugacy classes of\/ $G$ equals the number of non-quadratic type self-dual principal indecomposable $RG$-modules.
\end{Theorem}

The analysis above translates into the following criteria for strong and weak reality, which proves Theorem \ref{T:strong+weak}:

\begin{Proposition}\label{P:strong+weak}
Let $p=2$ and let $P$ be a self-dual principal indecomposable $RG$-module with principal indecomposable character $\Phi$ and corresponding irreducible Brauer character $\varphi$. Then:
\begin{itemize}
\item[(i)] $P$ has quadratic type if and only if $\varphi(g)\not\in2R$, for some strongly real $2$-regular $g\in G$.
\item[(ii)] $P$ has non-quadratic type if and only if $\frac{\Phi(g)}{|C_G(g)|}\not\in2R$, for some weakly real $g\in G$.
\end{itemize}
\end{Proposition}

\section{Strong and weak projective indecomposable modules}

In this section we give examples of strong and weak principal indecomposable characters, many of which involve quasisimple finite groups. In addition to \cite{Atlas}, we use the notation and decomposition matrices provided by the Modular Atlas homepage \cite{MOC}.

Let $g\in G$ be $2$-regular. If $g$ is strongly real, $tgt=g^{-1}$, for some involution $t\in G$. Then $s:=gt$ is an involution which is conjugate to $t$ in the dihedral group $\langle g,t\rangle$ and $g=st$. Conversely, if $g=uv$ where $u,v\in G$ are involutions, then $v$ inverts $g$ and so $g$ is strongly real. So by the class multiplication formula, $g$ is strongly real if and only if
$$
\sum_{\chi\in\operatorname{Irr}(G)}\frac{\chi(t)^2\chi(g)}{\chi(1)}\ne0,
$$
for some involution $t\in G$. We note that the character table of $G$ determines the prime divisors of the orders of the elements of $G$. In particular the character table determines the $2$-regular conjugacy classes of $G$. However the character table of a group does not generally determine which conjugacy classes of $2$-elements are involutions e.g. $D_8$ and $Q_8$ have the `same' character tables.

\begin{Example}
$G=2.A_5$. All three non-trivial $2$-regular classes of $G$ are weakly real, for example because $G$ has a unique involution. So all three non-trivial $2$-principal indecomposable characters $\Phi_2,\Phi_3$ and $\Phi_4$ of $2.A_5$ are of non-quadratic type. This also follows from the fact that $\Phi_2$ contains the  symplectic irreducible characters $\chi_6$ and $\chi_9$ with odd multiplicity $1$, $\Phi_3$ contains the  symplectic irreducible characters $\chi_7$ and $\chi_9$ with odd multiplicity $1$ and $\Phi_4$ contains the  symplectic irreducible character $\chi_8$ with odd multiplicity $1$.
\end{Example}

\begin{Example}
$G=\operatorname{Sp}(4,5)$, or $2.\operatorname{S}_4(5)$ in \cite{Atlas} notation. Then $G$ has $60$ irreducible ${\mathbb C}$-characters, $26$ of which are faithful. All non-faithful characters are orthogonal and all faithful characters are symplectic. Now $G$ has fifteen $2$-regular classes, all of whom are real. By examination of the $2$-decomposition matrix, each of the $2$-principal indecomposable characters $\Phi_i$, for $i\in\{2,3,4,6,8,9,10,11,12,13,14\}$ contain at least one symplectic irreducible constituent with odd multiplicity. So these twelve principal indecomposable characters are non-quadratic. By computing the square of the involution class $2B$, we see that $1A$, $3A$ and $5D$ are the strongly real $2$-regular classes of $G$. Now $\varphi_5=\chi_6^*-\chi_1^*$ and $\chi_6(5D)=0$. So $\varphi_5(5D)=-1$ is odd. Similarly $\varphi_7=\chi_{11}^*$ and $\chi_{11}(3A)=5$ is odd. So $\Phi_1,\Phi_5$ and $\Phi_7$ are the quadratic principal indecomposable characters of $G$.
\end{Example}

\begin{Example}
$G=McL$ has $24$ irreducible ${\mathbb C}$-characters, of whom two, $\chi_{11}$ and $\chi_{13}$, are symplectic and $10$ are orthogonal. Also $G$ has $11$ $2$-regular conjugacy classes, $5$ of whom are real. Examination of the square of the involution class $2A$ shows that $1A,3B$ and $5B$ are the strongly real $2$-regular classes of $G$. So the real $2$-regular classes $3A$ and $5A$ are weakly real. Now $\varphi_3=\chi_3^*$ and $\chi_3(5B)=1$ is odd. Also $\varphi_{11}$ is the unique real irreducible Brauer character which occurs with odd multiplicity in $\chi_{15}^*$ and $\chi_{15}(3B)=9$ is odd.  So $\Phi_1,\Phi_3$ and $\Phi_{11}$ are the quadratic indecomposable characters of $G$.

Next $\varphi_2$ and $\varphi_{10}$ are the remaining real irreducible Brauer characters of $G$. The symplectic character $\chi_{11}$ occurs with odd multiplicity $1$ in $\Phi_{10}$. This confirms that $\Phi_{10}$ is a non-quadratic principal indecomposable character. There is a unique symplectic irreducible constituent of $\Phi_2$, namely $\chi_{13}$, and this occurs with even multiplicity $2$. So we cannot use its presence to verify that $\Phi_2$ is not quadratic. On the other hand $\phi_2=\chi_2^*$ and the values $\chi_2(1)=22,\chi_2(3B)=4$ and $\chi_2(5B)=2$ on the strongly real $2$-regular classes are all even. This confirms that $\Phi_2$ is not quadratic.
\end{Example}

\begin{Example}
$G=2.Ru$ has $61$ irreducible ${\mathbb C}$-characters, $25$ of which are faithful. Of the faithful characters, $7$ are symplectic and the remaining $18$ are non-real. Of the $36$ characters of $Ru$, two are non-real and the remaining $34$ are orthogonal. Also $G$ has $9$ classes of elements of odd order, all of whom are real. By examining the square of the two classes of non-central involutions, we see that the weakly real $2$-regular classes are $15A,29A$ and $29B$.

Now the symplectic character $\chi_{53}$ has odd multiplicity $1$ in $\Phi_4$. So $\Phi_4$ is not quadratic. Alternatively, $\varphi_4$ is the unique Brauer character which occurs with odd multiplicity in $\chi_{53}^*$ and $\chi_{53}(15A)=1$. Next $\varphi_6=\chi_{49}^*$ and $\chi_{49}(15A)=-1$ is odd. Similarly $\varphi_7=\chi_{50}^*$ and $\chi_{50}(15A)=-1$. This confirms that $\Phi_6$ and $\Phi_7$ are not quadratic.
\end{Example}

We take the opportunity to correct Example 2.12 in \cite{GW93}. This erroneously claims that a certain principal indecomposable module of a group of order $288$ is weakly real. In fact the assertion, on the first line of p268, that a certain form $c$ is $B$-invariant, is false.

\begin{Example}
Let $H$ be the non-abelian group $C_3\rtimes C_4$ of order $12$. Let $\sigma$ be the switching automorphism of $H\times H$: $(x,y)^\sigma=(y,x)$, for all $x,y\in H$. Set $G=(H\times H)\langle\sigma\rangle$. Now $G$ is a $2$-nilpotent group with normal Hall $2'$-subgroup $N\cong C_3\times C_3$. Let $\omega$ be one of the two non-trivial linear characters of $C_3$. Then $G$ has three orbits on $\operatorname{Irr}(N)$, with representatives $1\times1,1\times\omega$ and $\omega\times\omega$, respectively. Set $\Phi_1=(1\times1){\uparrow^G}$, $\Phi_2=(1\times\omega){\uparrow^G}$ and $\Phi_3=(\omega\times\omega){\uparrow^G}$. Let $\Phi_i$ belong to the $2$-block $B_i$ of $G$. Then $B_1,B_2$ and $B_3$ are distinct, real and nilpotent.

The principal $2$-block $B_1$ consists of the $8$ linear characters and $6$ irreducible characters of degree $2$ in $\operatorname{Irr}(G/N)$. Then $\Phi_1$ is strongly real, as it is the trivial principal indecomposable character of $G$.

The block $B_2$ consists of the $8$ irreducible characters in $\operatorname{Irr}(G\mid1\times\omega)$, each of which has degree $4$. Four of these are orthogonal and four are symplectic. Now $1\times\omega$ has stabilizer $H\times C_6$ and extended stablizer $H\times H$ in $G$. As $H\times H$ does not split over $H\times C_6$, it follows that $B_2$ is a weakly real $2$-block of $G$. So $\Phi_2$ is weakly real.

Finally $B_3$ consists of the $5$ irreducible characters in $\operatorname{Irr}(G\mid\omega\times\omega)$. Four of these are orthogonal and of degree $4$. The remaining character is symplectic and of degree $8$. Now the stabilizer of $\omega\times\omega$ in $G$ is $C_6\wr C_2$. As $(b^{-1},b)\sigma$ is an involution in $G$ which inverts $\omega\times\omega$, the extended stablizer of $\omega\times\omega$ splits over its stabilizer. As a consequence $\operatorname{Irr}(G\mid\omega\times\omega)$ is a strongly real $2$-block of $G$. So $\Phi_3$ is strongly real. This means that the corresponding principal indecomposable $kG$ module has a quadratic geometry, contrary to the conclusion of \cite[2.12]{GW93}.

We note that the involution module of $B_3$ can be constructed as follows. We have $\operatorname{Irr}(H\mid\omega)=\{\chi_1,\chi_{-1}\}$, where $\chi_\epsilon$ has degree $2$ and F-S indicator $\epsilon$. Clearly $\operatorname{C}_G(\sigma)=\Delta H\times\langle\sigma\rangle$ in $G$. So ${\mathbb C}_{\operatorname{C}_G(\sigma)}\uparrow^G$ is isomorphic to ${\mathbb C}H$, as a module for ${\mathbb C}H\wr C_2$. In particular the involution module of $B_3$ has ordinary character $\hat \chi_1+\hat\chi_{-1}$, where $\hat\chi_\epsilon$ is an extension of $\chi_\epsilon\times\chi_\epsilon$ from $H\times H$ to $G$. It is easy to check that both of these characters has F-S indicator $+1$.
\end{Example}

In view of the above examples, we venture the following:

\begin{Conjecture}
$\epsilon(\Phi)$ is even if\/ $\Phi$ is a weakly real principal indecomposable character.
\end{Conjecture}

\section{Odd Cartan Invariants}

We keep our notation $\varphi_i,\Phi_i$ and $g_i$ for the irreducible $2$-Brauer characters, the principal indecomposable characters and the elements of the $2$-regular conjugacy classes of $G$, respectively. List the irreducible characters of $G$ as $\chi_1,\dots,\chi_k$. Then
$$
\chi_i^*=\sum_{j=1}^\ell d_{ij}\varphi_j,\quad
\Phi_i=\sum_{j=1}^k d_{ij}\chi_j,\quad
\Phi_i=\sum_{j=1}^\ell c_{ij}\varphi_j,
$$
where the Cartan invariants  are given by $c_{ij}=\sum_{u=1}^kd_{ui}d_{uj}$.

Recall that $g\in G$ is said to have $2$-defect zero if $\operatorname{C}_G(g)$ has odd order. In particular $g$ has odd order. Now suppose that $g$ is real and of $2$-defect zero. Then a Sylow $2$-subgroup of $\operatorname{C}_G^*(g)$ has order $2$. So $g$ is inverted by an involution, whence $g$ is strongly real in $G$.

Now the $\ell\times\ell$ Cartan matrix $[c_{ij}]$ of $G$ is a symmetric integer matrix whose invariant factors are $|\operatorname{C}_G(g_1)|_2,\dots,|\operatorname{C}_G(g_\ell)|_2$. In particular its rank modulo $2$ coincides with the number of $2$-regular conjugacy classes of $G$ which have $2$-defect zero. So we get one strongly real $2$-Brauer character for each real class of $2$-defect zero. Our final Theorem refines this observation:

\begin{Theorem}
Suppose that $c_{ij}$ is odd, where $\varphi_i$ and $\varphi_j$ are real-valued. Then there exists $w$ such that $c_{iw}$ is odd and $\varphi_w$ is strongly real.
\begin{proof}
We compute
$$
\begin{aligned}
\sum_{u=1}^r\Phi_i(g_u)\frac{\Phi_j(g_u^{-1})}{|\operatorname{C}_G(g_u)|}
&\equiv\sum_{u=1}^r\sum_{v=1}^\ell c_{iv}\varphi_v(g_u)\frac{\Phi_j(g_u^{-1})}{|\operatorname{C}_G(g_u)|},\quad\mbox{definition of $c_{iv}$}\\
&\equiv\sum_{u=1}^r\sum_{v=1}^rc_{iv}\varphi_v(g_u)\frac{\Phi_j(g_u^{-1})}{|\operatorname{C}_G(g_u)|},\quad\mbox{as $c_{iv}\varphi_v(g_u)=c_{i\overline v}\overline\varphi_v(g_u)$}\\
&\equiv\sum_{v=1}^rc_{iv}\sum_{u=1}^\ell\varphi_v(g_u)\frac{\Phi_j(g_u^{-1})}{|\operatorname{C}_G(g_u)|},\quad\mbox{as $\varphi_v(g_u)\Phi_j(g_u^{-1})=\varphi_v(g_u^{-1})\Phi_j(g_u)$}\\
&\equiv c_{ij}\mod J,\quad\mbox{by the second orthogonality relation}.
\end{aligned}
$$
It follows that $\Phi_i(g_u)\frac{\Phi_j(g_u^{-1})}{|\operatorname{C}_G(g_u)|}\not\in J$, for some real $g_u$. But $|\operatorname{C}_G(g_u)|_2\mid\Phi_i(g_u)$. So $g_u$ must have $2$-defect zero, and hence $g_u$ is strongly real. Now $\Phi_i(g_u)=\sum_{w=1}^\ell c_{iw}\varphi_w(g_u)\equiv\sum_{w=1}^rc_{iw}\varphi_w(g_u)$. So there exists $w$ such that $\varphi_v=\overline\varphi_v$, $c_{iw}$ is odd and $\varphi_w(g_u)$ is coprime to $2$. Then $\varphi_w$ is strongly real, according to Lemma \ref{L:strongly_real}. This completes the proof.

{\bf Remarks:} Let $t$ be an involution inverting a primitive idempotent corresponding to $\Phi_w$. Then $t$ inverts $g_u$, by Lemma \ref{L:inverts}. So $t$ is uniquely determined up to conjugacy, as $g_u$ has defect $0$. Now $c_{iw}=\sum_{x=1}^kd_{ix}d_{wx}$. So there exists $x$ such that $\chi_x=\overline\chi_x$ and $d_{ix}$ and $d_{wx}$ are odd. As $\varphi_w$ is strongly real, $\chi_x$ is an orthogonal irreducible character of $G$.
\end{proof}
\end{Theorem}

\section{bibliography}

redpajama_set_name: RedPajamaArXiv


Domestic rules and regulations of our holiday-villa plus Useful information for after your booking.
Front-door key. When locking up for the night, please take the key from the lock and hang the bunch on the door-knob, otherwise our staff can't get in with their key in the morning.
Key to our gate. Lock the gate at night and our staff also has a key to unlock in the morning.
Key to the project's main gate. In principle you will only need that in case you arrive back home late at night and Ketut, our security would not hear you at once. He is responsible for locking and unlocking this gate.
Key to the shed: at the entrance of our gate.
In principle the doorknob at the front door is the best place to keep this bunch of keys.
No smoking is allowed inside our holiday home. However, you are free to smoke outside and cigarettes and shag-tobacco cost a mere 70 eurocents a packet. Plenty of ashtrays are available so please no cigarette-ends in our garden.
On the desk you will find a folder containing all the necessary information. First of all about the working of all domestic appliances and furthermore brochures with tips on restaurants and day-trips.
A visitors' book is also there and we would appreciate your inserting some lines about your experiences during your stay.
TV, DVD-player and portable CD/VCD-player as well as the air conditioning are all easy to operate. Just check the information in the folder in case of problems.
A Sony Playstation with about 15 games is available for you to use. That is easy to operate too (certainly for the youngsters).
Washing etc. will be done for you by Iluh and Moni. Just hand them the dirty laundry in the morning and later on you will find it ironed in your room.
In case you want something to be washed additionally, with a special treatment or an extra washing of the bed-clothes, just let them know. Normally spoken the bed-clothes are washed weekly.
Bed-clothes, beach towels, towels and washing-gloves are available in sufficient quantities.
All rooms, including living- and dining-room have separate air conditioning. Use them only when really necessary. Electricity is extremely expensive on Bali and leaving them on unnecessarily is bad for the environment and our purse !
Tip: Turn the AC on at approx. 25 degrees when going to bed and set the sleep-timer for 1 or 2 hours. A lower temperature is not advisable because then the difference will be too great.
The swimming-pool is kept tidy as far as chemicals are concerned by Ketut and he also cleans it regularly. The pump is switched on and off by him too. Near the pump-switch is the switch for the lighting of the pool.
Tip: Do bring belts or swimming-belts with you for use in our swimming-pool if your children can't swim yet. These are really expensive on Bali and can't be bought everywhere.
Your own mobile phone will undoubtedly work on Bali, but be aware that phoning overseas is rather expensive. When someone phones you from abroad, you will be charged for the costs as well. Preferably let members of your family phone you on our Balinese mobile number (see below).
In that case the costs are about 20 to 25% of what your own country's provider will charge you.
We have a Nokia mobile phone for you to use. The number is +62(0) 8123862950. In the house you can connect it to an outside aerial for maximum range and this mobile is only to be used on Bali. (in case you use our mobile please pay our Ketut once only rps 100,000). Your family, wherever in the world, can simply call the number mentioned without extra costs for the Bali number.
There are plenty of books for you to read and some family-games for you to play. Moreover there are some toys for the smaller guests. Furthermore you will find some guidebooks with tips and things worth knowing about Bali.
In the dining area of the living-room is a dining-table with ten chairs but if your party is not too extensive you are advised to eat outside on the terrace where there is a dining-table for six.
When going to bed at night, kindly switch off all the lights, also of the outdoor lighting and the swimming-pool.
As mentioned earlier, you can use our Balinese boat for free and ask Ketut to explain to you in what way boat and engine work. The engine is in the Gudang (our private shed) so please ask Ketut to get the engine out for you. In case you go snorkling or fishing, remember to take the anchor with you and be aware of the fact that you are out at sea and not on some small river at home ! The engine runs on normal petrol that is everywhere to be bought. There is a full jerrycan in the Gudang and kindly leave it filled up again.
Our garden is full of plants, flowers and trees. Have a quiet look around and enjoy everything that grows and blossoms in our garden. There are also some fruit-trees there and should fruit like bananas, mangos or grapes be ripe, don't hesitate to eat them.
At the back of the garden in the direction of the beach there is a holy tree with a small temple in front of it. On special days, both the staff of the entire project and some locals come to sacrifice there. Don't be surprised when you suddenly see a woman in special garments standing near this temple.
Our staff members work 6 days a week about 8 to 9 hours daily. They will always ensure never to be free at the same time. Normally spoken, Iluh is free on Saturdays and Moni & Ketut on Sundays.
Should any problems or complaints arise which cannot be solved with either Ketut or Sudi of our helpdesk, please contact us directly.
© 2019 Seaview Bali Vakantie Villa Te Huur. All Rights Reserved.


Honestly, I'm a little bit nervous when writing about this topic as you know, the world of wallets for ladies is uncountable. Forget about the colors, just the diverse of its styles is enough to make you confused. But obviously, a single wallet can't afford all your needs and situations. You need to know which purposes you intend to use it.
For instance, if you are going to attend an evening party, the best choice is a dress wallet or a wrist wallet with luxe and expensive look. On the contrary, for daily use, you should consider casual-designed with larger capacity to fit your everyday carry.
That's said, in this Best Wallets for Ladies Article, I will list out different wallet types which are the best option for specific purposes (of course, in my experience) so that chances you can pick the right one. Read on!
This Yafeige screams party vibe with its luxurious, shiny and modern outer performance. The whole product is made out of premium Oil wax cowhide leather and the finest gold-tone hardware, which emphasizes its luxe to many times.
Moreover, its strikingly soft and comfortable leather texture when touching will surely satisfy any die-hard leather fan. Plus, perfectly uniform stitching, fabric lining and dedicated sewing thread make the female wallets more durable and longevity.
Just peace in mind to put up heavy loads into it, such as smart phone, coins, cards, cash, and stuff like that. Besides, its well-organized structure definitely keeps your belongings streamlined.
For those who are curious, this wallet can accommodate an iPhone 7 Plus without bulk. There are also 13 card slots, 4 large compartments to fit various currencies and 1 zip-around pocket or extra security.
Plus, RFID Blocking Technology and money-back guarantee.
Handheld wallets are the most common item to complete any event outfit based on its luxe, elegance and subtleness. However, during the party, this becomes bulky as our hands are usually busy holding other stuff like wine glass, food, or phone. That's why I sincerely advise you to opt for a dress wallet with detachable wristlet.
And Fossil is my choice!
This is a worthy investment for a pricier wallet when you need to show up your class and luxury in the publicity. Its genuine leather is truly high-quality, distinctly soft and durable. Plus, the gold-tone zipper and hardware accessory matches perfectly to its material to enhance the luxe and powerfulness.
Taking a closure look and touching it, you will feel clearly how well-made it is – uniform stitching, strong threads and fabric lining.
Inside this wallet, there are various compartments for cards, cash and other stuff to ensure the ultimate protection and organization. By the way, did I tell you how much I love its backside zippered pocket?
Yes, talking about women accessories, Vera is always one of my choice not only because of its high quality, thick and durable fabric or the smooth zipper, but also its colorful design that surely adds some characteristics to your style or at least, lighten up your simple outfit.
This Vera Bradley Zip ID Case provides more than 20 designs to meet different tastes. It's also convenient with a sided signature key ring in silver tone and the front ID window where I can keep up my ID or bank cards for quick access.
Its lining is thick and well-made to give extra protect to our belongings. Not saying that the interior is designed neatly with some compartments and slots for cards, cash and stuff like that.
Thanks to its unique style, you can flexibly mix it with differently and use in many occasions such as party, shopping, daily use, etc.
I personally love the colorway of this Buxton. It's a nice mix between black and brown to deliver a vintage, classic and luxurious look. Not only using 100 percent genuine leather for its body, the wallet also utilizes leather lining.
Measured by 4 inches high and 7.5 inches wide with one major compartment secured by a closure snap and one backside pocket using kiss lock, it is perfect to keep many kinds of belongings, from those heavy things like smart phone, checkbook, to the easy-to-get-lost stuff like coins.
However, based on its material and structure, please understand that this wallet will come in heavy weight. So, it's truly a best friend for those ladies who love carrying a sturdy wallet.
Measured as 5 ¼" x 4 ½" x 1 ½" with minimally squared design and luxurious Authentic Crunch Leather, Buxton is one of the best small wallets for women to stay alongside in many occasions such as daily use, hang out, shopping, or party.
It features two main compartments, one is closed by a snap button and the other is secured by a kiss lock. You will have 15 card slots, some cash compartments and 1 ID Window to manage your stuff streamlined and neat.
This Daruma screams feminine look with floral pattern printed on PU leather. Such combination makes its overall outer performance not look too boring or candy but very fresh and dreamy. A cute wallet that should have been in any teen girls' bag.
However, compared to the price tag, its quality is truly a big deal. Don't look down on this synthetic leather as it's quite high-quality with sturdy, soft and durable texture to surely serve you for years.
Measured by 4.5" x 3.3" x 1", how much stuff does this small piece can fit up? Well, the answer is a lot. It has 3 card slots, 1 large compartment and 1 ID window with button closure. Besides, there are two inner linings with smooth zipper to ensure to give you extra protection.
Another cute thing is its flower zipper puller, matching perfectly to its floral pattern to become a great decoration as well.
We cannot deny that Sakroots' products are very dope with one of a kind patterns and high quality. As an example, this Artist Circle Slim Wallet is a perfect piece to receive countless compliments from the surroundings.
It's beautiful, for sure with the combination of unique print and rustic gold-tone hardware. There are up to 22 designs to opt for, each of which does create a particular vibe.
For those who are curious, it features 6.75 inches high and 6.5 inches wide, consist of 2 interior huge compartments, 12 card slots (including 1 ID Window) and 1 outer zipper pocket for quick access. As made out of 100 percent fabric, this wallet is superb lightweight and slim to make a good fit to any pockets.
Cute wallets for girls with the compromise of style and functionality. I like its colorways and the feminine combination of cat-shaped hardware decoration, laces, bows and nicely printed Lucky You in the front.
Again, it's a small piece to either hold firmly in hand or stay neatly in any handbags. Measured by 3.54″L(Closed) – 7.08″L(Open) x 4.72″W x 1.18″H, including 6 card slots, 1 cash compartment, 1 ID window and 1 zippered pocket, this wallet is compact yet spacious to fit up your daily essential stuff.
Finally, who can't say no to tassels?
This is a little bit pricier wallet but, you will be happy with this purchase. It's a perfect combination between luxurious design and functionality. As always, this Fossil Ellis is made out of the finest real leather to give a soft texture with comfortable hand-feel. Besides, its durability and longevity definitely stay with you for years.
A small special feature of this Fossil is its various designs. Some go with on-set color, a few consist of dual colors while the other follow striped concept. To that end, I think you will find at least one of them to meet your taste.
There are 12 card slots, 2 slip pockets, 1 bill compartment, 1 ID window and 1 zip-around pocket. The whole wallet is measured by 3.75" x 5.25" and utilizes textile lining. Its interior is quite well-organized and spacious to fit up your daily carry.
Though our bifold long wallets can hold our world on hand, they are sometimes annoying because of its bulk and burden, that's why I highly recommend you to add one more minimalist wallet to slim down what you carry. Like this Genuine Leather Lethnic Wallet, it features 4.33 x 2.95 x 0.15 inches, very slim to stay in your front pocket or in your bag neatly.
However, it does come up with a moderate capacity to fit up your vital things like regular cards and a couple of cash to get ready for the go. On top of that, this Lethnic also keeps your stuff streamlined as well with 4-5 card slots, 1 ID window and 1 middle compartment fit nicely folded bills.
Moreover, it's equipped with RFID Blocking Technology to avoid any 13.56 MHz and 125 KHz Frequency Signals to keep your personal information stay safe against hi-tech thieves.
Contemporarily, here are my 10 best wallets for ladies based on my experience and research. (I will update it as long as I have found some new good pieces). Hopefully, this wallet is helpful for you to grab the right one. Good luck!


The Bell M.8 helmet is the next evolution in Bell's legendary M series design concept (M2, M3, M.4) incorporating traditional styling, enhanced visibility and versatile features allowing the helmet to be used in all forms of racing. The Bell M.8 provides outstanding comfort and features including a lightweight composite shell, Comfort-Plus interior, superior ventilation with manual lever air intake vents and a large eye opening.
The Bell M.8 is a great choice for racers who want a lightweight, multi-purpose helmet with a wider field of vision (especially for those who wear eye glasses) and updated Bell styling and performance. Bell's lightweight composite shell plus E-Max Plus technology distributes impacts and protects the whole head.
In addition, the Bell M.8 features Bell's new SRV friction shield system. This new system has a slide mechanism that allows the driver to adjust the tension on the shield allowing for multiple opening positions. When properly adjusted and in the locked position, the SRV system helps reduce the possibility of the shield opening during an impact. Pre-drilled for HANS posts or equivalent HNR devices. Snell SA2015 certified. Available in white or matt black. Sizes: XXS-4XL.


Pavel is a Czech-qualified attorney with 20 years of broad experience in corporate, banking and commercial matters, especially matters having a cross-border angle. After a career as partner at major international law firms, he has teamed up with the best of the class to create NOVALIA, a modern legal platform that provides superior service to select clients using cutting edge know-how and technology.
Pavel's core practice is assisting clients who are buying, selling or financing their businesses. He has advised on more than 25 M&A transactions in the last three years. He also assists his clients on a wide range of commercial matters, including dispute resolution.
He has been widely praised by clients for his commercially astute, pragmatic and results-oriented approach.
Pavel has law degrees from Charles University in Prague, the University of San Francisco, and Masaryk University in Brno.
He is the author of numerous publications and articles on various business law topics, including on merger control, life sciences, and franchising.


SCIL seeks to empower all persons with any disability, in their quest for greater personal independence, and to advocate for a barrier-free society.
Service Center for Independent Life (SCIL) works with persons with disabilities of all ages. Since 1980 SCIL's sphere of influence encompasses 22 cities in South East Los Angeles County, and the East San Gabriel and Pomona Valleys. Services include but are not limited to: self-advocacy training, assistive technology, housing information, independent living skills training, peer counseling, benefits planning and information & referral services. All services are provided at no cost to SCIL consumers.
No other resource offers the same array of services and cross disability expertise provided by SCIL. The goal of SCIL is simply to encourage and support people to make good choices and exercise control over their own lives and provide expanded access to information and resources to assist them in increasing their independence. SCIL will work with anyone who comes to us regardless of disability, race, gender, life style, or religious persuasion. At present, 100% of our staff and 65% of our Board of Directors are people with disabilities, giving us a unique insight into what our consumers face each day permitting us to more effectively serve our consumers.


SWS Golf Association is a year round association. The winter session offers various clinics and lessons taught indoors by certified golf instructors. The spring session offers clinics that help prepare golf games for summer league's and tournament plays.
SWS Golf Association 9-hole golf league is a development program for all golfers. This league provides the new golfer the experience from tee to green and how to play in different golf formats. It provides the season golfer an opportunity to access their game and assist beginner golfers from tee to green.
SWS 18-hole golf league play, is for competitive, fun and challenges held on weekends at various courses in Maryland, Virginia, DC, Pennsylvania & Delaware. Golfers looking to compete no matter whether their skill level is high, low or somewhere in between.
Golf unlike a lot of other sports is difficult to master even for the most talented athlete. Whilst your enthusiasm and courage will go a long way to becoming a better golfer, it will only take you so far. The good news if you take the right steps to getting your game right before you rush onto the course you can become a very proficient golfer. A good coach can see things from a different perspective and they are trained to understand every element of the golf swing.
Our Mission -- To impact the lives of youth and adults by introducing the game of golf and together provide opportunities that build confidence, promote healthy choices that will instill life-enhancing values having golf as the common platform.
Golf is all about having fun. While we teach the techniques of playing golf, we also coach to inspire, motivate and perpetuate a love and passion for the game. Once a golfer plays golf on a regular basis it is likely they will be asked to play in a tournament, league or charity event. Sometimes a golfer will play in tournaments before they are ready and they become discouraged. TOURNAMENT GOLF involves on course strategy, learning trouble shots, learning how to deal with your emotions and the emotions of others as well as several other aspects that you don? think about until you are in the competitive environment of the event.
Through our exceptional services and innovative programs, the coaches of SWS-GSA&T believe you will have a unique and wonderful experience. ?e strongly believe coaching is a collaborative journey of self-discovery. It is our job to unlock every person? potential to maximize their own performance by empowering them to self-correct and self-generate, while we teach the techniques of playing golf. We coach to inspire, motivate and perpetuate a love and passion for the game.
WANT MORE FROM YOUR GAME!


Joining the Southland Chamber of Commerce is easy. Simply complete our online application form.
Annual membership fees are based on the total of fulltime staff (or equivalent) you employ and are shown below.
To talk about the benefits of joining, membership payment plans or any other aspect of your membership, please contact our Membership and Events Manager.
Members agree to be bound by the constitution and contractual conditions of the Southland Chamber of Commerce and the following specific terms and conditions. Click here to view our constitution.
Annual subscription payments are based on each member's total staff numbers according to the table.
Resignations must be in writing within four weeks of the annual anniversary date. Members resigning after this period are liable for subscriptions for that year. Members are liable for any costs incurred by Southland Chamber of Commerce in recovering payment of outstanding accounts.
All information held on the database relating to this membership is confidential and shall only be used by Southland Chamber of Commerce.
Southland Chamber of Commerce has the right to decline membership. This application is subject to approval by the Southland Chamber of Commerce Board.
From time to time photographs of members taken at Southland Chamber of Commerce events will be used in promotional material for the organisation.
If you are not a member of the Southland Chamber of Commerce these emails will cease after 60 days.
"Commerce South" is committed to ensuring that your privacy is protected. Should we ask you to provide certain information by which you can be identified when using this website, then you can be assured that it will only be used in accordance with this privacy statement.
"Commerce South" may change this policy from time to time by updating this page. You should check this page from time to time to ensure that you are happy with any changes. This policy is effective from 01/01/2014.
name and job title contact information including email address demographic information such as postcode, preferences and interests other information relevant to customer surveys and/or offers We require this information to understand your needs and provide you with a better service, and in particular for the following reasons: We are committed to ensuring that your information is secure. In order to prevent unauthorized access or disclosure we have put in place suitable physical, electronic and managerial procedures to safeguard and secure the information we collect online. A cookie is a small file which asks permission to be placed on your computer's hard drive. Once you agree, the file is added and the cookie helps analyze web traffic or lets you know when you visit a particular site. Cookies allow web applications to respond to you as an individual. The web application can tailor its operations to your needs, likes and dislikes by gathering and remembering information about your preferences.