{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/js/ESDDrag.js","webpack:///./src/App.vue","webpack:///./src/js/checkUID.js","webpack:///./src/js/dbgMessages.js","webpack:///./src/js/utils.js","webpack:///./src/js/constants.js","webpack:///./src/js/ESDValidateIconPack.js","webpack:///./src/js/ESDIconPackParser.js","webpack:///./src/js/ESDIconPackManifest.js","webpack:///./src/js/ESDImageScaler.js","webpack:///./src/js/ELGEventEmitter.js","webpack:///./src/js/ESDIconPack.js","webpack:///./src/js/ESDValidateZippedIconPack.js","webpack:///./src/js/ESDFileSelector.js","webpack:///./src/components/head-component.vue","webpack:///src/components/head-component.vue","webpack:///./src/components/head-component.vue?de13","webpack:///./src/components/head-component.vue?721e","webpack:///./src/components/info-component.vue","webpack:///src/components/info-component.vue","webpack:///./src/components/info-component.vue?1fae","webpack:///./src/components/info-component.vue?fe55","webpack:///./src/components/json-component.vue","webpack:///src/components/json-component.vue","webpack:///./src/components/json-component.vue?3780","webpack:///./src/components/json-component.vue?826e","webpack:///./src/components/filelist-component.vue","webpack:///src/components/filelist-component.vue","webpack:///./src/components/filelist-component.vue?526e","webpack:///./src/components/filelist-component.vue?c71a","webpack:///./src/components/markdown-component.vue","webpack:///src/components/markdown-component.vue","webpack:///./src/components/markdown-component.vue?e9c9","webpack:///./src/components/markdown-component.vue?34cb","webpack:///./src/version.js","webpack:///src/App.vue","webpack:///./src/App.vue?03b3","webpack:///./src/App.vue?315a","webpack:///./src/main.js","webpack:///./src/components/json-component.vue?05d8","webpack:///./src/components/head-component.vue?d943","webpack:///./src/components/info-component.vue?36c3"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","preventDefaults","e","preventDefault","stopPropagation","highlight","f","_cb","target","stopImmediatePropagation","classList","contains","add","unhighlight","remove","startDragAndDropForElement","dropArea","dropCallback","moreCallback","Array","isArray","forEach","handleDragDrop","addListeners","addFn","handleDrop","eventName","render","_vm","this","_c","_self","ref","attrs","directives","rawName","fn","expression","staticClass","version","sheetData","docs","on","toggleConsole","toggleSidebar","loadComponentData","loadIconPack","darkMode","dynamicComponent","dynamicData","class","mark","iconPack","iconsjson","loading","$event","currentTarget","handleSelection","_v","_s","__sortState","setIconPackIcon","icon","_l","previews","file","staticStyle","isPreview","removePreview","altKey","addIconPackPreview","objectURL","previewName","indexOf","icons","updated","doRemoveFromAllIcons","draggingChanged","sidebar","uid","modifiers","domProps","uidNeedsCheck","uidExists","manifest","nodetype","doRemoveMapping","_e","dbgShowSettings","state","type","gray","infoMsg","duplicates","detailsOpened","detailsOpen","fullPath","progress","readOnly","doExportIconPack","consoleVisible","showValidator","consoleOpen","dbgMessages","msg","error","err","caution","topic","timestamp","text","hidden","staticRenderFns","stripNotAllowed","replace","checkUID","inVal","forceLowerCase","separator","def","val","trim","toLowerCase","split","map","u","filter","join","generateTimeStamp","Date","toISOString","clear","hasErrors","some","hasWarnings","log","what","console","table","defineProperties","warnings","errors","topics","dbgprintf","args","sprintf","debug","testErr","startsWith","isError","index","app","setTimeout","dbgScrollToView","Utils","tist","now","int2ip","ipInt","ip2int","ip","reduce","octet","parseInt","toIP","Error","exec","toInt","array","Math","pow","prev","curr","tagify","arr","tagSet","Set","from","hasUpperCase","str","test","getLowerCaseExtension","pop","getFilenameWithLowerCaseExtension","ext","getUrlParameter","nameA","regex","RegExp","results","location","search","decodeURIComponent","throttle","threshold","context","last","timer","ctx","getTime","arguments","clearTimeout","loadImageData","inUrl","callback","image","Image","onload","src","loadImagePromise","url","Promise","resolve","img","status","h","naturalHeight","w","naturalWidth","onerror","hashCode","hash","charCodeAt","intToColor","toString","toUpperCase","padStart","colorFromString","parseJson","jsonString","_errCb","JSON","parse","stripSpecials","removeFromArray","item","removeAllOccurences","changed","removeFromArrayAllLoop","len","elt","readFileP","reader","FileReader","onloadend","evt","readAsText","getFileFromFileEntryP","entry","path","reject","getFile","getDirectoryFromEntryP","getDirectory","getFileFromFileEntry","URL","createObjectURL","fetchFile","fileObj","responseType","trace","includes","readAsArrayBuffer","readAsDataURL","catch","fetchXhr","req","XMLHttpRequest","withCredentials","ok","response","addEventListener","open","send","pick6","keys","acc","pick","obj","loadDataPromise","loadAsJson","dbg","xhr","overrideMimeType","onreadystatechange","readyState","responseText","uploadFile","FormData","append","fileInput","files","setRequestHeader","uploadOptions","method","Authorization","catalog","assign","uploadOptionsFn","token","GetUUIDFromFilePath","extension","EplFile_GetExtension","substr","uploadFileP","options","css","entries","props","isDataURL","match","drawStringToCanvas","size","inCanvas","canvas","document","createElement","tempCtx","getContext","clearRect","width","height","font","fontWeight","lineHeight","fillStyle","textAlign","textBaseline","wrapText","x","y","maxWidth","words","metrics","line","tmpStr","measureText","substring","fillText","reverseString","reverse","getFontSize","body","resizeFont","fontSize","minFontSize","div","span","setAttribute","appendChild","innerHTML","title","style","textIndent","visibility","offsetWidth","removeChild","stringToHTML","html","all","template","content","firstChild","stringToHTMLDiv","className","debounce","func","wait","timeout","CHECKUID_FORCE_LOWERCASE","PLUGIN_EXTENSION","ICON_PACK_EXTENSION","kESDObjectType_Plugin","kESDObjectType_IconPack","kESDIconPackSupportedResult_Supported","NULL","_UP_WINDOWS","MAX_PATH","LONG_PATH_PREFIX","npos","String","find","rfind","lastIndexOf","empty","c_str","createErrorMessage","message","EplFile_GetPathDelimiter","GetDebugTerm","inObjectType","EplFile_FileExists","inUtf8FilePath","privateErrorFlag","abort","EplString_HasPrefix","inString","inPrefix","EplString_HasSuffix","inSuffix","endsWith","EplFile_AddPathComponent","inPath","inComponentToAdd","delimiter","lastChar","pathEndsWithDelimiter","firstChar","charAt","compStartsWithDelimiter","replaceAll","EplFile_GetLongPathWithPrefix","EplFile_GetFileName","delimiterString","pathWithoutTrailingDelimiter","pos","fileName","GetFilenameFromFilePath","outFilename","lastindex","pathWithNoExtension","lastPathDelimiterIndex","GetManifestFromFilePath","GetManifestFromFilePathJS","inObj","inComponent","GetPathForComponent","GetFolderContents","then","isDirectory","onlyFiles","directoryReader","createReader","arrEntries","readFolderEntries","readEntries","ae","GetFolder","folderName","IsValidURI","inURIString","isValidURI","previousChar","IsValidPath","IsValidVersion","inVersion","isvalid","character","IsValidUUID","inUUID","reverseDNSRegEx","isInPath","parent","child","parents","every","async","ValidateIconPack","ValidateIconPackAsync","success","inPathMulti","isFileObject","iconPackFiles","iconPackIconsFolder","iconsFiles","previewImagesFolder","previewFiles","Folder_FileExists","folder","found","isFile","sort","a","b","filename","uuid","manifestPath","debugTerm","supportedResult","ESDIconPackParser","CreateIconPackFromPath","GetVersion","GetName","GetAuthor","iconURL","GetURL","GetUUID","GetIconFullPath","iconPath","GetIcon","iconExists","utils","license","GetLicenseFullPath","licenseFileName","GetLicense","licenseMetaData","iconsMetadataPath","GetIconsMetadataFullPath","iconMetaData","iconsMetadataSupportedResult","iconsMetadata","CreateIconsMetadataFromPath","allKnownIconPaths","iconMetadata","iconMetadataFullPath","GetFullPathForIcon","fileExists","tag","tags","iconName","inIconsPath","complementaryPngExists","iconsFolder","GetIconsFolderFullPath","ESDIconPackC","constructor","UUID","Version","Name","Author","Icon","License","manifestFullPath","mIconPath","mFullPath","mLicensePath","inIconPath","ICON_PACK_VERSION","ICON_PACK_NAME","ICON_PACK_AUTHOR","ICON_PACK_URL","ICON_PACK_ICON","ICON_PACK_LICENSE","ICON_METADATA_NAME","ICON_METADATA_PATH","ICON_METADATA_TAGS","SD_DISTRIBUTION_TOOL","kESDIconPackSupportedResult_Malformed","readFileEntry","successCallback","errorCallback","fetchFileSync","inFullPath","request","ESDIconPackParserC","inManifestPath","outSupportedResult","ifstream","manifestJson","author","errMsg","outIconsMetadata","iconsJson","iconMetadataJson","tagsJson","MANIFEST","ESDIconPackManifest","__manifestFilePath","__loaded","__license","__iconPack","_Icon","_license","getFileObj","inData","removeIcon","toJSON","compile","stringify","setFile","setLicenseText","readFromFile","readFromFileObject","catchedErr","readFile","k","File","fileObject","ESDImageScaler","defaultImageName","coverMode","loadImage","imgPathOrFileobj","loadImageP","dataUrl","Blob","loadAndScaleImage","imageSrc","revokeObjectURL","scaleAndDrawImage","toDataURL","ratio","max","min","centerX","centerY","drawImage","ELGEventEmitter","id","eventList","Map","has","set","pubSub","sub","emit","pub","subscribers","delete","freeze","MRequiredSizeFactor","placeholder_preview","emitr","emtr","ESDIconPack","super","_defineProperty","init","__iconsToAdd","__iconAsDataURL","__iconsjson","forceThumbnail","esdIcons","lazy","__icon","getIconAsDataUrl","du","__uid","blob","setMeta","getSelected","isSelected","prop","getMeta","insertItemsAtIndex","items","insertItemAtIndex","replaceItemAtIndex","idx","replacePreviewAtIndex","logPreviewNames","swapPreviews","to","fromItem","toItem","insertPreviewAtIndex","preview","addPreview","foundPlaceHolderIndex","undefined","sortPreviews","localeCompare","removeAll","removeId","cleanPreviewsFromPlaceholders","inArr","hasIconsJson","readManifest","setManifestFromJson","jsn","droppedFiles","dataTransfer","setIcon","isGif","inFile","createThumbnail","fl","thumbNail","fa","suffix","addIconAtIndex","ipIcon","loadThumbnailThreaded","ms","hasThumbnail","debouncedEmit","sortIconPack","findIndex","addIconT","addIcon","zip","addIconOld","createIconList","fileNameWithLowerCaseExtension","icn","addStatus","_status","tips","verifyAllIcons","verifyIcon","sortIcons","sortField","asc","desc","sortFn","checkIcons","processThreaded","imageinfo","floor","checked","alt","exportIconPack","streamDeckIconPackExtension","suffixMap","JSZip","iconPackBundleID","iconPackBundleName","baseFolder","previewsFolder","isDataUrlMatches","fd","base64","thumbP","allP","binary","zippedFile","values","thumbnailNameWithLowerCaseExtension","cleanedPreviews","generateAsync","saveAs","curIcon","MAllowedFileTypes","isIconRegex","ignoreFilesRegex","removeIgnoredFiles","ValidateZippedIconPack","stripInvisibles","sdIconPackFileName","jsZip","checkGifHasComplementaryPng","png","getIconPackName","zippedFiles","firstEntry","loadAsync","createFolders","sdIconPackName","filterZipFileByName","dir","orphanedGifs","ESDFileSelectorXX","inOptions","clr","initOptions","getFolders","flatten","concat","traverseDirectory","fileEntries","getFolderContents","folderPromises","filePromises","dataTransferFiles","flattenedEntries","fileEntry","hello","handleFilePromises","bFolderMode","self","resolveDirectory","iterationAttempts","errorHandler","batchEntries","filteredEntries","batchEntry","isValidFile","packageFile","fileTypeOverride","hasExtension","fileExtension","mappedMimeTypes","includeObjectUrl","lastModified","copyString","promises","arrFiles","addFilesToArray","shouldIgnoreFile","getDataTransferFiles","listItem","webkitGetAsEntry","hfp","rxStart","lastIndex","ignoredFilenames","aString","defaultOptions","allowAll","allowedFileTypes","allowedFileTypesB","ignoreFilesStartingWith","avi","tiff","gif","ico","jpeg","jpg","mkv","mov","mp4","pdf","rxStartsWith","rxEndsWith","rxValid","origin","getDroppedOrSelectedFiles","event","fileList","dragDropFileList","inputFieldFileList","_m","home","documents","doc","active","loaded","default","Boolean","methods","$emit","component","sheetopen","_k","keyCode","sheetposition","dynamiccomponent","dynamicdata","resetScrollPosition","dark","computed","innerHeight","$refs","sheet","focus","tof","$root","handleDropFromComponent","tableheadings","rowsMap","v","isVisible","kc_icons","mappingForKey","togglePassword","rows","refInFor","isDisabled","_i","$$a","$$el","$$c","$$v","$$i","$set","_q","composing","renameObjectKeys","sourceObj","mapObj","keyValues","excludes","namesmap","typesmap","stats","stat","passwordfield","getAttribute","defaultValue","iscard","toggleListType","allTags","setAllProps","sdList","sortedBy","isSortedBy","doSort","shouldDraw","_b","dragging","drag","onMoveCallback","getComponentData","onStart","onEnd","onChoose","dragOptions","cardList","card","selected","hasThumbNail","getThumbNail","columns","row","doRemoveIcon","display","order","components","draggable","Number","animation","disabled","ghostClass","multiDrag","selectedClass","removeCloneOnHide","lastClickedIdx","watch","$options","filters","logItems","arrSelection","filesToProcess","insertAtIndex","selectedItems","notSelectedItems","newIndex","originalEvent","handleChange","inputChanged","activeNames","change","input","wrap","deselectAll","fileIdx","nodeName","shiftKey","metaKey","isSel","toIndex","fromIndex","isEditable","col","field","compiledMarkdown","DOMPurify","sanitize","marked","versionInfo","major","minor","patch","build","MTimeoutGuardMs","kStorageName","HeadComponent","JsonComponent","InfoComponent","FilelistComponent","createIconPack","allIcons","lastSaved","toLocaleTimeString","timeoutGuard","beforeMount","sttgs","localStorage","getObject","mounted","utls","time","getHours","throttledUpdate","oldValue","setObject","$watch","deep","removeSpecials","createTimeOutGuard","filelist","reset","peek","fetch","json","available","lockMessages","messageContainer","scrollTop","scrollHeight","arrOrObj","setloading","openConsole","accept","onchange","click","onlyMeta","droppedFileName","checkFile","fileNameWithoutExtension","isPackedFile","checkComplementaryIfGif","lowerCaseExtension","processed","pushZippedFile","targetArray","pngFileName","dbgMessageIndex","dbgMessage","res","loadFromZip","toJson","iconsJsonPromise","loadZipEntry","contentType","mimeType","needsThumbnail","_name","loadIcons","arrGifs","filteredIcons","finally","checkedIcons","newUID","folderEntries","ofile","otherIcon","ipLicense","previewEntries","iconsArray","iconEntries","foundComplementaryPng","addIconToIconPack","efs","searchMeta","hasDirs","processFileTransfer","checkFileType","dtFiles","which","isAllowedFileType","dataset","htmlString","getData","tempEl","imgEl","querySelector","sortDuplicates","isFileAllowed","requiredMimeType","isHidden","checkDuplicate","dontBlock","nameParts","suffixes","reservedNames","iconNames","existingDuplicate","tagClicked","selectedTags","componentData","typ","warn","setDynamicContent","MarkdownComponent","setIconPackIcons","componentName","e2","getDirectoryFromDirectoryEntry","dirName","dirEntry","me","dirFileList","previewPromise","loadFileData","manifestjson","fldrs","gifs","Storage","setItem","getItem","Vue","config","productionTip","directive","el","binding","vnode","inserted","interceptDragHilite","internalDrag","mixin","created","tagDef","_componentTag","pathname","tagClr","warncss","debugOptions","__assert","assert","parms","vm","App","$mount"],"mappings":"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","file":"js/app.c6a57b1e.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","/* eslint-disable */\n\nfunction preventDefaults(e) {\n    e.preventDefault();\n    e.stopPropagation();\n    return false;\n}\n\nconst highlight = (e, f, _cb) => {\n    if(_cb && _cb()) return; // return true from a callback to prevent highlighting\n    if(e.target == f) {\n        preventDefaults(e);\n        e.stopImmediatePropagation();\n        if(!e.target.classList.contains('highlight')) {\n            e.target.classList.add('highlight');\n            _cb(e, 'highlight');\n\n        }\n    } else {\n        // temporary... always highlight\n        if(f && !f.classList.contains('highlight')) {\n            f.classList.add('highlight');\n            _cb(e, 'highlight2');\n\n        }\n    }\n};\n\nfunction unhighlight(e, f) {\n    if(e.target && e.target.classList.contains('highlight')) {\n        e.target.classList.remove('highlight');\n    }\n    if(f && f.classList.contains('highlight')) {\n        f.classList.remove('highlight');\n    }\n}\nfunction handleDrop(e, dropCallback) {\n    if(dropCallback) dropCallback(e);\n}\n\nexport const startDragAndDropForElement = (dropArea, dropCallback, moreCallback) => {\n    const _cb = typeof moreCallback === 'function' ? moreCallback : function() {};\n    if(Array.isArray(dropArea)) {\n        dropArea.forEach(d => {\n            handleDragDrop(d, dropCallback, true, _cb);\n        });\n    } else {\n        handleDragDrop(dropArea, dropCallback, true, _cb);\n    }\n};\n\nconst stopDragAndDropForElement = dropArea => {\n    handleDragDrop(dropArea, null, false);\n};\n\nconst handleDragDrop = (dropArea, dropCallback, addListeners = true, _cb) => {\n    const addFn = addListeners ? 'addEventListener' : 'removeEventListener';\n\n    // Prevent default drag behaviors\n    ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {\n        // dropArea[addFn](eventName, (e) => preventDefaults(e, dropArea), false);\n        dropArea[addFn](eventName, preventDefaults, false);\n    });\n\n    // Highlight drop area when item is dragged over it\n    ['dragenter', 'dragover'].forEach(eventName => {\n        // dropArea[addFn](eventName, highlight, true);\n        dropArea[addFn](eventName, (e) => highlight(e, dropArea, _cb), false);\n    });\n\n    ['dragleave', 'drop'].forEach(eventName => {\n        dropArea[addFn](eventName, (e) => unhighlight(e, dropArea), false);\n    });\n\n    let handleDrop;\n\n    if(addListeners) {\n        handleDrop = dropCallback ? dropCallback : function() {};\n        dropArea['dropCallback'] = handleDrop;\n    } else {\n        handleDrop = dropArea['dropCallback'] || function() {};\n    }\n\n    //Handle dropped files\n    dropArea[addFn]('drop', handleDrop, false);\n};\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{ref:\"andyapp\",attrs:{\"id\":\"app\"}},[_c('div',{directives:[{name:\"esddrop\",rawName:\"v-esddrop\",value:({ fn: _vm.handleDrop }),expression:\"{ fn: handleDrop }\"}],staticClass:\"root\",attrs:{\"id\":\"iconpackman-root\"}},[_c('HeadComponent',{attrs:{\"version\":_vm.version,\"loaded\":_vm.sheetData,\"documents\":_vm.docs},on:{\"toggleconsole\":_vm.toggleConsole,\"togglesidebar\":_vm.toggleSidebar,\"loadcomponentdata\":_vm.loadComponentData,\"loadiconpack\":_vm.loadIconPack}}),_c('InfoComponent',{attrs:{\"dark\":_vm.darkMode,\"sheetopen\":_vm.sheetData !== '',\"dynamiccomponent\":_vm.dynamicComponent,\"dynamicdata\":_vm.dynamicData},on:{\"loadcomponentdata\":_vm.loadComponentData}}),_c('div',{staticClass:\"flex-grid\"},[_c('div',{ref:\"allowDeselect\",staticClass:\"allowDeselect content\",class:{mark: _vm.iconPack.iconsjson.length},attrs:{\"disabled\":!_vm.loading},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();if($event.target !== $event.currentTarget)return null;return _vm.handleSelection($event, false)}}},[_c('div',{staticClass:\"CenteredContainer\",on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();if($event.target !== $event.currentTarget)return null;return _vm.handleSelection($event, false)}}},[_c('h3',[_vm._v(\"Icon\")]),_c('div',[_vm._v(_vm._s(_vm.iconPack.__sortState))]),_c('img',{directives:[{name:\"esddrop\",rawName:\"v-esddrop\",value:(_vm.setIconPackIcon),expression:\"setIconPackIcon\"}],staticClass:\"iconpack-icon\",attrs:{\"src\":_vm.iconPack.icon,\"name\":_vm.iconPack.icon.name}})]),_c('div',{staticClass:\"allowDeselect CenteredContainer\",on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();if($event.target !== $event.currentTarget)return null;return _vm.handleSelection($event, false)}}},[_c('h3',[_vm._v(\"Preview Images\")]),_c('div',{staticClass:\"marketing cardList\"},_vm._l((_vm.iconPack.previews),function(file,i){return _c('div',{key:i,staticClass:\"xycard preview posrel\",staticStyle:{\"padding-bottom\":\"4px\"}},[_c('div',{staticClass:\"remove posabsright\"},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.iconPack.isPreview(file)),expression:\"!iconPack.isPreview(file)\"}],staticClass:\"remove-item\",on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.iconPack.removePreview(file, $event.altKey);}}},[_vm._v(\"×\")])]),_c('img',{directives:[{name:\"esddrop\",rawName:\"v-esddrop\",value:(_vm.addIconPackPreview),expression:\"addIconPackPreview\"}],staticClass:\"preview-icon\",attrs:{\"src\":file.objectURL ? file.objectURL : file,\"data-index\":i,\"alt\":_vm.previewName(file),\"title\":_vm.previewName(file)}}),_c('div',{attrs:{\"data-title\":\"Filename\"}},[_vm._v(\" \"+_vm._s(file.objectURL ? `${_vm.previews.indexOf(file)}-${file.name}`: ' ')+\" \")])])}),0)]),_c('FilelistComponent',{ref:\"filelist\",attrs:{\"icon-pack\":_vm.iconPack,\"files\":_vm.iconPack.icons,\"updated\":_vm.updated},on:{\"doRemoveFromAllIcons\":_vm.doRemoveFromAllIcons,\"draggingchanged\":_vm.draggingChanged}})],1),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.sidebar),expression:\"sidebar\"}],staticClass:\"sidebar\"},[_c('div',{staticClass:\"sidebarcontent\"},[_c('div',{staticClass:\"CenteredContainer\"},[_c('h3',[_vm._v(\"IconPack ID\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model.lazy\",value:(_vm.uid),expression:\"uid\",modifiers:{\"lazy\":true}}],staticClass:\"iconpacku\",attrs:{\"type\":\"text\",\"placeholder\":\"e.g. com.yourname.youriconpack\",\"autocomplete\":\"off\",\"data-1p-ignore\":\"\"},domProps:{\"value\":(_vm.uid)},on:{\"change\":function($event){_vm.uid=$event.target.value}}}),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.uidNeedsCheck),expression:\"uidNeedsCheck\"}],staticClass:\"col left\"},[_vm._v(\" ID should be in the format:\"),_c('div',{staticClass:\"italic\"},[_vm._v(\"com.yourname.youriconpack\")])]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.uidExists),expression:\"uidExists\"}],staticClass:\"col note\"},[_c('div',{staticClass:\"bold\"},[_vm._v(_vm._s(_vm.uid))]),_vm._v(\" already exists in our system. Please make sure it is owned by you. \")])]),_c('JsonComponent',{attrs:{\"name\":\"manifest\",\"tableheadings\":false,\"rows\":_vm.iconPack.manifest,\"excludes\":['_'],\"namesmap\":{'License': 'license'},\"typesmap\":{'license': {nodetype: 'textarea'},'Description': {nodetype: 'textarea'}}}}),(_vm.iconPack.iconsjson.length)?_c('div',{staticClass:\"CenteredContainer\"},[_c('h3',[_vm._v(\"Mapping\")]),_c('div',{staticClass:\"inputContainer\"},[_c('div',{staticClass:\"col remove\"},[_c('div',{staticClass:\"remove-item\",on:{\"click\":function($event){return _vm.doRemoveMapping()}}},[_vm._v(\"×\")])]),_c('span',[_vm._v(\"Mapping file loaded.\")])])]):_vm._e(),(_vm.dbgShowSettings)?_c('JsonComponent',{attrs:{\"name\":\"settings\",\"rows\":_vm.state,\"excludes\":['_'],\"typesmap\":{'token': {type: 'password'}}}}):_vm._e(),_c('div',{staticClass:\"CenteredContainer\"},[_c('h3',[_vm._v(\"Info\")]),_c('div',{staticClass:\"infomsg\",class:{gray: _vm.infoMsg==''}},[_vm._v(_vm._s(_vm.infoMsg))]),_c('div',{staticClass:\"duplicates content details\"},[_c('details',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.duplicates.length),expression:\"duplicates.length\"}],staticClass:\"pad\",on:{\"toggle\":_vm.detailsOpened}},[_c('summary',[_vm._v(\"Excluded files (\"+_vm._s(_vm.duplicates.length)+\" files)\")])]),(_vm.detailsOpen)?_c('ul',{staticClass:\"details\"},_vm._l((_vm.duplicates),function(d,j){return _c('li',{key:j},[_vm._v(\" \"+_vm._s(d.fullPath || d.name)+\" \")])}),0):_vm._e()])])],1),_c('div',{staticClass:\"moreaction\"},[_c('a',{attrs:{\"href\":\"./sample_iconpack.zip\",\"download\":\"sample_iconpack.zip\"}},[_vm._v(\"Download sample iconpack\")]),_c('button',{staticClass:\"primary\",attrs:{\"disabled\":_vm.loading || _vm.progress || _vm.iconPack.readOnly || _vm.iconPack.icons.length < 1},on:{\"click\":_vm.doExportIconPack}},[_vm._v(\" Export IconPack \")]),(_vm.iconPack.readOnly)?_c('div',[_vm._v(\"Exporting zipped iconPacks is not supported\")]):_vm._e()]),_c('img',{staticClass:\"testimage\",staticStyle:{\"max-width\":\"320px\"},attrs:{\"src\":\"\"}})])]),_c('div',{staticClass:\"flex-grid testconsole\",class:{consoleVisible: _vm.showValidator}},[_c('div',{staticClass:\"widget widget__scrollable\",staticStyle:{\"display\":\"flex\",\"flex-direction\":\"row\"}},[_c('span',{staticClass:\"disclosure-triangle\",on:{\"click\":function($event){return _vm.toggleConsole()}}}),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.consoleOpen),expression:\"consoleOpen\"}],ref:\"messageContainer\",staticClass:\"msg-container\"},_vm._l((_vm.dbgMessages),function(msg,i){return _c('div',{key:i,staticClass:\"msg\"},[_c('div',{staticClass:\"topic\",class:{error: msg.err, caution: msg.caution}},[_vm._v(_vm._s(msg.topic))]),_c('div',{staticClass:\"time\"},[_vm._v(_vm._s(msg.timestamp))]),(msg.text.length)?_c('div',{staticClass:\"payload\"},[_vm._v(_vm._s(msg.text))]):_vm._e()])}),0)])])],1),_c('div',{staticClass:\"packcheck\",class:{hidden: !_vm.loading}},[_c('div',{staticClass:\"flexlogo\"},[_c('div',{staticClass:\"flexloader\"},[_vm._v(\" \")]),_c('div',{staticClass:\"loader\"},[_vm._v(\" Loading... \")]),_c('div',{staticClass:\"infomsg\"},[_vm._v(\" \"+_vm._s(_vm.infoMsg)+\" \")]),_c('div',{staticClass:\"flexloader\"},[_vm._v(\" \")])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","export const stripNotAllowed = (s) => s.replace(/[^a-z0-9.-]/gi, '');\r\n\r\nexport const checkUID = (inVal, forceLowerCase = false, separator = \".\") => {\r\n    // console.log('checkUID:', inVal, forceLowerCase, separator);\r\n    let def = [ '' ];\r\n    if(inVal) {\r\n        const val = forceLowerCase ? inVal.trim().toLowerCase() : inVal.trim();\r\n        def = val.split(separator).map(u => stripNotAllowed(u)).filter(u => u.length);\r\n    }\r\n    return def.join(separator);\r\n};\r\n\r\nexport const checkUIDOld = (inVal, forceLowerCase = false, separator=\".\") => {\r\n    const def = [ 'example', 'iconpack' ];\r\n    if(inVal && inVal.includes(separator)) {\r\n        const val = forceLowerCase ? inVal.trim().toLowerCase() : inVal.trim();\r\n        const a = val.split(separator).map(u => stripNotAllowed(u)).filter(u => u.length >= def.length);\r\n        const maxLen = Math.max(a.length, def.length);\r\n        for(let i = 0;i < maxLen;i++) {\r\n            if(a[i] && a[i].length) {\r\n                def[i] = a[i];\r\n            }\r\n        }\r\n    }\r\n    // return def.join('.');\r\n    return def.join(separator);\r\n};\r\n","const generateTimeStamp = () => new Date().toISOString().split('T')[1].split('Z')[0];\r\n\r\nexport const dbgMessages = [\r\n    {\r\n        topic: \"\",\r\n        timestamp: generateTimeStamp(),\r\n        text: \"\",\r\n        err: false,\r\n        caution: false,\r\n    }\r\n];\r\n\r\ndbgMessages.add = function({ topic = '', text = '', err = false, caution = false } = {}) {\r\n    return this.push({\r\n        topic,\r\n        timestamp: generateTimeStamp(),\r\n        text,\r\n        err,\r\n        caution\r\n    });\r\n};\r\n\r\ndbgMessages.clear = function() {\r\n    this.length = 0;\r\n};\r\n\r\ndbgMessages.hasErrors = function() {\r\n    return this.some(msg => msg.err);\r\n};\r\n\r\ndbgMessages.hasWarnings = function() {\r\n    return this.some(msg => msg.caution);\r\n};\r\n\r\ndbgMessages.log = function(what = 'all') {\r\n    // let data;\r\n    // switch (what) {\r\n    //     case 'errors':\r\n    //         data = this.errors;\r\n    //         break;\r\n    //     case 'warnings':\r\n    //         data = this.warnings;\r\n    //         break;\r\n    //     case 'topics':\r\n    //         data = this.topics;\r\n    //         break;\r\n    //     default:\r\n    //         data = this.map(msg => ({ ...msg }));\r\n    // }\r\n    // same thing as above but less verbose\r\n    const data = typeof this[ what ] === 'object' ? this[what] : this.map(msg => ({ ...msg })) ;\r\n    console.table(data);\r\n};\r\n\r\nObject.defineProperties(dbgMessages, {\r\n    warnings: {\r\n        get() {\r\n            return this.filter(msg => msg.caution).map(msg => ({ ...msg }));\r\n        }\r\n    },\r\n    errors: {\r\n        get() {\r\n            return this.filter(msg => msg.err).map(msg => ({ ...msg }));\r\n        }\r\n    },\r\n    topics: {\r\n        get() {\r\n            return this.filter(msg => !msg.err && !msg.caution).map(msg => ({ topic: msg.topic, timestamp: msg.timestamp }));\r\n        }\r\n    }\r\n});\r\n\r\n\r\n","/* eslint-disable */\nimport { dbgMessages } from './dbgMessages.js';\n// poor man's printf\nexport const dbgprintf = (s, ...args) => {\n    const msg = sprintf(s, ...args);\n    const debug = false;\n    if(debug) {\n        console.log('dbgprintf APP', msg);\n    }\n    const testErr = s.startsWith('Error: ') || s.startsWith('Exception') || args[ args.length - 1 ];\n    const isError = typeof testErr === 'boolean' && testErr;\n    const index = dbgMessages.add({\n        topic: msg,\n        // timestamp: new Date().toLocaleTimeString(\"de-DE\", { hour: '2-digit', minute: '2-digit', second: '2-digit' }),\n        text: '',\n        err: isError === true,\n        caution: s.startsWith('Note: ') || s.startsWith('Caution: ')\n    });\n    \n    if(window.app) { // app is global\n        setTimeout(() => {\n            window.app.dbgScrollToView();\n        }, 10);\n    }\n\n    return index;\n};\n\n// eslint-disable-next-line no-unused-vars;\nexport const sprintf = (s, ...args) => {\n    let i = 0;\n    return s.replace(/%s|%d/g, function() {\n        return args[ i++ ];\n    });\n};\n\n\nlet Utils = {};\nexport default Utils;\nexport { Utils };\n\nUtils.tist = () => { return `TIST ${Date.now()}`; };\n\nexport function test() { return Date.now(); };\n\nUtils.int2ip = (ipInt) => {\n    return ((ipInt >>> 24) + '.' + (ipInt >> 16 & 255) + '.' + (ipInt >> 8 & 255) + '.' + (ipInt & 255));\n};\n\nUtils.ip2int = (ip) => {\n    return ip.split('.').reduce(function(ipInt, octet) { return (ipInt << 8) + parseInt(octet, 10); }, 0) >>> 0;\n};\n\nUtils.toIP = (value) => {\n\n    if(!value) {\n        throw new Error('E_UNDEFINED_INTEGER');\n    }\n\n    const result = /\\d+/.exec(value);\n\n    if(!result) {\n        throw new Error('E_INTEGER_NOT_FOUND');\n    }\n\n    value = result[ 0 ];\n\n    return [\n        (value >> 24) & 0xff,\n        (value >> 16) & 0xff,\n        (value >> 8) & 0xff,\n        value & 0xff\n    ].join('.');\n};\n\nUtils.toInt = (ip) => {\n\n    if(!ip) {\n        throw new Error('E_UNDEFINED_IP');\n    }\n\n    // if(!regexIP.test(ip)) {\n    //     throw new Error('E_INVALID_IP');\n    // }\n\n    /*\n      String value 189.170.79.173\n      Integer\t3182055341\n      To convert an IP address to integer, break it into four octets.\n      For example, the ip address you provided can be broken into\n      First Octet:\t189\n      Second Octet:\t170\n      Third Octet:\t79\n      Fourth Octet:\t173\n      To calculate the decimal address from a dotted string, perform the following calculation.\n      = (first octet * 256³) + (second octet * 256²) + (third octet * 256) + (fourth octet)\n      =\t(first octet * 16777216) + (second octet * 65536) + (third octet * 256) + (fourth octet)\n      =\t(189 * 16777216) + (170 * 65536) + (79 * 256) + (173)\n      =\t3182055341\n      Reference http://www.aboutmyip.com/AboutMyXApp/IP2Integer.jsp\n    */\n\n    return ip.split('.').map((octet, index, array) => {\n        return parseInt(octet) * Math.pow(256, (array.length - index - 1));\n    }).reduce((prev, curr) => {\n        return prev + curr;\n    });\n\n};\n\n\nUtils.tagify = (value) => {\n    if(!value) return [];\n    if(Array.isArray(value)) {\n        return value.map(t => t.toLowerCase().trim().replace(/\\s/g, \"\"));\n    };\n    if(typeof value === 'string') {\n        const arr = value.toLowerCase().split(',').filter(e => e.length).map(s => s.trim().replace(/[^a-z0-9]/gi, '')); //make lowercase , filter empty values and trim\n        const tagSet = new Set(arr);  // remove duplicates\n        return Array.from(tagSet); // convert array to comma separated string\n        // return Array.from(tagSet).join(','); // convert array to comma separated string\n    }\n    return [];\n};\n\nUtils.hasUpperCase = (str) => /[A-Z]/.test(str);\nUtils.getLowerCaseExtension = (s) => s.split('.').pop().trim().toLowerCase();\nUtils.getFilenameWithLowerCaseExtension = (s) => s.replace(/\\.[a-z]+$/i, ext => ext.toLowerCase());\n\nUtils.getUrlParameter = function(name) {\n    const nameA = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n    const regex = new RegExp(\"[\\\\?&]\" + nameA + \"=([^&#]*)\");\n    const results = regex.exec(location.search.replace(/\\/$/, \"\"));\n    return results === null\n        ? null\n        : decodeURIComponent(results[ 1 ].replace(/\\+/g, \" \"));\n};\n\nUtils.throttle = function(fn, threshold = 250, context) {\n    let last, timer;\n    return function() {\n        var ctx = context || this;\n        var now = new Date().getTime(),\n            args = arguments;\n        if(last && now < last + threshold) {\n            clearTimeout(timer);\n            timer = setTimeout(function() {\n                last = now;\n                fn.apply(ctx, args);\n            }, threshold);\n        } else {\n            last = now;\n            fn.apply(ctx, args);\n        }\n    };\n};\n\nUtils.loadImageData = function(inUrl, callback) {\n    let image = new Image();\n    image.onload = function() {\n        callback(image);\n        image = null;\n        // or to get raw image data\n        // callback && callback(canvas.toDataURL('image/png').replace(/^data:image\\/(png|jpg);base64,/, ''));\n    };\n    image.src = inUrl;\n};\n\nUtils.loadImagePromise = url =>\n    new Promise(resolve => {\n        const img = new Image();\n        img.onload = () => resolve({ url, status: 'ok', image: { h: img.naturalHeight, w: img.naturalWidth } });\n        img.onerror = () => resolve({ url, status: 'error' });\n        img.src = url;\n    });\n\nUtils.hashCode = (s) => {\n    let hash = 0;\n    for(var i = 0;i < s.length;i++) {\n        hash = s.charCodeAt(i) + ((hash << 5) - hash);\n    }\n    return hash;\n};\n\nUtils.intToColor = (i) => {\n    return (i & 0x00FFFFFF)\n        .toString(16)\n        .toUpperCase()\n        .padStart(6, '0');\n};\n\nUtils.colorFromString = (s) => {\n    return Utils.intToColor(Utils.hashCode(s));\n};\n\nUtils.parseJson = function(jsonString, _errCb) {\n    if(typeof jsonString === 'object') return jsonString;\n    try {\n        const o = JSON.parse(jsonString);\n        if(o && typeof o === 'object') {\n            return o;\n        }\n    } catch(e) {\n        if(_errCb) _errCb(e);\n    }\n    return false;\n};\n\nUtils.stripSpecials = (s) => s.replace(/[\\s~`!@#$§%^&*(){}\\[\\];:\"'<,>?\\/\\\\|_+=-]/g, '');\n\nUtils.stripNotAllowed = (s) => s.replace(/[^a-z0-9.-]/gi, '');\n\n/* Array */\n\n// Utils.removeFromArray = (arr, itm) => {\n//     const index = arr.indexOf(itm);\n//     if(index > -1) {\n//         arr.splice(index, 1);\n//     }\n//     return index > -1;\n// };\n\nUtils.removeFromArray = (arr, item, removeAllOccurences = false) => {\n    if(!Array.isArray(arr)) return false;\n    let index = arr.indexOf(item);\n    const changed = index > -1;\n    if(removeAllOccurences) {\n        while(index > -1) {\n            arr.splice(index, 1);\n            index = arr.indexOf(item);\n        }\n    } else {\n        arr.splice(index, 1);\n    }\n    return changed;\n};\n\n// remove items from array mutating\nUtils.removeFromArrayAllLoop = (arr, item) => {\n    let changed = false;\n    let j, i, len, elt;\n\n    for(j = i = 0, len = arr.length;i < len;++i) {\n        elt = arr[ i ];\n        if(elt === item) {\n            changed = true;\n        } else {\n            arr[ j++ ] = elt;\n        }\n    }\n\n    arr.length = j;\n    return changed;\n};\n\nUtils.readFileP = (file) => {\n    return new Promise(function(resolve) {\n        const reader = new FileReader();\n        reader.onloadend = function(evt) {\n            resolve(evt.target.result);\n        };\n        reader.onerror = function() {\n            resolve(\"\");\n        };\n        reader.readAsText(file);\n    });\n};\n\nUtils.getFileFromFileEntryP = function(entry, path) {\n    return new Promise((resolve, reject) => {\n        entry.getFile(path, {}, resolve, reject);\n    });\n};\nUtils.getDirectoryFromEntryP = function(entry, path) {\n    return new Promise((resolve, reject) => {\n        entry.getDirectory(path, {}, resolve, reject);\n    });\n};\n\nUtils.getFileFromFileEntry = function(entry) {\n    return new Promise((resolve) => {\n        entry.file((file) => {\n            // resolve(this.packageFile(file, entry));\n            // resolve(file, entry);\n            resolve({\n                file,\n                entry,\n                objectURL: URL.createObjectURL(file),\n                fullPath: `${entry.fullPath}`.slice(1)\n            });\n\n        });\n    });\n};\n\n\nUtils.fetchFile = function(fileObj, responseType) {\n    return new Promise(function(resolve) {\n        if(!fileObj) {\n            console.trace(\"-------- fetchFile \", fileObj);\n        }\n        const reader = new FileReader();\n\n        reader.onloadend = (evt) => {\n            if([ 'json' ].includes(responseType)) {\n                let result;\n                try {\n                    result = JSON.parse(evt.target.result);\n                } catch(error) {\n                    console.log(\"Error parsing JSON\", fileObj);\n                    result = {};\n                }\n                resolve(result);\n            } else {\n                resolve(evt.target.result);\n            }\n        };\n        reader.onerror = (evt) => {\n            console.log(\"Error in Utils.fetchFile::reader\", reader, evt);\n        };\n        if([ 'blob', 'arraybuffer' ].includes(responseType)) {\n            reader.readAsArrayBuffer(fileObj);\n        } else if([ 'text', 'json' ].includes(responseType)) {\n            reader.readAsText(fileObj);\n        } else {\n            reader.readAsDataURL(fileObj);\n        }\n    }).catch(err => {\n        console.log(\"ERROR while reading\", fileObj, responseType);\n    });\n};\n\nUtils.fetchXhr = function(path, type = 'arraybuffer') {\n    return new Promise(function(resolve, reject) {\n        const req = new XMLHttpRequest();\n        req.withCredentials = true; // should be default anyway\n        req.responseType = type;\n\n        req.onload = () => {\n            resolve({\n                ok: true,\n                [ type ]: () => Promise.resolve(req.response),\n                // arrayBuffer: () => Promise.resolve(req.response),\n                // blob: () => Promise.resolve(req.response)\n            });\n        };\n\n        [ 'abort', 'error' ].forEach((evt) => { req.addEventListener(evt, (error) => { reject(error); }); });\n        req.open('GET', path);\n        req.send();\n    });\n};\n\nUtils.pick6 = (o, keys) => keys.reduce((acc, key) => {\n    acc[ key ] = o[ key ];\n    return acc;\n}, {});\n\nUtils.pick = function(o, keys) {\n    return keys.reduce((obj, key) => {\n        if(o && o.hasOwnProperty(key)) {\n            obj[ key ] = o[ key ];\n        }\n        return obj;\n    }, {});\n};\n\nUtils.loadDataPromise = (url, loadAsJson = false) => {\n    const css = `color:#ffee00`;\n    const dbg = false ? console.log.bind(window.console, '[Utils]', css) : () => {};\n    return new Promise(function(resolve) {\n        let xhr = new XMLHttpRequest();\n        if(loadAsJson) xhr.overrideMimeType('application/json');\n        xhr.onreadystatechange = function() {\n            if(xhr.readyState === 4) {\n                let result;\n                try {\n                    result = loadAsJson === true ? JSON.parse(xhr.responseText) : xhr.responseText;\n                } catch(error) {\n                    dbg(error);\n                    result = loadAsJson === true ? {} : '';\n                }\n                dbg(\"loadDataPromise::RESULT\", url, result);\n                resolve(result);\n            }\n        };\n        xhr.onerror = function() {\n            dbg('[Error]::ReadFile.reply was not JSON', xhr);\n            resolve({});\n        };\n        xhr.open('GET', url, true);\n        xhr.send(null);\n    });\n};\n\n\nUtils.uploadFile = (f) => {\n    var data = new FormData();\n    data.append(\"version\", \"1.6\");\n    data.append(\"catalog\", \"streamDeckPlugin\");\n    data.append(\"file\", fileInput.files[ 0 ], \"com.elgato.cpu.streamDeckPlugin\");\n    var xhr = new XMLHttpRequest();\n    xhr.withCredentials = true;\n    xhr.addEventListener(\"readystatechange\", function() {\n        if(this.readyState === 4) {\n            console.log(this.responseText);\n        }\n    });\n    xhr.open(\"POST\", \"https://appstoreconnect-staging.elgato.com/store/upload/streamDeckPlugin/\");\n    xhr.setRequestHeader(\"Authorization\", \"Token 19f0d9e762b23573f79e10e0f31854c9a2ec9f0b\");\n    xhr.send(data);\n};\n\nconst fileObj = null;\n\nconst uploadOptions = {\n    url: 'https://appstoreconnect-staging.elgato.com/store/upload/streamDeckPlugin/',\n    method: 'POST',\n    Authorization: 'Token 19f0d9e762b23573f79e10e0f31854c9a2ec9f0b',\n    data: {\n        version: '1.6',\n        catalog: 'streamDeckPlugin',\n        file: [ fileObj, \"com.elgato.cpu.streamDeckPlugin\" ]\n    }\n};\n\nconst options = Object.assign({}, uploadOptions, {});\n\nUtils.uploadOptionsFn = (fileObj, token) => {\n    const uid = GetUUIDFromFilePath(fileObj.name);\n    const extension = EplFile_GetExtension(fileObj.name).substr(1); // strip leading '.'\n\n    // if(!['streamDeckPlugin', 'streamDeckIconPack'].includes(extension)) return null;\n    if(![ 'sdPlugin', 'sdIconPack' ].includes(extension)) return null;\n    return {\n        url: 'https://appstoreconnect-staging.elgato.com/store/upload/streamDeckPlugin/',\n        method: 'POST',\n        Authorization: `Token ${token}`,\n        data: {\n            version: '1.6',\n            catalog: extension,\n            file: [ fileObj, uid ]\n        }\n    };\n};\n\nUtils.uploadFileP = (options) => {\n    const css = `color:#99aaff`;\n    const dbg = true ? console.log.bind(window.console, '%c[Utils.uploadFileP]', css) : () => {};\n    dbg(\"Uploading\", options);\n    return new Promise(function(resolve) {\n\n        const data = new FormData();\n        Object.entries(options.data).map(props => {\n            if(Array.isArray(props[ 1 ])) {\n                data.append(props[ 0 ], ...props[ 1 ]);\n            } else {\n                data.append(props[ 0 ], props[ 1 ]);\n            }\n        });\n\n        const xhr = new XMLHttpRequest();\n        xhr.onreadystatechange = function() {\n            if(xhr.readyState === 4) {\n                let result;\n                try {\n                    result = loadAsJson === true ? JSON.parse(xhr.responseText) : xhr.responseText;\n                } catch(error) {\n                    dbg(error);\n                    result = loadAsJson === true ? {} : '';\n                }\n                dbg(\"RESULT\", url, result);\n                resolve(result);\n            }\n        };\n        xhr.onerror = function() {\n            dbg('[Error]::reply was not JSON', xhr);\n            resolve({});\n        };\n\n        xhr.open(options.method, options.url);\n        xhr.setRequestHeader(\"Authorization\", options.Authorization);\n        xhr.send(data);\n\n    });\n};\n\nconst isDataURL = (s) => !!s.match(isDataURL.regex);\nisDataURL.regex = /^\\s*data:([a-z]+\\/[a-z]+(;[a-z\\-]+\\=[a-z\\-]+)?)?(;base64)?,[a-z0-9\\!\\$\\&\\'\\,\\(\\)\\*\\+\\,\\;\\=\\-\\.\\_\\~\\:\\@\\/\\?\\%\\s]*\\s*$/i;\nUtils.isDataURL = isDataURL;\n\n// const isDataUrlMatches = (s) => s.match(/^data:image\\/(png|jpg|tiff|jpeg|svg\\+xml);base64,/);\n\nconst svgReplace = () => {\n    return {\n        '%3C': '<',\n        '%3E': '>',\n        '%23': '#'\n    };\n};\n\nUtils.drawStringToCanvas = (text, size = 400, inCanvas) => {\n    const canvas = inCanvas ? inCanvas : document.createElement('canvas');\n    const tempCtx = canvas.getContext('2d');\n    tempCtx.clearRect(0, 0, canvas.width, canvas.height);\n    tempCtx.font = `${size}px Helvetica`;\n    tempCtx.fontWeight = 'bold';\n    tempCtx.lineHeight = size;\n    tempCtx.fillStyle = '#d8d8d8';\n    tempCtx.textAlign = 'center';\n    tempCtx.textBaseline = 'middle';\n    // tempCtx.fillText(`${text}`, canvas.width / 2, canvas.height / 2);\n\n    // var text = 'All the world \\'s a stage, and all the men and women merely players. They have their exits and their entrances; And one man in his time plays many parts.';\n    // wrapText(tempCtx, text, 0, 0, 144);\n    Utils.wrapText(tempCtx, text, canvas.width / 2, canvas.height / 2, canvas.width);\n\n\n};\n\nUtils.wrapText = (ctx, text, x = 0, y = 0, maxWidth = 144) => {\n    const words = text.split(' ');\n    let line = '';\n    let metrics;\n\n    for(let i = 0;i < words.length;i++) {\n        let tmpStr = words[ i ];\n        metrics = ctx.measureText(tmpStr);\n        while(metrics.width > maxWidth) {\n            tmpStr = tmpStr.substring(0, tmpStr.length - 1);\n            metrics = ctx.measureText(tmpStr);\n        }\n\n        if(words[ i ] != tmpStr) {\n            words.splice(i + 1, 0, words[ i ].substr(tmpStr.length));\n            words[ i ] = tmpStr;\n        }\n\n        tmpStr = words.length > 1 ? `${line}${words[ i ]} ` : `${line}${words[ i ]}`;\n        metrics = ctx.measureText(tmpStr);\n        // console.log(\"len:\", words.length, metrics);\n\n        if(metrics.width > maxWidth && i > 0) {\n            y -= ctx.lineHeight / 2;\n            ctx.fillText(line, x, y);\n            line = `${words[ i ]} `;\n            y += ctx.lineHeight;\n        }\n        else {\n            // console.log(tmpStr, metrics.width, x, maxWidth);\n            // x = (metrics.width + x) / 2;\n            line = tmpStr;\n        }\n    }\n    ctx.fillText(line, x, y);\n};\n\nUtils.reverseString = (s) => {\n    s.split(\"\").reverse().join(\"\");\n};\n\nUtils.getFontSize = (options = {}) => { //thx gifshot! :)\n    // var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    /* needs {\n        text: options.title, // the text to measure\n        width: options.width || window.innerWidth, // maximum available width\n        minFontSize: options.minFontSize, //minimum acceptable font size\n    }\n    */\n    if(!document.body || options.resizeFont === false) {\n        return options.fontSize;\n    }\n\n    var fontSize = parseInt(options.fontSize, 10) || 13;\n    var minFontSize = parseInt(options.minFontSize, 10) || 6;\n    var div = document.createElement('div');\n    var span = document.createElement('span');\n\n    div.setAttribute('width', options.width);\n    div.appendChild(span);\n\n    span.innerHTML = options.title || options.text || '';\n    span.style.fontSize = fontSize + 'px';\n    span.style.textIndent = '-9999px';\n    span.style.visibility = 'hidden';\n\n    document.body.appendChild(span);\n\n    while((span.offsetWidth > options.width) && (fontSize >= minFontSize)) {\n        span.style.fontSize = --fontSize + 'px';\n    }\n\n    document.body.removeChild(span);\n\n    return fontSize; //+ 'px';\n};\n\nUtils.stringToHTML = function(html, all = false) {\n    var template = document.createElement('template');\n    template.innerHTML = html.trim();\n    return all ? template.content : template.content.firstChild;\n};\n\nUtils.stringToHTMLDiv = function(html, className) {\n    var template = document.createElement('div');\n    if(className) template.classList.add(className);\n    template.innerHTML = html.trim();\n    return template;\n};\n\nUtils.debounce = function(func, wait = 100) {\n    let timeout;\n    return (...args) => {\n        clearTimeout(timeout);\n        timeout = setTimeout(() => func(...args), wait);\n    };\n};\n","export const CHECKUID_FORCE_LOWERCASE = false;","/* eslint-disable */\n\n// MARK: TypeDefinitions & Constants\n\nimport {dbgprintf} from \"./utils\";\nimport {ESDIconPackParser} from './ESDIconPackParser.js';\n\nconst PLUGIN_EXTENSION = \".sdPlugin\";\nconst PLUGIN_ARCHIVE_EXTENSION = \".streamDeckPlugin\";\n\nconst ICON_PACK_EXTENSION = \".sdIconPack\";\nconst ICON_PACK_ARCHIVE_EXTENSION = \".streamDeckIconPack\";\n\n/// #if SD_DISTRIBUTION_TOOL_SUPPORT_UPLOAD\nconst PLUGIN_STORE_URL = \"https://appstoreconnect.elgato.com/upload/streamDeckPlugin/\";\nconst ICON_PACK_STORE_URL = \"https://appstoreconnect.elgato.com/upload/streamDeckIconPack/\";\n//#endif\n\nconst kESDObjectType_Plugin = 0;\nconst kESDObjectType_IconPack = 1;\n\nconst ESDObjectType = {\n    kESDObjectType_Plugin,\n    kESDObjectType_IconPack\n};\n\nconst kESDIconPackSupportedResult_Supported = 0;\nconst kESDIconPackSupportedResult_Malformed = 1;\nconst kESDIconPackSupportedResult_AlreadyInstalled = 2;\n\nconst ESDIconPackSupportedResult = {\n    kESDIconPackSupportedResult_Supported,\n    kESDIconPackSupportedResult_Malformed,\n    kESDIconPackSupportedResult_AlreadyInstalled,\n};\n\nconst NULL = null;\nconst _UP_WINDOWS = false;\nconst MAX_PATH = 260;\nconst LONG_PATH_PREFIX = \"\\\\\\\\?\\\\\";\nconst npos = -1;\n\nconst debug = false;\n\nString.prototype.find = String.prototype.indexOf;\n// String.prototype.find_last_of = String.prototype.lastIndexOf;\n\nString.prototype.rfind = String.prototype.lastIndexOf;\nString.prototype.empty = function() {return !this.length;};\nString.prototype.c_str = function() {return this.toString();};\n\n// // eslint-disable-next-line no-unused-vars;\n// const sprintf = (s, ...args) => {\n//     let i = 0;\n//     return s.replace(/%s|%d/g, function() {\n//         return args[i++];\n//     });\n// };\n// // const empty = (inString = '') => {\n// //     return inString.length < 1;\n// // };\n\nconst createErrorMessage = (e) => {\n    if(typeof e === 'object') {\n        // if(e instanceof FileSystemFileEntry) {\n        // if(e instanceof FileSystemEntry) {\n        if(e.fullPath) {\n            return e.fullPath.substr(1);\n        } else if(e instanceof Error) {\n            return `${e.name}: ${e.message}`;\n        }\n    }\n    return e;\n};\n\n\nexport function EplFile_GetPathDelimiter() {\n    return '/';\n    // return '\\\\';  // Windows\n}\n\n// MARK: - Plugin vs icon-pack\n\nexport function GetArchiveExtension(inObjectType) {\n\n    switch(inObjectType) {\n        case kESDObjectType_Plugin:\n            return PLUGIN_ARCHIVE_EXTENSION;\n            break;\n\n        case kESDObjectType_IconPack:\n            return ICON_PACK_ARCHIVE_EXTENSION;\n            break;\n\n        default:\n            dbgprintf(\"Error: Unknown archive extension for object %d.\", inObjectType);\n            return \"\";\n            break;\n    }\n}\n\nexport function GetExtension(inObjectType) {\n    switch(inObjectType) {\n        case kESDObjectType_Plugin:\n            return PLUGIN_EXTENSION;\n            break;\n\n        case kESDObjectType_IconPack:\n            return ICON_PACK_EXTENSION;\n            break;\n\n        default:\n            dbgprintf(\"Error: Unknown extension for object %d.\", inObjectType);\n            return \"\";\n            break;\n    }\n}\n\nexport function GetDebugTerm(inObjectType) {\n    switch(inObjectType) {\n        case kESDObjectType_Plugin:\n            return \"plugin\";\n            break;\n\n        case kESDObjectType_IconPack:\n            return \"icon pack\";\n            break;\n\n        default:\n            dbgprintf(\"Error: Unknown debug term for object %d.\", inObjectType);\n            return \"\";\n            break;\n    }\n}\n\nexport function GetDefaultServerStore(inObjectType) {\n    switch(inObjectType) {\n        case kESDObjectType_Plugin:\n            return PLUGIN_STORE_URL;\n            break;\n\n        case kESDObjectType_IconPack:\n            return ICON_PACK_STORE_URL;\n            break;\n\n        default:\n            dbgprintf(\"Error: Unknown default server for object %d.\", inObjectType);\n            return \"\";\n            break;\n    }\n}\n\nexport function Validate(inObjectType, inPath) {\n    switch(inObjectType) {\n        case kESDObjectType_Plugin:\n            return ValidatePlugin(inPath);\n            break;\n\n        case kESDObjectType_IconPack:\n            return ValidateIconPack(inPath);\n            break;\n\n        default:\n            dbgprintf(\"Error: Can't validate object %d.\", inObjectType);\n            return false;\n            break;\n    }\n}\n\n// export function doesFileExist(urlToFile) {\n//     var xhr = new XMLHttpRequest();\n//     xhr.open('HEAD', urlToFile, false);\n//     xhr.send();\n\n//     if(xhr.status == \"404\") {\n//         return false;\n//     } else {\n//         return true;\n//     }\n// }\n\nexport function EplFile_FileExists(inUtf8FilePath) {\n    return new Promise((resolve, reject) => {\n        let req = new XMLHttpRequest();\n        let privateErrorFlag = false;\n        req.open(\"HEAD\", inUtf8FilePath);\n        ['onabort', 'onerror', 'ontimeout'].map(e => {\n            req[e] = (err) => {\n                console.log(inUtf8FilePath, '*********** ERRÖR', err);\n                privateErrorFlag = true;\n                req.abort();\n                resolve(false);\n            };\n        });\n\n        ['onload', 'onloadend'].map(e => {\n            req[e] = (evt) => {\n                resolve(!privateErrorFlag);\n            };\n        });\n\n        req.onreadystatechange = () => {\n            if(req.readyState === 4) {\n                // console.log('READYSTATE 4:', req.status, req.readyState);\n                if(req.status >= 200 && req.status < 300) {\n                    resolve(true);\n                } else if(req.status == 404) {\n                    resolve(false);\n                }\n            }\n\n        };\n        req.send(null);\n    });\n}\n\nexport function EplString_HasPrefix(inString, inPrefix) {\n    return (inString.length >= inPrefix.length) && (inString.startsWith(inPrefix));\n}\n\nexport function EplString_HasSuffix(inString, inSuffix) {\n    return (inString.length >= inSuffix.length) && (inString.endsWith(inSuffix));\n}\n\nexport function EplString_Contains(inString, inSubString) {\n    return (inString.length >= inSubString.length) && (inString.includes(inSubString));\n}\n\nexport function EplFile_AddPathComponent(inPath, inComponentToAdd) {\n    if(inPath.empty())\n        return inComponentToAdd;\n\n    const delimiter = EplFile_GetPathDelimiter();\n    const lastChar = inPath[inPath.length - 1];\n\n    const pathEndsWithDelimiter = lastChar == delimiter || lastChar == '/';\n\n    const firstChar = inComponentToAdd.charAt(0);\n    const compStartsWithDelimiter = firstChar == delimiter || firstChar == '/';\n\n    let result = '';\n    if(pathEndsWithDelimiter && compStartsWithDelimiter)// deal with \"foo/\" \"/index.html\" ?\n        result = inPath + inComponentToAdd.substr(1);\n    else if(pathEndsWithDelimiter || compStartsWithDelimiter)\n        result = inPath + inComponentToAdd;\n    else\n        result = inPath + delimiter + inComponentToAdd;\n\n    if(_UP_WINDOWS) {\n        // make sure we use the default delimiter\n        result.replaceAll('/', delimiter);\n\n        result = EplFile_GetLongPathWithPrefix(result);\n    }\n\n    return result;\n}\n\n// use Javascript style inPath and ensure returned path has no trailing delimiter\nexport function EplFile_GetFileName(inPath) {\n\n    if(inPath.empty()) {\n        return inPath;\n    }\n    const delimiterString = EplFile_GetPathDelimiter();\n    //\n    // Remove the trailing delimiters\n    //\n    let pathWithoutTrailingDelimiter = inPath;\n    while(pathWithoutTrailingDelimiter.length > delimiterString.length && EplString_HasSuffix(pathWithoutTrailingDelimiter, delimiterString)) {\n        pathWithoutTrailingDelimiter = pathWithoutTrailingDelimiter.substr(0, pathWithoutTrailingDelimiter.length - delimiterString.length);\n    }\n    //\n    // Special cases\n    //\n    if(pathWithoutTrailingDelimiter.empty() || pathWithoutTrailingDelimiter == delimiterString) {\n        return delimiterString;\n    }\n    // Get the last path component\n    //\n    const pos = pathWithoutTrailingDelimiter.lastIndexOf(delimiterString);\n    if(npos != pos && pathWithoutTrailingDelimiter.length > pos) {\n        return pathWithoutTrailingDelimiter.substr(pos + 1);\n    }\n    // return inPath.replace(/\\/?$/, '/');\n    return pathWithoutTrailingDelimiter;\n}\n\nexport function EplFile_GetExtension(inPath) {\n    const fileName = EplFile_GetFileName(inPath);\n    const pos = fileName.lastIndexOf(\".\");\n    if(npos != pos && ((pos + 1) != fileName.length)) {\n        return fileName.substr(pos);\n    } else {\n        return \"\";\n    }\n    //\n    // Fallback\n    //\n    return pathWithoutTrailingDelimiter;\n}\n\n\n// See Microsoft documentation:\n// https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx\n//\n// To specify an extended-length path, use the \"\\\\?\\\" prefix.\n//\n// When using an API to create a directory, the specified path cannot be so long\n// that you cannot append an 8.3 file name (that is, the directory name cannot exceed MAX_PATH minus 12).\n//\nexport function EplFile_GetLongPathWithPrefix(inPath) {\n    if(_UP_WINDOWS) {\n        if(inPath.length < MAX_PATH - 12)\n            return inPath;\n        if(inPath.rfind(LONG_PATH_PREFIX) == 0)\n            return inPath;\n        if(inPath.rfind(LONG_PATH_PREFIX) != npos && inPath.rfind(LONG_PATH_PREFIX) > 0)\n            return inPath.substr(inPath.rfind(LONG_PATH_PREFIX));\n        return LONG_PATH_PREFIX + inPath;\n\n    } else {\n        return inPath;\n    };\n}\n\n\n/**\n Get the filename from the full path\n\n @param inPath Plugin or icon pack path\n @return filename\n */\n\nexport function GetFilenameFromFilePath(inPath) {\n    let outFilename = inPath;\n\n    if(EplString_HasSuffix(inPath, PLUGIN_EXTENSION) || EplString_HasSuffix(inPath, ICON_PACK_EXTENSION)) {\n        const lastindex = inPath.lastIndexOf(\".\");\n        const pathWithNoExtension = inPath.substr(0, lastindex);\n\n        const lastPathDelimiterIndex = pathWithNoExtension.lastIndexOf(EplFile_GetPathDelimiter());\n        outFilename = inPath.substr(lastPathDelimiterIndex + 1, pathWithNoExtension.length - lastPathDelimiterIndex - 1);\n    }\n\n    return outFilename;\n}\n\n/**\n Get the UUID from the full path\n\n @param inPath Plugin or icon pack path\n @return UUID\n */\nexport function GetUUIDFromFilePath(inPath) {\n    return GetFilenameFromFilePath(inPath);\n}\n\n/**\n Get the manifest.json path for a .sdPlugin or .sdIconPack path\n\n @param inPath .sdPlugin or .sdIconPack path\n @return manifest.json path\n */\nexport function GetManifestFromFilePath(inPath) {\n    return EplFile_AddPathComponent(inPath, \"manifest.json\");\n}\n\nexport function GetManifestFromFilePathJS(inObj, inComponent) {\n    return GetPathForComponent(inObj, 'manifest.json');\n}\n\nexport function GetPathForComponent(inObj, inComponent) {\n    return GetFolderContents(inObj).then(entries => {\n        return entries.find(e => !e.isDirectory && (e.name == inComponent)) || null;\n    });\n}\n\n\nexport function GetFolderContents(inObj, onlyFiles = false) {\n    return new Promise((resolve) => {\n        if(!inObj) {\n            return resolve([]);\n        }\n        const directoryReader = inObj.createReader();\n        let arrEntries = [];\n        const readFolderEntries = () => {\n            directoryReader.readEntries((entries) => { // readEntries() must be called until it returns an empty array.\n                if(!entries.length) {\n                    if(onlyFiles) arrEntries = arrEntries.filter(ae => ae.file);\n                    resolve(arrEntries);\n                } else {\n                    // strip invisible characters and file with double underscore\n                    // Chrome shows invisible files, Safari not\n                    arrEntries.push(...entries.filter(e => !/^(\\.)/gi.test(e.name)));\n                    readFolderEntries();\n                }\n            }, (err) => {\n                console.log(\"GetFolderContents::ERROR\", inObj);\n            });\n        };\n        readFolderEntries();\n    });\n}\n\nexport function GetFolder(inObj, folderName) {\n    const directoryReader = inObj.createReader();\n    return new Promise((resolve, reject) => {\n        return directoryReader.readEntries((entries) => {\n            resolve(entries.find(e => e.isDirectory && e.name.toLowerCase() == folderName));\n        });\n    }).then(d => {\n        return d;\n    });\n}\n\nexport function IsValidURI(inURIString) {\n    if(inURIString.empty()) {\n        return false;\n    }\n    else {\n        let isValidURI = true;\n        let previousChar = 0;\n        for(let c of inURIString) {\n            if(previousChar == '.' && c == '.') {\n                // Plugin contains '..'\n                isValidURI = false;\n                break;\n            }\n            else if(c == '.' || c == '-' || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) {\n                // OK\n                previousChar = c;\n            }\n            else {\n                isValidURI = false;\n                break;\n            }\n        }\n\n        return isValidURI;\n    }\n}\n\nexport function IsValidPath(inPath) {\n    if(inPath.find(\"/./\") != npos) {\n        return false;\n    }\n\n    if(inPath.find(\"/../\") != npos) {\n        return false;\n    }\n\n    return true;\n}\n\nexport function IsValidVersion(inVersion) {\n    if(inVersion.empty()) {\n        return true;\n    }\n\n    let isvalid = true;\n    // for(auto character = inVersion.cbegin();character != inVersion.cend(); ++character)\n    for(let character of inVersion) {\n        if(character >= '0' && character <= '9') {\n            continue;\n        }\n        else if((character) == '.') {\n            continue;\n        }\n        else {\n            isvalid = false;\n        }\n    }\n\n    return isvalid;\n}\n\nexport function IsValidUUID(inUUID) {\n    // const reverseDNSRegEx = \"^[A-Za-z]{2,6}((?!-)\\\\.[A-Za-z0-9-]{1,63}(?<!-))+$\"; // <- doesn't work in Safari\n    const reverseDNSRegEx = \"^[A-Za-z]{2,6}((?!-)\\\\.[A-Za-z0-9-]{1,63})+$\"; // <- works in Safari\n    const r = new RegExp(reverseDNSRegEx);\n    // console.log(\"reverseDNSRegEx:\", inUUID, r.test(inUUID));\n    return r.test(inUUID);\n}\n\nexport function isInPath(parent, child) {\n    if(child === parent) return false;\n    const parents = parent.split('/').filter(i => i.length);\n    return parents.every((t, i) => child.split('/')[i] === t);\n}\n\n// MARK: Validate Plugin\n\nexport function ValidatePlugin(inPath) {\n    // tbd\n}\n\n// export function CheckFilesFromFolderExistInIconsJson(inFolderPath, inSubFolderPath, inAllKnownFiles) {\n//     // tbd\n//     console.log(\"+++++++++++++++++ CheckFilesFromFolderExistInIconsJson +++andy missing\");\n//     const allFilesInFolder = [];\n//     if(EplFile_EnumFilesInFolder(inFolderPath, allFilesInFolder, true)) {\n//         for(const filename of allFilesInFolder) {\n//             // EplFile_EnumFilesInFolder incorrectly returns \".\" and \"..\"\n//             // Also if inIncludeSubdirectories is true, it only returns subfolders and not the files inside a subfolder\n//             if(filename == \".\" || filename == \"..\")\n//                 continue;\n\n//             const iconPath = EplFile_AddPathComponent(inFolderPath, filename);\n//             if(EplFile_FolderExists(iconPath)) {\n//                 const completeSubFolder = EplFile_AddPathComponent(inSubFolderPath, filename);\n//                 if(!CheckFilesFromFolderExistInIconsJson(iconPath, completeSubFolder, inAllKnownFiles)) {\n//                     return false;\n//                 }\n//             } else {\n//                 const completeFileName = EplFile_AddPathComponent(inSubFolderPath, filename);\n//                 //  tbd +++andy\n//                 // andy stop here;\n//                 // auto IT = std:: find(inAllKnownFiles.begin(), inAllKnownFiles.end(), completeFileName);\n//                 // if(IT == inAllKnownFiles.end()) {\n//                 //     // Ignore png file if there is a gif file\n//                 //     if(EplFile_GetExtension(filename) == \".png\") {\n//                 //         const completeGIFFileName = EplFile_SetExtension(completeFileName, \".gif\");\n//                 //         const completeGIFPath = EplFile_AddPathComponent(inFolderPath, completeGIFFileName);\n//                 //         if(EplFile_FileExists(completeGIFPath)) {\n//                 //             continue;\n//                 //         }\n//                 //     }\n\n//                 //     dbgprintf(\"Error: The file '%s' has no entry in the icons.json file.\", completeFileName.c_str());\n//                 //     return false;\n//                 // }\n//             }\n//         }\n//     }\n\n\n//     return true;\n// };\n\n// MARK: Validate Icon Pack\n\nexport function resolveAfter2Seconds(x) {\n    return new Promise(resolve => {\n        setTimeout(() => {\n            resolve(x);\n        }, 2000);\n    });\n}\n\nexport async function ValidateIconPack(inPath) {\n    return new Promise((resolve) => {\n        ValidateIconPackAsync(inPath).then(success => {\n            resolve(success);\n        });\n    });\n};\n\nasync function ValidateIconPackAsync(inPathMulti) {\n\n    try {\n\n        const getFileFromFileEntry = (entry) => {\n            return new Promise((resolve) => {\n                entry.file((file) => {\n                    // resolve(this.packageFile(file, entry));\n                    // resolve(file, entry);\n                    resolve({\n                        file,\n                        entry,\n                        objectURL: URL.createObjectURL(file),\n                        fullPath: `${entry.fullPath}`.slice(1)\n                    });\n                });\n            });\n        };\n\n        const isFileObject = typeof inPathMulti === 'object';\n        let inPath = isFileObject ? inPathMulti.name : inPathMulti;\n\n        const iconPackFiles = isFileObject ? await GetFolderContents(inPathMulti) : [];\n        const iconPackIconsFolder = isFileObject ? iconPackFiles.find(e => e.isDirectory && e.name.toLowerCase() == 'icons') : [];\n        const iconsFiles = isFileObject ? await GetFolderContents(iconPackIconsFolder) : [];\n        const previewImagesFolder = isFileObject ? iconPackFiles.find(e => e.isDirectory && e.name.toLowerCase() == 'previews') : [];\n        const previewFiles = previewImagesFolder ? await GetFolderContents(previewImagesFolder) : [];\n\n        // console.log(\"****PREVIEWS \", previewImagesFolder, previewFiles);\n        previewFiles.forEach(f => {\n            if(f.file) {\n                getFileFromFileEntry(f).then(file => {\n                    console.log(file.file.name, file);\n                });\n            }\n        });\n\n        const Folder_FileExists = (folder, fileName) => {\n            const found = folder.find(e => e.isFile && (e.name == fileName));\n            if(!found) {\n                folder.sort((a, b) => a.name > b.name);\n                console.log(\"---- file not found\", fileName, folder);\n                // console.log(\"Folder_FileExists\", e.name, e);\n            }\n            return found;\n        };\n\n        // const Folder_FileExists = (folder, fileName) => folder.find(e => e.isFile && (e.name == fileName));\n\n        dbgprintf(`Validating iconpack:  ${inPath}`);\n        if(!EplString_HasSuffix(inPath, ICON_PACK_EXTENSION)) {\n            dbgprintf(\"Error: The icon pack should have the extension .sdIconPack.\");\n            return false;\n        }\n\n        const filename = GetFilenameFromFilePath(inPath);\n        if(filename.empty()) {\n            dbgprintf(\"Error: The icon pack could not be found on disk.\");\n            return false;\n        }\n\n        const uuid = GetUUIDFromFilePath(inPath);\n        if(uuid.empty()) {\n            dbgprintf(\"Error: The icon pack has an invalid UUID '%s'. Please rename the %s folder to a valid uniform type identifier (UTI) that contains only alphanumeric characters (A-Z, a-z, 0-9), hyphen (-), and period (.).\", filename.c_str(), ICON_PACK_EXTENSION);\n            return false;\n        }\n\n        const manifestPath = isFileObject ? await GetManifestFromFilePathJS(inPathMulti) : GetManifestFromFilePath(inPath);\n        if(!manifestPath) {\n            if(!await EplFile_FileExists(manifestPath)) {\n                dbgprintf(\"Error: The icon pack has no manifest.json file.\");\n                return false;\n            }\n        }\n\n        const debugTerm = GetDebugTerm(kESDObjectType_IconPack);\n        const supportedResult = {result: kESDIconPackSupportedResult_Supported};\n        const iconPack = await ESDIconPackParser.CreateIconPackFromPath(uuid, inPath, manifestPath, supportedResult, inPathMulti);\n\n        if(iconPack == NULL) {\n            dbgprintf(\"Error: The manifest.json file doesn't contain a valid json.\");\n            return false;\n        }\n\n        if(iconPack.GetVersion().empty()) {\n            dbgprintf(\"Error: The %s has an invalid version. Please add a valid \\\"Version\\\" property to the manifest.json file.\", debugTerm);\n            return false;\n        }\n\n        if(!IsValidVersion(iconPack.GetVersion())) {\n            dbgprintf(\"Error: The %s has an invalid version '%s'. Please add a valid \\\"Version\\\" property to the manifest.json file.\", iconPack.GetVersion(), debugTerm);\n            return false;\n        }\n\n        if(iconPack.GetName().empty()) {\n            dbgprintf(\"Error: The %s has an invalid name. Please add a valid \\\"Name\\\" property to the manifest.json.\", debugTerm);\n            return false;\n        }\n\n        if(iconPack.GetAuthor().empty()) {\n            dbgprintf(\"Error: The %s has an invalid author. Please add a valid \\\"Author\\\" property to the manifest.json.\", debugTerm);\n            return false;\n        }\n\n        const iconURL = iconPack.GetURL();\n        if(!iconURL.empty()) {\n            if(!EplString_HasPrefix(iconURL, \"https://\") && !EplString_HasPrefix(iconURL, \"http://\")) {\n                dbgprintf(\"Error: The %s has an invalid url '%s'. The \\\"URL\\\" property in the manifest.json should use an http(s) scheme.\", debugTerm, iconURL);\n                return false;\n            }\n        }\n\n        if(iconPack.GetUUID().empty() || !IsValidURI(iconPack.GetUUID())) {\n            dbgprintf(\"Error: The %s has an invalid UUID '%s'. Please rename the %s folder to a valid uniform type identifier (UTI) that contains only lowercase alphanumeric characters (a-z, 0-9), hyphen (-), and period (.).\", debugTerm, iconPack.GetUUID(), ICON_PACK_EXTENSION);\n            return false;\n        }\n\n        // Validate icon\n        const icon = iconPack.GetIconFullPath();\n \n        if(icon.empty()) {\n            dbgprintf(\"Error: The %s has an invalid icon. Please add a valid \\\"Icon\\\" property to the manifest.json.\", debugTerm);\n            return false;\n        }\n\n        const iconPath = iconPack.GetIcon();\n        let iconExists = false;\n        if(iconPath.includes(\"/\")) {\n            iconExists = isInPath(inPathMulti.fullPath, icon) && await utils.getFileFromFileEntryP(inPathMulti, iconPath);\n        } else {\n            iconExists = isFileObject ? await GetPathForComponent(inPathMulti, iconPath) != null : await EplFile_FileExists(icon);\n        }\n        \n        if(!iconExists) {\n            // if(!await EplFile_FileExists(icon)) {\n            dbgprintf(\"Error: The %s has an icon \\\"%s\\\" that does not exist.\", debugTerm, EplFile_GetFileName(icon));\n            return false;\n        }\n\n        if(!IsValidPath(icon)) {\n            dbgprintf(\"Error: The '%s' has an icon \\\"%s\\\" with an invalid path.\", debugTerm, EplFile_GetFileName(icon));\n            return false;\n        }\n\n        // Validate license\n        const license = iconPack.GetLicenseFullPath();\n        if(!license.empty()) {\n            const licenseFileName = iconPack.GetLicense();\n            const licenseMetaData = isFileObject ? Folder_FileExists(iconPackFiles, licenseFileName) : await EplFile_FileExists(license);\n\n            if(!licenseMetaData) {\n                // if(!await EplFile_FileExists(license)) {\n                dbgprintf(\"Error: The %s has a license \\\"%s\\\" that does not exist.\", debugTerm, EplFile_GetFileName(license));\n                return false;\n            }\n\n            if(!IsValidPath(license)) {\n                dbgprintf(\"Error: The '%s' has a license \\\"%s\\\" with an invalid path.\", debugTerm, EplFile_GetFileName(license));\n                return false;\n            }\n        }\n\n        // Validate the icons.json\n        const iconsMetadataPath = iconPack.GetIconsMetadataFullPath();\n        // const iconMetaData = isFileObject ? await GetPathForComponent(inPathMulti, 'icons.json') : await EplFile_FileExists(iconsMetadataPath);\n        const iconMetaData = isFileObject ? Folder_FileExists(iconPackFiles, 'icons.json') : await EplFile_FileExists(iconsMetadataPath);\n        if(!iconMetaData) {\n            // if(iconsMetadataPath.empty() || !EplFile_FileExists(iconsMetadataPath)) {\n            dbgprintf(\"Error: The %s has an icons.json file that does not exist.\", debugTerm);\n            return false;\n        }\n\n        if(!IsValidPath(iconsMetadataPath)) {\n            dbgprintf(\"Error: The '%s' has a icons.json file with an invalid path.\", debugTerm);\n            return false;\n        }\n\n        // const manifestPath = isFileObject ? await GetManifestFromFilePathJS(inPathMulti) : GetIconsMetadataFullPath(inPath);\n        let iconsMetadataSupportedResult = {result: kESDIconPackSupportedResult_Supported}; // ;\n        const iconsMetadata = await ESDIconPackParser.CreateIconsMetadataFromPath(iconsMetadataPath, iconsMetadataSupportedResult, iconMetaData);\n        if(iconsMetadataSupportedResult.result != kESDIconPackSupportedResult_Supported) {\n            dbgprintf(\"Error: The icons.json file doesn't contain a valid json.\");\n            return false;\n        }\n\n        // Check if all the icons in the json exists on disk\n        const allKnownIconPaths = [];\n        for(let iconMetadata of iconsMetadata) {\n\n            if(iconMetadata.path.empty()) {\n                dbgprintf(\"Error: Missing path in icons.json file.\");\n                return false;\n            }\n\n            allKnownIconPaths.push(iconMetadata.path);\n\n            if(iconMetadata.name.empty()) {\n                dbgprintf(\"Error: Missing name in icons.json file for '%s'.\", iconMetadata.path);\n                return false;\n            }\n\n            const iconMetadataFullPath = isFileObject ? iconMetadata.path : iconPack.GetFullPathForIcon(iconMetadata.path);\n            const fileExists = isFileObject ? Folder_FileExists(iconsFiles, iconMetadataFullPath) : await EplFile_FileExists(iconMetadataFullPath);\n\n            // dbgprintf(`checking ${iconMetadataFullPath} ${!!fileExists ? 'ok' : 'failed'}`);\n\n            if(!fileExists) {\n                // if(!await EplFile_FileExists(iconMetadataFullPath)) {\n                dbgprintf(\"Error: The file '%s' defined in the icons.json file does not exist.\", iconMetadataFullPath.c_str());\n                return false;\n            }\n\n            if(!IsValidPath(iconMetadataFullPath)) {\n                dbgprintf(\"Error: The file '%s' defined in the icons.json file has an invalid path.\", iconMetadataFullPath.c_str());\n                return false;\n            }\n\n            // Check if the tags are valid\n            for(let tag of iconMetadata.tags) {\n                if(tag.find(\", \") != npos) {\n                    dbgprintf(\"Error: The tag '%s' in the icons.json file shouldn't be a list of strings. Please use instead a json array like '\\\"tags\\\": [\\\"tag1\\\", \\\"tag2\\\", \\\"tag3\\\"]'\", tag.c_str());\n                    return false;\n                }\n            }\n\n            if('.gif' === EplFile_GetExtension(iconMetadata.path)) {\n                const iconName = iconMetadata.path.replace(\".gif\", \".png\");\n                const inIconsPath = isFileObject ? await GetFolder(inPathMulti, 'icons') : iconPack.GetFullPathForIcon(iconName);\n                const complementaryPngExists = isFileObject ? await GetPathForComponent(inIconsPath, iconName) != null : await EplFile_FileExists(inIconsPath);\n                if(!complementaryPngExists) {\n                    dbgprintf(\"Error: The GIF file '%s' should have a complementary  '%s' .\", iconMetadata.path, iconName);\n                }\n            }\n        }\n\n        // Checked if all the icons on disk exist in the json\n        const iconsFolder = iconPack.GetIconsFolderFullPath();\n        dbgprintf(`Found ${allKnownIconPaths.length} icons in ${iconsFolder}`);\n        \n        if(!previewImagesFolder) {\n            dbgprintf(\"Note: No 'previews' folder was found. It is not required, but allows users to get an idea of what's in the iconpack.\");\n        }\n\n    } catch(error) {\n        dbgprintf(\"Error: Validation failed...  %s\", createErrorMessage(error));\n        // openConsole(true)¥;\n        return false;\n\n    }\n    // if(!CheckFilesFromFolderExistInIconsJson(iconsFolder, \"\", allKnownIconPaths)) {\n    //     return false;\n    // }\n\n    return true;\n\n};\n\n// MARK: - Upload\n\n\n\n// MARK: ESDICONPACK\n//  return new ESDIconPackC(inUUID, version, name, author, url, icon, license, inFullPath);\nexport class ESDIconPackC {\n    constructor (...options) {\n        const [UUID, Version, Name, Author, URL, Icon, License, manifestFullPath] = [...options];\n\n        this.manifest = Object.assign({}, {\n            Version: '1.2.3',\n            Name: 'MyIconPack',\n            Author: 'Andy Fuchs',\n            URL: 'https://elgato.com',\n            UUID: 'com.elgato.iconPack'\n        }, {\n            UUID, Version, Name, Author, URL, Icon, License\n        });\n\n        this.mIconPath = Icon || '';\n        this.mFullPath = manifestFullPath || '';\n        this.mLicensePath = License;\n    }\n\n    get version() {\n        return this.manifest.Version;\n    }\n\n    get url() {\n        return this.manifest.URL;\n    }\n\n    // C++ wrappers\n    GetVersion() {\n        return this.manifest.Version;\n    }\n\n    GetName() {\n        return this.manifest.Name;\n    }\n\n    GetAuthor() {\n        return this.manifest.Author;\n    }\n\n    GetURL() {\n        return this.manifest.URL;\n    }\n\n    GetIcon() {\n        return this.manifest.Icon;\n    }\n\n    GetLicense() {\n        return this.manifest.License;\n    }\n    GetUUID() {\n        return this.manifest.UUID;\n    };\n\n    // GetPathFromFileObject() {\n    //     if(typeof mFullPath === 'object') {\n    //         readFileEntry();\n    //     }\n    // }\n\n    GetIconFullPath() {\n        if(!this.mIconPath.empty() && !this.mFullPath.empty()) {\n            const fullPath = EplFile_AddPathComponent(this.mFullPath, this.mIconPath);\n            return fullPath;\n        }\n\n        return \"\";\n    }\n\n    GetLicenseFullPath() {\n        if(!this.mLicensePath.empty() && !this.mFullPath.empty()) {\n            const fullPath = EplFile_AddPathComponent(this.mFullPath, this.mLicensePath);\n            return fullPath;\n        }\n\n        return \"\";\n    }\n\n    GetIconsMetadataFullPath() {\n        if(!this.mFullPath.empty()) {\n            const fullPath = EplFile_AddPathComponent(this.mFullPath, \"icons.json\");\n            return fullPath;\n        }\n\n        return \"\";\n    }\n\n    GetIconsFolderFullPath() {\n        if(!this.mFullPath.empty()) {\n            const fullPath = EplFile_AddPathComponent(this.mFullPath, \"icons\");\n            return fullPath;\n        }\n\n        return \"\";\n    }\n\n\n    GetFullPathForIcon(inIconPath) {\n        let fullPath = this.GetIconsFolderFullPath();\n        if(!fullPath.empty() && !inIconPath.empty()) {\n            fullPath = EplFile_AddPathComponent(fullPath, inIconPath);\n            return fullPath;\n        }\n\n        return \"\";\n    }\n}\n\n\n\n\nexport function test() {\n    /*\n    const uuid = 'com.elgato.test';\n    const inPath = '.';\n    const manifestPath = 'manifest.json';\n    const supportedResult = 0;\n    const iconPack = ESDIconPackParser.CreateIconPackFromPath(uuid, manifestPath, manifestPath, supportedResult);\n\n    const debugTerm = GetDebugTerm(kESDObjectType_IconPack);\n\n    if(iconPack == NULL) {\n        dbgprintf(\"Error: The manifest.json file doesn't contain a valid json.\");\n        return false;\n    }\n\n    if(iconPack.GetVersion().empty()) {\n        dbgprintf(\"Error: The %s has an invalid version. Please add a valid \\\"Version\\\" property to the manifest.json file.\", debugTerm);\n        return false;\n    }\n\n    const arr = [\"com.elgato.mama\", \"de.io.smm\"];\n    console.log('GetUUID', arr.map(e => `${e} - ${iconPack.GetUUID(e)}`));\n    console.log('IsValidURI', arr.map(e => `${e} - ${IsValidURI(e)}`));\n    */\n    console.log('------- TEST --------');\n    Validate(kESDObjectType_IconPack, 'com.elgato.blue.sdIconPack');\n}\n\n// test();\n\n\n\n// setTimeout(() => {\n//     let ipck = '../com.elgato.red.sdIconPack';\n//     console.log(\"VALIDATE\");\n//     Validate(kESDObjectType_IconPack, ipck).then(success => {\n//         dbgprintf(success ? 'Validation succeeded for  %s' : 'Error while validating iconPack  %s', ipck, !success);\n//     });\n\n//     // let ipck2 = 'com.elgato.blue.sdIconPack';\n//     // Validate(kESDObjectType_IconPack, ipck2).then(success => {\n//     //     dbgprintf(success ? 'Validation succeeded for  %s' : 'Error while validating iconPack  %s', ipck2, !success);\n//     // });\n\n// }, 100);\n\n\n","//==============================================================================\n/**\n@file       ESDIconPackParser.cpp\n\n@brief      Parser for the icon-pack manifest.json\n\n@author     Andy Fuchs\n\n@copyright  (c) 2025, Elgato Systems GmbH. All Rights Reserved.\n\n**/\n//==============================================================================\n/* eslint-disable */\n\nimport {dbgprintf} from './utils';\nimport {ESDIconPackC} from './ESDValidateIconPack';\n\n\nconst ICON_PACK_VERSION = \"Version\";\nconst ICON_PACK_NAME = \"Name\";\nconst ICON_PACK_AUTHOR = \"Author\";\nconst ICON_PACK_URL = \"URL\";\nconst ICON_PACK_ICON = \"Icon\";\nconst ICON_PACK_LICENSE = \"License\";\n\nconst ICON_METADATA_NAME = \"name\";\nconst ICON_METADATA_PATH = \"path\";\nconst ICON_METADATA_TAGS = \"tags\";\n\nconst SD_DISTRIBUTION_TOOL = true;\n\nconst kESDIconPackSupportedResult_Supported = 0;\nconst kESDIconPackSupportedResult_Malformed = 1;\nconst kESDIconPackSupportedResult_AlreadyInstalled = 2;\n\n// const readFile = () => {\n//     const reader = new FileReader();\n//     reader.onloadend = (evt) => {\n//         resolve(evt.target.result);\n//     };\n//     if(['blob', 'arraybuffer'].includes(responseType)) {\n//         reader.readAsArrayBuffer(fileObj);\n//     } else if(['text'].includes(responseType)) {\n//         reader.readAsText(fileObj);\n//     } else {\n//         reader.readAsDataURL(fileObj);\n//     }\n// };\n\nconst createErrorMessage = (e) => {\n    if(typeof e === 'object') {\n        // if(e instanceof FileSystemFileEntry) {\n        // if(e instanceof FileSystemEntry) {\n        if(e.fullPath) {\n            return e.fullPath.substr(1);\n        } else if(e instanceof Error) {\n            return `${e.name}: ${e.message}`;\n        }\n    }\n    return e;\n};\n\nconst fetchFile = (inFullPath) => {\n    return new Promise(function(resolve, reject) {\n        const request = Object.assign(new XMLHttpRequest());\n        request.open('GET', inFullPath, true);\n        request.onload = (e, f) => {\n            if(request.responseType === 'json') {\n                const jsn = Utils.parseJson(request.response);\n                if(jsn) {\n                    resolve(jsn);\n                } else {\n                    // dbg('[Error]::ReadFile.reply was not JSON', request);\n                    reject('No JSON response!');\n                }\n            } else if(request.responseType === 'arraybuffer') {\n                resolve(request.response);\n            } else {\n                resolve(request.responseText);\n            }\n        };\n        request.send();\n    });\n};\n\nfunction readFilePromise(file) {\n    return new Promise(function(resolve) {\n        const reader = new FileReader();\n        reader.onloadend = function(evt) {\n            resolve(evt.target.result);\n        };\n        reader.onerror = function() {\n            resolve(\"\");\n        };\n        reader.readAsText(file);\n    });\n};\n\nexport async function readFileEntry(entry, successCallback, errorCallback) {\n    return new Promise(function(resolve) {\n        entry.file(function(file) {\n            let reader = new FileReader();\n\n            reader.onload = function() {\n                successCallback && successCallback(reader.result);\n                resolve(reader.result);\n            };\n\n            reader.onerror = function() {\n                errorCallback && errorCallback(reader.error);\n                resolve('');\n            };\n\n            reader.readAsText(file);\n        }, errorCallback);\n    });\n}\n\nconst fetchFileSync = (inFullPath) => {\n    const request = new XMLHttpRequest();\n    request.open('GET', decodeURIComponent(inFullPath), false);  // `false` makes the request synchronous\n    request.send(null);\n    return request.readyState === 4 ? request.responseText : 'NOTHING';\n};\n\n// #include \"DebugPrint.hpp\";\n// EPL_DEBUG_INIT(ESDIconPackParser, EPL_DEBUG_DEFAULT_DBGPRINT_LEVEL);\nclass ESDIconPackParserC {\n    constructor (options) {\n\n    }\n    async CreateIconPackFromPath(inUUID, inFullPath, inManifestPath, outSupportedResult = {result: 0}, inPathMulti) {\n\n        try {\n            // #if _UP_WINDOWS;\n            //         // Fix for SD-2956 App Store: Can't install plugins if the username contains umlaut\n            //         // which is similar to SD-1028\n            //         USES_CONVERSION;\n            //         std:: wstring wManifestPath = A2W_CP(inManifestPath.c_str(), CP_UTF8);\n\n            //         std:: ifstream ifstream(wManifestPath, std:: ifstream::in);\n            // #else;\n            //         std:: ifstream ifstream(inManifestPath, std:: ifstream::in);\n            // #endif;\n\n            // Read the file\n            // if Javascript\n\n            const ifstream = typeof inManifestPath === 'object' ? await readFileEntry(inManifestPath) : fetchFileSync(inManifestPath);\n            const manifestJson = JSON.parse(ifstream);\n\n            //\n            // Parse the icon-pack\n            //\n            const version = manifestJson[ICON_PACK_VERSION]; // Throw if missing\n            const name = manifestJson[ICON_PACK_NAME]; // Throw if missing\n            const author = manifestJson[ICON_PACK_AUTHOR]; // Throw if missing\n            const icon = manifestJson[ICON_PACK_ICON]; // Throw if missing\n\n            const url = manifestJson[ICON_PACK_URL] || \"\"; // Use a default value if the value does not exist\n            const license = manifestJson[ICON_PACK_LICENSE] || \"\"; // Use a default value if the value does not exist\n\n            outSupportedResult.result = kESDIconPackSupportedResult_Supported;\n            return new ESDIconPackC(inUUID, version, name, author, url, icon, license, inFullPath, ifstream, manifestJson);\n        }\n        catch(error) {\n            const errMsg = createErrorMessage(inManifestPath);\n            dbgprintf(\"Error: Exception when parsing manifest file %s.  Error: %s\", errMsg, createErrorMessage(error));\n            console.trace(\"Exception when parsing manifest file %s\", errMsg, error);\n            outSupportedResult.result = kESDIconPackSupportedResult_Malformed;\n            throw outSupportedResult;\n        }\n\n        return null;\n    }\n    async CreateIconsMetadataFromPath(inFullPath, outSupportedResult, inPathMulti) {\n        let outIconsMetadata = [];\n        // outSupportedResult = kESDIconPackSupportedResult_Supported;\n        outSupportedResult.result = kESDIconPackSupportedResult_Supported;\n\n        try {\n            // #if _UP_WINDOWS;\n            //         // Fix for SD-2956 App Store: Can't install plugins if the username contains umlaut\n            //         // which is similar to SD-1028\n            //         USES_CONVERSION;\n            //         std:: wstring wIconsPath = A2W_CP(inFullPath.c_str(), CP_UTF8);\n\n            //         std:: ifstream ifstream(wIconsPath, std:: ifstream::in);\n            // #else;\n            //         std:: ifstream ifstream(inFullPath, std:: ifstream::in);\n            // #endif;\n\n            // Read the file\n            // const iconsJson = JSON.parse(ifstream);\n\n            const ifstream = typeof inPathMulti === 'object' ? await readFileEntry(inPathMulti) : fetchFileSync(inFullPath);\n            const iconsJson = JSON.parse(ifstream);\n\n            //\n            // Parse the icon-pack\n            //\n            if(Array.isArray(iconsJson)) {\n                for(let iconMetadataJson of iconsJson) {\n                    const path = iconMetadataJson[ICON_METADATA_PATH]; // Throw if missing\n                    const name = iconMetadataJson[ICON_METADATA_NAME]; // Throw if missing\n\n                    const tags = [];\n                    const tagsJson = iconMetadataJson[ICON_METADATA_TAGS]; // Throw if missing\n\n                    if(Array.isArray(tagsJson)) {\n                        for(let j of tagsJson) {\n                            if(j.length) tags.push(j);\n                        }\n                    } else {\n                        if(SD_DISTRIBUTION_TOOL) {\n                            dbgprintf(\"Error: The tags for '%s' is not a json array.\", name);\n                        }\n                        outSupportedResult.result = kESDIconPackSupportedResult_Malformed;\n                    }\n\n                    const iconMetadata = {};\n                    iconMetadata.name = name;\n                    iconMetadata.path = path;\n                    iconMetadata.tags = tags;\n\n                    outIconsMetadata.push(iconMetadata);\n                }\n            }\n        }\n        catch(error) {\n            dbgprintf(\"Exception when parsing the icons.json file %s. Error: %s\", inFullPath, createErrorMessage(error));\n            outSupportedResult.result = kESDIconPackSupportedResult_Malformed;\n            throw outIconsMetadata;\n        }\n\n        return outIconsMetadata;\n    }\n}\n\nexport var ESDIconPackParser = new ESDIconPackParserC();\n","/* eslint-disable */\n\nimport Utils from './utils';\n\n\nlet license = `Copyright 2025 Corsair/Elgato, Inc and other contributors\nLicensed under the MIT License: http://opensource.org/licenses/MIT`;\n\nconst MANIFEST = {\n    \"Name\": \"My awesome icon pack\",\n    \"Version\": \"1.0.0\",\n    \"Description\": \"This is a very cool iconpack\",\n    \"Author\": \"Famous Icon Creator\",\n    \"URL\": \"https://www.elgato.com\",\n    \"Icon\": \"\",\n    \"License\": \"license.txt\"\n};\nexport class ESDIconPackManifest {\n    // #privateField; // doesn't work in FF\n    constructor (options = {}) {\n        this.__manifestFilePath = '';\n        this.__loaded = false;\n        this.__license = license;\n        this.__iconPack = options.iconPack;\n        // this.#privateField = 42;\n        Object.assign(this, MANIFEST, options, {license});\n        this._Icon = \"\";\n    }\n    set license(value) {\n        // console.log(\"[ESDIconPackManifest]:license\", typeof value, value);\n        if(typeof value === 'string') {\n            this._license = value;\n        } else {\n            Utils.fetchFile(this.getFileObj(value), 'text').then(inData => {\n                console.log(\"ESDIconPackManifest:fetchedLicense:\", inData);\n                this.__license = inData;\n            });\n        }\n    }\n\n    get license() {\n        return this.__license;\n    }\n\n    set Icon(value) {\n        // icon is set to a string\n        const found = this.__iconPack.icons.find(i => i.name == value);\n        if(found) {\n            // console.log(\"[ESDIconPackManifest]:found icon in icons:\", found && found.file);\n            this.__iconPack.icon = found.file;\n            this.__iconPack.removeIcon(found);\n        }\n        this._Icon = value;\n    }\n\n    get Icon() {\n        return this._Icon;\n    }\n\n    toJSON() {\n        return this.compile();\n    }\n\n    toString() {\n        return JSON.stringify(this.compile(), null, 4);\n    }\n\n    setFile(f) {\n\n    }\n\n    setLicenseText(value) {\n        this.__license = value;\n    }\n\n    get loaded() {\n        return this.__loaded;\n    }\n\n    set manifestjson(value) {\n        this.readFromFile(value);\n    }\n\n    get manifestjson() {\n        return this.__manifestFilePath;\n    }\n\n    readFromFile(f) {\n        return f && this.readFromFileObject(this.getFileObj(f));\n    }\n\n    readFromFileObject(f) {\n        return Utils.fetchFile(f, \"text\").then(inData => {\n            let data = Utils.parseJson(inData, (catchedErr) => {}) || {};\n            // console.log(\"Manifest:readFromFileObject\", f, data);\n            Object.entries(data).map(props => {\n                this[props[0]] = props[1];\n                // console.log(props[0], props[1]);\n                // Utils.fetchXhr;\n            });\n            // Object.assign(this, data);\n            this.__manifestFilePath = f.fullPath || f.name || '';\n            return this;\n        });\n    }\n\n    readFile(f) {\n        if(f.name.toLowerCase() === \"manifest.json\") {\n            this.readFromFile(f);\n        }\n    }\n\n    compile() {\n        const o = {};\n        Object.keys(MANIFEST).map(k => {\n            // console.log(k, this[k]);\n            o[k] = this[k];\n        });\n        // console.trace(o);\n        return o;\n        // return Utils.pick(this, Object.keys(MANIFEST));\n    }\n\n    getFileObj(f) {\n        if(f instanceof File) {\n            return f;\n        } else if(f.file && f.file instanceof File) {\n            return f.file;\n        } else if(f.fileObject && f.fileObject instanceof File) {\n            return f.fileObject;\n        }\n    }\n\n}\n","// eslint-disable-next-line no-unused-vars\n\nconst debug = false;\nexport class ESDImageScaler {\n    constructor (options) {\n\n        this.dbg = debug ? console.log.bind(window.console, '[ESDImageScaler]') : () => {};\n\n        const w = 144;\n        const h = 144; //w * 9 / 16\n        this.canvas = document.createElement('canvas');\n        this.canvas.width = options && options.width ? options.width : w;\n        this.canvas.height = options && options.height ? options.height : h;\n\n        this.defaultImageName = 'streamdeck.jpg';\n        this.coverMode = true;\n\n        // const isDataURL = (s) => !!s.match(isDataURL.regex);\n\n        const isDataURL = (s) => {\n            return !!s.match(isDataURL.regex);\n        };\n        // eslint-disable-next-line\n        isDataURL.regex = /^\\s*data:([a-z]+\\/[a-z]+(;[a-z\\-]+\\=[a-z\\-]+)?)?(;base64)?,[a-z0-9\\!\\$\\&\\'\\,\\(\\)\\*\\+\\,\\;\\=\\-\\.\\_\\~\\:\\@\\/\\?\\%\\s]*\\s*$/i;\n        this.isDataURL = isDataURL;\n    }\n\n    loadImage(imgPathOrFileobj, callback) {\n        return this.loadImageP(imgPathOrFileobj).then(dataUrl => {\n            if(callback) callback(dataUrl);\n            return dataUrl;\n        });\n    }\n    loadImageP(imgPathOrFileobj) {\n        this.dbg('loadImageP', imgPathOrFileobj);\n        if(typeof imgPathOrFileobj == 'object' && imgPathOrFileobj.fullPath) {\n            console.log('xxx imgPathOrFileobj', imgPathOrFileobj);\n            // return this.loadAndScaleImage(imgPathOrFileobj.fullPath, true);\n            return '';\n        } else if(imgPathOrFileobj instanceof Blob) {\n            return this.loadAndScaleImage(URL.createObjectURL(imgPathOrFileobj), true);\n        } else if(imgPathOrFileobj instanceof File) {\n            return this.loadAndScaleImage(URL.createObjectURL(imgPathOrFileobj), true);\n        } else if(typeof imgPathOrFileobj === 'string' && this.isDataURL(imgPathOrFileobj)) {\n            return this.loadAndScaleImage(imgPathOrFileobj);\n\n            // } else if(typeof imgPathOrFileobj == 'object' && imgPathOrFileobj.image) {\n            //     this.loadImage(URL.createObjectURL(imgPathOrFileobj.image), imgPathOrFileobj.properties.path, true);\n        } else if(typeof imgPathOrFileobj === 'string'){\n            const imageSrc = imgPathOrFileobj.includes('/') ? imgPathOrFileobj : `images/${imgPathOrFileobj.length ? imgPathOrFileobj : this.defaultImageName}`;\n            return this.loadAndScaleImage(imageSrc);\n        }\n\n        return Promise.reject('');\n    }\n    loadAndScaleImage(imageSrc, revokeObjectURL = false) {\n        this.dbg(\"ESDImageLoader::loadImage\", imageSrc);\n        return new Promise(resolve => {\n            let image = new Image();\n            image.onload = () => {\n                this.scaleAndDrawImage(image);\n                if(revokeObjectURL) URL.revokeObjectURL(imageSrc);\n                image = null;\n                const dataUrl = this.canvas.toDataURL('image/png');\n                resolve(dataUrl);\n            };\n            image.src = imageSrc;\n        });\n\n    }\n    scaleAndDrawImage(img) {\n        const ctx = this.canvas.getContext('2d');\n        const canvas = this.canvas;\n        const ratio = this.coverMode === true ? Math.max(canvas.width / img.width, canvas.height / img.height) : Math.min(canvas.width / img.width, canvas.height / img.height);\n        const centerX = (canvas.width - img.width * ratio) / 2;\n        const centerY = (canvas.height - img.height * ratio) / 2;\n        ctx.clearRect(0, 0, canvas.width, canvas.height);\n        // this.dbg(\"centerX/Y\", centerX, centerY, \"ratio:\", ratio);\n        ctx.drawImage(img, 0, 0, img.width, img.height, centerX, centerY, img.width * ratio, img.height * ratio);\n    }\n}\n","/** \n * ELGEventEmitter\n * Simple Pub/Sub Emitter\n */\n\nexport class ELGEventEmitter {\n    constructor(id, debug = false) {\n        const eventList = new Map();\n\n        this.on = (name, fn) => {\n            if (!eventList.has(name)) eventList.set(name, this.pubSub());\n            return eventList.get(name).sub(fn);\n        };\n\n        this.has = name => eventList.has(name);\n        this.emit = (name, data) => eventList.has(name) && eventList.get(name).pub(data);\n        this.dbg = debug ? console.log.bind(window.console, id || '') : () => { };\n    }\n\n    pubSub() {\n        const subscribers = new Set();\n\n        const sub = fn => {\n            subscribers.add(fn);\n            return () => {\n                subscribers.delete(fn);\n            };\n        };\n\n        const pub = data => subscribers.forEach(fn => fn(data));\n        return Object.freeze({ pub, sub });\n    }\n}","\n\nimport JSZip from 'jszip';\nimport {saveAs} from 'file-saver';\nimport Utils from './utils';\nimport {ESDIconPackManifest} from './ESDIconPackManifest';\nimport {ESDImageScaler} from './ESDImageScaler.js';\nimport {ELGEventEmitter} from './ELGEventEmitter';\n\nconst MRequiredSizeFactor = 36;\n\n\n// const placeholder_preview = \"data:image/svg+xml,%3Csvg width='1280' height='800' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h1280v800H0z' fill='%23000' fill-rule='evenodd' fill-opacity='.25'/%3E%3C/svg%3E\";\n// const ipmSVG = \"data:image/svg+xml,%3Csvg width='144' height='144' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath opacity='.1' d='M0 0h144v144H0z'/%3E%3Cpath d='M57.42 13c10.364 0 20.168 3.086 28.572 8.978a51.59 51.59 0 018.132 6.961l3.472-3.425 39.734 39.205-39.734 39.206-4.602-4.542a49.887 49.887 0 01-3.08 2.834C80.95 109.792 69.183 114 57.42 114c-13.445 0-26.05-5.33-35.574-14.87C12.322 89.593 7 76.968 7 63.5c0-13.467 5.322-26.092 14.846-35.63C31.37 18.33 43.975 13 57.42 13zm.28 9.82a40.08 40.08 0 00-26.033 9.542C22.417 39.695 16.5 50.919 16.5 63.5c0 20.611 15.882 37.582 36.288 39.763 1.612.215 3.25.335 4.912.356 8.684 0 16.807-2.805 23.81-7.855a40.876 40.876 0 004.17-3.596L57.863 64.719l29.356-28.965C79.801 27.644 69.194 22.82 57.7 22.82zM15.106 134v-2.4h-2.368v-7.2h2.368V122H8v2.4h2.369v7.2H8v2.4h7.106zm9.476-9.6V122h-4.738v2.4h4.738zm-4.738 7.2v-7.2h-2.369v7.2h2.37zm4.738 2.4v-2.4h-4.738v2.4h4.738zm9.475-9.6V122h-4.738v2.4h4.738zm-4.738 7.2v-7.2h-2.368v7.2h2.368zm7.107 0v-7.2h-2.369v7.2h2.369zm-2.369 2.4v-2.4h-4.738v2.4h4.738zm7.106 0v-7.2h2.37v-2.4h-2.37V122h-2.368v12h2.368zm7.107 0v-12H45.9v4.8h-2.369v2.4h2.37v4.8h2.368zm6.648-4.644v-2.4h-4.28v2.4h4.28zM59.656 134v-4.8h2.369v-2.4h-2.37v-2.4h2.37V122h-4.738v12h2.369zm4.738-7.2v-2.4h-2.37v2.4h2.37zm7.106-2.4V122h-2.369v2.4H71.5zm-2.369 9.6v-4.8H71.5v4.8h2.369v-9.6H71.5v2.4h-2.369v-2.4h-2.369v9.6h2.37zm14.213-9.6V122h-4.738v2.4h4.738zm-4.738 7.2v-7.2h-2.368v7.2h2.368zm4.738 2.4v-2.4h-4.738v2.4h4.738zm4.738 0v-4.8h2.369v-2.4h-2.37V122h-2.368v12h2.369zm4.737-7.2V122h-2.368v4.8h2.368zm0 7.2v-4.8h-2.368v4.8h2.368zm6.649-4.644v-2.4h-4.28v2.4h4.28zm4.737 4.644v-7.2h2.37v-2.4h-2.37V122h-2.368v12h2.368zm9.476 0v-12h-2.37v2.4h-2.368v2.4h2.369v7.2h2.369zm-4.743-4.8v-2.4h-2.369v2.4h2.369zm11.85-4.8V122h-2.37v2.4h2.37zm-2.37 9.6v-4.8h2.37v4.8h2.368v-9.6h-2.369v2.4h-2.369v-2.4h-2.369v9.6h2.37zm9.476 0v-7.2h2.368v-2.4h-2.368V122h-2.37v12h2.37zm7.106 0v-12h-2.369v4.8h-2.369v2.4h2.37v4.8H135z' fill='%23FFF'/%3E%3C/svg%3E\";\n\n// const ipmSVG = \"data:image/svg+xml,%3Csvg width='144' height='144' xmlns='http://www.w3.org/2000/svg'%3E%3Cg opacity='1'%3E%3Cpath opacity='0' fill='%2300f' d='M0 0h144v144H0z'/%3E%3Cpath fill='%235e6271' d='M57.42 13c10.364 0 20.168 3.086 28.572 8.978a51.59 51.59 0 018.132 6.961l3.472-3.425 39.734 39.205-39.734 39.206-4.602-4.542a49.887 49.887 0 01-3.08 2.834C80.95 109.792 69.183 114 57.42 114c-13.445 0-26.05-5.33-35.574-14.87C12.322 89.593 7 76.968 7 63.5c0-13.467 5.322-26.092 14.846-35.63C31.37 18.33 43.975 13 57.42 13zm.28 9.82a40.08 40.08 0 00-26.033 9.542C22.417 39.695 16.5 50.919 16.5 63.5c0 20.611 15.882 37.582 36.288 39.763 1.612.215 3.25.335 4.912.356 8.684 0 16.807-2.805 23.81-7.855a40.876 40.876 0 004.17-3.596L57.863 64.719l29.356-28.965C79.801 27.644 69.194 22.82 57.7 22.82zM15.106 134v-2.4h-2.368v-7.2h2.368V122H8v2.4h2.369v7.2H8v2.4h7.106zm9.476-9.6V122h-4.738v2.4h4.738zm-4.738 7.2v-7.2h-2.369v7.2h2.37zm4.738 2.4v-2.4h-4.738v2.4h4.738zm9.475-9.6V122h-4.738v2.4h4.738zm-4.738 7.2v-7.2h-2.368v7.2h2.368zm7.107 0v-7.2h-2.369v7.2h2.369zm-2.369 2.4v-2.4h-4.738v2.4h4.738zm7.106 0v-7.2h2.37v-2.4h-2.37V122h-2.368v12h2.368zm7.107 0v-12H45.9v4.8h-2.369v2.4h2.37v4.8h2.368zm6.648-4.644v-2.4h-4.28v2.4h4.28zM59.656 134v-4.8h2.369v-2.4h-2.37v-2.4h2.37V122h-4.738v12h2.369zm4.738-7.2v-2.4h-2.37v2.4h2.37zm7.106-2.4V122h-2.369v2.4H71.5zm-2.369 9.6v-4.8H71.5v4.8h2.369v-9.6H71.5v2.4h-2.369v-2.4h-2.369v9.6h2.37zm14.213-9.6V122h-4.738v2.4h4.738zm-4.738 7.2v-7.2h-2.368v7.2h2.368zm4.738 2.4v-2.4h-4.738v2.4h4.738zm4.738 0v-4.8h2.369v-2.4h-2.37V122h-2.368v12h2.369zm4.737-7.2V122h-2.368v4.8h2.368zm0 7.2v-4.8h-2.368v4.8h2.368zm6.649-4.644v-2.4h-4.28v2.4h4.28zm4.737 4.644v-7.2h2.37v-2.4h-2.37V122h-2.368v12h2.368zm9.476 0v-12h-2.37v2.4h-2.368v2.4h2.369v7.2h2.369zm-4.743-4.8v-2.4h-2.369v2.4h2.369zm11.85-4.8V122h-2.37v2.4h2.37zm-2.37 9.6v-4.8h2.37v4.8h2.368v-9.6h-2.369v2.4h-2.369v-2.4h-2.369v9.6h2.37zm9.476 0v-7.2h2.368v-2.4h-2.368V122h-2.37v12h2.37zm7.106 0v-12h-2.369v4.8h-2.369v2.4h2.37v4.8H135z' /%3E%3C/g%3E%3C/svg%3E\";\n\nconst placeholder_preview = \"data:image/svg+xml,%3Csvg width='1280' height='800' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-opacity='0.1' d='M0 0h1280v800H0z'/%3E%3Ctext font-family='Arial, Helvetica, sans-serif' font-size='70' font-weight='bold' fill='%235D4B4B'%3E%3Ctspan x='314.511' y='425'%3EDrag an image here%3C/tspan%3E%3C/text%3E%3C/svg%3E\"\n    // `<svg width=\"1280\" height=\"800\" xmlns=\"http://www.w3.org/2000/svg\"><path fill-opacity=\".1\" d=\"M0 0h1280v800H0z\"/><text font-family=\"Arial, Helvetica, sans-serif\" font-size=\"70\" font-weight=\"bold\" fill=\"#5D4B4B\"><tspan x=\"314.511\" y=\"425\">Drag an image here</tspan></text></svg>`\n// const MIconTemplate = {\n//     'path': 'icon_1.svg',\n//     'name': 'Empty icon',\n//     'tags': []\n// };\n\nwindow.placeholder_preview = placeholder_preview;\nwindow.emitr = ELGEventEmitter;\nwindow.emtr = new ELGEventEmitter();\n\nexport class ESDIcon extends ELGEventEmitter {\n    constructor (options) {\n        super('[ESDIcon] :', (options && options.debug || false));\n        this.displayName = '';\n        this.zip = options.zip || null;\n        this.file = options.file || null;\n        this.src = '';\n        this.objectURL = null;\n        \n    } \n    \n}\n\nexport class ESDIconPack extends ELGEventEmitter {\n    // debouncedEmit = Utils.debounce(this.emit, 100);\n    debouncedEmit = Utils.debounce((fn) => {\n        if(typeof fn === 'function') fn();\n    }, 600);\n    __uid = '';\n    constructor (options) {\n        super('[ESDIconPack] :', (options && options.debug || false));\n        this.init();\n    }\n\n    init() {\n        this.__iconsToAdd = [];\n        this.__iconAsDataURL = null;\n        this.__iconsjson = [];\n        this.__sortState = '';\n        this.readOnly = false;\n        \n        this.forceThumbnail = false;\n        this.icons = [];\n        this.esdIcons = [];\n        this.previews = [placeholder_preview, placeholder_preview, placeholder_preview];\n        // this.icon = \"css/blue.svg\";\n        // this.icon = 'data:image/svg+xml,%3Csvg width=\\'144\\' height=\\'144\\' xmlns=\\'http://www.w3.org/2000/svg\\'%3E%3Cpath fill=\\'%23FF0000\\' d=\\'M0 0h144v144H0z\\' fill-rule=\\'evenodd\\'/%3E%3C/svg%3E';\n        // this.icon = \"data:image/svg+xml,%3Csvg viewBox='0 0 262 201' version='1.1' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath opacity='1' d='M102.5 0c29.0051 0 55.1963 11.8125 73.8426 30.7988l5.8497-5.7717 79.4678 78.4118-79.4678 78.4119-8.8418-8.7252C154.9443 190.3928 129.9855 201 102.5 201 45.8908 201 0 156.0046 0 100.5S45.8908 0 102.5 0zm0 20C56.9365 20 20 56.265 20 101s36.9365 81 82.5 81c22.1351 0 42.2342-8.5589 57.0513-22.4898l-56.8269-56.0713 59.306-58.5177C147.0166 29.5613 125.8956 20 102.5 20z' fill='%235e6271' stroke='none' stroke-width='1' fill-rule='evenodd'/%3E%3C/svg%3E\";\n        this.icon = placeholder_preview;\n        this.uid = '';\n        this.lazy = [];\n        this.manifest = new ESDIconPackManifest({Author: 'Elgato Systems', iconPack: this});\n        this.updated = 0;\n    }\n\n    set icon(value) {\n        // console.log(\"------  ESDIconPack: set icon ----\", value);\n        if(value instanceof File) {\n            if(value.type.startsWith('image')) {\n                this.icon = URL.createObjectURL(value);  // this calls itself, but the new input value is an object url\n            }\n        } else {\n            this.__icon = value;\n        }\n        this.getIconAsDataUrl().then(du => this.__iconAsDataURL = du);\n    }\n\n    get icon() {\n        return this.__icon;\n    }\n\n    set license(value) {\n        this.manifest.license = value;\n        this.updated = Date.now();\n    }\n\n    get license() {\n        console.log('i:license:', this.manifest.license);\n        return this.manifest.license;\n    }\n\n    set uid(value) {\n        // console.log('setting uid:', value);\n        // if(value !== this.__uid) {\n        //     this.emit('uidChanged', value);\n        // }\n        this.__uid = value;\n        this.emit('uidChanged', value);\n    }\n\n    get uid() {\n        return this.__uid;\n    }\n\n    getIconAsDataUrl() {\n        return Utils.fetchXhr(this.__icon, 'blob').then(d => d.blob()).then(b => {\n            return Utils.fetchFile(b);\n        });\n    }\n\n    set iconsjson(value) {\n        if(Array.isArray(value)) {\n            // console.log('setting iconsjson to ', value);\n            return this.setMeta('iconsjson', value);\n        }\n        const f = this.getFileObj(value);\n        if(f) {\n            return Utils.fetchFile(f, 'text').then(inData => {\n                let data = Utils.parseJson(inData, (catchedErr) => {console.log('Error parsing data', catchedErr, inData);}) || {};\n                if(Array.isArray(data)) {\n                    // this.setMeta('iconsjson', data);\n                    this.iconsjson = data;\n                }\n            });\n        }\n    }\n\n    get iconsjson() {\n        return this.__iconsjson;\n    }\n\n    getSelected() {\n        return this.icons.filter(i => i.isSelected);\n    }\n\n    setMeta(prop, value) {\n        this[`__${prop}`] = value;\n    }\n\n    getMeta(prop) {\n        return this[`__${prop}`] || {};\n    }\n    \n    isPreview(f) {\n        return f === placeholder_preview;\n    }\n    \n    insertItemsAtIndex(arr, index, items) {\n        // console.log('insertItemsAtIndex', arr, index, items);\n        return [...arr.slice(0, index), ...items, ...arr.slice(index)];\n    }\n    \n    insertItemAtIndex(arr, index, item) {\n        // console.log('insertItemsAtIndex', arr, index, items);\n        return [...arr.slice(0, index), item, ...arr.slice(index)];\n    }\n    \n    replaceItemAtIndex(arr, index, item) {\n        const idx = index < 1 ? 0 : index;\n        return [...arr.slice(0, idx), item, ...arr.slice(idx+1)];\n    }\n    replacePreviewAtIndex(index, item) {\n        this.previews = this.replaceItemAtIndex(this.previews, index, item);\n    }\n    \n    logPreviewNames(msg) {\n        console.log(msg, this.previews.map(p => p.file ? p.file.name : 'placeholder'));\n    }\n    \n    swapPreviews(from, to) {\n        const fromItem = this.previews[from];\n        const toItem = this.previews[to];\n        this.replacePreviewAtIndex(to, fromItem);\n        this.replacePreviewAtIndex(from, toItem);\n    }\n    insertPreviewAtIndex(index, preview) {\n        this.previews = this.insertItemAtIndex(this.previews, index, preview);\n    }\n    addPreview(f, idx) {\n        const foundPlaceHolderIndex = this.previews.indexOf(placeholder_preview);\n        if((idx != undefined) && idx >= 0 && idx < this.previews.length) {\n            this.replacePreviewAtIndex(idx, f);\n        } else if(foundPlaceHolderIndex > -1) {\n            this.replacePreviewAtIndex(foundPlaceHolderIndex, f);\n            this.sortPreviews();\n        } else {\n            this.previews.push(f);\n            while(this.previews.length > 3) {\n                this.previews.pop();\n            }\n            this.sortPreviews();\n        }\n    }\n    \n    sortPreviews() {\n        this.previews.sort((a, b) => {\n            if(!a.name || !b.name) return 1;\n            return a.name.localeCompare(b.name);\n        });\n    }\n    \n    removePreview(f, removeAll = false) {\n        if(removeAll) {\n            // this.previews.splice(0, this.previews.length);\n            this.previews = [placeholder_preview, placeholder_preview, placeholder_preview];\n        } else {\n            const index = this.previews.indexOf(f);\n            if(index > -1) {\n                this.previews.splice(index, 1);\n                this.previews.push(placeholder_preview);\n                // this.previews[index] = placeholder_preview;\n            }\n        }\n    }\n\n    removeId() {\n        this.uid = '';\n    }\n    \n    cleanPreviewsFromPlaceholders(inArr) {\n        const arr = inArr || this.previews;\n        for(let i = arr.length - 1;i >= 0;i--) {\n            if(arr[i] == placeholder_preview) {\n                arr.splice(i, 1);\n            }\n        }\n        return arr;\n    }\n\n    hasIconsJson() {\n        return this.__iconsjson.length;\n    }\n    \n    readManifest(f) {\n        return Utils.fetchFile(f, 'text').then(inData => {\n            console.log('ESDIconPack:readManifest', f, inData);\n            let data = Utils.parseJson(inData, (catchedErr) => {console.log('Error parsing data', catchedErr, inData);}) || {};\n            // return Object.entries(manifest).map(props => {\n            //     iconPack[props[0].toLowerCase()] = props[1];\n            // });\n            Object.assign(this.manifest, data);\n            this.__manifestFilePath = f.fullPath || f.name || '';\n            return this;\n        });\n    }\n    \n    setManifestFromJson(jsn) {\n        if(typeof jsn == 'object') {\n            jsn.iconPack = this;\n            this.manifest = new ESDIconPackManifest(jsn);\n        }\n    }\n    \n    setIconPackIcon(evt) {\n        let droppedFiles = evt.dataTransfer.files;\n        if(!droppedFiles) return;\n        this.setIcon(droppedFiles[0]);\n    }\n\n    isGif(f) {\n        return f.type === 'image/gif';\n    }\n    setIcon(inFile) {\n        if(!inFile) return;\n        const f = this.getFileObj(inFile);\n        if(f.type === 'image/gif') {\n            this.createThumbnail(f).then(fl => {\n                this.icon = fl.thumbNail;\n                this.manifest.Icon = 'icon.png';\n            }).catch(err => {\n                console.log('Error creating thumbnail:', err);\n                return;\n            });\n        } else {\n            this.icon = f;\n            const fa = f.name.split('.');\n            f.suffix = fa.pop();\n            this.manifest.Icon = `icon.${f.suffix}`;\n        }\n    }\n\n    addIconAtIndex(f, idx, ipIcon) {\n        this.icons.splice(idx, 0, f);\n        if(!this.icon) this.icon = ipIcon;\n    }\n\n    loadThumbnailThreaded() {\n        var ms = 1;\n        setTimeout(() => {\n            const f = this.__iconsToAdd.shift();\n            if(!f.hasThumbnail) {\n                this.createThumbnail(f.file).then(fl => {\n                    f.thumbNail = fl.thumbNail;\n                }).then(() => {\n                    if(this.__iconsToAdd.length) {\n                        this.loadThumbnailThreaded(this.__iconsToAdd);\n                    }\n                }).catch(err => {\n                    console.log('Error creating thumbnail:', err, f);\n                });\n            }\n\n            if(!this.__iconsToAdd.length) {\n                this.updated = Date.now();\n                this.emit('showMessage', '');\n                // this.emit('thumbnailsLoaded');\n                this.debouncedEmit(() => {\n                    this.emit('thumbnailsLoaded');\n                });\n            }\n        }, ms);\n    }\n    \n    sortIconPack() {\n       const arr = this.__iconsjson;\n       this.icons.sort((a, b) => {\n            return arr.findIndex(o => o.path == a.file.name) > arr.findIndex(o => o.path == b.file.name) ? 1 :-1;\n        });\n    }\n    \n    addIconT(f) {\n         setTimeout(() => {\n             this.addIcon(f);\n            }, 0);\n    }\n\n    addIcon(f) {\n        // this.esdIcons.push(new ESDIcon(f));\n        // eslint-disable-next-line\n        if(!f.file) return;\n        \n        const t = this.__iconsjson.find(i => f.file.name == i.path);\n        f.tags = t ? Utils.tagify(t.tags) : [];\n        if(t) {\n            if(t.name !== '') f.name = t.name;\n        }\n        // this.icons.splice(idx, 0, f);\n        \n        this.icons.push(f);\n        //        const iconsArray = this.__iconsjson;\n    //    this.icons.sort((a, b) => {\n    //         return iconsArray.findIndex(o => o.path == a.file.name) >  iconsArray.findIndex(o => o.path == b.file.name) ? 1 : -1;\n    //     });\n    \n        this.sortIconPack();\n                \n        if(f.suffix == 'gif' || f.file.type === 'image/gif') {\n            if(f.zip && f.zip.thumbNail) {\n                return;\n            }\n            if(!f.thumbNail || (typeof f.thumbNail == 'string' && f.thumbNail.startsWith('data:image/svg+xml'))) {\n                this.emit(\"showMessage\", 'Updating thumbnails...');\n                this.__iconsToAdd.push(f);\n                this.loadThumbnailThreaded();\n            }\n\n            // setTimeout(() => {\n            // this.createThumbnail(f.file).then(fl => {\n            //     this.updated = Date.now();\n            //     f.thumbNail = fl.thumbNail;\n            // });\n            // }, 0);\n        }\n\n    }\n\n    addIconOld(f) {\n        const idx = this.icons.length;\n        if(!f.file) return;\n        const t = this.__iconsjson.find(i => f.file.name == i.path);\n        f.tags = t ? Utils.tagify(t.tags) : [];\n\n        if(t) {\n            if(t.name !== '') f.name = t.name;\n        }\n        if(f.file.type === 'image/gif') {\n            this.createThumbnail(f.file).then(fl => {\n                f.thumbNail = fl.thumbNail;\n                this.icons.splice(idx, 0, f);\n                if(!this.icon) this.icon = f.thumbNail;\n            });\n        } else {\n            this.icons.splice(idx, 0, f);\n\n            if(!this.icon) {\n                if(this.forceThumbnail) {\n                    this.createThumbnail(f.file).then(fl => {\n                        f.thumbNail = fl.thumbNail;\n                        if(!this.icon) this.icon = f.thumbNail;\n                    });\n                } else {\n                    // if(!this.icon) this.icon = f.objectURL;\n                }\n            }\n            // this.addIconAtIndex(f, idx, f.objectURL);\n        }\n        // this.verifyIcon(f, idx);\n    }\n\n    removeIcon(f) {\n        if(f == 'all') {\n            this.icons.splice(0, this.icons.length);\n        } else {\n            const index = this.icons.indexOf(f);\n            console.log('ESDIconPack::removeIcon...', index, f.fileName || f.name, f);\n\n            if(index > -1) {\n                this.icons.splice(index, 1);\n            }\n        }\n    }\n\n    compile() {\n        const data = {\n            manifest: this.manifest.toJSON(),\n            icons: this.createIconList()\n        };\n        console.log('ESDIconPack', data);\n        return data;\n    }\n    // createAllThumbnails() {\n    //     this.icons.forEach(icn => {\n    //         const f = this.getFileObj(icn);\n    //         if(!f.thumbNail) {\n    //             this.createThumbnail(f);\n    //         }\n    //     });\n    // }\n    \n    createThumbnail(f) {\n        const l = new ESDImageScaler();\n        return l.loadImage(f).then(dataUrl => {\n            // console.log('createThumbnail:', f);\n            f.thumbNail = dataUrl;\n            return f;\n        });\n    }\n    createIconList() {\n        return this.icons.map(f => {\n            const fileNameWithLowerCaseExtension = Utils.getFilenameWithLowerCaseExtension(f.file.name);\n            return {\n                path: fileNameWithLowerCaseExtension,\n                name: f.name,\n                tags: Utils.tagify(f.tags)\n            };\n        });\n    }\n   \n    readFromFileObject(f) {\n        // return readFileP(f).then(inData => {\n        return Utils.fetchFile(f, 'text').then(inData => {\n            let data = Utils.parseJson(inData, (catchedErr) => {console.log('Error parsing data', catchedErr, inData);}) || {};\n            console.log('ICONPACK DATA:', data, Array.isArray(data));\n            if(Array.isArray(data)) {\n                data.map(icn => this.addIcon(icn));\n            }\n            // Object.assign(this, data);\n        });\n    }\n\n\n    getFileObj(f) {\n        if(f instanceof File) {\n            return f;\n        } else if(f.file && f.file instanceof File) {\n            return f.file;\n        } else if(f.fileObject && f.fileObject instanceof File) {\n            return f.fileObject;\n        }\n    }\n\n\n    /**\n     * Verfiy icons\n     */\n\n    addStatus(icn, prop, value) {\n        // eslint-disable-next-line\n        if(!icn._status.hasOwnProperty('tips')) {icn._status.tips = {};};\n        icn._status.tips[prop] = value;\n    }\n\n    verifyAllIcons() {\n        this.icons.map(this.verifyIcon);\n    }\n\n    sortIcons(sortField) {\n        if(['fileName', 'name', 'fullPath'].includes(sortField)) {\n\n            const asc = (a, b) => [a[sortField].localeCompare(b[sortField])];\n            const desc = (a, b) => [b[sortField].localeCompare(a[sortField])];\n\n            let sortFn = asc;\n\n            if(this.__sortState == sortField) {\n                sortFn = desc;\n                this.__sortState = '';\n            } else {\n                this.__sortState = sortField;\n            }\n\n            this.icons.sort((a, b) => {\n                return sortFn(a, b);\n            });\n        }\n    }\n    \n    checkIcons() {\n        const arr = [...this.icons];\n        this.processThreaded(arr, this.verifyIcon);\n    }\n\n    verifyIcon(icn, i) {\n        if(icn) {\n            if(icn.file && !icn.objectURL) {\n                console.log('verifyIcon.. creating objectURL', icn, i);\n                icn.objectURL = URL.createObjectURL(icn.file);\n            }\n            if(!icn._status) icn._status = {};\n            icn._status['name'] = icn.name != '' ? 'isOK' : 'isError';\n\n            if(icn.objectURL) {\n                Utils.loadImageData(icn.objectURL, (img) => {\n                    icn.imageinfo = `w:${img.naturalWidth} h:${img.naturalHeight} (${Math.floor(icn.file.size / 1024)} kb)`; // add icon info file.size | kb }} kb\n                    icn._status['imageinfo'] =\n                        img.naturalWidth % MRequiredSizeFactor === 0 &&\n                        img.naturalHeight % MRequiredSizeFactor === 0;\n                    icn.checked = true;\n                    if(\n                        img.naturalWidth % MRequiredSizeFactor !== 0 ||\n                        img.naturalHeight % MRequiredSizeFactor !== 0\n                    ) {\n                        icn.alt =\n                            'To avoid scaling or blurred edges, image width or height should be a multiple of 36';\n                        this.addStatus(icn, 'imageinfo', icn.alt);\n                    }\n                });\n            }\n        }\n    }\n    \n exportIconPack() {\n\n    this.emit('message', {message: 'Preparing icon pack...', loading: true, });\n\n    const streamDeckIconPackExtension = 'streamDeckIconPack';  // 'zip'\n    const suffixMap = {'svg+xml': 'svg'};\n    const zip = new JSZip();\n\n    const iconPackBundleID = this.uid;\n    const iconPackBundleName = `${iconPackBundleID}.sdIconPack`;\n\n    const baseFolder = zip.folder(iconPackBundleName);  // create base folder containing the GUID with extension 'sdProfile'\n    const iconsFolder = zip.folder(iconPackBundleName + '/icons');\n    const previewsFolder = zip.folder(iconPackBundleName + '/previews');\n\n    const icons = this.createIconList();\n    baseFolder.file('icons.json', JSON.stringify(icons, null, 4)); // create icons.json\n\n    const isDataUrlMatches = this.__iconAsDataURL.match(/^data:image\\/(png|jpg|tiff|jpeg|svg\\+xml);base64,/);\n\n    let iconName = 'icon.png';\n    let fd;\n\n    if(isDataUrlMatches) {\n        iconName = `icon.${suffixMap[isDataUrlMatches[1]] || isDataUrlMatches[1]}`;\n        fd = this.__iconAsDataURL.replace(/^data:image\\/(png|jpg|tiff|jpeg|svg\\+xml);base64,/, '');  //+++andy unify regex\n    } else {\n        fd = this.icon.replace(/^data:image\\/(png|jpg|tiff|jpeg|svg\\+xml);base64,/, '');\n    }\n\n    baseFolder.file(iconName, fd, {base64: true});\n    this.manifest.Icon = iconName;\n\n    baseFolder.file('manifest.json', this.manifest.toString());   // create manifest.json\n    baseFolder.file('license.txt', this.manifest.license);\n\n    // (async () => {\n    const thumbP = [];\n\n    const allP = this.icons.map(f => {\n        // const isGif = f.file ? f.file.type === 'image/gif' : f.suffix == 'gif';\n        const isGif = f.suffix == 'gif' ? true : f.file ? f.file.type === 'image/gif' : f.fileName.endsWith('gif');\n        const fileNameWithLowerCaseExtension = Utils.getFilenameWithLowerCaseExtension(f.file.name);\n        if(isGif) {\n            if(f.thumbNail) {\n                thumbP.push(f);\n            } else if(f.zip && f.zip.thumbNail) {\n                // console.log(\"adding zipped entry\", fileNameWithLowerCaseExtension);\n                return f.zip.thumbNail.async(\"uint8array\").then(function(data) {\n                    return iconsFolder.file(fileNameWithLowerCaseExtension, data, {binary: true});\n                });\n            }\n        }\n        if(f.zip && f.zip.zippedFile) {\n            // console.log(\"adding FILE entry\", fileNameWithLowerCaseExtension);\n            return f.zip.zippedFile.async(\"uint8array\").then(function(data) {\n                return iconsFolder.file(fileNameWithLowerCaseExtension, data, {binary: true});\n            });\n        }\n        return Utils.fetchFile(f.file, 'arraybuffer').then(function(data) {\n            return iconsFolder.file(fileNameWithLowerCaseExtension, data, {binary: true});\n        });\n    });\n\n    if(thumbP.length) {\n        this.emit({message: 'Converting thumbNails...'});\n    }\n\n    // convert from dataUrl to base64 by stripping the dataUrl header\n     Object.values(thumbP).map(f => {\n        \n\n        if(f.thumbNail && (f.thumbNail.file instanceof File)) {\n            allP.push(Utils.fetchFile(f.thumbNail.file, 'arraybuffer').then(function(data) {\n                const thumbnailNameWithLowerCaseExtension = Utils.getFilenameWithLowerCaseExtension(f.thumbNail.file.name);\n                return iconsFolder.file(thumbnailNameWithLowerCaseExtension, data, {binary: true});\n            }));\n        } else if(f.zip && f.zip.thumbNail) {\n            const name = f.zip.thumbNail.name.split('/').pop();\n            allP.push(f.zip.thumbNail.async(\"uint8array\").then(data => {\n                return iconsFolder.file(name, data, {binary: true});\n            }));\n        } else {\n            const fileNameWithLowerCaseExtension = Utils.getFilenameWithLowerCaseExtension(f.file.name);\n            const fd = f.thumbNail.replace(/^data:image\\/(png|jpg|tiff|jpeg|svg+xml);base64,/, '');\n            allP.push(iconsFolder.file(fileNameWithLowerCaseExtension.replace('.gif', '.png'), fd, {base64: true}));\n        }\n    });\n    \n     const cleanedPreviews = this.cleanPreviewsFromPlaceholders(this.previews);\n\n     if(cleanedPreviews.length) {\n         this.emit('message', {message: 'Adding preview images...'});\n         \n           allP.push(...cleanedPreviews.map(f => {\n               if(f.zip && f.zip.zippedFile) {\n                   const name = f.zip.zippedFile.name.split('/').pop();\n                   return f.zip.zippedFile.async(\"uint8array\").then(data => {\n                         return previewsFolder.file(name, data, {binary: true});\n                     });\n                 }\n                 return Utils.fetchFile(f.file, 'arraybuffer').then(function(data) {\n                     return previewsFolder.file(f.file.name, data, {binary: true});\n                 });\n             }));\n         \n         \n     }\n\n     Promise.all(allP).then(data => {\n         console.log(\"generating zip\", data);\n         this.emit('message', {message: 'Generating icon pack...'});\n         zip.generateAsync({type: 'blob'}).then((content) => {\n            this.emit('message', {message: '', loading: false});\n             saveAs(content, `${iconPackBundleID}.${streamDeckIconPackExtension}`);\n        });\n    });\n    // })();\n}\n\n  processThreaded(arr, _cb) {\n      console.log(\"processThreaded\", arr ? arr.length : 0);\n        var ms = 200;\n        setTimeout(() => {\n            const curIcon = arr.shift();\n            console.log('Array length ', arr.length);\n            if(_cb) _cb(curIcon);\n            if(arr.length) {\n                this.processThreaded(arr, _cb);\n            }\n        }, ms);\n    }\n\n    // loadThreaded() {\n    //     var ms = 5;\n    //     var timerId = setTimeout(() => {\n    //         const curIcon = this.__iconsToAdd.shift();\n    //         console.log(curIcon.file.name, this.__iconsToAdd.length);\n    //         this.addIconThreaded(curIcon);\n    //         if(this.__iconsToAdd.length) {\n    //             this.loadThreaded(this.__iconsToAdd);\n    //         }\n    //     }, ms);\n    // }\n\n    // addIcon(f) {\n    //     if(!f.file) return;\n    //     this.__iconsToAdd.push(f);\n    //     this.loadThreaded();\n    // }\n    \n}\n","/* eslint-disable */\r\nimport JSZip from 'jszip';\r\nimport { dbgprintf } from \"./utils\";\r\n\r\nconst MAllowedFileTypes = [ \"png\", \"jpg\", \"jpeg\", \"svg\", \"gif\" ];\r\nconst isIconRegex = new RegExp(`^icon.*\\.(${Object.values(MAllowedFileTypes).join('|')})$`, 'gi');\r\nconst ignoreFilesRegex = /^(__|\\.)/i;\r\n\r\n/**\r\n     * Filters out invisible and other meta-files from a zip object based on a regular expression.\r\n     *\r\n     * @param {Object} zip - The zip object containing files.\r\n     * @param {Object.<string, Object>} zip.files - The files within the zip object.\r\n     * @returns {Array} - An array of visible files that do not match the ignoreFilesRegex.\r\n     */\r\nexport const removeIgnoredFiles = (zip) => {\r\n    return Object.values(zip.files).filter(e => (!ignoreFilesRegex.test(e.name) && !ignoreFilesRegex.test(e.name.split('/').pop())));\r\n};\r\n\r\nexport class ESDZippedIconPackParser {\r\n    file = null;\r\n    zip = null;\r\n    constructor (options) {\r\n        const jsZip = new JSZip();\r\n        const zipOptions = { createFolders: true };\r\n    }\r\n\r\n    get name() {\r\n        const firstEntry = zippedFiles.find(entry => entry.name);\r\n    }\r\n\r\n    async load(file) {\r\n        this.file = file;\r\n        this.zip = await jsZip.loadAsync(file, this.zipOptions);\r\n        // this.zip.files contains all the raw files\r\n        // strip invisible (and meta) files based on our regexFilter\r\n        this.zippedFiles = removeIgnoredFiles(this.zip);\r\n    }\r\n\r\n    // get contents() {\r\n    //     return jsZip.loadAsync(file, zipOptions).then(zip => {\r\n    //         return zip;\r\n    //     })\r\n    // }\r\n}\r\n\r\nexport function ValidateZippedIconPack(file, options = { stripInvisibles: true }) {\r\n    if(!file) return Promise.reject(file);\r\n    const sdIconPackFileName = file.name.replace('.streamDeckIconPack', '.sdIconPack');\r\n    const jsZip = new JSZip();\r\n    // const rxEndsWith = new RegExp(`(${Object.values(MAllowedFileTypes).join('|')})$`, 'gi');\r\n    // const rxEndsWith = new RegExp(/^icon.*\\.(png|jpg|jpeg|svg|gif)$/gi);\r\n\r\n    // const isIcon = new RegExp(`^icon.*\\.(${Object.values(MAllowedFileTypes).join('|')})$`, 'gi');\r\n    // const okString = 'exists \\u2714';\r\n\r\n    const checkGifHasComplementaryPng = (icon, entries) => {\r\n        const png = icon.name.replace(/\\.gif$/i, \".png\").toLowerCase();\r\n        const found = entries.find(f => f.name.toLowerCase().endsWith(png));\r\n        if(!found) {\r\n            dbgprintf(`Note: ${icon.name} is missing a complementary ${png} `);\r\n        }\r\n        return found;\r\n    };\r\n\r\n    /**\r\n     * Extracts the name of the icon pack from the given zipped files,\r\n     * where invisible and meta-files are already removed.\r\n     *\r\n     * @param {Array} zippedFiles - An array of objects representing the files in the zipped icon pack.\r\n     * @param {string} zippedFiles[].name - The name of the file within the zipped icon pack.\r\n     * @returns {string} The name of the icon pack, or an empty string if no valid entry is found.\r\n     */\r\n    const getIconPackName = (zippedFiles) => {\r\n        const firstEntry = zippedFiles.find(entry => entry.name);\r\n        return (firstEntry && firstEntry.name) ? firstEntry.name.split('/')[ 0 ] : '';\r\n    };\r\n\r\n    return jsZip.loadAsync(file, { createFolders: true }).then(zip => {\r\n        // remove invisible files or directories (or files starting with __ or . their filenames starting with __ or .)\r\n        const zippedFiles = removeIgnoredFiles(zip);\r\n\r\n        // console.log('+++ zippedFiles', { file, zippedFiles, files: zip.files });\r\n        if(!zippedFiles.length) {\r\n            return Promise.reject(\"No files found in zip\");\r\n        }\r\n\r\n        const sdIconPackName = getIconPackName(zippedFiles);\r\n\r\n        if(!sdIconPackName.length) {\r\n            return Promise.reject(\"Zip entries unexpectedly missing 'name' property\");\r\n        }\r\n\r\n        dbgprintf(\"Validating streamDeckIconPack %s ...\", sdIconPackName);\r\n\r\n        if(sdIconPackName !== sdIconPackFileName) {\r\n            dbgprintf(\"Note: Filename mismatch: '%s' should be named '%s'\", sdIconPackFileName, sdIconPackName);\r\n        }\r\n\r\n        dbgprintf(\"Found %s entries ...\", zippedFiles.length);\r\n\r\n        const files = [ 'manifest.json', 'license.txt', 'icons.json', 'icons/', 'previews/' ].map(e => {\r\n            const result = zippedFiles.find(f => f.name == `${sdIconPackName}/${e}`);\r\n            dbgprintf(`'${e}' %s...`, result ? 'exists' : 'missing', !result);\r\n            return result;\r\n        }).filter(e => e);\r\n\r\n        const icon = zippedFiles.find(f => isIconRegex.test(f.name.split('/').pop()));\r\n        dbgprintf(`%s  `, icon ? `'${icon.name.split('/').pop()}' exists` : 'icon missing  ', !icon);\r\n\r\n        const filterZipFileByName = (name) => zippedFiles.filter(f => f.name.startsWith(name) && !f.dir);\r\n        // get all icon-files, \r\n        // zipped files always contain their full path inside the zip in their 'name' property\r\n        // (icons folder is excluded in filterZipFileByName already)\r\n        const icons = filterZipFileByName(`${sdIconPackName}/icons/`); //.filter(icon => icon.name !== `${sdIconPackName}/icons/`);\r\n        const previews = filterZipFileByName(`${sdIconPackName}/previews/`);\r\n        const orphanedGifs = icons.filter(f => f.name && f.name.toLowerCase().endsWith('.gif') && !checkGifHasComplementaryPng(f, icons));\r\n        \r\n        // console.log('loadAsync:Result:', { sdIconPackName, icon, files, icons, previews, orphanedGifs });\r\n        return { sdIconPackName, icon, files, icons, previews, orphanedGifs };\r\n    });\r\n}\r\n\r\n\r\n\r\n\r\nexport function ValidateZippedIconPack2(file, options = {stripInvisibles: true}) {\r\n    if(!file) return Promise.reject(file);\r\n    const sdIconPackFileName = file.name.replace('.streamDeckIconPack', '.sdIconPack');\r\n    const jsZip = new JSZip();\r\n    const zipOptions = {createFolders: true};\r\n    // const rxEndsWith = new RegExp(`(${Object.values(MAllowedFileTypes).join('|')})$`, 'gi');\r\n    // const rxEndsWith = new RegExp(/^icon.*\\.(png|jpg|jpeg|svg|gif)$/gi);\r\n\r\n    const isIcon = new RegExp(`^icon.*\\.(${Object.values(MAllowedFileTypes).join('|')})$`, 'gi');\r\n    // const okString = 'exists \\u2714';\r\n    const okString = 'exists1';\r\n\r\n    const checkGifHasComplementaryPng = (icon, entries) => {\r\n        // const png = icon.name.replace(\".gif\", \".png\");\r\n        const png = icon.name.replace(/\\.gif$/i, \".png\").toLowerCase();\r\n        // return entries.find(f => f.name.endsWith(png));;\r\n        const found = entries.find(f => f.name.toLowerCase().endsWith(png));\r\n        console.log('checkGif', icon.name, found, png);\r\n        if(!found) {\r\n            dbgprintf(`Note: ${icon.name} is missing a complementary ${png} `);\r\n        }\r\n        return found;\r\n    };\r\n\r\n    return jsZip.loadAsync(file, zipOptions).then(zip => {\r\n        // remove invisible files or directories (or files starting with __ or . their filenames starting with __ or .)\r\n        // const zipKeys = Object.keys(zip.files).filter(e => (!regexFilter.test(e) && !regexFilter.test(e.split('/').pop())));\r\n        const zipValues = Object.values(zip.files).filter(e => (!ignoreFilesRegex.test(e.name) && !ignoreFilesRegex.test(e.name.split('/').pop())));\r\n\r\n        // console.log('+++ zipValues', {file, zipKeys, zipValues, files:zip.files});\r\n        console.log('+++ zipValues', {file, zipValues, files:zip.files});\r\n        if(!zipValues.length) {\r\n            return Promise.reject(\"No files found in zip\");\r\n        }\r\n        \r\n        const firstEntry = zipValues[ 0 ];\r\n        if(!firstEntry || !firstEntry.name) {\r\n            return Promise.reject(\"Zip entries unexpectedly missing 'name' property\");\r\n        }\r\n\r\n        const sdIconPackName = firstEntry.name.split('/')[ 0 ];\r\n\r\n        dbgprintf(\"Validating streamDeckIconPack %s ...\", sdIconPackName);\r\n\r\n        if(sdIconPackName !== sdIconPackFileName) {\r\n            dbgprintf(\"Note: Filename mismatch: '%s' should be named '%s'\", sdIconPackFileName, sdIconPackName);\r\n        }\r\n\r\n        const findZipFile = (name) => zipValues.find(f => f.name === name);\r\n        const filterZipFile = (name) => zipValues.filter(f => f.name.startsWith(name) && !f.dir);\r\n        \r\n        dbgprintf(\"Found %s entries ...\", zipValues.length);\r\n\r\n        const files = ['manifest.json', 'license.txt', 'icons.json', 'icons/', 'previews/'].map(e => {\r\n            const result = findZipFile(`${sdIconPackName}/${e}`);\r\n            // dbgprintf(`'${e}' %s...`, result ? 'exists' : 'missing', !result); \r\n            dbgprintf(`'${e}'  %s...`, result ? okString : 'missing', !result);\r\n            return result;\r\n        }).filter(e => e);\r\n\r\n        const icons = [ ...filterZipFile(`${sdIconPackName}/icons/`) ];\r\n        if(icons.length && icons[0].name == `${sdIconPackName}/icons/`) {\r\n            icons.shift();\r\n        }\r\n\r\n        const previews = [...filterZipFile(`${sdIconPackName}/previews/`)];\r\n\r\n        const arrGifs = icons.filter(f => f.name && f.name.toLowerCase().endsWith('gif'));\r\n        // let orphanedGifs = [];\r\n        // arrGifs.forEach(icon => {\r\n        //     if(!checkGif(icon, icons)) {\r\n        //         orphanedGifs.push(icon);\r\n        //     }\r\n        // });\r\n        const orphanedGifs = arrGifs.filter(icon => !checkGifHasComplementaryPng(icon, icons));\r\n\r\n        // const orphanedGifs = arrGifs.map(icon => icons.find(f => f.name.endsWith(icon.name.replace(\".gif\", \".png\"))));\r\n\r\n        const icon = zipValues.find(f => isIcon.test(f.name.split('/').pop()));\r\n        dbgprintf(`%s  `, icon ? `'${icon.name.split('/').pop()}' exists` : 'icon missing  ', !icon);\r\n\r\n        const license = findZipFile(`${sdIconPackName}/license.txt`);\r\n        dbgprintf(`'license.txt'  %s`, license ? okString : 'missing', !license);\r\n\r\n        return { sdIconPackName, icon, files, icons, previews, orphanedGifs };\r\n        \r\n        // return {sdIconPackName, icon, files, icons, previews, zipKeys, zipValues, orphanedGifs};\r\n    });\r\n}\r\n","// new ESDFileSelector({allowedFileTypes: ['.sdIconPack','.streamdeckIconPack' ],includeObjectUrl: false})\nimport Utils from './utils.js';\n\nexport class ESDFileSelectorXX {\n    constructor (inOptions = {}) {\n        // this.debug = inOptions && inOptions.debug;\n        this.debug = false;\n        const tag = inOptions.name || 'ESDFileSelectorXX';\n        const clr = Utils && Utils.colorFromString(tag) || 'ccee00';\n        this.dbg = this.debug ? console.log.bind(window.console, `%c[${tag}] `, `color: #${clr}`) : () => {};\n\n        this.options = {};\n        this.initOptions(inOptions);\n\n    }\n    \n    getFolders(entry) {\n         const flatten = (array) => array.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []);\n        return this.traverseDirectory(entry, true).then(fileEntries => {\n             return flatten(fileEntries);\n        })\n    }\n    getFolderContents(entry) {\n        const folderPromises = [];\n        const filePromises = [];\n        const dataTransferFiles = [];\n        folderPromises.push(this.traverseDirectory(entry, false));\n        if(folderPromises.length) {\n            const flatten = (array) => array.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []);\n            return Promise.all(folderPromises).then((fileEntries) => {\n                console.log(\"folderPromises\", fileEntries);\n                const flattenedEntries = flatten(fileEntries);\n                // collect async promises to convert each fileEntry into a File object (this is an async process)\n                flattenedEntries.forEach((fileEntry) => {\n                    fileEntry.hello = Date.now();\n                    filePromises.push(this.getFile(fileEntry));\n                });\n                return this.handleFilePromises(filePromises, dataTransferFiles);\n            });\n        } else if(filePromises.length) {\n            return this.handleFilePromises(filePromises, dataTransferFiles);\n        }\n    }\n\n    traverseDirectory(entry, bFolderMode = false, options) {\n        entry && this.dbg(\"traverseDirectory\", entry.name);\n        if(options) this.initOptions(options);\n        const self = this;\n\n        const reader = entry.createReader();\n        // Resolved when the entire directory is traversed\n        return new Promise((resolveDirectory) => {\n            const iterationAttempts = [];\n            const errorHandler = () => {};\n            function readEntries() {\n                // According to the FileSystem API spec, readEntries() must be called until\n                // it calls the callback with an empty array.\n                // Chrome returns the entries in 100 entry-batches!!!\n                reader.readEntries((batchEntries) => {\n                    if(!batchEntries.length) {\n                        // Done iterating this particular directory\n                        resolveDirectory(Promise.all(iterationAttempts));\n                    } else {\n                        // Add a list of promises for each directory entry.  If the entry is itself\n                        // a directory, then that promise won't resolve until it is fully traversed.\n                        let filteredEntries;\n\n                        if(bFolderMode) {\n\n                            filteredEntries = batchEntries.filter(e => e.isDirectory);\n\n                            iterationAttempts.push(\n                                Promise.all(\n                                    filteredEntries.map((batchEntry) => {\n                                        if(!self.isValidFile(batchEntry, bFolderMode)) {\n                                            return self.traverseDirectory(batchEntry, bFolderMode);\n                                        }\n                                        return Promise.resolve(batchEntry);\n                                    })\n                                )\n                            );\n                        } else {\n                            filteredEntries = batchEntries.filter((e) => self.isValidFile(e, false));\n                            iterationAttempts.push(\n                                Promise.all(\n                                    filteredEntries.map((batchEntry) => {\n                                        if(batchEntry.isDirectory) {\n                                            return self.traverseDirectory(batchEntry, false);\n                                        }\n                                        return Promise.resolve(batchEntry);\n                                    })\n                                )\n                            );\n                        }\n\n                        // Try calling readEntries() again for the same dir, according to spec\n                        readEntries();\n                    }\n                }, errorHandler);\n            }\n            // initial call to recursive entry reader function\n            readEntries();\n        });\n    }\n\n    packageFile(file, entry) {\n        let fileTypeOverride = '';\n        // handle some browsers sometimes missing mime types for dropped files\n        const hasExtension = file.name && file.name.lastIndexOf('.') !== -1;\n        if(hasExtension && !file.type) {\n            const fileExtension = (file.name || '').split('.').pop();\n            // fileTypeOverride = EXTENSION_TO_MIME_TYPE_MAP[fileExtension];\n            fileTypeOverride = this.options.mappedMimeTypes[fileExtension];\n        }\n\n        return {\n            // uuid: Utils.uuid(file.lastModified),\n            // fileUrl: URL.createObjectURL(file),\n            // new URL(URL.createObjectURL(new Blob(['']))).origin\n            objectURL: this.options.includeObjectUrl ? URL.createObjectURL(file) : null,\n            uid: `${file.name}-${file.lastModified}-${file.size}`,\n            file,\n            fullPath: entry ? this.copyString(entry.fullPath) : file.name,\n            name: file.name,\n            size: file.size,\n            type: file.type ? file.type : fileTypeOverride\n\n        };\n    }\n\n    getFile(entry) {\n\n        if(entry.isDirectory) {\n            return new Promise((resolve) => {\n                const x = this.packageFile(entry, entry);\n                console.log('getFile:folder:', entry, x);\n                // resolve(this.packageFile(entry, entry));\n                resolve(entry);\n            });\n        }\n\n        return new Promise((resolve) => {\n            entry.file((file) => {\n                resolve(this.packageFile(file, entry));\n            });\n        });\n    }\n\n    handleFilePromises(promises, arrFiles) {\n        return Promise.all(promises).then((files) => {\n            return this.addFilesToArray(files, arrFiles);\n        });\n    }\n\n    addFilesToArray(files, arrFiles) {\n        files.forEach((file) => {\n            if(!this.shouldIgnoreFile(file)) {\n                arrFiles.push(file);\n            }\n        });\n        return arrFiles;\n    }\n\n    getDataTransferFiles(dataTransfer, bFolderMode = false) {\n        // this.initOptions();\n        const dataTransferFiles = [];\n        const folderPromises = [];\n        const filePromises = [];\n\n        [].slice.call(dataTransfer.items).forEach((listItem) => {\n            // this.dbg(\"->getDataTransferFiles\", listItem, (typeof listItem.webkitGetAsEntry === 'function'));\n            if(typeof listItem.webkitGetAsEntry === 'function') {\n                const entry = listItem.webkitGetAsEntry();\n                if(entry) {\n                    if(entry.isDirectory) {\n                        if(this.isValidFile(entry, bFolderMode)) {\n                            folderPromises.push(entry);\n                        } else {\n                            folderPromises.push(this.traverseDirectory(entry, bFolderMode));\n                        }\n                    } else {\n                        if(this.isValidFile(entry, bFolderMode)) {\n                            filePromises.push(this.getFile(entry));\n                        }\n                    }\n                }\n            } else {\n                dataTransferFiles.push(listItem);\n            }\n        });\n        if(folderPromises.length) {\n\n            const flatten = (array) => array.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []);\n\n            return Promise.all(folderPromises).then((fileEntries) => {\n                const flattenedEntries = flatten(fileEntries);\n                // collect async promises to convert each fileEntry into a File object\n                flattenedEntries.forEach((fileEntry) => {\n                    filePromises.push(this.getFile(fileEntry));\n                });\n                // return this.handleFilePromises(filePromises, dataTransferFiles);\n                const hfp = this.handleFilePromises(filePromises, dataTransferFiles);\n                // console.log(\"FOLDERPROMISES:\", hfp);\n                return hfp;\n            });\n        } else if(filePromises.length) {\n            const hfp = this.handleFilePromises(filePromises, dataTransferFiles);\n            // console.log(\"FILEPROMISES:\", hfp);\n            return hfp;\n        }\n        return Promise.resolve(dataTransferFiles, folderPromises);\n    }\n    // isValidFile(file, checkDirectoryNames) {\n    isValidFile(file) {\n        // eslint-disable-next-line\n        // console.log(\"isValidFile\", file, checkDirectoryNames);\n        // return true;\n        /* eslint-disable-next-line */\n        if(!file.isDirectory) {\n            // return !/^(\\.)/gi.test(file.name);\n            this.rxStart.lastIndex = 0;\n            return !this.rxStart.test(file.name);\n       } \n        return true; //2021 test\n        // if(file.isDirectory && !checkDirectoryNames) return true;\n        // this.rxStart.lastIndex = 0; // const isValid = !/^__|^\\./.test( file.name );\n        // if(this.rxStart.test(file.name)) {\n        //     this.rxValid.lastIndex = 0;\n        //     return this.rxValid.test(file.name);\n        // }\n        // return false; //return isValid && new RegExp( `(${ Object.values( arr ).join( '|' ) })$`, 'gi' ).test( file.name );\n    }\n\n    shouldIgnoreFile(file) {\n        return this.options.ignoredFilenames.includes(file.name);\n    }\n\n    // Utils\n    copyString(aString) {\n        return `${aString}`.slice(1);\n    }\n    initOptions(inOptions = {}) {\n        const defaultOptions = {\n            allowAll: false,\n            allowedFileTypes: [\n                '.sdIconPack',\n                '.streamdeckIconPack'\n            ],\n            allowedFileTypesB: [\n                '.png',\n                '.jpg',\n                '.svg',\n                '.tif',\n                '.tiff',\n            ],\n            ignoredFilenames: [\n                '.DS_Store', // macOS Finder settings\n                'Thumbs.db' // Windows Explorer settings\n            ],\n            ignoreFilesStartingWith: [\n                '__', '\\\\.'\n            ],\n            includeObjectUrl: false,\n            mappedMimeTypes: {\n                avi: 'video/avi',\n                tiff: 'image/tiff',\n                gif: 'image/gif',\n                ico: 'image/x-icon',\n                jpeg: 'image/jpeg',\n                jpg: 'image/jpeg',\n                mkv: 'video/x-matroska',\n                mov: 'video/quicktime',\n                mp4: 'video/mp4',\n                pdf: 'application/pdf',\n                png: 'image/png',\n                zip: 'application/zip'\n            }\n        };\n        // console.log(\"+++++++++++++++++\", this);\n        this.options = Object.assign({}, defaultOptions, inOptions);\n        this.dbg(\"options\", this.options, this.options.includeObjectUrl);\n\n        this.rxStartsWith = (arr) => new RegExp(`^(${Object.values(arr).join('*|')})`, 'gi');\n        this.rxEndsWith = (arr) => new RegExp(`(${Object.values(arr).join('|')})$`, 'gi');\n        this.rxValid = this.rxEndsWith(this.options.allowedFileTypes);\n        this.rxStart = this.rxStartsWith(this.options.ignoreFilesStartingWith);\n        if(this.options.includeObjectUrl) {\n            // if file-system-access\n            // this.options.includeObjectUrl = new URL(URL.createObjectURL(new Blob(['']))).origin === 'null';\n\n            this.dbg(\"CHECK OBJECTURL\", new URL(URL.createObjectURL(new Blob(['']))).origin === 'null');\n        }\n    }\n    getDroppedOrSelectedFiles(event, bFolderMode = false) {\n        if(event.dataTransfer && event.dataTransfer.items) {\n            return this.getDataTransferFiles(event.dataTransfer, bFolderMode).then((fileList) => {\n                return Promise.resolve(fileList);\n            });\n        }\n        const files = [];\n        const dragDropFileList = event.dataTransfer && event.dataTransfer.files;\n        const inputFieldFileList = event.target && event.target.files;\n        const fileList = dragDropFileList || inputFieldFileList || [];\n        // convert the FileList to a simple array of File objects\n        for(let i = 0;i < fileList.length;i++) {\n            if(!this.shouldIgnoreFile(fileList[i])) {\n                files.push(this.packageFile(fileList[i]));\n            }\n        }\n        return Promise.resolve(files);\n    }\n\n}\n\n\n\n/**\n * This function should be called from both the onDrop event from your drag/drop\n * dropzone as well as from the HTML5 file selector input field onChange event\n * handler.  Pass the event object from the triggered event into this function.\n * Supports mix of files and folders dropped via drag/drop.\n *\n * Returns: an array of File objects, that includes all files within folders\n *   and subfolders of the dropped/selected items.\n */\n// eslint-disable-next-line\n// getDroppedOrSelectedFiles(event, bFolderMode = false) {\n//     if(event.dataTransfer && event.dataTransfer.items) {\n//         return this.getDataTransferFiles(event.dataTransfer, bFolderMode).then((fileList) => {\n//             return Promise.resolve(fileList);\n//         });\n//     }\n//     const files = [];\n//     const dragDropFileList = event.dataTransfer && event.dataTransfer.files;\n//     const inputFieldFileList = event.target && event.target.files;\n//     const fileList = dragDropFileList || inputFieldFileList || [];\n//     // convert the FileList to a simple array of File objects\n//     for(let i = 0;i < fileList.length;i++) {\n//         if(!this.shouldIgnoreFile(fileList[i])) {\n//             files.push(this.packageFile(fileList[i]));\n//         }\n//     }\n//     return Promise.resolve(files);\n// }\n\n/*\n\nlet iconVerifyTimer = null;\n\nverifyIconPack = (ip, startIndex = 0) => {\n    if(ip && ip.icons) {\n        let i = startIndex || 0;\n        if(i < ip.icons.length) {\n            if(iconVerifyTimer) iconVerifyTimer = null;\n            const l = ip.icons.length;\n            while(i < l && ip.icons[i].checked == true) {\n                i++;\n            }\n            iconVerifyTimer = setTimeout(() => {\n                verifyIcon(ip.icons[i], i);\n                verifyIcons(i + 1);\n                i++;\n            }, 10);\n        }\n    }\n};\n\nverifyIcon = (icn, i) => {\n    if(icn) {\n        if(icn.file && !icn.thumbnailUrl) {\n            icn.thumbnailUrl = URL.createObjectURL(icn.file);\n        }\n        icn._status['name'] = icn.name != \"\" ? 'isOK' : 'isError';\n\n        if(icn.thumbnailUrl) {\n            Utils.loadImageData(icn.thumbnailUrl, (img) => {\n                icn.imageinfo = `w:${img.naturalWidth} h:${img.naturalHeight}`; // add icon info\n                icn._status['imageinfo'] = (img.naturalWidth % MRequiredSizeFactor === 0) && (img.naturalHeight % MRequiredSizeFactor === 0);\n                icn.checked = true;\n                if((img.naturalWidth % MRequiredSizeFactor !== 0) || (img.naturalHeight % MRequiredSizeFactor !== 0)) {\n                    icn.alt = 'To avoid scaling or blurred edges, image width or height should be a multiple of 36';\n                    addStatus(icn, 'imageinfo', icn.alt);\n                }\n            });\n        }\n    }\n};\naddStatus = (icn, prop, value) => {\n    if(!icn._status.hasOwnProperty('tips')) {icn._status.tips = {};};\n    icn._status.tips[prop] = value;\n};\n\n*/\n\n/*\niconPack = {\n    manifest_json,  // containing an iconpacks meta information\n    icon_svg,  // representative icon shown in the store and Image Library\n    icons_json, // list of icons found in 'icons' folder\n    icons,  // folder containing the icons  (*can* have subfolders),\n    license_txt  // if provided\n};\n\nsdIconPack = {\n    manifest = {\n        \"Name\": \"Name of icon pack\",\n        \"Version\": \"1.0\",\n        \"Author\": \"Famous Icon Creator\",\n        \"URL\": \"https://www.elgato.com\",\n        \"Icon\": \"icon.svg\",\n        \"License\": \"license.txt\"\n    },\n\n    icons =[\n        {\n            \"path\": \"icon_1.svg\",  // path starts at the top-level of the 'icons-folder\n            \"name\": \"Empty icon\",\n            \"tags\": []\n        }\n    ]\n\n};\n\n*/\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"heading\"},[_vm._m(0),_c('div',{staticClass:\"navbar right\"},[_c('button',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.home),expression:\"home\"}],staticClass:\"buxtton\",on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.loadIconPack.apply(null, arguments)}}},[_vm._v(\"Open Icon Pack...\")]),_vm._l((_vm.documents),function(doc,i){return _c('a',{key:i,staticClass:\"xhelp button\",class:{ active: _vm.loaded == doc.doc },attrs:{\"href\":\"#\"},on:{\"click\":function($event){return _vm.loadComponentData(doc.doc)}}},[_vm._v(_vm._s(doc.name))])}),_c('button',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.home),expression:\"home\"}],staticClass:\"toolicon console-icon\",on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.toggleConsole.apply(null, arguments)}}},[_vm._v(\" \")]),_c('button',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.home),expression:\"home\"}],staticClass:\"toolicon menu-icon\",on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.toggleSidebar.apply(null, arguments)}}},[_vm._v(\" \")])],2)])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"heading-title\"},[_c('img',{attrs:{\"height\":\"32\",\"src\":\"data:image/svg+xml,%3Csvg width='544' height='72' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%235E6271' fill-rule='evenodd'%3E%3Cpath d='M135.803 58.2v-7.7h-7.694V27.4h7.694v-7.7H112.72v7.7h7.694v23.1h-7.694v7.7h23.082zm30.776-30.8v-7.7H151.19v7.7h15.388zM151.19 50.5V27.4h-7.694v23.1h7.694zm15.388 7.7v-7.7H151.19v7.7h15.388zm30.776-30.8v-7.7h-15.388v7.7h15.388zm-15.388 23.1V27.4h-7.694v23.1h7.694zm23.082 0V27.4h-7.694v23.1h7.694zm-7.694 7.7v-7.7h-15.388v7.7h15.388zm23.082 0V35.1h7.694v-7.7h-7.694v-7.7h-7.694v38.5h7.694zm23.082 0V19.7h-7.694v15.4h-7.694v7.7h7.694v15.4h7.694zm30.776-7.7v-7.7h-23.082v7.7h23.082zm15.388 7.7V42.8h7.694v-7.7h-7.694v-7.7h7.694v-7.7h-15.388v38.5h7.694zm15.388-23.1v-7.7h-7.694v7.7h7.694zm23.082-7.7v-7.7h-7.694v7.7h7.694zm-7.694 30.8V42.8h7.694v15.4h7.694V27.4h-7.694v7.7h-7.694v-7.7h-7.694v30.8h7.694zm46.164-30.8v-7.7h-15.388v7.7h15.388zm-15.388 23.1V27.4h-7.694v23.1h7.694zm15.388 7.7v-7.7h-15.388v7.7h15.388zm15.388 0V42.8h7.694v-7.7h-7.694V19.7h-7.694v38.5h7.694zM397.4 35.1V19.7h-7.694v15.4h7.694zm0 23.1V42.8h-7.694v15.4h7.694zm30.776-7.7v-7.7h-23.082v7.7h23.082zm15.388 7.7V35.1h7.694v-7.7h-7.694v-7.7h-7.694v38.5h7.694zm30.776 0V19.7h-7.694v7.7h-7.694v7.7h7.694v23.1h7.694zm-15.388-15.4v-7.7h-7.694v7.7h7.694zm38.47-15.4v-7.7h-7.694v7.7h7.694zm-7.694 30.8V42.8h7.694v15.4h7.694V27.4h-7.694v7.7h-7.694v-7.7h-7.694v30.8h7.694zm30.776 0V35.1h7.694v-7.7h-7.694v-7.7h-7.694v38.5h7.694zm23.082 0V19.7h-7.694v15.4h-7.694v7.7h7.694v15.4h7.694z' fill-rule='nonzero'/%3E%3Cpath d='M37.214 0c10.53 0 20.04 4.231 26.81 11.032l2.124-2.067L95 37.053 66.148 65.14l-3.21-3.125C56.254 68.2 47.192 72 37.213 72 16.661 72 0 55.882 0 36S16.661 0 37.214 0zm0 7.164c-16.542 0-29.953 12.99-29.953 29.015s13.41 29.015 29.953 29.015c8.037 0 15.334-3.066 20.713-8.056L37.296 37.053 58.828 16.09c-5.451-5.502-13.12-8.927-21.614-8.927z'/%3E%3C/g%3E%3C/svg%3E\"}})])\n}]\n\nexport { render, staticRenderFns }","<template>\n    <div class=\"heading\">\n        <div class=\"heading-title\">\n            <img height=\"32\" src=\"data:image/svg+xml,%3Csvg width='544' height='72' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%235E6271' fill-rule='evenodd'%3E%3Cpath d='M135.803 58.2v-7.7h-7.694V27.4h7.694v-7.7H112.72v7.7h7.694v23.1h-7.694v7.7h23.082zm30.776-30.8v-7.7H151.19v7.7h15.388zM151.19 50.5V27.4h-7.694v23.1h7.694zm15.388 7.7v-7.7H151.19v7.7h15.388zm30.776-30.8v-7.7h-15.388v7.7h15.388zm-15.388 23.1V27.4h-7.694v23.1h7.694zm23.082 0V27.4h-7.694v23.1h7.694zm-7.694 7.7v-7.7h-15.388v7.7h15.388zm23.082 0V35.1h7.694v-7.7h-7.694v-7.7h-7.694v38.5h7.694zm23.082 0V19.7h-7.694v15.4h-7.694v7.7h7.694v15.4h7.694zm30.776-7.7v-7.7h-23.082v7.7h23.082zm15.388 7.7V42.8h7.694v-7.7h-7.694v-7.7h7.694v-7.7h-15.388v38.5h7.694zm15.388-23.1v-7.7h-7.694v7.7h7.694zm23.082-7.7v-7.7h-7.694v7.7h7.694zm-7.694 30.8V42.8h7.694v15.4h7.694V27.4h-7.694v7.7h-7.694v-7.7h-7.694v30.8h7.694zm46.164-30.8v-7.7h-15.388v7.7h15.388zm-15.388 23.1V27.4h-7.694v23.1h7.694zm15.388 7.7v-7.7h-15.388v7.7h15.388zm15.388 0V42.8h7.694v-7.7h-7.694V19.7h-7.694v38.5h7.694zM397.4 35.1V19.7h-7.694v15.4h7.694zm0 23.1V42.8h-7.694v15.4h7.694zm30.776-7.7v-7.7h-23.082v7.7h23.082zm15.388 7.7V35.1h7.694v-7.7h-7.694v-7.7h-7.694v38.5h7.694zm30.776 0V19.7h-7.694v7.7h-7.694v7.7h7.694v23.1h7.694zm-15.388-15.4v-7.7h-7.694v7.7h7.694zm38.47-15.4v-7.7h-7.694v7.7h7.694zm-7.694 30.8V42.8h7.694v15.4h7.694V27.4h-7.694v7.7h-7.694v-7.7h-7.694v30.8h7.694zm30.776 0V35.1h7.694v-7.7h-7.694v-7.7h-7.694v38.5h7.694zm23.082 0V19.7h-7.694v15.4h-7.694v7.7h7.694v15.4h7.694z' fill-rule='nonzero'/%3E%3Cpath d='M37.214 0c10.53 0 20.04 4.231 26.81 11.032l2.124-2.067L95 37.053 66.148 65.14l-3.21-3.125C56.254 68.2 47.192 72 37.213 72 16.661 72 0 55.882 0 36S16.661 0 37.214 0zm0 7.164c-16.542 0-29.953 12.99-29.953 29.015s13.41 29.015 29.953 29.015c8.037 0 15.334-3.066 20.713-8.056L37.296 37.053 58.828 16.09c-5.451-5.502-13.12-8.927-21.614-8.927z'/%3E%3C/g%3E%3C/svg%3E\" />\n            <!-- IconPack Man -->\n        </div>\n        <!-- <div class=\"subheading\">Check your Icon-Packs {{ version }}</div> -->\n        <!-- <span class=\"subheading\"> {{ version }}</span> -->\n\n        <div class=\"navbar right\">\n            <button v-show=\"home\" class=\"buxtton\" @click.stop.prevent=\"loadIconPack\">Open Icon Pack...</button>\n            <a v-for=\"(doc,i) in documents\" :key=\"i\" href=\"#\" :class=\"{ active: loaded == doc.doc }\" class=\"xhelp button\" @click=\"loadComponentData(doc.doc)\">{{ doc.name }}</a>\n            <button v-show=\"home\" class=\"toolicon console-icon\" @click.stop.prevent=\"toggleConsole\">&nbsp;</button>\n            <button v-show=\"home\" class=\"toolicon menu-icon\" @click.stop.prevent=\"toggleSidebar\">&nbsp;</button>\n        </div>\n    </div>\n</template>\n\n<script>\n// const ipmSVG = \"data:image/svg+xml,%3Csvg width='144' height='144' xmlns='http://www.w3.org/2000/svg'%3E%3Cg opacity='1'%3E%3Cpath opacity='0' fill='%2300f' d='M0 0h144v144H0z'/%3E%3Cpath fill='%235e6271' d='M57.42 13c10.364 0 20.168 3.086 28.572 8.978a51.59 51.59 0 018.132 6.961l3.472-3.425 39.734 39.205-39.734 39.206-4.602-4.542a49.887 49.887 0 01-3.08 2.834C80.95 109.792 69.183 114 57.42 114c-13.445 0-26.05-5.33-35.574-14.87C12.322 89.593 7 76.968 7 63.5c0-13.467 5.322-26.092 14.846-35.63C31.37 18.33 43.975 13 57.42 13zm.28 9.82a40.08 40.08 0 00-26.033 9.542C22.417 39.695 16.5 50.919 16.5 63.5c0 20.611 15.882 37.582 36.288 39.763 1.612.215 3.25.335 4.912.356 8.684 0 16.807-2.805 23.81-7.855a40.876 40.876 0 004.17-3.596L57.863 64.719l29.356-28.965C79.801 27.644 69.194 22.82 57.7 22.82zM15.106 134v-2.4h-2.368v-7.2h2.368V122H8v2.4h2.369v7.2H8v2.4h7.106zm9.476-9.6V122h-4.738v2.4h4.738zm-4.738 7.2v-7.2h-2.369v7.2h2.37zm4.738 2.4v-2.4h-4.738v2.4h4.738zm9.475-9.6V122h-4.738v2.4h4.738zm-4.738 7.2v-7.2h-2.368v7.2h2.368zm7.107 0v-7.2h-2.369v7.2h2.369zm-2.369 2.4v-2.4h-4.738v2.4h4.738zm7.106 0v-7.2h2.37v-2.4h-2.37V122h-2.368v12h2.368zm7.107 0v-12H45.9v4.8h-2.369v2.4h2.37v4.8h2.368zm6.648-4.644v-2.4h-4.28v2.4h4.28zM59.656 134v-4.8h2.369v-2.4h-2.37v-2.4h2.37V122h-4.738v12h2.369zm4.738-7.2v-2.4h-2.37v2.4h2.37zm7.106-2.4V122h-2.369v2.4H71.5zm-2.369 9.6v-4.8H71.5v4.8h2.369v-9.6H71.5v2.4h-2.369v-2.4h-2.369v9.6h2.37zm14.213-9.6V122h-4.738v2.4h4.738zm-4.738 7.2v-7.2h-2.368v7.2h2.368zm4.738 2.4v-2.4h-4.738v2.4h4.738zm4.738 0v-4.8h2.369v-2.4h-2.37V122h-2.368v12h2.369zm4.737-7.2V122h-2.368v4.8h2.368zm0 7.2v-4.8h-2.368v4.8h2.368zm6.649-4.644v-2.4h-4.28v2.4h4.28zm4.737 4.644v-7.2h2.37v-2.4h-2.37V122h-2.368v12h2.368zm9.476 0v-12h-2.37v2.4h-2.368v2.4h2.369v7.2h2.369zm-4.743-4.8v-2.4h-2.369v2.4h2.369zm11.85-4.8V122h-2.37v2.4h2.37zm-2.37 9.6v-4.8h2.37v4.8h2.368v-9.6h-2.369v2.4h-2.369v-2.4h-2.369v9.6h2.37zm9.476 0v-7.2h2.368v-2.4h-2.368V122h-2.37v12h2.37zm7.106 0v-12h-2.369v4.8h-2.369v2.4h2.37v4.8H135z' /%3E%3C/g%3E%3C/svg%3E\";\n\nexport default {\n    props: {\n        version: {\n            type: String,\n            default: '1.0.0'\n        },\n        loaded: {\n            type: String,\n            default: ''\n        },\n        home: {\n            type: Boolean,\n            default: true,\n        },\n        documents: {\n            type: Array,\n            default() {\n                return []\n          }\n        }\n    },\n    data: function () {\n        return {\n            // home: true, //document.location.pathname.includes('index.html'),\n        };\n    },\n    methods: {\n        loadIconPack(e) {\n            this.$emit('loadiconpack', e);\n        },\n        toggleSidebar(e) {\n            this.$emit('togglesidebar', e);\n        },\n        toggleConsole(e) {\n            this.$emit('toggleconsole', e);\n        },\n        loadComponentData(e) {\n            console.log(\"emitting. loadcomponentdata\",e);\n            this.$emit('loadcomponentdata', e);\n        },\n    },\n};\n</script>\n\n<style>\n.active {\n    background-color: green;\n}\n.tags:not(tbody .tags),\n.heading {\n    display: flex;\n    flex-flow: wrap;\n    margin: 16px 16px;\n    background: transparent;\n    height: 22px;\n    padding-left: 16px;\n    padding-right: 16px;\n    z-index: 1000;\n}\n.heading-title {\n    font-size: 1.5em;\n    font-weight: 600;\n    margin-bottom: 8px;\n}\n\n.heading-smalltitle {\n    font-weight: 600;\n}\n.subheading {\n    font-size: 0.5em;\n    font-weight: 300;\n}\n@media (max-width: 800px) {\n    .heading, .tags:not(tbody .tags), .heading {\n        height: 64px;\n    }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./head-component.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./head-component.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./head-component.vue?vue&type=template&id=e1e543b0\"\nimport script from \"./head-component.vue?vue&type=script&lang=js\"\nexport * from \"./head-component.vue?vue&type=script&lang=js\"\nimport style0 from \"./head-component.vue?vue&type=style&index=0&id=e1e543b0&prod&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.sheetopen)?_c('div',{ref:\"sheet\",staticClass:\"dark\",attrs:{\"id\":\"commonsheet\",\"tabindex\":\"0\"},on:{\"click\":function($event){return _vm.loadComponentData(false)},\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"]))return null;return _vm.loadComponentData(false)}}},[_c('div',{ref:\"wrapper\",staticClass:\"editor-wrapper\",style:(_vm.sheetposition),on:{\"click\":function($event){$event.stopPropagation();}}},[_c(_vm.dynamiccomponent,{tag:\"component\",attrs:{\"data\":_vm.dynamicdata},on:{\"changed\":_vm.resetScrollPosition}})],1)]):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <div v-if=\"sheetopen\" id=\"commonsheet\" ref=\"sheet\" class=\"dark\" tabindex=\"0\" @click=\"loadComponentData(false)\" @keyup.esc=\"loadComponentData(false)\">\n        <div ref=\"wrapper\" class=\"editor-wrapper\" :style=\"sheetposition\" @click.stop=\"\">\n            <component :is=\"dynamiccomponent\" :data=\"dynamicdata\" @changed=\"resetScrollPosition\" />\n        </div>\n    </div>\n</template>\n\n<script>\nexport default {\n    name: \"InfoComponent\",\n    props: {\n        sheetopen: {\n            type: Boolean\n        },\n        dark: {\n            type: Boolean\n        },\n        dynamiccomponent: {\n            type: Object,\n            default: null\n        },\n        dynamicdata: {\n            type: String,\n            default: ''\n        }\n    },\n    data: function() {\n        return {};\n    },\n    computed: {\n        sheetposition: function() {\n            const h = `height:${window.innerHeight - 160}px;`;\n            return this.sheetopen\n                ? `margin-top:48px;${h}`\n                : `margin-top:${window.innerHeight}px;${h}`;\n        }\n    },\n    updated() {\n        if (this.$refs.sheet) this.$refs.sheet.focus();\n    },\n   \n    methods: {\n        resetScrollPosition(evt) {\n            this.dbg(\"[info-component]::resetScrollPosition\", evt);\n        },\n        loadComponentData(tof) {\n            this.$emit('loadcomponentdata', tof);\n        },\n    },\n};\n</script>\n\n<style>\n\nul * {\n    font-size: inherit;\n}\n\n#commonsheet {\n    display: flex;\n    top: 0;\n    left: 0;\n    bottom: 0px;\n    right: 0px;\n    position: absolute;\n    background: rgba(0, 0, 0, 0.7);\n    font-family: 'Helvetica Neue', Arial, sans-serif;\n    color: #779;\n\n    line-height: 1.5;\n    margin: 0;\n    padding: 0;\n    font-size: 14px;\n    -webkit-text-size-adjust: 100%;\n    -webkit-font-smoothing: antialiased;\n    justify-content: center;\n    transition: all 0.3s linear;\n\n    overflow: scroll;\n    -webkit-overflow-scrolling: touch;\n    z-index: 900;\n}\n\n.commonsheet a {\n    font-size: inherit;\n}\n\n.editor-wrapper {\n    display: flex;\n    justify-content: center;\n    width: 80%;\n    background: #efefef;\n    box-shadow: 0px 2px 20px 12px rgba(0, 0, 0, 0.8);\n    border: 1px solid #333;\n    overflow: scroll;\n    -webkit-overflow-scrolling: touch;\n    margin: 20px;\n    margin-top: 1000px;\n    /* transition: all 0.3s linear; */\n    transition: opacity 1s linear;\n}\n\n#editor {\n    width: 60%;\n    overflow: scroll;\n}\n\n.inner {\n    padding: 20px;\n    width: 92%;\n    height: auto;\n}\n\n/* .inner p:last-child::after {\n    content: ' ';\n    height: 120px;\n    display: block;\n} */\n\n.inner::after {\n    content: ' ';\n    height: 60px;\n    display: block;\n}\n\n\n.inner p > img {\n    max-width: 60%;\n    margin: 20%;\n    margin-top: 0;\n    margin-bottom: 0;\n}\n\n#editor div {\n    /* display: inline-block; */\n    vertical-align: top;\n    box-sizing: border-box;\n    padding: 0 20px;\n}\n\n\nul * {\n    list-style: none;\n}\n\ncode {\n    font-family: 'Lucida Console', 'Monaco', monospace;\n    color: #99a;\n    font-size: 14px;\n    line-height: 15px;\n}\n\ntd code {\n    font-family: inherit;\n    font-size: inherit;\n}\n\n/* img,\n.editor img {\n    max-width: 100%;\n    margin: 0 auto;\n    margin: 25px 0;\n} */\n\ntable,\n.table {\n    display: table;\n    border-collapse: separate;\n    -webkit-border-horizontal-spacing: 2px;\n    -webkit-border-vertical-spacing: 2px;\n    /* border-top-color: gray; */\n    /* background: transparent; */\n}\n\ntable tr,\n.table tr,\ntable th,\n.table th,\ntable td,\n.table td {\n    border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n}\n\nthead,\ntable thead {\n    border-bottom: 1px solid blue;\n}\n\na {\n    color: #aac;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5 {\n    border: none;\n    /* color: #333333; */\n    color: rgba(255,255,255,.3);\n    font-weight: 600;\n}\n\nb,\ni,\nstrong {\n    color: #000033;\n}\n\nh1 {\n    font-size: 30px;\n    line-height: 36px;\n    margin: 20px 0 30px !important;\n}\n\nh2 {\n    font-size: 26px;\n    line-height: 32px;\n    margin: 14px 0 26px !important;\n}\n\n#commonsheet.dark,\n.dark #commonsheet {\n    color: #d8d8d8;\n}\n\n.dark .editor-wrapper {\n    background: #1a1a1a;\n}\n\n.dark textarea {\n    background-color: #666666;\n}\n\n.dark h1,\n.dark h2,\n.dark h3,\n.dark h4,\n.dark h5 {\n    border: none;\n    color: #eae7e1;\n    font-weight: 600;\n}\n\n.dark b,\n.dark i,\n.dark strong {\n    color: #c7c7c7;\n}\n\n.micro {\n    max-width: 20px;\n    margin: 1px;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./info-component.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./info-component.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./info-component.vue?vue&type=template&id=2f3de767\"\nimport script from \"./info-component.vue?vue&type=script&lang=js\"\nexport * from \"./info-component.vue?vue&type=script&lang=js\"\nimport style0 from \"./info-component.vue?vue&type=style&index=0&id=2f3de767&prod&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{directives:[{name:\"esddrop\",rawName:\"v-esddrop\",value:({ fn: _vm.$root.handleDropFromComponent, args: { name: _vm.name } }),expression:\"{ fn: $root.handleDropFromComponent, args: { name } }\"}],staticClass:\"CenteredContainer\"},[_c('h3',[_vm._v(_vm._s(_vm.name))]),_c('div',{staticClass:\"CardDropArea InfoBoard\"},[_c('table',{staticClass:\"table table-hover InfoBoardEx InfoBoard\",attrs:{\"id\":\"json-object\",\"width\":\"100%\"}},[(_vm.tableheadings)?_c('thead',{staticClass:\"thead-dark\"},[_vm._m(0)]):_vm._e(),_c('tbody',[_vm._l((_vm.rowsMap),function(v,k,i){return [(_vm.isVisible(k, v))?_c('tr',{key:i},[_c('td',{staticClass:\"key\"},[_c('span',{staticClass:\"key eye\",class:{ kc_icons: _vm.mappingForKey(k, 'type') == 'password' },on:{\"click\":_vm.togglePassword}}),_vm._v(\" \"+_vm._s(k.startsWith('_') ? k.substring(1) : k)+\" \")]),_c('td',[((_vm.mappingForKey(k, 'type'))==='checkbox'&&(_vm.mappingForKey(k, 'nodetype', 'input') === 'input'))?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.rows[k]),expression:\"rows[k]\"}],ref:\"passwordfield\",refInFor:true,attrs:{\"data-type\":_vm.mappingForKey(k, 'type'),\"disabled\":_vm.isDisabled(k),\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.rows[k])?_vm._i(_vm.rows[k],null)>-1:(_vm.rows[k])},on:{\"change\":function($event){var $$a=_vm.rows[k],$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.rows, k, $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.rows, k, $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.rows, k, $$c)}}}}):((_vm.mappingForKey(k, 'type'))==='radio'&&(_vm.mappingForKey(k, 'nodetype', 'input') === 'input'))?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.rows[k]),expression:\"rows[k]\"}],ref:\"passwordfield\",refInFor:true,attrs:{\"data-type\":_vm.mappingForKey(k, 'type'),\"disabled\":_vm.isDisabled(k),\"type\":\"radio\"},domProps:{\"checked\":_vm._q(_vm.rows[k],null)},on:{\"change\":function($event){return _vm.$set(_vm.rows, k, null)}}}):(_vm.mappingForKey(k, 'nodetype', 'input') === 'input')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.rows[k]),expression:\"rows[k]\"}],ref:\"passwordfield\",refInFor:true,attrs:{\"data-type\":_vm.mappingForKey(k, 'type'),\"disabled\":_vm.isDisabled(k),\"type\":_vm.mappingForKey(k, 'type')},domProps:{\"value\":(_vm.rows[k])},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.rows, k, $event.target.value)}}}):_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.rows[k]),expression:\"rows[k]\"}],attrs:{\"rows\":\"4\",\"cols\":\"50\",\"type\":\"textarea\"},domProps:{\"value\":(_vm.rows[k])},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.rows, k, $event.target.value)}}})])]):_vm._e()]})],2)]),_c('div',{staticClass:\"stats\"})])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('tr',[_c('th',{staticClass:\"key\"},[_vm._v(\"Key\")]),_c('th',{staticClass:\"value\"},[_vm._v(\"Value\")])])\n}]\n\nexport { render, staticRenderFns }","<template>\n    <div v-esddrop=\"{ fn: $root.handleDropFromComponent, args: { name } }\" class=\"CenteredContainer\">\n        <!-- <div class=\"CenteredContainer\" v-esddrop=\"{ fn: dropObj.fn, args: { name: dropObj.name } }\"> -->\n        <h3>{{ name }}</h3>\n        <div class=\"CardDropArea InfoBoard\">\n            <table id=\"json-object\" class=\"table table-hover InfoBoardEx InfoBoard\" width=\"100%\">\n                <thead v-if=\"tableheadings\" class=\"thead-dark\">\n                    <tr>\n                        <th class=\"key\">Key</th>\n                        <th class=\"value\">Value</th>\n                    </tr>\n                </thead>\n                <tbody>\n                    <template v-for=\"(v, k, i) in rowsMap\">\n                        <tr v-if=\"isVisible(k, v)\" :key=\"i\">\n                            <td class=\"key\">\n                                <span class=\"key eye\" :class=\"{ kc_icons: mappingForKey(k, 'type') == 'password' }\" @click=\"togglePassword\"></span>\n                                {{ k.startsWith('_') ? k.substring(1) : k }}\n                            </td>\n                            <td>\n                                <input\n                                    v-if=\"mappingForKey(k, 'nodetype', 'input') === 'input'\"\n                                    ref=\"passwordfield\"\n                                    v-model=\"rows[k]\"\n                                    :data-type=\"mappingForKey(k, 'type')\"\n                                    :type=\"mappingForKey(k, 'type')\"\n                                    :disabled=\"isDisabled(k)\"\n                                />\n                                <textarea v-else v-model=\"rows[k]\" rows=\"4\" cols=\"50\" type=\"textarea\"></textarea>\n                            </td>\n                        </tr>\n                    </template>\n                </tbody>\n            </table>\n            <div class=\"stats\">\n                <!-- <template v-for=\"(v, k, i) in stats\">\n                    <div :key=\"i\">{{ v }}:{{ rows[v] }}</div>\n                </template> -->\n            </div>\n        </div>\n    </div>\n</template>\n\n<script>\n\n// function renameKeys(obj, newKeys) {\n//     const keyValues = Object.keys(obj).map((key) => {\n//         const newKey = newKeys[key] || key;\n//         return { [newKey]: obj[key] };\n//     });\n//     return Object.assign({}, ...keyValues);\n// }\n\nfunction renameObjectKeys(sourceObj, mapObj) {\n    if (!mapObj) return sourceObj;\n    const keyValues = Object.keys(sourceObj).map((key) => ({ [mapObj[key] || key]: sourceObj[key] }));\n    // const keyValues = Object.keys(sourceObj).map((key) => {\n    //     const o = mapObj[key] || key;\n    //     // if (typeof o === 'object' && o.name) return { [o.name]: sourceObj[key] }; // passed in types: {Name: {name: 'Hello'}}\n    //     if (typeof o === 'object') {\n    //         if (o.name) return { [o.name]: sourceObj[key] }; // passed in types: {Name: {name: 'Hello'}}\n    //         return { [key]: sourceObj[key] };\n    //     }\n    //     return { [mapObj[key] || key]: sourceObj[key] };\n    // });\n    return Object.assign({}, ...keyValues);\n}\n\nexport default {\n    name: 'JsonComponent',\n    props: {\n        name: {\n            type: String,\n            default: ''\n        },\n        rows: {\n            type: Object,\n            default() {\n                return {};\n            }\n        },\n        tableheadings: Boolean,\n        excludes: {\n            type: Array,\n            default() {return []},\n        },\n        namesmap: {\n            type: Object,\n            default() {return {}},\n        },\n        typesmap: {\n            type: Object,\n            default() {return {}},\n        },\n    },\n    computed: {\n        rowsMap() {\n            return renameObjectKeys(this.rows, this.namesmap);\n        },\n        stats() {\n            const stat = [];\n            for (let k in this.rows) {\n                if (this.excludes.includes(k.charAt(0))) {\n                    stat.push(k);\n                }\n            }\n            return stat;\n        },\n    },\n    methods: {\n        // logme(rows, k, v) {\n        //     console.log('logme', rows, k, rows[k], v);\n        // },\n        togglePassword() {\n            this.$refs.passwordfield.forEach((f) => {\n                if (f.getAttribute('data-type') == 'password') {\n                    f.type = f.type == 'password' ? 'text' : 'password';\n                }\n            });\n        },\n        mappingForKey(k, prop, defaultValue = 'text') {\n            const t = this.typesmap[k];\n            return t && t[prop] ? t[prop] : defaultValue;\n        },\n        isDisabled(k) {\n            return k.startsWith('_');\n        },\n        isVisible(k, v) {\n            if (k == '_Icon') return true;\n            const t = typeof v;\n            if (k == 'License' || ['function', 'object'].includes(t)) return false;\n            return this.excludes.some((e) => !k.startsWith(e));\n        },\n    },\n};\n</script>\n\n<style scoped>\n.yycontainer {\n    padding: 16px;\n    overflow-x: scroll;\n    width: 96%;\n    margin-top: 20px;\n    margin-bottom: 20px;\n}\ntd {\n    white-space: nowrap;\n    min-width: 80px;\n}\n\nth {\n    text-transform: uppercase;\n}\n\nth.key,\ntd.key {\n    text-align: right;\n    padding-right: 8px;\n}\n\nth.value {\n    text-align: left;\n    padding-left: 10px;\n}\n\ntd.key::after {\n    content: ' : ';\n}\n\n.fileName {\n    min-width: 280px;\n    max-width: 280px;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n/* td input {\n    width: 96%;\n} */\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./json-component.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./json-component.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./json-component.vue?vue&type=template&id=7e90d5a8&scoped=true\"\nimport script from \"./json-component.vue?vue&type=script&lang=js\"\nexport * from \"./json-component.vue?vue&type=script&lang=js\"\nimport style0 from \"./json-component.vue?vue&type=style&index=0&id=7e90d5a8&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7e90d5a8\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"allowDeselect sdpi-item-wrapper CenteredContainer\",on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();if($event.target !== $event.currentTarget)return null;return _vm.handleSelection($event, false)}}},[_c('h3',[_vm._v(\"Icons\")]),_c('section',[_c('div',{staticClass:\"wrap tools\"},[_c('div',{staticClass:\"tt\"},[_c('div',{staticClass:\"toolicon list-icon\",class:{ active: !_vm.iscard },on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.toggleListType.apply(null, arguments)}}}),_c('div',{staticClass:\"toolicon grid-icon\",class:{ active: _vm.iscard },on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.toggleListType.apply(null, arguments)}}})]),_c('div',{staticClass:\"tagarea\"},[_c('div',{staticClass:\"flexrow\"},[_c('span',[_vm._v(\"Tags:\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model.lazy\",value:(_vm.allTags),expression:\"allTags\",modifiers:{\"lazy\":true}}],attrs:{\"type\":\"text\",\"placeholder\":\"tag1,tag2,...!\"},domProps:{\"value\":(_vm.allTags)},on:{\"change\":function($event){_vm.allTags=$event.target.value}}}),_c('button',{attrs:{\"disabled\":_vm.allTags.length < 2},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.setAllProps('tags', _vm.allTags)}}},[_vm._v(\"Set all tags\")])])]),_c('div',{staticClass:\"tooltext\"},[_vm._v(\"# icons: \"+_vm._s(_vm.files.length))])]),(!_vm.iscard)?_c('header',{staticClass:\"xrow\",class:{ sdList: !_vm.iscard }},[_c('div',{staticClass:\"col mini\"},[_vm._v(\"Icon\")]),_c('div',{staticClass:\"col cursor-pointer\",class:{ sortedBy: _vm.isSortedBy('fileName') },on:{\"click\":function($event){return _vm.doSort('fileName', $event)}}},[_vm._v(\"Filename\")]),_c('div',{staticClass:\"col cursor-pointer\",class:{ sortedBy: _vm.isSortedBy('name') },on:{\"click\":function($event){return _vm.doSort('name', $event)}}},[_vm._v(\"Name\")]),_c('div',{staticClass:\"col\"},[_vm._v(\"Tags\")]),_c('div',{staticClass:\"col cursor-pointer fullpath\",class:{ sortedBy: _vm.isSortedBy('fullPath') },on:{\"click\":function($event){return _vm.doSort('fullPath', $event)}}},[_vm._v(\"Path\")]),_c('div',{staticClass:\"col remove remove-item-empty\"})]):_vm._e(),(_vm.shouldDraw)?_c('draggable',_vm._b({staticClass:\"list-groupA\",class:{ dragging: _vm.drag },attrs:{\"move\":_vm.onMoveCallback,\"updated\":_vm.updated,\"tag\":\"div\",\"value\":_vm.files,\"sort\":false,\"group\":\"files\",\"xxxhandle\":\".handle\",\"component-data\":_vm.getComponentData()},on:{\"start\":_vm.onStart,\"end\":_vm.onEnd,\"choose\":_vm.onChoose}},'draggable',_vm.dragOptions,false),[_c('transition-group',{staticClass:\"listType\",class:{ cardList: _vm.iscard, sdList: !_vm.iscard },attrs:{\"type\":\"transition\",\"name\":!_vm.drag ? 'xxflip-list' : null},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.handleSelection($event, false)}}},_vm._l((_vm.files),function(file,i){return _c('div',{key:i+0,staticClass:\"xrow\",class:{ card: _vm.iscard, selected: file.isSelected },on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.handleSelection($event, file, i)}}},[_c('div',{staticClass:\"col mini\"},[(file.objectURL)?_c('img',{staticClass:\"thumbnail\",attrs:{\"src\":file.objectURL,\"alt\":file.file.name || file.name,\"title\":file.file.name || file.name}}):_vm._e(),_c('img',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.hasThumbNail(file)),expression:\"hasThumbNail(file)\"}],staticClass:\"thumbnail\",attrs:{\"src\":_vm.getThumbNail(file),\"xrc\":\"file.file.thumbNail || file.thumbNail\",\"alt\":file.file.name || file.name,\"title\":file.file.name || file.name}})]),(_vm.iscard)?[_c('div',{class:{ columns: _vm.iscard, row: !_vm.iscard}},[_c('div',{staticClass:\"col\",attrs:{\"data-title\":\"Filename\"}},[_c('div',[_vm._v(\" \"+_vm._s(file.file.name || file.name)+\" \")])]),_c('div',{staticClass:\"col\",attrs:{\"data-title\":\"Name\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(file.name),expression:\"file.name\"}],staticClass:\"Name\",attrs:{\"type\":\"text\"},domProps:{\"value\":(file.name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(file, \"name\", $event.target.value)}}})]),_c('div',{staticClass:\"col\",attrs:{\"data-title\":\"Tags\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(file.tags),expression:\"file.tags\"}],staticClass:\"tax\",attrs:{\"type\":\"text\"},domProps:{\"value\":(file.tags)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(file, \"tags\", $event.target.value)}}})]),_c('div',{staticClass:\"col fullpath\",attrs:{\"data-title\":\"FullPath\"}},[_c('div',{staticClass:\"path\"},[_vm._v(_vm._s(file.fullPath))])])])]:[_c('div',{staticClass:\"col\",attrs:{\"data-title\":\"Filename\"}},[_vm._v(\" \"+_vm._s(file.file.name || file.name)+\" \")]),_c('div',{staticClass:\"col\",attrs:{\"data-title\":\"Name\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(file.name),expression:\"file.name\"}],staticClass:\"Name\",attrs:{\"type\":\"text\"},domProps:{\"value\":(file.name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(file, \"name\", $event.target.value)}}})]),_c('div',{staticClass:\"col\",attrs:{\"data-title\":\"Tags\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(file.tags),expression:\"file.tags\"}],staticClass:\"tax\",attrs:{\"type\":\"text\"},domProps:{\"value\":(file.tags)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(file, \"tags\", $event.target.value)}}})]),_c('div',{staticClass:\"col fullpath\",attrs:{\"data-title\":\"FullPath\"}},[_c('div',{staticClass:\"path\"},[_vm._v(_vm._s(file.fullPath))])]),(file.imageinfo )?_c('div',{staticClass:\"col\",attrs:{\"data-title\":\"Info\"}},[_vm._v(\" \"+_vm._s(file.imageinfo)+\" \"+_vm._s(_vm.updated)+\" \")]):_vm._e()],_c('div',{staticClass:\"col remove\"},[_c('div',{staticClass:\"remove-item\",on:{\"mousedown\":function($event){$event.stopPropagation();$event.preventDefault();},\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.doRemoveIcon($event, file, i)}}},[_vm._v(\"×\")])])],2)}),0)],1):_vm._e()],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <!-- <div v-cloak v-if=\"files.length\" class=\"allowDeselect sdpi-item-wrapper CenteredContainer\"> -->\n    <div v-cloak class=\"allowDeselect sdpi-item-wrapper CenteredContainer\" @click.stop.prevent.self=\"handleSelection($event, false)\">\n        <h3>Icons</h3>\n        <section>\n            <div class=\"wrap tools\">\n                <div class=\"tt\">\n                    <div :class=\"{ active: !iscard }\" class=\"toolicon list-icon\" @click.stop.prevent=\"toggleListType\"></div>\n                    <div :class=\"{ active: iscard }\" class=\"toolicon grid-icon\" @click.stop.prevent=\"toggleListType\"></div>\n                </div>\n                <div class=\"tagarea\">\n                    <div class=\"flexrow\">\n                        <span>Tags:</span>\n                        <input v-model.lazy=\"allTags\" type=\"text\" placeholder=\"tag1,tag2,...!\" />\n                        <button :disabled=\"allTags.length < 2\" @click.stop.prevent=\"setAllProps('tags', allTags)\">Set all tags</button>\n                    </div>\n                </div>\n                <div class=\"tooltext\"># icons: {{ files.length }}</div>\n            </div>\n            <header v-if=\"!iscard\" class=\"xrow\" :class=\"{ sdList: !iscard }\">\n                <div class=\"col mini\">Icon</div>\n                <div class=\"col cursor-pointer\" :class=\"{ sortedBy: isSortedBy('fileName') }\" @click=\"doSort('fileName', $event)\">Filename</div>\n                <!-- <div v-if=\"\" class=\"col\">Info</div> -->\n                <div class=\"col cursor-pointer\" :class=\"{ sortedBy: isSortedBy('name') }\" @click=\"doSort('name', $event)\">Name</div>\n                <div class=\"col\">Tags</div>\n                <div class=\"col cursor-pointer fullpath\" :class=\"{ sortedBy: isSortedBy('fullPath') }\" @click=\"doSort('fullPath', $event)\">Path</div>\n                <div class=\"col remove remove-item-empty\"></div>\n            </header>\n            <draggable  \n                v-if=\"shouldDraw\"\n                :move=\"onMoveCallback\"\n                :updated=\"updated\"\n                tag=\"div\"\n                class=\"list-groupA\"\n                :value=\"files\"\n                :sort=\"false\"\n                group=\"files\"\n                v-bind=\"dragOptions\"\n                \n                xxxhandle=\".handle\"\n                :component-data=\"getComponentData()\"\n                :class=\"{ dragging: drag }\"\n                \n                @start=\"onStart\"\n                @end=\"onEnd\"\n                @choose=\"onChoose\"\n            >\n                <!-- needed: name, thumbNail, tags, fullPath -->\n                <transition-group type=\"transition\" :name=\"!drag ? 'xxflip-list' : null\" class=\"listType\" :class=\"{ cardList: iscard, sdList: !iscard }\" @click.stop.prevent=\"handleSelection($event, false)\">\n                    <!-- <div class=\"xrow\" v-for=\"(file, i) in files\" :key=\"i\" v-bind:class=\"{ card: iscard, selected: file.isSelected }\" @mousedown.stop.prevent=\"mouseDown($event, file, i)\" @click.stop.prevent=\"handleSelection($event, file, i)\"> -->\n                    <!-- <div v-for=\"(file, i) in files\" :key=\"i\" class=\"xrow\" :class=\"{ card: iscard, selected: file.isSelected }\" @mousedown=\"mouseDown($event, file, i)\" @click.stop.prevent=\"handleSelection($event, file, i)\"> -->\n                    <!-- <div key=\"hello\"> -->\n                    <div v-for=\"(file, i) in files\" :key=\"i+0\" class=\"xrow\" :class=\"{ card: iscard, selected: file.isSelected }\" @click.stop.prevent=\"handleSelection($event, file, i)\">\n                        <div class=\"col mini\">\n                            <img v-if=\"file.objectURL\" class=\"thumbnail\" :src=\"file.objectURL\" :alt=\"file.file.name || file.name\" :title=\"file.file.name || file.name\" />\n                            <img\n                                v-show=\"hasThumbNail(file)\"\n                                class=\"thumbnail\"\n                                :src=\"getThumbNail(file)\"\n                                xrc=\"file.file.thumbNail || file.thumbNail\"\n                                :alt=\"file.file.name || file.name\"\n                                :title=\"file.file.name || file.name\"\n                            />\n                        </div>\n                        <template v-if=\"iscard\">\n                            <div :class=\"{ columns: iscard, row: !iscard}\">\n                                <div data-title=\"Filename\" class=\"col\">\n                                    <div>\n                                        {{ file.file.name || file.name }}\n                                    </div>\n                                </div>\n                                <div data-title=\"Name\" class=\"col\">\n                                    <input v-model=\"file.name\" type=\"text\" class=\"Name\" />\n                                </div>\n                                <div data-title=\"Tags\" class=\"col\">\n                                    <input v-model=\"file.tags\" type=\"text\" class=\"tax\" />\n                                </div>\n                                <div data-title=\"FullPath\" class=\"col fullpath\">\n                                    <div class=\"path\">{{ file.fullPath }}</div>\n                                </div>\n                            </div>\n                        </template>\n                        <template v-else>\n                            <div data-title=\"Filename\" class=\"col\">\n                                {{ file.file.name || file.name }}\n                            </div>\n                            <div data-title=\"Name\" class=\"col\">\n                                <input v-model=\"file.name\" type=\"text\" class=\"Name\" />\n                            </div>\n                            <div data-title=\"Tags\" class=\"col\">\n                                <input v-model=\"file.tags\" type=\"text\" class=\"tax\" />\n                            </div>\n                            <div data-title=\"FullPath\" class=\"col fullpath\">\n                                <div class=\"path\">{{ file.fullPath }}</div>\n                            </div>\n                            <div v-if=\"file.imageinfo \" data-title=\"Info\" class=\"col\">\n                                {{ file.imageinfo }} {{ updated }}\n                            </div>\n                        </template>\n                        <div class=\"col remove\">\n                            <div class=\"remove-item\" @mousedown.stop.prevent=\"\" @click.stop.prevent=\"doRemoveIcon($event, file, i)\">×</div>\n                        </div>\n                    </div>\n                    <!-- </div> -->\n                </transition-group>\n            </draggable>\n        </section>\n    </div>\n</template>\n\n<script>\n\n/* eslint-disable no-unused-vars */\n\n import draggable from 'vuedraggable'\n\nexport default {\n    name: 'FilelistComponent',\n    display: 'Table',\n    order: 8,\n    components: {\n        draggable\n    },\n    props: { \n        iconPack: {\n            type: Object,\n            default() {return {}}\n        }, \n        files: {\n            type: Array,\n            default() {return []},\n        }, \n        updated: {\n            type: Number ,\n           default() {return 0}\n        },\n         shouldDraw: {\n            type: Boolean ,\n           default() {return true}\n        }\n    },\n    data() {\n        // window.fl = this;\n        return {\n            iscard: true,\n            drag: false,\n            allTags:'',\n        };\n    },\n    \n    computed: {\n        dragOptions() {\n            return {\n                animation: 0,\n                // group: 'description',\n                disabled: false,\n                ghostClass: 'ghost',\n                multiDrag: false,\n                selectedClass: 'selected',\n                removeCloneOnHide: 'true',\n                lastClickedIdx: 0,\n            };\n        },\n    },\n    watch: {\n        allTags(val) {\n            const tags = this.$options.filters.tagify(val);\n            if(tags !== this.allTags) {\n                this.allTags = tags;\n            }\n        },\n    },\n    methods: {\n        logItems(arr) {\n            const x = [0, 1, 2, 3, 4, 5];\n            console.log(x.map((i) => arr[i].fileName));\n        },\n        \n        setAllProps(prop, value) {\n            const arrSelection = this.files.filter(i => i.isSelected);\n            const filesToProcess = arrSelection && arrSelection.length ? arrSelection : this.files;\n            for (let r of filesToProcess) {\n                // if (r.hasOwnProperty(prop)) {\n               if (Object.prototype.hasOwnProperty.call(r, prop)) {\n                    if (Array.isArray(value)) {\n                        r[prop] = value;\n                    } else {\n                        r[prop] = value.split(\",\");\n                    }\n                }\n            }\n        },\n        insertAtIndex(arr, index, items) {\n            arr.splice(arr, index, ...items);\n            this.logItems(arr);\n        },\n        insertItemsAtIndex(arr, index, items) {\n            return [...arr.slice(0, index), ...items, ...arr.slice(index)];\n        },\n        onChoose(evt) {\n            // console.log('component::onChoose', evt);\n        },\n        onStart(evt) {\n            // console.log('onStart', evt);\n            this.drag = true;\n            this.$emit('draggingchanged', this.drag);\n        },\n        onEnd(evt) {\n            const selectedItems = this.files.filter((i) => i.isSelected);\n            const notSelectedItems = this.files.filter((i) => !i.isSelected);\n\n            let files = this.insertItemsAtIndex(notSelectedItems, evt.newIndex, selectedItems);\n\n            this.files.splice(0, this.files.length);\n            files.map((f) => this.files.push(f));\n\n            this.drag = false;\n            this.$emit('draggingchanged', this.drag);\n             this.lastClickedIdx = evt.newIndex;\n        },\n        onMoveCallback(evt, originalEvent) {\n            // console.log('component::onMoveCallback2222', evt, evt.item, originalEvent);\n            // return false; — for cancel\n        },\n        handleChange(evt) {\n            console.log('handleChange', evt);\n        },\n        inputChanged(value) {\n            this.activeNames = value;\n            console.log('inputChanged', value);\n        },\n        getComponentData() {\n            // console.log('dnd:getComponentData()');\n            return {\n                on: {\n                    change: this.handleChange,\n                    input: this.inputChanged,\n                },\n                attrs: {\n                    wrap: true,\n                },\n                props: {\n                    value: this.activeNames,\n                },\n            };\n        },\n        \n        deselectAll() {\n            this.files.forEach(fl => (fl.isSelected = false));\n        },\n        handleSelection(evt, f, fileIdx) {\n            // if clicked a control (e.g. 'Set all tags')\n            if ([\"INPUT\", \"BUTTON\"].includes(evt.target.nodeName)) {\n                // console.log(\"clicked in CONTROL\");\n                return;\n            }\n\n            if (f == false || evt.target.classList.contains(\"allowDeselect\")) {\n                return this.deselectAll();\n            }\n\n            if (!evt.shiftKey && !evt.metaKey) {\n                // if the current item is already selected do nothing\n                if (f && f.isSelected) return;\n                this.deselectAll();\n            }\n\n            if (evt.shiftKey) {\n                let isSel = !f.isSelected;\n                let [toIndex, fromIndex] =\n                    fileIdx <= this.lastClickedIdx\n                        ? [this.lastClickedIdx, fileIdx]\n                        : [fileIdx, this.lastClickedIdx];\n                for (let i = fromIndex; i <= toIndex; i++) {\n                    this.iconPack.icons[i].isSelected = isSel;\n                }\n            } else {\n                f.isSelected = !f.isSelected;\n            }\n            this.lastClickedIdx = fileIdx;\n        },\n\n        isSortedBy(value) {\n            return this.iconPack.__sortState == value;\n        },\n        doSort(sortField) {\n            this.iconPack.sortIcons(sortField);\n        },\n        doRemoveIcon(evt, f) {\n            evt.stopPropagation();\n            evt.preventDefault();\n\n            if (evt.altKey) {\n                this.$emit('doRemoveFromAllIcons', this.files);\n                this.files.splice(0, this.files.length);\n            } else {\n                this.$emit('doRemoveFromAllIcons', f);\n                const index = this.files.indexOf(f);\n                if (index > -1) {\n                    this.files.splice(index, 1);\n                }\n            }\n        },\n        toggleListType() {\n            this.iscard = !this.iscard;\n        },\n        getThumbNail(file) {\n            if (file && file.thumbNail) {\n                return file.thumbNail.objectURL ? file.thumbNail.objectURL : file.thumbNail;\n            }\n            if (file.file && file.file.thumbNail) {\n                return file.file.thumbNail.objectURL ? file.file.thumbNail.objectURL : file.file.thumbNail;\n            }\n        },\n        hasThumbNail(file) {\n            if (file && file.thumbNail) {\n                return true;\n            }\n            if (file.file && file.file.thumbNail) {\n                return true;\n            }\n            const b = !!(file.file.thumbNail || file.thumbNail);\n            if (b) {\n                console.log('thumb: ', file);\n            }\n        },\n        isEditable(col) {\n            return ['fileName', 'tags'].includes(col.field);\n        },\n        add() {\n            this.$emit('update:files', this.files.length);\n        },\n    },\n};\n</script>\n\n<style scoped>\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./filelist-component.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./filelist-component.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./filelist-component.vue?vue&type=template&id=6d8dfa80&scoped=true\"\nimport script from \"./filelist-component.vue?vue&type=script&lang=js\"\nexport * from \"./filelist-component.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"6d8dfa80\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.data)?_c('div',{staticClass:\"inner\",domProps:{\"innerHTML\":_vm._s(_vm.compiledMarkdown)}}):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <div v-if=\"data\" class=\"inner\" v-html=\"compiledMarkdown\"></div>\n</template>\n\n<script>\n\nimport marked from 'marked';\nimport DOMPurify  from 'dompurify';\n\nexport default {\n\n    name: 'MarkdownComponent',\n    props: {\n        data: {\n            type: String,\n            default: ''\n        },\n    },\n    computed: {\n        compiledMarkdown: function () {\n            const d = DOMPurify.sanitize(marked(this.data));\n            this.$emit('changed');\n            return d;\n        },\n    },\n    methods: {},\n};\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./markdown-component.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./markdown-component.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./markdown-component.vue?vue&type=template&id=dee8dea2\"\nimport script from \"./markdown-component.vue?vue&type=script&lang=js\"\nexport * from \"./markdown-component.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","const versionInfo = {\r\n    major: 1,\r\n    minor: 2,\r\n    patch: 1,\r\n    build: 117\r\n}\r\nexport const version = `${versionInfo.major}.${versionInfo.minor}.${versionInfo.patch}(${versionInfo.build})`;","<template>\n    <div id=\"app\" ref=\"andyapp\">\n        <div id=\"iconpackman-root\" v-esddrop=\"{ fn: handleDrop }\" class=\"root\">\n            <HeadComponent :version=\"version\" :loaded=\"sheetData\" :documents=\"docs\" @toggleconsole=\"toggleConsole\" @togglesidebar=\"toggleSidebar\" @loadcomponentdata=\"loadComponentData\" @loadiconpack=\"loadIconPack\" />\n\n            <InfoComponent :dark=\"darkMode\" :sheetopen=\"sheetData !== ''\" :dynamiccomponent=\"dynamicComponent\" :dynamicdata=\"dynamicData\" @loadcomponentdata=\"loadComponentData\" />\n\n            <div v-cloak class=\"flex-grid\">\n                <div ref=\"allowDeselect\" class=\"allowDeselect content\" :class=\"{mark: iconPack.iconsjson.length}\" :disabled=\"!loading\" @click.stop.prevent.self=\"handleSelection($event, false)\">\n                    <div class=\"CenteredContainer\" @click.stop.prevent.self=\"handleSelection($event, false)\">\n                        <h3>Icon</h3>\n                        <div>{{ iconPack.__sortState }}</div>\n                        <img v-esddrop=\"setIconPackIcon\" class=\"iconpack-icon\" :src=\"iconPack.icon\" :name=\"iconPack.icon.name\" />\n                    </div>\n\n                    <div class=\"allowDeselect CenteredContainer\" @click.stop.prevent.self=\"handleSelection($event, false)\">\n                        <h3>Preview Images</h3>\n                        <div class=\"marketing cardList\">\n                            <!-- <div v-for=\"(file, i) in iconPack.previews\" :key=\"i\" class=\"xycard posrel\" :data-updated=\"iconPack.updated\" style=\"padding-bottom: 4px;\"> -->\n                            <div v-for=\"(file, i) in iconPack.previews\" :key=\"i\" class=\"xycard preview posrel\" style=\"padding-bottom: 4px;\">\n                                <div class=\"remove posabsright\">\n                                    <div v-show=\"!iconPack.isPreview(file)\" class=\"remove-item\" @click.stop.prevent=\"iconPack.removePreview(file, $event.altKey);\">×</div>\n                                </div>\n                                <img v-esddrop=\"addIconPackPreview\" :src=\"file.objectURL ? file.objectURL : file\" :data-index=\"i\" class=\"preview-icon\" :alt=\"previewName(file)\" :title=\"previewName(file)\" />\n                                <div data-title=\"Filename\">\n                                    {{ file.objectURL ? `${previews.indexOf(file)}-${file.name}`: '&nbsp;' }}\n                                </div>\n                                <!-- <div data-title=\"Name\" class=\"col\">\n                                    <input v-model=\"file.name\" type=\"text\" class=\"Name\" />\n                                </div> -->\n                            </div>\n                        </div>\n                    </div>\n\n                    <FilelistComponent\n                        ref=\"filelist\"\n                        :icon-pack=\"iconPack\"\n                        :files=\"iconPack.icons\"\n                        :updated=\"updated\"\n                        @doRemoveFromAllIcons=\"doRemoveFromAllIcons\"\n                        @draggingchanged=\"draggingChanged\"\n                    />\n\n                    <!-- <div class=\"CenteredContainer\" :class=\"{mark: iconPack.iconsjson.length}\">\n                        <div v-if=\"!loading && !iconPack.icons.length\" class=\"xxpackcheck\">\n                            <div class=\"logo\">\n                                <p class=\"infopackman\"></p>\n                            </div>\n                            <p class=\"infotext\">\n                                Drag your icons and manifest onto this window....\n                            </p>\n                        </div>\n                    </div> -->\n                </div>\n\n                <div v-show=\"sidebar\" class=\"sidebar\">\n                    <div class=\"sidebarcontent\">\n                        <div class=\"CenteredContainer\">\n                            <h3>IconPack ID</h3>\n                            <input\n                                v-model.lazy=\"uid\" \n                                type=\"text\" \n                                class=\"iconpacku\" \n                                placeholder=\"e.g. com.yourname.youriconpack\"\n                                autocomplete=\"off\"\n                                data-1p-ignore\n                            />\n                            <div v-show=\"uidNeedsCheck\" class=\"col left\">\n                                ID should be in the format:<div class=\"italic\">com.yourname.youriconpack</div>\n                            </div>\n                            <div v-show=\"uidExists\" class=\"col note\">\n                                <div class=\"bold\">{{ uid }}</div> already exists in our system. Please make sure it is owned by you.\n                            </div>\n                        </div>\n\n                        <JsonComponent name=\"manifest\" :tableheadings=\"false\" :rows=\"iconPack.manifest\" :excludes=\"['_']\" :namesmap=\"{'License': 'license'}\" :typesmap=\"{'license': {nodetype: 'textarea'},'Description': {nodetype: 'textarea'}}\" />\n                        <div v-if=\"iconPack.iconsjson.length\" class=\"CenteredContainer\">\n                            <h3>Mapping</h3>\n                            <div class=\"inputContainer\">\n                                <div class=\"col remove\">\n                                    <div class=\"remove-item\" @click=\"doRemoveMapping()\">×</div>\n                                </div>\n                                <span>Mapping file loaded.</span>\n                            </div>\n                        </div>\n\n                        <JsonComponent v-if=\"dbgShowSettings\" name=\"settings\" :rows=\"state\" :excludes=\"['_']\" :typesmap=\"{'token': {type: 'password'}}\" />\n\n                        <div class=\"CenteredContainer\">\n                            <h3>Info</h3>\n                            <div class=\"infomsg\" :class=\"{gray: infoMsg==''}\">{{ infoMsg }}</div>\n                            <div class=\"duplicates content details\">\n                                <details v-show=\"duplicates.length\" class=\"pad\" @toggle=\"detailsOpened\">\n                                    <summary>Excluded files ({{ duplicates.length }} files)</summary>\n                                </details>\n                                <ul v-if=\"detailsOpen\" class=\"details\">\n                                    <li v-for=\"(d,j) in duplicates\" :key=\"j\">\n                                        {{ d.fullPath || d.name }}\n                                    </li>\n                                </ul>\n                            </div>\n                        </div>\n                    </div>\n\n                    <div class=\"moreaction\">\n                        <a href=\"./sample_iconpack.zip\" download=\"sample_iconpack.zip\">Download sample iconpack</a>\n                        <button :disabled=\"loading || progress || iconPack.readOnly || iconPack.icons.length < 1\" class=\"primary\" @click=\"doExportIconPack\">\n                            Export IconPack\n                        </button>\n                        <div v-if=\"iconPack.readOnly\">Exporting zipped iconPacks is not supported</div>\n                    </div>\n                    <img src=\"\" class=\"testimage\" style=\"max-width: 320px;\" />\n                </div> <!-- end sidebar-->\n            </div><!-- end flexgrid-->\n\n            <div v-cloak class=\"flex-grid testconsole\" :class=\"{consoleVisible: showValidator}\">\n                <div class=\"widget widget__scrollable\" style=\"display:flex;flex-direction: row;\">\n                    <span class=\"disclosure-triangle\" @click=\"toggleConsole()\"></span>\n                    <div v-show=\"consoleOpen\" ref=\"messageContainer\" class=\"msg-container\">\n                        <div v-for=\"(msg,i) in dbgMessages\" :key=\"i\" class=\"msg\">\n                            <div class=\"topic\" :class=\"{error: msg.err, caution: msg.caution}\">{{ msg.topic }}</div>\n                            <div class=\"time\">{{ msg.timestamp }}</div>\n                            <div v-if=\"msg.text.length\" class=\"payload\">{{ msg.text }}</div>\n                        </div>\n                    </div>\n                </div> <!-- end widget widget__scrollable -->\n                <!-- <div class=\"moreplaceholder\"></div> -->\n            </div><!-- end widget  -->\n        </div>\n\n        <div class=\"packcheck\" :class=\"{hidden: !loading}\">\n            <div class=\"flexlogo\">\n                <div class=\"flexloader\">&nbsp;</div>\n                <div class=\"loader\">\n                    Loading...\n                </div>\n                <div class=\"infomsg\">\n                    {{ infoMsg }}\n                </div>\n                <div class=\"flexloader\">&nbsp;</div>\n            </div>\n        </div>\n    </div>\n</template>\n<script>\n/* eslint-disable */\n\nimport \"./css/index.css\";\nimport { checkUID } from './js/checkUID.js';\nimport Utils, { dbgprintf } from \"./js/utils\";\nimport { CHECKUID_FORCE_LOWERCASE } from \"./js/constants.js\";\n// import { startDragAndDropForElement } from \"./js/ESDDrag.js\";\n// import JSZip, { file } from 'jszip';\n\nimport { readFileEntry } from \"./js/ESDIconPackParser\";\nimport { ESDIconPack } from \"./js/ESDIconPack\";\nimport {\n    ValidateIconPack,\n    EplFile_GetExtension,\n    GetFolderContents,\n    IsValidUUID\n} from \"./js/ESDValidateIconPack\";\nimport { ValidateZippedIconPack } from './js/ESDValidateZippedIconPack.js';\nimport { ESDFileSelectorXX } from \"./js/ESDFileSelector\";\nimport { ESDImageScaler } from './js/ESDImageScaler.js';\n// import * from  './js/ESDValidateIconPack';\n// import * as EplFile_GetExtension from  './js/ESDValidateIconPack';\n// require( './js/ESDValidateIconPack.js');\n// import TestComponent from \"./components/test-component\";\n\nimport HeadComponent from \"./components/head-component\";\nimport InfoComponent from \"./components/info-component\";\nimport JsonComponent from \"./components/json-component\";\nimport FilelistComponent from \"./components/filelist-component\";\nimport MarkdownComponent from \"./components/markdown-component\";\n// import { pushZippedFile } from \"./js/loadSDIconPack.js\";\nimport { dbgMessages } from \"./js/dbgMessages.js\";\nwindow.dbgMessages = dbgMessages;\n\nconst MAllowedFileTypes = [ \"png\", \"jpg\", \"jpeg\", \"svg\", \"gif\" ];\nconst MTimeoutGuardMs = 4000;\n\nconst kStorageName = \"iconpackman_settings\";\nimport { version } from \"./version.js\";\n\nexport default {\n    name: \"App\",\n    components: {\n        // HelloWorld,\n        HeadComponent,\n        JsonComponent,\n        InfoComponent,\n        FilelistComponent,\n        // TestComponent\n    },\n    data() {\n        return {\n            dbgShowSettings: false,\n            version,\n            iconPack: this.createIconPack(),\n            duplicates: [],\n            allIcons: [],\n            sidebar: true,\n            detailsOpen: false,\n            uid: '',\n            infoMsg: '',\n            sheetData: \"\",\n            docs: [],\n            state: {\n                token: \"\",\n                lastSaved: new Date().toLocaleTimeString()\n            },\n            dbgMessages,\n            showValidator: false,\n            consoleOpen: true,\n            darkMode: true,\n            dynamicComponent: null,\n            dynamicData: null,\n            loading: false,\n            progress: false,\n            updated: 0,\n            timeoutGuard: null,\n            uidExists: false,\n            uidNeedsCheck: false,\n        };\n    },\n    beforeMount() {\n        dbgMessages.clear();\n        const sttgs = localStorage.getObject(kStorageName);\n        for(let s in sttgs) {\n            this.state[ s ] = sttgs[ s ];\n        }\n\n        // const baseUrl = process.env.BASE_URL;\n        // Utils.loadDataPromise(`${ baseUrl }/docs.json`).then(data => {\n        Utils.loadDataPromise('./docs.json').then(data => {\n            this.docs = JSON.parse(data);\n        });\n    },\n    mounted() {\n        window.app = this;\n        window.utls = Utils;\n        const time = new Date().getHours();\n        const s = `Good ${time < 12 ? \"Morning\" : time < 18 ? \"Afternoon\" : \"Evening\"}`;\n        dbgprintf(`Version: ${this.version}`);\n        dbgprintf(`${s}... Drop your icons onto the window...`);\n\n        // const arr = Object.entries(this.state);\n\n        this.throttledUpdate = Utils.throttle((value, oldValue) => {\n            console.log(\n                \"WATCHER::state changed... SAVING\",\n                Date.now(),\n                value,\n                oldValue\n            );\n            localStorage.setObject(kStorageName, this.state);\n        }, 500);\n\n        this.$watch(\n            () => this.state,\n            (value, oldValue) => {\n                if(this.throttledUpdate) this.throttledUpdate(value, oldValue);\n                // store.save();\n            },\n            { deep: true }\n        );\n    },\n    watch: {\n        uid(val) {\n            const uid = this.$options.filters.removeSpecials(val);\n            if(val !== this.iconPack.uid) {\n                this.iconPack.uid = uid;\n                this.uid = uid;\n            }\n        }\n    },\n    computed: {\n        // previews: function() {\n        //     if (!this.iconPack) return [];\n        //     return this.iconPack ? this.iconPack.previews  : []\n        // }\n        previews: function() {\n            return this.iconPack.previews ? this.iconPack.previews.filter(p => p.file) : 0;\n        }\n    },\n    methods: {\n        createTimeOutGuard() {\n            this.timeoutGuard = Utils.debounce((fn) => {\n                if(typeof fn === 'function') fn();\n                console.log(\"TIMEOUT GUARD\");\n            }, MTimeoutGuardMs);\n        },\n        handleSelection(e, all) { // hack to deselect all\n            if(this.$refs.filelist) {\n                this.$refs.filelist.handleSelection(e, all);\n            }\n        },\n        previewName(f) {\n            if(!f) return '';\n            return f.file ? f.file.name : f.name || '';\n        },\n        reset() {\n            this.iconPack && this.iconPack.init();\n            this.allIcons = [];\n            // this.iconPack = new ESDIconPack();\n            this.uid = \"\";\n            this.duplicates = [];\n            this.updated = 0;\n        },\n        createIconPack(options) {\n            const iconPack = new ESDIconPack();\n            if(options && options.readOnly) {\n                iconPack.readOnly = true;\n            }\n            iconPack.on('thumbnailsLoaded', () => {\n                // console.log(\"++++ Thumbnails loaded...\");\n                this.infoMsg = '';\n                this.loading = false;\n                this.progress = false;\n            });\n            iconPack.on('message', (obj) => {\n                // console.log(\"++++ Message from iconPack:\", obj);\n                if(obj.message) this.infoMsg = obj.message;\n                if(obj.loading != undefined) this.loading = obj.loading;\n            });\n            iconPack.on('uidChanged', async (uid) => {\n                if(uid == '') {\n                    this.uidExists = false;\n                    return;\n                }\n                this.uidNeedsCheck = !IsValidUUID(uid);\n                console.log(\"++++ UID changed in iconPack:\", uid);\n                const peek = `https://mp-gateway.elgato.com/sdid-available?sdid=${uid}&extension=icons`\n                console.log(\"peek:\", peek);\n                try {\n                    const response = await fetch(peek);\n                    const result = await response.json();\n                    this.uidExists = result && !result.available;\n                    console.log(\"peeked:\", result);\n                } catch(err) {\n                    console.error(\"Error fetching:\", err);\n                }\n                // fetch(peek).then(r => r.json()).then(j => {\n                //     console.log(\"peeked:\", j);\n                //     j && j.available ? this.uidExists = false : this.uidExists = true;\n                // });\n            });\n            return iconPack;\n        },\n        dbgScrollToView() {\n            if(this.lockMessages !== true) {\n                if(this.$refs.messageContainer) {\n                    this.$refs.messageContainer.scrollTop =\n                        this.$refs.messageContainer.scrollHeight - 23;\n                }\n            }\n        },\n        doRemoveFromAllIcons(arrOrObj) {\n            if(Array.isArray(arrOrObj)) {\n                arrOrObj.map(f => {\n                    const index = this.allIcons.indexOf(f);\n                    if(index > -1) {\n                        this.allIcons.splice(index, 1);\n                    }\n                });\n            } else {\n                const index = this.allIcons.indexOf(arrOrObj);\n                if(index > -1) {\n                    this.allIcons.splice(index, 1);\n                }\n            }\n        },\n\n        doRemoveMapping() {\n            this.iconPack.iconsjson = [];\n        },\n\n        draggingChanged(val) {\n            this.updated = Date.now();\n            this.dragging = val;\n        },\n        setloading() {},\n        detailsOpened(e) {\n            this.detailsOpen = e.target.open;\n        },\n\n        openConsole(tof = true) {\n            this.showValidator = tof;\n        },\n\n        toggleConsole(e) {\n            this.showValidator = !this.showValidator;\n        },\n\n        toggleSidebar(e) {\n            this.sidebar = !this.sidebar;\n        },\n\n        loadIconPack() {\n\n            // const openFile = async => {\n            //     console.log('openFile called...');\n            //     window.showOpenFilePicker().then(([handle]) => {\n            //         console.log('handle:', handle);\n            //         const file = handle.getFile().then(file => {\n            //             console.log('file:', file);\n            //             const fold = file.getFile();\n            //             console.log('fold:', fold);\n            //         });\n            //     });\n            // };\n\n            // openFile();\n\n\n            const input = document.createElement('input');\n            input.type = 'file';\n            // input.accept = '.sdIconPack,.streamDeckIconPack,.zip'; // but we only support files (and not .sdIconPack) for now\n            const accept = ['.streamDeckIconPack','.zip'];\n            input.accept = accept.join(',');\n            \n            input.onchange = (event) => {\n                const file = event.target.files[0];\n                if (file) {\n                    if (!accept.some(ext => file.name.endsWith(ext))) {\n                        console.error(`File type not accepted. Allowed types: ${accept.join(', ')}`);\n                        return;\n                    }\n                    this.handleDrop({ dataTransfer: { files: [file], items: [file] } });\n                }\n            };\n            input.click();\n        },\n\n        handleDropFromComponent(evt, c) {\n            this.handleDrop(evt, true);\n        },\n\n        handleDrop(evt, onlyMeta) {\n            //  console.log(\"handleDrop...\",evt.dataTransfer.files, evt.dataTransfer.items, {onlyMeta});\n            let dataTransferFiles = evt.dataTransfer.files;\n            if(!dataTransferFiles || !dataTransferFiles.length) return;\n            dbgMessages.clear();\n\n            dbgprintf(\"processing dropped items...\");\n\n            const getFileFromFileEntry = entry => {\n                return new Promise(resolve => {\n                    entry.file(file => {\n                        // resolve(this.packageFile(file, entry));\n                        // resolve(file, entry);\n                        resolve({\n                            file,\n                            entry,\n                            // name: file.name,\n                            name: Utils.getFilenameWithLowerCaseExtension(file.name),\n                            objectURL: URL.createObjectURL(file),\n                            fullPath: `${entry.fullPath}`.slice(1)\n                        });\n                    });\n                });\n            };\n\n            // let f = droppedFiles[0];\n            // let f = evt.dataTransfer.items[ 0 ];\n            let file = dataTransferFiles[ 0 ];\n            // const entry = f.webkitGetAsEntry();\n            // let entryTest = entry;\n            const droppedFileName = file.name;\n            const fileNameWithoutExtension = this.checkFile(droppedFileName).fileNameWithoutExtension;\n            const extension = EplFile_GetExtension(droppedFileName).substr(1); // strip leading '.'\n\n            const isPackedFile = extension.endsWith('sdIconPack') || extension.endsWith('streamDeckIconPack') || extension.endsWith('zip');\n            if(!isPackedFile && Utils.hasUpperCase(extension)) {\n                dbgprintf(\"Extension has uppercase characters: \" + file.name);\n            }\n\n            const checkComplementaryIfGif = (icon, entries) => {\n                const extension = EplFile_GetExtension(icon.name);\n                const lowerCaseExtension = extension.substr(1).toLowerCase();\n                if(lowerCaseExtension == \"gif\") {\n                    const png = icon.name.replace(extension, \".png\");\n                    const found = entries.find(f => f.name.endsWith(png));\n                    if(!found) {\n                        dbgprintf(`Note: Complementary gif will be created for ${icon.name}`);\n                    }\n                    return found;\n                }\n            };\n\n            let processed = false;\n            if(!this.timeoutGuard) this.createTimeOutGuard();\n            this.timeoutGuard(() => {\n                this.infoMsg = \"\";\n                this.loading = false;\n                this.progress = false;\n            });\n\n            switch(extension) {\n                case \"zip\":\n                    console.log('dropped ZIP', file);\n                    console.log('For now we only support zipped files, if they contain a full icon pack.');\n                // const jsZip = new JSZip();\n                // const zipOptions = { createFolders: true };\n                // jsZip.loadAsync(file, zipOptions).then(zip => {\n                //     console.log('ZIP', zip);\n                // });\n                // return jsZip.loadAsync(file, zipOptions).then(zip => {\n                //     console.log('ZIP', zip);\n                //     return zip;\n                // });\n                // break;\n                case \"streamDeckIconPack\":\n                    this.infoMsg = \"loading...\";\n                    this.loading = true;\n                    this.progress = true;\n                    this.reset();\n\n                    const pushZippedFile = (objectURL, name, inFile, createThumbnail = false, targetArray, entries) => {\n\n                        // console.log(\"pushZippedFile\", name, objectURL, inFile, createThumbnail, targetArray, entries);\n\n                        const f = {\n                            objectURL,\n                            name,\n                            fileName: Utils.getFilenameWithLowerCaseExtension(inFile.fileName || name),\n                            fullPath: Utils.getFilenameWithLowerCaseExtension(inFile.name),\n                            tags: Utils.tagify(inFile.tags),\n                            file: {\n                                fullPath: inFile.name,\n                                name: inFile.fileName\n                            },\n                            zip: {\n                                zippedFile: inFile\n                            }\n                        };\n\n                        f.suffix = f.fileName.split(\".\").pop().toLowerCase();\n\n                        if(f.suffix == \"gif\") {\n                            const pngFileName = inFile.name.replace(/\\.gif$/i, \".png\");\n                            const found = entries.find(e => e.name.endsWith(pngFileName));\n                            createThumbnail = !found;\n\n                            f.hasThumbnail = !!found;\n                            f.thumbNail = \"data:image/svg+xml,%3Csvg width='144' height='144' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath fill='%23333336' d='M0 0h144v144H0z'/%3E%3Cg transform='translate(18 104)' fill='%23999999'%3E%3Ccircle cx='20' cy='10' r='6'/%3E%3Ccircle cx='54' cy='10' r='6'/%3E%3Ccircle cx='88' cy='10' r='6'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\";\n\n                            if(createThumbnail) {\n                                const dbgMessageIndex = dbgprintf(`Creating complementary png for ${f.name}`);\n                                const dbgMessage = dbgMessages[ dbgMessageIndex - 1 ];\n\n                                if(objectURL.startsWith('blob:')) {\n                                    f.hasThumbnail = true;\n                                    const img = new Image();\n                                    img.onload = () => {\n                                        const canvas = document.createElement('canvas');\n                                        const ctx = canvas.getContext('2d');\n                                        const size = 144;\n                                        if(size > 0) {\n                                            canvas.width = size;\n                                            canvas.height = size;\n\n                                            const ratio = Math.min(size / img.width, size / img.height);\n                                            const x = (size - img.width * ratio) / 2;\n                                            const y = (size - img.height * ratio) / 2;\n                                            ctx.drawImage(img, x, y, img.width * ratio, img.height * ratio);\n                                        } else {\n                                            canvas.width = img.width;\n                                            canvas.height = img.height;\n                                            ctx.drawImage(img, 0, 0);\n                                        }\n\n                                        // f.hasThumbnail = true;\n                                        f.thumbNail = canvas.toDataURL('image/png');\n                                        if(dbgMessage) dbgMessage.topic += ' => OK';\n                                    };\n                                    img.onerror = () => {\n                                        f.hasThumbnail = false;\n                                        if(dbgMessage) dbgMessage.topic += ' => ERROR';\n                                    };\n                                    img.src = objectURL;\n                                } else {\n                                    const l = new ESDImageScaler();\n                                    l.loadAndScaleImage(objectURL).then(img => {\n                                        f.hasThumbnail = true;\n                                        f.thumbNail = img;\n                                    }).catch(err => {\n                                        f.hasThumbnail = false;\n                                        // console.log('Error creating thumbnail', err);\n                                        if(dbgMessage) dbgMessage.topic += ' => NOT OK';\n                                    });\n                                }\n                            } else {\n                                if(found) {\n                                    f.zip.thumbNail = found;\n                                    found.async(\"uint8array\").then(content => {\n                                        const blob = new Blob([ content ], { type: 'image/png' });\n                                        f.thumbNail = URL.createObjectURL(blob);\n                                        return inFile;\n                                    });\n                                }\n                            }\n                        }\n\n                        if(targetArray) {\n                            // targetArray.push(f);\n                            this.iconPack.addPreview(f);\n                        } else {\n                            f.isSelected = false;\n                            this.iconPack.addIcon(f);\n                            // this.iconPack.icons.push(f);\n                            // this.addIconToIconPack(f);\n                        }\n                    };\n\n                    const ok = ValidateZippedIconPack(file).then(res => {\n\n                        // console.log(\"ValidateZippedIconPack OK\", file, res);\n\n                        if(res.files.includes(undefined))\n                            this.openConsole();\n\n                        // this.iconPack = this.createIconPack({ readOnly: false });\n\n                        this.uid = res.sdIconPackName ? res.sdIconPackName.replace(\".sdIconPack\", \"\") : \"\";\n\n                        const loadFromZip = (fileName, toJson) => {\n                            const found = res.files.find(f => f.name && f.name.endsWith(fileName));\n                            if(!found) return Promise.resolve(toJson === true ? {} : '');\n                            return found.async(\"text\").then(content => {\n                                return toJson && typeof content == \"string\"\n                                    ? JSON.parse(content)\n                                    : content;\n                            });\n                        };\n\n                        const iconsJsonPromise = loadFromZip(\"icons.json\", true).then(content => {\n                            this.iconPack.iconsjson = content;\n                            return content;\n                        });\n\n                        // find the icon\n                        if(res.icon) {\n                            const suffix = res.icon.name.split(\".\").pop();\n                            if(suffix == \"svg\") {\n                                // svg first, because it's in MAllowedFileTypes\n                                res.icon.async(\"text\").then(content => {\n                                    const blob = new Blob([ content ], { type: \"image/svg+xml\" });\n                                    this.iconPack.icon = URL.createObjectURL(\n                                        blob\n                                    );\n                                });\n                            } else if(MAllowedFileTypes.includes(suffix)) {\n                                res.icon.async(\"base64\").then(content => {\n                                    this.iconPack.icon = `data:image/${suffix};base64, ${content}`;\n                                });\n                            }\n                        }\n\n                        loadFromZip(\"manifest.json\", true).then(content => {\n                            this.iconPack.setManifestFromJson(content);\n                        });\n\n                        loadFromZip(\"license.txt\", false).then(content => {\n                            this.iconPack.manifest.setLicenseText(content);\n                        });\n\n                        const loadZipEntry = (zip, contentType, mimeType, needsThumbnail = false, targetArray) => {\n                            const name = zip._name ? zip._name : zip.name.split(\"/\").pop();\n                            zip.async(contentType).then(content => {\n                                const blob = new Blob([ content ], { type: mimeType });\n                                pushZippedFile(URL.createObjectURL(blob), name, zip, needsThumbnail, targetArray, res.icons);\n                            });\n                        };\n\n                        // load previews\n                        res.previews.forEach(zip => {\n                            const suffix = zip.name.split(\".\").pop();\n                            if(suffix == \"svg\") {\n                                loadZipEntry(zip, \"text\", \"image/svg+xml\", false, this.iconPack.previews);\n                            } else if(MAllowedFileTypes.includes(suffix)) {\n                                loadZipEntry(zip, \"uint8array\", `image/${suffix}`, false, this.iconPack.previews);\n                            }\n                        });\n\n                        // load icons\n                        const loadIcons = () => {\n                            console.log(\"----->> loadIcons...\");\n\n                            const arrGifs = res.icons.filter(f => f.name.endsWith('gif'));\n\n                            // remove preview files (PNG) from the icons array\n                            // but keep the files in the original array, because we need them\n                            // later to create a thumbnail\n                            const filteredIcons = [ ...res.icons ];\n                            arrGifs.forEach(icon => {\n                                const png = icon.name.replace(\".gif\", \".png\");\n                                const idx = filteredIcons.findIndex(e => e.name == png);\n                                if(idx > -1) {\n                                    filteredIcons.splice(idx, 1);\n                                }\n                            });\n\n                            //  res.icons.forEach(i => {\n                            filteredIcons.forEach(i => {\n                                const suffix = i.name.split(\".\").pop().toLowerCase();\n                                const name = i.name.split(\"/\").pop();\n                                i.fileName = name;\n                                // load tags\n                                const t = this.iconPack.iconsjson.find(i => i.path == name);\n                                i.tags = t ? Utils.tagify(t.tags) : [];\n                                if(t) {\n                                    if(t.name !== \"\") i._name = t.name;\n                                }\n\n                                const needsThumbnail = suffix == \"gif\" ? res.orphanedGifs.includes(i) : false;\n                                if(suffix == \"gif\") {\n                                    // console.log( \"GIF:\", {name, needsThumbnail, orphanedGifs: res.orphanedGifs,  i });\n                                }\n                                if(suffix == \"svg\") {\n                                    loadZipEntry(i, \"text\", \"image/svg+xml\");\n                                } else if(MAllowedFileTypes.includes(suffix)) {\n                                    loadZipEntry(i, \"uint8array\", `image/${suffix}`, needsThumbnail);\n                                }\n                            });\n\n                        }; // end loadicons\n\n                        const hasIconsJson = res.files.find(i => i.name.endsWith(\"icons.json\"));\n                        // we need a breath until icons.json is loaded\n                        if(hasIconsJson) {\n                            setTimeout(() => {\n                                // console.log(\"----->> Promise:: icons json was loaded...\");\n                                iconsJsonPromise.then(loadIcons);\n                            }, 100);\n                        } else {\n                            loadIcons();\n                        }\n                    })\n                        .catch(err => console.log(\"ValidateZippedIconPack failed\", err))\n                        .finally(() => {\n                            console.log(\"ValidateZippedIconPack.done...\");\n                            this.loading = false;\n                        });\n                    processed = true;\n                    if(!ok) this.openConsole(true);\n                    this.dbgScrollToView();\n                    this.infoMsg = \"\";\n                    break;\n\n                /**\n                 *  .sdIconPack\n                 */\n\n                case \"sdIconPack\":\n                    this.reset();\n                    let f = evt.dataTransfer.items[ 0 ];\n                    // const objectURL = URL.createObjectURL(f);\n                    // const objectURL2 = URL.createObjectURL(dataTransferFiles[ 0 ]);\n                    // const x = ValidateIconPack(objectURL);\n                    // const y = ValidateIconPack(objectURL2);\n                    // console.log('dropped sdIconPack', f, f.getAsEntry);\n                    const entry = f.webkitGetAsEntry ? f.webkitGetAsEntry() : f;\n                    const res = ValidateIconPack(entry).then(\n                        (success, checkedIcons) => {\n                            dbgprintf(\n                                success\n                                    ? \"Validation succeeded for  %s\"\n                                    : \"Error while validating iconPack  %s\",\n                                entry.name,\n                                !success\n                            );\n                            if(!success) {\n                                this.openConsole();\n                            }\n                        }\n                    ).then(() => {\n\n                        // console.log('continue: ValidateIconPack', entry);\n\n                        // Load sdIconPack\n                        const newUID = checkUID(droppedFileName.replace(\".sdIconPack\", ''), CHECKUID_FORCE_LOWERCASE);\n                        this.uid = newUID;\n                        GetFolderContents(entry).then(folderEntries => {\n                            // Load Manifest\n                            const manifestJson = folderEntries.find(f => f.isFile && f.name == \"manifest.json\");\n                            if(manifestJson) {\n                                manifestJson.file(file => {\n                                    this.iconPack.manifest\n                                        .readFromFile(file)\n                                        .then(data => {\n                                            const ipIcon = folderEntries.find(f => f.isFile && f.name == data.Icon);\n                                            if(!ipIcon) {\n                                                const otherIcon = folderEntries.find(\n                                                    f => f.isFile && /(png|jpg|jpeg|svg|tif|tiff|gif)$/gi.test(f.name)); // case insensitive\n                                                if(otherIcon) {\n                                                    dbgprintf(\"Note: iconPack icon was missing and got replaced by %s\", otherIcon.name);\n                                                    otherIcon.file(ofile => {\n                                                        this.iconPack.setIcon(ofile);\n                                                    });\n                                                }\n                                            } else {\n                                                ipIcon.file(ofile => {\n                                                    this.iconPack.setIcon(ofile);\n                                                });\n                                            }\n                                            // license\n                                            const ipLicense = folderEntries.find(f => f.isFile && f.name == data.License);\n                                            if(ipLicense) {\n                                                ipLicense.file(ofile => {\n                                                    this.iconPack.manifest.license = ofile; // works also: this.iconPack.license = ofile;\n                                                });\n                                            }\n                                        });\n                                });\n                            }\n\n                            // Load Previews\n                            const previewsFolder = folderEntries.find(f => f.isDirectory && f.name == \"previews\");\n                            if(previewsFolder) {\n                                GetFolderContents(previewsFolder, true).then(previewEntries => {\n                                    const allP = previewEntries.map(getFileFromFileEntry);\n                                    Promise.all(allP).then(p => {\n                                        p.sort((a, b) => a.name.localeCompare(b.name));    // p.sort((a, b) =>  +/\\d+/.exec(a.name)[0] - +/\\d+/.exec(b.name)[0]);\n                                        p.forEach(e => this.iconPack.addPreview(e));\n                                    });\n                                }\n                                );\n                            }\n\n                            // Load icons.json\n                            const iconsJson = folderEntries.find(f => f.isFile && f.name == \"icons.json\");\n                            const iconsFolder = folderEntries.find(f => f.isDirectory && f.name == \"icons\");\n\n                            // icons.json found\n                            if(iconsJson && iconsFolder) {\n                                readFileEntry(iconsJson)\n                                    .then(ifstream => {\n                                        return (ifstream &&\n                                            ifstream.length &&\n                                            ifstream) !== \"\"\n                                            ? JSON.parse(ifstream) || []\n                                            : [];\n                                    })\n                                    .then(iconsArray => {\n                                        this.iconPack.iconsjson = iconsArray.map(item => ({\n                                            ...item,\n                                            path: Utils.getFilenameWithLowerCaseExtension(item.path),\n                                            name: Utils.getFilenameWithLowerCaseExtension(item.name)\n                                        }));\n                                        // icons.json parsed -> should be of type Array\n                                        GetFolderContents(iconsFolder, true).then(iconEntries => {\n                                            iconsArray.forEach(e => {\n                                                const icon = iconEntries.find(i => e.path == i.name);\n                                                if(icon) {\n                                                    const foundComplementaryPng = checkComplementaryIfGif(icon, iconEntries);\n                                                    getFileFromFileEntry(icon).then(e => {\n                                                        if(foundComplementaryPng) {\n                                                            getFileFromFileEntry(foundComplementaryPng).then(c => {\n                                                                e.thumbNail = c;\n                                                                this.addIconToIconPack(e);\n                                                            });\n                                                        } else {\n                                                            this.addIconToIconPack(e, true);\n                                                        }\n                                                    });\n                                                }\n                                            });\n                                        }\n                                        );\n                                    });\n                            } else if(iconsFolder) {\n                                // icons.json was not found\n                                dbgprintf(\"Note: Icons.json was not found... adding everything in the 'icons' folder\");\n                                GetFolderContents(iconsFolder, true).then(iconEntries => {\n                                    iconEntries.forEach(icon => {\n                                        checkComplementaryIfGif(icon, iconEntries);\n                                        getFileFromFileEntry(icon).then(e => {\n                                            this.addIconToIconPack(e);\n                                        }\n                                        );\n                                    });\n                                }\n                                );\n                            }\n                        });\n                    }).catch(err => {\n                        this.openConsole();\n                    });\n                    processed = true;\n                    break;\n                case \"json\":\n                    if(file.name == \"manifest.json\") {\n                        console.log(\n                            \"processFileTransfer: manifest....\",\n                            this.iconPack.manifest\n                        );\n                        this.iconPack.manifest.readFromFile(file);\n                    } else if(file.name == \"icons.json\") {\n                        console.log(\n                            \"processFileTransfer: icons.... ignoring...\",\n                            this.iconPack\n                        );\n                        this.iconPack.iconsjson = file;\n                    }\n                    processed = true;\n                    break;\n                case \"txt\":\n                    if(file.name == \"license.txt\") {\n                        this.iconPack.manifest.license = file;\n                    }\n                    processed = true;\n                    break;\n                default:\n                    break;\n            }\n\n            if(processed) return;\n\n            const efs = new ESDFileSelectorXX({ debug: true });\n            return efs.getDataTransferFiles(evt.dataTransfer, true).then(fileList => {\n                console.log(\"got datatransfer files:\", fileList);\n                // searchMeta returns TRUE, if only a single file was dropped and this file was not a directory\n                window.fileList = fileList;\n\n                if(!searchMeta(fileList)) {\n                    if(onlyMeta) {\n                        // something was dropped on either the icon, or manifest pane...\n                        return;\n                    }\n                    const hasDirs = fileList.find(f => f.isDirectory);\n                    this.infoMsg = \"loading...\";\n                    this.loading = hasDirs && hasDirs.length;\n\n                    setTimeout(() => {\n                        // we need some time to first read in the meta-files (if any)\n                        processFileTransfer(fileList, msg => {\n                            console.log(\"DONE processFileTransfer\", msg);\n\n                            this.loading = false;\n                            setTimeout(() => {\n                                this.infoMsg = \"\";\n                            }, 1000);\n                        }, this);\n                    }, 100);\n                }\n            });\n        },\n        isEditable(name) {\n            return [ \"fileName\", \"tags\" ].includes(name);\n        },\n\n        checkFileType(dtFiles, arr = [ 'png', 'jpg' ], which = 'preview') {\n            if(!dtFiles) return false;\n\n            const isAllowedFileType = (f) => {\n                return arr.some(s => f.name.toLowerCase().endsWith(s));\n            };\n\n            const found = !!Array.from(dtFiles).find(isAllowedFileType);\n            if(!found) {\n                let s = '';\n                if(arr.length > 2) {\n                    s = arr.join(', ').replace(/,([^,]*)$/, ' and $1');\n                } else {\n                    s = arr.join(' and ');\n                }\n\n                dbgprintf(`Only files of type ${s} are allowed as %s.`, which);\n                this.openConsole();\n                this.dbgScrollToView();\n                return false;\n            }\n            return true;\n        },\n\n        setIconPackIcon(evt) {\n\n            if(!this.checkFileType(evt.dataTransfer.files, [ 'png', 'jpg', 'svg' ], 'icon')) {\n                return;\n            }\n            this.iconPack.setIconPackIcon(evt);\n        },\n\n        addIconPackPreview(evt, i) {\n\n            if(evt.target.dataset && evt.target.dataset.index) {\n                const to = Number(evt.target.dataset.index);\n                let from = -1;\n                const htmlString = evt.dataTransfer.getData('text/html');\n                if(htmlString) {\n                    const tempEl = Utils.stringToHTMLDiv(htmlString);\n                    const imgEl = tempEl.querySelector('img');\n                    if(imgEl) {\n                        from = Number(imgEl.dataset.index);\n                        if(from > -1) {\n                            this.iconPack.swapPreviews(from, to);\n                        }\n                    }\n                }\n                if(from > -1) return;\n            }\n\n            if(!this.checkFileType(evt.dataTransfer.files)) {\n                return;\n            }\n\n            const idx = Number(evt.target.dataset.index || 0);\n            console.log(\"ippreview: addIconPackPreview: found index:\", idx);\n            const f = {\n                objectURL: URL.createObjectURL(evt.dataTransfer.files[ 0 ]),\n                file: evt.dataTransfer.files[ 0 ],\n                name: evt.dataTransfer.files[ 0 ].name\n            };\n\n            this.iconPack.addPreview(f, idx);\n        },\n\n        doExportIconPack() {\n            this.loading = true;\n            this.infoMsg = \"Preparing icon pack...\";\n            setTimeout(() => {\n                // exportIconPack();\n                this.iconPack.exportIconPack();\n            }, 150);\n        },\n\n        sortDuplicates() {\n            return this.duplicates.sort((a, b) => {\n                return a.fileName > b.fileName;\n            });\n        },\n\n        isFileAllowed(f, requiredMimeType = null) {\n            if(f) {\n                if(requiredMimeType && f.file) {\n                    return f.file.type.startsWith(requiredMimeType);\n                }\n                return MAllowedFileTypes.includes(f.suffix.toLowerCase());\n            }\n            return false;\n        },\n\n        checkFile(s) {\n            const f = {};\n            const fa = s.split(\".\");\n            f.suffix = fa.pop();\n            f.fileName = fa.join(\".\");\n            f.fileNameWithoutExtension = f.fileName;\n            return f;\n        },\n\n        packageFile(f) {\n            const fa = f.name.split(\".\");\n            f.suffix = fa.pop().toLowerCase();\n            f.fileName = fa.join(\".\");\n            f.fileNameWithoutExtension = f.fileName;\n            f.tags = \"\";\n            f.imageinfo = \"\";\n            f._status = { imageinfo: \"\", tips: {} };\n            f.isSelected = false;\n            f.isHidden = false;\n        },\n\n        checkDuplicate(f) {\n            return !!this.allIcons.find(\n                fl => fl.fileNameWithoutExtension == f.fileNameWithoutExtension\n            );\n        },\n\n        addIconToIconPack(f, dontBlock = false) {\n            const nameParts = f.name.split(\".\");\n            if(nameParts.length < 2) {\n                dbgprintf(\"No file-extension found for %s\", f.name);\n            }\n\n            f.name = Utils.getFilenameWithLowerCaseExtension(f.name);\n\n            f.suffix = nameParts.pop().toLowerCase();\n            f.fileName = nameParts.join(\".\");\n            f.fileNameWithoutExtension = f.fileName;\n            f.tags = \"\";\n            f.imageinfo = \"\";\n            f._status = { imageinfo: \"\", tips: {} };\n            f.isSelected = false;\n            f.isHidden = false;\n\n            if(this.isFileAllowed(f)) {\n                if(!f.objectURL) f.objectURL = URL.createObjectURL(f.file);\n\n                const suffixes = [ \"png\", \"svg\", \"jpg\", \"jpeg\", \"tiff\" ];\n                const reservedNames = [ \"icon\", \"cover\", \"thumbnail\", \"preview\" ];\n                const iconNames = suffixes.map(s => `icon.${s}`);\n                const coverNames = suffixes.map(s => `cover.${s}`);\n\n                // const reservedNamesArray = reservedNames.map(e => suffixes.map(s => `${e}.${s}`)).join(\",\").split(\",\");\n                const reservedNamesArray = [].concat(\n                    ...reservedNames.map(e => suffixes.map(s => `${e}.${s}`))\n                );\n\n                if(iconNames.includes(f.name.toLowerCase())) {\n                    this.iconPack.setIcon(f.file);\n                    return;\n                }\n\n                const existingDuplicate = this.allIcons.find(fl => fl.fileNameWithoutExtension == f.fileNameWithoutExtension ? fl : false);\n\n                if(!existingDuplicate) {\n                    if(f.suffix == \"gif\" && !f.thumbNail) {\n                        dbgprintf(`Creating complementary png for ${f.name} .`);\n                        f.thumbNail = \"data:image/svg+xml,%3Csvg width='144' height='144' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath fill='%23333336' d='M0 0h144v144H0z'/%3E%3Cg transform='translate(18 104)' fill='%23999999'%3E%3Ccircle cx='20' cy='10' r='6'/%3E%3Ccircle cx='54' cy='10' r='6'/%3E%3Ccircle cx='88' cy='10' r='6'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\";\n                    }\n                    this.allIcons.push(f);\n                    if(dontBlock) {\n                        this.iconPack.addIconT(f);\n                    } else {\n                        this.iconPack.addIcon(f);\n                    }\n                } else {\n                    this.duplicates.push(f);\n                }\n            }\n        },\n\n        tagClicked(t) {\n            if(this.selectedTags.includes(t)) {\n                const idx = this.selectedTags.indexOf(t);\n                var removed = this.selectedTags.splice(idx, 1);\n            } else {\n                this.selectedTags.push(t);\n            }\n        },\n        loadComponentData(componentData, obj) {\n            const typ = typeof componentData;\n            console.log(\"loadComponentData\", componentData, obj, typ);\n\n            if(typ === \"boolean\") {\n                this.sheetData = \"\";\n            } else if(typ === \"string\" && componentData.split(\".\").pop() == \"md\") {\n                if(this.sheetData === componentData) {\n                    this.sheetData = \"\";\n                    return this.loadComponentData(false);\n                }\n                console.warn(\"LOADCOMPONENTDATA - INDEX.HTML --- ANDY REMOVE\", componentData);\n                Utils.loadDataPromise(componentData, false).then(data => {\n                    this.setDynamicContent(MarkdownComponent, data);\n                    this.sheetData = componentData;\n                });\n            }\n        },\n        setIconPackIcons(data) {\n            this.setDynamicContent(\"minions-component\", data);\n        },\n        setDynamicContent(componentName, data) {\n            this.dynamicComponent = componentName;\n            this.dynamicData = data;\n        }\n    }\n};\n\nfunction searchMeta() {\n    console.log(\"************ SEARCHMETA CALLED\");\n}\n\nconst e2 = new ESDFileSelectorXX({\n    allowedFileTypes: [\n        '.gif',\n        '.pdf',\n        '.png',\n        '.jpg',\n        '.jpeg',\n        '.svg',\n        '.tif',\n        '.tiff',\n        '.json'\n    ],\n    includeObjectUrl: true\n});\n\nconst getDirectoryFromDirectoryEntry = (entry, dirName) => {\n    return new Promise((resolve, reject) => {\n        entry.getDirectory(dirName, {}, (dirEntry) => {\n            resolve(dirEntry);\n        }, (err) => {\n            reject([]);\n        });\n        return entry;\n    });\n};\n\nfunction processFileTransfer(fileList, _cb, me) {\n\n    console.log(\"+++++ processFileTransfer\", fileList);\n\n    const xx = fileList.map(f => {\n\n        // console.log(\"processFileTransfer___FILE:\", f);\n\n        if(!f.isDirectory && !f.suffix) {\n            const fa = f.name.split(\".\");\n            f.suffix = fa.pop();\n        }\n\n        if(f.file && f.suffix.toLowerCase() == 'json') {\n\n            if(f.file.name == 'manifest.json') {\n                // console.log(\"processFileTransfer: manifest....\", app.manifest);\n                app.iconPack.manifest.readFromFile(f.file);\n            } else if(f.file.name == 'icons.json') {\n                // console.log(\"processFileTransfer: icons.... ignoring...\", app.iconPack);\n                app.iconPack.iconsjson = f;\n            }\n        } else if(f.isDirectory) {\n\n            let previewsFolder;\n\n            if(f.name == 'previews') {\n                return e2.getFolderContents(f).then((dirFileList, i) => {\n                    dirFileList.forEach(p => {\n                        me.iconPack.addPreview(p);\n                    });\n                    return dirFileList;\n                });\n            }\n\n            const previewPromise = getDirectoryFromDirectoryEntry(f, 'previews').then(dirEntry => {\n                return e2.getFolderContents(dirEntry).then((dirFileList, i) => {\n                    dirFileList.forEach(p => {\n                        me.iconPack.addPreview(p);\n                    });\n                    return dirFileList;\n                });\n            }).catch(err => {\n                return [];\n            });\n\n            return previewPromise.then(previewFiles => {\n                //    console.log('previewFiles', previewFiles);\n                // const allP = e2.getFolderContents(f).then((dirFileList, i) => {\n                return e2.getFolderContents(f).then((dirFileList, i) => {\n\n                    // remove preview files from fileList\n                    dirFileList = dirFileList.filter(e => !previewFiles.some(p => p.uid == e.uid));\n\n                    const iconsjson = dirFileList.find(e => e.name.toLowerCase() === \"icons.json\");\n\n                    const loadFileData = (file, responseType = 'json', obj = {}) => {\n                        return Utils.fetchFile(file, responseType).then(data => {\n                            obj.data = data;\n                            return data;\n                        });\n                    };\n\n                    if(iconsjson) {\n                        console.log(\"******* ICONJSON FOUND\", iconsjson);\n                        loadFileData(iconsjson.file, 'json', iconsjson);\n                    }\n\n                    const manifestjson = dirFileList.find(e => e.name.toLowerCase() === \"manifest.json\");\n                    if(manifestjson) {\n                        loadFileData(manifestjson.file, 'json', manifestjson);\n                    }\n\n                    const license = dirFileList.find(e => e.name.toLowerCase() === \"license.txt\");\n                    if(license) {\n                        loadFileData(license.file, 'text', license);\n                    }\n\n                    const isIconRegex = new RegExp(`^icon.*\\.(${Object.values(MAllowedFileTypes).join('|')})$`, 'gi');\n                    const icon = dirFileList.find(e => isIconRegex.test(e.name.toLowerCase()));\n\n                    // const previewsFolder = dirFileList.find(e => e.name.toLowerCase() === \"previews\");\n                    const previews = dirFileList.filter(e => e.name.toLowerCase().startsWith('preview_'));\n                    previews.forEach(p => {\n                        me.iconPack.addPreview(p);\n                        Utils.removeFromArray(dirFileList, p);\n                    });\n\n\n                    const fldrs = dirFileList.find(e => e.file.isDirectory);\n                    console.log(\"++++++++ FOLDERS\", fldrs);\n                    window.dirFileList = dirFileList;\n\n                    console.log(\"-----previewsFolder\", previewsFolder);\n\n                    const gifs = dirFileList.filter(e => e.name.split('.').pop().toLowerCase() === 'gif');\n\n                    // if an icons.json file was in the dropped files, add it early to allow restoring of tags, curtom names, etc...\n                    if(iconsjson) {\n                        app.iconPack.iconsjson = iconsjson;\n                    }\n\n                    // remove meta-data\n                    dirFileList = dirFileList.filter(e => e.name.toLowerCase() !== \"icons.json\");\n                    dirFileList = dirFileList.filter(e => e.name.toLowerCase() !== \"manifest.json\");\n                    // dirFileList = dirFileList.filter(e => e.name.split('.').pop().toLowerCase() !== 'gif');\n                    dirFileList = dirFileList.filter(e => !e.name.toLowerCase().endsWith('.gif'));\n\n                    // dirFileList = dirFileList.filter(e => e.name.toLowerCase() !== \"previews\");\n                    // dirFileList = dirFileList.filter(e => !e.fullPath.startsWith('com.elgato.demoalltypes.sdIconPack/previews/'));\n\n\n                    // first add found gifs to the icon pack, because they need additional thumnail pngs\n                    gifs.forEach(f => {\n                        app.addIconToIconPack(f);\n                    });\n\n                    dirFileList.forEach(f => {\n                        app.addIconToIconPack(f);\n                    });\n\n                    if(manifestjson) {\n                        app.iconPack.manifest.readFromFile(manifestjson);\n                    }\n                    if(license) {\n                        // console.log('adding license', license);\n                        app.iconPack.manifest.license = license;\n                    }\n\n                    app.sortDuplicates();\n                    // console.log(\"processFileTransfer:getFolderContents::DONE\", Date.now() - tt);\n\n                    if(_cb) _cb(dirFileList);\n\n                    /* END getFolderContents*/\n\n                    console.dir({ icon, iconsjson, manifestjson, license, previewsFolder, previews });\n\n\n                    return { icon, iconsjson, manifestjson, license, gifs, previews, previewsFolder };\n\n                }).then(d => {\n                    console.log(\"++++++++++ **** ALL LOADED ****\", d);\n                });\n            });\n\n            return allP;\n\n            // });  //end readEntries\n        } else { //check single files\n            if(MAllowedFileTypes.includes(f.suffix.toLowerCase())) {\n                app.addIconToIconPack(f);\n                return Promise.resolve(f);\n            }\n            return Promise.resolve(null);\n        }\n    });\n\n    if(_cb) _cb(fileList);\n\n}\n</script>","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--13-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--13-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=36eff6bf\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","/* eslint-disable */\nStorage.prototype.setObject = function(key, value) {\n    this.setItem(key, JSON.stringify(value));\n};\n\nStorage.prototype.getObject = function(key) {\n    var value = this.getItem(key);\n    return value && JSON.parse(value);\n};\n\nimport Vue from 'vue';\nVue.config.debug = false;\nVue.config.productionTip = true;\n\nimport {startDragAndDropForElement} from './js/ESDDrag.js';\nimport './css/index.css';\n\nimport App from './App.vue';\nimport Utils from './js/utils';\nimport { checkUID } from './js/checkUID.js';\nimport { CHECKUID_FORCE_LOWERCASE } from \"./js/constants.js\";\n\nwindow.startDragAndDropForElement = startDragAndDropForElement;\n\nVue.filter('capitalize', function(value) {\n    if(!value) return '';\n    value = value.toString();\n    return value.charAt(0).toUpperCase() + value.slice(1);\n});\n\nVue.filter('kb', val => {\n    return Math.floor(val / 1024);\n});\n\nVue.filter('removeSpecials', val => {\n    return checkUID(val, CHECKUID_FORCE_LOWERCASE);\n});\n\n/** try:\noma, ,, opa, o p A, OpA\n=> should result in 'oma,opa'\n*/\nVue.filter('tagify', function(value) {\n    if(!value) return '';\n    const arr = value.toLowerCase().split(',').filter(e => e.length).map(s => s.trim().replace(/[^a-z0-9]/gi, '')); //make lowercase , filter empty values and trim\n    const tagSet = new Set(arr);  // remove duplicates\n    return Array.from(tagSet).join(','); // convert array to comma separated string\n});\n\n\nVue.directive('esddrop', {\n    bind: function(el, binding, vnode) {\n        if(false) {\n            console.log(\"esdrop-bind:\", el, binding, vnode, \"binding value-type:\", typeof binding.value);\n            const s = (x) => console.log(`binding-${x}`, binding[x]);\n            s('name');\n            s('value');\n            s('expression');\n            s('arg');\n            s('modifiers');\n        }\n        if(typeof binding.value == 'object') {\n            el.fn = binding.value.fn;\n            el.args = binding.value.args;\n        } else {\n            el.fn = binding.value;\n        }\n    },\n    // update: function(el, binding, vnode) {\n    //     console.log(\"element was updated: \", el, binding, vnode)\n    // },\n    // When the bound element is inserted into the DOM...\n    inserted: function(el) {\n        //   console.log(\"esdrop-bind was inserted\", el);\n\n        const dragCallback = (evt, msg) => {\n            var items = evt.dataTransfer.items;\n            var files = evt.dataTransfer.files;\n            if(items || files) {\n                console.log('dragCallback:', msg, el, files, items);\n            }\n        };\n\n        const interceptDragHilite = (evt, msg) => {\n            return app.dragging;\n        };\n\n        startDragAndDropForElement(el, (evt) => {\n            let internalDrag = false;\n            var items = evt.dataTransfer.items;\n            const dt = evt.dataTransfer;\n            if(!internalDrag && el.fn && typeof el.fn == 'function') {\n                el.fn(evt, el.args);\n            }\n        }, interceptDragHilite\n        );\n    }\n});\n\nVue.mixin({\n    created: function() { // don't use arrow-fn, to get the components 'this'\n        const tagDef = this.$options._componentTag || location.pathname.split(\"/\").pop() || \"root\";\n        const tagClr = Utils && Utils.colorFromString ? Utils.colorFromString(tagDef) : 'ccee00';\n        const tag = `%c[${tagDef}]`;\n        let css = `color:#${tagClr};`;\n        let warncss = `font-size: 1.2em; background-color: red; color:white;`;\n\n        if(!this.debug) {\n            this.debug = false;\n        }\n\n        if(this.hasOwnProperty('debugOptions')) {\n            css = Object.entries(this.debugOptions).map(d => `${d[0]}:${d[1]}`).join(\";\");\n        }\n        // this.debug = false;\n        this.dbg = this.debug ? console.log.bind(window.console, tag, css) : () => {};\n        this.warn = this.debug ? console.warn.bind(window.console, tag, css) : () => {};\n        this.error = this.debug ? console.warn.bind(window.console, tag, warncss) : () => {};\n        this.__assert = console.assert.bind(window.console, false, tag, `color:#ffee00`);\n        this.assert = this.debug ? (...parms) => {\n            // if(!parms.shift()) this.__assert(...parms);\n            if(!parms.shift()) this.warn(...parms);\n        } : () => {};\n    },\n    // methods: {\n    //     hello: function(msg) {\n    //         console.log(\"MIXIN::\", msg || 'hello from mixin!', document.querySelectorAll(\".esd-dropzone\"));\n    //     },\n    // }\n});\n\nconst vm = new Vue({\n    render: h => h(App),\n}).$mount('#app');\n\nwindow.vm = vm;","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./json-component.vue?vue&type=style&index=0&id=7e90d5a8&prod&scoped=true&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./head-component.vue?vue&type=style&index=0&id=e1e543b0&prod&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./info-component.vue?vue&type=style&index=0&id=2f3de767&prod&lang=css\""],"sourceRoot":""}