Ganteng Doang Upload Shell Gak Bisa


Linux server.jmdstrack.com 3.10.0-1160.119.1.el7.tuxcare.els10.x86_64 #1 SMP Fri Oct 11 21:40:41 UTC 2024 x86_64
/ home/ jmdstrac/ public_html/ devices/ public/ lib/

/home/jmdstrac/public_html/devices/public/lib/sortable.js.map

{"version":3,"file":"sortable.js","mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAO,cAAc;;AAErB;AACA;AACA,aAAa,aAAa;AAC1B,aAAa,QAAQ;AACrB,aAAa,KAAK;AAClB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,+BAA+B;AAC5C,aAAa,QAAQ;AACrB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,uDAAuD;AAC/G,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA,oCAAoC;AACpC,yCAAyC;AACzC,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,qBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,qBAAqB,aAAa;AAClC,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,KAAK;AACtB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,aAAa,aAAa;AAC1B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,aAAa,mBAAmB;AAChC,aAAa,UAAU;AACvB,aAAa,QAAQ;AACrB;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,gCAAgC;AAC7C,aAAa,QAAQ;AACrB;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,gCAAgC;AAC7C,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAmB;AAChC,aAAa,QAAQ;AACrB;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,aAAa;AAC1B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,aAAa,UAAU;AACvB,aAAa,QAAQ;AACrB,eAAe,UAAU;AACzB;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,2BAA2B,uBAAuB;AAClD;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,GAAG;;AAEH;AACA;AACA;AACA,aAAa,aAAa;AAC1B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,aAAa,aAAa;AAC1B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,aAAa,aAAa;AAC1B,aAAa,aAAa;AAC1B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,aAAa;AAC1B,aAAa,aAAa;AAC1B;AACA,kDAAkD;AAClD;AACA;AACA,aAAa,aAAa;AAC1B,aAAa,aAAa;AAC1B;AACA,iDAAiD;;AAEjD;AACA;AACA;AACA,aAAa,aAAa;AAC1B,aAAa,UAAU;AACvB,eAAe;AACf;AACA;AACA,6CAA6C,sEAAsE;AACnH,kDAAkD,6DAA6D;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,uDAAuD;AAC9G;AACA,GAAG;;AAEH;AACA;AACA;AACA,aAAa,aAAa;AAC1B,aAAa,kBAAkB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,0CAA0C,qBAAqB;AAC/D,GAAG;;AAEH;AACA;AACA;AACA,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,0CAA0C,qBAAqB;AAC/D,GAAG;;AAEH;AACA;AACA;AACA,aAAa,oBAAoB;AACjC,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP,GAAG;;AAEH;AACA,aAAa,OAAO;AACpB,eAAe;AACf;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,aAAa,aAAa;AAC1B,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,aAAa;AAC1B,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,aAAa,UAAU;AACvB,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,UAAU;AACvB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,uBAAuB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,UAAU;AACvB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,aAAa;AAC1B,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,gCAAgC;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,aAAa;AAC1B,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA,2DAA2D,uBAAuB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,aAAa;AAC1B,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,gBAAgB;AAC7B,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA,eAAe;AACf,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,qDAAqD;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,2BAA2B;AAC3B;AACA,mBAAmB;AACnB;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yFAAyF,0BAA0B;AACnH,mDAAmD,4CAA4C;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,mDAAmD,4CAA4C;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA,eAAe;AACf;AACA;AACA,4CAA4C,8BAA8B;AAC1E;AACA;AACA,4CAA4C,8BAA8B;AAC1E;AACA,4CAA4C,8BAA8B;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA,mBAAmB;AACnB;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,wCAAwC;AACxF;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,gDAAgD,wCAAwC;AACxF;AACA;AACA,mBAAmB;AACnB;AACA;AACA,gEAAgE,0BAA0B;AAC1F;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,CAAC;AAAA,kGAAC;;;;;;;UC5xCF;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kBAAkB,mBAAO,CAAC,EAAyC,E","sources":["webpack://@glpi/glpi/./node_modules/html5sortable/dist/html5sortable.amd.js","webpack://@glpi/glpi/webpack/bootstrap","webpack://@glpi/glpi/./lib/bundles/sortable.js"],"sourcesContent":["/*\n * HTML5Sortable package\n * https://github.com/lukasoppermann/html5sortable\n *\n * Maintained by Lukas Oppermann <lukas@vea.re>\n *\n * Released under the MIT license.\n */\ndefine(function () { 'use strict';\n\n  /**\n   * Get or set data on element\n   * @param {HTMLElement} element\n   * @param {string} key\n   * @param {any} value\n   * @return {*}\n   */\n  function addData(element, key, value) {\n      if (value === undefined) {\n          return element && element.h5s && element.h5s.data && element.h5s.data[key];\n      }\n      else {\n          element.h5s = element.h5s || {};\n          element.h5s.data = element.h5s.data || {};\n          element.h5s.data[key] = value;\n      }\n  }\n  /**\n   * Remove data from element\n   * @param {HTMLElement} element\n   */\n  function removeData(element) {\n      if (element.h5s) {\n          delete element.h5s.data;\n      }\n  }\n\n  /* eslint-env browser */\n  /**\n   * Filter only wanted nodes\n   * @param {NodeList|HTMLCollection|Array} nodes\n   * @param {String} selector\n   * @returns {Array}\n   */\n  var filter = (function (nodes, selector) {\n      if (!(nodes instanceof NodeList || nodes instanceof HTMLCollection || nodes instanceof Array)) {\n          throw new Error('You must provide a nodeList/HTMLCollection/Array of elements to be filtered.');\n      }\n      if (typeof selector !== 'string') {\n          return Array.from(nodes);\n      }\n      return Array.from(nodes).filter(function (item) { return item.nodeType === 1 && item.matches(selector); });\n  });\n\n  /* eslint-env browser */\n  /* eslint-disable no-use-before-define */\n  var stores = new Map();\n  /* eslint-enable no-use-before-define */\n  /**\n   * Stores data & configurations per Sortable\n   * @param {Object} config\n   */\n  var Store = /** @class */ (function () {\n      function Store() {\n          this._config = new Map(); // eslint-disable-line no-undef\n          this._placeholder = undefined; // eslint-disable-line no-undef\n          this._data = new Map(); // eslint-disable-line no-undef\n      }\n      Object.defineProperty(Store.prototype, \"config\", {\n          /**\n           * get the configuration map of a class instance\n           * @method config\n           * @return {object}\n           */\n          get: function () {\n              // transform Map to object\n              var config = {};\n              this._config.forEach(function (value, key) {\n                  config[key] = value;\n              });\n              // return object\n              return config;\n          },\n          /**\n           * set the configuration of a class instance\n           * @method config\n           * @param {object} config object of configurations\n           */\n          set: function (config) {\n              if (typeof config !== 'object') {\n                  throw new Error('You must provide a valid configuration object to the config setter.');\n              }\n              // combine config with default\n              var mergedConfig = Object.assign({}, config);\n              // add config to map\n              this._config = new Map(Object.entries(mergedConfig));\n          },\n          enumerable: false,\n          configurable: true\n      });\n      /**\n       * set individual configuration of a class instance\n       * @method setConfig\n       * @param  key valid configuration key\n       * @param  value any value\n       * @return void\n       */\n      Store.prototype.setConfig = function (key, value) {\n          if (!this._config.has(key)) {\n              throw new Error(\"Trying to set invalid configuration item: \" + key);\n          }\n          // set config\n          this._config.set(key, value);\n      };\n      /**\n       * get an individual configuration of a class instance\n       * @method getConfig\n       * @param  key valid configuration key\n       * @return any configuration value\n       */\n      Store.prototype.getConfig = function (key) {\n          if (!this._config.has(key)) {\n              throw new Error(\"Invalid configuration item requested: \" + key);\n          }\n          return this._config.get(key);\n      };\n      Object.defineProperty(Store.prototype, \"placeholder\", {\n          /**\n           * get the placeholder for a class instance\n           * @method placeholder\n           * @return {HTMLElement|null}\n           */\n          get: function () {\n              return this._placeholder;\n          },\n          /**\n           * set the placeholder for a class instance\n           * @method placeholder\n           * @param {HTMLElement} placeholder\n           * @return {void}\n           */\n          set: function (placeholder) {\n              if (!(placeholder instanceof HTMLElement) && placeholder !== null) {\n                  throw new Error('A placeholder must be an html element or null.');\n              }\n              this._placeholder = placeholder;\n          },\n          enumerable: false,\n          configurable: true\n      });\n      /**\n       * set an data entry\n       * @method setData\n       * @param {string} key\n       * @param {any} value\n       * @return {void}\n       */\n      Store.prototype.setData = function (key, value) {\n          if (typeof key !== 'string') {\n              throw new Error('The key must be a string.');\n          }\n          this._data.set(key, value);\n      };\n      /**\n       * get an data entry\n       * @method getData\n       * @param {string} key an existing key\n       * @return {any}\n       */\n      Store.prototype.getData = function (key) {\n          if (typeof key !== 'string') {\n              throw new Error('The key must be a string.');\n          }\n          return this._data.get(key);\n      };\n      /**\n       * delete an data entry\n       * @method deleteData\n       * @param {string} key an existing key\n       * @return {boolean}\n       */\n      Store.prototype.deleteData = function (key) {\n          if (typeof key !== 'string') {\n              throw new Error('The key must be a string.');\n          }\n          return this._data.delete(key);\n      };\n      return Store;\n  }());\n  /**\n   * @param {HTMLElement} sortableElement\n   * @returns {Class: Store}\n   */\n  var store = (function (sortableElement) {\n      // if sortableElement is wrong type\n      if (!(sortableElement instanceof HTMLElement)) {\n          throw new Error('Please provide a sortable to the store function.');\n      }\n      // create new instance if not avilable\n      if (!stores.has(sortableElement)) {\n          stores.set(sortableElement, new Store());\n      }\n      // return instance\n      return stores.get(sortableElement);\n  });\n\n  /**\n   * @param {Array|HTMLElement} element\n   * @param {Function} callback\n   * @param {string} event\n   */\n  function addEventListener(element, eventName, callback) {\n      if (element instanceof Array) {\n          for (var i = 0; i < element.length; ++i) {\n              addEventListener(element[i], eventName, callback);\n          }\n          return;\n      }\n      element.addEventListener(eventName, callback);\n      store(element).setData(\"event\" + eventName, callback);\n  }\n  /**\n   * @param {Array<HTMLElement>|HTMLElement} element\n   * @param {string} eventName\n   */\n  function removeEventListener(element, eventName) {\n      if (element instanceof Array) {\n          for (var i = 0; i < element.length; ++i) {\n              removeEventListener(element[i], eventName);\n          }\n          return;\n      }\n      element.removeEventListener(eventName, store(element).getData(\"event\" + eventName));\n      store(element).deleteData(\"event\" + eventName);\n  }\n\n  /**\n   * @param {Array<HTMLElement>|HTMLElement} element\n   * @param {string} attribute\n   * @param {string} value\n   */\n  function addAttribute(element, attribute, value) {\n      if (element instanceof Array) {\n          for (var i = 0; i < element.length; ++i) {\n              addAttribute(element[i], attribute, value);\n          }\n          return;\n      }\n      element.setAttribute(attribute, value);\n  }\n  /**\n   * @param {Array|HTMLElement} element\n   * @param {string} attribute\n   */\n  function removeAttribute(element, attribute) {\n      if (element instanceof Array) {\n          for (var i = 0; i < element.length; ++i) {\n              removeAttribute(element[i], attribute);\n          }\n          return;\n      }\n      element.removeAttribute(attribute);\n  }\n\n  /**\n   * @param {HTMLElement} element\n   * @returns {Object}\n   */\n  var offset = (function (element) {\n      if (!element.parentElement || element.getClientRects().length === 0) {\n          throw new Error('target element must be part of the dom');\n      }\n      var rect = element.getClientRects()[0];\n      return {\n          left: rect.left + window.pageXOffset,\n          right: rect.right + window.pageXOffset,\n          top: rect.top + window.pageYOffset,\n          bottom: rect.bottom + window.pageYOffset\n      };\n  });\n\n  /**\n   * Creates and returns a new debounced version of the passed function which will postpone its execution until after wait milliseconds have elapsed\n   * @param {Function} func to debounce\n   * @param {number} time to wait before calling function with latest arguments, 0 - no debounce\n   * @returns {function} - debounced function\n   */\n  var debounce = (function (func, wait) {\n      if (wait === void 0) { wait = 0; }\n      var timeout;\n      return function () {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n              args[_i] = arguments[_i];\n          }\n          clearTimeout(timeout);\n          timeout = setTimeout(function () {\n              func.apply(void 0, args);\n          }, wait);\n      };\n  });\n\n  /* eslint-env browser */\n  /**\n   * Get position of the element relatively to its sibling elements\n   * @param {HTMLElement} element\n   * @returns {number}\n   */\n  var getIndex = (function (element, elementList) {\n      if (!(element instanceof HTMLElement) || !(elementList instanceof NodeList || elementList instanceof HTMLCollection || elementList instanceof Array)) {\n          throw new Error('You must provide an element and a list of elements.');\n      }\n      return Array.from(elementList).indexOf(element);\n  });\n\n  /* eslint-env browser */\n  /**\n   * Test whether element is in DOM\n   * @param {HTMLElement} element\n   * @returns {boolean}\n   */\n  var isInDom = (function (element) {\n      if (!(element instanceof HTMLElement)) {\n          throw new Error('Element is not a node element.');\n      }\n      return element.parentNode !== null;\n  });\n\n  /* eslint-env browser */\n  /**\n   * Insert node before or after target\n   * @param {HTMLElement} referenceNode - reference element\n   * @param {HTMLElement} newElement - element to be inserted\n   * @param {String} position - insert before or after reference element\n   */\n  var insertNode = function (referenceNode, newElement, position) {\n      if (!(referenceNode instanceof HTMLElement) || !(referenceNode.parentElement instanceof HTMLElement)) {\n          throw new Error('target and element must be a node');\n      }\n      referenceNode.parentElement.insertBefore(newElement, (position === 'before' ? referenceNode : referenceNode.nextElementSibling));\n  };\n  /**\n   * Insert before target\n   * @param {HTMLElement} target\n   * @param {HTMLElement} element\n   */\n  var insertBefore = function (target, element) { return insertNode(target, element, 'before'); };\n  /**\n   * Insert after target\n   * @param {HTMLElement} target\n   * @param {HTMLElement} element\n   */\n  var insertAfter = function (target, element) { return insertNode(target, element, 'after'); };\n\n  /* eslint-env browser */\n  /**\n   * Filter only wanted nodes\n   * @param {HTMLElement} sortableContainer\n   * @param {Function} customSerializer\n   * @returns {Array}\n   */\n  var serialize = (function (sortableContainer, customItemSerializer, customContainerSerializer) {\n      if (customItemSerializer === void 0) { customItemSerializer = function (serializedItem, sortableContainer) { return serializedItem; }; }\n      if (customContainerSerializer === void 0) { customContainerSerializer = function (serializedContainer) { return serializedContainer; }; }\n      // check for valid sortableContainer\n      if (!(sortableContainer instanceof HTMLElement) || !sortableContainer.isSortable === true) {\n          throw new Error('You need to provide a sortableContainer to be serialized.');\n      }\n      // check for valid serializers\n      if (typeof customItemSerializer !== 'function' || typeof customContainerSerializer !== 'function') {\n          throw new Error('You need to provide a valid serializer for items and the container.');\n      }\n      // get options\n      var options = addData(sortableContainer, 'opts');\n      var item = options.items;\n      // serialize container\n      var items = filter(sortableContainer.children, item);\n      var serializedItems = items.map(function (item) {\n          return {\n              parent: sortableContainer,\n              node: item,\n              html: item.outerHTML,\n              index: getIndex(item, items)\n          };\n      });\n      // serialize container\n      var container = {\n          node: sortableContainer,\n          itemCount: serializedItems.length\n      };\n      return {\n          container: customContainerSerializer(container),\n          items: serializedItems.map(function (item) { return customItemSerializer(item, sortableContainer); })\n      };\n  });\n\n  /* eslint-env browser */\n  /**\n   * create a placeholder element\n   * @param {HTMLElement} sortableElement a single sortable\n   * @param {string|undefined} placeholder a string representing an html element\n   * @param {string} placeholderClasses a string representing the classes that should be added to the placeholder\n   */\n  var makePlaceholder = (function (sortableElement, placeholder, placeholderClass) {\n      var _a;\n      if (placeholderClass === void 0) { placeholderClass = 'sortable-placeholder'; }\n      if (!(sortableElement instanceof HTMLElement)) {\n          throw new Error('You must provide a valid element as a sortable.');\n      }\n      // if placeholder is not an element\n      if (!(placeholder instanceof HTMLElement) && placeholder !== undefined) {\n          throw new Error('You must provide a valid element as a placeholder or set ot to undefined.');\n      }\n      // if no placeholder element is given\n      if (placeholder === undefined) {\n          if (['UL', 'OL'].includes(sortableElement.tagName)) {\n              placeholder = document.createElement('li');\n          }\n          else if (['TABLE', 'TBODY'].includes(sortableElement.tagName)) {\n              placeholder = document.createElement('tr');\n              // set colspan to always all rows, otherwise the item can only be dropped in first column\n              placeholder.innerHTML = '<td colspan=\"100\"></td>';\n          }\n          else {\n              placeholder = document.createElement('div');\n          }\n      }\n      // add classes to placeholder\n      if (typeof placeholderClass === 'string') {\n          (_a = placeholder.classList).add.apply(_a, placeholderClass.split(' '));\n      }\n      return placeholder;\n  });\n\n  /* eslint-env browser */\n  /**\n   * Get height of an element including padding\n   * @param {HTMLElement} element an dom element\n   */\n  var getElementHeight = (function (element) {\n      if (!(element instanceof HTMLElement)) {\n          throw new Error('You must provide a valid dom element');\n      }\n      // get calculated style of element\n      var style = window.getComputedStyle(element);\n      // get only height if element has box-sizing: border-box specified\n      if (style.getPropertyValue('box-sizing') === 'border-box') {\n          return parseInt(style.getPropertyValue('height'), 10);\n      }\n      // pick applicable properties, convert to int and reduce by adding\n      return ['height', 'padding-top', 'padding-bottom']\n          .map(function (key) {\n          var int = parseInt(style.getPropertyValue(key), 10);\n          return isNaN(int) ? 0 : int;\n      })\n          .reduce(function (sum, value) { return sum + value; });\n  });\n\n  /* eslint-env browser */\n  /**\n   * Get width of an element including padding\n   * @param {HTMLElement} element an dom element\n   */\n  var getElementWidth = (function (element) {\n      if (!(element instanceof HTMLElement)) {\n          throw new Error('You must provide a valid dom element');\n      }\n      // get calculated style of element\n      var style = window.getComputedStyle(element);\n      // pick applicable properties, convert to int and reduce by adding\n      return ['width', 'padding-left', 'padding-right']\n          .map(function (key) {\n          var int = parseInt(style.getPropertyValue(key), 10);\n          return isNaN(int) ? 0 : int;\n      })\n          .reduce(function (sum, value) { return sum + value; });\n  });\n\n  /* eslint-env browser */\n  /**\n   * get handle or return item\n   * @param {Array<HTMLElement>} items\n   * @param {string} selector\n   */\n  var getHandles = (function (items, selector) {\n      if (!(items instanceof Array)) {\n          throw new Error('You must provide a Array of HTMLElements to be filtered.');\n      }\n      if (typeof selector !== 'string') {\n          return items;\n      }\n      return items\n          // remove items without handle from array\n          .filter(function (item) {\n          return item.querySelector(selector) instanceof HTMLElement ||\n              (item.shadowRoot && item.shadowRoot.querySelector(selector) instanceof HTMLElement);\n      })\n          // replace item with handle in array\n          .map(function (item) {\n          return item.querySelector(selector) || (item.shadowRoot && item.shadowRoot.querySelector(selector));\n      });\n  });\n\n  /**\n   * @param {Event} event\n   * @returns {HTMLElement}\n   */\n  var getEventTarget = (function (event) {\n      return (event.composedPath && event.composedPath()[0]) || event.target;\n  });\n\n  /* eslint-env browser */\n  /**\n   * defaultDragImage returns the current item as dragged image\n   * @param {HTMLElement} draggedElement - the item that the user drags\n   * @param {object} elementOffset - an object with the offsets top, left, right & bottom\n   * @param {Event} event - the original drag event object\n   * @return {object} with element, posX and posY properties\n   */\n  var defaultDragImage = function (draggedElement, elementOffset, event) {\n      return {\n          element: draggedElement,\n          posX: event.pageX - elementOffset.left,\n          posY: event.pageY - elementOffset.top\n      };\n  };\n  /**\n   * attaches an element as the drag image to an event\n   * @param {Event} event - the original drag event object\n   * @param {HTMLElement} draggedElement - the item that the user drags\n   * @param {Function} customDragImage - function to create a custom dragImage\n   * @return void\n   */\n  var setDragImage = (function (event, draggedElement, customDragImage) {\n      // check if event is provided\n      if (!(event instanceof Event)) {\n          throw new Error('setDragImage requires a DragEvent as the first argument.');\n      }\n      // check if draggedElement is provided\n      if (!(draggedElement instanceof HTMLElement)) {\n          throw new Error('setDragImage requires the dragged element as the second argument.');\n      }\n      // set default function of none provided\n      if (!customDragImage) {\n          customDragImage = defaultDragImage;\n      }\n      // check if setDragImage method is available\n      if (event.dataTransfer && event.dataTransfer.setDragImage) {\n          // get the elements offset\n          var elementOffset = offset(draggedElement);\n          // get the dragImage\n          var dragImage = customDragImage(draggedElement, elementOffset, event);\n          // check if custom function returns correct values\n          if (!(dragImage.element instanceof HTMLElement) || typeof dragImage.posX !== 'number' || typeof dragImage.posY !== 'number') {\n              throw new Error('The customDragImage function you provided must return and object with the properties element[string], posX[integer], posY[integer].');\n          }\n          // needs to be set for HTML5 drag & drop to work\n          event.dataTransfer.effectAllowed = 'copyMove';\n          // Firefox requires it to use the event target's id for the data\n          event.dataTransfer.setData('text/plain', getEventTarget(event).id);\n          // set the drag image on the event\n          event.dataTransfer.setDragImage(dragImage.element, dragImage.posX, dragImage.posY);\n      }\n  });\n\n  /**\n   * Check if curList accepts items from destList\n   * @param {sortable} destination the container an item is move to\n   * @param {sortable} origin the container an item comes from\n   */\n  var listsConnected = (function (destination, origin) {\n      // check if valid sortable\n      if (destination.isSortable === true) {\n          var acceptFrom = store(destination).getConfig('acceptFrom');\n          // check if acceptFrom is valid\n          if (acceptFrom !== null && acceptFrom !== false && typeof acceptFrom !== 'string') {\n              throw new Error('HTML5Sortable: Wrong argument, \"acceptFrom\" must be \"null\", \"false\", or a valid selector string.');\n          }\n          if (acceptFrom !== null) {\n              return acceptFrom !== false && acceptFrom.split(',').filter(function (sel) {\n                  return sel.length > 0 && origin.matches(sel);\n              }).length > 0;\n          }\n          // drop in same list\n          if (destination === origin) {\n              return true;\n          }\n          // check if lists are connected with connectWith\n          if (store(destination).getConfig('connectWith') !== undefined && store(destination).getConfig('connectWith') !== null) {\n              return store(destination).getConfig('connectWith') === store(origin).getConfig('connectWith');\n          }\n      }\n      return false;\n  });\n\n  /**\n   * default configurations\n   */\n  var defaultConfiguration = {\n      items: null,\n      // deprecated\n      connectWith: null,\n      // deprecated\n      disableIEFix: null,\n      acceptFrom: null,\n      copy: false,\n      placeholder: null,\n      placeholderClass: 'sortable-placeholder',\n      draggingClass: 'sortable-dragging',\n      hoverClass: false,\n      dropTargetContainerClass: false,\n      debounce: 0,\n      throttleTime: 100,\n      maxItems: 0,\n      itemSerializer: undefined,\n      containerSerializer: undefined,\n      customDragImage: null,\n      orientation: 'vertical'\n  };\n\n  /**\n   * make sure a function is only called once within the given amount of time\n   * @param {Function} fn the function to throttle\n   * @param {number} threshold time limit for throttling\n   */\n  // must use function to keep this context\n  function throttle (fn, threshold) {\n      var _this = this;\n      if (threshold === void 0) { threshold = 250; }\n      // check function\n      if (typeof fn !== 'function') {\n          throw new Error('You must provide a function as the first argument for throttle.');\n      }\n      // check threshold\n      if (typeof threshold !== 'number') {\n          throw new Error('You must provide a number as the second argument for throttle.');\n      }\n      var lastEventTimestamp = null;\n      return function () {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n              args[_i] = arguments[_i];\n          }\n          var now = Date.now();\n          if (lastEventTimestamp === null || now - lastEventTimestamp >= threshold) {\n              lastEventTimestamp = now;\n              fn.apply(_this, args);\n          }\n      };\n  }\n\n  /* eslint-env browser */\n  /**\n   * enable or disable hoverClass on mouseenter/leave if container Items\n   * @param {sortable} sortableContainer a valid sortableContainer\n   * @param {boolean} enable enable or disable event\n   */\n  var enableHoverClass = (function (sortableContainer, enable) {\n      if (typeof store(sortableContainer).getConfig('hoverClass') === 'string') {\n          var hoverClasses_1 = store(sortableContainer).getConfig('hoverClass').split(' ');\n          // add class on hover\n          if (enable === true) {\n              addEventListener(sortableContainer, 'mousemove', throttle(function (event) {\n                  // check of no mouse button was pressed when mousemove started == no drag\n                  if (event.buttons === 0) {\n                      filter(sortableContainer.children, store(sortableContainer).getConfig('items')).forEach(function (item) {\n                          var _a, _b;\n                          if (item === event.target || item.contains(event.target)) {\n                              (_a = item.classList).add.apply(_a, hoverClasses_1);\n                          }\n                          else {\n                              (_b = item.classList).remove.apply(_b, hoverClasses_1);\n                          }\n                      });\n                  }\n              }, store(sortableContainer).getConfig('throttleTime')));\n              // remove class on leave\n              addEventListener(sortableContainer, 'mouseleave', function () {\n                  filter(sortableContainer.children, store(sortableContainer).getConfig('items')).forEach(function (item) {\n                      var _a;\n                      (_a = item.classList).remove.apply(_a, hoverClasses_1);\n                  });\n              });\n              // remove events\n          }\n          else {\n              removeEventListener(sortableContainer, 'mousemove');\n              removeEventListener(sortableContainer, 'mouseleave');\n          }\n      }\n  });\n\n  /* eslint-env browser */\n  /*\n   * variables global to the plugin\n   */\n  var dragging;\n  var draggingHeight;\n  var draggingWidth;\n  /*\n   * Keeps track of the initialy selected list, where 'dragstart' event was triggered\n   * It allows us to move the data in between individual Sortable List instances\n   */\n  // Origin List - data from before any item was changed\n  var originContainer;\n  var originIndex;\n  var originElementIndex;\n  var originItemsBeforeUpdate;\n  // Previous Sortable Container - we dispatch as sortenter event when a\n  // dragged item enters a sortableContainer for the first time\n  var previousContainer;\n  // Destination List - data from before any item was changed\n  var destinationItemsBeforeUpdate;\n  /**\n   * remove event handlers from items\n   * @param {Array|NodeList} items\n   */\n  var removeItemEvents = function (items) {\n      removeEventListener(items, 'dragstart');\n      removeEventListener(items, 'dragend');\n      removeEventListener(items, 'dragover');\n      removeEventListener(items, 'dragenter');\n      removeEventListener(items, 'drop');\n      removeEventListener(items, 'mouseenter');\n      removeEventListener(items, 'mouseleave');\n  };\n  // Remove container events\n  var removeContainerEvents = function (originContainer, previousContainer) {\n      if (originContainer) {\n          removeEventListener(originContainer, 'dragleave');\n      }\n      if (previousContainer && (previousContainer !== originContainer)) {\n          removeEventListener(previousContainer, 'dragleave');\n      }\n  };\n  /**\n   * getDragging returns the current element to drag or\n   * a copy of the element.\n   * Is Copy Active for sortable\n   * @param {HTMLElement} draggedItem - the item that the user drags\n   * @param {HTMLElement} sortable a single sortable\n   */\n  var getDragging = function (draggedItem, sortable) {\n      var ditem = draggedItem;\n      if (store(sortable).getConfig('copy') === true) {\n          ditem = draggedItem.cloneNode(true);\n          addAttribute(ditem, 'aria-copied', 'true');\n          draggedItem.parentElement.appendChild(ditem);\n          ditem.style.display = 'none';\n          ditem.oldDisplay = draggedItem.style.display;\n      }\n      return ditem;\n  };\n  /**\n   * Remove data from sortable\n   * @param {HTMLElement} sortable a single sortable\n   */\n  var removeSortableData = function (sortable) {\n      removeData(sortable);\n      removeAttribute(sortable, 'aria-dropeffect');\n  };\n  /**\n   * Remove data from items\n   * @param {Array<HTMLElement>|HTMLElement} items\n   */\n  var removeItemData = function (items) {\n      removeAttribute(items, 'aria-grabbed');\n      removeAttribute(items, 'aria-copied');\n      removeAttribute(items, 'draggable');\n      removeAttribute(items, 'role');\n  };\n  /**\n   * find sortable from element. travels up parent element until found or null.\n   * @param {HTMLElement} element a single sortable\n   * @param {Event} event - the current event. We need to pass it to be able to\n   * find Sortable whith shadowRoot (document fragment has no parent)\n   */\n  function findSortable(element, event) {\n      if (event.composedPath) {\n          return event.composedPath().find(function (el) { return el.isSortable; });\n      }\n      while (element.isSortable !== true) {\n          element = element.parentElement;\n      }\n      return element;\n  }\n  /**\n   * Dragging event is on the sortable element. finds the top child that\n   * contains the element.\n   * @param {HTMLElement} sortableElement a single sortable\n   * @param {HTMLElement} element is that being dragged\n   */\n  function findDragElement(sortableElement, element) {\n      var options = addData(sortableElement, 'opts');\n      var items = filter(sortableElement.children, options.items);\n      var itemlist = items.filter(function (ele) {\n          return ele.contains(element) || (ele.shadowRoot && ele.shadowRoot.contains(element));\n      });\n      return itemlist.length > 0 ? itemlist[0] : element;\n  }\n  /**\n   * Destroy the sortable\n   * @param {HTMLElement} sortableElement a single sortable\n   */\n  var destroySortable = function (sortableElement) {\n      var opts = addData(sortableElement, 'opts') || {};\n      var items = filter(sortableElement.children, opts.items);\n      var handles = getHandles(items, opts.handle);\n      // disable adding hover class\n      enableHoverClass(sortableElement, false);\n      // remove event handlers & data from sortable\n      removeEventListener(sortableElement, 'dragover');\n      removeEventListener(sortableElement, 'dragenter');\n      removeEventListener(sortableElement, 'dragstart');\n      removeEventListener(sortableElement, 'dragend');\n      removeEventListener(sortableElement, 'drop');\n      // remove event data from sortable\n      removeSortableData(sortableElement);\n      // remove event handlers & data from items\n      removeEventListener(handles, 'mousedown');\n      removeItemEvents(items);\n      removeItemData(items);\n      removeContainerEvents(originContainer, previousContainer);\n      // clear sortable flag\n      sortableElement.isSortable = false;\n  };\n  /**\n   * Enable the sortable\n   * @param {HTMLElement} sortableElement a single sortable\n   */\n  var enableSortable = function (sortableElement) {\n      var opts = addData(sortableElement, 'opts');\n      var items = filter(sortableElement.children, opts.items);\n      var handles = getHandles(items, opts.handle);\n      addAttribute(sortableElement, 'aria-dropeffect', 'move');\n      addData(sortableElement, '_disabled', 'false');\n      addAttribute(handles, 'draggable', 'true');\n      // enable hover class\n      enableHoverClass(sortableElement, true);\n      // @todo: remove this fix\n      // IE FIX for ghost\n      // can be disabled as it has the side effect that other events\n      // (e.g. click) will be ignored\n      if (opts.disableIEFix === false) {\n          var spanEl = (document || window.document).createElement('span');\n          if (typeof spanEl.dragDrop === 'function') {\n              addEventListener(handles, 'mousedown', function () {\n                  if (items.indexOf(this) !== -1) {\n                      this.dragDrop();\n                  }\n                  else {\n                      var parent = this.parentElement;\n                      while (items.indexOf(parent) === -1) {\n                          parent = parent.parentElement;\n                      }\n                      parent.dragDrop();\n                  }\n              });\n          }\n      }\n  };\n  /**\n   * Disable the sortable\n   * @param {HTMLElement} sortableElement a single sortable\n   */\n  var disableSortable = function (sortableElement) {\n      var opts = addData(sortableElement, 'opts');\n      var items = filter(sortableElement.children, opts.items);\n      var handles = getHandles(items, opts.handle);\n      addAttribute(sortableElement, 'aria-dropeffect', 'none');\n      addData(sortableElement, '_disabled', 'true');\n      addAttribute(handles, 'draggable', 'false');\n      removeEventListener(handles, 'mousedown');\n      enableHoverClass(sortableElement, false);\n  };\n  /**\n   * Reload the sortable\n   * @param {HTMLElement} sortableElement a single sortable\n   * @description events need to be removed to not be double bound\n   */\n  var reloadSortable = function (sortableElement) {\n      var opts = addData(sortableElement, 'opts');\n      var items = filter(sortableElement.children, opts.items);\n      var handles = getHandles(items, opts.handle);\n      addData(sortableElement, '_disabled', 'false');\n      // remove event handlers from items\n      removeItemEvents(items);\n      removeContainerEvents(originContainer, previousContainer);\n      removeEventListener(handles, 'mousedown');\n      // remove event handlers from sortable\n      removeEventListener(sortableElement, 'dragover');\n      removeEventListener(sortableElement, 'dragenter');\n      removeEventListener(sortableElement, 'drop');\n  };\n  /**\n   * Public sortable object\n   * @param {Array|NodeList} sortableElements\n   * @param {object|string} options|method\n   */\n  function sortable(sortableElements, options) {\n      // get method string to see if a method is called\n      var method = String(options);\n      options = options || {};\n      // check if the user provided a selector instead of an element\n      if (typeof sortableElements === 'string') {\n          sortableElements = document.querySelectorAll(sortableElements);\n      }\n      // if the user provided an element, return it in an array to keep the return value consistant\n      if (sortableElements instanceof HTMLElement) {\n          sortableElements = [sortableElements];\n      }\n      sortableElements = Array.prototype.slice.call(sortableElements);\n      if (/serialize/.test(method)) {\n          return sortableElements.map(function (sortableContainer) {\n              var opts = addData(sortableContainer, 'opts');\n              return serialize(sortableContainer, opts.itemSerializer, opts.containerSerializer);\n          });\n      }\n      sortableElements.forEach(function (sortableElement) {\n          if (/enable|disable|destroy/.test(method)) {\n              return sortable[method](sortableElement);\n          }\n          // log deprecation\n          ['connectWith', 'disableIEFix'].forEach(function (configKey) {\n              if (Object.prototype.hasOwnProperty.call(options, configKey) && options[configKey] !== null) {\n                  console.warn(\"HTML5Sortable: You are using the deprecated configuration \\\"\" + configKey + \"\\\". This will be removed in an upcoming version, make sure to migrate to the new options when updating.\");\n              }\n          });\n          // merge options with default options\n          options = Object.assign({}, defaultConfiguration, store(sortableElement).config, options);\n          // init data store for sortable\n          store(sortableElement).config = options;\n          // set options on sortable\n          addData(sortableElement, 'opts', options);\n          // property to define as sortable\n          sortableElement.isSortable = true;\n          // reset sortable\n          reloadSortable(sortableElement);\n          // initialize\n          var listItems = filter(sortableElement.children, options.items);\n          // create element if user defined a placeholder element as a string\n          var customPlaceholder;\n          if (options.placeholder !== null && options.placeholder !== undefined) {\n              var tempContainer = document.createElement(sortableElement.tagName);\n              if (options.placeholder instanceof HTMLElement) {\n                  tempContainer.appendChild(options.placeholder);\n              }\n              else {\n                  tempContainer.innerHTML = options.placeholder;\n              }\n              customPlaceholder = tempContainer.children[0];\n          }\n          // add placeholder\n          store(sortableElement).placeholder = makePlaceholder(sortableElement, customPlaceholder, options.placeholderClass);\n          addData(sortableElement, 'items', options.items);\n          if (options.acceptFrom) {\n              addData(sortableElement, 'acceptFrom', options.acceptFrom);\n          }\n          else if (options.connectWith) {\n              addData(sortableElement, 'connectWith', options.connectWith);\n          }\n          enableSortable(sortableElement);\n          addAttribute(listItems, 'role', 'option');\n          addAttribute(listItems, 'aria-grabbed', 'false');\n          /*\n           Handle drag events on draggable items\n           Handle is set at the sortableElement level as it will bubble up\n           from the item\n           */\n          addEventListener(sortableElement, 'dragstart', function (e) {\n              // ignore dragstart events\n              var target = getEventTarget(e);\n              if (target.isSortable === true) {\n                  return;\n              }\n              e.stopImmediatePropagation();\n              if ((options.handle && !target.matches(options.handle)) || target.getAttribute('draggable') === 'false') {\n                  return;\n              }\n              var sortableContainer = findSortable(target, e);\n              var dragItem = findDragElement(sortableContainer, target);\n              // grab values\n              originItemsBeforeUpdate = filter(sortableContainer.children, options.items);\n              originIndex = originItemsBeforeUpdate.indexOf(dragItem);\n              originElementIndex = getIndex(dragItem, sortableContainer.children);\n              originContainer = sortableContainer;\n              // add transparent clone or other ghost to cursor\n              setDragImage(e, dragItem, options.customDragImage);\n              // cache selsection & add attr for dragging\n              draggingHeight = getElementHeight(dragItem);\n              draggingWidth = getElementWidth(dragItem);\n              dragItem.classList.add(options.draggingClass);\n              dragging = getDragging(dragItem, sortableContainer);\n              addAttribute(dragging, 'aria-grabbed', 'true');\n              // dispatch sortstart event on each element in group\n              sortableContainer.dispatchEvent(new CustomEvent('sortstart', {\n                  detail: {\n                      origin: {\n                          elementIndex: originElementIndex,\n                          index: originIndex,\n                          container: originContainer\n                      },\n                      item: dragging,\n                      originalTarget: target\n                  }\n              }));\n          });\n          /*\n           We are capturing targetSortable before modifications with 'dragenter' event\n          */\n          addEventListener(sortableElement, 'dragenter', function (e) {\n              var target = getEventTarget(e);\n              var sortableContainer = findSortable(target, e);\n              if (sortableContainer && sortableContainer !== previousContainer) {\n                  destinationItemsBeforeUpdate = filter(sortableContainer.children, addData(sortableContainer, 'items'))\n                      .filter(function (item) { return item !== store(sortableElement).placeholder; });\n                  if (options.dropTargetContainerClass) {\n                      sortableContainer.classList.add(options.dropTargetContainerClass);\n                  }\n                  sortableContainer.dispatchEvent(new CustomEvent('sortenter', {\n                      detail: {\n                          origin: {\n                              elementIndex: originElementIndex,\n                              index: originIndex,\n                              container: originContainer\n                          },\n                          destination: {\n                              container: sortableContainer,\n                              itemsBeforeUpdate: destinationItemsBeforeUpdate\n                          },\n                          item: dragging,\n                          originalTarget: target\n                      }\n                  }));\n                  addEventListener(sortableContainer, 'dragleave', function (e) {\n                      // TODO: rename outTarget to be more self-explanatory\n                      // e.fromElement for very old browsers, similar to relatedTarget\n                      var outTarget = e.relatedTarget || e.fromElement;\n                      if (!e.currentTarget.contains(outTarget)) {\n                          if (options.dropTargetContainerClass) {\n                              sortableContainer.classList.remove(options.dropTargetContainerClass);\n                          }\n                          sortableContainer.dispatchEvent(new CustomEvent('sortleave', {\n                              detail: {\n                                  origin: {\n                                      elementIndex: originElementIndex,\n                                      index: originIndex,\n                                      container: sortableContainer\n                                  },\n                                  item: dragging,\n                                  originalTarget: target\n                              }\n                          }));\n                      }\n                  });\n              }\n              previousContainer = sortableContainer;\n          });\n          /*\n           * Dragend Event - https://developer.mozilla.org/en-US/docs/Web/Events/dragend\n           * Fires each time dragEvent end, or ESC pressed\n           * We are using it to clean up any draggable elements and placeholders\n           */\n          addEventListener(sortableElement, 'dragend', function (e) {\n              if (!dragging) {\n                  return;\n              }\n              dragging.classList.remove(options.draggingClass);\n              addAttribute(dragging, 'aria-grabbed', 'false');\n              if (dragging.getAttribute('aria-copied') === 'true' && addData(dragging, 'dropped') !== 'true') {\n                  dragging.remove();\n              }\n              if (dragging.oldDisplay !== undefined) {\n                  dragging.style.display = dragging.oldDisplay;\n                  delete dragging.oldDisplay;\n              }\n              var visiblePlaceholder = Array.from(stores.values()).map(function (data) { return data.placeholder; })\n                  .filter(function (placeholder) { return placeholder instanceof HTMLElement; })\n                  .filter(isInDom)[0];\n              if (visiblePlaceholder) {\n                  visiblePlaceholder.remove();\n              }\n              // dispatch sortstart event on each element in group\n              sortableElement.dispatchEvent(new CustomEvent('sortstop', {\n                  detail: {\n                      origin: {\n                          elementIndex: originElementIndex,\n                          index: originIndex,\n                          container: originContainer\n                      },\n                      item: dragging\n                  }\n              }));\n              previousContainer = null;\n              dragging = null;\n              draggingHeight = null;\n              draggingWidth = null;\n          });\n          /*\n           * Drop Event - https://developer.mozilla.org/en-US/docs/Web/Events/drop\n           * Fires when valid drop target area is hit\n           */\n          addEventListener(sortableElement, 'drop', function (e) {\n              if (!listsConnected(sortableElement, dragging.parentElement)) {\n                  return;\n              }\n              e.preventDefault();\n              e.stopPropagation();\n              addData(dragging, 'dropped', 'true');\n              // get the one placeholder that is currently visible\n              var visiblePlaceholder = Array.from(stores.values()).map(function (data) {\n                  return data.placeholder;\n              })\n                  // filter only HTMLElements\n                  .filter(function (placeholder) { return placeholder instanceof HTMLElement; })\n                  // only elements in DOM\n                  .filter(isInDom)[0];\n              if (visiblePlaceholder) {\n                  visiblePlaceholder.replaceWith(dragging);\n                  // to avoid flickering restoring element display immediately after replacing placeholder\n                  if (dragging.oldDisplay !== undefined) {\n                      dragging.style.display = dragging.oldDisplay;\n                      delete dragging.oldDisplay;\n                  }\n              }\n              else {\n                  // set the dropped value to 'false' to delete copied dragging at the time of 'dragend'\n                  addData(dragging, 'dropped', 'false');\n                  return;\n              }\n              /*\n               * Fires Custom Event - 'sortstop'\n               */\n              sortableElement.dispatchEvent(new CustomEvent('sortstop', {\n                  detail: {\n                      origin: {\n                          elementIndex: originElementIndex,\n                          index: originIndex,\n                          container: originContainer\n                      },\n                      item: dragging\n                  }\n              }));\n              var placeholder = store(sortableElement).placeholder;\n              var originItems = filter(originContainer.children, options.items)\n                  .filter(function (item) { return item !== placeholder; });\n              var destinationContainer = this.isSortable === true ? this : this.parentElement;\n              var destinationItems = filter(destinationContainer.children, addData(destinationContainer, 'items'))\n                  .filter(function (item) { return item !== placeholder; });\n              var destinationElementIndex = getIndex(dragging, Array.from(dragging.parentElement.children)\n                  .filter(function (item) { return item !== placeholder; }));\n              var destinationIndex = getIndex(dragging, destinationItems);\n              if (options.dropTargetContainerClass) {\n                  destinationContainer.classList.remove(options.dropTargetContainerClass);\n              }\n              /*\n               * When a list item changed container lists or index within a list\n               * Fires Custom Event - 'sortupdate'\n               */\n              if (originElementIndex !== destinationElementIndex || originContainer !== destinationContainer) {\n                  sortableElement.dispatchEvent(new CustomEvent('sortupdate', {\n                      detail: {\n                          origin: {\n                              elementIndex: originElementIndex,\n                              index: originIndex,\n                              container: originContainer,\n                              itemsBeforeUpdate: originItemsBeforeUpdate,\n                              items: originItems\n                          },\n                          destination: {\n                              index: destinationIndex,\n                              elementIndex: destinationElementIndex,\n                              container: destinationContainer,\n                              itemsBeforeUpdate: destinationItemsBeforeUpdate,\n                              items: destinationItems\n                          },\n                          item: dragging\n                      }\n                  }));\n              }\n          });\n          var debouncedDragOverEnter = debounce(function (sortableElement, element, pageX, pageY) {\n              if (!dragging) {\n                  return;\n              }\n              // set placeholder height if forcePlaceholderSize option is set\n              if (options.forcePlaceholderSize) {\n                  store(sortableElement).placeholder.style.height = draggingHeight + 'px';\n                  store(sortableElement).placeholder.style.width = draggingWidth + 'px';\n              }\n              // if element the draggedItem is dragged onto is within the array of all elements in list\n              // (not only items, but also disabled, etc.)\n              if (Array.from(sortableElement.children).indexOf(element) > -1) {\n                  var thisHeight = getElementHeight(element);\n                  var thisWidth = getElementWidth(element);\n                  var placeholderIndex = getIndex(store(sortableElement).placeholder, element.parentElement.children);\n                  var thisIndex = getIndex(element, element.parentElement.children);\n                  // Check if `element` is bigger than the draggable. If it is, we have to define a dead zone to prevent flickering\n                  if (thisHeight > draggingHeight || thisWidth > draggingWidth) {\n                      // Dead zone?\n                      var deadZoneVertical = thisHeight - draggingHeight;\n                      var deadZoneHorizontal = thisWidth - draggingWidth;\n                      var offsetTop = offset(element).top;\n                      var offsetLeft = offset(element).left;\n                      if (placeholderIndex < thisIndex &&\n                          ((options.orientation === 'vertical' && pageY < offsetTop) ||\n                              (options.orientation === 'horizontal' && pageX < offsetLeft))) {\n                          return;\n                      }\n                      if (placeholderIndex > thisIndex &&\n                          ((options.orientation === 'vertical' && pageY > offsetTop + thisHeight - deadZoneVertical) ||\n                              (options.orientation === 'horizontal' && pageX > offsetLeft + thisWidth - deadZoneHorizontal))) {\n                          return;\n                      }\n                  }\n                  if (dragging.oldDisplay === undefined) {\n                      dragging.oldDisplay = dragging.style.display;\n                  }\n                  if (dragging.style.display !== 'none') {\n                      dragging.style.display = 'none';\n                  }\n                  // To avoid flicker, determine where to position the placeholder\n                  // based on where the mouse pointer is relative to the elements\n                  // vertical center.\n                  var placeAfter = false;\n                  try {\n                      var elementMiddleVertical = offset(element).top + element.offsetHeight / 2;\n                      var elementMiddleHorizontal = offset(element).left + element.offsetWidth / 2;\n                      placeAfter = (options.orientation === 'vertical' && (pageY >= elementMiddleVertical)) ||\n                          (options.orientation === 'horizontal' && (pageX >= elementMiddleHorizontal));\n                  }\n                  catch (e) {\n                      placeAfter = placeholderIndex < thisIndex;\n                  }\n                  if (placeAfter) {\n                      insertAfter(element, store(sortableElement).placeholder);\n                  }\n                  else {\n                      insertBefore(element, store(sortableElement).placeholder);\n                  }\n                  // get placeholders from all stores & remove all but current one\n                  Array.from(stores.values())\n                      // remove empty values\n                      .filter(function (data) { return data.placeholder !== undefined; })\n                      // foreach placeholder in array if outside of current sorableContainer -> remove from DOM\n                      .forEach(function (data) {\n                      if (data.placeholder !== store(sortableElement).placeholder) {\n                          data.placeholder.remove();\n                      }\n                  });\n              }\n              else {\n                  // get all placeholders from store\n                  var placeholders = Array.from(stores.values())\n                      .filter(function (data) { return data.placeholder !== undefined; })\n                      .map(function (data) {\n                      return data.placeholder;\n                  });\n                  // check if element is not in placeholders\n                  if (placeholders.indexOf(element) === -1 && sortableElement === element && !filter(element.children, options.items).length) {\n                      placeholders.forEach(function (element) { return element.remove(); });\n                      element.appendChild(store(sortableElement).placeholder);\n                  }\n              }\n          }, options.debounce);\n          // Handle dragover and dragenter events on draggable items\n          var onDragOverEnter = function (e) {\n              var element = e.target;\n              var sortableElement = element.isSortable === true ? element : findSortable(element, e);\n              element = findDragElement(sortableElement, element);\n              if (!dragging || !listsConnected(sortableElement, dragging.parentElement) || addData(sortableElement, '_disabled') === 'true') {\n                  return;\n              }\n              var options = addData(sortableElement, 'opts');\n              if (parseInt(options.maxItems) && filter(sortableElement.children, addData(sortableElement, 'items')).length > parseInt(options.maxItems) && dragging.parentElement !== sortableElement) {\n                  return;\n              }\n              e.preventDefault();\n              e.stopPropagation();\n              e.dataTransfer.dropEffect = store(sortableElement).getConfig('copy') === true ? 'copy' : 'move';\n              debouncedDragOverEnter(sortableElement, element, e.pageX, e.pageY);\n          };\n          addEventListener(listItems.concat(sortableElement), 'dragover', onDragOverEnter);\n          addEventListener(listItems.concat(sortableElement), 'dragenter', onDragOverEnter);\n      });\n      return sortableElements;\n  }\n  sortable.destroy = function (sortableElement) {\n      destroySortable(sortableElement);\n  };\n  sortable.enable = function (sortableElement) {\n      enableSortable(sortableElement);\n  };\n  sortable.disable = function (sortableElement) {\n      disableSortable(sortableElement);\n  };\n  /* START.TESTS_ONLY */\n  sortable.__testing = {\n      // add internal methods here for testing purposes\n      data: addData,\n      removeItemEvents: removeItemEvents,\n      removeItemData: removeItemData,\n      removeSortableData: removeSortableData,\n      removeContainerEvents: removeContainerEvents\n  };\n\n  return sortable;\n\n});\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * ---------------------------------------------------------------------\n *\n * GLPI - Gestionnaire Libre de Parc Informatique\n *\n * http://glpi-project.org\n *\n * @copyright 2015-2023 Teclib' and contributors.\n * @copyright 2003-2014 by the INDEPNET Development Team.\n * @licence   https://www.gnu.org/licenses/gpl-3.0.html\n *\n * ---------------------------------------------------------------------\n *\n * LICENSE\n *\n * This file is part of GLPI.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <https://www.gnu.org/licenses/>.\n *\n * ---------------------------------------------------------------------\n */\n\nwindow.sortable = require(\"html5sortable/dist/html5sortable.amd.js\");"],"names":[],"sourceRoot":""}			
			


Thanks For 0xGh05T - DSRF14 - Mr.Dan07 - Leri01 - FxshX7 - AlkaExploiter - xLoveSyndrome'z - Acep Gans'z

JMDS TRACK – Just Another Diagnostics Lab Site

Home

JMDS TRACK Cameroon

Boost the productivity of your mobile ressources


Make An Appointment


Fleet management

  1. Reduce the operting cost and the unavailability of your vehicles
  2. reduce the fuel consumption of your fleet
  3. Improve the driving dehavior and safety of your drivers
  4. optimize the utilization rate of your equipment 
  5. protect your vehicle against theft
  6. Improve the quality of your customer service


Find out more

Assets management

  1. Track the roaming of your equipment
  2. Optimise the management of your assets on site and during transport
  3. Secure the transport of your goods
  4. Make your team responsible for preventing the loss of tools, equipment
  5. Take a real-time inventory of your equipment on site
  6. Easily find your mobile objects or equipment



Find out more



Find out more

Antitheft solutions

  1. Secure your vehicles and machinery and increase your chances of recovering them in the event of theft
  2. Protect your assets and reduce the costs associated with their loss
  3. Combine immobiliser and driver identification and limit the risk of theft
  4. Identify fuel theft and reduce costs
  5. Protect your goods and take no more risks
  6. Be alerted to abnormal events

Our Location

 Douala BP cité 

     and

Yaoundé Total Essos


Make An Appointment


Get Directions

682230363/ 677481892

What makes us different from others

  • young and dynamic team
  • call center 24/24 7/7
  • roaming throughout Africa
  • team of developers who can develop customer-specific solutions
  • diversity of services
  • reactive and prompt after-sales service when soliciting a customer or a malfunction
  • Free Maintenance and installation in the cities of Douala and Yaounde

https://youtu.be/xI1cz_Jh2x8

15+
years of experience in GPS system development, production and deployment.

15 Collaborators

More than 15 employees dedicated to the research and development of new applications and to customer care

5 000 Vehicles and mobile assets

5 000 vehicles and mobile assets under management, in Africa

Our Partners










Latest Case Studies

Our current projects 

5/5
Bon SAV , SATISFAIT DU TRAITEMENT DES REQUETES

M DIPITA CHRISTIAN
Logistic Safety Manager Road Safety Manager
5/5
La réactivité de JMDS est excellente
Nous restons satisfait dans l’ensemble des prestations relatives a la couverture de notre parc automobile

Hervé Frédéric NDENGUE
Chef Service Adjoint de la Sécurité Générale (CNPS)
5/5
L’APPLICATION EMIXIS est convivial A L’utilisation
BEIG-3 SARL
DIRECTOR GENERAL
5/5
Nevertheless I am delighted with the service
MR. BISSE BENJAMIN
CUSTOMER

Subsribe To Our Newsletter

Stay in touch with us to get latest news and special offers.



Address JMDS TRACK

Douala bp cité



and

YAOUNDE Total Essos

Call Us

+237682230363



Email Us


info@jmdstrack.cm