app-builder-lib 26.13.0 → 26.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/helpers/dynamic-import.js +24 -7
- package/out/asar/asarFileChecker.js.map +1 -1
- package/out/codeSign/windowsSignToolManager.d.ts +2 -0
- package/out/codeSign/windowsSignToolManager.js +7 -0
- package/out/codeSign/windowsSignToolManager.js.map +1 -1
- package/out/index.d.ts +2 -1
- package/out/index.js +3 -1
- package/out/index.js.map +1 -1
- package/out/node-module-collector/moduleManager.d.ts +9 -1
- package/out/node-module-collector/moduleManager.js +86 -55
- package/out/node-module-collector/moduleManager.js.map +1 -1
- package/out/node-module-collector/nodeModulesCollector.d.ts +6 -0
- package/out/node-module-collector/nodeModulesCollector.js +41 -22
- package/out/node-module-collector/nodeModulesCollector.js.map +1 -1
- package/out/node-module-collector/pnpmNodeModulesCollector.js +7 -5
- package/out/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
- package/out/options/macOptions.d.ts +29 -0
- package/out/options/macOptions.js.map +1 -1
- package/out/platformPackager.d.ts +1 -5
- package/out/platformPackager.js +9 -31
- package/out/platformPackager.js.map +1 -1
- package/out/targets/LinuxTargetHelper.d.ts +1 -1
- package/out/targets/LinuxTargetHelper.js.map +1 -1
- package/out/targets/appimage/appImageUtil.d.ts +2 -2
- package/out/targets/appimage/appImageUtil.js.map +1 -1
- package/out/targets/blockmap/blockmap.d.ts +16 -0
- package/out/targets/blockmap/blockmap.js +149 -0
- package/out/targets/blockmap/blockmap.js.map +1 -0
- package/out/targets/differentialUpdateInfoBuilder.js +3 -3
- package/out/targets/differentialUpdateInfoBuilder.js.map +1 -1
- package/out/targets/nsis/NsisTarget.js +28 -8
- package/out/targets/nsis/NsisTarget.js.map +1 -1
- package/out/targets/nsis/nsisValidation.d.ts +18 -0
- package/out/targets/nsis/nsisValidation.js +53 -0
- package/out/targets/nsis/nsisValidation.js.map +1 -0
- package/out/toolsets/icons.d.ts +8 -0
- package/out/toolsets/icons.js +37 -0
- package/out/toolsets/icons.js.map +1 -0
- package/out/util/config/config.js +6 -7
- package/out/util/config/config.js.map +1 -1
- package/out/util/config/schemaValidator.d.ts +7 -0
- package/out/util/config/schemaValidator.js +154 -0
- package/out/util/config/schemaValidator.js.map +1 -0
- package/out/util/iconConverter.d.ts +25 -0
- package/out/util/iconConverter.js +260 -0
- package/out/util/iconConverter.js.map +1 -0
- package/out/util/resEdit.js +16 -15
- package/out/util/resEdit.js.map +1 -1
- package/out/version.d.ts +1 -1
- package/out/version.js +1 -1
- package/out/version.js.map +1 -1
- package/out/winPackager.d.ts +1 -0
- package/out/winPackager.js +12 -9
- package/out/winPackager.js.map +1 -1
- package/package.json +9 -8
- package/scheme.json +14 -0
- package/templates/linux/after-remove.tpl +14 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinuxTargetHelper.js","sourceRoot":"","sources":["../../src/targets/LinuxTargetHelper.ts"],"names":[],"mappings":";;;AAAA,+CAA+F;AAC/F,+DAAiD;AACjD,uCAAqC;AACrC,uCAA+B;AAC/B,+BAA2B;AAC3B,iCAAgC;AAMhC,0CAA0C;AAC1C,kDAAkD;AAClD,kDAAkD;AAElD;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AACvG,CAAC;AAED;;;;;;GAMG;AACH,MAAM,gBAAgB,GAAG,uBAAuB,CAAA;AAEhD;;;;;;;;;;;;;;GAcG;AACH,SAAS,oBAAoB,CAAC,GAAW;IACvC,oEAAoE;IACpE,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,qEAAqE;IACrE,IAAI,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAA;IAC/D,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,SAAS,yBAAyB,CAAC,KAA0C;IAC3E,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAEY,QAAA,aAAa,GAAG,MAAM,CAAA;AAEnC,MAAa,iBAAiB;IAO5B,YAAoB,QAAuB;QAAvB,aAAQ,GAAR,QAAQ,CAAe;QAN1B,gBAAW,GAAG,IAAI,eAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAA;QAExD,yBAAoB,GAAG,IAAI,eAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAA;QAEnF,gBAAW,GAAkB,IAAI,CAAA;IAEa,CAAC;IAE/C,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAA;IAC/B,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAA;IACxC,CAAC;IAED,8DAA8D;IAC9D,WAAW;QACT,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAA;QAC5D,IAAI,SAAS,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;YAC5C,kBAAG,CAAC,IAAI,CAAC,6IAA6I,CAAC,CAAA;QACzJ,CAAC;QAED,yFAAyF;QACzF,2FAA2F;QAC3F,qFAAqF;QACrF,+FAA+F;QAC/F,6FAA6F;QAC7F,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,YAAY,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,4BAA4B,CAAA;QACrG,MAAM,gBAAgB,GAAG,EAAE,GAAG,YAAY,EAAE,WAAW,EAAE,yBAAyB,CAAC,gBAAgB,CAAC,EAAE,CAAA;QAEtG,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAA;YAC3B,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;YACrC,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,QAAQ,CAAC;gBACd,KAAK,QAAQ,CAAC;gBACd,KAAK,QAAQ;oBACX,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC,OAAO,CAAC,EAAE,CAAC;wBACvD,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC,cAAc,CAAC,EAAE,CAAC;4BAC9D,MAAM,IAAI,wCAAyB,CAAC,2EAA2E,CAAC,CAAA;wBAClH,CAAC;wBACD,kBAAG,CAAC,IAAI,CAAC,IAAI,EAAE,gFAAgF,CAAC,CAAA;oBAClG,CAAC;oBACD,OAAO,IAAI,2BAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAA,iCAAU,EAAC,EAAE,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAA;gBAC9G,KAAK,QAAQ;oBACX,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACxD,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC,QAAQ,CAAC,EAAE,CAAC;4BACxD,MAAM,IAAI,wCAAyB,CAAC,8DAA8D,CAAC,CAAA;wBACrG,CAAC;wBACD,kBAAG,CAAC,IAAI,CAAC,IAAI,EAAE,mEAAmE,CAAC,CAAA;oBACrF,CAAC;oBACD,OAAO,IAAI,mBAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAA,iCAAU,EAAC,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAA;gBACvF,KAAK,QAAQ;oBACX,oEAAoE;oBACpE,OAAO,IAAI,2BAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;YAC1E,CAAC;QACH,CAAC;QAED,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;YACvB,kBAAG,CAAC,IAAI,CACN;gBACE,MAAM,EAAE,oCAAoC;gBAC5C,IAAI,EAAE,sCAAsC;aAC7C,EACD,sGAAsG,CACvG,CAAA;QACH,CAAC;QACD,OAAO,IAAI,2BAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAA,iCAAU,EAAC,EAAE,EAAE,gBAAgB,EAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,EAAE,CAAC,CAAC,CAAA;IACpG,CAAC;IAED,mCAAmC,CAAC,OAAe,EAAE,QAAiB;QACpE,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAA;QAC5D,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACxD,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,CAAA;IAC7C,CAAC;IAEO,KAAK,CAAC,oBAAoB;QAChC,MAAM,KAAK,GAAkB,EAAE,CAAA;QAC/B,KAAK,MAAM,eAAe,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YAC7D,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;gBAC9B,SAAQ;YACV,CAAC;YAED,MAAM,IAAI,GAAG,oBAAoB,eAAe,CAAC,QAAQ;qBAC1C,eAAe,CAAC,GAAG;MAClC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,eAAe,CAAC,WAAW,YAAY,CAAC,CAAC,CAAC,EAAE;;aAE/E,CAAA;YACP,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClB,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;QACpD,MAAM,IAAA,qBAAU,EACd,IAAI,EACJ,qHAAqH,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAC5J,CAAA;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,sFAAsF;IAC9E,KAAK,CAAC,mBAAmB;;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC9B,MAAM,EAAE,4BAA4B,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAA;QAEzD,MAAM,OAAO,GAAG,CAAC,4BAA4B,CAAC,IAAI,EAAE,MAAA,MAAA,MAAM,CAAC,GAAG,0CAAE,IAAI,mCAAI,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAa,CAAA;QAErH,wGAAwG;QACxG,IAAI,eAAe,GAAG,CAAC,GAAG,IAAA,sBAAO,EAAC,QAAQ,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAA;QACtE,MAAM,cAAc,GAAG,MAAA,MAAM,CAAC,WAAW,0CAAE,cAAc,CAAA;QACzD,IAAI,cAAc,IAAI,CAAC,MAAM,IAAA,qBAAM,EAAC,IAAA,WAAI,EAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,eAAe,GAAG,CAAC,cAAc,EAAE,GAAG,eAAe,CAAC,CAAA;QACxD,CAAC;QAED,yEAAyE;QACzE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,CAAA;QAC1E,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;QAEjD,8DAA8D;QAC9D,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;IAC5D,CAAC;IAED,cAAc,CAAC,OAA2B;QACxC,OAAO,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAA;IACjE,CAAC;IAED,mBAAmB,CAAC,MAAc;QAChC,MAAM,EACJ,OAAO,EAAE,EAAE,OAAO,EAAE,GACrB,GAAG,IAAI,CAAC,QAAQ,CAAA;QACjB,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,QAAQ;gBACX,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;YACnC,KAAK,KAAK,CAAC;YACX,KAAK,KAAK;gBACR,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;YACnC;gBACE,OAAO,OAAO,CAAA;QAClB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,qBAAyC,EAAE,IAAa,EAAE,WAA2B,EAAE,KAA8B;QAC3I,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QAC/E,MAAM,IAAI,GAAG,WAAW,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,UAAU,CAAC,CAAC,CAAA;QACjH,MAAM,IAAA,qBAAU,EAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC5B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,mBAAmB,CAAC,qBAAyC,EAAE,IAAa,EAAE,KAA8B;;QAC1G,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;QAC5C,CAAC;QACD,oEAAoE;QACpE,IAAI,MAAA,MAAA,qBAAqB,CAAC,OAAO,0CAAE,KAAK,0CAAE,IAAI,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAA;QACzG,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC9B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAA;QAEhC,MAAM,cAAc,GAAG,qBAAqB,CAAC,cAAc,CAAA;QAC3D,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,IAAI,GAAG,GAAG,qBAAa,IAAI,OAAO,CAAC,oBAAoB,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAA;YACpF,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,IAAI,GAAG,IAAI,IAAI,GAAG,CAAA;YACpB,CAAC;YACD,IAAI,cAAc,EAAE,CAAC;gBACnB,IAAI,IAAI,GAAG,CAAA;gBACX,sEAAsE;gBACtE,wEAAwE;gBACxE,IAAI,IAAI,cAAc,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC5D,CAAC;YACD,0GAA0G;YAC1G,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;YAC1C,IAAI,cAAc,IAAI,IAAI,IAAI,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC9F,IAAI,IAAI,KAAK,CAAA;YACf,CAAC;QACH,CAAC;QAED,oEAAoE;QACpE,uFAAuF;QACvF,mHAAmH;QACnH,MAAM,kBAAkB,GAAG,MAAA,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,0CAAE,IAAI,EAAE,CAAA;QACrE,MAAM,OAAO,GAAG,CAAC,IAAA,8BAAe,EAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAA;QAEzH,MAAM,WAAW,GAAG,IAAA,iCAAU,EAC5B;YACE,sEAAsE;YACtE,0EAA0E;YAC1E,+DAA+D;YAC/D,IAAI,EAAE,mBAAmB,CAAC,OAAO,CAAC,WAAW,CAAC;YAC9C,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,QAAQ,CAAC,cAAc;YAC7B,mGAAmG;YACnG,qFAAqF;YACrF,iFAAiF;YACjF,iEAAiE;YACjE,oDAAoD;YACpD,0CAA0C;YAC1C,2FAA2F;YAC3F,cAAc,EAAE,mBAAmB,CAAC,OAAO,CAAC;SAC7C,EACD,KAAK,EACL,MAAA,MAAA,qBAAqB,CAAC,OAAO,0CAAE,KAAK,mCAAI,EAAE,CAC3C,CAAA;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAA;QAC9D,IAAI,CAAC,IAAA,8BAAe,EAAC,WAAW,CAAC,EAAE,CAAC;YAClC,WAAW,CAAC,OAAO,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAA;QACxD,CAAC;QAED,MAAM,SAAS,GAAkB,IAAA,sBAAO,EAAC,qBAAqB,CAAC,SAAS,CAAC,CAAA;QACzE,KAAK,MAAM,eAAe,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YACxD,IAAI,eAAe,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACrC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,IAAA,sBAAO,EAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,IAAA,sBAAO,EAAC,QAAQ,CAAC,4BAA4B,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YAC3H,KAAK,MAAM,MAAM,IAAI,IAAA,sBAAO,EAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/C,SAAS,CAAC,IAAI,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAA;YAC9C,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,WAAW,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;QAClD,CAAC;QAED,IAAI,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,CAAA;QAC7C,IAAI,IAAA,8BAAe,EAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAA;YACxD,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;gBACxB,QAAQ,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAA;YAC5C,CAAC;YAED,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACrB,6DAA6D;gBAC7D,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;oBACxB,kBAAG,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,EAAE,wGAAwG,CAAC,CAAA;gBACrI,CAAC;gBACD,kBAAG,CAAC,IAAI,CACN;oBACE,MAAM,EAAE,qDAAqD;oBAC7D,IAAI,EAAE,kCAAkC;iBACzC,EACD,wDAAwD,CACzD,CAAA;gBACD,QAAQ,GAAG,SAAS,CAAA;YACtB,CAAC;QACH,CAAC;QACD,WAAW,CAAC,UAAU,GAAG,GAAG,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;QAE1E,IAAI,IAAI,GAAG,iBAAiB,CAAA;QAC5B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5C,IAAI,IAAI,KAAK,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAA;QAC1C,CAAC;QACD,IAAI,IAAI,IAAI,CAAA;QACZ,MAAM,cAAc,GAAG,MAAA,MAAA,qBAAqB,CAAC,OAAO,0CAAE,cAAc,mCAAI,EAAE,CAAA;QAC1E,KAAK,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;gBACtC,SAAQ;YACV,CAAC;YACD,IAAI,IAAI,qBAAqB,UAAU,GAAG,CAAA;YAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,EAAE,CAAC;gBACxD,IAAI,IAAI,KAAK,GAAG,IAAI,KAAK,EAAE,CAAA;YAC7B,CAAC;YACD,IAAI,IAAI,IAAI,CAAA;QACd,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;CACF;AAvRD,8CAuRC;AAED,MAAM,kBAAkB,GAAQ;IAC9B,qCAAqC,EAAE,UAAU;IACjD,qCAAqC,EAAE,aAAa;IACpD,+BAA+B,EAAE,WAAW;IAC5C,2BAA2B,EAAE,MAAM;IACnC,2BAA2B,EAAE,kBAAkB;IAC/C,+BAA+B,EAAE,SAAS;IAC1C,uCAAuC,EAAE,cAAc;IACvD,6BAA6B,EAAE,gBAAgB;IAC/C,2BAA2B,EAAE,kBAAkB;CAChD,CAAA","sourcesContent":["import { asArray, exists, InvalidConfigurationError, isEmptyOrSpaces, log } from \"builder-util\"\nimport { deepAssign } from \"builder-util-runtime\"\nimport { outputFile } from \"fs-extra\"\nimport { Lazy } from \"lazy-val\"\nimport { join } from \"path\"\nimport * as semver from \"semver\"\nimport { CompressionLevel } from \"../core\"\nimport { LinuxPackager } from \"../linuxPackager\"\nimport { CommonLinuxOptions } from \"../options/linuxOptions\"\nimport { IconInfo } from \"../platformPackager\"\nimport { SnapCore } from \"./snap/SnapTarget\"\nimport { SnapCore24 } from \"./snap/core24\"\nimport { SnapCoreCustom } from \"./snap/coreCustom\"\nimport { SnapCoreLegacy } from \"./snap/coreLegacy\"\n\n/**\n * Escape a string value for use in a freedesktop .desktop file string field\n * (Name, Comment, StartupWMClass, etc.).\n *\n * The freedesktop Desktop Entry Specification requires that the following\n * characters be escaped in string / localestring values:\n * \\n → \\\\n (newline — would inject new key=value lines otherwise)\n * \\r → \\\\r\n * \\t → \\\\t\n * \\\\ → \\\\\\\\\n *\n * Without escaping, a productName or description containing a literal newline\n * can inject arbitrary key=value pairs into the generated .desktop file,\n * potentially overriding the Exec key.\n *\n * @see https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#value-types\n */\nfunction desktopStringEscape(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/\\t/g, \"\\\\t\")\n}\n\n/**\n * Characters that require an Exec argument to be double-quoted per the\n * freedesktop Desktop Entry Specification. Plain alphanumeric args and\n * field codes must NOT be wrapped in quotes.\n *\n * @see https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables\n */\nconst EXEC_RESERVED_RE = /[\\s\"'`\\\\<>~|&;$*?#()]/\n\n/**\n * Quote a single argument for use in a .desktop file Exec key.\n *\n * Field codes (`%f`, `%u`, `%F`, `%U`, etc.) MUST be left unquoted — the\n * desktop launcher only expands them in unquoted token positions. Wrapping\n * them in `\"…\"` causes the launcher to treat them as literal strings, which\n * breaks file-association / drag-and-drop functionality.\n *\n * For all other arguments, double-quoting is used when the argument contains\n * any character that would be misinterpreted by the launcher without quoting\n * (spaces, shell metacharacters, etc.). Safe plain-word args are passed\n * through unchanged to keep the Exec line readable.\n *\n * @see https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables\n */\nfunction desktopExecArgEscape(arg: string): string {\n // Field codes (%f, %u, %F, %U, %i, %c, %k, …) must never be quoted.\n if (/^%[a-zA-Z]$/.test(arg)) {\n return arg\n }\n // Only quote when the arg actually contains characters that need it.\n if (EXEC_RESERVED_RE.test(arg)) {\n return `\"${arg.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`\n }\n return arg\n}\n\nfunction mapLinuxCompressionToSnap(level: CompressionLevel | null | undefined): \"xz\" | \"lzo\" | undefined {\n if (level === \"store\") {\n return \"lzo\"\n }\n if (level === \"maximum\") {\n return \"xz\"\n }\n return undefined\n}\n\nexport const installPrefix = \"/opt\"\n\nexport class LinuxTargetHelper {\n private readonly iconPromise = new Lazy(() => this.computeDesktopIcons())\n\n private readonly mimeTypeFilesPromise = new Lazy(() => this.computeMimeTypeFiles())\n\n maxIconPath: string | null = null\n\n constructor(private packager: LinuxPackager) {}\n\n get icons(): Promise<Array<IconInfo>> {\n return this.iconPromise.value\n }\n\n get mimeTypeFiles(): Promise<string | null> {\n return this.mimeTypeFilesPromise.value\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getSnapCore(): SnapCore<any> {\n const { snapcraft, snap: legacySnap } = this.packager.config\n if (snapcraft != null && legacySnap != null) {\n log.warn(\"Both `snapcraft` and `snap` configurations are present. `snapcraft` takes precedence; please remove the `snap` key to silence this warning.\")\n }\n\n // Merge linux-level options (category, description, mimeTypes, etc.) as the base so they\n // propagate into the generated snapcraft.yaml and .desktop file without requiring users to\n // duplicate them under core24/core18/etc. Per-core options always win for conflicts.\n // linux.compression is a CompressionLevel (\"store\"/\"normal\"/\"maximum\"); snap compression is an\n // algorithm (\"xz\"/\"lzo\"). Map the level to the nearest algorithm; per-core options override.\n const { compression: linuxCompression, ...linuxOptions } = this.packager.platformSpecificBuildOptions\n const snapLinuxOptions = { ...linuxOptions, compression: mapLinuxCompressionToSnap(linuxCompression) }\n\n if (snapcraft != null) {\n const core = snapcraft.base\n const options = snapcraft[core] || {}\n switch (core) {\n case \"core18\":\n case \"core20\":\n case \"core22\":\n if (!this.isElectronVersionGreaterOrEqualThan(\"4.0.0\")) {\n if (!this.isElectronVersionGreaterOrEqualThan(\"2.0.0-beta.1\")) {\n throw new InvalidConfigurationError(\"Electron 2 and higher is required to build Snap with core18/core20/core22\")\n }\n log.warn(null, \"electron 4 and higher is highly recommended for Snap with core18/core20/core22\")\n }\n return new SnapCoreLegacy(this.packager, this, deepAssign({}, snapLinuxOptions, { base: core, ...options }))\n case \"core24\":\n if (!this.isElectronVersionGreaterOrEqualThan(\"28.0.0\")) {\n if (!this.isElectronVersionGreaterOrEqualThan(\"25.0.0\")) {\n throw new InvalidConfigurationError(\"Electron 25 and higher is required to build Snap with core24\")\n }\n log.warn(null, \"electron 28 and higher is highly recommended for Snap with core24\")\n }\n return new SnapCore24(this.packager, this, deepAssign({}, snapLinuxOptions, options))\n case \"custom\":\n // Pass-through: do not inject linux options into user-supplied yaml\n return new SnapCoreCustom(this.packager, this, snapcraft.custom || {})\n }\n }\n\n if (legacySnap != null) {\n log.warn(\n {\n reason: \"`snap` configuration is deprecated\",\n docs: \"https://www.electron.build/snapcraft\",\n },\n \"please consider migrating `snap` configuration to `snapcraft.<core>` and remove `snap` configuration\"\n )\n }\n return new SnapCoreLegacy(this.packager, this, deepAssign({}, snapLinuxOptions, legacySnap ?? {}))\n }\n\n isElectronVersionGreaterOrEqualThan(version: string, fallback?: string): boolean {\n const electronVersion = this.packager.config.electronVersion\n if (!electronVersion) {\n return fallback ? semver.gte(fallback, version) : true\n }\n return semver.gte(electronVersion, version)\n }\n\n private async computeMimeTypeFiles(): Promise<string | null> {\n const items: Array<string> = []\n for (const fileAssociation of this.packager.fileAssociations) {\n if (!fileAssociation.mimeType) {\n continue\n }\n\n const data = `<mime-type type=\"${fileAssociation.mimeType}\">\n <glob pattern=\"*.${fileAssociation.ext}\"/>\n ${fileAssociation.description ? `<comment>${fileAssociation.description}</comment>` : \"\"}\n <icon name=\"x-office-document\" />\n</mime-type>`\n items.push(data)\n }\n\n if (items.length === 0) {\n return null\n }\n\n const file = await this.packager.getTempFile(\".xml\")\n await outputFile(\n file,\n '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n<mime-info xmlns=\"http://www.freedesktop.org/standards/shared-mime-info\">\\n' + items.join(\"\\n\") + \"\\n</mime-info>\"\n )\n return file\n }\n\n // must be name without spaces and other special characters, but not product name used\n private async computeDesktopIcons(): Promise<Array<IconInfo>> {\n const packager = this.packager\n const { platformSpecificBuildOptions, config } = packager\n\n const sources = [platformSpecificBuildOptions.icon, config.mac?.icon ?? config.icon].filter(str => !!str) as string[]\n\n // If no explicit sources are defined, fallback to buildResources directory, then default framework icon\n let fallbackSources = [...asArray(packager.getDefaultFrameworkIcon())]\n const buildResources = config.directories?.buildResources\n if (buildResources && (await exists(join(buildResources, \"icons\")))) {\n fallbackSources = [buildResources, ...fallbackSources]\n }\n\n // need to put here and not as default because need to resolve image size\n const result = await packager.resolveIcon(sources, fallbackSources, \"set\")\n this.maxIconPath = result[result.length - 1].file\n\n // Ignore .icon files for linux (they are exclusive for macOS)\n return result.filter(icon => !icon.file.endsWith(\".icon\"))\n }\n\n getDescription(options: CommonLinuxOptions) {\n return options.description || this.packager.appInfo.description\n }\n\n getSanitizedVersion(target: string) {\n const {\n appInfo: { version },\n } = this.packager\n switch (target) {\n case \"pacman\":\n return version.replace(/-/g, \"_\")\n case \"rpm\":\n case \"deb\":\n return version.replace(/-/g, \"~\")\n default:\n return version\n }\n }\n\n async writeDesktopEntry(targetSpecificOptions: CommonLinuxOptions, exec?: string, destination?: string | null, extra?: Record<string, string>): Promise<string> {\n const data = await this.computeDesktopEntry(targetSpecificOptions, exec, extra)\n const file = destination || (await this.packager.getTempFile(`${this.packager.appInfo.productFilename}.desktop`))\n await outputFile(file, data)\n return file\n }\n\n computeDesktopEntry(targetSpecificOptions: CommonLinuxOptions, exec?: string, extra?: Record<string, string>): Promise<string> {\n if (exec != null && exec.length === 0) {\n throw new Error(\"Specified exec is empty\")\n }\n // https://github.com/electron-userland/electron-builder/issues/3418\n if (targetSpecificOptions.desktop?.entry?.Exec) {\n throw new Error(\"Please specify executable name as linux.executableName instead of linux.desktop.Exec\")\n }\n\n const packager = this.packager\n const appInfo = packager.appInfo\n\n const executableArgs = targetSpecificOptions.executableArgs\n if (exec == null) {\n exec = `${installPrefix}/${appInfo.sanitizedProductName}/${packager.executableName}`\n if (!/^[/0-9A-Za-z._-]+$/.test(exec)) {\n exec = `\"${exec}\"`\n }\n if (executableArgs) {\n exec += \" \"\n // Each arg is double-quoted per the freedesktop Exec key spec so that\n // spaces, $, ;, & and other reserved characters are not misinterpreted.\n exec += executableArgs.map(desktopExecArgEscape).join(\" \")\n }\n // https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables\n const execCodes = [\"%f\", \"%u\", \"%F\", \"%U\"]\n if (executableArgs == null || executableArgs.findIndex(arg => execCodes.includes(arg)) === -1) {\n exec += \" %U\"\n }\n }\n\n // https://github.com/electron-userland/electron-builder/issues/9103\n // Electron derives app_id from desktopName in package.json; StartupWMClass must match.\n // https://github.com/electron/electron/blob/9a7b73b5334f1d72c08e2d5e94106706ed751186/lib/browser/init.ts#L128-L133\n const trimmedDesktopName = packager.info.metadata.desktopName?.trim()\n const wmClass = !isEmptyOrSpaces(trimmedDesktopName) ? trimmedDesktopName.replace(/\\.desktop$/, \"\") : appInfo.productName\n\n const desktopMeta = deepAssign<any>(\n {\n // String values are escaped per the freedesktop spec (\\\\, \\n, \\r, \\t)\n // so that a product name containing a newline cannot inject new key=value\n // pairs into the .desktop file (e.g. overriding the Exec key).\n Name: desktopStringEscape(appInfo.productName),\n Exec: exec,\n Terminal: \"false\",\n Type: \"Application\",\n Icon: packager.executableName,\n // https://askubuntu.com/questions/367396/what-represent-the-startupwmclass-field-of-a-desktop-file\n // Set to desktopName (minus .desktop suffix) when provided, so it matches Electron's\n // app_id and desktop environments can associate running windows with this entry.\n // Falls back to productName for apps that don't set desktopName.\n // to get WM_CLASS of running window: xprop WM_CLASS\n // StartupWMClass doesn't work for unicode\n // https://github.com/electron/electron/blob/2-0-x/atom/browser/native_window_views.cc#L226\n StartupWMClass: desktopStringEscape(wmClass),\n },\n extra,\n targetSpecificOptions.desktop?.entry ?? {}\n )\n\n const description = this.getDescription(targetSpecificOptions)\n if (!isEmptyOrSpaces(description)) {\n desktopMeta.Comment = desktopStringEscape(description)\n }\n\n const mimeTypes: Array<string> = asArray(targetSpecificOptions.mimeTypes)\n for (const fileAssociation of packager.fileAssociations) {\n if (fileAssociation.mimeType != null) {\n mimeTypes.push(fileAssociation.mimeType)\n }\n }\n\n for (const protocol of asArray(packager.config.protocols).concat(asArray(packager.platformSpecificBuildOptions.protocols))) {\n for (const scheme of asArray(protocol.schemes)) {\n mimeTypes.push(`x-scheme-handler/${scheme}`)\n }\n }\n\n if (mimeTypes.length !== 0) {\n desktopMeta.MimeType = mimeTypes.join(\";\") + \";\"\n }\n\n let category = targetSpecificOptions.category\n if (isEmptyOrSpaces(category)) {\n const macCategory = (packager.config.mac || {}).category\n if (macCategory != null) {\n category = macToLinuxCategory[macCategory]\n }\n\n if (category == null) {\n // https://github.com/develar/onshape-desktop-shell/issues/48\n if (macCategory != null) {\n log.warn({ macCategory }, \"cannot map macOS category to Linux. If possible mapping is known for you, please file issue to add it.\")\n }\n log.warn(\n {\n reason: \"linux.category is not set and cannot map from macOS\",\n docs: \"https://www.electron.build/linux\",\n },\n 'application Linux category is set to default \"Utility\"'\n )\n category = \"Utility\"\n }\n }\n desktopMeta.Categories = `${category}${category.endsWith(\";\") ? \"\" : \";\"}`\n\n let data = `[Desktop Entry]`\n for (const name of Object.keys(desktopMeta)) {\n data += `\\n${name}=${desktopMeta[name]}`\n }\n data += \"\\n\"\n const desktopActions = targetSpecificOptions.desktop?.desktopActions ?? {}\n for (const [actionName, config] of Object.entries(desktopActions)) {\n if (!Object.keys(config ?? {}).length) {\n continue\n }\n data += `\\n[Desktop Action ${actionName}]`\n for (const [key, value] of Object.entries(config ?? {})) {\n data += `\\n${key}=${value}`\n }\n data += \"\\n\"\n }\n return Promise.resolve(data)\n }\n}\n\nconst macToLinuxCategory: any = {\n \"public.app-category.graphics-design\": \"Graphics\",\n \"public.app-category.developer-tools\": \"Development\",\n \"public.app-category.education\": \"Education\",\n \"public.app-category.games\": \"Game\",\n \"public.app-category.video\": \"Video;AudioVideo\",\n \"public.app-category.utilities\": \"Utility\",\n \"public.app-category.social-networking\": \"Network;Chat\",\n \"public.app-category.finance\": \"Office;Finance\",\n \"public.app-category.music\": \"Audio;AudioVideo\",\n}\n"]}
|
|
1
|
+
{"version":3,"file":"LinuxTargetHelper.js","sourceRoot":"","sources":["../../src/targets/LinuxTargetHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { asArray, exists, InvalidConfigurationError, isEmptyOrSpaces, log } from \"builder-util\"\nimport { deepAssign } from \"builder-util-runtime\"\nimport { outputFile } from \"fs-extra\"\nimport { Lazy } from \"lazy-val\"\nimport { join } from \"path\"\nimport * as semver from \"semver\"\nimport { CompressionLevel } from \"../core\"\nimport { LinuxPackager } from \"../linuxPackager\"\nimport { CommonLinuxOptions } from \"../options/linuxOptions\"\nimport { SnapCore } from \"./snap/SnapTarget\"\nimport { SnapCore24 } from \"./snap/core24\"\nimport { SnapCoreCustom } from \"./snap/coreCustom\"\nimport { SnapCoreLegacy } from \"./snap/coreLegacy\"\nimport { IconInfo } from \"../util/iconConverter\"\n\n/**\n * Escape a string value for use in a freedesktop .desktop file string field\n * (Name, Comment, StartupWMClass, etc.).\n *\n * The freedesktop Desktop Entry Specification requires that the following\n * characters be escaped in string / localestring values:\n * \\n → \\\\n (newline — would inject new key=value lines otherwise)\n * \\r → \\\\r\n * \\t → \\\\t\n * \\\\ → \\\\\\\\\n *\n * Without escaping, a productName or description containing a literal newline\n * can inject arbitrary key=value pairs into the generated .desktop file,\n * potentially overriding the Exec key.\n *\n * @see https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#value-types\n */\nfunction desktopStringEscape(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/\\t/g, \"\\\\t\")\n}\n\n/**\n * Characters that require an Exec argument to be double-quoted per the\n * freedesktop Desktop Entry Specification. Plain alphanumeric args and\n * field codes must NOT be wrapped in quotes.\n *\n * @see https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables\n */\nconst EXEC_RESERVED_RE = /[\\s\"'`\\\\<>~|&;$*?#()]/\n\n/**\n * Quote a single argument for use in a .desktop file Exec key.\n *\n * Field codes (`%f`, `%u`, `%F`, `%U`, etc.) MUST be left unquoted — the\n * desktop launcher only expands them in unquoted token positions. Wrapping\n * them in `\"…\"` causes the launcher to treat them as literal strings, which\n * breaks file-association / drag-and-drop functionality.\n *\n * For all other arguments, double-quoting is used when the argument contains\n * any character that would be misinterpreted by the launcher without quoting\n * (spaces, shell metacharacters, etc.). Safe plain-word args are passed\n * through unchanged to keep the Exec line readable.\n *\n * @see https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables\n */\nfunction desktopExecArgEscape(arg: string): string {\n // Field codes (%f, %u, %F, %U, %i, %c, %k, …) must never be quoted.\n if (/^%[a-zA-Z]$/.test(arg)) {\n return arg\n }\n // Only quote when the arg actually contains characters that need it.\n if (EXEC_RESERVED_RE.test(arg)) {\n return `\"${arg.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`\n }\n return arg\n}\n\nfunction mapLinuxCompressionToSnap(level: CompressionLevel | null | undefined): \"xz\" | \"lzo\" | undefined {\n if (level === \"store\") {\n return \"lzo\"\n }\n if (level === \"maximum\") {\n return \"xz\"\n }\n return undefined\n}\n\nexport const installPrefix = \"/opt\"\n\nexport class LinuxTargetHelper {\n private readonly iconPromise = new Lazy(() => this.computeDesktopIcons())\n\n private readonly mimeTypeFilesPromise = new Lazy(() => this.computeMimeTypeFiles())\n\n maxIconPath: string | null = null\n\n constructor(private packager: LinuxPackager) {}\n\n get icons(): Promise<Array<IconInfo>> {\n return this.iconPromise.value\n }\n\n get mimeTypeFiles(): Promise<string | null> {\n return this.mimeTypeFilesPromise.value\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getSnapCore(): SnapCore<any> {\n const { snapcraft, snap: legacySnap } = this.packager.config\n if (snapcraft != null && legacySnap != null) {\n log.warn(\"Both `snapcraft` and `snap` configurations are present. `snapcraft` takes precedence; please remove the `snap` key to silence this warning.\")\n }\n\n // Merge linux-level options (category, description, mimeTypes, etc.) as the base so they\n // propagate into the generated snapcraft.yaml and .desktop file without requiring users to\n // duplicate them under core24/core18/etc. Per-core options always win for conflicts.\n // linux.compression is a CompressionLevel (\"store\"/\"normal\"/\"maximum\"); snap compression is an\n // algorithm (\"xz\"/\"lzo\"). Map the level to the nearest algorithm; per-core options override.\n const { compression: linuxCompression, ...linuxOptions } = this.packager.platformSpecificBuildOptions\n const snapLinuxOptions = { ...linuxOptions, compression: mapLinuxCompressionToSnap(linuxCompression) }\n\n if (snapcraft != null) {\n const core = snapcraft.base\n const options = snapcraft[core] || {}\n switch (core) {\n case \"core18\":\n case \"core20\":\n case \"core22\":\n if (!this.isElectronVersionGreaterOrEqualThan(\"4.0.0\")) {\n if (!this.isElectronVersionGreaterOrEqualThan(\"2.0.0-beta.1\")) {\n throw new InvalidConfigurationError(\"Electron 2 and higher is required to build Snap with core18/core20/core22\")\n }\n log.warn(null, \"electron 4 and higher is highly recommended for Snap with core18/core20/core22\")\n }\n return new SnapCoreLegacy(this.packager, this, deepAssign({}, snapLinuxOptions, { base: core, ...options }))\n case \"core24\":\n if (!this.isElectronVersionGreaterOrEqualThan(\"28.0.0\")) {\n if (!this.isElectronVersionGreaterOrEqualThan(\"25.0.0\")) {\n throw new InvalidConfigurationError(\"Electron 25 and higher is required to build Snap with core24\")\n }\n log.warn(null, \"electron 28 and higher is highly recommended for Snap with core24\")\n }\n return new SnapCore24(this.packager, this, deepAssign({}, snapLinuxOptions, options))\n case \"custom\":\n // Pass-through: do not inject linux options into user-supplied yaml\n return new SnapCoreCustom(this.packager, this, snapcraft.custom || {})\n }\n }\n\n if (legacySnap != null) {\n log.warn(\n {\n reason: \"`snap` configuration is deprecated\",\n docs: \"https://www.electron.build/snapcraft\",\n },\n \"please consider migrating `snap` configuration to `snapcraft.<core>` and remove `snap` configuration\"\n )\n }\n return new SnapCoreLegacy(this.packager, this, deepAssign({}, snapLinuxOptions, legacySnap ?? {}))\n }\n\n isElectronVersionGreaterOrEqualThan(version: string, fallback?: string): boolean {\n const electronVersion = this.packager.config.electronVersion\n if (!electronVersion) {\n return fallback ? semver.gte(fallback, version) : true\n }\n return semver.gte(electronVersion, version)\n }\n\n private async computeMimeTypeFiles(): Promise<string | null> {\n const items: Array<string> = []\n for (const fileAssociation of this.packager.fileAssociations) {\n if (!fileAssociation.mimeType) {\n continue\n }\n\n const data = `<mime-type type=\"${fileAssociation.mimeType}\">\n <glob pattern=\"*.${fileAssociation.ext}\"/>\n ${fileAssociation.description ? `<comment>${fileAssociation.description}</comment>` : \"\"}\n <icon name=\"x-office-document\" />\n</mime-type>`\n items.push(data)\n }\n\n if (items.length === 0) {\n return null\n }\n\n const file = await this.packager.getTempFile(\".xml\")\n await outputFile(\n file,\n '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n<mime-info xmlns=\"http://www.freedesktop.org/standards/shared-mime-info\">\\n' + items.join(\"\\n\") + \"\\n</mime-info>\"\n )\n return file\n }\n\n // must be name without spaces and other special characters, but not product name used\n private async computeDesktopIcons(): Promise<Array<IconInfo>> {\n const packager = this.packager\n const { platformSpecificBuildOptions, config } = packager\n\n const sources = [platformSpecificBuildOptions.icon, config.mac?.icon ?? config.icon].filter(str => !!str) as string[]\n\n // If no explicit sources are defined, fallback to buildResources directory, then default framework icon\n let fallbackSources = [...asArray(packager.getDefaultFrameworkIcon())]\n const buildResources = config.directories?.buildResources\n if (buildResources && (await exists(join(buildResources, \"icons\")))) {\n fallbackSources = [buildResources, ...fallbackSources]\n }\n\n // need to put here and not as default because need to resolve image size\n const result = await packager.resolveIcon(sources, fallbackSources, \"set\")\n this.maxIconPath = result[result.length - 1].file\n\n // Ignore .icon files for linux (they are exclusive for macOS)\n return result.filter(icon => !icon.file.endsWith(\".icon\"))\n }\n\n getDescription(options: CommonLinuxOptions) {\n return options.description || this.packager.appInfo.description\n }\n\n getSanitizedVersion(target: string) {\n const {\n appInfo: { version },\n } = this.packager\n switch (target) {\n case \"pacman\":\n return version.replace(/-/g, \"_\")\n case \"rpm\":\n case \"deb\":\n return version.replace(/-/g, \"~\")\n default:\n return version\n }\n }\n\n async writeDesktopEntry(targetSpecificOptions: CommonLinuxOptions, exec?: string, destination?: string | null, extra?: Record<string, string>): Promise<string> {\n const data = await this.computeDesktopEntry(targetSpecificOptions, exec, extra)\n const file = destination || (await this.packager.getTempFile(`${this.packager.appInfo.productFilename}.desktop`))\n await outputFile(file, data)\n return file\n }\n\n computeDesktopEntry(targetSpecificOptions: CommonLinuxOptions, exec?: string, extra?: Record<string, string>): Promise<string> {\n if (exec != null && exec.length === 0) {\n throw new Error(\"Specified exec is empty\")\n }\n // https://github.com/electron-userland/electron-builder/issues/3418\n if (targetSpecificOptions.desktop?.entry?.Exec) {\n throw new Error(\"Please specify executable name as linux.executableName instead of linux.desktop.Exec\")\n }\n\n const packager = this.packager\n const appInfo = packager.appInfo\n\n const executableArgs = targetSpecificOptions.executableArgs\n if (exec == null) {\n exec = `${installPrefix}/${appInfo.sanitizedProductName}/${packager.executableName}`\n if (!/^[/0-9A-Za-z._-]+$/.test(exec)) {\n exec = `\"${exec}\"`\n }\n if (executableArgs) {\n exec += \" \"\n // Each arg is double-quoted per the freedesktop Exec key spec so that\n // spaces, $, ;, & and other reserved characters are not misinterpreted.\n exec += executableArgs.map(desktopExecArgEscape).join(\" \")\n }\n // https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables\n const execCodes = [\"%f\", \"%u\", \"%F\", \"%U\"]\n if (executableArgs == null || executableArgs.findIndex(arg => execCodes.includes(arg)) === -1) {\n exec += \" %U\"\n }\n }\n\n // https://github.com/electron-userland/electron-builder/issues/9103\n // Electron derives app_id from desktopName in package.json; StartupWMClass must match.\n // https://github.com/electron/electron/blob/9a7b73b5334f1d72c08e2d5e94106706ed751186/lib/browser/init.ts#L128-L133\n const trimmedDesktopName = packager.info.metadata.desktopName?.trim()\n const wmClass = !isEmptyOrSpaces(trimmedDesktopName) ? trimmedDesktopName.replace(/\\.desktop$/, \"\") : appInfo.productName\n\n const desktopMeta = deepAssign<any>(\n {\n // String values are escaped per the freedesktop spec (\\\\, \\n, \\r, \\t)\n // so that a product name containing a newline cannot inject new key=value\n // pairs into the .desktop file (e.g. overriding the Exec key).\n Name: desktopStringEscape(appInfo.productName),\n Exec: exec,\n Terminal: \"false\",\n Type: \"Application\",\n Icon: packager.executableName,\n // https://askubuntu.com/questions/367396/what-represent-the-startupwmclass-field-of-a-desktop-file\n // Set to desktopName (minus .desktop suffix) when provided, so it matches Electron's\n // app_id and desktop environments can associate running windows with this entry.\n // Falls back to productName for apps that don't set desktopName.\n // to get WM_CLASS of running window: xprop WM_CLASS\n // StartupWMClass doesn't work for unicode\n // https://github.com/electron/electron/blob/2-0-x/atom/browser/native_window_views.cc#L226\n StartupWMClass: desktopStringEscape(wmClass),\n },\n extra,\n targetSpecificOptions.desktop?.entry ?? {}\n )\n\n const description = this.getDescription(targetSpecificOptions)\n if (!isEmptyOrSpaces(description)) {\n desktopMeta.Comment = desktopStringEscape(description)\n }\n\n const mimeTypes: Array<string> = asArray(targetSpecificOptions.mimeTypes)\n for (const fileAssociation of packager.fileAssociations) {\n if (fileAssociation.mimeType != null) {\n mimeTypes.push(fileAssociation.mimeType)\n }\n }\n\n for (const protocol of asArray(packager.config.protocols).concat(asArray(packager.platformSpecificBuildOptions.protocols))) {\n for (const scheme of asArray(protocol.schemes)) {\n mimeTypes.push(`x-scheme-handler/${scheme}`)\n }\n }\n\n if (mimeTypes.length !== 0) {\n desktopMeta.MimeType = mimeTypes.join(\";\") + \";\"\n }\n\n let category = targetSpecificOptions.category\n if (isEmptyOrSpaces(category)) {\n const macCategory = (packager.config.mac || {}).category\n if (macCategory != null) {\n category = macToLinuxCategory[macCategory]\n }\n\n if (category == null) {\n // https://github.com/develar/onshape-desktop-shell/issues/48\n if (macCategory != null) {\n log.warn({ macCategory }, \"cannot map macOS category to Linux. If possible mapping is known for you, please file issue to add it.\")\n }\n log.warn(\n {\n reason: \"linux.category is not set and cannot map from macOS\",\n docs: \"https://www.electron.build/linux\",\n },\n 'application Linux category is set to default \"Utility\"'\n )\n category = \"Utility\"\n }\n }\n desktopMeta.Categories = `${category}${category.endsWith(\";\") ? \"\" : \";\"}`\n\n let data = `[Desktop Entry]`\n for (const name of Object.keys(desktopMeta)) {\n data += `\\n${name}=${desktopMeta[name]}`\n }\n data += \"\\n\"\n const desktopActions = targetSpecificOptions.desktop?.desktopActions ?? {}\n for (const [actionName, config] of Object.entries(desktopActions)) {\n if (!Object.keys(config ?? {}).length) {\n continue\n }\n data += `\\n[Desktop Action ${actionName}]`\n for (const [key, value] of Object.entries(config ?? {})) {\n data += `\\n${key}=${value}`\n }\n data += \"\\n\"\n }\n return Promise.resolve(data)\n }\n}\n\nconst macToLinuxCategory: any = {\n \"public.app-category.graphics-design\": \"Graphics\",\n \"public.app-category.developer-tools\": \"Development\",\n \"public.app-category.education\": \"Education\",\n \"public.app-category.games\": \"Game\",\n \"public.app-category.video\": \"Video;AudioVideo\",\n \"public.app-category.utilities\": \"Utility\",\n \"public.app-category.social-networking\": \"Network;Chat\",\n \"public.app-category.finance\": \"Office;Finance\",\n \"public.app-category.music\": \"Audio;AudioVideo\",\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Arch } from "builder-util";
|
|
2
2
|
import { FileAssociation } from "../../options/FileAssociation";
|
|
3
|
-
import { IconInfo } from "../../platformPackager";
|
|
4
3
|
import { BlockMapDataHolder } from "builder-util-runtime";
|
|
5
|
-
import { ToolsetConfig } from "
|
|
4
|
+
import { ToolsetConfig } from "../../configuration";
|
|
5
|
+
import { IconInfo } from "../../util/iconConverter";
|
|
6
6
|
interface Options {
|
|
7
7
|
productName: string;
|
|
8
8
|
productFilename: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appImageUtil.js","sourceRoot":"","sources":["../../../src/targets/appimage/appImageUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, copyDir, copyFile, exec, exists, InvalidConfigurationError, log } from \"builder-util\"\nimport * as fs from \"fs-extra\"\nimport * as path from \"path\"\nimport { FileAssociation } from \"../../options/FileAssociation\"\nimport { IconInfo } from \"../../platformPackager\"\nimport { getAppImageTools } from \"../../toolsets/linux\"\nimport { copyIcons, copyMimeTypes } from \"./appLauncher\"\nimport { appendBlockmap } from \"../differentialUpdateInfoBuilder\"\nimport { BlockMapDataHolder } from \"builder-util-runtime\"\nimport { APP_RUN_ENTRYPOINT } from \"./AppImageTarget\"\nimport { ToolsetConfig } from \"app-builder-lib/src/configuration\"\n\ninterface Options {\n productName: string\n productFilename: string\n executableName: string\n desktopEntry: string\n icons: IconInfo[]\n license?: string | null\n fileAssociations: FileAssociation[]\n /**\n * The compression type available for static runtime is limited as it's only compiled with support for gzip and zstd.\n * \"xz\" is only valid for the legacy FUSE2 (0.0.0) toolset.\n *\n * [stderr] Squashfs image uses lzo compression, this version supports only zlib, zstd.\n * Failed to open squashfs image\n * Failed to extract AppImage\n *\n */\n compression?: \"gzip\" | \"zstd\" | \"xz\"\n}\n\nexport interface AppImageBuilderOptions {\n appDir: string\n stageDir: string\n arch: Arch\n output: string\n options: Options\n}\n\nexport async function buildStaticRuntimeAppImage(appimageToolVersion: ToolsetConfig[\"appimage\"], opts: AppImageBuilderOptions): Promise<BlockMapDataHolder> {\n const { stageDir, output, appDir, options, arch } = opts\n\n try {\n await fs.remove(output)\n\n // Write AppRun launcher and related files\n await writeAppLauncherAndRelatedFiles(opts)\n\n const { runtimeLibraries: libraries, runtime, mksquashfs } = await getAppImageTools(appimageToolVersion, arch)\n await copyDir(libraries, path.join(stageDir, \"usr\", \"lib\"))\n\n // Copy app directory to stage\n // mksquashfs doesn't support merging, so we copy the entire app dir\n await copyDir(appDir, stageDir)\n\n const runtimeData = await fs.readFile(runtime)\n\n // Create squashfs with offset for runtime\n const args: string[] = [stageDir, output, \"-offset\", runtimeData.length.toString(), \"-all-root\", \"-noappend\", \"-no-progress\", \"-quiet\", \"-no-xattrs\", \"-no-fragments\"]\n if (options.compression) {\n args.push(\"-comp\", options.compression)\n }\n await exec(mksquashfs, args, {\n cwd: stageDir,\n })\n\n // Write runtime data at the beginning of the file\n await writeRuntimeData(output, runtimeData)\n\n // Make executable\n await fs.chmod(output, 0o755)\n\n // Append blockmap inside try block to ensure cleanup on failure\n const updateInfo = await appendBlockmap(output)\n return updateInfo\n } catch (error) {\n // Clean up partial build on failure\n await fs.remove(output).catch(() => {})\n throw error\n }\n}\n\nexport async function buildLegacyFuse2AppImage(opts: AppImageBuilderOptions): Promise<BlockMapDataHolder> {\n const { stageDir, output, appDir, options, arch } = opts\n\n try {\n await fs.remove(output)\n\n await writeAppLauncherAndRelatedFiles(opts)\n\n const { runtime, mksquashfs, runtimeLibraries } = await getAppImageTools(\"0.0.0\", arch)\n // Mirror the app-builder-lib Go implementation: bundle lib/<arch> into usr/lib for x64 and ia32.\n // arm targets don't have a dedicated lib dir in the FUSE2 toolset.\n if (arch === Arch.x64 || arch === Arch.ia32) {\n await copyDir(runtimeLibraries, path.join(stageDir, \"usr\", \"lib\"))\n }\n await copyDir(appDir, stageDir)\n\n const runtimeData = await fs.readFile(runtime)\n\n const args: string[] = [stageDir, output, \"-offset\", runtimeData.length.toString(), \"-all-root\", \"-noappend\", \"-no-progress\", \"-quiet\", \"-no-xattrs\", \"-no-fragments\"]\n if (options.compression) {\n args.push(\"-comp\", options.compression)\n if (options.compression === \"xz\") {\n // Match the dictionary/block-size settings used by the original app-builder Go implementation\n args.push(\"-Xdict-size\", \"100%\", \"-b\", \"1048576\")\n }\n }\n await exec(mksquashfs, args, { cwd: stageDir })\n\n await writeRuntimeData(output, runtimeData)\n await fs.chmod(output, 0o755)\n\n const updateInfo = await appendBlockmap(output)\n return updateInfo\n } catch (error) {\n await fs.remove(output).catch(() => {})\n throw error\n }\n}\n\nasync function writeRuntimeData(filePath: string, runtimeData: Buffer): Promise<void> {\n const fd = await fs.open(filePath, \"r+\")\n try {\n await fs.write(fd, runtimeData, 0, runtimeData.length, 0)\n } finally {\n try {\n await fs.close(fd)\n } catch (closeError: any) {\n // Log but don't throw - preserve original error if any\n log.warn({ message: closeError.message, file: filePath }, `failed to close file descriptor`)\n }\n }\n}\n\n/**\n * Escapes a string for safe use in shell scripts by wrapping in single quotes\n * and escaping any single quotes within the string.\n *\n * This allows strings with spaces, special characters, etc. to be safely used.\n */\nfunction escapeShellString(str: string): string {\n // Escape single quotes by replacing ' with '\\''\n // Then wrap the whole string in single quotes\n return `'${str.replace(/'/g, \"'\\\\''\")}'`\n}\n\n/**\n * Validates that critical path fields (executable name, product filename, license filename)\n * contain only characters that are safe for use in filesystem paths and embedded bash strings.\n * Allowed: Unicode letters, digits, dots, underscores, hyphens, and spaces.\n */\nexport function validateCriticalPathString(str: string, fieldName: string): void {\n if (!/^[\\p{L}\\p{N}._\\- ]+$/u.test(str)) {\n throw new InvalidConfigurationError(\n `${fieldName} contains characters that cannot be safely used in file paths: ${str}. Please use only letters, digits, hyphens, underscores, dots, and spaces.`\n )\n }\n}\n\nasync function writeAppLauncherAndRelatedFiles(opts: AppImageBuilderOptions): Promise<void> {\n const {\n stageDir,\n options: { license, executableName, productFilename, productName, desktopEntry },\n } = opts\n\n // executableName and productFilename are embedded directly into double-quoted bash strings\n // and used as filesystem paths, so they must pass the whitelist.\n // productName is not validated here because it is only ever passed through escapeShellString().\n validateCriticalPathString(executableName, \"executableName\")\n validateCriticalPathString(productFilename, \"productFilename\")\n\n // Write desktop file\n const desktopFileName = `${executableName}.desktop`\n await fs.writeFile(path.join(stageDir, desktopFileName), desktopEntry, { mode: 0o644 })\n await copyIcons(opts)\n\n const templateConfig: AppRunScriptBase = {\n DesktopFileName: desktopFileName,\n ExecutableName: executableName,\n ProductName: productName,\n ProductFilename: productFilename,\n ResourceName: `appimagekit-${executableName}`,\n }\n\n const mimeTypeFile = await copyMimeTypes(stageDir, opts.options)\n if (mimeTypeFile) {\n templateConfig.MimeTypeFile = mimeTypeFile\n }\n\n let finalConfig: AppRunScript = templateConfig\n\n // Copy license file if provided\n if (license) {\n // Validate license file exists\n if (!(await exists(license))) {\n throw new InvalidConfigurationError(`License file not found: ${license}`)\n }\n\n const licenseBaseName = path.basename(license)\n const ext = path.extname(license).toLowerCase()\n\n // Validate license filename for path safety\n validateCriticalPathString(licenseBaseName, \"licenseBaseName\")\n\n // Validate extension\n if (![\".txt\", \".html\"].includes(ext)) {\n log.warn({ license, expected: \".txt or .html\" }, `license file has unexpected extension`)\n }\n\n await copyFile(license, path.join(stageDir, licenseBaseName))\n\n finalConfig = {\n ...templateConfig,\n EulaFile: licenseBaseName,\n IsHtmlEula: ext === \".html\",\n }\n }\n\n const appRunContent = generateAppRunScript(finalConfig)\n await fs.writeFile(path.join(stageDir, APP_RUN_ENTRYPOINT), appRunContent, { mode: 0o755 })\n}\n\nexport type AppRunScriptBase = {\n ExecutableName: string\n DesktopFileName: string\n ProductFilename: string\n ProductName: string\n ResourceName: string\n MimeTypeFile?: string\n}\n\nexport type AppRunScriptWithEula = AppRunScriptBase & {\n EulaFile: string\n IsHtmlEula: boolean\n}\n\nexport type AppRunScript = AppRunScriptBase | AppRunScriptWithEula\n\nfunction hasEula(config: AppRunScript): config is AppRunScriptWithEula {\n return \"EulaFile\" in config && typeof config.EulaFile === \"string\"\n}\n\nexport function generateAppRunScript(config: AppRunScript): string {\n const eulaEnabled = hasEula(config)\n\n return `#!/usr/bin/env bash\nset -e\n\nTHIS=\"$0\"\n# http://stackoverflow.com/questions/3190818/\nargs=(\"$@\")\nNUMBER_OF_ARGS=\"$#\"\n\nif [ -z \"$APPDIR\" ] ; then\n # Find the AppDir. It is the directory that contains AppRun.\n # This assumes that this script resides inside the AppDir or a subdirectory.\n # If this script is run inside an AppImage, then the AppImage runtime likely has already set $APPDIR\n path=\"$(dirname \"$(readlink -f \"\\${THIS}\")\")\"\n while [[ \"$path\" != \"\" && ! -e \"$path/${APP_RUN_ENTRYPOINT}\" ]]; do\n path=\\${path%/*}\n done\n APPDIR=\"$path\"\nfi\n\nif [ -z \"$APPDIR\" ] ; then\n echo \"ERROR: could not locate the AppDir. Ensure this script is run from within a properly structured AppImage.\" >&2\n exit 1\nfi\n\nexport PATH=\"\\${APPDIR}:\\${APPDIR}/usr/sbin\\${PATH:+:\\${PATH}}\"\nexport XDG_DATA_DIRS=\"\\${APPDIR}/usr/share/\\${XDG_DATA_DIRS:+:\\${XDG_DATA_DIRS}}:/usr/share/gnome:/usr/local/share/:/usr/share/\"\nexport LD_LIBRARY_PATH=\"\\${APPDIR}/usr/lib\\${LD_LIBRARY_PATH:+:\\${LD_LIBRARY_PATH}}\"\nexport GSETTINGS_SCHEMA_DIR=\"\\${APPDIR}/usr/share/glib-2.0/schemas\\${GSETTINGS_SCHEMA_DIR:+:\\${GSETTINGS_SCHEMA_DIR}}\"\n\nBIN=\"$APPDIR/${config.ExecutableName}\"\n\nif [ -z \"$APPIMAGE_EXIT_AFTER_INSTALL\" ] ; then\n trap atexit EXIT\nfi\n\nisEulaAccepted=1\n\nHAVE_NO_SANDBOX=0\nfor arg in \"\\${args[@]}\" ; do\n if [ \"$arg\" = --no-sandbox ] ; then\n HAVE_NO_SANDBOX=1\n break\n fi\ndone\nNO_SANDBOX=()\n# Use 'unshare -Ur true' as a heuristic to detect whether user namespaces are available.\n# Notes:\n# - When running as root, this check will always succeed even if the sandbox configuration\n# actually relies on unprivileged user namespaces. In practice, Chrome/Electron usually\n# disables or adjusts the sandbox separately when running as root, so this probe is mostly\n# a no-op in that scenario.\n# - On minimal systems (e.g. Alpine or stripped-down containers) 'unshare' may not exist.\n# In that case the shell will return exit code 127 (\"command not found\"), which will cause\n# us to add '--no-sandbox'. This is an intentional fail-safe: we prefer the app to start\n# without sandboxing rather than crash on startup.\nif [ $HAVE_NO_SANDBOX -eq 0 ] && ! unshare -Ur true 2>/dev/null ; then\n NO_SANDBOX=(--no-sandbox)\nfi\n\natexit()\n{\n if [ $isEulaAccepted == 1 ] ; then\n if [ $NUMBER_OF_ARGS -eq 0 ] ; then\n exec \"$BIN\" \"\\${NO_SANDBOX[@]}\"\n else\n exec \"$BIN\" \"\\${NO_SANDBOX[@]}\" \"\\${args[@]}\"\n fi\n fi\n}\n\nerror()\n{\n if [ -x /usr/bin/zenity ] ; then\n LD_LIBRARY_PATH=\"\" zenity --error --text \"\\${1}\" 2>/dev/null\n elif [ -x /usr/bin/kdialog ] ; then\n LD_LIBRARY_PATH=\"\" kdialog --msgbox \"\\${1}\" 2>/dev/null\n elif [ -x /usr/bin/Xdialog ] ; then\n LD_LIBRARY_PATH=\"\" Xdialog --msgbox \"\\${1}\" 2>/dev/null\n else\n echo \"\\${1}\"\n fi\n exit 1\n}\n\nyesno()\n{\n TITLE=$1\n TEXT=$2\n if [ -x /usr/bin/zenity ] ; then\n LD_LIBRARY_PATH=\"\" zenity --question --title=\"$TITLE\" --text=\"$TEXT\" 2>/dev/null || exit 0\n elif [ -x /usr/bin/kdialog ] ; then\n LD_LIBRARY_PATH=\"\" kdialog --title \"$TITLE\" --yesno \"$TEXT\" || exit 0\n elif [ -x /usr/bin/Xdialog ] ; then\n LD_LIBRARY_PATH=\"\" Xdialog --title \"$TITLE\" --clear --yesno \"$TEXT\" 10 80 || exit 0\n else\n echo \"zenity, kdialog, Xdialog missing. Skipping \\${THIS}.\"\n exit 0\n fi\n}\n\ncheck_dep()\n{\n DEP=$1\n if ! command -v \"$DEP\" &>/dev/null ; then\n echo \"$DEP is missing. Skipping \\${THIS}.\"\n exit 0\n fi\n}\n\nif [ -z \"$APPIMAGE\" ] ; then\n APPIMAGE=\"$APPDIR/${APP_RUN_ENTRYPOINT}\"\n # not running from within an AppImage; hence using the AppRun for Exec=\nfi\n\n${\n eulaEnabled\n ? `if [ -z \"$APPIMAGE_SILENT_INSTALL\" ] ; then\n EULA_MARK_DIR=\"\\${XDG_CONFIG_HOME:-$HOME/.config}/${config.ProductFilename}\"\n EULA_MARK_FILE=\"$EULA_MARK_DIR/eulaAccepted\"\n # show EULA only if desktop file doesn't exist\n if [ ! -e \"$EULA_MARK_FILE\" ] ; then\n if [ -x /usr/bin/zenity ] ; then\n # on cancel simply exits and our trap handler launches app, so, $isEulaAccepted is set here to 0 and then to 1 if EULA accepted\n isEulaAccepted=0\n LD_LIBRARY_PATH=\"\" zenity --text-info --title=${escapeShellString(config.ProductName)} --filename=\"$APPDIR/${config.EulaFile}\" --ok-label=Agree --cancel-label=Disagree ${config.IsHtmlEula ? \"--html\" : \"\"}\n elif [ -x /usr/bin/Xdialog ] ; then\n isEulaAccepted=0\n LD_LIBRARY_PATH=\"\" Xdialog --title ${escapeShellString(config.ProductName)} --textbox \"$APPDIR/${config.EulaFile}\" 30 80 --ok-label Agree --cancel-label Disagree\n elif [ -x /usr/bin/kdialog ] ; then\n # cannot find any option to force Agree/Disagree buttons for kdialog. And official example exactly with OK button https://techbase.kde.org/Development/Tutorials/Shell_Scripting_with_KDE_Dialogs#Example_21._--textbox_dialog_box\n # in any case we pass labels text\n isEulaAccepted=0\n LD_LIBRARY_PATH=\"\" kdialog --textbox \"$APPDIR/${config.EulaFile}\" --yes-label Agree --cancel-label \"Disagree\"\n fi\n\n case $? in\n 0)\n isEulaAccepted=1\n echo \"License accepted\"\n mkdir -p \"$EULA_MARK_DIR\"\n touch \"$EULA_MARK_FILE\"\n ;;\n 1)\n echo \"License not accepted\"\n exit 0\n ;;\n -1)\n echo \"An unexpected error has occurred.\"\n isEulaAccepted=1\n ;;\n esac\n fi\nfi`\n : \"\"\n}\n`\n}\n"]}
|
|
1
|
+
{"version":3,"file":"appImageUtil.js","sourceRoot":"","sources":["../../../src/targets/appimage/appImageUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, copyDir, copyFile, exec, exists, InvalidConfigurationError, log } from \"builder-util\"\nimport * as fs from \"fs-extra\"\nimport * as path from \"path\"\nimport { FileAssociation } from \"../../options/FileAssociation\"\nimport { getAppImageTools } from \"../../toolsets/linux\"\nimport { copyIcons, copyMimeTypes } from \"./appLauncher\"\nimport { appendBlockmap } from \"../differentialUpdateInfoBuilder\"\nimport { BlockMapDataHolder } from \"builder-util-runtime\"\nimport { APP_RUN_ENTRYPOINT } from \"./AppImageTarget\"\nimport { ToolsetConfig } from \"../../configuration\"\nimport { IconInfo } from \"../../util/iconConverter\"\n\ninterface Options {\n productName: string\n productFilename: string\n executableName: string\n desktopEntry: string\n icons: IconInfo[]\n license?: string | null\n fileAssociations: FileAssociation[]\n /**\n * The compression type available for static runtime is limited as it's only compiled with support for gzip and zstd.\n * \"xz\" is only valid for the legacy FUSE2 (0.0.0) toolset.\n *\n * [stderr] Squashfs image uses lzo compression, this version supports only zlib, zstd.\n * Failed to open squashfs image\n * Failed to extract AppImage\n *\n */\n compression?: \"gzip\" | \"zstd\" | \"xz\"\n}\n\nexport interface AppImageBuilderOptions {\n appDir: string\n stageDir: string\n arch: Arch\n output: string\n options: Options\n}\n\nexport async function buildStaticRuntimeAppImage(appimageToolVersion: ToolsetConfig[\"appimage\"], opts: AppImageBuilderOptions): Promise<BlockMapDataHolder> {\n const { stageDir, output, appDir, options, arch } = opts\n\n try {\n await fs.remove(output)\n\n // Write AppRun launcher and related files\n await writeAppLauncherAndRelatedFiles(opts)\n\n const { runtimeLibraries: libraries, runtime, mksquashfs } = await getAppImageTools(appimageToolVersion, arch)\n await copyDir(libraries, path.join(stageDir, \"usr\", \"lib\"))\n\n // Copy app directory to stage\n // mksquashfs doesn't support merging, so we copy the entire app dir\n await copyDir(appDir, stageDir)\n\n const runtimeData = await fs.readFile(runtime)\n\n // Create squashfs with offset for runtime\n const args: string[] = [stageDir, output, \"-offset\", runtimeData.length.toString(), \"-all-root\", \"-noappend\", \"-no-progress\", \"-quiet\", \"-no-xattrs\", \"-no-fragments\"]\n if (options.compression) {\n args.push(\"-comp\", options.compression)\n }\n await exec(mksquashfs, args, {\n cwd: stageDir,\n })\n\n // Write runtime data at the beginning of the file\n await writeRuntimeData(output, runtimeData)\n\n // Make executable\n await fs.chmod(output, 0o755)\n\n // Append blockmap inside try block to ensure cleanup on failure\n const updateInfo = await appendBlockmap(output)\n return updateInfo\n } catch (error) {\n // Clean up partial build on failure\n await fs.remove(output).catch(() => {})\n throw error\n }\n}\n\nexport async function buildLegacyFuse2AppImage(opts: AppImageBuilderOptions): Promise<BlockMapDataHolder> {\n const { stageDir, output, appDir, options, arch } = opts\n\n try {\n await fs.remove(output)\n\n await writeAppLauncherAndRelatedFiles(opts)\n\n const { runtime, mksquashfs, runtimeLibraries } = await getAppImageTools(\"0.0.0\", arch)\n // Mirror the app-builder-lib Go implementation: bundle lib/<arch> into usr/lib for x64 and ia32.\n // arm targets don't have a dedicated lib dir in the FUSE2 toolset.\n if (arch === Arch.x64 || arch === Arch.ia32) {\n await copyDir(runtimeLibraries, path.join(stageDir, \"usr\", \"lib\"))\n }\n await copyDir(appDir, stageDir)\n\n const runtimeData = await fs.readFile(runtime)\n\n const args: string[] = [stageDir, output, \"-offset\", runtimeData.length.toString(), \"-all-root\", \"-noappend\", \"-no-progress\", \"-quiet\", \"-no-xattrs\", \"-no-fragments\"]\n if (options.compression) {\n args.push(\"-comp\", options.compression)\n if (options.compression === \"xz\") {\n // Match the dictionary/block-size settings used by the original app-builder Go implementation\n args.push(\"-Xdict-size\", \"100%\", \"-b\", \"1048576\")\n }\n }\n await exec(mksquashfs, args, { cwd: stageDir })\n\n await writeRuntimeData(output, runtimeData)\n await fs.chmod(output, 0o755)\n\n const updateInfo = await appendBlockmap(output)\n return updateInfo\n } catch (error) {\n await fs.remove(output).catch(() => {})\n throw error\n }\n}\n\nasync function writeRuntimeData(filePath: string, runtimeData: Buffer): Promise<void> {\n const fd = await fs.open(filePath, \"r+\")\n try {\n await fs.write(fd, runtimeData, 0, runtimeData.length, 0)\n } finally {\n try {\n await fs.close(fd)\n } catch (closeError: any) {\n // Log but don't throw - preserve original error if any\n log.warn({ message: closeError.message, file: filePath }, `failed to close file descriptor`)\n }\n }\n}\n\n/**\n * Escapes a string for safe use in shell scripts by wrapping in single quotes\n * and escaping any single quotes within the string.\n *\n * This allows strings with spaces, special characters, etc. to be safely used.\n */\nfunction escapeShellString(str: string): string {\n // Escape single quotes by replacing ' with '\\''\n // Then wrap the whole string in single quotes\n return `'${str.replace(/'/g, \"'\\\\''\")}'`\n}\n\n/**\n * Validates that critical path fields (executable name, product filename, license filename)\n * contain only characters that are safe for use in filesystem paths and embedded bash strings.\n * Allowed: Unicode letters, digits, dots, underscores, hyphens, and spaces.\n */\nexport function validateCriticalPathString(str: string, fieldName: string): void {\n if (!/^[\\p{L}\\p{N}._\\- ]+$/u.test(str)) {\n throw new InvalidConfigurationError(\n `${fieldName} contains characters that cannot be safely used in file paths: ${str}. Please use only letters, digits, hyphens, underscores, dots, and spaces.`\n )\n }\n}\n\nasync function writeAppLauncherAndRelatedFiles(opts: AppImageBuilderOptions): Promise<void> {\n const {\n stageDir,\n options: { license, executableName, productFilename, productName, desktopEntry },\n } = opts\n\n // executableName and productFilename are embedded directly into double-quoted bash strings\n // and used as filesystem paths, so they must pass the whitelist.\n // productName is not validated here because it is only ever passed through escapeShellString().\n validateCriticalPathString(executableName, \"executableName\")\n validateCriticalPathString(productFilename, \"productFilename\")\n\n // Write desktop file\n const desktopFileName = `${executableName}.desktop`\n await fs.writeFile(path.join(stageDir, desktopFileName), desktopEntry, { mode: 0o644 })\n await copyIcons(opts)\n\n const templateConfig: AppRunScriptBase = {\n DesktopFileName: desktopFileName,\n ExecutableName: executableName,\n ProductName: productName,\n ProductFilename: productFilename,\n ResourceName: `appimagekit-${executableName}`,\n }\n\n const mimeTypeFile = await copyMimeTypes(stageDir, opts.options)\n if (mimeTypeFile) {\n templateConfig.MimeTypeFile = mimeTypeFile\n }\n\n let finalConfig: AppRunScript = templateConfig\n\n // Copy license file if provided\n if (license) {\n // Validate license file exists\n if (!(await exists(license))) {\n throw new InvalidConfigurationError(`License file not found: ${license}`)\n }\n\n const licenseBaseName = path.basename(license)\n const ext = path.extname(license).toLowerCase()\n\n // Validate license filename for path safety\n validateCriticalPathString(licenseBaseName, \"licenseBaseName\")\n\n // Validate extension\n if (![\".txt\", \".html\"].includes(ext)) {\n log.warn({ license, expected: \".txt or .html\" }, `license file has unexpected extension`)\n }\n\n await copyFile(license, path.join(stageDir, licenseBaseName))\n\n finalConfig = {\n ...templateConfig,\n EulaFile: licenseBaseName,\n IsHtmlEula: ext === \".html\",\n }\n }\n\n const appRunContent = generateAppRunScript(finalConfig)\n await fs.writeFile(path.join(stageDir, APP_RUN_ENTRYPOINT), appRunContent, { mode: 0o755 })\n}\n\nexport type AppRunScriptBase = {\n ExecutableName: string\n DesktopFileName: string\n ProductFilename: string\n ProductName: string\n ResourceName: string\n MimeTypeFile?: string\n}\n\nexport type AppRunScriptWithEula = AppRunScriptBase & {\n EulaFile: string\n IsHtmlEula: boolean\n}\n\nexport type AppRunScript = AppRunScriptBase | AppRunScriptWithEula\n\nfunction hasEula(config: AppRunScript): config is AppRunScriptWithEula {\n return \"EulaFile\" in config && typeof config.EulaFile === \"string\"\n}\n\nexport function generateAppRunScript(config: AppRunScript): string {\n const eulaEnabled = hasEula(config)\n\n return `#!/usr/bin/env bash\nset -e\n\nTHIS=\"$0\"\n# http://stackoverflow.com/questions/3190818/\nargs=(\"$@\")\nNUMBER_OF_ARGS=\"$#\"\n\nif [ -z \"$APPDIR\" ] ; then\n # Find the AppDir. It is the directory that contains AppRun.\n # This assumes that this script resides inside the AppDir or a subdirectory.\n # If this script is run inside an AppImage, then the AppImage runtime likely has already set $APPDIR\n path=\"$(dirname \"$(readlink -f \"\\${THIS}\")\")\"\n while [[ \"$path\" != \"\" && ! -e \"$path/${APP_RUN_ENTRYPOINT}\" ]]; do\n path=\\${path%/*}\n done\n APPDIR=\"$path\"\nfi\n\nif [ -z \"$APPDIR\" ] ; then\n echo \"ERROR: could not locate the AppDir. Ensure this script is run from within a properly structured AppImage.\" >&2\n exit 1\nfi\n\nexport PATH=\"\\${APPDIR}:\\${APPDIR}/usr/sbin\\${PATH:+:\\${PATH}}\"\nexport XDG_DATA_DIRS=\"\\${APPDIR}/usr/share/\\${XDG_DATA_DIRS:+:\\${XDG_DATA_DIRS}}:/usr/share/gnome:/usr/local/share/:/usr/share/\"\nexport LD_LIBRARY_PATH=\"\\${APPDIR}/usr/lib\\${LD_LIBRARY_PATH:+:\\${LD_LIBRARY_PATH}}\"\nexport GSETTINGS_SCHEMA_DIR=\"\\${APPDIR}/usr/share/glib-2.0/schemas\\${GSETTINGS_SCHEMA_DIR:+:\\${GSETTINGS_SCHEMA_DIR}}\"\n\nBIN=\"$APPDIR/${config.ExecutableName}\"\n\nif [ -z \"$APPIMAGE_EXIT_AFTER_INSTALL\" ] ; then\n trap atexit EXIT\nfi\n\nisEulaAccepted=1\n\nHAVE_NO_SANDBOX=0\nfor arg in \"\\${args[@]}\" ; do\n if [ \"$arg\" = --no-sandbox ] ; then\n HAVE_NO_SANDBOX=1\n break\n fi\ndone\nNO_SANDBOX=()\n# Use 'unshare -Ur true' as a heuristic to detect whether user namespaces are available.\n# Notes:\n# - When running as root, this check will always succeed even if the sandbox configuration\n# actually relies on unprivileged user namespaces. In practice, Chrome/Electron usually\n# disables or adjusts the sandbox separately when running as root, so this probe is mostly\n# a no-op in that scenario.\n# - On minimal systems (e.g. Alpine or stripped-down containers) 'unshare' may not exist.\n# In that case the shell will return exit code 127 (\"command not found\"), which will cause\n# us to add '--no-sandbox'. This is an intentional fail-safe: we prefer the app to start\n# without sandboxing rather than crash on startup.\nif [ $HAVE_NO_SANDBOX -eq 0 ] && ! unshare -Ur true 2>/dev/null ; then\n NO_SANDBOX=(--no-sandbox)\nfi\n\natexit()\n{\n if [ $isEulaAccepted == 1 ] ; then\n if [ $NUMBER_OF_ARGS -eq 0 ] ; then\n exec \"$BIN\" \"\\${NO_SANDBOX[@]}\"\n else\n exec \"$BIN\" \"\\${NO_SANDBOX[@]}\" \"\\${args[@]}\"\n fi\n fi\n}\n\nerror()\n{\n if [ -x /usr/bin/zenity ] ; then\n LD_LIBRARY_PATH=\"\" zenity --error --text \"\\${1}\" 2>/dev/null\n elif [ -x /usr/bin/kdialog ] ; then\n LD_LIBRARY_PATH=\"\" kdialog --msgbox \"\\${1}\" 2>/dev/null\n elif [ -x /usr/bin/Xdialog ] ; then\n LD_LIBRARY_PATH=\"\" Xdialog --msgbox \"\\${1}\" 2>/dev/null\n else\n echo \"\\${1}\"\n fi\n exit 1\n}\n\nyesno()\n{\n TITLE=$1\n TEXT=$2\n if [ -x /usr/bin/zenity ] ; then\n LD_LIBRARY_PATH=\"\" zenity --question --title=\"$TITLE\" --text=\"$TEXT\" 2>/dev/null || exit 0\n elif [ -x /usr/bin/kdialog ] ; then\n LD_LIBRARY_PATH=\"\" kdialog --title \"$TITLE\" --yesno \"$TEXT\" || exit 0\n elif [ -x /usr/bin/Xdialog ] ; then\n LD_LIBRARY_PATH=\"\" Xdialog --title \"$TITLE\" --clear --yesno \"$TEXT\" 10 80 || exit 0\n else\n echo \"zenity, kdialog, Xdialog missing. Skipping \\${THIS}.\"\n exit 0\n fi\n}\n\ncheck_dep()\n{\n DEP=$1\n if ! command -v \"$DEP\" &>/dev/null ; then\n echo \"$DEP is missing. Skipping \\${THIS}.\"\n exit 0\n fi\n}\n\nif [ -z \"$APPIMAGE\" ] ; then\n APPIMAGE=\"$APPDIR/${APP_RUN_ENTRYPOINT}\"\n # not running from within an AppImage; hence using the AppRun for Exec=\nfi\n\n${\n eulaEnabled\n ? `if [ -z \"$APPIMAGE_SILENT_INSTALL\" ] ; then\n EULA_MARK_DIR=\"\\${XDG_CONFIG_HOME:-$HOME/.config}/${config.ProductFilename}\"\n EULA_MARK_FILE=\"$EULA_MARK_DIR/eulaAccepted\"\n # show EULA only if desktop file doesn't exist\n if [ ! -e \"$EULA_MARK_FILE\" ] ; then\n if [ -x /usr/bin/zenity ] ; then\n # on cancel simply exits and our trap handler launches app, so, $isEulaAccepted is set here to 0 and then to 1 if EULA accepted\n isEulaAccepted=0\n LD_LIBRARY_PATH=\"\" zenity --text-info --title=${escapeShellString(config.ProductName)} --filename=\"$APPDIR/${config.EulaFile}\" --ok-label=Agree --cancel-label=Disagree ${config.IsHtmlEula ? \"--html\" : \"\"}\n elif [ -x /usr/bin/Xdialog ] ; then\n isEulaAccepted=0\n LD_LIBRARY_PATH=\"\" Xdialog --title ${escapeShellString(config.ProductName)} --textbox \"$APPDIR/${config.EulaFile}\" 30 80 --ok-label Agree --cancel-label Disagree\n elif [ -x /usr/bin/kdialog ] ; then\n # cannot find any option to force Agree/Disagree buttons for kdialog. And official example exactly with OK button https://techbase.kde.org/Development/Tutorials/Shell_Scripting_with_KDE_Dialogs#Example_21._--textbox_dialog_box\n # in any case we pass labels text\n isEulaAccepted=0\n LD_LIBRARY_PATH=\"\" kdialog --textbox \"$APPDIR/${config.EulaFile}\" --yes-label Agree --cancel-label \"Disagree\"\n fi\n\n case $? in\n 0)\n isEulaAccepted=1\n echo \"License accepted\"\n mkdir -p \"$EULA_MARK_DIR\"\n touch \"$EULA_MARK_FILE\"\n ;;\n 1)\n echo \"License not accepted\"\n exit 0\n ;;\n -1)\n echo \"An unexpected error has occurred.\"\n isEulaAccepted=1\n ;;\n esac\n fi\nfi`\n : \"\"\n}\n`\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BlockMapDataHolder } from "builder-util-runtime";
|
|
2
|
+
export type CompressionFormat = "deflate" | "gzip";
|
|
3
|
+
/**
|
|
4
|
+
* Build a content-defined block map for `inFile` using Rabin fingerprinting.
|
|
5
|
+
*
|
|
6
|
+
* Files are processed via streaming (peak memory ≈ RABIN_MAX = 32 KB per chunk,
|
|
7
|
+
* not the full file size), making this safe for large installers.
|
|
8
|
+
*
|
|
9
|
+
* - If `outFile` is omitted: compressed blockmap is appended to `inFile`
|
|
10
|
+
* (used for NSIS web installer / AppImage embed); `blockMapSize` is returned.
|
|
11
|
+
* - If `outFile` is provided: compressed blockmap is written to that file;
|
|
12
|
+
* `blockMapSize` is not included in the result.
|
|
13
|
+
*
|
|
14
|
+
* Returned `sha512` is SHA-512 of the full file as it exists after the call.
|
|
15
|
+
*/
|
|
16
|
+
export declare function buildBlockMap(inFile: string, compressionFormat: CompressionFormat, outFile?: string): Promise<BlockMapDataHolder>;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildBlockMap = buildBlockMap;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const promises_1 = require("fs/promises");
|
|
7
|
+
const zlib = require("zlib");
|
|
8
|
+
const blake2_js_1 = require("@noble/hashes/blake2.js");
|
|
9
|
+
// Rabin fingerprinting constants from github.com/aclements/go-rabin:
|
|
10
|
+
// Poly64 = 0xbfe6b8a5bf378d83 (degree-63 irreducible polynomial over GF(2))
|
|
11
|
+
// Window = 64 bytes, Avg = 16 KB, Min = 8 KB, Max = 32 KB
|
|
12
|
+
// Boundary condition: (hash & (AVG-1)) === (AVG-1), i.e. all mask bits set.
|
|
13
|
+
//
|
|
14
|
+
// The tables below are precomputed offline (avoiding BigInt in production):
|
|
15
|
+
// PUSH[i] = (i * x^63 + (i * x^63 mod p)) truncated to 64 bits
|
|
16
|
+
// POP[i] = (i * x^(63*8)) mod p
|
|
17
|
+
// Each stored as signed Int32 hi/lo pair; hash = hi*2^32 + lo (unsigned 64-bit).
|
|
18
|
+
// prettier-ignore
|
|
19
|
+
const PUSH_HI = new Int32Array([0, -1075398491, 2144170315, -1070872082, 1081891379, -6626666, 1068575608, -2141744163, 1058933955, -2131184538, 1087602056, -13253331, 2137151216, -1065030059, 11478971, -1085694178, 2117867910, -1042636509, 32598221, -1105735576, 1044399029, -2119763184, 1099772670, -26506661, 1092752709, -20664864, 1055876110, -2130060117, 22957942, -1095174189, 2123578941, -1049262440, 1134463913, -59231476, 1012136674, -2085273017, 65196442, -1140561601, 2083496145, -1010231180, 2088798058, -1016709169, 55440929, -1129623932, 1023204697, -2095421956, 1127328786, -53013321, 1034064431, -2109461878, 1114628964, -41329727, 2111752220, -1036488519, 34847063, -1108016654, 45915884, -1118165431, 2104618919, -1030269182, 1119929567, -47809414, 1024308628, -2098524879, 953921527, -2026039470, 1192681148, -118462951, 2024273348, -952021663, 124421263, -1198769110, 130392884, -1205658735, 2013844095, -940676390, 1203370247, -127975006, 947161164, -2020462359, 1189590641, -117371180, 959104826, -2033418337, 110881858, -1182968601, 2035719433, -961534548, 2046409394, -971046377, 104123385, -1177390244, 965075073, -2040309724, 1179161034, -106026641, 2068128862, -995910405, 76043541, -1150358096, 993623661, -2065709368, 1156845350, -82659453, 1146824861, -71462856, 999709142, -2072977037, 69694126, -1144927733, 2078933989, -1005798592, 91831768, -1163950723, 2058636435, -984419274, 1157982187, -85729458, 986191520, -2060538363, 979841307, -2055108162, 1168785488, -95618827, 2048617256, -973220979, 97917539, -1171217722, 1907843054, -833493173, 242888357, -1315138048, 835388893, -1909605000, 1309045910, -236925901, 1319719725, -246420600, 828645990, -1904043325, 248842526, -1322012229, 1897429077, -822165264, 260785768, -1334968627, 1883649827, -811561082, 1341594715, -267279106, 809135376, -1881352779, 815090347, -1888226802, 1331182560, -255950011, 1894322328, -821057475, 254042579, -1329407626, 841602119, -1915786014, 1306830092, -234742359, 1918209652, -843893039, 228130623, -1300346982, 221763716, -1294901215, 1929030095, -853798550, 1296794295, -223528430, 847705084, -1923069095, 1276497345, -202148508, 869842058, -1942092753, 208246770, -1282461865, 1940186809, -868065764, 1930150146, -856852057, 214347849, -1289746196, 863476529, -1936645228, 1287318138, -212053281, 1231876121, -158709572, 916554066, -1991820809, 152087082, -1225387377, 1994251105, -918854716, 1987247322, -913030017, 163548561, -1235667660, 906929897, -1981276596, 1237571490, -165318905, 928049567, -2001317574, 1218287828, -142925711, 1999418284, -926282999, 149013223, -1224246718, 139388252, -1213702663, 2005111831, -932893518, 1211285359, -137099318, 939511332, -2011597183, 183663536, -1256930539, 1967065851, -891702690, 1250828675, -177694426, 893604040, -1968838547, 904689523, -1979002922, 1243678264, -171458915, 1972383040, -898198043, 173890571, -1245977426, 1959682614, -886515053, 184750973, -1260016680, 884094981, -1957396320, 1266633038, -191237653, 1271951093, -197732784, 874323902, -1946441957, 195835078, -1270182813, 1952531853, -880280280]);
|
|
20
|
+
// prettier-ignore
|
|
21
|
+
const PUSH_LO = new Int32Array([0, -1086878333, 2121210630, -1051158907, 1139391375, -52546036, 1032233097, -2102317814, 954530461, -2016184546, 1183572379, -105092072, 2064466194, -1002779503, 90331668, -1168779369, 1909060922, -822183751, 262598204, -1332649025, 840978101, -1927822538, 1280267699, -210184144, 1227689895, -166034908, 927077537, -2005559006, 180663336, -1242351189, 1957408558, -878959955, 1554278391, -476845452, 583761137, -1644367502, 525196408, -1602596357, 1629669246, -569029891, 1681956202, -612953879, 439322220, -1525150737, 665396965, -1734431898, 1506164195, -420368288, 762155725, -1839587506, 1392675275, -332069816, 1854155074, -776756031, 283849284, -1344487481, 361326672, -1430329901, 1810264918, -724435243, 1449186271, -380150180, 672123097, -1757919910, 109003373, -1186410514, 2014337387, -953690904, 1167522274, -90082207, 1006232292, -2066845849, 1050392816, -2119420557, 1089774582, -3985803, 2104623999, -1035628804, 52238457, -1138059782, 2008463191, -931054892, 165260369, -1225907758, 878644440, -1956085413, 1244665822, -184051107, 1330793930, -261767095, 826103500, -1911891121, 213644869, -1282638906, 1926556995, -840736576, 1524311450, -437475303, 615792284, -1685867745, 422747669, -1509616746, 1734182163, -664139632, 1648353031, -586657148, 475055105, -1553512062, 567698568, -1629361909, 1605992334, -527502835, 722653344, -1809490653, 1434307494, -364231131, 1761307439, -674437460, 378826793, -1448870486, 334899773, -1396594754, 1838756155, -760300360, 1344246194, -282584015, 779127476, -1857616073, 218006746, -1278670503, 1922146268, -844754337, 1326923605, -266292522, 829957203, -1907381808, 874151495, -1959922748, 1249207617, -180164414, 2012464584, -926660533, 161275598, -1230286003, 2100785632, -1040122781, 56126182, -1133516955, 1054788207, -2115418132, 1085395305, -7971606, 1171491709, -85719298, 1002213499, -2071257608, 104476914, -1190281871, 2018847732, -949836169, 1348133677, -278040914, 775288875, -1862109784, 330520738, -1400580831, 1843151780, -756298201, 1757288880, -678849485, 382796470, -1444507851, 727163455, -1805635652, 1429780793, -368102214, 563287575, -1633379436, 1610353937, -523534190, 1652207000, -582148069, 471185054, -1558037731, 427289738, -1505730295, 1729689484, -667977201, 1520326405, -441853306, 619793411, -1681473152, 176277175, -1246344396, 1961811377, -874950606, 1231584568, -161484613, 923231806, -2010059843, 845495338, -1923960407, 1275733804, -214062417, 1905035173, -826602970, 266575011, -1328279264, 2068329357, -998261234, 86452363, -1173314296, 950110210, -2020211327, 1187943172, -101114233, 1135397136, -56933229, 1036243478, -2097913963, 4551327, -1082982628, 2116708761, -1055005670, 1445306688, -384684861, 675985990, -1753401403, 365697743, -1426352308, 1805844937, -728462262, 1858165725, -772352418, 279855323, -1348874920, 757653586, -1843434031, 1397226324, -328173865, 669799546, -1730422279, 1501777788, -424361217, 1678110709, -617454986, 443217139, -1520600720, 520662759, -1606474908, 1634186721, -565168030, 1558254952, -472475413, 579735150, -1648786451]);
|
|
22
|
+
// prettier-ignore
|
|
23
|
+
const POP_HI = new Int32Array([0, 2138251555, 1090583266, 1047780289, 1038568800, 1117023299, 2095560578, 60069537, 2077137601, 79543266, 986603555, 1170030848, 1177147297, 962262658, 120139075, 2019167328, 1216056615, 923315204, 159086533, 1980258022, 1973207111, 183492964, 882653861, 1273961350, 867506150, 1288058565, 1924525316, 231132199, 240278150, 1898019749, 1330815076, 807502151, 789684970, 1348633545, 1846630408, 291666219, 318173066, 1837485737, 1408636264, 746927179, 1423915051, 732698888, 366985929, 1789715434, 1765307723, 374035560, 674795433, 1464577674, 1735012301, 404295406, 644535599, 1494873100, 1519215277, 637420430, 462264399, 1694415212, 480556300, 1675072559, 1571049454, 584543949, 558102636, 1580259663, 1615004302, 523248557, 1579369941, 558916854, 522436407, 1615896084, 1673791669, 481765782, 583332439, 1572328308, 636346132, 1520369207, 1693263350, 463340757, 403346036, 1736029015, 1493854358, 645482933, 374917362, 1764485585, 1465397776, 673911603, 733971858, 1422697649, 1790934896, 365715027, 1838567987, 317027088, 748071121, 1407551986, 1349590867, 788676208, 292677041, 1845675154, 1899161407, 239191580, 808590813, 1329675518, 1289071199, 866552700, 232083645, 1923510686, 184319486, 1972329693, 1274840860, 881829439, 924528798, 1214779837, 1981532796, 157870943, 961112600, 1178225467, 2018087162, 121287129, 78522232, 2078082651, 1169087898, 987626681, 1116205273, 1039454714, 59181627, 2096376600, 2137046457, 1285274, 1046497115, 1091790456, 60830479, 2094207532, 1117833709, 1037297870, 1044872815, 1093951308, 2135393421, 3450286, 2020518350, 119376109, 963531564, 1176334863, 1166664878, 989513101, 76095052, 2079997807, 1272692264, 883465995, 182142154, 1973970409, 1983705928, 156226155, 926681514, 1213147273, 806692073, 1332086218, 1897258507, 241631016, 233990537, 1921075370, 1290965867, 864137800, 749834725, 1405268166, 1840343815, 314722852, 290905221, 1847983526, 1347823207, 790955844, 1467943716, 671885831, 377483718, 1762447589, 1788364356, 367748967, 731430054, 1424727429, 1690967234, 465124833, 634054176, 1522124547, 1496142242, 643723393, 405646144, 1734249059, 520390147, 1618454304, 1577352417, 561470914, 585354083, 1569778240, 1675833729, 479203490, 1568896730, 586176505, 478383160, 1676717339, 1617181626, 521607833, 560251224, 1578623099, 642640923, 1497287992, 1733105401, 406730714, 464167291, 1691975768, 1521114009, 635009722, 368638973, 1787550430, 1425539359, 730538044, 673167005, 1466734526, 1763658879, 376204636, 1849057596, 289751071, 792107998, 1346747133, 1406217308, 748817791, 315741886, 1839396765, 1922225200, 232912147, 865218258, 1289818097, 1333107024, 805746803, 242574258, 1896235665, 157044465, 1982820306, 1214034963, 925865264, 884671377, 1271407282, 1975253363, 180934736, 988371223, 1167751220, 2078909429, 77234902, 118363255, 2021471572, 1175383701, 964546486, 1093125078, 1045750517, 2570548, 2136217623, 2092994230, 62107541, 1036022868, 1119049079]);
|
|
24
|
+
// prettier-ignore
|
|
25
|
+
const POP_LO = new Int32Array([0, -1826189856, -1720019389, 173808547, -1916624635, 518270181, 347617094, -2019640666, 461718026, -2002530326, -2097163191, 299456937, -1773673713, 90271471, 255685964, -1675888468, -2009265769, 454788215, 289906644, -2107567564, 100640914, -1764153998, -1668989231, 262386481, -1816638563, 10405501, 180542942, -1713090498, 511371928, -1923324040, -2030011173, 338096443, -1353867603, 1013650253, 909576430, -1525578482, 579813288, -1314278840, -1141528085, 684925963, -1261904729, 669929799, 766659300, -1097545980, 956988834, -1439895486, -1603212319, 861300225, 661690170, -1269425446, -1106640519, 757894297, -1431161281, 966048735, 868786300, -1595003492, 1022743856, -1345103664, -1517337741, 917098131, -1321765835, 571603413, 676192886, -1150586986, 1587232090, -843206470, -941511911, 1422337785, -749101985, 1082069439, 1243810332, -653948932, 1159626576, -700910928, -597366509, 1329751283, -925049259, 1543132085, 1369851926, -1031748106, -693750579, 1166063917, 1339859598, -587583634, 1533318600, -935192536, -1038220405, 1362660971, -853313849, 1577450279, 1415176324, -947950236, 1088542658, -741909982, -644136575, 1253952609, -237591561, 1659907607, 1756116404, -74794924, 2081686258, -281899246, -445737807, 1984436561, -363601411, 2037738525, 1932097470, -535823778, 1737572600, -189281000, -18098501, 1842174811, 2045487712, -355653760, -527352797, 1941418435, -198636699, 1729070725, 1834196262, -25882426, 1651435626, -246913654, -82543063, 1748169673, -273921681, 2089469071, 1993793324, -437234996, 33683255, -1859683625, -1686412940, 140373140, -1883023822, 484826066, 381272177, -2053157487, 428127549, -1969080099, -2130828418, 332967582, -1807346632, 123771352, 222069371, -1642459237, -1975714144, 421163840, 323381475, -2141133565, 134111141, -1797729723, -1635464730, 228738054, -1850098518, 43987274, 147008233, -1679448311, 477830575, -1889693617, -2063496212, 371656204, -1387501158, 1047192698, 876019673, -1492094407, 546228383, -1280817793, -1175167268, 718459708, -1228330096, 636462704, 800308691, -1131073485, 990612117, -1473443979, -1569645354, 827822390, 628187149, -1235751443, -1140066738, 791509934, -1464614648, 999640296, 835278667, -1561339221, 1056186887, -1378701337, -1483819964, 883440036, -1288273150, 537923298, 709629249, -1184196447, 1553648237, -809744499, -975152082, 1455870414, -782734488, 1115612808, 1210252587, -620465973, 1193248871, -734460537, -563798492, 1296274372, -891475614, 1509663874, 1403502369, -1065274687, -727202822, 1199656474, 1306351033, -553920423, 1499816703, -901517537, -1071647556, 1396275548, -819822096, 1543769104, 1448613811, -981558701, 1121984757, -775508715, -610617674, 1220295510, -203991872, 1626462496, 1789772419, -108310685, 2115368389, -315394011, -412130426, 1951002214, -397273398, 2071239466, 1898479753, -502395543, 1703983055, -155829713, -51764852, 1875684460, 2078956887, -389230409, -493827308, 1907771124, -165086126, 1695445426, 1867672081, -59447311, 1617895261, -213282115, -116029154, 1781728510, -307380648, 2123051960, 1960257563, -403593733]);
|
|
26
|
+
// Chunker parameters
|
|
27
|
+
const RABIN_MIN = 8192;
|
|
28
|
+
const RABIN_AVG = 16384;
|
|
29
|
+
const RABIN_MAX = 32768;
|
|
30
|
+
const RABIN_WINDOW = 64;
|
|
31
|
+
// Boundary: all mask bits (14 bits) set in lo word. RABIN_AVG is a power of 2.
|
|
32
|
+
const RABIN_HASH_MASK = RABIN_AVG - 1; // 0x3FFF
|
|
33
|
+
function compress(data, format) {
|
|
34
|
+
return format === "deflate" ? zlib.deflateRawSync(data, { level: 9 }) : zlib.gzipSync(data, { level: 9 });
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Build a content-defined block map for `inFile` using Rabin fingerprinting.
|
|
38
|
+
*
|
|
39
|
+
* Files are processed via streaming (peak memory ≈ RABIN_MAX = 32 KB per chunk,
|
|
40
|
+
* not the full file size), making this safe for large installers.
|
|
41
|
+
*
|
|
42
|
+
* - If `outFile` is omitted: compressed blockmap is appended to `inFile`
|
|
43
|
+
* (used for NSIS web installer / AppImage embed); `blockMapSize` is returned.
|
|
44
|
+
* - If `outFile` is provided: compressed blockmap is written to that file;
|
|
45
|
+
* `blockMapSize` is not included in the result.
|
|
46
|
+
*
|
|
47
|
+
* Returned `sha512` is SHA-512 of the full file as it exists after the call.
|
|
48
|
+
*/
|
|
49
|
+
async function buildBlockMap(inFile, compressionFormat, outFile) {
|
|
50
|
+
const fileHash = (0, crypto_1.createHash)("sha512");
|
|
51
|
+
const checksums = [];
|
|
52
|
+
const sizes = [];
|
|
53
|
+
let totalSize = 0;
|
|
54
|
+
// Per-chunk Rabin state. Peak memory ≈ RABIN_MAX (32 KB) — not file size.
|
|
55
|
+
const chunkBuf = Buffer.allocUnsafe(RABIN_MAX);
|
|
56
|
+
let chunkN = 0; // bytes accumulated for current chunk
|
|
57
|
+
let hi = 0;
|
|
58
|
+
let lo = 0;
|
|
59
|
+
const win = new Uint8Array(RABIN_WINDOW); // rolling window ring buffer
|
|
60
|
+
let wpos = 0;
|
|
61
|
+
function emitChunk() {
|
|
62
|
+
checksums.push(Buffer.from((0, blake2_js_1.blake2b)(chunkBuf.subarray(0, chunkN), { dkLen: 18 })).toString("base64"));
|
|
63
|
+
sizes.push(chunkN);
|
|
64
|
+
chunkN = 0;
|
|
65
|
+
hi = 0;
|
|
66
|
+
lo = 0;
|
|
67
|
+
win.fill(0);
|
|
68
|
+
wpos = 0;
|
|
69
|
+
}
|
|
70
|
+
// Called once per byte; inlines the three-phase Rabin state machine:
|
|
71
|
+
// skip (< MIN-WINDOW bytes) → prime (next WINDOW bytes) → scan (≥ MIN bytes)
|
|
72
|
+
function processByte(b) {
|
|
73
|
+
chunkBuf[chunkN++] = b;
|
|
74
|
+
if (chunkN <= RABIN_MIN - RABIN_WINDOW) {
|
|
75
|
+
// Skip phase: not close enough to MIN to start priming yet
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (chunkN <= RABIN_MIN) {
|
|
79
|
+
// Prime phase: non-windowed hash update, filling the ring buffer
|
|
80
|
+
win[wpos] = b;
|
|
81
|
+
wpos = (wpos + 1) % RABIN_WINDOW;
|
|
82
|
+
const top = (hi >>> 23) & 0xff;
|
|
83
|
+
const nhi = ((hi << 8) | (lo >>> 24)) & 0x7fffffff;
|
|
84
|
+
const nlo = ((lo << 8) | b) & 0xffffffff;
|
|
85
|
+
hi = (nhi ^ PUSH_HI[top]) | 0;
|
|
86
|
+
lo = (nlo ^ PUSH_LO[top]) | 0;
|
|
87
|
+
// At exactly MIN: check whether the primed hash is already a boundary
|
|
88
|
+
if (chunkN === RABIN_MIN && (lo & RABIN_HASH_MASK) === RABIN_HASH_MASK)
|
|
89
|
+
emitChunk();
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// Scan phase: sliding window — pop oldest byte, push new byte
|
|
93
|
+
const old = win[wpos];
|
|
94
|
+
win[wpos] = b;
|
|
95
|
+
wpos = (wpos + 1) % RABIN_WINDOW;
|
|
96
|
+
hi = (hi ^ POP_HI[old]) | 0;
|
|
97
|
+
lo = (lo ^ POP_LO[old]) | 0;
|
|
98
|
+
const top = (hi >>> 23) & 0xff;
|
|
99
|
+
const nhi = ((hi << 8) | (lo >>> 24)) & 0x7fffffff;
|
|
100
|
+
const nlo = ((lo << 8) | b) & 0xffffffff;
|
|
101
|
+
hi = (nhi ^ PUSH_HI[top]) | 0;
|
|
102
|
+
lo = (nlo ^ PUSH_LO[top]) | 0;
|
|
103
|
+
if ((lo & RABIN_HASH_MASK) === RABIN_HASH_MASK || chunkN >= RABIN_MAX)
|
|
104
|
+
emitChunk();
|
|
105
|
+
}
|
|
106
|
+
// Stream-read the file, feeding SHA-512 and the Rabin chunker simultaneously
|
|
107
|
+
await new Promise((resolve, reject) => {
|
|
108
|
+
const rs = (0, fs_1.createReadStream)(inFile, { highWaterMark: 256 * 1024 });
|
|
109
|
+
rs.on("data", (chunk) => {
|
|
110
|
+
const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
111
|
+
chunk = buf;
|
|
112
|
+
fileHash.update(chunk);
|
|
113
|
+
totalSize += chunk.length;
|
|
114
|
+
for (let i = 0; i < chunk.length; i++)
|
|
115
|
+
processByte(chunk[i]);
|
|
116
|
+
});
|
|
117
|
+
rs.on("end", () => {
|
|
118
|
+
if (chunkN > 0)
|
|
119
|
+
emitChunk();
|
|
120
|
+
resolve();
|
|
121
|
+
});
|
|
122
|
+
rs.on("error", reject);
|
|
123
|
+
});
|
|
124
|
+
const blockMap = {
|
|
125
|
+
version: "2",
|
|
126
|
+
files: [{ name: "file", offset: 0, checksums, sizes }],
|
|
127
|
+
};
|
|
128
|
+
const compressed = compress(Buffer.from(JSON.stringify(blockMap)), compressionFormat);
|
|
129
|
+
if (outFile == null || outFile === "") {
|
|
130
|
+
// Append mode: write compressed blockmap + 4-byte size in one atomic call
|
|
131
|
+
// to avoid a partial-write window between the two separate appendFile calls.
|
|
132
|
+
const sizeHeader = Buffer.allocUnsafe(4);
|
|
133
|
+
sizeHeader.writeUInt32BE(compressed.length, 0);
|
|
134
|
+
const appended = Buffer.concat([compressed, sizeHeader]);
|
|
135
|
+
await (0, promises_1.appendFile)(inFile, appended);
|
|
136
|
+
fileHash.update(appended);
|
|
137
|
+
return {
|
|
138
|
+
size: totalSize + appended.length,
|
|
139
|
+
sha512: fileHash.digest("base64"),
|
|
140
|
+
blockMapSize: compressed.length,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
await (0, promises_1.writeFile)(outFile, compressed);
|
|
144
|
+
return {
|
|
145
|
+
size: totalSize,
|
|
146
|
+
sha512: fileHash.digest("base64"),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=blockmap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockmap.js","sourceRoot":"","sources":["../../../src/targets/blockmap/blockmap.ts"],"names":[],"mappings":";;AA+DA,sCA2GC;AA1KD,mCAAmC;AACnC,2BAAqC;AACrC,0CAAmD;AACnD,6BAA4B;AAC5B,uDAAiD;AAGjD,qEAAqE;AACrE,8EAA8E;AAC9E,4DAA4D;AAC5D,4EAA4E;AAC5E,EAAE;AACF,4EAA4E;AAC5E,iEAAiE;AACjE,mCAAmC;AACnC,iFAAiF;AAEjF,kBAAkB;AAClB,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,QAAQ,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,QAAQ,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,CAAC,CAAC,CAAA;AAClxF,kBAAkB;AAClB,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,QAAQ,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,OAAO,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,CAAC,CAAC,CAAA;AACtxF,kBAAkB;AAClB,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,OAAO,EAAC,UAAU,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,OAAO,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,OAAO,EAAC,UAAU,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU,EAAC,UAAU,CAAC,CAAC,CAAA;AAClpF,kBAAkB;AAClB,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,QAAQ,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,CAAC,SAAS,CAAC,CAAC,CAAA;AAEtxF,qBAAqB;AACrB,MAAM,SAAS,GAAG,IAAI,CAAA;AACtB,MAAM,SAAS,GAAG,KAAK,CAAA;AACvB,MAAM,SAAS,GAAG,KAAK,CAAA;AACvB,MAAM,YAAY,GAAG,EAAE,CAAA;AACvB,+EAA+E;AAC/E,MAAM,eAAe,GAAG,SAAS,GAAG,CAAC,CAAA,CAAC,SAAS;AAc/C,SAAS,QAAQ,CAAC,IAAY,EAAE,MAAyB;IACvD,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;AAC3G,CAAC;AAED;;;;;;;;;;;;GAYG;AACI,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,iBAAoC,EAAE,OAAgB;IACxG,MAAM,QAAQ,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAA;IACrC,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,SAAS,GAAG,CAAC,CAAA;IAEjB,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;IAC9C,IAAI,MAAM,GAAG,CAAC,CAAA,CAAC,sCAAsC;IACrD,IAAI,EAAE,GAAG,CAAC,CAAA;IACV,IAAI,EAAE,GAAG,CAAC,CAAA;IACV,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,CAAA,CAAC,6BAA6B;IACtE,IAAI,IAAI,GAAG,CAAC,CAAA;IAEZ,SAAS,SAAS;QAChB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAA,mBAAO,EAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;QACpG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAClB,MAAM,GAAG,CAAC,CAAA;QACV,EAAE,GAAG,CAAC,CAAA;QACN,EAAE,GAAG,CAAC,CAAA;QACN,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACX,IAAI,GAAG,CAAC,CAAA;IACV,CAAC;IAED,qEAAqE;IACrE,+EAA+E;IAC/E,SAAS,WAAW,CAAC,CAAS;QAC5B,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAA;QAEtB,IAAI,MAAM,IAAI,SAAS,GAAG,YAAY,EAAE,CAAC;YACvC,2DAA2D;YAC3D,OAAM;QACR,CAAC;QAED,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC;YACxB,iEAAiE;YACjE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACb,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,CAAA;YAChC,MAAM,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;YAC9B,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,UAAU,CAAA;YAClD,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAA;YACxC,EAAE,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;YAC7B,EAAE,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;YAC7B,sEAAsE;YACtE,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,EAAE,GAAG,eAAe,CAAC,KAAK,eAAe;gBAAE,SAAS,EAAE,CAAA;YACnF,OAAM;QACR,CAAC;QAED,8DAA8D;QAC9D,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAA;QACrB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACb,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,CAAA;QAChC,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QAC3B,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QAC3B,MAAM,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;QAC9B,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,UAAU,CAAA;QAClD,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAA;QACxC,EAAE,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QAC7B,EAAE,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QAE7B,IAAI,CAAC,EAAE,GAAG,eAAe,CAAC,KAAK,eAAe,IAAI,MAAM,IAAI,SAAS;YAAE,SAAS,EAAE,CAAA;IACpF,CAAC;IAED,6EAA6E;IAC7E,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,EAAE,GAAG,IAAA,qBAAgB,EAAC,MAAM,EAAE,EAAE,aAAa,EAAE,GAAG,GAAG,IAAI,EAAE,CAAC,CAAA;QAClE,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;YACvC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC/D,KAAK,GAAG,GAAG,CAAA;YACX,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtB,SAAS,IAAI,KAAK,CAAC,MAAM,CAAA;YACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;gBAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9D,CAAC,CAAC,CAAA;QACF,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAChB,IAAI,MAAM,GAAG,CAAC;gBAAE,SAAS,EAAE,CAAA;YAC3B,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;QACF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAa;QACzB,OAAO,EAAE,GAAG;QACZ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;KACvD,CAAA;IACD,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAA;IAErF,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACtC,0EAA0E;QAC1E,6EAA6E;QAC7E,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;QACxC,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAA;QACxD,MAAM,IAAA,qBAAU,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAClC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAEzB,OAAO;YACL,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAC,MAAM;YACjC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;YACjC,YAAY,EAAE,UAAU,CAAC,MAAM;SAChC,CAAA;IACH,CAAC;IAED,MAAM,IAAA,oBAAS,EAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IACpC,OAAO;QACL,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;KAClC,CAAA;AACH,CAAC","sourcesContent":["import { createHash } from \"crypto\"\nimport { createReadStream } from \"fs\"\nimport { appendFile, writeFile } from \"fs/promises\"\nimport * as zlib from \"zlib\"\nimport { blake2b } from \"@noble/hashes/blake2.js\"\nimport { BlockMapDataHolder } from \"builder-util-runtime\"\n\n// Rabin fingerprinting constants from github.com/aclements/go-rabin:\n// Poly64 = 0xbfe6b8a5bf378d83 (degree-63 irreducible polynomial over GF(2))\n// Window = 64 bytes, Avg = 16 KB, Min = 8 KB, Max = 32 KB\n// Boundary condition: (hash & (AVG-1)) === (AVG-1), i.e. all mask bits set.\n//\n// The tables below are precomputed offline (avoiding BigInt in production):\n// PUSH[i] = (i * x^63 + (i * x^63 mod p)) truncated to 64 bits\n// POP[i] = (i * x^(63*8)) mod p\n// Each stored as signed Int32 hi/lo pair; hash = hi*2^32 + lo (unsigned 64-bit).\n\n// prettier-ignore\nconst PUSH_HI = new Int32Array([0,-1075398491,2144170315,-1070872082,1081891379,-6626666,1068575608,-2141744163,1058933955,-2131184538,1087602056,-13253331,2137151216,-1065030059,11478971,-1085694178,2117867910,-1042636509,32598221,-1105735576,1044399029,-2119763184,1099772670,-26506661,1092752709,-20664864,1055876110,-2130060117,22957942,-1095174189,2123578941,-1049262440,1134463913,-59231476,1012136674,-2085273017,65196442,-1140561601,2083496145,-1010231180,2088798058,-1016709169,55440929,-1129623932,1023204697,-2095421956,1127328786,-53013321,1034064431,-2109461878,1114628964,-41329727,2111752220,-1036488519,34847063,-1108016654,45915884,-1118165431,2104618919,-1030269182,1119929567,-47809414,1024308628,-2098524879,953921527,-2026039470,1192681148,-118462951,2024273348,-952021663,124421263,-1198769110,130392884,-1205658735,2013844095,-940676390,1203370247,-127975006,947161164,-2020462359,1189590641,-117371180,959104826,-2033418337,110881858,-1182968601,2035719433,-961534548,2046409394,-971046377,104123385,-1177390244,965075073,-2040309724,1179161034,-106026641,2068128862,-995910405,76043541,-1150358096,993623661,-2065709368,1156845350,-82659453,1146824861,-71462856,999709142,-2072977037,69694126,-1144927733,2078933989,-1005798592,91831768,-1163950723,2058636435,-984419274,1157982187,-85729458,986191520,-2060538363,979841307,-2055108162,1168785488,-95618827,2048617256,-973220979,97917539,-1171217722,1907843054,-833493173,242888357,-1315138048,835388893,-1909605000,1309045910,-236925901,1319719725,-246420600,828645990,-1904043325,248842526,-1322012229,1897429077,-822165264,260785768,-1334968627,1883649827,-811561082,1341594715,-267279106,809135376,-1881352779,815090347,-1888226802,1331182560,-255950011,1894322328,-821057475,254042579,-1329407626,841602119,-1915786014,1306830092,-234742359,1918209652,-843893039,228130623,-1300346982,221763716,-1294901215,1929030095,-853798550,1296794295,-223528430,847705084,-1923069095,1276497345,-202148508,869842058,-1942092753,208246770,-1282461865,1940186809,-868065764,1930150146,-856852057,214347849,-1289746196,863476529,-1936645228,1287318138,-212053281,1231876121,-158709572,916554066,-1991820809,152087082,-1225387377,1994251105,-918854716,1987247322,-913030017,163548561,-1235667660,906929897,-1981276596,1237571490,-165318905,928049567,-2001317574,1218287828,-142925711,1999418284,-926282999,149013223,-1224246718,139388252,-1213702663,2005111831,-932893518,1211285359,-137099318,939511332,-2011597183,183663536,-1256930539,1967065851,-891702690,1250828675,-177694426,893604040,-1968838547,904689523,-1979002922,1243678264,-171458915,1972383040,-898198043,173890571,-1245977426,1959682614,-886515053,184750973,-1260016680,884094981,-1957396320,1266633038,-191237653,1271951093,-197732784,874323902,-1946441957,195835078,-1270182813,1952531853,-880280280])\n// prettier-ignore\nconst PUSH_LO = new Int32Array([0,-1086878333,2121210630,-1051158907,1139391375,-52546036,1032233097,-2102317814,954530461,-2016184546,1183572379,-105092072,2064466194,-1002779503,90331668,-1168779369,1909060922,-822183751,262598204,-1332649025,840978101,-1927822538,1280267699,-210184144,1227689895,-166034908,927077537,-2005559006,180663336,-1242351189,1957408558,-878959955,1554278391,-476845452,583761137,-1644367502,525196408,-1602596357,1629669246,-569029891,1681956202,-612953879,439322220,-1525150737,665396965,-1734431898,1506164195,-420368288,762155725,-1839587506,1392675275,-332069816,1854155074,-776756031,283849284,-1344487481,361326672,-1430329901,1810264918,-724435243,1449186271,-380150180,672123097,-1757919910,109003373,-1186410514,2014337387,-953690904,1167522274,-90082207,1006232292,-2066845849,1050392816,-2119420557,1089774582,-3985803,2104623999,-1035628804,52238457,-1138059782,2008463191,-931054892,165260369,-1225907758,878644440,-1956085413,1244665822,-184051107,1330793930,-261767095,826103500,-1911891121,213644869,-1282638906,1926556995,-840736576,1524311450,-437475303,615792284,-1685867745,422747669,-1509616746,1734182163,-664139632,1648353031,-586657148,475055105,-1553512062,567698568,-1629361909,1605992334,-527502835,722653344,-1809490653,1434307494,-364231131,1761307439,-674437460,378826793,-1448870486,334899773,-1396594754,1838756155,-760300360,1344246194,-282584015,779127476,-1857616073,218006746,-1278670503,1922146268,-844754337,1326923605,-266292522,829957203,-1907381808,874151495,-1959922748,1249207617,-180164414,2012464584,-926660533,161275598,-1230286003,2100785632,-1040122781,56126182,-1133516955,1054788207,-2115418132,1085395305,-7971606,1171491709,-85719298,1002213499,-2071257608,104476914,-1190281871,2018847732,-949836169,1348133677,-278040914,775288875,-1862109784,330520738,-1400580831,1843151780,-756298201,1757288880,-678849485,382796470,-1444507851,727163455,-1805635652,1429780793,-368102214,563287575,-1633379436,1610353937,-523534190,1652207000,-582148069,471185054,-1558037731,427289738,-1505730295,1729689484,-667977201,1520326405,-441853306,619793411,-1681473152,176277175,-1246344396,1961811377,-874950606,1231584568,-161484613,923231806,-2010059843,845495338,-1923960407,1275733804,-214062417,1905035173,-826602970,266575011,-1328279264,2068329357,-998261234,86452363,-1173314296,950110210,-2020211327,1187943172,-101114233,1135397136,-56933229,1036243478,-2097913963,4551327,-1082982628,2116708761,-1055005670,1445306688,-384684861,675985990,-1753401403,365697743,-1426352308,1805844937,-728462262,1858165725,-772352418,279855323,-1348874920,757653586,-1843434031,1397226324,-328173865,669799546,-1730422279,1501777788,-424361217,1678110709,-617454986,443217139,-1520600720,520662759,-1606474908,1634186721,-565168030,1558254952,-472475413,579735150,-1648786451])\n// prettier-ignore\nconst POP_HI = new Int32Array([0,2138251555,1090583266,1047780289,1038568800,1117023299,2095560578,60069537,2077137601,79543266,986603555,1170030848,1177147297,962262658,120139075,2019167328,1216056615,923315204,159086533,1980258022,1973207111,183492964,882653861,1273961350,867506150,1288058565,1924525316,231132199,240278150,1898019749,1330815076,807502151,789684970,1348633545,1846630408,291666219,318173066,1837485737,1408636264,746927179,1423915051,732698888,366985929,1789715434,1765307723,374035560,674795433,1464577674,1735012301,404295406,644535599,1494873100,1519215277,637420430,462264399,1694415212,480556300,1675072559,1571049454,584543949,558102636,1580259663,1615004302,523248557,1579369941,558916854,522436407,1615896084,1673791669,481765782,583332439,1572328308,636346132,1520369207,1693263350,463340757,403346036,1736029015,1493854358,645482933,374917362,1764485585,1465397776,673911603,733971858,1422697649,1790934896,365715027,1838567987,317027088,748071121,1407551986,1349590867,788676208,292677041,1845675154,1899161407,239191580,808590813,1329675518,1289071199,866552700,232083645,1923510686,184319486,1972329693,1274840860,881829439,924528798,1214779837,1981532796,157870943,961112600,1178225467,2018087162,121287129,78522232,2078082651,1169087898,987626681,1116205273,1039454714,59181627,2096376600,2137046457,1285274,1046497115,1091790456,60830479,2094207532,1117833709,1037297870,1044872815,1093951308,2135393421,3450286,2020518350,119376109,963531564,1176334863,1166664878,989513101,76095052,2079997807,1272692264,883465995,182142154,1973970409,1983705928,156226155,926681514,1213147273,806692073,1332086218,1897258507,241631016,233990537,1921075370,1290965867,864137800,749834725,1405268166,1840343815,314722852,290905221,1847983526,1347823207,790955844,1467943716,671885831,377483718,1762447589,1788364356,367748967,731430054,1424727429,1690967234,465124833,634054176,1522124547,1496142242,643723393,405646144,1734249059,520390147,1618454304,1577352417,561470914,585354083,1569778240,1675833729,479203490,1568896730,586176505,478383160,1676717339,1617181626,521607833,560251224,1578623099,642640923,1497287992,1733105401,406730714,464167291,1691975768,1521114009,635009722,368638973,1787550430,1425539359,730538044,673167005,1466734526,1763658879,376204636,1849057596,289751071,792107998,1346747133,1406217308,748817791,315741886,1839396765,1922225200,232912147,865218258,1289818097,1333107024,805746803,242574258,1896235665,157044465,1982820306,1214034963,925865264,884671377,1271407282,1975253363,180934736,988371223,1167751220,2078909429,77234902,118363255,2021471572,1175383701,964546486,1093125078,1045750517,2570548,2136217623,2092994230,62107541,1036022868,1119049079])\n// prettier-ignore\nconst POP_LO = new Int32Array([0,-1826189856,-1720019389,173808547,-1916624635,518270181,347617094,-2019640666,461718026,-2002530326,-2097163191,299456937,-1773673713,90271471,255685964,-1675888468,-2009265769,454788215,289906644,-2107567564,100640914,-1764153998,-1668989231,262386481,-1816638563,10405501,180542942,-1713090498,511371928,-1923324040,-2030011173,338096443,-1353867603,1013650253,909576430,-1525578482,579813288,-1314278840,-1141528085,684925963,-1261904729,669929799,766659300,-1097545980,956988834,-1439895486,-1603212319,861300225,661690170,-1269425446,-1106640519,757894297,-1431161281,966048735,868786300,-1595003492,1022743856,-1345103664,-1517337741,917098131,-1321765835,571603413,676192886,-1150586986,1587232090,-843206470,-941511911,1422337785,-749101985,1082069439,1243810332,-653948932,1159626576,-700910928,-597366509,1329751283,-925049259,1543132085,1369851926,-1031748106,-693750579,1166063917,1339859598,-587583634,1533318600,-935192536,-1038220405,1362660971,-853313849,1577450279,1415176324,-947950236,1088542658,-741909982,-644136575,1253952609,-237591561,1659907607,1756116404,-74794924,2081686258,-281899246,-445737807,1984436561,-363601411,2037738525,1932097470,-535823778,1737572600,-189281000,-18098501,1842174811,2045487712,-355653760,-527352797,1941418435,-198636699,1729070725,1834196262,-25882426,1651435626,-246913654,-82543063,1748169673,-273921681,2089469071,1993793324,-437234996,33683255,-1859683625,-1686412940,140373140,-1883023822,484826066,381272177,-2053157487,428127549,-1969080099,-2130828418,332967582,-1807346632,123771352,222069371,-1642459237,-1975714144,421163840,323381475,-2141133565,134111141,-1797729723,-1635464730,228738054,-1850098518,43987274,147008233,-1679448311,477830575,-1889693617,-2063496212,371656204,-1387501158,1047192698,876019673,-1492094407,546228383,-1280817793,-1175167268,718459708,-1228330096,636462704,800308691,-1131073485,990612117,-1473443979,-1569645354,827822390,628187149,-1235751443,-1140066738,791509934,-1464614648,999640296,835278667,-1561339221,1056186887,-1378701337,-1483819964,883440036,-1288273150,537923298,709629249,-1184196447,1553648237,-809744499,-975152082,1455870414,-782734488,1115612808,1210252587,-620465973,1193248871,-734460537,-563798492,1296274372,-891475614,1509663874,1403502369,-1065274687,-727202822,1199656474,1306351033,-553920423,1499816703,-901517537,-1071647556,1396275548,-819822096,1543769104,1448613811,-981558701,1121984757,-775508715,-610617674,1220295510,-203991872,1626462496,1789772419,-108310685,2115368389,-315394011,-412130426,1951002214,-397273398,2071239466,1898479753,-502395543,1703983055,-155829713,-51764852,1875684460,2078956887,-389230409,-493827308,1907771124,-165086126,1695445426,1867672081,-59447311,1617895261,-213282115,-116029154,1781728510,-307380648,2123051960,1960257563,-403593733])\n\n// Chunker parameters\nconst RABIN_MIN = 8192\nconst RABIN_AVG = 16384\nconst RABIN_MAX = 32768\nconst RABIN_WINDOW = 64\n// Boundary: all mask bits (14 bits) set in lo word. RABIN_AVG is a power of 2.\nconst RABIN_HASH_MASK = RABIN_AVG - 1 // 0x3FFF\n\nexport type CompressionFormat = \"deflate\" | \"gzip\"\n\ninterface BlockMap {\n version: \"2\"\n files: Array<{\n name: string\n offset: number\n checksums: string[]\n sizes: number[]\n }>\n}\n\nfunction compress(data: Buffer, format: CompressionFormat): Buffer {\n return format === \"deflate\" ? zlib.deflateRawSync(data, { level: 9 }) : zlib.gzipSync(data, { level: 9 })\n}\n\n/**\n * Build a content-defined block map for `inFile` using Rabin fingerprinting.\n *\n * Files are processed via streaming (peak memory ≈ RABIN_MAX = 32 KB per chunk,\n * not the full file size), making this safe for large installers.\n *\n * - If `outFile` is omitted: compressed blockmap is appended to `inFile`\n * (used for NSIS web installer / AppImage embed); `blockMapSize` is returned.\n * - If `outFile` is provided: compressed blockmap is written to that file;\n * `blockMapSize` is not included in the result.\n *\n * Returned `sha512` is SHA-512 of the full file as it exists after the call.\n */\nexport async function buildBlockMap(inFile: string, compressionFormat: CompressionFormat, outFile?: string): Promise<BlockMapDataHolder> {\n const fileHash = createHash(\"sha512\")\n const checksums: string[] = []\n const sizes: number[] = []\n let totalSize = 0\n\n // Per-chunk Rabin state. Peak memory ≈ RABIN_MAX (32 KB) — not file size.\n const chunkBuf = Buffer.allocUnsafe(RABIN_MAX)\n let chunkN = 0 // bytes accumulated for current chunk\n let hi = 0\n let lo = 0\n const win = new Uint8Array(RABIN_WINDOW) // rolling window ring buffer\n let wpos = 0\n\n function emitChunk() {\n checksums.push(Buffer.from(blake2b(chunkBuf.subarray(0, chunkN), { dkLen: 18 })).toString(\"base64\"))\n sizes.push(chunkN)\n chunkN = 0\n hi = 0\n lo = 0\n win.fill(0)\n wpos = 0\n }\n\n // Called once per byte; inlines the three-phase Rabin state machine:\n // skip (< MIN-WINDOW bytes) → prime (next WINDOW bytes) → scan (≥ MIN bytes)\n function processByte(b: number) {\n chunkBuf[chunkN++] = b\n\n if (chunkN <= RABIN_MIN - RABIN_WINDOW) {\n // Skip phase: not close enough to MIN to start priming yet\n return\n }\n\n if (chunkN <= RABIN_MIN) {\n // Prime phase: non-windowed hash update, filling the ring buffer\n win[wpos] = b\n wpos = (wpos + 1) % RABIN_WINDOW\n const top = (hi >>> 23) & 0xff\n const nhi = ((hi << 8) | (lo >>> 24)) & 0x7fffffff\n const nlo = ((lo << 8) | b) & 0xffffffff\n hi = (nhi ^ PUSH_HI[top]) | 0\n lo = (nlo ^ PUSH_LO[top]) | 0\n // At exactly MIN: check whether the primed hash is already a boundary\n if (chunkN === RABIN_MIN && (lo & RABIN_HASH_MASK) === RABIN_HASH_MASK) emitChunk()\n return\n }\n\n // Scan phase: sliding window — pop oldest byte, push new byte\n const old = win[wpos]\n win[wpos] = b\n wpos = (wpos + 1) % RABIN_WINDOW\n hi = (hi ^ POP_HI[old]) | 0\n lo = (lo ^ POP_LO[old]) | 0\n const top = (hi >>> 23) & 0xff\n const nhi = ((hi << 8) | (lo >>> 24)) & 0x7fffffff\n const nlo = ((lo << 8) | b) & 0xffffffff\n hi = (nhi ^ PUSH_HI[top]) | 0\n lo = (nlo ^ PUSH_LO[top]) | 0\n\n if ((lo & RABIN_HASH_MASK) === RABIN_HASH_MASK || chunkN >= RABIN_MAX) emitChunk()\n }\n\n // Stream-read the file, feeding SHA-512 and the Rabin chunker simultaneously\n await new Promise<void>((resolve, reject) => {\n const rs = createReadStream(inFile, { highWaterMark: 256 * 1024 })\n rs.on(\"data\", (chunk: Buffer | string) => {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)\n chunk = buf\n fileHash.update(chunk)\n totalSize += chunk.length\n for (let i = 0; i < chunk.length; i++) processByte(chunk[i])\n })\n rs.on(\"end\", () => {\n if (chunkN > 0) emitChunk()\n resolve()\n })\n rs.on(\"error\", reject)\n })\n\n const blockMap: BlockMap = {\n version: \"2\",\n files: [{ name: \"file\", offset: 0, checksums, sizes }],\n }\n const compressed = compress(Buffer.from(JSON.stringify(blockMap)), compressionFormat)\n\n if (outFile == null || outFile === \"\") {\n // Append mode: write compressed blockmap + 4-byte size in one atomic call\n // to avoid a partial-write window between the two separate appendFile calls.\n const sizeHeader = Buffer.allocUnsafe(4)\n sizeHeader.writeUInt32BE(compressed.length, 0)\n const appended = Buffer.concat([compressed, sizeHeader])\n await appendFile(inFile, appended)\n fileHash.update(appended)\n\n return {\n size: totalSize + appended.length,\n sha512: fileHash.digest(\"base64\"),\n blockMapSize: compressed.length,\n }\n }\n\n await writeFile(outFile, compressed)\n return {\n size: totalSize,\n sha512: fileHash.digest(\"base64\"),\n }\n}\n"]}
|
|
@@ -7,7 +7,7 @@ exports.appendBlockmap = appendBlockmap;
|
|
|
7
7
|
exports.createBlockmap = createBlockmap;
|
|
8
8
|
const builder_util_1 = require("builder-util");
|
|
9
9
|
const path = require("path");
|
|
10
|
-
const
|
|
10
|
+
const blockmap_1 = require("./blockmap/blockmap");
|
|
11
11
|
exports.BLOCK_MAP_FILE_SUFFIX = ".blockmap";
|
|
12
12
|
function createNsisWebDifferentialUpdateInfo(artifactPath, packageFiles) {
|
|
13
13
|
if (packageFiles == null) {
|
|
@@ -61,12 +61,12 @@ function configureDifferentialAwareArchiveOptions(archiveOptions) {
|
|
|
61
61
|
}
|
|
62
62
|
async function appendBlockmap(file) {
|
|
63
63
|
builder_util_1.log.info({ file: builder_util_1.log.filePath(file) }, "building embedded block map");
|
|
64
|
-
return
|
|
64
|
+
return (0, blockmap_1.buildBlockMap)(file, "deflate");
|
|
65
65
|
}
|
|
66
66
|
async function createBlockmap(file, target, packager, safeArtifactName) {
|
|
67
67
|
const blockMapFile = `${file}${exports.BLOCK_MAP_FILE_SUFFIX}`;
|
|
68
68
|
builder_util_1.log.info({ blockMapFile: builder_util_1.log.filePath(blockMapFile) }, "building block map");
|
|
69
|
-
const updateInfo = await (0,
|
|
69
|
+
const updateInfo = await (0, blockmap_1.buildBlockMap)(file, "gzip", blockMapFile);
|
|
70
70
|
await packager.info.emitArtifactBuildCompleted({
|
|
71
71
|
file: blockMapFile,
|
|
72
72
|
safeArtifactName: safeArtifactName == null ? null : `${safeArtifactName}${exports.BLOCK_MAP_FILE_SUFFIX}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"differentialUpdateInfoBuilder.js","sourceRoot":"","sources":["../../src/targets/differentialUpdateInfoBuilder.ts"],"names":[],"mappings":";;;AAUA,kFAsBC;AAED,4FA4BC;AAED,wCAGC;AAED,wCAaC;AAlFD,+CAAkC;AAElC,6BAA4B;
|
|
1
|
+
{"version":3,"file":"differentialUpdateInfoBuilder.js","sourceRoot":"","sources":["../../src/targets/differentialUpdateInfoBuilder.ts"],"names":[],"mappings":";;;AAUA,kFAsBC;AAED,4FA4BC;AAED,wCAGC;AAED,wCAaC;AAlFD,+CAAkC;AAElC,6BAA4B;AAI5B,kDAAmD;AAEtC,QAAA,qBAAqB,GAAG,WAAW,CAAA;AAEhD,SAAgB,mCAAmC,CAAC,YAAoB,EAAE,YAAiD;IACzH,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;QACzB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACtC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,QAAQ,GAAwC,EAAE,CAAA;IACxD,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAChD,QAAQ,CAAC,IAAI,CAAC,GAAG;YACf,GAAG,eAAe;YAClB,IAAI,EAAE,IAAI;YACV,oEAAoE;YACpE,IAAI;SACE,CAAA;IACV,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAA;AACrB,CAAC;AAED,SAAgB,wCAAwC,CAAC,cAA8B;IACrF;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,cAAc,CAAC,QAAQ,GAAG,CAAC,CAAA;IAC3B,qDAAqD;IACrD,cAAc,CAAC,KAAK,GAAG,KAAK,CAAA;IAC5B,uEAAuE;IACvE,cAAc,CAAC,WAAW,GAAG,QAAQ,CAAA;IACrC,OAAO,cAAc,CAAA;AACvB,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,kBAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,6BAA6B,CAAC,CAAA;IACrE,OAAO,IAAA,wBAAa,EAAC,IAAI,EAAE,SAAS,CAAC,CAAA;AACvC,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,MAAc,EAAE,QAA+B,EAAE,gBAA+B;IACjI,MAAM,YAAY,GAAG,GAAG,IAAI,GAAG,6BAAqB,EAAE,CAAA;IACtD,kBAAG,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,kBAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAA;IAC5E,MAAM,UAAU,GAAG,MAAM,IAAA,wBAAa,EAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAA;IAClE,MAAM,QAAQ,CAAC,IAAI,CAAC,0BAA0B,CAAC;QAC7C,IAAI,EAAE,YAAY;QAClB,gBAAgB,EAAE,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,gBAAgB,GAAG,6BAAqB,EAAE;QACjG,MAAM;QACN,IAAI,EAAE,IAAI;QACV,QAAQ;QACR,UAAU;KACX,CAAC,CAAA;IACF,OAAO,UAAU,CAAA;AACnB,CAAC","sourcesContent":["import { log } from \"builder-util\"\nimport { BlockMapDataHolder, PackageFileInfo } from \"builder-util-runtime\"\nimport * as path from \"path\"\nimport { Target } from \"../core\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { ArchiveOptions } from \"./archive\"\nimport { buildBlockMap } from \"./blockmap/blockmap\"\n\nexport const BLOCK_MAP_FILE_SUFFIX = \".blockmap\"\n\nexport function createNsisWebDifferentialUpdateInfo(artifactPath: string, packageFiles: { [arch: string]: PackageFileInfo }) {\n if (packageFiles == null) {\n return null\n }\n\n const keys = Object.keys(packageFiles)\n if (keys.length <= 0) {\n return null\n }\n\n const packages: { [arch: string]: PackageFileInfo } = {}\n for (const arch of keys) {\n const packageFileInfo = packageFiles[arch]\n const file = path.basename(packageFileInfo.path)\n packages[arch] = {\n ...packageFileInfo,\n path: file,\n // https://github.com/electron-userland/electron-builder/issues/2583\n file,\n } as any\n }\n return { packages }\n}\n\nexport function configureDifferentialAwareArchiveOptions(archiveOptions: ArchiveOptions): ArchiveOptions {\n /*\n * dict size 64 MB: Full: 33,744.88 KB, To download: 17,630.3 KB (52%)\n * dict size 16 MB: Full: 33,936.84 KB, To download: 16,175.9 KB (48%)\n * dict size 8 MB: Full: 34,187.59 KB, To download: 8,229.9 KB (24%)\n * dict size 4 MB: Full: 34,628.73 KB, To download: 3,782.97 KB (11%)\n\n as we can see, if file changed in one place, all block is invalidated (and update size approximately equals to dict size)\n\n 1 MB is used:\n\n 1MB:\n\n 2018/01/11 11:54:41:0045 File has 59 changed blocks\n 2018/01/11 11:54:41:0050 Full: 71,588.59 KB, To download: 1,243.39 KB (2%)\n\n 4MB:\n\n 2018/01/11 11:31:43:0440 Full: 70,303.55 KB, To download: 4,843.27 KB (7%)\n 2018/01/11 11:31:43:0435 File has 234 changed blocks\n\n */\n archiveOptions.dictSize = 1\n // solid compression leads to a lot of changed blocks\n archiveOptions.solid = false\n // do not allow to change compression level to avoid different packages\n archiveOptions.compression = \"normal\"\n return archiveOptions\n}\n\nexport async function appendBlockmap(file: string): Promise<BlockMapDataHolder> {\n log.info({ file: log.filePath(file) }, \"building embedded block map\")\n return buildBlockMap(file, \"deflate\")\n}\n\nexport async function createBlockmap(file: string, target: Target, packager: PlatformPackager<any>, safeArtifactName: string | null): Promise<BlockMapDataHolder> {\n const blockMapFile = `${file}${BLOCK_MAP_FILE_SUFFIX}`\n log.info({ blockMapFile: log.filePath(blockMapFile) }, \"building block map\")\n const updateInfo = await buildBlockMap(file, \"gzip\", blockMapFile)\n await packager.info.emitArtifactBuildCompleted({\n file: blockMapFile,\n safeArtifactName: safeArtifactName == null ? null : `${safeArtifactName}${BLOCK_MAP_FILE_SUFFIX}`,\n target,\n arch: null,\n packager,\n updateInfo,\n })\n return updateInfo\n}\n"]}
|