{"version":3,"file":"application_bsmart-c6a7b0c0.js","sources":["../../../node_modules/datatables.net/js/dataTables.mjs","../../../node_modules/datatables.net-buttons/js/dataTables.buttons.mjs","../../../node_modules/datatables.net-buttons/js/buttons.html5.mjs","../../../app/whitelabels/bsmart/assets/javascripts/organizations/localization.js","../../../app/whitelabels/bsmart/assets/javascripts/organizations/datatable.js","../../../app/whitelabels/bsmart/assets/javascripts/organizations/custom-select.js","../../../app/whitelabels/bsmart/assets/javascripts/organizations/forms.js","../../../app/whitelabels/bsmart/assets/javascripts/organizations/forms-activation.js","../../../app/whitelabels/bsmart/assets/javascripts/organizations/forms-import-teacher.js","../../../app/whitelabels/bsmart/assets/javascripts/custom.js","../../../app/whitelabels/bsmart/assets/javascripts/events.js","../../../app/whitelabels/bsmart/assets/javascripts/tutors/check_box_form.js","../../../app/whitelabels/bsmart/assets/javascripts/tutors/flash.js","../../../app/whitelabels/bsmart/assets/javascripts/tutors/login.js","../../../app/whitelabels/bsmart/assets/javascripts/tutors/custom.js","../../../app/whitelabels/bsmart/assets/javascripts/tableau/custom.js","../../../app/whitelabels/bsmart/assets/javascripts/school-modal.js","../../../app/whitelabels/bsmart/assets/javascripts/application.js","../../../app/frontend/entrypoints/application_bsmart.js"],"sourcesContent":["/*! DataTables 2.1.7\n * © SpryMedia Ltd - datatables.net/license\n */\n\nimport jQuery from 'jquery';\n\n// DataTables code uses $ internally, but we want to be able to\n// reassign $ with the `use` method, so it is a regular var.\nvar $ = jQuery;\n\n\nvar DataTable = function ( selector, options )\n{\n\t// Check if called with a window or jQuery object for DOM less applications\n\t// This is for backwards compatibility\n\tif (DataTable.factory(selector, options)) {\n\t\treturn DataTable;\n\t}\n\n\t// When creating with `new`, create a new DataTable, returning the API instance\n\tif (this instanceof DataTable) {\n\t\treturn $(selector).DataTable(options);\n\t}\n\telse {\n\t\t// Argument switching\n\t\toptions = selector;\n\t}\n\n\tvar _that = this;\n\tvar emptyInit = options === undefined;\n\tvar len = this.length;\n\n\tif ( emptyInit ) {\n\t\toptions = {};\n\t}\n\n\t// Method to get DT API instance from jQuery object\n\tthis.api = function ()\n\t{\n\t\treturn new _Api( this );\n\t};\n\n\tthis.each(function() {\n\t\t// For each initialisation we want to give it a clean initialisation\n\t\t// object that can be bashed around\n\t\tvar o = {};\n\t\tvar oInit = len > 1 ? // optimisation for single table case\n\t\t\t_fnExtend( o, options, true ) :\n\t\t\toptions;\n\n\t\t\n\t\tvar i=0, iLen;\n\t\tvar sId = this.getAttribute( 'id' );\n\t\tvar defaults = DataTable.defaults;\n\t\tvar $this = $(this);\n\t\t\n\t\t\n\t\t/* Sanity check */\n\t\tif ( this.nodeName.toLowerCase() != 'table' )\n\t\t{\n\t\t\t_fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t$(this).trigger( 'options.dt', oInit );\n\t\t\n\t\t/* Backwards compatibility for the defaults */\n\t\t_fnCompatOpts( defaults );\n\t\t_fnCompatCols( defaults.column );\n\t\t\n\t\t/* Convert the camel-case defaults to Hungarian */\n\t\t_fnCamelToHungarian( defaults, defaults, true );\n\t\t_fnCamelToHungarian( defaults.column, defaults.column, true );\n\t\t\n\t\t/* Setting up the initialisation object */\n\t\t_fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ), true );\n\t\t\n\t\t\n\t\t\n\t\t/* Check to see if we are re-initialising a table */\n\t\tvar allSettings = DataTable.settings;\n\t\tfor ( i=0, iLen=allSettings.length ; i').prependTo(this),\n\t\t\tfastData: function (row, column, type) {\n\t\t\t\treturn _fnGetCellData(oSettings, row, column, type);\n\t\t\t}\n\t\t} );\n\t\toSettings.nTable = this;\n\t\toSettings.oInit = oInit;\n\t\t\n\t\tallSettings.push( oSettings );\n\t\t\n\t\t// Make a single API instance available for internal handling\n\t\toSettings.api = new _Api( oSettings );\n\t\t\n\t\t// Need to add the instance after the instance after the settings object has been added\n\t\t// to the settings array, so we can self reference the table instance if more than one\n\t\toSettings.oInstance = (_that.length===1) ? _that : $this.dataTable();\n\t\t\n\t\t// Backwards compatibility, before we apply all the defaults\n\t\t_fnCompatOpts( oInit );\n\t\t\n\t\t// If the length menu is given, but the init display length is not, use the length menu\n\t\tif ( oInit.aLengthMenu && ! oInit.iDisplayLength )\n\t\t{\n\t\t\toInit.iDisplayLength = Array.isArray(oInit.aLengthMenu[0])\n\t\t\t\t? oInit.aLengthMenu[0][0]\n\t\t\t\t: $.isPlainObject( oInit.aLengthMenu[0] )\n\t\t\t\t\t? oInit.aLengthMenu[0].value\n\t\t\t\t\t: oInit.aLengthMenu[0];\n\t\t}\n\t\t\n\t\t// Apply the defaults and init options to make a single init object will all\n\t\t// options defined from defaults and instance options.\n\t\toInit = _fnExtend( $.extend( true, {}, defaults ), oInit );\n\t\t\n\t\t\n\t\t// Map the initialisation options onto the settings object\n\t\t_fnMap( oSettings.oFeatures, oInit, [\n\t\t\t\"bPaginate\",\n\t\t\t\"bLengthChange\",\n\t\t\t\"bFilter\",\n\t\t\t\"bSort\",\n\t\t\t\"bSortMulti\",\n\t\t\t\"bInfo\",\n\t\t\t\"bProcessing\",\n\t\t\t\"bAutoWidth\",\n\t\t\t\"bSortClasses\",\n\t\t\t\"bServerSide\",\n\t\t\t\"bDeferRender\"\n\t\t] );\n\t\t_fnMap( oSettings, oInit, [\n\t\t\t\"ajax\",\n\t\t\t\"fnFormatNumber\",\n\t\t\t\"sServerMethod\",\n\t\t\t\"aaSorting\",\n\t\t\t\"aaSortingFixed\",\n\t\t\t\"aLengthMenu\",\n\t\t\t\"sPaginationType\",\n\t\t\t\"iStateDuration\",\n\t\t\t\"bSortCellsTop\",\n\t\t\t\"iTabIndex\",\n\t\t\t\"sDom\",\n\t\t\t\"fnStateLoadCallback\",\n\t\t\t\"fnStateSaveCallback\",\n\t\t\t\"renderer\",\n\t\t\t\"searchDelay\",\n\t\t\t\"rowId\",\n\t\t\t\"caption\",\n\t\t\t\"layout\",\n\t\t\t\"orderDescReverse\",\n\t\t\t\"typeDetect\",\n\t\t\t[ \"iCookieDuration\", \"iStateDuration\" ], // backwards compat\n\t\t\t[ \"oSearch\", \"oPreviousSearch\" ],\n\t\t\t[ \"aoSearchCols\", \"aoPreSearchCols\" ],\n\t\t\t[ \"iDisplayLength\", \"_iDisplayLength\" ]\n\t\t] );\n\t\t_fnMap( oSettings.oScroll, oInit, [\n\t\t\t[ \"sScrollX\", \"sX\" ],\n\t\t\t[ \"sScrollXInner\", \"sXInner\" ],\n\t\t\t[ \"sScrollY\", \"sY\" ],\n\t\t\t[ \"bScrollCollapse\", \"bCollapse\" ]\n\t\t] );\n\t\t_fnMap( oSettings.oLanguage, oInit, \"fnInfoCallback\" );\n\t\t\n\t\t/* Callback functions which are array driven */\n\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', oInit.fnDrawCallback );\n\t\t_fnCallbackReg( oSettings, 'aoStateSaveParams', oInit.fnStateSaveParams );\n\t\t_fnCallbackReg( oSettings, 'aoStateLoadParams', oInit.fnStateLoadParams );\n\t\t_fnCallbackReg( oSettings, 'aoStateLoaded', oInit.fnStateLoaded );\n\t\t_fnCallbackReg( oSettings, 'aoRowCallback', oInit.fnRowCallback );\n\t\t_fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow );\n\t\t_fnCallbackReg( oSettings, 'aoHeaderCallback', oInit.fnHeaderCallback );\n\t\t_fnCallbackReg( oSettings, 'aoFooterCallback', oInit.fnFooterCallback );\n\t\t_fnCallbackReg( oSettings, 'aoInitComplete', oInit.fnInitComplete );\n\t\t_fnCallbackReg( oSettings, 'aoPreDrawCallback', oInit.fnPreDrawCallback );\n\t\t\n\t\toSettings.rowIdFn = _fnGetObjectDataFn( oInit.rowId );\n\t\t\n\t\t/* Browser support detection */\n\t\t_fnBrowserDetect( oSettings );\n\t\t\n\t\tvar oClasses = oSettings.oClasses;\n\t\t\n\t\t$.extend( oClasses, DataTable.ext.classes, oInit.oClasses );\n\t\t$this.addClass( oClasses.table );\n\t\t\n\t\tif (! oSettings.oFeatures.bPaginate) {\n\t\t\toInit.iDisplayStart = 0;\n\t\t}\n\t\t\n\t\tif ( oSettings.iInitDisplayStart === undefined )\n\t\t{\n\t\t\t/* Display start point, taking into account the save saving */\n\t\t\toSettings.iInitDisplayStart = oInit.iDisplayStart;\n\t\t\toSettings._iDisplayStart = oInit.iDisplayStart;\n\t\t}\n\t\t\n\t\tvar defer = oInit.iDeferLoading;\n\t\tif ( defer !== null )\n\t\t{\n\t\t\toSettings.deferLoading = true;\n\t\t\n\t\t\tvar tmp = Array.isArray(defer);\n\t\t\toSettings._iRecordsDisplay = tmp ? defer[0] : defer;\n\t\t\toSettings._iRecordsTotal = tmp ? defer[1] : defer;\n\t\t}\n\t\t\n\t\t/*\n\t\t * Columns\n\t\t * See if we should load columns automatically or use defined ones\n\t\t */\n\t\tvar columnsInit = [];\n\t\tvar thead = this.getElementsByTagName('thead');\n\t\tvar initHeaderLayout = _fnDetectHeader( oSettings, thead[0] );\n\t\t\n\t\t// If we don't have a columns array, then generate one with nulls\n\t\tif ( oInit.aoColumns ) {\n\t\t\tcolumnsInit = oInit.aoColumns;\n\t\t}\n\t\telse if ( initHeaderLayout.length ) {\n\t\t\tfor ( i=0, iLen=initHeaderLayout[0].length ; i').appendTo( $this );\n\t\t\t}\n\t\t\n\t\t\tcaption.html( oSettings.caption );\n\t\t}\n\t\t\n\t\t// Store the caption side, so we can remove the element from the document\n\t\t// when creating the element\n\t\tif (caption.length) {\n\t\t\tcaption[0]._captionSide = caption.css('caption-side');\n\t\t\toSettings.captionNode = caption[0];\n\t\t}\n\t\t\n\t\tif ( thead.length === 0 ) {\n\t\t\tthead = $('').appendTo($this);\n\t\t}\n\t\toSettings.nTHead = thead[0];\n\t\t$('tr', thead).addClass(oClasses.thead.row);\n\t\t\n\t\tvar tbody = $this.children('tbody');\n\t\tif ( tbody.length === 0 ) {\n\t\t\ttbody = $('').insertAfter(thead);\n\t\t}\n\t\toSettings.nTBody = tbody[0];\n\t\t\n\t\tvar tfoot = $this.children('tfoot');\n\t\tif ( tfoot.length === 0 ) {\n\t\t\t// If we are a scrolling table, and no footer has been given, then we need to create\n\t\t\t// a tfoot element for the caption element to be appended to\n\t\t\ttfoot = $('').appendTo($this);\n\t\t}\n\t\toSettings.nTFoot = tfoot[0];\n\t\t$('tr', tfoot).addClass(oClasses.tfoot.row);\n\t\t\n\t\t// Copy the data index array\n\t\toSettings.aiDisplay = oSettings.aiDisplayMaster.slice();\n\t\t\n\t\t// Initialisation complete - table can be drawn\n\t\toSettings.bInitialised = true;\n\t\t\n\t\t// Language definitions\n\t\tvar oLanguage = oSettings.oLanguage;\n\t\t$.extend( true, oLanguage, oInit.oLanguage );\n\t\t\n\t\tif ( oLanguage.sUrl ) {\n\t\t\t// Get the language definitions from a file\n\t\t\t$.ajax( {\n\t\t\t\tdataType: 'json',\n\t\t\t\turl: oLanguage.sUrl,\n\t\t\t\tsuccess: function ( json ) {\n\t\t\t\t\t_fnCamelToHungarian( defaults.oLanguage, json );\n\t\t\t\t\t$.extend( true, oLanguage, json, oSettings.oInit.oLanguage );\n\t\t\n\t\t\t\t\t_fnCallbackFire( oSettings, null, 'i18n', [oSettings], true);\n\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t},\n\t\t\t\terror: function () {\n\t\t\t\t\t// Error occurred loading language file\n\t\t\t\t\t_fnLog( oSettings, 0, 'i18n file loading error', 21 );\n\t\t\n\t\t\t\t\t// Continue on as best we can\n\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\telse {\n\t\t\t_fnCallbackFire( oSettings, null, 'i18n', [oSettings], true);\n\t\t\t_fnInitialise( oSettings );\n\t\t}\n\t} );\n\t_that = null;\n\treturn this;\n};\n\n\n\n/**\n * DataTables extensions\n * \n * This namespace acts as a collection area for plug-ins that can be used to\n * extend DataTables capabilities. Indeed many of the build in methods\n * use this method to provide their own capabilities (sorting methods for\n * example).\n *\n * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy\n * reasons\n *\n * @namespace\n */\nDataTable.ext = _ext = {\n\t/**\n\t * Buttons. For use with the Buttons extension for DataTables. This is\n\t * defined here so other extensions can define buttons regardless of load\n\t * order. It is _not_ used by DataTables core.\n\t *\n\t * @type object\n\t * @default {}\n\t */\n\tbuttons: {},\n\n\n\t/**\n\t * Element class names\n\t *\n\t * @type object\n\t * @default {}\n\t */\n\tclasses: {},\n\n\n\t/**\n\t * DataTables build type (expanded by the download builder)\n\t *\n\t * @type string\n\t */\n\tbuilder: \"-source-\",\n\n\n\t/**\n\t * Error reporting.\n\t * \n\t * How should DataTables report an error. Can take the value 'alert',\n\t * 'throw', 'none' or a function.\n\t *\n\t * @type string|function\n\t * @default alert\n\t */\n\terrMode: \"alert\",\n\n\n\t/**\n\t * Legacy so v1 plug-ins don't throw js errors on load\n\t */\n\tfeature: [],\n\n\t/**\n\t * Feature plug-ins.\n\t * \n\t * This is an object of callbacks which provide the features for DataTables\n\t * to be initialised via the `layout` option.\n\t */\n\tfeatures: {},\n\n\n\t/**\n\t * Row searching.\n\t * \n\t * This method of searching is complimentary to the default type based\n\t * searching, and a lot more comprehensive as it allows you complete control\n\t * over the searching logic. Each element in this array is a function\n\t * (parameters described below) that is called for every row in the table,\n\t * and your logic decides if it should be included in the searching data set\n\t * or not.\n\t *\n\t * Searching functions have the following input parameters:\n\t *\n\t * 1. `{object}` DataTables settings object: see\n\t * {@link DataTable.models.oSettings}\n\t * 2. `{array|object}` Data for the row to be processed (same as the\n\t * original format that was passed in as the data source, or an array\n\t * from a DOM data source\n\t * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which\n\t * can be useful to retrieve the `TR` element if you need DOM interaction.\n\t *\n\t * And the following return is expected:\n\t *\n\t * * {boolean} Include the row in the searched result set (true) or not\n\t * (false)\n\t *\n\t * Note that as with the main search ability in DataTables, technically this\n\t * is \"filtering\", since it is subtractive. However, for consistency in\n\t * naming we call it searching here.\n\t *\n\t * @type array\n\t * @default []\n\t *\n\t * @example\n\t * // The following example shows custom search being applied to the\n\t * // fourth column (i.e. the data[3] index) based on two input values\n\t * // from the end-user, matching the data in a certain range.\n\t * $.fn.dataTable.ext.search.push(\n\t * function( settings, data, dataIndex ) {\n\t * var min = document.getElementById('min').value * 1;\n\t * var max = document.getElementById('max').value * 1;\n\t * var version = data[3] == \"-\" ? 0 : data[3]*1;\n\t *\n\t * if ( min == \"\" && max == \"\" ) {\n\t * return true;\n\t * }\n\t * else if ( min == \"\" && version < max ) {\n\t * return true;\n\t * }\n\t * else if ( min < version && \"\" == max ) {\n\t * return true;\n\t * }\n\t * else if ( min < version && version < max ) {\n\t * return true;\n\t * }\n\t * return false;\n\t * }\n\t * );\n\t */\n\tsearch: [],\n\n\n\t/**\n\t * Selector extensions\n\t *\n\t * The `selector` option can be used to extend the options available for the\n\t * selector modifier options (`selector-modifier` object data type) that\n\t * each of the three built in selector types offer (row, column and cell +\n\t * their plural counterparts). For example the Select extension uses this\n\t * mechanism to provide an option to select only rows, columns and cells\n\t * that have been marked as selected by the end user (`{selected: true}`),\n\t * which can be used in conjunction with the existing built in selector\n\t * options.\n\t *\n\t * Each property is an array to which functions can be pushed. The functions\n\t * take three attributes:\n\t *\n\t * * Settings object for the host table\n\t * * Options object (`selector-modifier` object type)\n\t * * Array of selected item indexes\n\t *\n\t * The return is an array of the resulting item indexes after the custom\n\t * selector has been applied.\n\t *\n\t * @type object\n\t */\n\tselector: {\n\t\tcell: [],\n\t\tcolumn: [],\n\t\trow: []\n\t},\n\n\n\t/**\n\t * Legacy configuration options. Enable and disable legacy options that\n\t * are available in DataTables.\n\t *\n\t * @type object\n\t */\n\tlegacy: {\n\t\t/**\n\t\t * Enable / disable DataTables 1.9 compatible server-side processing\n\t\t * requests\n\t\t *\n\t\t * @type boolean\n\t\t * @default null\n\t\t */\n\t\tajax: null\n\t},\n\n\n\t/**\n\t * Pagination plug-in methods.\n\t * \n\t * Each entry in this object is a function and defines which buttons should\n\t * be shown by the pagination rendering method that is used for the table:\n\t * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the\n\t * buttons are displayed in the document, while the functions here tell it\n\t * what buttons to display. This is done by returning an array of button\n\t * descriptions (what each button will do).\n\t *\n\t * Pagination types (the four built in options and any additional plug-in\n\t * options defined here) can be used through the `paginationType`\n\t * initialisation parameter.\n\t *\n\t * The functions defined take two parameters:\n\t *\n\t * 1. `{int} page` The current page index\n\t * 2. `{int} pages` The number of pages in the table\n\t *\n\t * Each function is expected to return an array where each element of the\n\t * array can be one of:\n\t *\n\t * * `first` - Jump to first page when activated\n\t * * `last` - Jump to last page when activated\n\t * * `previous` - Show previous page when activated\n\t * * `next` - Show next page when activated\n\t * * `{int}` - Show page of the index given\n\t * * `{array}` - A nested array containing the above elements to add a\n\t * containing 'DIV' element (might be useful for styling).\n\t *\n\t * Note that DataTables v1.9- used this object slightly differently whereby\n\t * an object with two functions would be defined for each plug-in. That\n\t * ability is still supported by DataTables 1.10+ to provide backwards\n\t * compatibility, but this option of use is now decremented and no longer\n\t * documented in DataTables 1.10+.\n\t *\n\t * @type object\n\t * @default {}\n\t *\n\t * @example\n\t * // Show previous, next and current page buttons only\n\t * $.fn.dataTableExt.oPagination.current = function ( page, pages ) {\n\t * return [ 'previous', page, 'next' ];\n\t * };\n\t */\n\tpager: {},\n\n\n\trenderer: {\n\t\tpageButton: {},\n\t\theader: {}\n\t},\n\n\n\t/**\n\t * Ordering plug-ins - custom data source\n\t * \n\t * The extension options for ordering of data available here is complimentary\n\t * to the default type based ordering that DataTables typically uses. It\n\t * allows much greater control over the the data that is being used to\n\t * order a column, but is necessarily therefore more complex.\n\t * \n\t * This type of ordering is useful if you want to do ordering based on data\n\t * live from the DOM (for example the contents of an 'input' element) rather\n\t * than just the static string that DataTables knows of.\n\t * \n\t * The way these plug-ins work is that you create an array of the values you\n\t * wish to be ordering for the column in question and then return that\n\t * array. The data in the array much be in the index order of the rows in\n\t * the table (not the currently ordering order!). Which order data gathering\n\t * function is run here depends on the `dt-init columns.orderDataType`\n\t * parameter that is used for the column (if any).\n\t *\n\t * The functions defined take two parameters:\n\t *\n\t * 1. `{object}` DataTables settings object: see\n\t * {@link DataTable.models.oSettings}\n\t * 2. `{int}` Target column index\n\t *\n\t * Each function is expected to return an array:\n\t *\n\t * * `{array}` Data for the column to be ordering upon\n\t *\n\t * @type array\n\t *\n\t * @example\n\t * // Ordering using `input` node values\n\t * $.fn.dataTable.ext.order['dom-text'] = function ( settings, col )\n\t * {\n\t * return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {\n\t * return $('input', td).val();\n\t * } );\n\t * }\n\t */\n\torder: {},\n\n\n\t/**\n\t * Type based plug-ins.\n\t *\n\t * Each column in DataTables has a type assigned to it, either by automatic\n\t * detection or by direct assignment using the `type` option for the column.\n\t * The type of a column will effect how it is ordering and search (plug-ins\n\t * can also make use of the column type if required).\n\t *\n\t * @namespace\n\t */\n\ttype: {\n\t\t/**\n\t\t * Automatic column class assignment\n\t\t */\n\t\tclassName: {},\n\n\t\t/**\n\t\t * Type detection functions.\n\t\t *\n\t\t * The functions defined in this object are used to automatically detect\n\t\t * a column's type, making initialisation of DataTables super easy, even\n\t\t * when complex data is in the table.\n\t\t *\n\t\t * The functions defined take two parameters:\n\t\t *\n\t * 1. `{*}` Data from the column cell to be analysed\n\t * 2. `{settings}` DataTables settings object. This can be used to\n\t * perform context specific type detection - for example detection\n\t * based on language settings such as using a comma for a decimal\n\t * place. Generally speaking the options from the settings will not\n\t * be required\n\t\t *\n\t\t * Each function is expected to return:\n\t\t *\n\t\t * * `{string|null}` Data type detected, or null if unknown (and thus\n\t\t * pass it on to the other type detection functions.\n\t\t *\n\t\t * @type array\n\t\t *\n\t\t * @example\n\t\t * // Currency type detection plug-in:\n\t\t * $.fn.dataTable.ext.type.detect.push(\n\t\t * function ( data, settings ) {\n\t\t * // Check the numeric part\n\t\t * if ( ! data.substring(1).match(/[0-9]/) ) {\n\t\t * return null;\n\t\t * }\n\t\t *\n\t\t * // Check prefixed by currency\n\t\t * if ( data.charAt(0) == '$' || data.charAt(0) == '£' ) {\n\t\t * return 'currency';\n\t\t * }\n\t\t * return null;\n\t\t * }\n\t\t * );\n\t\t */\n\t\tdetect: [],\n\n\t\t/**\n\t\t * Automatic renderer assignment\n\t\t */\n\t\trender: {},\n\n\n\t\t/**\n\t\t * Type based search formatting.\n\t\t *\n\t\t * The type based searching functions can be used to pre-format the\n\t\t * data to be search on. For example, it can be used to strip HTML\n\t\t * tags or to de-format telephone numbers for numeric only searching.\n\t\t *\n\t\t * Note that is a search is not defined for a column of a given type,\n\t\t * no search formatting will be performed.\n\t\t * \n\t\t * Pre-processing of searching data plug-ins - When you assign the sType\n\t\t * for a column (or have it automatically detected for you by DataTables\n\t\t * or a type detection plug-in), you will typically be using this for\n\t\t * custom sorting, but it can also be used to provide custom searching\n\t\t * by allowing you to pre-processing the data and returning the data in\n\t\t * the format that should be searched upon. This is done by adding\n\t\t * functions this object with a parameter name which matches the sType\n\t\t * for that target column. This is the corollary of afnSortData\n\t\t * for searching data.\n\t\t *\n\t\t * The functions defined take a single parameter:\n\t\t *\n\t * 1. `{*}` Data from the column cell to be prepared for searching\n\t\t *\n\t\t * Each function is expected to return:\n\t\t *\n\t\t * * `{string|null}` Formatted string that will be used for the searching.\n\t\t *\n\t\t * @type object\n\t\t * @default {}\n\t\t *\n\t\t * @example\n\t\t * $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {\n\t\t * return d.replace(/\\n/g,\" \").replace( /<.*?>/g, \"\" );\n\t\t * }\n\t\t */\n\t\tsearch: {},\n\n\n\t\t/**\n\t\t * Type based ordering.\n\t\t *\n\t\t * The column type tells DataTables what ordering to apply to the table\n\t\t * when a column is sorted upon. The order for each type that is defined,\n\t\t * is defined by the functions available in this object.\n\t\t *\n\t\t * Each ordering option can be described by three properties added to\n\t\t * this object:\n\t\t *\n\t\t * * `{type}-pre` - Pre-formatting function\n\t\t * * `{type}-asc` - Ascending order function\n\t\t * * `{type}-desc` - Descending order function\n\t\t *\n\t\t * All three can be used together, only `{type}-pre` or only\n\t\t * `{type}-asc` and `{type}-desc` together. It is generally recommended\n\t\t * that only `{type}-pre` is used, as this provides the optimal\n\t\t * implementation in terms of speed, although the others are provided\n\t\t * for compatibility with existing Javascript sort functions.\n\t\t *\n\t\t * `{type}-pre`: Functions defined take a single parameter:\n\t\t *\n\t * 1. `{*}` Data from the column cell to be prepared for ordering\n\t\t *\n\t\t * And return:\n\t\t *\n\t\t * * `{*}` Data to be sorted upon\n\t\t *\n\t\t * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort\n\t\t * functions, taking two parameters:\n\t\t *\n\t * 1. `{*}` Data to compare to the second parameter\n\t * 2. `{*}` Data to compare to the first parameter\n\t\t *\n\t\t * And returning:\n\t\t *\n\t\t * * `{*}` Ordering match: <0 if first parameter should be sorted lower\n\t\t * than the second parameter, ===0 if the two parameters are equal and\n\t\t * >0 if the first parameter should be sorted height than the second\n\t\t * parameter.\n\t\t * \n\t\t * @type object\n\t\t * @default {}\n\t\t *\n\t\t * @example\n\t\t * // Numeric ordering of formatted numbers with a pre-formatter\n\t\t * $.extend( $.fn.dataTable.ext.type.order, {\n\t\t * \"string-pre\": function(x) {\n\t\t * a = (a === \"-\" || a === \"\") ? 0 : a.replace( /[^\\d\\-\\.]/g, \"\" );\n\t\t * return parseFloat( a );\n\t\t * }\n\t\t * } );\n\t\t *\n\t\t * @example\n\t\t * // Case-sensitive string ordering, with no pre-formatting method\n\t\t * $.extend( $.fn.dataTable.ext.order, {\n\t\t * \"string-case-asc\": function(x,y) {\n\t\t * return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t * },\n\t\t * \"string-case-desc\": function(x,y) {\n\t\t * return ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t * }\n\t\t * } );\n\t\t */\n\t\torder: {}\n\t},\n\n\t/**\n\t * Unique DataTables instance counter\n\t *\n\t * @type int\n\t * @private\n\t */\n\t_unique: 0,\n\n\n\t//\n\t// Depreciated\n\t// The following properties are retained for backwards compatibility only.\n\t// The should not be used in new projects and will be removed in a future\n\t// version\n\t//\n\n\t/**\n\t * Version check function.\n\t * @type function\n\t * @depreciated Since 1.10\n\t */\n\tfnVersionCheck: DataTable.fnVersionCheck,\n\n\n\t/**\n\t * Index for what 'this' index API functions should use\n\t * @type int\n\t * @deprecated Since v1.10\n\t */\n\tiApiIndex: 0,\n\n\n\t/**\n\t * Software version\n\t * @type string\n\t * @deprecated Since v1.10\n\t */\n\tsVersion: DataTable.version\n};\n\n\n//\n// Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts\n//\n$.extend( _ext, {\n\tafnFiltering: _ext.search,\n\taTypes: _ext.type.detect,\n\tofnSearch: _ext.type.search,\n\toSort: _ext.type.order,\n\tafnSortData: _ext.order,\n\taoFeatures: _ext.feature,\n\toStdClasses: _ext.classes,\n\toPagination: _ext.pager\n} );\n\n\n$.extend( DataTable.ext.classes, {\n\tcontainer: 'dt-container',\n\tempty: {\n\t\trow: 'dt-empty'\n\t},\n\tinfo: {\n\t\tcontainer: 'dt-info'\n\t},\n\tlayout: {\n\t\trow: 'dt-layout-row',\n\t\tcell: 'dt-layout-cell',\n\t\ttableRow: 'dt-layout-table',\n\t\ttableCell: '',\n\t\tstart: 'dt-layout-start',\n\t\tend: 'dt-layout-end',\n\t\tfull: 'dt-layout-full'\n\t},\n\tlength: {\n\t\tcontainer: 'dt-length',\n\t\tselect: 'dt-input'\n\t},\n\torder: {\n\t\tcanAsc: 'dt-orderable-asc',\n\t\tcanDesc: 'dt-orderable-desc',\n\t\tisAsc: 'dt-ordering-asc',\n\t\tisDesc: 'dt-ordering-desc',\n\t\tnone: 'dt-orderable-none',\n\t\tposition: 'sorting_'\n\t},\n\tprocessing: {\n\t\tcontainer: 'dt-processing'\n\t},\n\tscrolling: {\n\t\tbody: 'dt-scroll-body',\n\t\tcontainer: 'dt-scroll',\n\t\tfooter: {\n\t\t\tself: 'dt-scroll-foot',\n\t\t\tinner: 'dt-scroll-footInner'\n\t\t},\n\t\theader: {\n\t\t\tself: 'dt-scroll-head',\n\t\t\tinner: 'dt-scroll-headInner'\n\t\t}\n\t},\n\tsearch: {\n\t\tcontainer: 'dt-search',\n\t\tinput: 'dt-input'\n\t},\n\ttable: 'dataTable',\t\n\ttbody: {\n\t\tcell: '',\n\t\trow: ''\n\t},\n\tthead: {\n\t\tcell: '',\n\t\trow: ''\n\t},\n\ttfoot: {\n\t\tcell: '',\n\t\trow: ''\n\t},\n\tpaging: {\n\t\tactive: 'current',\n\t\tbutton: 'dt-paging-button',\n\t\tcontainer: 'dt-paging',\n\t\tdisabled: 'disabled',\n\t\tnav: ''\n\t}\n} );\n\n\n/*\n * It is useful to have variables which are scoped locally so only the\n * DataTables functions can access them and they don't leak into global space.\n * At the same time these functions are often useful over multiple files in the\n * core and API, so we list, or at least document, all variables which are used\n * by DataTables as private variables here. This also ensures that there is no\n * clashing of variable names and that they can easily referenced for reuse.\n */\n\n\n// Defined else where\n// _selector_run\n// _selector_opts\n// _selector_row_indexes\n\nvar _ext; // DataTable.ext\nvar _Api; // DataTable.Api\nvar _api_register; // DataTable.Api.register\nvar _api_registerPlural; // DataTable.Api.registerPlural\n\nvar _re_dic = {};\nvar _re_new_lines = /[\\r\\n\\u2028]/g;\nvar _re_html = /<([^>]*>)/g;\nvar _max_str_len = Math.pow(2, 28);\n\n// This is not strict ISO8601 - Date.parse() is quite lax, although\n// implementations differ between browsers.\nvar _re_date = /^\\d{2,4}[./-]\\d{1,2}[./-]\\d{1,2}([T ]{1}\\d{1,2}[:.]\\d{2}([.:]\\d{2})?)?$/;\n\n// Escape regular expression special characters\nvar _re_escape_regex = new RegExp( '(\\\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\\\', '$', '^', '-' ].join('|\\\\') + ')', 'g' );\n\n// https://en.wikipedia.org/wiki/Foreign_exchange_market\n// - \\u20BD - Russian ruble.\n// - \\u20a9 - South Korean Won\n// - \\u20BA - Turkish Lira\n// - \\u20B9 - Indian Rupee\n// - R - Brazil (R$) and South Africa\n// - fr - Swiss Franc\n// - kr - Swedish krona, Norwegian krone and Danish krone\n// - \\u2009 is thin space and \\u202F is narrow no-break space, both used in many\n// - Ƀ - Bitcoin\n// - Ξ - Ethereum\n// standards as thousands separators.\nvar _re_formatted_numeric = /['\\u00A0,$£€¥%\\u2009\\u202F\\u20BD\\u20a9\\u20BArfkɃΞ]/gi;\n\n\nvar _empty = function ( d ) {\n\treturn !d || d === true || d === '-' ? true : false;\n};\n\n\nvar _intVal = function ( s ) {\n\tvar integer = parseInt( s, 10 );\n\treturn !isNaN(integer) && isFinite(s) ? integer : null;\n};\n\n// Convert from a formatted number with characters other than `.` as the\n// decimal place, to a Javascript number\nvar _numToDecimal = function ( num, decimalPoint ) {\n\t// Cache created regular expressions for speed as this function is called often\n\tif ( ! _re_dic[ decimalPoint ] ) {\n\t\t_re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );\n\t}\n\treturn typeof num === 'string' && decimalPoint !== '.' ?\n\t\tnum.replace( /\\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :\n\t\tnum;\n};\n\n\nvar _isNumber = function ( d, decimalPoint, formatted, allowEmpty ) {\n\tvar type = typeof d;\n\tvar strType = type === 'string';\n\n\tif ( type === 'number' || type === 'bigint') {\n\t\treturn true;\n\t}\n\n\t// If empty return immediately so there must be a number if it is a\n\t// formatted string (this stops the string \"k\", or \"kr\", etc being detected\n\t// as a formatted number for currency\n\tif ( allowEmpty && _empty( d ) ) {\n\t\treturn true;\n\t}\n\n\tif ( decimalPoint && strType ) {\n\t\td = _numToDecimal( d, decimalPoint );\n\t}\n\n\tif ( formatted && strType ) {\n\t\td = d.replace( _re_formatted_numeric, '' );\n\t}\n\n\treturn !isNaN( parseFloat(d) ) && isFinite( d );\n};\n\n\n// A string without HTML in it can be considered to be HTML still\nvar _isHtml = function ( d ) {\n\treturn _empty( d ) || typeof d === 'string';\n};\n\n// Is a string a number surrounded by HTML?\nvar _htmlNumeric = function ( d, decimalPoint, formatted, allowEmpty ) {\n\tif ( allowEmpty && _empty( d ) ) {\n\t\treturn true;\n\t}\n\n\t// input and select strings mean that this isn't just a number\n\tif (typeof d === 'string' && d.match(/<(input|select)/i)) {\n\t\treturn null;\n\t}\n\n\tvar html = _isHtml( d );\n\treturn ! html ?\n\t\tnull :\n\t\t_isNumber( _stripHtml( d ), decimalPoint, formatted, allowEmpty ) ?\n\t\t\ttrue :\n\t\t\tnull;\n};\n\n\nvar _pluck = function ( a, prop, prop2 ) {\n\tvar out = [];\n\tvar i=0, ien=a.length;\n\n\t// Could have the test in the loop for slightly smaller code, but speed\n\t// is essential here\n\tif ( prop2 !== undefined ) {\n\t\tfor ( ; i _max_str_len) {\n\t\tthrow new Error('Exceeded max str len');\n\t}\n\n\tvar previous;\n\n\tinput = input.replace(_re_html, ''); // Complete tags\n\n\t// Safety for incomplete script tag - use do / while to ensure that\n\t// we get all instances\n\tdo {\n\t\tprevious = input;\n\t\tinput = input.replace(/