Version 0.1.028 (released November 9th, 2016)
This release includes dozens of fixes and features in response to feedback on the Panorama X forum. Thank you to everyone for your incredible engagement and participation over the past few weeks. In addition to the programming work, this release also includes about 250 pages of new documentation, with over 400 illustrations and animations. In fact, the documentation for graphic editing is now about half done. Here are the new pages.

- Adjusting Object Spacing -- adjust the spacing between multiple selected objects so that the same amount of space is in between each pair of objects.
- adjustobjectspacing -- The adjustobjectspacing statement adjusts the spacing of selected objects in a form.
- adjustobjectspacingdialog -- The adjustobjectspacingdialog statement opens a dialog sheet to adjust the spacing of the currently selected objects.
- Aligning Objects -- so that two or more object edges are made even with each other.
- Automatic Form Construction -- creates a column of form elements for editing data fields (or variables).
- Automatic Mailing Label Construction -- creates a mailing label.
- Automatic Report Construction -- creates a tabular report with columns of data.
- Cocoa Objects -- discussion of how objects are implemented in Panorama X compared to earlier versions
- Creating a New Form Object -- with the Object Library.
- Data Button Object -- is used to create checkboxes and radio buttons.
- Displaying Data in a Grid -- fundamentals of displaying data in a grid (Text List/Matrix).
- Duplicating Objects -- to make copies of one or more objects.
- Fixed Image Object -- is used for fixed images (images that never change).
- Fonts -- setting the font and text size of form text objects.
- Form Object Appearance -- changing the color, fill, stroke, opacity and drop shadow attributes of selected objects.
- Form Object Blueprint -- display and edit raw object specifications
- Form Object Code -- associating programming code with an object
- Graphics Mode -- is used to edit the graphic design of a form.
- Grouping Objects -- allows you to manipulate multiple objects as if they were a single object.
- Image Display Animations -- animated images.
- Image Display Colors and Gradients -- displaying pure colors and gradients
- Image Display Data Buttons -- checkboxes and radio buttons created from custom images.
- Image Display Object -- is used for dynamic images (images that change depending on the data).
- Image Display Push Buttons -- push buttons created from custom images.
- Line Item Grid Constructor -- creates a grid of form elements for displaying and editing line item fields.
- Line Object -- draws a line within a form.
- Matrix Clicking -- handling clicks in a Matrix Object.
- Matrix Constructor -- quickly creating a Matrix Object from a template.
- Matrix Database Integration -- synchronizing a Matrix Object with a database.
- Matrix Geometry -- customizing the size and geometry of Matrix Object elements.
- Matrix Header and Horizontal Scrolling -- setting up a custom header for a Matrix Object grid.
- Matrix Object Frame -- setting up the arrangement of items within a Matrix Object.
- Matrix Object -- displaying a grid of items with a custom arrangement.
- Object Inspector Panel -- is used to view and modify the attributes of selected objects in a form.
- Object Library -- is used to create new objects in a form.
- Oval Object -- draws an oval or circle within a form.
- Polygon Object -- draws a polygon within a form.
- Popup Menu Button Object -- is used to create popup menus anywhere on a form.
- Push Button Object -- triggers a procedure when it is pushed.
- Rectangle Object -- draws a rectangle or square within a form.
- Report Tile Object -- component for assembling a custom report.
- Rich Text -- is used to display styled text, including bold, italic, colors, tabs, even images.
- Rounded Rectangle Object -- draws a rectangle with round corners within a form.
- Scroll Bar Object -- is used to create scroll bars.
- Segmented Button Object -- is used to created segmented buttons.
- Selecting Form Objects -- so that they can be modified.
- Slider Object -- is used to create sliders and knobs.
- Smart Resize -- adjusts the sizes and locations of the other selected objects to match the change of one object.
- Star Object -- draws a star within a form.
- Stepper Object -- is used to create numeric steppers for use with Text Editor objects.
- Tab Panel Appearance -- appearance options for a Tab Panel Object.
- Tab Panel Buttons and Selection -- button options for a Tab Panel Object.
- Tab Panel Constructor -- quickly creating a Tab Panel Object from a template.
- Tab Panel Content -- setting up the content for a Tab Panel Object.
- Tab Panel Forms -- setting up the forms for a Tab Panel Object.
- Tab Panel Object -- switchable tab panels.
- Text Display Object -- is used to display text using a formula.
- Text Editor Object -- is used to edit text in a field or variable.
- Text Label Object -- displays a short, fixed, text item within a form.
- Text List Appearance -- customizing the appearance of a Text List Object.
- Text List Constructor -- quickly creating a Text List Object from a template.
- Text List Database Integration -- synchronizing a Text List Object with a database.
- Text List Multiple Columns -- displaying multiple columns in a Text List Object
- Text List Object -- displaying a grid of text.
- Text List Programming -- programming a Text List Object.
- Text List Searching -- searching within a Text List Object.
- Text List Selection -- selecting items in a Text List Object.
- Text Object Background Color/Gradient -- text object background colors and gradients.
- Web Browser Object -- is used to display web pages from within a Panorama form.

Here are the changes to the code itself.

- Implemented the Choice Palette for editing data with radio buttons instead of text editing. Unlike Panorama 6, the arrangement is always vertical, it does not arrange buttons horizontally. Also, manually edited exception values are not allowed.

- Added the ability to change the Data Sheet text size via menus (Window>Text Size) and the size statement.

- Added new Font Awesome Icons wizard in Help menu. It’s really cool, check it out! Also upgraded included Font Awesome to 4.7 with 41 new icons (675 total).

- Now automatically loads custom statements from any databases found in `/Application Support/PanoramaX/Libraries/. You can put databases in that folder manually, or you can ask the View Organizer to create one for you with the Libraries>Open User Name Custom Statements command. Later you can re-open with the same command, or with the Open View dialog or Open View wizard. Once you’ve created a library this way you can’t close it, the only way to get rid of it is to shut down Panorama and move it out of the folder. Procedures that are to be used as custom statements must have all UPPER CASE names. They can optionally have a comment block at the top that identifies the parameters, if that is present, Panorama X will check the number of parameters when the statement is used.

- Implemented the RegisterCustomFunction statement. This function now allows the same function to be defined multiple times with different numbers of parameters.

- New special procedure in custom statement libraries – .InitalizeFunctions. Any code in this procedure will be run automatically when Panorama starts up, and also when the Libraries>Register Functions and Libraries command in the View Organizer is used.

- Implemented the printonemultiple statement.

- Rich text now has new tags `</color>`, `</bgcolor>`, `</font>` and `</size>`. These set the text size back to the previous color, background color, or font. You could do this before with the `<style></style>` tags but this is much simpler.

- A Text Display Object in Literal Mode now support substitution of `«page#»` and `«date: pattern»` tags. For the `«date: pattern»` tag, only the patterns listed on page 1103 of the Panorama 6 Handbook are supported. If some other unusual pattern is desired, this has to be done with a formula substitution and the datepattern( function.

- Panorama now honors the system preferences for the first day of the week. There is a new function, firstdayofweek(, that can be used to determine the users preference. The week1st( function now returns whatever day the user specified as the first day, and group by week also uses the specified first day of the week. Changes take effect immediately when the system preferences are changed, you don’t have to quit and relaunch Panorama.

- The Favorites dialog sheet now works correctly (in the Find/Select, Sort and other dialogs) – you can select favorites to edit or delete them.

- Line item formulas and procedures no longer needed to be repeated for item 1, 2, 3, etc. Just make sure that there is a formula and/or procedure for item 1, and it will be used for all line items – you can leave the formulas and/or procedures for line items 2, 3, 4, etc. blank. This makes it a lot easier for editing, you only have to edit once.

- Double clicking on a field title in data sheet now toggles field properties panel.

- Adjusted Records menu so that the Delete All Records command is more clear (changed name from Delete All), also rearranged menu so that this is the last command and is less likely to be selected accidentally.

- The Find & Open dialog now shows databases that are currently open in violet instead of black. Thanks to Gary Yonaites for this suggestion and the actual code!

- Changed the Panorama X Video Training link in the Help menu to the faq/training page on provue.com instead of directly to Vimeo.

- Added Sample Data submenu to Text Import wizard’s Import Data menu.

- Text Editor Object now draws Bezel border correctly even when the object fill mode is set to Outline. This also fixes bug that borders weren’t drawn correctly in the Find/Select and Morph dialogs.

- Deleting form objects now works correctly in a form that contains group objects, even if the group contains buttons, text objects, etc. The group objects no longer disappear.

- Fixed formula parsing precedence problem. Problem occured when two or more low priority operators were followed by a higher priority operator, for example `a>b+c and x` would incorrectly be parsed as if it was `a>(b+c and x)`.

- The Text Import wizard now correctly handles tab separated data that contain commas in the data.

- Import statements (and the Text Import wizard) now set the current record to the first record of the imported data.

- The importtext statement now correctly imports empty lines in the text as blank database records

- Fixed exportline( so that carriage returns and line feeds are exported as vertical tabs, and fixed importtext and importline so that vertical tabs are imported as carriage returns.

- Performance enhancement for display update when all fields have changed, for example when moving up or down between records.

- Fixed Select All in View-As-List forms.

- If user selects File>Database Options when there is no open database, they now get a polite notification instead of an error message.

- Added a menu item Objects>Clear All Tab Panels in Graphics Mode that removes the contents of all tab panels on the current form, including any “orphan” tab panel objects (orphans can be caused by moving or deleting tab panel objects). Also added an optional tool bar item that does the same thing.

- In situations where a string is being interpreted as a boolean, “–1” will be interpreted as true, in fact, for any case where `val(SomeText)` is true, `SomeText` will also be true.

- Fixed the definehotkeys statement so that all numeric keys can be used, before, only 1 and 7 worked.

- For compatibility with Panorama 6, the Field statement now has the alias Column, while the FormulaFill statement now has the alias Equation.

- Fixed setwindow statement so that it will work correctly if the last parameter (options) was ommitted.

- Fixed splitmenutrigger statement, it seems to have gotten lost at some point.

- Now properly generates an error message for a procedure with a case statement but no endcase statement.

- Fixed initial selection in Find & Open dialog.

- Fixed runtime error in opendatabase statement if database was already open but had no open windows.

- The openfile statement will now open any saved windows if used when the database is open but with no visible windows. However, this is only for the openfile statement, not for the opendatabase statement, and not if the Find>Open dialog is used.

- ImportDatabase statement was leaving openrecord locked at last record of imported data (until something else was edited).

- Improved thread safety of `LRUCache:cacheObject` method. In real world terms, this reduces the likelyhood of a crash or hang when searching.

- Fixed saveallprocedures so that it correctly generates a Panorama X dictionary.

- The newformobject statement now tolerates blanks in class name of new object.

Brand new features and documentation in this release (features that were not included in Panorama 6):

- Automatic Mailing Label Construction -- creates a mailing label.
- Cocoa Objects -- discussion of how objects are implemented in Panorama X compared to earlier versions
- firstdayofweek( -- The firstdayofweek( function returns the user's preference for first day of the week.
- Font Awesome Icons -- are over 600 ready-made icons built right into Panorama.
- Fonts -- setting the font and text size of form text objects.
- Form Object Appearance -- changing the color, fill, stroke, opacity and drop shadow attributes of selected objects.
- Form Object Blueprint -- display and edit raw object specifications
- Form Object Code -- associating programming code with an object
- Segmented Button Object -- is used to created segmented buttons.
- Slider Object -- is used to create sliders and knobs.
- Stepper Object -- is used to create numeric steppers for use with Text Editor objects.

Features implemented in this release that work differently than they did in Panorama 6.

- Automatic Form Construction -- creates a column of form elements for editing data fields (or variables).
- Creating a New Form Object -- with the Object Library.
- Creating a New Form -- creating a new empty form, or a duplicate of an existing form.
- printonemultiple -- The printonemultiple statement prints a form over and over again without advancing from record to record. Instead of advancing from record to record, a variable is incremented each time the form is printed. This statement is designed for printing calendars or thumbnails.
- registercustomfunction -- The registercustomfunction statement defines a new custom function.
- Rich Text -- is used to display styled text, including bold, italic, colors, tabs, even images.
- Scroll Bar Object -- is used to create scroll bars.
- Selecting Form Objects -- so that they can be modified.

Features implemented in this release that work exactly the same as they did in Panorama 6.

- Graphics Mode -- is used to edit the graphic design of a form.
- size -- The size statement changes the data sheet text size.

ALL features that were added or changed in this release:

- activegrid -- The activegrid statement manages the operation of a grid that controls a series of options.
- aggregate( -- The aggregate( function calculates an aggregate (sum (total), count, minimum, maximum or average) by scanning specified records in a database.
- arccos( -- The arccos( function calculates the inverse cosine of a numeric value.
- arcsin( -- The arcsin( function calculates the inverse sine of a numeric value.
- arctan( -- The arctan( function calculates the inverse tangent of a numeric value.
- arraybuild( -- The arraybuild( function builds an array by scanning a database and creating an array element for every record (including invisible records) in the database (see Text Arrays).
- arraybuild -- The arraybuild statement builds an array by scanning a database and creating an array element for every record (including invisible records) in the database (see Text Arrays).
- Automatic Form Construction -- creates a column of form elements for editing data fields (or variables).
- cloneobjects -- The cloneobjects statement duplicates objects in a form (with modifications).
- Cocoa Objects -- discussion of how objects are implemented in Panorama X compared to earlier versions
- constructlistmatrix -- The constructlistmatrix statement creates a text list or matrix in the current form.
- constructtabpanel -- The constructtabpanel statement creates a tab panel in the current form.
- Creating a New Form Object -- with the Object Library.
- dataarraybuild( -- The dataarraybuild( function builds a data array by scanning a database and creating an array element for every record (including invisible records) in the database (see Data Arrays).
- dayofweek( -- The dayofweek( function computes the day of the week, with Sunday being 0, Monday 1, etc.
- degree -- The degree statement tells Panorama that all angles input to and calculated in trigonometric functions are in degrees rather than radians.
- displaydata -- The displaydata statement will display data in a large dialog with a scroll bar.
- farcallwithin -- The farcallwithin statement allows a procedure to call a mini-procedure within a separate procedure in a different database as a subroutine.
- firstdayofweek( -- The firstdayofweek( function returns the user's preference for first day of the week.
- Form Object Code -- associating programming code with an object
- formulasum -- The formulasum statement calculates a total by scanning a database, returning the accumulated sum of evaluating a formula over and over again for each scanned record.
- formulavalue -- The formulavalue statement calculates the result of a formula. Usually this is done with an assignment statement (for example `x=2 * y` ), but the formulavalue statement gives you more flexibility. You can specify what database is to be used for the calculation (an assignment statement always uses the current database) and you can specify the formula using a variable, making it easy to change on the fly. This statement also gives you more control over how errors are handled.
- formxy -- The formxy statement programmatically scrolls a form to a new position.
- getclick -- The getclick statement returns the location of the mouse in global coordinates (coordinates from the top left corner of the screen).
- getlocalclick -- The getlocalclick statement returns the location of the most recent mouse click in local coordinates (coordinates from the top left corner of the current form).
- Graphics Mode -- is used to edit the graphic design of a form.
- groupup -- The groupup statement divides the database into groups, with a summary record at the end of each group. The groups are arranged in ascending order (low to high).
- h( -- The h( function extracts the horizontal position from a point (see point(, Graphic Coordinates).
- hex( -- The hex( function converts a text item containing a hexadecimal number into a standard number (decimal).
- hexbyte( -- The hexbyte( function converts a limited range of decimal numbers to a two-digit hexadecimal number expressed as a text string.
- hexlong( -- The hexlong( function converts a decimal number to an eight-digit hexadecimal number expressed as a text string
- hextobinary( -- The hextobinary( function converts a sequence of hexadecimal digits into a raw binary data value.
- hexword( -- The hexword( function converts a decimal number to a four-digit hexadecimal number expressed as a text string.
- hiddenfields( -- The hiddenfields( function returns a list of hidden fields in the curent data sheet window
- hide -- The hide statement temporarily disables the output of text and graphics.
- htmlarraytable -- The htmlarraytable statement generates an HTML table from an arrray.
- htmlbold( -- The htmlbold( function takes the text and adds `` and `` tags to it.
- htmldatatable -- The htmldatatable statement generates an HTML table from selected data in the current database.
- htmlextractimages -- The htmlextractimages statement extracts the image URLs from an HTML page.
- htmlformitemnames -- The htmlformitemnames statement returns a list of form input elements (INPUT tags, etc.) within an HTML page.
- htmlitalic( -- The htmlitalic( function takes the text and adds `` and `` tags to it.
- htmlrgbstr( -- The htmlrgbstr( function converts a color to text formatted as an HTML color.
- htmltablecell( -- The htmltablecell( function extracts the data from a cell in an HTML table.
- htmltablecellexists( -- The htmltablecellexists( function returns true if an HTML table contains the specified cell, false if it doesn't.
- htmltablecellraw( -- The htmltablecellraw( function extracts the data from a cell in an HTML table (including tags, if any).
- htmltablerow( -- The htmltablerow( function extracts the data from a row in an HTML table.
- htmltablerowraw( -- The htmltablerowraw( function extracts the raw data (including tags, if any) from a row in an HTML table.
- hue( -- The hue( function extracts the hue from a color.
- if -- The if statement decides what code to execute next.
- importcell( -- The importcell( function returns one cell of imported data.
- importdatabase -- The importdatabase statement imports data from another database into the current database.
- importdictprocedures -- The importdictprocedures statement converts source code exported by the ExportAllProcedures statement into a dictionary.
- importform -- The importform statement imports a form into a database.
- importjson -- The importjson statement imports a JSON array into the current database.
- importline -- The importline statement imports a line of text into the current record.
- importprocedure -- The importprocedure statement imports a procedure into a database.
- info("activeobject") -- The info("activeobject") function returns the name of the currently active text editor or word processor object (if any).
- info("defaultdatepattern") -- The info("defaultdatepattern") function returns the default date pattern used for displaying dates.
- info("error") -- The info("error") function returns the most recent error message.
- info("executeerrorsource") -- The info("executeerrorsource") function can be used in Error Handling code when an error occurs in code running via the execute statement or its siblings.
- info("found") -- The info("found") function returns true or false depending on whether the last find or next statement was successful.
- info("horizontalscrollbar") -- The info("horizontalscrollbar") function returns true if the current window's horizontal scrollbar is enabled, false if it is disabled.
- info("httpheaders") -- The info("httpheaders") function returns a dictionary with information about a just completed HTTP download.
- info("magicwindow") -- The info("magicwindow") function returns the name of the currently designated "magic window," if any.
- info("matrixclickedobject") -- The info("matrixclickedobject") function identifies which named object in a matrix was clicked on (if any).
- info("menuidentifier") -- The info("menuidentifier") function returns the identifier of the most recently chosen menu item (if any).
- info("modifiedfield") -- The info("modifiedfield") function returns the name of the field that was just modified.
- info("mouse") -- The info("mouse") function returns the current location of the mouse in screen relative coordinates.
- info("preferencedomains") -- The info("preferencedomains") function returns a carriage return delimited list of available preferences domains.
- info("printsequence") -- The info("printsequence") function returns the record sequence number of the record being printed.
- info("procedureselectedtext") -- The info("procedureselectedtext") function returns the selected source code in the current procedure window.
- info("runninghandler") -- The info("runninghandler") function returns true if the current procedure is running as a "handler" procedure.
- info("serverrecordid") -- The info("serverrecordid") function returns the unique ID number for the current record.
- info("toolbarvisible") -- The info("toolbarvisible") function returns true if the current window has a visible tool bar.
- info("trigger") -- The info("trigger") function returns information about how the current procedure was triggered.
- info("urltaskinfo") -- The info("urltaskinfo") function returns information about a just completed HTTP download.
- inrectangle( -- The inrectangle( function checks to see if a point is inside a rectangle.
- insertfield -- The insertfield statement inserts a new field into the database in front of the current field.
- integralpoint( -- The integralpoint( function converts point coordinates to integers.
- integralrectangle( -- The integralrectangle( function converts rectangle coordinates to integers.
- intersectionrectangle( -- The intersectionrectangle( function creates a rectangle by combining two rectangles. The new rectangle is the area where the two rectangles overlap (if any).
- jsonexport( -- The jsonexport( function converts a Panorama dictionary or data array into JSON.
- jsonexportline( -- The jsonexportline( function exports the current database record in JSON format.
- lastline( -- The lastline( function extracts the last line from the text.
- lastlookupdatabase( -- The lastlookupdatabase( function returns the name of the database referenced in the most recent lookup.
- left -- The left statement makes the previous field active in the active window.
- like -- The like operator checks to see if the text on the left matches the wildcard pattern specified on the right.
- limit( -- The limit( function checks to see if a value is between a minimum and maximum value. If it is, the value is returned unchanged. If it is below the minimum, the minimum value is returned. If it is above the maximum the maximum value is returned.
- linecount( -- The linecount( function counts the number of carriage return separated lines in the text.
- lineitemarray( -- The lineitemarray( function converts the data in a set of line item fields into a text array (see Text Arrays).
- linesnotcontain( -- The linesnotcontain( function is the reverse of the linescontain( function.
- linesort( -- The linesort( function sorts lines of text in ascending order.
- listfiles( -- The listfiles( function builds a text array listing the files in a folder.
- littleendian( -- The littleendian( function returns true if Panorama is running on a "little endian" processor.
- littleendianbinaryvalue( -- The littleendianbinaryvalue( function converts little endian binary data (a byte, word, longword, or longlongword) into an unsigned number (see Binary Data).
- loadurl( -- The loadurl( function loads a resource from the internet.
- loadurl -- The loadurl statement loads a resource from the internet.
- localvalue( -- The localvalue( function returns the value of a local variable.
- log( -- The log( function computes the natural logarithm (base e ) of a value.
- log10( -- The log10( function computes the common logarithm (base 10) of a value.
- longlongwordarray( -- The longlongwordarray( function extracts a value from an array of 64 bit longlongwords (see [Binary Data]).
- longtimestr( -- The longtimestr( function converts a number to text in am/pm time format, including seconds.
- lookup( -- The lookup( function searches a database for a value, then returns other information from the same record. For example, the lookup( function can look up a phone number given a customer name, or look up a price given a part number.
- lookupall( -- The lookupall( function builds a text array containing one item for every record in the target database where the data in the keyField matches the keyData. Each item in the text array contains the value extracted from the dataField for that record. If the data field is a numeric or date field, it is converted to text using the default patterns for that field.
- lookupalldouble( -- The lookupalldouble( function is similar to the lookupall( function, but it returns two fields from the target database instead of just one.
- lookupalloctet( -- The lookupalloctet( function is similar to the lookupall( function, but it returns eight fields from the target database instead of just one.
- lookupallquadruple( -- The lookupallquadruple( function is similar to the lookupall( function, but it returns four fields from the target database instead of just one.
- lookupallquintuplet( -- The lookupallquintuplet( function is similar to the lookupall( function, but it returns five fields from the target database instead of just one.
- lookupallseptuplet( -- The lookupallseptuplet( function is similar to the lookupall( function, but it returns seven fields from the target database instead of just one.
- lookupallsextet( -- The lookupallsextet( function is similar to the lookupall( function, but it returns six fields from the target database instead of just one.
- lookupalltriple( -- The lookupalltriple( function is similar to the lookupall( function, but it returns three fields from the target database instead of just one.
- lookuplast( -- The lookuplast( function searches the selected records in a database for a value, then returns other information from the same record. For example, the lookuplast( function can look up a phone number given a customer name, or look up a price given a part number. Unlike the lookup( function which searches from the top of the database, the lookuplast( function searches backwards from the bottom.
- lookuplastselected( -- The lookuplastselected( function searches the selected records in a database for a value, then returns other information from the same record. For example, the lookuplastselected( function can look up a phone number given a customer name, or look up a price given a part number. Unlike the lookupselected( function which searches from the top of the database, the lookuplastselected( function searches backwards from the bottom.
- lookupmoredata( -- The lookupmoredata( function looks up an additional data field based on the previous lookup.
- lookupmoreformula( -- The lookupmoreformula( function looks up additional data based on a previous lookup.
- lookupselected( -- The lookupselected( function searches the selected records in a database for a value, then returns other information from the same record. For example, the lookupselected( function can look up a phone number given a customer name, or look up a price given a part number.
- loop -- The loop statement is used at the beginning of a loop.
- looparray -- The looparray statement is used at the beginning of a loop that loops over the elements of an array.
- loopdataarray -- The loopdataarray statement is used at the beginning of a loop that loops over the elements of a data array.
- loopwhile -- The loopwhile statement is used at the beginning of a loop.
- lower( -- The lower( function converts text to lower case.
- macoscomputername -- The macoscomputername statement returns the name of this computer.
- magicformwindow -- The magicformwindow statement designates an open window as the temporary active window for the purposes of info( functions and graphic statements.
- makeabsolutepath -- The makeabsolutepath statement converts a relative path (relative to the current database) to an absolute path.
- makefileglobals -- The makefileglobals statement creates one or more fileglobal variables, and assigns a value to each new variable.
- makefolder -- The makefolder statement creates a new folder, and if necessary, also creates any enclosing folders needed to create the specified new folder.
- makeglobals -- The makeglobals statement creates one or more global variables, and assigns a value to each new variable.
- makelocals -- The makelocals statement creates one or more local variables, and assigns a value to each new variable.
- makemergeformula( -- The makemergeformula( function builds a formula from an “auto-wrap" style merge template.
- makemergeformula -- The makemergeformula statement makes a formula from a template.
- makenewform -- The makenewform statement creates a new form in the current database.
- makesecret -- The makesecret statement makes the current database disappear, while leaving it open in memory.
- match -- The match operator checks to see if the text on the left matches the wildcard pattern specified on the right.
- matchexact -- The matchexact operator checks to see if the text on the left matches the wildcard pattern specified on the right.
- matrixclick -- The matrixclick statement will run the code belonging to an object that was clicked within a matrix frame.
- max( -- The max( function compares a series of values and returns the largest value.
- maximum -- The maximum statement calculates the maximum and sub-maximums for the current field.
- menu( -- The menu( function creates a menu (see Custom Menus).
- menuseparator( -- The menuseparator( function generates a menu item separator
- mergefieldsdialog -- The mergefieldsdialog statement opens the standard Merge Fields dialog.
- message -- The message statement displays a modal alert window with a message.
- min( -- The min( function compares a series of values and returns the smallest value.
- minimum -- The minimum statement calculates the minimum and sub-minimums for the current field.
- mod -- The mod operator computes the remainder (modulo) after integer division.
- monthlength( -- The monthlength( function computes the length (number of days) of a month.
- monthmath( -- The monthmath( function takes a date and computes the date that is one or more months before or after the original date.
- movefieldbefore -- The movefieldbefore statement moves the current field to a new position.
- newformobject -- The newformobject statement creates a new graphic object in a form.
- newformusingblueprint -- The newformusingblueprint statement creates a new form from a blueprint.
- newsearchgadget -- The newsearchgadget statement creates a search gadget in the current form.
- nextmatch -- The nextmatch statement locates the next visible record in the active database for which the condition specified in the most recent Find statement is true.
- noactionmenu( -- The noactionmenu( function suppresses the Action menu.
- noshow -- The noshow statement temporarily disables the output of text and graphics.
- not -- The not operator reverses a boolean value.
- notbetween( -- The notbetween( function checks to see if a value is not between two other values.
- notmatch -- The notmatch operator checks to see if the text on the left does not match the wildcard pattern specified on the right.
- now( -- The now( function returns the current time (number of seconds since midnight).
- nowizardmenu( -- The nowizardmenu( function suppresses the Wizards menu.
- noyes -- The noyes statement displays a modal alert window with a message and two buttons: No and Yes.
- nsnotify -- The nsnotify statement delivers a notification.
- nsrect( -- The nsrect( function defines a rectangle using the same parameter order as the Cocoa NSMakeRect( function.
- nsrectstr( -- The nsrectstr( function converts a rectangle into text in the format x,y,width,height
- nth( -- The nth( function converts a number into an ordinal.
- nthline( -- The nthline( function extracts the nth line from the text.
- object -- The object statement selects an object (based on the object name).
- objectid -- The objectid statement selects one graphic object in the current form based on an ID number.
- objectinfoarray( -- The objectinfoarray( function builds a text array of form object properties
- objectnumber -- The objectnumber statement identifies one graphic object from a set of selected graphic objects in the current form.
- obscuredigits( -- The obscuredigits( function obscures digits in a number (usually a credit card number) with Xs.
- onfailedresume -- The onfailedresume statement is used to setup a semi-graceful recovery if a resume statement fails because there was no pause statement.
- openanything -- The openanything statement opens a document or application.
- opendialog -- The opendialog statement opens a form from the current database as a modal dialog box.
- openfile -- The openfile statement opens a database file. It can also import data from a text file, another database, or a variable into the current database.
- openprocedure -- The openprocedure statement opens a procedure in the current database in a new window.
- openurl -- The openurl statement opens a URL (usually a web page or to create an e-mail message).
- openwizard -- The openwizard statement opens a wizard, just as it would be opened by selecting that wizard from the menubar.
- or -- The or operator returns true if either operand is true, or false if both are false.
- originalwindow -- The originalwindow statement goes back to the window remembered by the RememberWindow statement.
- os9( -- The os9( function returns true if running on OS 9.
- pagesetup -- The pagesetup statement displays the page setup dialog.
- parameter( -- The parameter( function is used to transfer data between a main procedure and a subroutine.
- parameterentity( -- The parameterentity( function returns the entity (field or variable) associated with a subroutine parameter, if any.
- pause -- The pause statement temporarily pauses a procedure.
- perlscriptstring( -- The perlscriptstring( function converts text into a Perl string literal.
- permanent -- The permanent statement creates one or more permanent variables.
- php -- The php statement executes a PHP script (program).
- pleaseselectall -- The pleaseselectall statement makes sure that all records are selected.
- pmt( -- The pmt( function (short for payment) calculates the periodic payment required to pay off a loan.
- point( -- The point( function combines vertical and horizontal co-ordinates into a single binary value that describes the position of a point (see Graphic Coordinates).
- popup -- The popup statement makes a pop-up menu appear anywhere on the screen.
- popupbelowbutton -- The popupbelowbutton statement displays a pop-up menu in response to clicking on a button.
- popupbynumber -- The popupbynumber statement makes a pop-up menu appear anywhere on the screen.
- post -- The post statement assigns a value to a field in another database.
- previousmatch -- The previousmatch statement locates the previous (closer to the top) visible record in the active database for which the condition specified in the most recent Find statement is true.
- print -- The print statement prints the database.
- printonemultiple -- The printonemultiple statement prints a form over and over again without advancing from record to record. Instead of advancing from record to record, a variable is incremented each time the form is printed. This statement is designed for printing calendars or thumbnails.
- printonerecord -- The printonerecord statement prints the the currently active record.
- progressalert -- The progressalert statement displays a progress alert if an operation is going to take a long time.
- progressbar -- The progressbar statement updates a progress bar on the current form.
- propagateup -- The propagateup statement fills all the empty cells in the current field. Each empty cell is filled with the value of the first non-empty cell below it.
- pv( -- The pv( function (short for present value) calculates the present value of an income or debit stream of payments.
- python -- The python statement executes a Python script (program).
- pythonconstant( -- The pythonconstant( function encodes text for use as a constant in a python program.
- quarter1st( -- The quarter1st( function computes the first day of a quarter.
- radian -- The radian statement tells Panorama that all angles in trigonometric functions should be calculated using radians rather than degrees.
- radix( -- The radix( function converts a text item containing a number in a radix between 2 and 36 into a decimal number.
- radixstr( -- The radixstr( function converts a number into a text item containing the equivalent number in a radix between 2 and 36.
- randomletter( -- The randomletter( function returns a random letter.
- rangenotmatch( -- The rangenotmatch( function returns false (0) if the text matches a specified range.
- rbottom( -- The rbottom( function extracts the position of the bottom edge of a rectangle (see rectangle(, Graphic Coordinates).
- recompile -- The recompile statement recompiles all procedures in a database.
- rectangle( -- The rectangle( function defines a rectangle from four dimensions.
- rectanglealign( -- The rectanglealign( function aligns a small rectangle at one of nine positions within a larger rectangle.
- rectanglesize( -- The rectanglesize( function defines a rectangle from its upper left hand corner and its height and width.
- rectanglesizestr( -- The rectanglesizestr( function converts a rectangle into text in the format top,left,height,width.
- rectangletweak( -- The rectangletweak( function transforms a rectangle by changing its position and/or size.
- red( -- The red( function extracts the red intensity from a color.
- regexarray( -- The regexarray( function applies a regular expression to a text value, then builds an array containing all of the substrings that match the regular expression (see Regular Expressions).
- regexarrayexact( -- The regexarrayexact( function applies a regular expression to a text value, then builds an array containing all of the substrings that match the regular expression (see Regular Expressions).
- regexliteral( -- The regexliteral( function adds \ characters to text as necessary so that it can be used as a literal in a regular expression.
- regexreplaceexact( -- The regexreplaceexact( function replaces text with new text. The text to be replaced is determined by a regular expression.
- regexreplacefirst( -- The regexreplacefirst( function replaces the first occurrence of a regular expression pattern with new text.
- regexreplacefirstexact( -- The regexreplacefirstexact( function replaces the first occurrence of a regular expression pattern with new text.
- regulardate( -- The regulardate( function extracts a regular date (number of days from January 1, 4713 B.C.) from a superdate.
- removesuffix( -- The removesuffix( function checks to see if a text item ends with a suffix. if it does, the suffix is removed.
- rep( -- The rep( function assembles a text item by repeating a smaller text item over and over again.
- repeatloopif -- The repeatloopif statement decides whether to continue with a loop or to start over again from the top.
- replace( -- The replace( function replaces text with new text.
- replacefirst( -- The replacefirst( function replaces the first occurence of some text with new text.
- replacemultiple( -- The replacemultiple( function replaces multiple words and phrases in a text value.
- replaceword( -- The replaceword( function replaces a word with a new word.
- replacewordexact( -- The replacewordexact( function replaces a word with a new word.
- resume -- The resume statement resumes a procedure that has been temporarily halted with the pause statement.
- return -- The return statement ends a subroutine.
- returnerror -- The returnerror statement passes an error back to the current subroutines calling procedure.
- revealinfinder -- The revealinfinder statement reveals a file or folder in the Finder.
- rgb( -- The rgb( function creates a color by combining red, green, and blue primary colors. See Colors.
- rheight( -- The rheight( function extracts the height of a rectangle (see rectangle(, Graphic Coordinates).
- richtextdata( -- The richtextdata( function adjusts text so that it will display properly in rich text even if it contains a < character.
- richtextdisplay( -- The richtextdisplay( function works with Text Display objects to display text with multiple styles, fonts, colors and alignments.
- rleft( -- The rleft( function extracts the position of the left edge of a rectangle (see rectangle(, Graphic Coordinates).
- rnd( -- The rnd( function generates a random number between 0 and 1.
- round( -- The round( function rounds a number to a specified increment.
- rright( -- The rright( function extracts the position of the right edge of a rectangle (see rectangle(, Graphic Coordinates).
- rtop( -- The rtop( function extracts the position of the top edge of a rectangle (see rectangle(, Graphic Coordinates).
- ruby -- The ruby statement executes a Ruby script (program).
- rubyconstant( -- The rubyconstant( function encodes a value for use as a constant in a Ruby program.
- runcustommenu -- The runcustommenu statement runs the *.CustomMenu* procedure.
- rundialog -- The rundialog statement uses a form as a template to display a modal dialog window. The statement supervises the operation of the dialog until it is closed.
- rundialogmenus -- The rundialogmenus statement enables custom menus in a modal dialog.
- runfieldsideeffects -- The runfieldsideeffects statement performs any side effects associated with the current field (calculations, procedures, etc.).
- runningdifference -- The runningdifference statement calculates the running difference for the current field.
- rwidth( -- The rwidth( function extracts the width of a rectangle (see rectangle(, Graphic Coordinates).
- saturation( -- The saturation( function extracts the saturation from a color.
- saveacopyas -- The saveacopyas statement saves a copy of the currently active file under a new name. The original database remains open in memory under its original name.
- saveallprocedures -- The saveallprocedures statement saves all the procedures in the specified database into a dictionary.
- saveas -- The saveas statement saves a copy of the currently active file under a new name. The original file remains unchanged.
- saveblueprint -- The saveblueprint statement save a blueprint of a database's structure.
- savedialog -- The savedialog statement displays a modal dialog that allows a user to specify the name and location of a new file.
- savefiledialog -- The savefiledialog statement pauses a procedure and displays the standard “save file” dialog.
- savelocalvariables -- The savelocalvariables statement saves local variables as a procedure.
- saveoneprocedure -- The saveoneprocedure statement saves a specific procedure in the specified database into a dictionary.
- saveopenprocedures -- The saveopenprocedures statement saves all the open procedures in the specified database into a dictionary.
- scriptbglog -- The scriptbglog statement specifies a path/file for output from STDOUT from embedded programs run in the background (Perl, Ruby, Python, PHP).
- scripttimeout -- The scripttimeout statement sets the maximum runtime allowed for an embedded program (AppleScript, ShellScript, Perl, Ruby or Python).
- search( -- The search( function searches through an item of text looking for a character, word or phrase. If it finds an exact match (including upper/lower case) with the character, word or phrase, it returns its position within the text item. If it does not find the character, word or phrase, it returns zero.
- searchanycase( -- The searchanycase( function searches through an item of text looking for a character, word or phrase. If it finds a match (upper/lower case may be different) with the character, word or phrase, it returns its position within the text item. If it does not find the character, word or phrase, it returns zero.
- select -- The select statement makes visible only those records for the active database for which the specified condition is true.
- selectadditional -- The selectadditional statement adds unselected records to a previously selected group if they match the true-false test.
- selectduplicatesnowarning -- The selectduplicatesnowarning statement selects records containing duplicate information in the database.
- Selecting Form Objects -- so that they can be modified.
- selectobjects -- The selectobjects statement uses a formula to select one or more objects in the current form.
- selectreverse -- The selectreverse statement makes every visible record invisible, and every invisible record visible.
- selectwithin -- The selectwithin statement uses a Boolean formula to exclude records from a previously selected group.
- sendarrayemail -- The sendarrayemail statement sends a single e-mail to multiple recipients.
- sendbulkemail -- The sendbulkemail statement sends a single e-mail to multiple recipients.
- set -- The set statement performs an assignment, much like an equals sign or the assign statement. However, the destination of the assignment can be calculated on the fly.
- setactivedatabase -- The setactivedatabase statement makes a database active (without changing the configuration of the windows).
- setbit( -- The setbit( function sets or clears one bit within a number, without disturbing any of the other bits.
- setdatabaseoptions -- The setdatabaseoptions statement modifies one or more properties of a database.
- setfield -- The setfield statement performs an assignment, much like an equals sign or the assign statement. However, the destination field of the assignment can be calculated on the fly.
- setfilevariable -- The setfilevariable statement sets the value of a fileglobal variable in another database.
- setformoptions -- The setformoptions statement modifies one or more properties of a form (name, viewing mode, etc.).
- setglobal -- The setglobal statement sets a value into a global variable. The name of the global variable is calculated on the fly.
- setlocal -- The setlocal statement sets a value into a local variable. The name of the local variable is calculated on the fly.
- setpreferencevalues -- The setpreferencevalues statement creates and/or modifies a preference value.
- setprocedureoptions -- The setprocedureoptions statement modifies one or more properties of a procedure (source code, Action menu options, etc.).
- setrectangleheight( -- The setrectangleheight( function changes the height of a rectangle, leaving the width unchanged.
- setrectanglesize( -- The setrectanglesize( function changes the height and width of a rectangle, leaving the position of the top left hand corner unchanged.
- setrectanglewidth( -- The setrectanglewidth( function changes the width of a rectangle, leaving the height unchanged.
- setrectedges -- The setrectedges statement changes the edges of the specified rectangle.
- setwindow -- The setwindow statement specifies the dimensions (size and location) of the next window that is opened (with openform, opensheet, openprocedure etc.).
- setwindowoptions -- The setwindowoptions statement changes the attributes of the current window (tool bar, scroll bars, etc.).
- setwindowrectangle -- The setwindowrectangle statement specifies the dimensions of the next window that is opened by a procedure.
- sha1( -- The sha1( function calculates the SHA-1 hash of a binary or text data item.
- shellscript( -- The shellscript( function executes a UNIX shell script and returns the result.
- shellscript -- The shellscript statement executes a UNIX shell script.
- shiftclick( -- The shiftclick( function returns true if the shift key was held down the last time the mouse was clicked.
- shortcall -- The shortcall statement allows a procedure to call a sequence of statements within the current procedure as a "mini-subroutine".
- showcolumns -- The showcolumns statement forces Panorama to display specified fields.
- showvariables -- The showvariables statement forces Panorama to update the display of one or more variables on every form in the active database.
- showwindowvariables -- The showwindowvariables statement forces Panorama to update the display of one or more variables in the currently active form.
- sin( -- The sin( function calculates the sine of an angle.
- sinh( -- The sinh( function calculates the hyperbolic sine of a numeric value.
- size -- The size statement changes the data sheet text size.
- sortdown -- The sortdown statement sorts the database by the current field. The database is sorted in descending order (high to low).
- sortdownwithin -- The sortdownwithin statement sorts the database by the current field, leaving any previous sorts intact. The database is sorted in descending order (high to low).
- sortup -- The sortup statement sorts the database by the current field. The database is sorted in ascending order (low to high).
- sortupwithin -- The sortupwithin statement sorts the database by the current field, leaving any previous sorts intact. The database is sorted in ascending order (low to high).
- soundex( -- The soundex( function computes a four character code that roughly corresponds to the phonetic pronunciation of the word.
- soundslike -- The soundslike operator compares two words to see if they "sound like" each other.
- speakdigitpairs -- The speakdigitpairs statement buffers up one or more digit pairs to be spoken later by the speaknow statement.
- speakdollarsandcents -- The speakdollarsandcents statement buffers up a dollar and cents amount to be spoken later by the speaknow statement.
- speechscripts -- The speechscripts statement returns a lists of speech scripts in a database.
- speedcopy -- The speedcopy statement copies multiple adjacent fields from a record in one database to a record in another.
- splitlines -- The splitlines statement takes a chunk of text and splits it into two or more smaller chunks.
- splitmenutrigger -- The splitmenutrigger statement splits info("trigger") into separate menu name and menu item variables.
- sqr( -- The sqr( function calculates the square root of a value.
- standardactionmenu( -- The standardactionmenu( function generates a Custom Menu specification for Panorama's standard Action menu.
- standardeditmenu( -- The standardeditmenu( function generates a customizable Custom Menu specification for Panorama's standard Edit menu.
- standardfieldsmenu( -- The standardfieldsmenu( function generates a customizable Custom Menu specification for Panorama's standard Fields menu.
- standardfilemenu( -- The standardfilemenu( function generates a customizable Custom Menu specification for Panorama's standard File menu.
- standardhelpmenu( -- The standardhelpmenu( function generates a customizable Custom Menu specification for Panorama's standard Help menu.
- standardpanoramamenu( -- The standardpanoramamenu( function generates a Custom Menu specification for Panorama's standard Panorama menu.
- standardrecordsmenu( -- The standardrecordsmenu( function generates a customizable Custom Menu specification for Panorama's standard Records menu.
- standardsearchmenu( -- The standardsearchmenu( function generates a customizable Custom Menu specification for Panorama's standard Search menu.
- standardviewmenu( -- The standardviewmenu( function generates a Custom Menu specification for Panorama's standard View menu.
- standardwizardsmenu( -- The standardwizardsmenu( function generates a Custom Menu specification for Panorama's standard Wizards menu.
- startgraphicschange -- The startgraphicschange statement adds undo support to a procedure.
- starttimer -- The starttimer statement sets up and starts a repeating task that will be performed periodically when Panorama is not otherwise busy.
- state( -- The state( function returns the name of the state associated with a US zip code.
- statelookup( -- The statelookup( function converts a two letter abbreviation for a US state into the full state name.
- stop -- The stop statement stops all running procedures immediately.
- stopalert -- The stopalert statement displays a modal alert window with a warning icon, a message and one or more buttons.
- stoploopif -- The stoploopif statement decides whether to continue with a loop or to exit the loop immediately.
- str( -- The str( function converts a number into text, with no formatting.
- stringreverse -- The stringreverse statement reverses the characters in a string of text. The original text is replaced in situ.
- strip( -- The strip( function strips off leading and trailing blanks and other whitespace (carriage returns, tabs, etc.)
- stripchar( -- The stripchar( function extracts characters you don't want from a text item.
- stripdiacriticals( -- The stripdiacriticals( function strips diacritical marks from text.
- striphtmltags( -- The striphtmltags( function removes all HTML tags from the text.
- sum( -- The sum( function adds up all instances of a line item field in the current record.
- superarraybuild -- The superarraybuild statement scans a database to create a text array. This statement is is similar to arraybuild, but with a number of additional options (see Text Arrays).
- superchoicedialog -- The superchoicedialog statement will display a dialog with a list of choices that can be selected. You can control the size of the alert, as well as several appearance options. If the alert has more than one button, info("dialogtrigger") will contain the name of the button that was pressed.
- superdate( -- The superdate( function converts a regular date and a regular time into a superdate.
- superdatepattern( -- The superdatepattern( function converts a number containing a superdate to text, allowing you to specify the patterns for both the date and the time conversion to text.
- supergetpassword -- The supergetpassword statement will display a dialog with a text entry area for a password.
- supergettext -- The supergettext statement will display a dialog with a text entry area.
- superlookup( -- The superlookup( function searches a database for a record that matches a query formula, then uses a second formula to return other information from the same record. This is similar to the lookup( function, but instead of using an individual field for the key and data, any valid true/false (Boolean) formula can be used.
- table( -- The table( function searches a database for a value, then returns other information from the same record. Unlike the lookup( function, the table( function does not require an exact match. If it does not find an exact match the table( function will use the closest match. For example, the table( function can look up a tax rate given an income amount, or look up a shipping price given a zip code and weight.
- windowcornerinitialize -- The windowcornerinitialize statement shifts a window to an edge or corner of the main screen.
- windowtocorner -- The windowtocorner statement shifts a window to an edge or corner of the main screen.
- zoomwindowrectangle -- The zoomwindowrectangle statement modifies the size, location, and options of the current window.

See Also

- Version 0.1.001 (released July 7th, 2012) -- Summary of Version 0.1.001 (released 7/7/2012)
- Version 0.1.002 (released August 12th, 2012) -- Summary of Version 0.1.002 (released 8/12/2012)
- Version 0.1.003 (released December 2nd, 2012) -- Summary of Version 0.1.003 (released 12/2/2012)
- Version 0.1.004 (released December 10th, 2012) -- Summary of Version 0.1.004 (released 12/10/2012)
- Version 0.1.005 (released December 21st, 2012) -- Summary of Version 0.1.005 (released 12/21/2012)
- Version 0.1.006 (released December 26th, 2012) -- Summary of Version 0.1.006 (released 12/26/2012)
- Version 0.1.007 (released May 1st, 2013) -- Summary of Version 0.1.007 (released 5/1/2013)
- Version 0.1.008 (released May 22nd, 2013) -- Summary of Version 0.1.008 (released 5/22/2013)
- Version 0.1.009 (released July 9th, 2013) -- Summary of Version 0.1.009 (released 7/9/2013)
- Version 0.1.010 (released October 14th, 2013) -- Summary of Version 0.1.010 (released 10/14/2013)
- Version 0.1.011 (released December 6th, 2013) -- Summary of Version 0.1.011 (released 12/6/2013)
- Version 0.1.012 (released August 29th, 2015) -- Summary of Version 0.1.012 (released 8/29/2015)
- Version 0.1.013 (released September 6th, 2015) -- Summary of Version 0.1.013 (released 9/6/2015)
- Version 0.1.014 (released September 14th, 2015) -- Summary of Version 0.1.014 (released 9/14/2015)
- Version 0.1.015 (released September 29th, 2015) -- Summary of Version 0.1.015 (released 9/29/2015)
- Version 0.1.016 (released October 12th, 2015) -- Summary of Version 0.1.016 (released 10/12/2015)
- Version 0.1.017 (released November 11th, 2015) -- Summary of Version 0.1.017 (released 11/11/2015)
- Version 0.1.018 (released December 7th, 2015) -- Summary of Version 0.1.018 (released 12/7/2015)
- Version 0.1.019 (released January 28th, 2016) -- Summary of Version 0.1.019 (released 1/28/2016)
- Version 0.1.020 (released February 15th, 2016) -- Summary of Version 0.1.020 (released 2/15/2016)
- Version 0.1.021 (released February 29th, 2016) -- Summary of Version 0.1.021 (released 2/29/2016)
- Version 0.1.022 (released March 1st, 2016) -- Summary of Version 0.1.022 (released 3/1/2016)
- Version 0.1.023 (released May 27th, 2016) -- Summary of Version 0.1.023 (released 5/27/2016)
- Version 0.1.024 (released June 12th, 2016) -- Summary of Version 0.1.024 (released 6/12/2016)
- Version 0.1.025 (released July 21st, 2016) -- Summary of Version 0.1.025 (released 7/21/2016)
- Version 0.1.026 (released August 29th, 2016) -- Summary of Version 0.1.026 (released 8/29/2016)
- Version 0.1.027 (released September 18th, 2016) -- Summary of Version 0.1.027 (released 9/18/2016)
- Version 0.1.029 (released December 31st, 2016) -- Summary of Version 0.1.029 (released 12/31/2016)
- Version 0.1.030 (released February 12th, 2017) -- Summary of Version 0.1.030 (released 2/12/2017)
- Version 0.1.031 (released March 3rd, 2017) -- Summary of Version 0.1.031 (released 3/3/2017)
- Version 0.1.032 (released April 3rd, 2017) -- Summary of Version 0.1.032 (released 4/3/2017)
- Version 0.9 (released May 15th, 2017) -- Summary of Version 0.9 (released 5/15/2017)
- Version 0.9.001 (released July 18th, 2017) -- Summary of Version 0.9.001 (released 7/18/2017)
- Version 0.9.002 (released July 27th, 2017) -- Summary of Version 0.9.002 (released 7/27/2017)
- Version 0.9.003 (released September 10th, 2017) -- Summary of Version 0.9.003 (released 9/10/2017)
- Version 0.9.004 (released September 14th, 2017) -- Summary of Version 0.9.004 (released 9/14/2017)
- Version 0.9.005 (released September 19th, 2017) -- Summary of Version 0.9.005 (released 9/19/2017)
- Version 0.9.006 (released September 27th, 2017) -- Summary of Version 0.9.006 (released 9/27/2017)
- Version 0.9.007 (released October 3rd, 2017) -- Summary of Version 0.9.007 (released 10/3/2017)
- Version 0.9.008 (released October 12th, 2017) -- Summary of Version 0.9.008 (released 10/12/2017)
- Version 10.0.0 (released October 18th, 2017) -- Summary of Version 10.0.0 (released 10/18/2017)
- Version 10.0.01 (released December 10th, 2017) -- Summary of Version 10.0.01 (released 12/10/2017)
- Version 10.1 (released August 6th, 2018) -- Summary of Version 10.1 (released 8/6/2018)
- Version 10.1.1 (released August 30th, 2018) -- Summary of Version 10.1.1 (released 8/30/2018)
- Version 10.1.2 (released November 15th, 2018) -- Summary of Version 10.1.2 (released 11/15/2018)
- Version 10.2 (released October 7th, 2021) -- Summary of Version 10.2 (released 10/7/2021)