  
  [1X5 [33X[0;0YExtensions of the [5XAtlasRep[105X[101X[1X Package[133X[101X
  
  [33X[0;0YIt  may  be  interesting  to use the functions of the [5XGAP[105X interface also for
  representations  or  programs  that  are  [13Xnot[113X  part  of  the  [5XATLAS[105X of Group
  Representations. This chapter describes how to achieve this.[133X
  
  [33X[0;0YThe  main  idea  is that users can notify collections of [21Xprivate[121X data files,
  which may consist of[133X
  
  [31X1[131X   [33X[0;6Ynew faithful representations and programs for groups that are declared
        already  in the core part of the database that belongs to the [21Xofficial[121X
        [5XATLAS[105X of Group Representations (see Section [14X5.1[114X),[133X
  
  [31X2[131X   [33X[0;6Ythe  declaration of groups that are not declared in the [5XATLAS[105X of Group
        Representations,  and  representations  and  programs  for  them  (see
        Section [14X5.2[114X), and[133X
  
  [31X3[131X   [33X[0;6Ythe  definition  of  new  kinds  of  representations and programs (see
        Section [14X7.5[114X).[133X
  
  [33X[0;0YA  test  example  of a local extension is given in Section [14X5.3[114X. Another such
  example  is  the  small collection of data that is distributed together with
  the package, in its [11Xdatapkg[111X directory; its contents can be listed by calling
  [10XDisplayAtlasInfo( "contents", "internal" )[110X.[133X
  
  [33X[0;0YExamples of extensions by files that can be downloaded from the internet can
  be  found  in  the  [5XGAP[105X  packages  [5XMFER[105X  [BHM09] and [5XCTBlocks[105X [Bre14]. These
  extensions  are automatically notified as soon as [5XAtlasRep[105X is available, via
  the default value of the user preference [10XAtlasRepTOCData[110X, see Section [14X4.2-3[114X;
  their contents can be listed by calling [10XDisplayAtlasInfo( "contents", "mfer"
  )[110X and [10XDisplayAtlasInfo( "contents", "ctblocks" )[110X, respectively.[133X
  
  [33X[0;0YSeveral  of  the  sanity  checks for the core part of the [5XAtlasRep[105X data make
  sense also for data extensions, see Section [14X7.9[114X for more information.[133X
  
  
  [1X5.1 [33X[0;0YNotify Additional Data[133X[101X
  
  [33X[0;0YAfter  the  [5XAtlasRep[105X  package  has been loaded into the [5XGAP[105X session, one can
  extend  the  data  which the interface can access by own representations and
  programs. The following two variants are supported.[133X
  
  [30X    [33X[0;6YThe  additional  data  files  are locally available in some directory.
        Information  about  the  declaration of new groups or about additional
        information  such  as  the  character  names of representations can be
        provided  in  an  optional  JSON  format  file  named [11Xtoc.json[111X in this
        directory.[133X
  
  [30X    [33X[0;6YThe  data  files can be downloaded from the internet. Both the list of
        available  data  and  additional  information as in the above case are
        given  by  either a local JSON format file or the URL of a JSON format
        file.     This     variant     requires     the     user    preference
        [10XAtlasRepAccessRemoteFiles[110X (see Section [14X4.2-1[114X) to have the value [9Xtrue[109X.[133X
  
  [33X[0;0YIn  both cases, [2XAtlasOfGroupRepresentationsNotifyData[102X ([14X5.1-1[114X) can be used to
  make the private data available to the interface.[133X
  
  
  [1X5.1-1 [33X[0;0YAtlasOfGroupRepresentationsNotifyData[133X[101X
  
  [33X[1;0Y[29X[2XAtlasOfGroupRepresentationsNotifyData[102X( [3Xdir[103X, [3Xid[103X[, [3Xtest[103X] ) [32X function[133X
  [33X[1;0Y[29X[2XAtlasOfGroupRepresentationsNotifyData[102X( [3Xfilename[103X[, [3Xid[103X][, [3Xtest[103X] ) [32X function[133X
  [33X[1;0Y[29X[2XAtlasOfGroupRepresentationsNotifyData[102X( [3Xurl[103X[, [3Xid[103X][, [3Xtest[103X] ) [32X function[133X
  [6XReturns:[106X  [33X[0;10Y[9Xtrue[109X  if  the overview of the additional data can be evaluated and
            if  the  names  of  the data files in the extension are compatible
            with  the  data  files  that  had  been available before the call,
            otherwise [9Xfalse[109X.[133X
  
  [33X[0;0YThe following variants are supported for notifying additional data.[133X
  
  [8XContents of a local directory[108X
        [33X[0;6YThe  first  argument  [3Xdir[103X  must  be  either  a  local  directory  (see
        [14X'Reference:  Directories'[114X)  or  a  string denoting the path of a local
        directory,  such  that the [5XGAP[105X object describing this directory can be
        obtained by calling [2XDirectory[102X ([14XReference: Directory[114X) with the argument
        [3Xdir[103X;  in  the  latter  case,  [3Xdir[103X  can  be  an absolute path or a path
        relative to the user's home directory (starting with a tilde character
        [10X~[110X)  or  a  path  relative  to the directory where [5XGAP[105X was started. The
        files  contained  in this directory or in its subdirectories (only one
        level  deep) are considered. If the directory contains a JSON document
        in  a  file  with the name [11Xtoc.json[111X then this file gets evaluated; its
        purpose is to provide additional information about the data files.[133X
  
        [33X[0;6YCalling  [2XAtlasOfGroupRepresentationsNotifyData[102X  means  to evaluate the
        contents of the directory and (if available) of the file [11Xtoc.json[111X.[133X
  
        [33X[0;6YAccessing data means to read the locally available data files.[133X
  
        [33X[0;6YThe  argument  [3Xid[103X  must be a string. It will be used in the [10Xidentifier[110X
        components  of  the  records  that are returned by interface functions
        (see  Section [14X3.5[114X) for data contained in the directory [3Xdir[103X. (Note that
        the  directory  name may be different in different [5XGAP[105X sessions or for
        different  users  who  want  to  access  the  same  data,  whereas the
        [10Xidentifier[110X components shall be independent of such differences.)[133X
  
        [33X[0;6YAn  example  of  a  local  extension  is  the  contents of the [11Xdatapkg[111X
        directory  of  the  [5XAtlasRep[105X  package.  This  extension  gets notified
        automatically   when   [5XAtlasRep[105X  gets  loaded.  For  restricting  data
        collections to this extension, one can use the identifier [10X"internal"[110X.[133X
  
  [8XLocal file describing the contents of a local or remote directory[108X
        [33X[0;6YThe  first  argument  [3Xfilename[103X  must be the name of a local file whose
        content  is  a JSON document that lists the available data, additional
        information  about  these  data, and an URL from where the data can be
        downloaded. The data format of this file is defined by the JSON schema
        file [11Xdoc/atlasreptoc_schema.json[111X of the [5XAtlasRep[105X package.[133X
  
        [33X[0;6YCalling  [2XAtlasOfGroupRepresentationsNotifyData[102X  means  to evaluate the
        contents  of  the  file  [3Xfilename[103X, without trying to access the remote
        data.  The  [3Xid[103X  is then either given implicitly by the [10XID[110X component of
        the JSON document or can be given as the second argument.[133X
  
        [33X[0;6YDownloaded data files are stored in the subdirectory [11Xdataext/[111X[3Xid[103X of the
        directory  that is given by the user preference [10XAtlasRepDataDirectory[110X,
        see Section [14X4.2-2[114X.[133X
  
        [33X[0;6YAccessing  data  means  to  download  remote files if necessary but to
        prefer files that are already locally available.[133X
  
        [33X[0;6YAn   example   of   such  an  extension  is  the  set  of  permutation
        representations  provided by the [5XMFER[105X package [BHM09]; due to the file
        sizes,  these  representations  are  [13Xnot[113X distributed together with the
        [5XMFER[105X  package. For restricting data collections to this extension, one
        can use the identifier [10X"mfer"[110X.[133X
  
        [33X[0;6YAnother  example  is  given  by  some  of  the data that belong to the
        [5XCTBlocks[105X  package  [Bre14].  These data are also distributed with that
        package,  and  notifying  the  extension  in  the  situation  that the
        [5XCTBlocks[105X  package is available will make its local data available, via
        the  component  [10XLocalDirectory[110X  of  the  JSON  document [11Xctblocks.json[111X;
        notifying  the extension in the situation that the [5XCTBlocks[105X package is
        [13Xnot[113X  available will make the remote files available, via the component
        [10XDataURL[110X  of  this  JSON  document. For restricting data collections to
        this extension, one can use the identifier [10X"ctblocks"[110X.[133X
  
  [8XURL of a file[108X
        [33X[0;6Y(This variant works only if the [5XIO[105X package [Neu14] is available.)[133X
  
        [33X[0;6YThe  first  argument  [3Xurl[103X must be the URL of a JSON document as in the
        previous case.[133X
  
        [33X[0;6YCalling [2XAtlasOfGroupRepresentationsNotifyData[102X in [13Xonline mode[113X (that is,
        the  user  preference  [10XAtlasRepAccessRemoteFiles[110X  has  the value [9Xtrue[109X)
        means  to  download this file and to evaluate it; the [3Xid[103X is then given
        implicitly  by the [10XID[110X component of the JSON document, and the contents
        of  the  document gets stored in a file with name [11Xdataext/[111X[3Xid[103X[11X/toc.json[111X,
        relative  to  the  directory given by the value of the user preference
        [10XAtlasRepDataDirectory[110X.  Also  downloaded files for this extension will
        be stored in the directory [11Xdataext/[111X[3Xid[103X.[133X
  
        [33X[0;6YCalling [2XAtlasOfGroupRepresentationsNotifyData[102X in [13Xoffline mode[113X requires
        that  the argument [3Xid[103X is explicitly given. In this case, it is checked
        whether the [11Xdataext[111X subdirectory contains a subdirectory with name [3Xid[103X;
        if  not then [9Xfalse[109X is returned, if yes then the contents of this local
        directory gets notified via the first form described above.[133X
  
        [33X[0;6YAccessing  data  in  online  mode  means  the same as in the case of a
        remote  directory. Accessing data in offline mode means the same as in
        the case of a local directory.[133X
  
        [33X[0;6YExamples  of  such  extension  are  again  the  data from the packages
        [5XCTBlocks[105X  and  [5XMFER[105X  described  above, but in the situation that these
        packages  are  [13Xnot[113X  loaded,  and  that just the web URLs of their JSON
        documents are entered which describe the contents.[133X
  
  [33X[0;0YIn  all  three cases, if the optional argument [3Xtest[103X is given then it must be
  either  [9Xtrue[109X  or [9Xfalse[109X. In the [9Xtrue[109X case, consistency checks are switched on
  during the notification. The default for [3Xtest[103X is [9Xfalse[109X.[133X
  
  [33X[0;0YThe  notification  of  an  extension  may happen as a side-effect when a [5XGAP[105X
  package  gets  loaded  that provides the data in question. Besides that, one
  may  collect  the  notifications of data extensions in one's [11Xgaprc[111X file (see
  Section [14X'Reference: The gap.ini and gaprc files'[114X).[133X
  
  [1X5.1-2 AtlasOfGroupRepresentationsForgetData[101X
  
  [33X[1;0Y[29X[2XAtlasOfGroupRepresentationsForgetData[102X( [3Xdirid[103X ) [32X function[133X
  
  [33X[0;0YIf  [3Xdirid[103X  is  the identifier of a database extension that has been notified
  with        [2XAtlasOfGroupRepresentationsNotifyData[102X        ([14X5.1-1[114X)        then
  [2XAtlasOfGroupRepresentationsForgetData[102X  undoes  the  notification; this means
  that  from then on, the data of this extension cannot be accessed anymore in
  the current session.[133X
  
  [1X5.1-3 StringOfAtlasTableOfContents[101X
  
  [33X[1;0Y[29X[2XStringOfAtlasTableOfContents[102X( [3Xinforec[103X ) [32X function[133X
  
  [33X[0;0YFor  a  record  [3Xinforec[103X with at least the component [10XID[110X, with value [10X"core"[110X or
  the        identifier       of       a       data       extension       (see
  [2XAtlasOfGroupRepresentationsNotifyData[102X  ([14X5.1-1[114X)),  this  function  returns  a
  string that describes the part of [5XAtlasRep[105X data belonging to [3Xinforec[103X[10X.ID[110X.[133X
  
  [33X[0;0YPrinted  to a file, the returned string can be used as the table of contents
  of this part of the data. For that purpose, also the following components of
  [3Xinforec[103X  must be bound (all strings). [10XVersion[110X, [10XSelfURL[110X (the internet address
  of  the  table  of  contents file itself). At least one of the following two
  components  must  be bound. [10XDataURL[110X is the internet address of the directory
  from  where the data in question can be downloaded. [10XLocalDirectory[110X is a path
  relative  to  [5XGAP[105X's  [11Xpkg[111X  directory  where  the  data  may be stored locally
  (depending  on  whether  some  [5XGAP[105X  package  is installed). If the component
  [10XDataURL[110X is bound then the returned string contains the information about the
  data files; this is not necessary if the data are [13Xonly[113X locally available. If
  both  [10XDataURL[110X  and [10XLocalDirectory[110X are bound then locally available data will
  be prefered at runtime.[133X
  
  [33X[0;0YAlternatively,  [3Xinforec[103X  can also be the [10XID[110X string; in this case, the values
  of  those of the supported components mentioned above that are defined in an
  available  JSON file for this [10XID[110X are automatically inserted. (If there is no
  such file yet then entering the [10XID[110X string as [3Xinforec[103X does not make sense.)[133X
  
  [33X[0;0YFor an example how to use the function, see Section [14X5.3[114X.[133X
  
  
  [1X5.2 [33X[0;0YThe Effect of Extensions on the User Interface[133X[101X
  
  [33X[0;0YFirst  suppose  that only new groups or new data for known groups or for new
  groups are added.[133X
  
  [33X[0;0YIn  this case, [2XDisplayAtlasInfo[102X ([14X3.5-1[114X) lists the additional representations
  and  programs  in  the same way as other data known to [5XAtlasRep[105X, except that
  parts outside the core database are marked with the string that is the value
  of  the  user  preference  [10XAtlasRepMarkNonCoreData[110X,  see Section [14X4.2-13[114X. The
  ordering of representations listed by [2XDisplayAtlasInfo[102X ([14X3.5-1[114X) (and referred
  to  by  [2XAtlasGenerators[102X  ([14X3.5-3[114X)) will in general change whenever extensions
  get  notified. For the other interface functions described in Chapter [14X3[114X, the
  only difference is that also the additional data can be accessed.[133X
  
  [33X[0;0YIf also new data types are introduced in an extension (see Section [14X7.5[114X) then
  additional  columns  or  rows  can  appear in the output of [2XDisplayAtlasInfo[102X
  ([14X3.5-1[114X), and new inputs can become meaningful for all interface functions.[133X
  
  
  [1X5.3 [33X[0;0YAn Example of Extending the [5XAtlasRep[105X[101X[1X Data[133X[101X
  
  [33X[0;0YThis section shows an extension by a few [13Xlocally available[113X files.[133X
  
  [33X[0;0YWe set the info level of [2XInfoAtlasRep[102X ([14X7.1-1[114X) to [22X1[122X in this section.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xlocallevel:= InfoLevel( InfoAtlasRep );;[127X[104X
    [4X[25Xgap>[125X [27XSetInfoLevel( InfoAtlasRep, 1 );[127X[104X
  [4X[32X[104X
  
  [33X[0;0YLet  us assume that the local directory [11Xprivdir[111X contains data for the cyclic
  group  [22XC_4[122X  of  order  [22X4[122X  and  for  the  alternating  group [22XA_5[122X on [22X5[122X points,
  respectively.  Note  that  it  is  obvious what the term [21Xstandard generators[121X
  means for the group [22XC_4[122X.[133X
  
  [33X[0;0YFurther let us assume that [11Xprivdir[111X contains the following files.[133X
  
  [8X[11XC4G1-p4B0.m1[111X[108X
        [33X[0;6Ya faithful permutation representation of [22XC_4[122X on [22X4[122X points,[133X
  
  [8X[11XC4G1-max1W1[111X[108X
        [33X[0;6Ythe straight line program that returns the square of its unique input,[133X
  
  [8X[11XC4G1-a2W1[111X[108X
        [33X[0;6Ythe  straight  line  program that raises its unique input to the third
        power,[133X
  
  [8X[11XC4G1-XtestW1[111X[108X
        [33X[0;6Ythe straight line program that returns the square of its unique input,[133X
  
  [8X[11XA5G1-p60B0.m1[111X and [11XA5G1-p60B0.m2[111X[108X
        [33X[0;6Ystandard generators for [22XA_5[122X in its regular permutation representation.[133X
  
  [33X[0;0YThe directory and the files can be created as follows.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xprv:= DirectoryTemporary( "privdir" );;[127X[104X
    [4X[25Xgap>[125X [27XFileString( Filename( prv, "C4G1-p4B0.m1" ),[127X[104X
    [4X[25X>[125X [27X               MeatAxeString( [ (1,2,3,4) ], 4 ) );;[127X[104X
    [4X[25Xgap>[125X [27XFileString( Filename( prv, "C4G1-max1W1" ),[127X[104X
    [4X[25X>[125X [27X               "inp 1\npwr 2 1 2\noup 1 2\n" );;[127X[104X
    [4X[25Xgap>[125X [27XFileString( Filename( prv, "C4G1-XtestW1" ),[127X[104X
    [4X[25X>[125X [27X               "inp 1\npwr 2 1 2\noup 1 2\n" );;[127X[104X
    [4X[25Xgap>[125X [27XFileString( Filename( prv, "C4G1-a2W1" ),[127X[104X
    [4X[25X>[125X [27X               "inp 1\npwr 3 1 2\noup 1 2\n" );;[127X[104X
    [4X[25Xgap>[125X [27XFileString( Filename( prv, "C4G1-Ar1aB0.g" ),[127X[104X
    [4X[25X>[125X [27X               "return rec( generators:= [ [[E(4)]] ] );\n" );;[127X[104X
    [4X[25Xgap>[125X [27Xpoints:= Elements( AlternatingGroup( 5 ) );;[127X[104X
    [4X[25Xgap>[125X [27XFileString( Filename( prv, "A5G1-p60B0.m1" ),[127X[104X
    [4X[25X>[125X [27X     MeatAxeString( [ Permutation( (1,2)(3,4), points, OnRight ) ], 60 ) );;[127X[104X
    [4X[25Xgap>[125X [27XFileString( Filename( prv, "A5G1-p60B0.m2" ),[127X[104X
    [4X[25X>[125X [27X     MeatAxeString( [ Permutation( (1,3,5), points, OnRight ) ], 60 ) );;[127X[104X
  [4X[32X[104X
  
  [33X[0;0Y(We  could also introduce intermediate directories [11XC4[111X and [11XA5[111X, say, each with
  the  data  for  one  group  only.  Here we do not show this because creating
  directories programmatically seems to require the [5XGAP[105X package [5XIO[105X.)[133X
  
  [33X[0;0YThe  core  part of the [5XAtlasRep[105X data does not contain information about [22XC_4[122X,
  so  we  first  notify  this group, in the file [11Xprivdir/toc.json[111X. Besides the
  name  of the group, we store the following information: the group order, the
  number  of  (classes  of) maximal subgroups, their orders, their structures,
  and  describing  data  about  the  three  representations.  The group [22XA_5[122X is
  already known with name [10XA5[110X in the core part of the [5XAtlasRep[105X data, so it need
  not and cannot be notified again.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XFileString( Filename( prv, "toc.json" ), Concatenation( [ "{\n",[127X[104X
    [4X[25X>[125X [27X       "\"ID\":\"priv\",\n",[127X[104X
    [4X[25X>[125X [27X       "\"Data\":[\n",[127X[104X
    [4X[25X>[125X [27X       "[\"GNAN\",[\"C4\",\"C4\"]],\n",[127X[104X
    [4X[25X>[125X [27X       "[\"GRS\",[\"C4\",4]],\n",[127X[104X
    [4X[25X>[125X [27X       "[\"MXN\",[\"C4\",1]],\n",[127X[104X
    [4X[25X>[125X [27X       "[\"MXO\",[\"C4\",[2]]],\n",[127X[104X
    [4X[25X>[125X [27X       "[\"MXS\",[\"C4\",[\"C2\"]]],\n",[127X[104X
    [4X[25X>[125X [27X       "[\"RNG\",[\"C4G1-Ar1aB0\",\"CF(4)\"]],\n",[127X[104X
    [4X[25X>[125X [27X       "[\"API\",[\"C4G1-p4B0\",[1,4,\"imprim\",\"1 < C2\"]]],\n",[127X[104X
    [4X[25X>[125X [27X       "[\"API\",[\"A5G1-p60B0\",[1,60,\"imprim\",\"1 < S3\"]]]\n",[127X[104X
    [4X[25X>[125X [27X       "]\n",[127X[104X
    [4X[25X>[125X [27X       "}\n" ] ) );;[127X[104X
  [4X[32X[104X
  
  [33X[0;0YThen we notify the extension.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XAtlasOfGroupRepresentationsNotifyData( prv, "priv", true );[127X[104X
    [4X[28Xtrue[128X[104X
  [4X[32X[104X
  
  [33X[0;0YNow we can use the interface functions for accessing the additional data.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XDisplayAtlasInfo( [ "C4" ] );[127X[104X
    [4X[28Xgroup | # | maxes | cl | cyc | out | fnd | chk | prs[128X[104X
    [4X[28X------+---+-------+----+-----+-----+-----+-----+----[128X[104X
    [4X[28XC4*   | 2 |     1 |    |     |   2 |     |     |    [128X[104X
    [4X[25Xgap>[125X [27XDisplayAtlasInfo( "C4" );[127X[104X
    [4X[28XRepresentations for G = C4:    (all refer to std. generators 1)[128X[104X
    [4X[28X---------------------------[128X[104X
    [4X[28X1: G <= Sym(4)*       rank 4, on cosets of 1 < C2[128X[104X
    [4X[28X2: G <= GL(1a,CF(4))* [128X[104X
    [4X[28X[128X[104X
    [4X[28XPrograms for G = C4:    (all refer to std. generators 1)[128X[104X
    [4X[28X--------------------[128X[104X
    [4X[28X- automorphisms*:[128X[104X
    [4X[28X  2*               [128X[104X
    [4X[28X- maxes (all 1):[128X[104X
    [4X[28X  1*:  C2          [128X[104X
    [4X[28X- other scripts*:[128X[104X
    [4X[28X  "test"*          [128X[104X
    [4X[25Xgap>[125X [27XDisplayAtlasInfo( "C4", IsPermGroup, true );[127X[104X
    [4X[28XRepresentations for G = C4:    (all refer to std. generators 1)[128X[104X
    [4X[28X---------------------------[128X[104X
    [4X[28X1: G <= Sym(4)* rank 4, on cosets of 1 < C2[128X[104X
    [4X[25Xgap>[125X [27XDisplayAtlasInfo( "C4", IsMatrixGroup );[127X[104X
    [4X[28XRepresentations for G = C4:    (all refer to std. generators 1)[128X[104X
    [4X[28X---------------------------[128X[104X
    [4X[28X2: G <= GL(1a,CF(4))* [128X[104X
    [4X[25Xgap>[125X [27XDisplayAtlasInfo( "C4", Dimension, 2 );[127X[104X
    [4X[25Xgap>[125X [27XDisplayAtlasInfo( "A5", NrMovedPoints, 60 );[127X[104X
    [4X[28XRepresentations for G = A5:    (all refer to std. generators 1)[128X[104X
    [4X[28X---------------------------[128X[104X
    [4X[28X4: G <= Sym(60)* rank 60, on cosets of 1 < S3[128X[104X
    [4X[25Xgap>[125X [27Xinfo:= OneAtlasGeneratingSetInfo( "C4" );[127X[104X
    [4X[28Xrec( contents := "priv", groupname := "C4", id := "", [128X[104X
    [4X[28X  identifier := [ "C4", [ [ "priv", "C4G1-p4B0.m1" ] ], 1, 4 ], [128X[104X
    [4X[28X  isPrimitive := false, p := 4, rankAction := 4, [128X[104X
    [4X[28X  repname := "C4G1-p4B0", repnr := 1, size := 4, [128X[104X
    [4X[28X  stabilizer := "1 < C2", standardization := 1, transitivity := 1, [128X[104X
    [4X[28X  type := "perm" )[128X[104X
    [4X[25Xgap>[125X [27XAtlasGenerators( info.identifier );[127X[104X
    [4X[28Xrec( contents := "priv", generators := [ (1,2,3,4) ], [128X[104X
    [4X[28X  groupname := "C4", id := "", [128X[104X
    [4X[28X  identifier := [ "C4", [ [ "priv", "C4G1-p4B0.m1" ] ], 1, 4 ], [128X[104X
    [4X[28X  isPrimitive := false, p := 4, rankAction := 4, [128X[104X
    [4X[28X  repname := "C4G1-p4B0", repnr := 1, size := 4, [128X[104X
    [4X[28X  stabilizer := "1 < C2", standardization := 1, transitivity := 1, [128X[104X
    [4X[28X  type := "perm" )[128X[104X
    [4X[25Xgap>[125X [27XAtlasProgram( "C4", 1 );[127X[104X
    [4X[28Xrec( groupname := "C4", [128X[104X
    [4X[28X  identifier := [ "C4", [ [ "priv", "C4G1-max1W1" ] ], 1 ], [128X[104X
    [4X[28X  program := <straight line program>, size := 2, standardization := 1,[128X[104X
    [4X[28X  subgroupname := "C2", version := "1" )[128X[104X
    [4X[25Xgap>[125X [27XAtlasProgram( "C4", "maxes", 1 );[127X[104X
    [4X[28Xrec( groupname := "C4", [128X[104X
    [4X[28X  identifier := [ "C4", [ [ "priv", "C4G1-max1W1" ] ], 1 ], [128X[104X
    [4X[28X  program := <straight line program>, size := 2, standardization := 1,[128X[104X
    [4X[28X  subgroupname := "C2", version := "1" )[128X[104X
    [4X[25Xgap>[125X [27XAtlasProgram( "C4", "maxes", 2 );[127X[104X
    [4X[28Xfail[128X[104X
    [4X[25Xgap>[125X [27XAtlasGenerators( "C4", 1 );[127X[104X
    [4X[28Xrec( contents := "priv", generators := [ (1,2,3,4) ], [128X[104X
    [4X[28X  groupname := "C4", id := "", [128X[104X
    [4X[28X  identifier := [ "C4", [ [ "priv", "C4G1-p4B0.m1" ] ], 1, 4 ], [128X[104X
    [4X[28X  isPrimitive := false, p := 4, rankAction := 4, [128X[104X
    [4X[28X  repname := "C4G1-p4B0", repnr := 1, size := 4, [128X[104X
    [4X[28X  stabilizer := "1 < C2", standardization := 1, transitivity := 1, [128X[104X
    [4X[28X  type := "perm" )[128X[104X
    [4X[25Xgap>[125X [27XAtlasGenerators( "C4", 2 );[127X[104X
    [4X[28Xrec( contents := "priv", dim := 1, generators := [ [ [ E(4) ] ] ], [128X[104X
    [4X[28X  groupname := "C4", id := "a", [128X[104X
    [4X[28X  identifier := [ "C4", [ [ "priv", "C4G1-Ar1aB0.g" ] ], 1, 1 ], [128X[104X
    [4X[28X  repname := "C4G1-Ar1aB0", repnr := 2, ring := GaussianRationals, [128X[104X
    [4X[28X  size := 4, standardization := 1, type := "matalg" )[128X[104X
    [4X[25Xgap>[125X [27XAtlasGenerators( "C4", 3 );[127X[104X
    [4X[28Xfail[128X[104X
    [4X[25Xgap>[125X [27XAtlasProgram( "C4", "other", "test" );[127X[104X
    [4X[28Xrec( groupname := "C4", [128X[104X
    [4X[28X  identifier := [ "C4", [ [ "priv", "C4G1-XtestW1" ] ], 1 ], [128X[104X
    [4X[28X  program := <straight line program>, standardization := 1, [128X[104X
    [4X[28X  version := "1" )[128X[104X
  [4X[32X[104X
  
  [33X[0;0YWe can restrict the data shown by [2XDisplayAtlasInfo[102X ([14X3.5-1[114X) to our extension,
  as follows.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XDisplayAtlasInfo( "contents", "priv" );[127X[104X
    [4X[28Xgroup | # | maxes | cl | cyc | out | fnd | chk | prs[128X[104X
    [4X[28X------+---+-------+----+-----+-----+-----+-----+----[128X[104X
    [4X[28XA5*   | 1 |       |    |     |     |     |     |    [128X[104X
    [4X[28XC4*   | 2 |     1 |    |     |   2 |     |     |    [128X[104X
  [4X[32X[104X
  
  [33X[0;0YFor  checking the data in the extension, we apply the relevant sanity checks
  (see Section [14X7.9[114X).[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XAGR.Test.Words( "priv" );[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27XAGR.Test.FileHeaders( "priv" );[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27XAGR.Test.Files( "priv" );[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27XAGR.Test.BinaryFormat( "priv" );[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27XAGR.Test.Primitivity( "priv" : TryToExtendData );[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27XAGR.Test.Characters( "priv" : TryToExtendData );[127X[104X
    [4X[28X#I  AGR.Test.Character:[128X[104X
    [4X[28X#I  add new info[128X[104X
    [4X[28X["CHAR",["A5","A5G1-p60B0",[128X[104X
    [4X[28X0,[1,[2,3],[3,3],[4,4],[5,5]],"1a+3a^3b^3+4a^4+5a^5"]],[128X[104X
    [4X[28X#I  AGR.Test.Character:[128X[104X
    [4X[28X#I  add new info[128X[104X
    [4X[28X["CHAR",["C4","C4G1-p4B0",0,[1,2,3,4],"1abcd"]],[128X[104X
    [4X[28Xtrue[128X[104X
  [4X[32X[104X
  
  [33X[0;0YWe did not store the character information in the file [11Xprivdir/toc.json[111X, and
  [5XGAP[105X   was   able   to   identify  the  characters  of  the  two  permutation
  representations.  (The  identification  of  the  character  for  the  matrix
  representation  fails  because  we cannot distinguish between the two Galois
  conjugate faithful characters.)[133X
  
  [33X[0;0YIf  we  store the character information as proposed by [5XGAP[105X, this information
  will    for    example    become   part   of   the   records   returned   by
  [2XOneAtlasGeneratingSetInfo[102X ([14X3.5-6[114X). (Note that we have to enter [10X"priv"[110X as the
  last  argument of [10XAGR.CHAR[110X when we call the function interactively, in order
  to assign the information to the right context.)[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XAGR.CHAR("A5","A5G1-p60B0",[127X[104X
    [4X[25X>[125X [27X0,[1,[2,3],[3,3],[4,4],[5,5]],"1a+3a^3b^3+4a^4+5a^5", "priv" );[127X[104X
    [4X[25Xgap>[125X [27XAGR.CHAR("C4","C4G1-p4B0",0,[1,2,3,4],"1abcd", "priv" );[127X[104X
    [4X[25Xgap>[125X [27XAGR.Test.Characters( "priv" );[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27XOneAtlasGeneratingSetInfo( "C4" );[127X[104X
    [4X[28Xrec( charactername := "1abcd", constituents := [ 1, 2, 3, 4 ], [128X[104X
    [4X[28X  contents := "priv", groupname := "C4", id := "", [128X[104X
    [4X[28X  identifier := [ "C4", [ [ "priv", "C4G1-p4B0.m1" ] ], 1, 4 ], [128X[104X
    [4X[28X  isPrimitive := false, p := 4, rankAction := 4, [128X[104X
    [4X[28X  repname := "C4G1-p4B0", repnr := 1, size := 4, [128X[104X
    [4X[28X  stabilizer := "1 < C2", standardization := 1, transitivity := 1, [128X[104X
    [4X[28X  type := "perm" )[128X[104X
  [4X[32X[104X
  
  [33X[0;0YA  string  that describes the JSON format overview of the data extension can
  be created with [2XStringOfAtlasTableOfContents[102X ([14X5.1-3[114X).[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XPrint( StringOfAtlasTableOfContents( "priv" ) );[127X[104X
    [4X[28X{[128X[104X
    [4X[28X"ID":"priv",[128X[104X
    [4X[28X"Data":[[128X[104X
    [4X[28X["GNAN",["C4","C4"]],[128X[104X
    [4X[28X[128X[104X
    [4X[28X["GRS",["C4",4]],[128X[104X
    [4X[28X[128X[104X
    [4X[28X["MXN",["C4",1]],[128X[104X
    [4X[28X[128X[104X
    [4X[28X["MXO",["C4",[2]]],[128X[104X
    [4X[28X[128X[104X
    [4X[28X["MXS",["C4",["C2"]]],[128X[104X
    [4X[28X[128X[104X
    [4X[28X["RNG",["C4G1-Ar1aB0","CF(4)"]],[128X[104X
    [4X[28X[128X[104X
    [4X[28X["API",["A5G1-p60B0",[1,60,"imprim","1 < S3"]]],[128X[104X
    [4X[28X["API",["C4G1-p4B0",[1,4,"imprim","1 < C2"]]],[128X[104X
    [4X[28X[128X[104X
    [4X[28X["CHAR",["A5","A5G1-p60B0",0,[1,[2,3],[3,3],[4,4],[5,5]],"1a+3a^3b^3+4\[128X[104X
    [4X[28Xa^4+5a^5"]],[128X[104X
    [4X[28X["CHAR",["C4","C4G1-p4B0",0,[1,2,3,4],"1abcd"]][128X[104X
    [4X[28X][128X[104X
    [4X[28X}[128X[104X
  [4X[32X[104X
  
  [33X[0;0YIf  we prescribe a [10X"DataURL"[110X component that starts with [10X"http"[110X then also the
  [10X"TOC"[110X lines are listed, in order to enable remote access to the data.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XPrint( StringOfAtlasTableOfContents([127X[104X
    [4X[25X>[125X [27X              rec( ID:= "priv", DataURL:= "http://someurl" ) ) );[127X[104X
    [4X[28X{[128X[104X
    [4X[28X"ID":"priv",[128X[104X
    [4X[28X"DataURL":"http://someurl",[128X[104X
    [4X[28X"Data":[[128X[104X
    [4X[28X["GNAN",["C4","C4"]],[128X[104X
    [4X[28X[128X[104X
    [4X[28X["GRS",["C4",4]],[128X[104X
    [4X[28X[128X[104X
    [4X[28X["MXN",["C4",1]],[128X[104X
    [4X[28X[128X[104X
    [4X[28X["MXO",["C4",[2]]],[128X[104X
    [4X[28X[128X[104X
    [4X[28X["MXS",["C4",["C2"]]],[128X[104X
    [4X[28X[128X[104X
    [4X[28X["TOC",["perm","A5G1-p60B0.m",[118815263,24584221]]],[128X[104X
    [4X[28X["TOC",["matalg","C4G1-Ar1aB0.g",[49815028]]],[128X[104X
    [4X[28X["TOC",["otherscripts","C4G1-XtestW1",[-27672877]]],[128X[104X
    [4X[28X["TOC",["out","C4G1-a2W1",[126435524]]],[128X[104X
    [4X[28X["TOC",["maxes","C4G1-max1W1",[-27672877]]],[128X[104X
    [4X[28X["TOC",["perm","C4G1-p4B0.m",[102601978]]],[128X[104X
    [4X[28X[128X[104X
    [4X[28X["RNG",["C4G1-Ar1aB0","CF(4)"]],[128X[104X
    [4X[28X[128X[104X
    [4X[28X["API",["A5G1-p60B0",[1,60,"imprim","1 < S3"]]],[128X[104X
    [4X[28X["API",["C4G1-p4B0",[1,4,"imprim","1 < C2"]]],[128X[104X
    [4X[28X[128X[104X
    [4X[28X["CHAR",["A5","A5G1-p60B0",0,[1,[2,3],[3,3],[4,4],[5,5]],"1a+3a^3b^3+4\[128X[104X
    [4X[28Xa^4+5a^5"]],[128X[104X
    [4X[28X["CHAR",["C4","C4G1-p4B0",0,[1,2,3,4],"1abcd"]][128X[104X
    [4X[28X][128X[104X
    [4X[28X}[128X[104X
  [4X[32X[104X
  
  [33X[0;0YFinally,  we [21Xuninstall[121X our extension, and reset the info level that had been
  set  to  [22X1[122X  in  the  beginning. (Also the group name [10XC4[110X is removed this way,
  which  is  an  advantage  of  using  a  [11Xtoc.json[111X  file over calling [10XAGR.GNAN[110X
  directly.),[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XAtlasOfGroupRepresentationsForgetData( "priv" );[127X[104X
    [4X[25Xgap>[125X [27XSetInfoLevel( InfoAtlasRep, locallevel );[127X[104X
  [4X[32X[104X
  
  [33X[0;0YWe need not care about removing the temporary directory and the files in it.
  [5XGAP[105X   will   try  to  remove  directories  created  with  [2XDirectoryTemporary[102X
  ([14XReference: DirectoryTemporary[114X) at the end of the [5XGAP[105X session.[133X
  
