From 01257e7170247a65dc07626a365c424d2ada5c92 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Wed, 19 Feb 2025 09:30:25 -0800 Subject: [PATCH 01/20] fix: when native modules are already universal, don't lipo. adds `node-mac-permissions` fixture from https://github.com/codebytere/node-mac-permissions and resolves 3 `it.todo` test cases --- .github/workflows/test.yml | 1 + jest.config.js | 1 + src/asar-utils.ts | 20 +++++ src/file-utils.ts | 14 +--- src/index.ts | 19 ++++- test/__snapshots__/index.spec.ts.snap | 66 +++++++++++++++++ test/fixtures/native/README.txt | 6 ++ .../native/node-mac-permissions.arm64.node | Bin 0 -> 142912 bytes .../node-mac-permissions.universal.node | Bin 0 -> 273984 bytes .../native/node-mac-permissions.x64.node | Bin 0 -> 115040 bytes test/index.spec.ts | 69 ++++++++++++++++-- test/util.ts | 21 +++++- 12 files changed, 195 insertions(+), 22 deletions(-) create mode 100644 test/fixtures/native/README.txt create mode 100755 test/fixtures/native/node-mac-permissions.arm64.node create mode 100755 test/fixtures/native/node-mac-permissions.universal.node create mode 100755 test/fixtures/native/node-mac-permissions.x64.node diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 93f024b..6a620e9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,6 +15,7 @@ jobs: test: name: Test strategy: + fail-fast: false matrix: node-version: - '20.5' diff --git a/jest.config.js b/jest.config.js index 978133c..f01272f 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,6 +2,7 @@ module.exports = { preset: 'ts-jest', testEnvironment: 'node', + testMatch: ['/test/**/*.spec.ts'], transform: { '^.+\\.ts?$': [ 'ts-jest', diff --git a/src/asar-utils.ts b/src/asar-utils.ts index dcadf8a..bb4d3f9 100644 --- a/src/asar-utils.ts +++ b/src/asar-utils.ts @@ -6,6 +6,7 @@ import path from 'path'; import { minimatch } from 'minimatch'; import os from 'os'; import { d } from './debug'; +import { ExitCodeError, spawn } from '@malept/cross-spawn-promise'; const LIPO = 'lipo'; @@ -76,6 +77,25 @@ function checkSingleArch(archive: string, file: string, allowList?: string): voi } } +export const getFileArch = async (filepath: string) => { + let fileOutput = ''; + try { + fileOutput = await spawn('file', ['--brief', '--no-pad', filepath]); + } catch (e) { + if (e instanceof ExitCodeError) { + /* silently accept error codes from "file" */ + } else { + throw e; + } + } + const multiLineIndex = fileOutput.indexOf('\n'); + const archStdOut = fileOutput.substring( + fileOutput.indexOf(':') + 1, + multiLineIndex > -1 ? multiLineIndex : undefined, + ); + return archStdOut; +}; + export const mergeASARs = async ({ x64AsarPath, arm64AsarPath, diff --git a/src/file-utils.ts b/src/file-utils.ts index 7a603a8..b1c2d32 100644 --- a/src/file-utils.ts +++ b/src/file-utils.ts @@ -1,6 +1,6 @@ -import { spawn, ExitCodeError } from '@malept/cross-spawn-promise'; import * as fs from 'fs-extra'; import * as path from 'path'; +import { getFileArch } from './asar-utils'; const MACHO_PREFIX = 'Mach-O '; @@ -35,19 +35,9 @@ export const getAllAppFiles = async (appPath: string): Promise => { if (info.isFile()) { let fileType = AppFileType.PLAIN; - var fileOutput = ''; - try { - fileOutput = await spawn('file', ['--brief', '--no-pad', p]); - } catch (e) { - if (e instanceof ExitCodeError) { - /* silently accept error codes from "file" */ - } else { - throw e; - } - } if (p.includes('app.asar')) { fileType = AppFileType.APP_CODE; - } else if (fileOutput.startsWith(MACHO_PREFIX)) { + } else if ((await getFileArch(p)).startsWith(MACHO_PREFIX)) { fileType = AppFileType.MACHO; } else if (p.endsWith('.bin')) { fileType = AppFileType.SNAPSHOT; diff --git a/src/index.ts b/src/index.ts index c7492a6..51d11ff 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,7 +8,13 @@ import * as plist from 'plist'; import * as dircompare from 'dir-compare'; import { AppFile, AppFileType, getAllAppFiles } from './file-utils'; -import { AsarMode, detectAsarMode, generateAsarIntegrity, mergeASARs } from './asar-utils'; +import { + AsarMode, + detectAsarMode, + generateAsarIntegrity, + getFileArch, + mergeASARs, +} from './asar-utils'; import { sha } from './sha'; import { d } from './debug'; @@ -161,6 +167,17 @@ export const makeUniversalApp = async (opts: MakeUniversalOpts): Promise = const first = await fs.realpath(path.resolve(tmpApp, machOFile.relativePath)); const second = await fs.realpath(path.resolve(opts.arm64AppPath, machOFile.relativePath)); + const isAlreadyUniversal = async (file: string) => + (await getFileArch(file)).includes('Mach-O universal binary'); + + // check if both files (same name) are already universal. + // this must occur before checking `sha` as their sha's will be different between builds if being built locally + if ((await isAlreadyUniversal(first)) && (await isAlreadyUniversal(second))) { + d(machOFile.relativePath, `is already universal across builds, skipping lipo`); + knownMergedMachOFiles.add(machOFile.relativePath); + continue; + } + const x64Sha = await sha(path.resolve(opts.x64AppPath, machOFile.relativePath)); const arm64Sha = await sha(path.resolve(opts.arm64AppPath, machOFile.relativePath)); if (x64Sha === arm64Sha) { diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index 2d0341d..6fe6f9b 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -313,6 +313,26 @@ exports[`makeUniversalApp force packages successfully if \`out\` bundle already } `; +exports[`makeUniversalApp no asar mode identical app dirs with different macho files (e.g. do not shim, but still lipo) 1`] = ` +[ + "index.js", + "node-mac-permissions.node", + { + "content": "{ + "name": "app", + "main": "index.js" +}", + "name": "package.json", + }, +] +`; + +exports[`makeUniversalApp no asar mode identical app dirs with different macho files (e.g. do not shim, but still lipo) 2`] = ` +{ + "Contents/Info.plist": {}, +} +`; + exports[`makeUniversalApp no asar mode should correctly merge two identical app folders 1`] = ` [ "index.js", @@ -408,3 +428,49 @@ exports[`makeUniversalApp no asar mode should shim two different app folders 5`] "Contents/Info.plist": {}, } `; + +exports[`makeUniversalApp works for lipo binary resources 1`] = ` +{ + "files": { + "index.js": { + "integrity": { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": [ + "8c8cefe616b330a70980c457e479360417a320f53f484d34df65227ce3add026", + ], + "hash": "8c8cefe616b330a70980c457e479360417a320f53f484d34df65227ce3add026", + }, + "size": 64, + }, + "package.json": { + "integrity": { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": [ + "d6226276d47adc7aa20e6c46e842e258f5157313074a035051a89612acdd6be3", + ], + "hash": "d6226276d47adc7aa20e6c46e842e258f5157313074a035051a89612acdd6be3", + }, + "size": 41, + }, + }, +} +`; + +exports[`makeUniversalApp works for lipo binary resources 2`] = ` +[ + "node-mac-permissions.node", +] +`; + +exports[`makeUniversalApp works for lipo binary resources 3`] = ` +{ + "Contents/Info.plist": { + "Resources/app.asar": { + "algorithm": "SHA256", + "hash": "85fff474383bd8df11cd9c5784e8fcd1525af71ff140a8a882e1dc9d5b39fcbf", + }, + }, +} +`; diff --git a/test/fixtures/native/README.txt b/test/fixtures/native/README.txt new file mode 100644 index 0000000..a34c41e --- /dev/null +++ b/test/fixtures/native/README.txt @@ -0,0 +1,6 @@ +Arch-specific modules generated from `node-mac-permissions` (https://github.com/codebytere/node-mac-permissions) using `electron/rebuild` + +Universal module generated with `lipo` +``` +lipo ./test/fixtures/native/node-mac-permissions.x64.node ./test/fixtures/native/node-mac-permissions.arm64.node -create -output ./test/fixtures/native/node-mac-permissions.universal.node +``` \ No newline at end of file diff --git a/test/fixtures/native/node-mac-permissions.arm64.node b/test/fixtures/native/node-mac-permissions.arm64.node new file mode 100755 index 0000000000000000000000000000000000000000..48371903848f6ae71f64128c758b9fd1ef33ab10 GIT binary patch literal 142912 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%0DG`@2Ov1i<)8%i>Jh}2Ig2R-pakuD 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 JTX5(3{{Rq~+)Dre literal 0 HcmV?d00001 diff --git a/test/fixtures/native/node-mac-permissions.x64.node b/test/fixtures/native/node-mac-permissions.x64.node new file mode 100755 index 0000000000000000000000000000000000000000..fd53dd6d9f4c7a41d1989fb0fdb7d307223d15fe GIT binary patch literal 115040 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 Cu#Z&$ literal 0 HcmV?d00001 diff --git a/test/index.spec.ts b/test/index.spec.ts index fffc2b9..8562db7 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -2,7 +2,13 @@ import * as fs from 'fs-extra'; import * as path from 'path'; import { makeUniversalApp } from '../dist/cjs/index'; -import { createTestApp, templateApp, VERIFY_APP_TIMEOUT, verifyApp } from './util'; +import { + createTestApp, + generateNativeApp, + templateApp, + VERIFY_APP_TIMEOUT, + verifyApp, +} from './util'; import { createPackage } from '@electron/asar'; const appsPath = path.resolve(__dirname, 'fixtures', 'apps'); @@ -27,7 +33,18 @@ describe('makeUniversalApp', () => { ); }); - it.todo('works for lipo binary resources'); + it( + 'works for lipo binary resources', + async () => { + const x64AppPath = await generateNativeApp('Lipo', 'X64Asar.app', 'x64'); + const arm64AppPath = await generateNativeApp('Lipo', 'Arm64Asar.app', 'arm64'); + + const out = path.resolve(appsOutPath, 'Lipo.app'); + await makeUniversalApp({ x64AppPath, arm64AppPath, outAppPath: out, mergeASARs: true }); + await verifyApp(out); + }, + VERIFY_APP_TIMEOUT, + ); describe('force', () => { it('throws an error if `out` bundle already exists and `force` is `false`', async () => { @@ -45,7 +62,7 @@ describe('makeUniversalApp', () => { it( 'packages successfully if `out` bundle already exists and `force` is `true`', async () => { - const out = path.resolve(appsOutPath, 'Error.app'); + const out = path.resolve(appsOutPath, 'NoError.app'); await fs.mkdirp(out); await makeUniversalApp({ x64AppPath: path.resolve(appsPath, 'X64Asar.app'), @@ -198,9 +215,47 @@ describe('makeUniversalApp', () => { }, VERIFY_APP_TIMEOUT, ); - }); - // TODO: Add tests for - // * different app dirs with different macho files - // * identical app dirs with universal macho files + it( + 'identical app dirs with different macho files (e.g. do not shim, but still lipo)', + async () => { + const x64AppPath = await generateNativeApp('DifferentMachoApp', 'X64NoAsar.app', 'x64'); + const arm64AppPath = await generateNativeApp( + 'DifferentMachoApp', + 'Arm64NoAsar.app', + 'arm64', + ); + + const out = path.resolve(appsOutPath, 'DifferentMachoApp.app'); + await makeUniversalApp({ + x64AppPath, + arm64AppPath, + outAppPath: out, + }); + await verifyApp(out); + }, + VERIFY_APP_TIMEOUT, + ); + + it( + 'identical app dirs with universal macho files (e.g., do not shim, just copy x64 dir)', + async () => { + const x64AppPath = await generateNativeApp( + 'UniversalMachoApp', + 'X64NoAsar.app', + 'universal', + ); + const arm64AppPath = await generateNativeApp( + 'UniversalMachoApp', + 'Arm64NoAsar.app', + 'universal', + ); + + const out = path.resolve(appsOutPath, 'UniversalMachoApp.app'); + await makeUniversalApp({ x64AppPath, arm64AppPath, outAppPath: out }); + await verifyApp(out); + }, + VERIFY_APP_TIMEOUT, + ); + }); }); diff --git a/test/util.ts b/test/util.ts index 03a9d6d..12ff6ff 100644 --- a/test/util.ts +++ b/test/util.ts @@ -12,8 +12,11 @@ import { getRawHeader } from '@electron/asar'; // plus some tests create fixtures at runtime export const VERIFY_APP_TIMEOUT = 80 * 1000; -export const asarsDir = path.resolve(__dirname, 'fixtures', 'asars'); -export const appsDir = path.resolve(__dirname, 'fixtures', 'apps'); +const fixtureDir = path.resolve(__dirname, 'fixtures'); +export const asarsDir = path.resolve(fixtureDir, 'asars'); +export const appsDir = path.resolve(fixtureDir, 'apps'); +export const appsOutPath = path.resolve(appsDir, 'out'); +const nativeModulesPath = path.resolve(fixtureDir, 'native'); export const verifyApp = async (appPath: string) => { await ensureUniversal(appPath); @@ -178,3 +181,17 @@ export const templateApp = async ( return appPath; }; + +export const generateNativeApp = async (testName: string, appName: string, arch: string) => { + const appPath = path.resolve(appsOutPath, `${testName}-${appName}`); + await fs.copy(path.resolve(appsDir, appName), appPath); + const resourcesApp = path.join(appPath, 'Contents', 'Resources', 'app'); + if (!fs.existsSync(resourcesApp)) { + await fs.mkdir(resourcesApp); + } + await fs.copy( + path.join(nativeModulesPath, `node-mac-permissions.${arch}.node`), + path.join(resourcesApp, 'node-mac-permissions.node'), + ); + return appPath; +}; From 5f15d759c37045877da5fd74df66a0cca272e641 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Wed, 19 Feb 2025 13:29:47 -0800 Subject: [PATCH 02/20] add test `different app dirs with different macho files (shim and lipo)` --- src/asar-utils.ts | 29 +----- src/file-utils.ts | 14 ++- src/index.ts | 18 ++-- test/__snapshots__/index.spec.ts.snap | 144 +++++++++++++++++++++++++- test/index.spec.ts | 55 ++++++++-- test/util.ts | 40 ++++--- 6 files changed, 239 insertions(+), 61 deletions(-) diff --git a/src/asar-utils.ts b/src/asar-utils.ts index bb4d3f9..831c5c4 100644 --- a/src/asar-utils.ts +++ b/src/asar-utils.ts @@ -6,7 +6,6 @@ import path from 'path'; import { minimatch } from 'minimatch'; import os from 'os'; import { d } from './debug'; -import { ExitCodeError, spawn } from '@malept/cross-spawn-promise'; const LIPO = 'lipo'; @@ -77,25 +76,6 @@ function checkSingleArch(archive: string, file: string, allowList?: string): voi } } -export const getFileArch = async (filepath: string) => { - let fileOutput = ''; - try { - fileOutput = await spawn('file', ['--brief', '--no-pad', filepath]); - } catch (e) { - if (e instanceof ExitCodeError) { - /* silently accept error codes from "file" */ - } else { - throw e; - } - } - const multiLineIndex = fileOutput.indexOf('\n'); - const archStdOut = fileOutput.substring( - fileOutput.indexOf(':') + 1, - multiLineIndex > -1 ? multiLineIndex : undefined, - ); - return archStdOut; -}; - export const mergeASARs = async ({ x64AsarPath, arm64AsarPath, @@ -172,10 +152,7 @@ export const mergeASARs = async ({ continue; } - if ( - MACHO_UNIVERSAL_MAGIC.has(x64Content.readUInt32LE(0)) && - MACHO_UNIVERSAL_MAGIC.has(arm64Content.readUInt32LE(0)) - ) { + if (isUniversalMachO(x64Content) && isUniversalMachO(arm64Content)) { continue; } @@ -243,3 +220,7 @@ export const mergeASARs = async ({ await Promise.all([fs.remove(x64Dir), fs.remove(arm64Dir)]); } }; + +export const isUniversalMachO = (fileContent: Buffer) => { + return MACHO_UNIVERSAL_MAGIC.has(fileContent.readUInt32LE(0)); +}; diff --git a/src/file-utils.ts b/src/file-utils.ts index b1c2d32..7a603a8 100644 --- a/src/file-utils.ts +++ b/src/file-utils.ts @@ -1,6 +1,6 @@ +import { spawn, ExitCodeError } from '@malept/cross-spawn-promise'; import * as fs from 'fs-extra'; import * as path from 'path'; -import { getFileArch } from './asar-utils'; const MACHO_PREFIX = 'Mach-O '; @@ -35,9 +35,19 @@ export const getAllAppFiles = async (appPath: string): Promise => { if (info.isFile()) { let fileType = AppFileType.PLAIN; + var fileOutput = ''; + try { + fileOutput = await spawn('file', ['--brief', '--no-pad', p]); + } catch (e) { + if (e instanceof ExitCodeError) { + /* silently accept error codes from "file" */ + } else { + throw e; + } + } if (p.includes('app.asar')) { fileType = AppFileType.APP_CODE; - } else if ((await getFileArch(p)).startsWith(MACHO_PREFIX)) { + } else if (fileOutput.startsWith(MACHO_PREFIX)) { fileType = AppFileType.MACHO; } else if (p.endsWith('.bin')) { fileType = AppFileType.SNAPSHOT; diff --git a/src/index.ts b/src/index.ts index 51d11ff..8a8d93d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,22 +1,22 @@ -import { spawn } from '@malept/cross-spawn-promise'; import * as asar from '@electron/asar'; +import { spawn } from '@malept/cross-spawn-promise'; +import * as dircompare from 'dir-compare'; import * as fs from 'fs-extra'; import { minimatch } from 'minimatch'; import * as os from 'os'; import * as path from 'path'; import * as plist from 'plist'; -import * as dircompare from 'dir-compare'; -import { AppFile, AppFileType, getAllAppFiles } from './file-utils'; import { AsarMode, detectAsarMode, generateAsarIntegrity, - getFileArch, + isUniversalMachO, mergeASARs, } from './asar-utils'; -import { sha } from './sha'; import { d } from './debug'; +import { AppFile, AppFileType, getAllAppFiles } from './file-utils'; +import { sha } from './sha'; /** * Options to pass into the {@link makeUniversalApp} function. @@ -167,12 +167,12 @@ export const makeUniversalApp = async (opts: MakeUniversalOpts): Promise = const first = await fs.realpath(path.resolve(tmpApp, machOFile.relativePath)); const second = await fs.realpath(path.resolve(opts.arm64AppPath, machOFile.relativePath)); - const isAlreadyUniversal = async (file: string) => - (await getFileArch(file)).includes('Mach-O universal binary'); - // check if both files (same name) are already universal. // this must occur before checking `sha` as their sha's will be different between builds if being built locally - if ((await isAlreadyUniversal(first)) && (await isAlreadyUniversal(second))) { + if ( + isUniversalMachO(await fs.readFile(first)) && + isUniversalMachO(await fs.readFile(second)) + ) { d(machOFile.relativePath, `is already universal across builds, skipping lipo`); knownMergedMachOFiles.add(machOFile.relativePath); continue; diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index 6fe6f9b..a6432fb 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -313,6 +313,85 @@ exports[`makeUniversalApp force packages successfully if \`out\` bundle already } `; +exports[`makeUniversalApp no asar mode different app dirs with different macho files (shim and lipo) 1`] = ` +{ + "files": { + "index.js": { + "integrity": { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": [ + "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", + ], + "hash": "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", + }, + "size": 1063, + }, + "package.json": { + "integrity": { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": [ + "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", + ], + "hash": "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", + }, + "size": 33, + }, + }, +} +`; + +exports[`makeUniversalApp no asar mode different app dirs with different macho files (shim and lipo) 2`] = ` +[ + "private/var/i-aint-got-no-rhythm.bin", +] +`; + +exports[`makeUniversalApp no asar mode different app dirs with different macho files (shim and lipo) 3`] = ` +[ + "index.js", + "node-mac-permissions.node", + { + "content": "{ + "name": "app", + "main": "index.js" +}", + "name": "package.json", + }, + { + "content": "hello world", + "name": "private/var/file.txt", + }, + "private/var/i-aint-got-no-rhythm.bin", +] +`; + +exports[`makeUniversalApp no asar mode different app dirs with different macho files (shim and lipo) 4`] = ` +[ + "index.js", + "node-mac-permissions.node", + { + "content": "{ + "name": "app", + "main": "index.js" +}", + "name": "package.json", + }, + { + "content": "hello world", + "name": "private/var/file.txt", + }, + "private/var/hello-world.bin", +] +`; + +exports[`makeUniversalApp no asar mode different app dirs with different macho files (shim and lipo) 5`] = ` +{ + "Contents/Info.plist": {}, +} +`; + exports[`makeUniversalApp no asar mode identical app dirs with different macho files (e.g. do not shim, but still lipo) 1`] = ` [ "index.js", @@ -324,6 +403,10 @@ exports[`makeUniversalApp no asar mode identical app dirs with different macho f }", "name": "package.json", }, + { + "content": "hello world", + "name": "private/var/file.txt", + }, ] `; @@ -333,6 +416,30 @@ exports[`makeUniversalApp no asar mode identical app dirs with different macho f } `; +exports[`makeUniversalApp no asar mode identical app dirs with universal macho files (e.g., do not shim, just copy x64 dir) 1`] = ` +[ + "index.js", + "node-mac-permissions.node", + { + "content": "{ + "name": "app", + "main": "index.js" +}", + "name": "package.json", + }, + { + "content": "hello world", + "name": "private/var/file.txt", + }, +] +`; + +exports[`makeUniversalApp no asar mode identical app dirs with universal macho files (e.g., do not shim, just copy x64 dir) 2`] = ` +{ + "Contents/Info.plist": {}, +} +`; + exports[`makeUniversalApp no asar mode should correctly merge two identical app folders 1`] = ` [ "index.js", @@ -437,11 +544,11 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` "algorithm": "SHA256", "blockSize": 4194304, "blocks": [ - "8c8cefe616b330a70980c457e479360417a320f53f484d34df65227ce3add026", + "0f6311dac07f0876c436ce2be042eb88c96e17eaf140b39627cf720dd87ad5b8", ], - "hash": "8c8cefe616b330a70980c457e479360417a320f53f484d34df65227ce3add026", + "hash": "0f6311dac07f0876c436ce2be042eb88c96e17eaf140b39627cf720dd87ad5b8", }, - "size": 64, + "size": 66, }, "package.json": { "integrity": { @@ -454,6 +561,35 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` }, "size": 41, }, + "private": { + "files": { + "var": { + "files": { + "app": { + "files": { + "file.txt": { + "link": "private/var/file.txt", + }, + }, + }, + "file.txt": { + "integrity": { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": [ + "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", + ], + "hash": "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", + }, + "size": 11, + }, + }, + }, + }, + }, + "var": { + "link": "private/var", + }, }, } `; @@ -469,7 +605,7 @@ exports[`makeUniversalApp works for lipo binary resources 3`] = ` "Contents/Info.plist": { "Resources/app.asar": { "algorithm": "SHA256", - "hash": "85fff474383bd8df11cd9c5784e8fcd1525af71ff140a8a882e1dc9d5b39fcbf", + "hash": "7e6af4d00f4cc737eff922e2b386128a269f80887b79a011022f1276bdbe7832", }, }, } diff --git a/test/index.spec.ts b/test/index.spec.ts index 8562db7..22346da 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -36,8 +36,8 @@ describe('makeUniversalApp', () => { it( 'works for lipo binary resources', async () => { - const x64AppPath = await generateNativeApp('Lipo', 'X64Asar.app', 'x64'); - const arm64AppPath = await generateNativeApp('Lipo', 'Arm64Asar.app', 'arm64'); + const x64AppPath = await generateNativeApp('LipoX64.app', 'x64', true); + const arm64AppPath = await generateNativeApp('LipoArm64.app', 'arm64', true); const out = path.resolve(appsOutPath, 'Lipo.app'); await makeUniversalApp({ x64AppPath, arm64AppPath, outAppPath: out, mergeASARs: true }); @@ -216,17 +216,50 @@ describe('makeUniversalApp', () => { VERIFY_APP_TIMEOUT, ); + it( + 'different app dirs with different macho files (shim and lipo)', + async () => { + const x64AppPath = await generateNativeApp( + 'DifferentMachoAppX64-1.app', + 'x64', + false, + 'x64', + { + 'hello-world.bin': 'Hello World', + }, + ); + const arm64AppPath = await generateNativeApp( + 'DifferentMachoAppArm64-1.app', + 'arm64', + false, + 'arm64', + { + 'i-aint-got-no-rhythm.bin': 'boomshakalaka', + }, + ); + + const outAppPath = path.resolve(appsOutPath, 'DifferentMachoApp1.app'); + await makeUniversalApp({ + x64AppPath, + arm64AppPath, + outAppPath, + }); + await verifyApp(outAppPath); + }, + VERIFY_APP_TIMEOUT, + ); + it( 'identical app dirs with different macho files (e.g. do not shim, but still lipo)', async () => { - const x64AppPath = await generateNativeApp('DifferentMachoApp', 'X64NoAsar.app', 'x64'); + const x64AppPath = await generateNativeApp('DifferentMachoAppX64-2.app', 'x64', false); const arm64AppPath = await generateNativeApp( - 'DifferentMachoApp', - 'Arm64NoAsar.app', + 'DifferentMachoAppArm64-2.app', 'arm64', + false, ); - const out = path.resolve(appsOutPath, 'DifferentMachoApp.app'); + const out = path.resolve(appsOutPath, 'DifferentMachoApp2.app'); await makeUniversalApp({ x64AppPath, arm64AppPath, @@ -241,13 +274,15 @@ describe('makeUniversalApp', () => { 'identical app dirs with universal macho files (e.g., do not shim, just copy x64 dir)', async () => { const x64AppPath = await generateNativeApp( - 'UniversalMachoApp', - 'X64NoAsar.app', + 'UniversalMachoAppX64.app', + 'x64', + false, 'universal', ); const arm64AppPath = await generateNativeApp( - 'UniversalMachoApp', - 'Arm64NoAsar.app', + 'UniversalMachoAppArm64.app', + 'arm64', + false, 'universal', ); diff --git a/test/util.ts b/test/util.ts index 12ff6ff..18a6d9c 100644 --- a/test/util.ts +++ b/test/util.ts @@ -5,7 +5,7 @@ import * as fs from 'fs-extra'; import * as path from 'path'; import plist from 'plist'; import * as fileUtils from '../dist/cjs/file-utils'; -import { getRawHeader } from '@electron/asar'; +import { createPackage, getRawHeader } from '@electron/asar'; // We do a LOT of verifications in `verifyApp` 😅 // exec universal binary -> verify ALL asars -> verify ALL app dirs -> verify ALL asar integrity entries @@ -182,16 +182,32 @@ export const templateApp = async ( return appPath; }; -export const generateNativeApp = async (testName: string, appName: string, arch: string) => { - const appPath = path.resolve(appsOutPath, `${testName}-${appName}`); - await fs.copy(path.resolve(appsDir, appName), appPath); - const resourcesApp = path.join(appPath, 'Contents', 'Resources', 'app'); - if (!fs.existsSync(resourcesApp)) { - await fs.mkdir(resourcesApp); - } - await fs.copy( - path.join(nativeModulesPath, `node-mac-permissions.${arch}.node`), - path.join(resourcesApp, 'node-mac-permissions.node'), - ); +export const generateNativeApp = async ( + appNameWithExtension: string, + arch: string, + createAsar: boolean, + nativeModuleArch = arch, + additionalFiles?: Record, +) => { + const appPath = await templateApp(appNameWithExtension, arch, async (appPath) => { + const resources = path.join(appPath, 'Contents', 'Resources'); + const resourcesApp = path.resolve(resources, 'app'); + if (!fs.existsSync(resourcesApp)) { + await fs.mkdir(resourcesApp); + } + const { testPath } = await createTestApp( + path.basename(appNameWithExtension, '.app'), + additionalFiles, + ); + if (createAsar) { + await createPackage(testPath, path.resolve(resources, 'app.asar')); + } else { + await fs.copy(testPath, resourcesApp); + } + await fs.copy( + path.join(nativeModulesPath, `node-mac-permissions.${nativeModuleArch}.node`), + path.join(resourcesApp, 'node-mac-permissions.node'), + ); + }); return appPath; }; From 49e4ec26375196bcb0ec2d3764a1536744cf7e59 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Wed, 19 Feb 2025 13:52:14 -0800 Subject: [PATCH 03/20] add additional test --- test/__snapshots__/index.spec.ts.snap | 79 +++++++++++++++++++++++++++ test/index.spec.ts | 33 +++++++++++ 2 files changed, 112 insertions(+) diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index a6432fb..47c5790 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -392,6 +392,85 @@ exports[`makeUniversalApp no asar mode different app dirs with different macho f } `; +exports[`makeUniversalApp no asar mode different app dirs with universal macho files (shim but don't lipo) 1`] = ` +{ + "files": { + "index.js": { + "integrity": { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": [ + "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", + ], + "hash": "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", + }, + "size": 1063, + }, + "package.json": { + "integrity": { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": [ + "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", + ], + "hash": "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", + }, + "size": 33, + }, + }, +} +`; + +exports[`makeUniversalApp no asar mode different app dirs with universal macho files (shim but don't lipo) 2`] = ` +[ + "private/var/i-aint-got-no-rhythm.bin", +] +`; + +exports[`makeUniversalApp no asar mode different app dirs with universal macho files (shim but don't lipo) 3`] = ` +[ + "index.js", + "node-mac-permissions.node", + { + "content": "{ + "name": "app", + "main": "index.js" +}", + "name": "package.json", + }, + { + "content": "hello world", + "name": "private/var/file.txt", + }, + "private/var/i-aint-got-no-rhythm.bin", +] +`; + +exports[`makeUniversalApp no asar mode different app dirs with universal macho files (shim but don't lipo) 4`] = ` +[ + "index.js", + "node-mac-permissions.node", + { + "content": "{ + "name": "app", + "main": "index.js" +}", + "name": "package.json", + }, + { + "content": "hello world", + "name": "private/var/file.txt", + }, + "private/var/hello-world.bin", +] +`; + +exports[`makeUniversalApp no asar mode different app dirs with universal macho files (shim but don't lipo) 5`] = ` +{ + "Contents/Info.plist": {}, +} +`; + exports[`makeUniversalApp no asar mode identical app dirs with different macho files (e.g. do not shim, but still lipo) 1`] = ` [ "index.js", diff --git a/test/index.spec.ts b/test/index.spec.ts index 22346da..26e2ee3 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -249,6 +249,39 @@ describe('makeUniversalApp', () => { VERIFY_APP_TIMEOUT, ); + it( + "different app dirs with universal macho files (shim but don't lipo)", + async () => { + const x64AppPath = await generateNativeApp( + 'DifferentButUniversalMachoAppX64-2.app', + 'x64', + false, + 'universal', + { + 'hello-world.bin': 'Hello World', + }, + ); + const arm64AppPath = await generateNativeApp( + 'DifferentButUniversalMachoAppArm64-2.app', + 'arm64', + false, + 'universal', + { + 'i-aint-got-no-rhythm.bin': 'boomshakalaka', + }, + ); + + const outAppPath = path.resolve(appsOutPath, 'DifferentButUniversalMachoApp.app'); + await makeUniversalApp({ + x64AppPath, + arm64AppPath, + outAppPath, + }); + await verifyApp(outAppPath); + }, + VERIFY_APP_TIMEOUT, + ); + it( 'identical app dirs with different macho files (e.g. do not shim, but still lipo)', async () => { From e1871f335a7c83d8c9e247d9e5454c0e028009dc Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Fri, 21 Feb 2025 21:15:25 -0800 Subject: [PATCH 04/20] PR feedback --- src/file-utils.ts | 7 +++++++ src/index.ts | 8 +++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/file-utils.ts b/src/file-utils.ts index 7a603a8..ad733d4 100644 --- a/src/file-utils.ts +++ b/src/file-utils.ts @@ -71,3 +71,10 @@ export const getAllAppFiles = async (appPath: string): Promise => { return files; }; + +export const readMachOHeader = async (path: string) => { + const numOfBytes = 4; + const fd = await fs.open(path, 'r'); + const result = await fs.read(fd, Buffer.alloc(numOfBytes), 0, numOfBytes, 0); + return result.buffer; +}; diff --git a/src/index.ts b/src/index.ts index 8a8d93d..68a7632 100644 --- a/src/index.ts +++ b/src/index.ts @@ -15,7 +15,7 @@ import { mergeASARs, } from './asar-utils'; import { d } from './debug'; -import { AppFile, AppFileType, getAllAppFiles } from './file-utils'; +import { AppFile, AppFileType, getAllAppFiles, readMachOHeader } from './file-utils'; import { sha } from './sha'; /** @@ -167,11 +167,9 @@ export const makeUniversalApp = async (opts: MakeUniversalOpts): Promise = const first = await fs.realpath(path.resolve(tmpApp, machOFile.relativePath)); const second = await fs.realpath(path.resolve(opts.arm64AppPath, machOFile.relativePath)); - // check if both files (same name) are already universal. - // this must occur before checking `sha` as their sha's will be different between builds if being built locally if ( - isUniversalMachO(await fs.readFile(first)) && - isUniversalMachO(await fs.readFile(second)) + isUniversalMachO(await readMachOHeader(first)) && + isUniversalMachO(await readMachOHeader(second)) ) { d(machOFile.relativePath, `is already universal across builds, skipping lipo`); knownMergedMachOFiles.add(machOFile.relativePath); From 462527edb6dec7465953e999bbbddb20b5238de3 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Fri, 21 Feb 2025 21:28:32 -0800 Subject: [PATCH 05/20] gotta close `fd` --- src/file-utils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/file-utils.ts b/src/file-utils.ts index ad733d4..c136e45 100644 --- a/src/file-utils.ts +++ b/src/file-utils.ts @@ -76,5 +76,6 @@ export const readMachOHeader = async (path: string) => { const numOfBytes = 4; const fd = await fs.open(path, 'r'); const result = await fs.read(fd, Buffer.alloc(numOfBytes), 0, numOfBytes, 0); + await fs.close(fd); return result.buffer; }; From 66f2c3388837971a8f60f3ac9aa850feda288b72 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Sat, 22 Feb 2025 07:56:05 -0800 Subject: [PATCH 06/20] use `stream` to read first 4 bytes. copy native fixture before packing into asar to leverage `unpack: "**/*.node"` properly. --- src/file-utils.ts | 14 +++++++++----- test/__snapshots__/index.spec.ts.snap | 20 +++++++++++++++++--- test/util.ts | 14 ++++++++------ 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/file-utils.ts b/src/file-utils.ts index c136e45..39cbdc1 100644 --- a/src/file-utils.ts +++ b/src/file-utils.ts @@ -1,6 +1,7 @@ import { spawn, ExitCodeError } from '@malept/cross-spawn-promise'; import * as fs from 'fs-extra'; import * as path from 'path'; +import { promises as stream } from 'node:stream'; const MACHO_PREFIX = 'Mach-O '; @@ -73,9 +74,12 @@ export const getAllAppFiles = async (appPath: string): Promise => { }; export const readMachOHeader = async (path: string) => { - const numOfBytes = 4; - const fd = await fs.open(path, 'r'); - const result = await fs.read(fd, Buffer.alloc(numOfBytes), 0, numOfBytes, 0); - await fs.close(fd); - return result.buffer; + const chunks: Buffer[] = []; + // no need to read the entire file, we only need the first 4 bytes of the file to determine the header + await stream.pipeline(fs.createReadStream(path, { start: 0, end: 3 }), async function* (source) { + for await (const chunk of source) { + chunks.push(chunk); + } + }); + return Buffer.concat(chunks); }; diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index 183a0ab..65cd0f5 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -803,6 +803,18 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` }, "size": 66, }, + "node-mac-permissions.node": { + "integrity": { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": [ + "24ade05d87f584976bae70ff260e114e8384f9aa867f6e323be0ff429655a95d", + ], + "hash": "24ade05d87f584976bae70ff260e114e8384f9aa867f6e323be0ff429655a95d", + }, + "size": 273984, + "unpacked": true, + }, "package.json": { "integrity": { "algorithm": "SHA256", @@ -847,18 +859,20 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` } `; -exports[`makeUniversalApp works for lipo binary resources 2`] = ` +exports[`makeUniversalApp works for lipo binary resources 2`] = `[]`; + +exports[`makeUniversalApp works for lipo binary resources 3`] = ` [ "node-mac-permissions.node", ] `; -exports[`makeUniversalApp works for lipo binary resources 3`] = ` +exports[`makeUniversalApp works for lipo binary resources 4`] = ` { "Contents/Info.plist": { "Resources/app.asar": { "algorithm": "SHA256", - "hash": "7e6af4d00f4cc737eff922e2b386128a269f80887b79a011022f1276bdbe7832", + "hash": "c5dbde39636962cfe49a91eacdc969f56cd13234a1d2b1b1ea0a2a050dc7028f", }, }, } diff --git a/test/util.ts b/test/util.ts index 18a6d9c..74eb735 100644 --- a/test/util.ts +++ b/test/util.ts @@ -5,7 +5,7 @@ import * as fs from 'fs-extra'; import * as path from 'path'; import plist from 'plist'; import * as fileUtils from '../dist/cjs/file-utils'; -import { createPackage, getRawHeader } from '@electron/asar'; +import { createPackage, createPackageWithOptions, getRawHeader } from '@electron/asar'; // We do a LOT of verifications in `verifyApp` 😅 // exec universal binary -> verify ALL asars -> verify ALL app dirs -> verify ALL asar integrity entries @@ -199,15 +199,17 @@ export const generateNativeApp = async ( path.basename(appNameWithExtension, '.app'), additionalFiles, ); + await fs.copy( + path.join(nativeModulesPath, `node-mac-permissions.${nativeModuleArch}.node`), + path.join(testPath, 'node-mac-permissions.node'), + ); if (createAsar) { - await createPackage(testPath, path.resolve(resources, 'app.asar')); + await createPackageWithOptions(testPath, path.resolve(resources, 'app.asar'), { + unpack: '**/*.node', + }); } else { await fs.copy(testPath, resourcesApp); } - await fs.copy( - path.join(nativeModulesPath, `node-mac-permissions.${nativeModuleArch}.node`), - path.join(resourcesApp, 'node-mac-permissions.node'), - ); }); return appPath; }; From 61abfd3d71d54ad2c8aef75ea7831f69eaa0ad2c Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Sat, 22 Feb 2025 08:32:44 -0800 Subject: [PATCH 07/20] convert params to object --- jest.config.js | 1 - test/index.spec.ts | 106 +++++++++++++++++++++++++-------------------- test/util.ts | 21 ++++++--- 3 files changed, 72 insertions(+), 56 deletions(-) diff --git a/jest.config.js b/jest.config.js index f01272f..978133c 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,7 +2,6 @@ module.exports = { preset: 'ts-jest', testEnvironment: 'node', - testMatch: ['/test/**/*.spec.ts'], transform: { '^.+\\.ts?$': [ 'ts-jest', diff --git a/test/index.spec.ts b/test/index.spec.ts index d3bf23c..0f69187 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -36,8 +36,16 @@ describe('makeUniversalApp', () => { it( 'works for lipo binary resources', async () => { - const x64AppPath = await generateNativeApp('LipoX64.app', 'x64', true); - const arm64AppPath = await generateNativeApp('LipoArm64.app', 'arm64', true); + const x64AppPath = await generateNativeApp({ + appNameWithExtension: 'LipoX64.app', + arch: 'x64', + createAsar: true, + }); + const arm64AppPath = await generateNativeApp({ + appNameWithExtension: 'LipoArm64.app', + arch: 'arm64', + createAsar: true, + }); const out = path.resolve(appsOutPath, 'Lipo.app'); await makeUniversalApp({ x64AppPath, arm64AppPath, outAppPath: out, mergeASARs: true }); @@ -254,24 +262,22 @@ describe('makeUniversalApp', () => { it( 'different app dirs with different macho files (shim and lipo)', async () => { - const x64AppPath = await generateNativeApp( - 'DifferentMachoAppX64-1.app', - 'x64', - false, - 'x64', - { + const x64AppPath = await generateNativeApp({ + appNameWithExtension: 'DifferentMachoAppX64-1.app', + arch: 'x64', + createAsar: false, + additionalFiles: { 'hello-world.bin': 'Hello World', }, - ); - const arm64AppPath = await generateNativeApp( - 'DifferentMachoAppArm64-1.app', - 'arm64', - false, - 'arm64', - { + }); + const arm64AppPath = await generateNativeApp({ + appNameWithExtension: 'DifferentMachoAppArm64-1.app', + arch: 'arm64', + createAsar: false, + additionalFiles: { 'i-aint-got-no-rhythm.bin': 'boomshakalaka', }, - ); + }); const outAppPath = path.resolve(appsOutPath, 'DifferentMachoApp1.app'); await makeUniversalApp({ @@ -287,24 +293,24 @@ describe('makeUniversalApp', () => { it( "different app dirs with universal macho files (shim but don't lipo)", async () => { - const x64AppPath = await generateNativeApp( - 'DifferentButUniversalMachoAppX64-2.app', - 'x64', - false, - 'universal', - { + const x64AppPath = await generateNativeApp({ + appNameWithExtension: 'DifferentButUniversalMachoAppX64-2.app', + arch: 'x64', + createAsar: false, + nativeModuleArch: 'universal', + additionalFiles: { 'hello-world.bin': 'Hello World', }, - ); - const arm64AppPath = await generateNativeApp( - 'DifferentButUniversalMachoAppArm64-2.app', - 'arm64', - false, - 'universal', - { + }); + const arm64AppPath = await generateNativeApp({ + appNameWithExtension: 'DifferentButUniversalMachoAppArm64-2.app', + arch: 'arm64', + createAsar: false, + nativeModuleArch: 'universal', + additionalFiles: { 'i-aint-got-no-rhythm.bin': 'boomshakalaka', }, - ); + }); const outAppPath = path.resolve(appsOutPath, 'DifferentButUniversalMachoApp.app'); await makeUniversalApp({ @@ -320,12 +326,16 @@ describe('makeUniversalApp', () => { it( 'identical app dirs with different macho files (e.g. do not shim, but still lipo)', async () => { - const x64AppPath = await generateNativeApp('DifferentMachoAppX64-2.app', 'x64', false); - const arm64AppPath = await generateNativeApp( - 'DifferentMachoAppArm64-2.app', - 'arm64', - false, - ); + const x64AppPath = await generateNativeApp({ + appNameWithExtension: 'DifferentMachoAppX64-2.app', + arch: 'x64', + createAsar: false, + }); + const arm64AppPath = await generateNativeApp({ + appNameWithExtension: 'DifferentMachoAppArm64-2.app', + arch: 'arm64', + createAsar: false, + }); const out = path.resolve(appsOutPath, 'DifferentMachoApp2.app'); await makeUniversalApp({ @@ -341,18 +351,18 @@ describe('makeUniversalApp', () => { it( 'identical app dirs with universal macho files (e.g., do not shim, just copy x64 dir)', async () => { - const x64AppPath = await generateNativeApp( - 'UniversalMachoAppX64.app', - 'x64', - false, - 'universal', - ); - const arm64AppPath = await generateNativeApp( - 'UniversalMachoAppArm64.app', - 'arm64', - false, - 'universal', - ); + const x64AppPath = await generateNativeApp({ + appNameWithExtension: 'UniversalMachoAppX64.app', + arch: 'x64', + createAsar: false, + nativeModuleArch: 'universal', + }); + const arm64AppPath = await generateNativeApp({ + appNameWithExtension: 'UniversalMachoAppArm64.app', + arch: 'arm64', + createAsar: false, + nativeModuleArch: 'universal', + }); const out = path.resolve(appsOutPath, 'UniversalMachoApp.app'); await makeUniversalApp({ x64AppPath, arm64AppPath, outAppPath: out }); diff --git a/test/util.ts b/test/util.ts index 74eb735..a43106d 100644 --- a/test/util.ts +++ b/test/util.ts @@ -182,13 +182,20 @@ export const templateApp = async ( return appPath; }; -export const generateNativeApp = async ( - appNameWithExtension: string, - arch: string, - createAsar: boolean, - nativeModuleArch = arch, - additionalFiles?: Record, -) => { +export const generateNativeApp = async (options: { + appNameWithExtension: string; + arch: string; + createAsar: boolean; + nativeModuleArch?: string; + additionalFiles?: Record; +}) => { + const { + appNameWithExtension, + arch, + createAsar, + nativeModuleArch = arch, + additionalFiles, + } = options; const appPath = await templateApp(appNameWithExtension, arch, async (appPath) => { const resources = path.join(appPath, 'Contents', 'Resources'); const resourcesApp = path.resolve(resources, 'app'); From 67a8437b3bad65e0c0938055581e4ceb53a77870 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Sat, 22 Feb 2025 16:14:20 -0800 Subject: [PATCH 08/20] rename `createTestApp` to `createStagingAppDir` and add jsdoc to the function --- test/index.spec.ts | 16 +++++++++------- test/util.ts | 8 ++++++-- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/test/index.spec.ts b/test/index.spec.ts index 0f69187..f901b20 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -3,7 +3,7 @@ import * as path from 'path'; import { makeUniversalApp } from '../dist/cjs/index'; import { - createTestApp, + createStagingAppDir, generateNativeApp, templateApp, VERIFY_APP_TIMEOUT, @@ -150,7 +150,7 @@ describe('makeUniversalApp', () => { 'should not inject ElectronAsarIntegrity into `infoPlistsToIgnore`', async () => { const arm64AppPath = await templateApp('Arm64-1.app', 'arm64', async (appPath) => { - const { testPath } = await createTestApp('Arm64-1'); + const { testPath } = await createStagingAppDir('Arm64-1'); await createPackage(testPath, path.resolve(appPath, 'Contents', 'Resources', 'app.asar')); await templateApp('SubApp-1.app', 'arm64', async (subArm64AppPath) => { await fs.move( @@ -160,7 +160,7 @@ describe('makeUniversalApp', () => { }); }); const x64AppPath = await templateApp('X64-1.app', 'x64', async (appPath) => { - const { testPath } = await createTestApp('X64-1'); + const { testPath } = await createStagingAppDir('X64-1'); await createPackage(testPath, path.resolve(appPath, 'Contents', 'Resources', 'app.asar')); await templateApp('SubApp-1.app', 'x64', async (subArm64AppPath) => { await fs.move( @@ -186,7 +186,7 @@ describe('makeUniversalApp', () => { 'should shim asars with different unpacked dirs', async () => { const arm64AppPath = await templateApp('UnpackedArm64.app', 'arm64', async (appPath) => { - const { testPath } = await createTestApp('UnpackedAppArm64'); + const { testPath } = await createStagingAppDir('UnpackedAppArm64'); await createPackageWithOptions( testPath, path.resolve(appPath, 'Contents', 'Resources', 'app.asar'), @@ -198,7 +198,7 @@ describe('makeUniversalApp', () => { }); const x64AppPath = await templateApp('UnpackedX64.app', 'x64', async (appPath) => { - const { testPath } = await createTestApp('UnpackedAppX64'); + const { testPath } = await createStagingAppDir('UnpackedAppX64'); await createPackageWithOptions( testPath, path.resolve(appPath, 'Contents', 'Resources', 'app.asar'), @@ -237,14 +237,16 @@ describe('makeUniversalApp', () => { 'should shim two different app folders', async () => { const arm64AppPath = await templateApp('ShimArm64.app', 'arm64', async (appPath) => { - const { testPath } = await createTestApp('shimArm64', { + const { testPath } = await createStagingAppDir('shimArm64', { 'i-aint-got-no-rhythm.bin': 'boomshakalaka', }); await fs.copy(testPath, path.resolve(appPath, 'Contents', 'Resources', 'app')); }); const x64AppPath = await templateApp('ShimX64.app', 'x64', async (appPath) => { - const { testPath } = await createTestApp('shimX64', { 'hello-world.bin': 'Hello World' }); + const { testPath } = await createStagingAppDir('shimX64', { + 'hello-world.bin': 'Hello World', + }); await fs.copy(testPath, path.resolve(appPath, 'Contents', 'Resources', 'app')); }); diff --git a/test/util.ts b/test/util.ts index a43106d..ab7a685 100644 --- a/test/util.ts +++ b/test/util.ts @@ -116,6 +116,10 @@ export const removeUnstableProperties = (data: any) => { }; /** + * Creates an app directory at runtime for usage: + * - `testPath` can be used with `asar.createPackage`. Just set the output `.asar` path to `Test.app/Contents/Resources/.asar` + * - `testPath` can be utilized for logic paths involving `AsarMode.NO_ASAR` and copied directly to `Test.app/Contents/Resources` + * * Directory structure: * testName * ├── private @@ -127,7 +131,7 @@ export const removeUnstableProperties = (data: any) => { * ├── index.js * ├── package.json */ -export const createTestApp = async ( +export const createStagingAppDir = async ( testName: string | undefined, additionalFiles: Record = {}, ) => { @@ -202,7 +206,7 @@ export const generateNativeApp = async (options: { if (!fs.existsSync(resourcesApp)) { await fs.mkdir(resourcesApp); } - const { testPath } = await createTestApp( + const { testPath } = await createStagingAppDir( path.basename(appNameWithExtension, '.app'), additionalFiles, ); From 7fff35e1e324e925d7bcf99976ba1183491c74c6 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Fri, 28 Feb 2025 06:17:40 -0800 Subject: [PATCH 09/20] compiler error from merge conflict --- test/index.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/index.spec.ts b/test/index.spec.ts index d249f17..121ddad 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -223,7 +223,7 @@ describe('makeUniversalApp', () => { it( 'should generate AsarIntegrity for all asars in the application', async () => { - const { testPath } = await createTestApp('app-2'); + const { testPath } = await createStagingAppDir('app-2'); const testAsarPath = path.resolve(appsOutPath, 'app-2.asar'); await createPackage(testPath, testAsarPath); From 0c13e556315f043e24aed2ed1a00f0ea313fc8e4 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Fri, 28 Feb 2025 06:48:24 -0800 Subject: [PATCH 10/20] update snapshots --- test/__snapshots__/index.spec.ts.snap | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index 60e7358..7890913 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -280,10 +280,6 @@ exports[`makeUniversalApp asar mode should generate AsarIntegrity for all asars "algorithm": "SHA256", "hash": "7e6af4d00f4cc737eff922e2b386128a269f80887b79a011022f1276bdbe7832", }, - "Resources/webbapp.asar": { - "algorithm": "SHA256", - "hash": "7e6af4d00f4cc737eff922e2b386128a269f80887b79a011022f1276bdbe7832", - }, }, } `; @@ -918,12 +914,7 @@ exports[`makeUniversalApp no asar mode should shim two different app folders 4`] exports[`makeUniversalApp no asar mode should shim two different app folders 5`] = ` { - "Contents/Info.plist": { - "Resources/app.asar": { - "algorithm": "SHA256", - "hash": "27433ee3e34b3b0dabb29d18d40646126e80c56dbce8c4bb2adef7278b5a46c0", - }, - }, + "Contents/Info.plist": {}, } `; From 7e3167b338984791a0b750327ca0a4011850b647 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Fri, 28 Feb 2025 07:59:31 -0800 Subject: [PATCH 11/20] update snapshots --- test/__snapshots__/index.spec.ts.snap | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index 7890913..f73e875 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -280,6 +280,10 @@ exports[`makeUniversalApp asar mode should generate AsarIntegrity for all asars "algorithm": "SHA256", "hash": "7e6af4d00f4cc737eff922e2b386128a269f80887b79a011022f1276bdbe7832", }, + "Resources/webbapp.asar": { + "algorithm": "SHA256", + "hash": "7e6af4d00f4cc737eff922e2b386128a269f80887b79a011022f1276bdbe7832", + }, }, } `; @@ -691,7 +695,12 @@ exports[`makeUniversalApp no asar mode different app dirs with different macho f exports[`makeUniversalApp no asar mode different app dirs with different macho files (shim and lipo) 5`] = ` { - "Contents/Info.plist": {}, + "Contents/Info.plist": { + "Resources/app.asar": { + "algorithm": "SHA256", + "hash": "27433ee3e34b3b0dabb29d18d40646126e80c56dbce8c4bb2adef7278b5a46c0", + }, + }, } `; @@ -770,7 +779,12 @@ exports[`makeUniversalApp no asar mode different app dirs with universal macho f exports[`makeUniversalApp no asar mode different app dirs with universal macho files (shim but don't lipo) 5`] = ` { - "Contents/Info.plist": {}, + "Contents/Info.plist": { + "Resources/app.asar": { + "algorithm": "SHA256", + "hash": "27433ee3e34b3b0dabb29d18d40646126e80c56dbce8c4bb2adef7278b5a46c0", + }, + }, } `; @@ -914,7 +928,12 @@ exports[`makeUniversalApp no asar mode should shim two different app folders 4`] exports[`makeUniversalApp no asar mode should shim two different app folders 5`] = ` { - "Contents/Info.plist": {}, + "Contents/Info.plist": { + "Resources/app.asar": { + "algorithm": "SHA256", + "hash": "27433ee3e34b3b0dabb29d18d40646126e80c56dbce8c4bb2adef7278b5a46c0", + }, + }, } `; From 17bcff30d9de802f66254124444024a2ac620034 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Sat, 1 Mar 2025 15:53:57 -0800 Subject: [PATCH 12/20] only check x64Content since it's the tmp app --- src/asar-utils.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/asar-utils.ts b/src/asar-utils.ts index 831c5c4..eee1ff6 100644 --- a/src/asar-utils.ts +++ b/src/asar-utils.ts @@ -148,11 +148,13 @@ export const mergeASARs = async ({ const x64Content = asar.extractFile(x64AsarPath, file); const arm64Content = asar.extractFile(arm64AsarPath, file); + // Skip file if the same content if (x64Content.compare(arm64Content) === 0) { continue; } - if (isUniversalMachO(x64Content) && isUniversalMachO(arm64Content)) { + // Skip universal Mach-O files. + if (isUniversalMachO(x64Content)) { continue; } From 24d5d2c20cd358aa6076863303823b083d4d7c51 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Tue, 18 Mar 2025 20:08:23 -0700 Subject: [PATCH 13/20] compile macho binaries at runtime using hellow-world.c for fixtures in lipo tests --- jest.setup.ts | 26 +++++- test/__snapshots__/index.spec.ts.snap | 78 +++++++----------- test/fixtures/hello-world.c | 6 ++ test/fixtures/native/README.txt | 6 -- .../native/node-mac-permissions.arm64.node | Bin 142912 -> 0 bytes .../node-mac-permissions.universal.node | Bin 273984 -> 0 bytes .../native/node-mac-permissions.x64.node | Bin 115040 -> 0 bytes test/index.spec.ts | 10 +-- test/util.ts | 28 ++++--- 9 files changed, 84 insertions(+), 70 deletions(-) create mode 100644 test/fixtures/hello-world.c delete mode 100644 test/fixtures/native/README.txt delete mode 100755 test/fixtures/native/node-mac-permissions.arm64.node delete mode 100755 test/fixtures/native/node-mac-permissions.universal.node delete mode 100755 test/fixtures/native/node-mac-permissions.x64.node diff --git a/jest.setup.ts b/jest.setup.ts index 296a148..21ded34 100644 --- a/jest.setup.ts +++ b/jest.setup.ts @@ -1,10 +1,34 @@ +import { execFileSync } from 'child_process'; import * as fs from 'fs-extra'; import * as path from 'path'; -import { appsDir, asarsDir, templateApp } from './test/util'; +import { appsDir, asarsDir, fixtureDir, templateApp } from './test/util'; + +// generates binaries from helloorld.c +// hello-world-universal, hello-world-x86_64, hello-world-arm64 +const generateMachO = async () => { + const src = path.resolve(fixtureDir, 'hello-world.c'); + + const outputFiles = ['x86_64', 'arm64'].map((arch) => { + const machO = path.resolve(appsDir, `hello-world-${arch === 'x86_64' ? 'x64' : arch}`); + execFileSync('clang', ['-arch', arch, '-o', machO, src]); + return machO; + }); + + execFileSync('lipo', [ + ...outputFiles, + '-create', + '-output', + path.resolve(appsDir, 'hello-world-universal'), + ]); +}; export default async () => { await fs.remove(appsDir); await fs.mkdirp(appsDir); + + // generate mach-o binaries to be leveraged in lipo tests + generateMachO(); + await templateApp('Arm64Asar.app', 'arm64', async (appPath) => { await fs.copy( path.resolve(asarsDir, 'app.asar'), diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index f73e875..26f8225 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -627,10 +627,8 @@ exports[`makeUniversalApp no asar mode different app dirs with different macho f "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": [ - "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", - ], - "hash": "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", + "blocks": "", + "hash": "", }, "size": 1063, }, @@ -638,10 +636,8 @@ exports[`makeUniversalApp no asar mode different app dirs with different macho f "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": [ - "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", - ], - "hash": "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", + "blocks": "", + "hash": "", }, "size": 33, }, @@ -657,8 +653,8 @@ exports[`makeUniversalApp no asar mode different app dirs with different macho f exports[`makeUniversalApp no asar mode different app dirs with different macho files (shim and lipo) 3`] = ` [ + "hello-world", "index.js", - "node-mac-permissions.node", { "content": "{ "name": "app", @@ -676,8 +672,8 @@ exports[`makeUniversalApp no asar mode different app dirs with different macho f exports[`makeUniversalApp no asar mode different app dirs with different macho files (shim and lipo) 4`] = ` [ + "hello-world", "index.js", - "node-mac-permissions.node", { "content": "{ "name": "app", @@ -698,7 +694,7 @@ exports[`makeUniversalApp no asar mode different app dirs with different macho f "Contents/Info.plist": { "Resources/app.asar": { "algorithm": "SHA256", - "hash": "27433ee3e34b3b0dabb29d18d40646126e80c56dbce8c4bb2adef7278b5a46c0", + "hash": "", }, }, } @@ -711,10 +707,8 @@ exports[`makeUniversalApp no asar mode different app dirs with universal macho f "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": [ - "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", - ], - "hash": "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", + "blocks": "", + "hash": "", }, "size": 1063, }, @@ -722,10 +716,8 @@ exports[`makeUniversalApp no asar mode different app dirs with universal macho f "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": [ - "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", - ], - "hash": "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", + "blocks": "", + "hash": "", }, "size": 33, }, @@ -741,8 +733,8 @@ exports[`makeUniversalApp no asar mode different app dirs with universal macho f exports[`makeUniversalApp no asar mode different app dirs with universal macho files (shim but don't lipo) 3`] = ` [ + "hello-world", "index.js", - "node-mac-permissions.node", { "content": "{ "name": "app", @@ -760,8 +752,8 @@ exports[`makeUniversalApp no asar mode different app dirs with universal macho f exports[`makeUniversalApp no asar mode different app dirs with universal macho files (shim but don't lipo) 4`] = ` [ + "hello-world", "index.js", - "node-mac-permissions.node", { "content": "{ "name": "app", @@ -782,7 +774,7 @@ exports[`makeUniversalApp no asar mode different app dirs with universal macho f "Contents/Info.plist": { "Resources/app.asar": { "algorithm": "SHA256", - "hash": "27433ee3e34b3b0dabb29d18d40646126e80c56dbce8c4bb2adef7278b5a46c0", + "hash": "", }, }, } @@ -790,8 +782,8 @@ exports[`makeUniversalApp no asar mode different app dirs with universal macho f exports[`makeUniversalApp no asar mode identical app dirs with different macho files (e.g. do not shim, but still lipo) 1`] = ` [ + "hello-world", "index.js", - "node-mac-permissions.node", { "content": "{ "name": "app", @@ -814,8 +806,8 @@ exports[`makeUniversalApp no asar mode identical app dirs with different macho f exports[`makeUniversalApp no asar mode identical app dirs with universal macho files (e.g., do not shim, just copy x64 dir) 1`] = ` [ + "hello-world", "index.js", - "node-mac-permissions.node", { "content": "{ "name": "app", @@ -940,37 +932,31 @@ exports[`makeUniversalApp no asar mode should shim two different app folders 5`] exports[`makeUniversalApp works for lipo binary resources 1`] = ` { "files": { - "index.js": { + "hello-world": { "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": [ - "0f6311dac07f0876c436ce2be042eb88c96e17eaf140b39627cf720dd87ad5b8", - ], - "hash": "0f6311dac07f0876c436ce2be042eb88c96e17eaf140b39627cf720dd87ad5b8", + "blocks": "", + "hash": "", }, - "size": 66, + "size": 49824, + "unpacked": true, }, - "node-mac-permissions.node": { + "index.js": { "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": [ - "24ade05d87f584976bae70ff260e114e8384f9aa867f6e323be0ff429655a95d", - ], - "hash": "24ade05d87f584976bae70ff260e114e8384f9aa867f6e323be0ff429655a95d", + "blocks": "", + "hash": "", }, - "size": 273984, - "unpacked": true, + "size": 66, }, "package.json": { "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": [ - "d6226276d47adc7aa20e6c46e842e258f5157313074a035051a89612acdd6be3", - ], - "hash": "d6226276d47adc7aa20e6c46e842e258f5157313074a035051a89612acdd6be3", + "blocks": "", + "hash": "", }, "size": 41, }, @@ -989,10 +975,8 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": [ - "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", - ], - "hash": "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", + "blocks": "", + "hash": "", }, "size": 11, }, @@ -1011,7 +995,7 @@ exports[`makeUniversalApp works for lipo binary resources 2`] = `[]`; exports[`makeUniversalApp works for lipo binary resources 3`] = ` [ - "node-mac-permissions.node", + "hello-world", ] `; @@ -1020,7 +1004,7 @@ exports[`makeUniversalApp works for lipo binary resources 4`] = ` "Contents/Info.plist": { "Resources/app.asar": { "algorithm": "SHA256", - "hash": "c5dbde39636962cfe49a91eacdc969f56cd13234a1d2b1b1ea0a2a050dc7028f", + "hash": "", }, }, } diff --git a/test/fixtures/hello-world.c b/test/fixtures/hello-world.c new file mode 100644 index 0000000..f26b97c --- /dev/null +++ b/test/fixtures/hello-world.c @@ -0,0 +1,6 @@ +#include + +int main() { + printf("Hello, World!\n"); + return 0; +} diff --git a/test/fixtures/native/README.txt b/test/fixtures/native/README.txt deleted file mode 100644 index a34c41e..0000000 --- a/test/fixtures/native/README.txt +++ /dev/null @@ -1,6 +0,0 @@ -Arch-specific modules generated from `node-mac-permissions` (https://github.com/codebytere/node-mac-permissions) using `electron/rebuild` - -Universal module generated with `lipo` -``` -lipo ./test/fixtures/native/node-mac-permissions.x64.node ./test/fixtures/native/node-mac-permissions.arm64.node -create -output ./test/fixtures/native/node-mac-permissions.universal.node -``` \ No newline at end of file diff --git a/test/fixtures/native/node-mac-permissions.arm64.node b/test/fixtures/native/node-mac-permissions.arm64.node deleted file mode 100755 index 48371903848f6ae71f64128c758b9fd1ef33ab10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142912 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%0DG`@2Ov1i<)8%i>Jh}2Ig2R-pakuD zMap%Byiu;x!r{$Kx}S4EB#j8{SJuWoAP;(87i^(K@O+Tb{hnmxWn`g+SX&$KX6C}L zYlR~oKb7Z?gEe^=`5E2svbo6jt%yRH^B_!0_ZGn_JRfwwi#%7A{6Tus$>@Fu9#Z@o zefLZ_$QwU$VO6jjFg~Wf4MB4D_-%M0&gUAQz9otDJi9mJ$EPgF8i}9R!D*=NBk2iD zte_jo7rzhzej2q@##RhZ$BlUxYR1t4E5O{!fLgI=)66I#HFds(%>Nn21gVHZw-tt_ zH00=C>x{y{!C#nv!Z;%xU|f}$q`5(iH!jrr#+T;f7Qkows|@1rN3eyqL%Xq0dcL%I z3cp<8y8`%g`o!1IXhZ7%5qQD+d*{DDcUlE3yS`R=3S&pJxJ?I`()N6G&Y6aEq9 zKT1Ad+dESEwMWT!A0>a*QSxm^$xl2={*N#aN8D_v$#)+mf7Vg*ZAZyZ zJWBqLFn~vt|0wxSA0?mPt3MKbx6H=~&%@mOIQ>sP+uJgT-;H344f)zl$nPHU)hIsq z%I7!oxlca7m(L&Mvr9e?$mh@U`HOrWl20+36e8p^NNK8MTanesVOKF^WQ^W<~1 zd?w51`SLkdKF7&ts(en6&x_>qV);y$&&l$cC7)B|(;=Ui$Y+jxPLt0(`J5r2Gv#x( ze9o26%jNTr@_D6v7Ru**`7Dvo1@c)cpI6IgxqMdOnd3WU61)W&`Q0O)8HzX5O3@2M zCtN1orI;i|=f{L55yHEU-KDb$Z71X+^gN+PLQfI8m(at6HWO+hw42bKgd)+)I&UV# z1wrTag!lu0ol6PLA;fDerImzA2zd$d3QOrmLV1L^UXVXPSDJuP*U2?)>3l-x6MB-+ zNJ8y|P9?-;V&@=2ybj(ON5~9|)hP&_O{fdY!qN)~?ImO<^lw7*2=PN)r3(qYN$6Ta z+X$^D#2=t5y^~Ngq5BB^ozOoB{gn`3!0x=APzRyagmx3Uj?g!RT!ellbTy%P%qX3O zghmpYO(>I44xutalL>hUr4qW2&}c%fgoYFPh|o!d_7h4Vl!&!JXEY%jpiWV#M2#{co~}uOj>7eXupr6Zgf41JNV*#)x-g%%8=G4`Yfj23TgcC=jCH z!dIfi{if)bqTnM)YL61TOtD*|#Al}dFGq=ABl^D`B|MP{JEFv&BTs)fN<1GK_ePX> zD>C-ADDg?;=(nQ8pP~|8h!Xcj#RC7)s7rL(OOl3u8z+8^j9(ikzKcqDJ5H=J$3GA! zo;DwMU!3^dobabO@q;=3wm9*Z==cqB;<4z2d*Z}%(edl!#Pu<;e~A+h#l-(PPPD|t z-W4bQ9pipCPJC^Ny){nU8XN126aR>f^~Q;}V`DvW;-}cy8&N8bpMs)X@dBQji!FG4 zeo7(PVcH0hDnzQ~{RojhO^91e4u6FB#1#8(g!sY~i^2J=>2EA8aVLsrq046@F7`(Y zU*yGmqQys%7rz@Vo{WlKA0u9fO2FGTkC?41_T8uJOnI1Gu4e#j2`#2Mf@Wsc8x`Bi3#XyxX2VDGj3Icm>c(lNq9{00Pi$S z6k>-d2H-9e^1;U+#3Nwn5tDUQe{m?H-?RPD(^GEkFSbO+-qlaM6uA`~HAI_V?I(VU zjz175?u;1^_|q6-cE*f)yq~z!65ACg?y=kp%&l?6c{8p{Hk*>ONQk1iy(Y2n4w)!r z@12$|I467@(eGW0_%hX{n28l z`GQ+xL}PU9kI~|m=j=Q;^_$oH`l{oRgSQ0#p{3FCNA(mM-Mu}CX`+#U)fH<>LRR`I+U;N#Jj$E;#gG{C>d zSZ=b4$72Bg&0_g-fcU!w;GMCSZ3D#LVgcR~XW1}7+!+V(hJKbq@#2<#01x%Ed=xKk z=nt@~zojK!9O{2RCOgUF39?^WAmXLiv;NVt!6ZuZ^}N1pL0@U73moR1Z)r1$2`NG> zJRa}hUkBg`)A8F(;ziSWhMvwEmvnoCxV-^maR^^XVqh3R;}2TjK#^OlHn z6<@=YZF~i`5#`G*Fo!O-!(9;;H26Ic^m|js{RJ)p*enZ0+GTotoDkzI*NKaZ_4rvr zoMoOW&clH>@P`Pj%3PLp5n@Fh$o*onpurjEvd%wg5Z~)#L`hkRaNEA(KX9zT+T&R)y@UZ zYG(zgPbjWjG+N~aQ%Bc0i`^)^Y|@Atk&%~Ike@LvYx4BD1)0;Q&CJN2W}i`zoh7C^ zU9)QNd+3#moKq^x@yqCWMXpj&#RHL=nzG7@n$e3EiK->ST~W5!SzS|9o*~7_z`4(y zqUs7!tp5tT$SIp&T~xhnOn%XVqUy3SlPfD1E-I>CSTnk+ybQdLG4eAYLRoQ<3$&B+ z-BneU)vhr?_Ge~hj=}%YCG&$N@`8efVwNp(<`xx~;@n2B!l*&#AhW#ET{5$1ehrCb zRpNJtjUULy?~)t8eGVO~AB3+FJzGo|zf-RNLb))0s@%v3X`Y%Yr?a?pRJF6X@~Vn5 z$_B;oM?{2bef?VmqP$W`E^3Oao%mM${BpO`Raps*FLKwE6^|-cN)%-kRc_a)MU|k1 z)3u7La5$#_=xq%k_2aXE@Y}NZUD<#znMLL0^NS$p;`5W!CnXoBrVpEzZ?CSdtR9wf zexRiSSQI!Ye<0cTHI$6<@+oEI&Kg~kK>p&C^CfX%AgZ5B5lRO$f+`3pF%BiJNez_9 zm+A^Z)m0iOVUSjzr4DJhUKqJ$#nqK)DYU6kC^317OWi?ghMa%MC=mm>rRh1OE zm=zRJ4HKi?uX4ILV)9)@E_aP6s#!RtvO2S}!c|o4s!^CmqCT9$5@#5FG%QsO*YM&~ z(4^pOVHl!npRlB$*20t733Y9SW%O#Wuw2zjVM$@i49igwT`^%f+3fVWfj+P2$^JWG z!Zha+QBhP?RsdBNlo!>w3Y_fN1!WZrDpf{VO@VW1v9pS!ub|3VQNnQ(C{k2WQczs( zEUMNE8<;}UPb#ZOs(?*e>`W>)29Yd^K7p1k;7N1ERRwO>f>cFPPnSF>5)&p!N@3ZR z^RIRmyHrw%a{)|MK^1zdv)WaLaTQuYz{H8M^Gk}xJ1=yO8aqDaf>C2j<`<6|Z!2+* zN*$k4Jb%HsaklZP&QY@7*+u0>)iX=0E0<){TvD{S2%0aea@hm&$y!{@7Y-<)+?iht z4kk>vE+nS2QeIi(EGU&o1vSJH1qEd_dF4f}1(nr{rdQ8~VK1t1840s7A3)a`t{f-Y zLsZrjaE74vi%Xrw3-Qev1M~c(w6vtWoQ#=Mrq9SN$j!){o}YB)nMuRk70#tq(2%nv z34=-2GE6MYoC4EBLs?lpjV3B{N>-7pC{wn?oHAGGIWc)=PEq)M zrs%YQG{cFGSK}08^5w)GmcwT4!u32|r}~Um4dYZ<;x2aS$znvwX!%c6 zxEIZLR!ePER^rTa){GoR6gx5s3zJob2?<(UHleH{t8!6MS;Yh_5}+?MqYKl0HA+oT zJ$ZucQ4>UsRLJCIn5ESS;&LFfa#0lwYz4kM2ZM#*%5phb*>pM7YLHk`GF|p`fckw9 zIlqU;4C5Dyq0+#K8tggF#ZCwlMkIh@uW(^8L(Lx!Lw=@BArvc3%&I~2+AE4HX$&UF zi4tPeOkWUCO@@mS8sZmMx+`3hm)W6SOx`XOQd)(?6VzblS_?R!<*vr!%N4Sm!F;@+ z$X)KrEvhKG%2_Q+0-Z-{OKPZQ0*2D1&Se2I&Wgol)s+?eJ$vC?iWQryXnwg94TCj6 znJcs)67((zz=;Y}e=Mu9U*j%<)@T&NS}UZJWUCSrgc1S@2M^AYeD{1TL|`tEf%ay1 z5LI&hS6#_PYc{UrxXKokK^Sx!nL=}0?Yzc~%QvdcK+7I%8LZ^6LgkoI=B0WE&imNITZrZ`_JF;Ev53^mj^`@0e%Kr|FFFdZKTcMezV(<{oC z9fh*Hq5>T(qyv#227I{YjWNkgNVBL2jip8@Q)bPalB&A;1bj;qyAOEMMI8QPLoMSD zgxJaR&t$?s{J(5qzo^T0%r#$jx`^O^6XGVsO+}{2%j#N%s5()I^H8W9g%a*%Q59E^ zde)($kq_c^QtW?H5w>E3S&ILX;v*aNsr+!hHzWAZ*IUe}r`PeU30` zx)28t)?v4u^)T{gf-i*oE*Ii;hF732hJO^|2j&-n|3`p7Ux*xr3qTiP6@=fz5T1@7 z5bmi2?MLzd8sH=BfFI*ygln!veF*E8<2u`8LL^@Y9E61{an^;fsSf*Mre80_UlFz< zd=%lndbk}CRyBYxgiVdm1LHSB2akjPYUlxB!cF)rGQvEs5MvRpxfyaX-v_-g9~TQs zn7;<~F#k5_nfbR1aR>A7fRhDbGs343Ca;D55k{h#{$d4p>VUwr5HZc@BhBbU$q^#D zDFQMhOb239q%f_C5^)J;VQw}HQ+l+p6!sIQgai?lH%LTvoFGg|Lqv4mNy40zB+MQ7 zUpP#d)6W#t7_0i*iz(LbS1#3!v11Cmz>Yf`;PD7-<4 zx|_s6jB``J{!tNwg@}qBWQj;cCJj*lzQ+gtOxMm3rlkp{g#Iy>HRu}{ z_VR!8`#hV#Z_!As;Dh-W;eYckl^+w#Iwq(CJo1m@gMaL|{A0i6UmnH_{}S~08a-^* z%cERkZY}Uh8J?zj!RVw(b@+i1Y57+2nhaT?JLjn88Kia{* z{+jjlRz2)6@L@0cm#l~BdPqCk*WW%P9rl%f33`~PhgEu5r-!t|ef=fFF7q#45A*bJ zjUG1ZVXGc?=%FeVd{*6};5t2AqlX=OxK9rS>_7iF5A^ldtf#l?VTXagMqwxGVY(i2 z9_j0EpOJo>%1zM2JUy(^!#X|WJk-};GUg@zrR!my9^xZ-~HH;bxzg_65G3ci?X+la2dcM$4ia{?IdO{5P zv?p8yKwqR)zfHdc`X$gWfqn_}OQ2r@{SxSxK)(c(1V(;W3*uxk&lEF7%=5&YBj!Re zmx;Mt%rY_8i&-P)9b#@1^E+bJi}|FO&x`pBF#yjrP)2JWejPUsv&7PO- z&t8y~pYK22zc7Dsg#MIsX=U4>+6aeB%drii0=nByjVL8x!%FQ)pFivJpe|b0x)r76 z&RPfDmhI)GD~ii$7Z!BZ<=OiB$T`JS-E=DJytSiTZn9@*Lz}F!u*@g}*0gAS2nLscFj#p-L}$<8zA^=EJV21ls4w6Q$KvbBl6vV3!G9bFJu1i<~*BIqRLZ z%OE}f6)Ot!)>Dr7Rc3yzDO|0s)?BZD_^-X;2B^AMRzXFXcU}6id9(IZFfGhSB%#?` zU3_s_`SQZD*$8HpQ&SU1A45dw))uWYG;B&%4?m|LF$W2X+^hW8t}Cou;nY;rX8HZl zFE1@C)E8@pYkMPND>js^0N=Xh{^iIYluki9qpebAA zUtM)=KJ=iSwauPdU8nJjES#|rI}uVdpmmQOTG(z>e9^i!N>O|k_n6Gf&&f+oQF`~# z?)CfgQqvSzPyKPg_4zaX&ZTR|QO@F5I*y}*WUErs%qA5osL##22$^K2((}z(JfE2; zNS}*z<>ch2`E$~jRzj=0xY8A9nvQ|l&Y(6*`29Nn=mc~ZXgWVoX;tw*GuZV}leqpU zBoHZ8n%RDA!9YPlai6;|KgE(}52Zcbk5ZbmKK$#h&(Dr7)=v@Y5yag);l`48v?R`s zoj*4I&VpeKj*SC zcsxC4&H9|Y^*R3aIcc*lk}#zNXnky`y5CTplb`O-pUeMJiLyGa@v0&ht3p);ywX9H zm9=bcmDC?nbvd<8r8g>tfyzz@IvS3~9UEBKQe#(0Hunn9dR&;bD$!Zhb5Tp)Kx(q0 znr$Mmn1puLwZ}|vQlaY_+z-q zRc@q_=e8Q`w9$yQ4#Ubj!G|qzxpU{JDqZWj(|(z;mjFVP0#@$}^SRG7xc7n_C2X!# z6T})9+g1GNoRnU>hO~+Z8aC8oCoDP`PUQ_GUbg0XG&TOk#Z}m_LE9S7=Wm8*VP`Jt zh@90$^l|f1@G%`eVxJGZq>r^n!NX9Ut12#DMbc)4s*ABx z45*gq+T!Yp>(`Yk&IiOoU>)IV)$gM7dIgJD7p<-!Y!bM-e7y?k*|>l6`BmeMJx-z4 zgHD@+BsQ`BmC^$sX;(N2o9~c{Ds&UVT(yK;MQ*%wzeoVy)Q^_Q-zcEpp%lqDzo!c zMXDo6iMneRyfq2ti?cw6?+OKZbC6uAH#hoYeR0cSRe9O^Vn5P{3P>mLfgrUCpT-tj zU62Bgv3C_=)`zT+YsyuH(v%SFs|U;Uvo1S)MP2&2LCL=pXMTLySQjhR%nm-dS@uQ4Wk{)z~4*;A|@lMME`fwHgw9J6FYG@qB z_<4q;IZmFMBRPs5UWPdeY-9`e0@6|!=I3K$c2Nm;F9xlhE8?BHG^DDwkm*~Bq(LHi zxw=cCc8aps_&J8#InE<-vUNSUH~({c*%YTcRUv_`cb{%ycMnmBt` zeyp$ik9d1)eJoeEB*Z)IINmEROPwo#Q-93NjU9>K!&OTabIHX)r(s73#Pa?h3A4>9 z6}Eph1Dru=i%>VP$C+2SrucJd(<@`7V$NBBR@WT{h@jN&P`7|XcQs;YvRG*kr z7gkoy%RnYqd#jz_4MHF|XbWuT1=)goN;OZcz;5-T3`CySvfjDF3s0Y;r?vC(r)egN zi_Q-2qaI>;{XgDI?9(5DC1Snvx>v`XTjzCt#JmyCu}DirX|%WCYHR0B#HHrf%;~MK z^KUy2E<)y1=f;Gc`w%NC2NI(UOkz2HHxXHSZcvcUhl%cUB&?+TZZM+upA=J5sKB`0 ztBA%5u4YKs%pn^NJClBO2)@7!_}_{z5QmQy)pPDqM*yF%^4dEj^jYjrr@zAV>EV-> z(LU7w8-mJ+XW@BMoL2{>I$!gqIs3gcB;VM%p<9vsC2^+n>fm(e&LJ7jfgzciJyJ^D z`f>O1_#|Io_Qg3f)WX&N6zv_lfrj~ zLJIqsCu%Yg_FQxpbX%*Y8ZhNxCL)||!xok=s)&^{whv24Xt^uSNl0kFoqwAexS8_k z&fe`Cc7&OtPdy*lhFCW>GNwqW^S5EKCWSuTEaN>RAdAhELap+BkTO%PBd`u@k*x`~nLg#@IJ)PKd+DHChm>_Ey<-|psuj~0_ z_G`l+5zPM!rO+p8o1Rm#8S$r*K zn2Ia?t8vgtS+Re8s`JU{@)gB?62li1_e}(hL=rztA>`goEQxcMngQ)`zB>GD8Pepbjc*;) zPjYh8fL2edr!Kw~Tj1*w@!MM$*K!=$n}BM(?L%tfS`&sh$2E;;_O#>Q@Z^+MaQm9$ zTH{h`!ByiaNN$R&jY~!l@N~E@dHC=;{5U#hL2^NIGtxJ_Hg0%(eDlEMl$7M|9ts7| z&Lqb<)l;L+bRhn-;M%c7IOA`$rq`XI@izqX{02Th6wGrR_`D*R=Q!}mg!Jh@&vD>$ zC-6{w+-9GG&i4hk2>ylOR>1=i5AvIR&!-7)&C>i?!1RyjLGZanFwceH^P*s$3&AI0 zoOaLiAo$D{%<~}l+$osnLGXFW;43vwgd7+i&xPPKUog*u;PW-XW}oycz$*P4H2ovN zJQsq`!V@)}=R@$hUvM4zu6%wdxJB@*f_aVvpFt;S{$!jd!RI8wJYRy(Ji&D}3OYrC zovWx+guf=`2Bo7ph7;0Ne!5-bD#6LJ&-;78 zlwXSA4cNd+Z1#&^GG606p-)QIxK?n|1dW>n|4p#jPyWhjn%*MxA57HP>?gnVbdAlv z@-LpDvDsff^GxBF{pF{frLoy>eps;CcmC!iO*i|`n`Q-smZqEi>|aaQI8W%M8Nx4kNv6h4g3moq zW3%6Vv+ung^$g=%EA+emP51?GLcK$}*$;oMPh+z$ercA* zW`F$ovo$vR;)i8xZ1%_R6KwX$KaYAx$ycUtzK?o`*zB9HxkzK5(2Fs;Cf)3#zc5#0 zvwwahhAN~xvOoSWg3W&V7v>4S&>QD#Z1&f0TA;DnXJ2xO#%90$?1dVq$iDd#7HRAg z+%7mz@Ne>jU+{lis&SLx?Ta;T7Q6}dDC6HExNwQaWvZ_b1g8kTS#X}x=h#iF;sEk36RR%dAeGZ4+e1hO=!RHFTRdANzZGtZo{9VCVe^&YRX~AC- z{Bywp;8TyUab9g!$#Gs1?A@vH`+_qBk6*3bmk6!`9(ugvY!-Z{;CjK=tkLv#!D;0h zXZ%e2&-3ERUnBT`1@994*jh~={-Sn&N2SKg1YcF9ah>3))f%@6PFSaL%Fi|bYs8~) zmfR~EA0SRb|3dI#!R9=h!Rs~MoL_UY;0MHgs$g^8&4q$@3B6Eoi{LeaUlF`f@T-FF z6x=GfPH>xG52C$-f8_Zw=%|u|&nef3<8y#l#(SJ+UaCh;jQRlYRQ#zJt681}{d5bH zemdS{O;+v~y6EIL<6Vw_$!{=zDt_s{1^I0{`IE=#0Pc_1{019-#Rwsv=>Q%R z{^5cRf4eJun@)ap=pBqWyiC8rhQ9_@e25pi=;W_CS&^L+2WftT4S$^`2l;I}`IAr4 z4&E{OPq5*4=U?NVbn-We`^}PmgAIQ&@&zAa#^0uszvVPVcBVi8OuxZ&&-|+x#UQ^; zSNs#{$Z_5>{DNchTXe;*0&$#kCI7YvHvG-X_fY(8I{9nQ&<@U*{AX}1ew$AIyfZaF zhdnC)3pV^I{DFtYLd!id`FTz%pCx$7Z!qahiVyMPLri{~PJW)R%7-U3lHXvuCw~p> z`4E%erjy?{Rgs;)!XUrFbWi>Y{=h?n{5GBZO_+z^bDPNDV7gcFSJV){O(%c5@b8fL z8*KRNT>Lhj{Iya+{1m?#e}fIbTmCkk{5+SI54z7w40Hl6%t{*?2nO8yy|!SM5JO+GXhTJDL-&+~Kn@Wxy68%#Ro-->#H4>9>| zI{D3fE$45^Z!q1H-yMIOPJW)(%ZC?olHXv%@6JCqUB&-G&CmH_6@S5ozg?3<@we#Y zZ}w>ioL?rt!G?dhi{GZJ@P(iA(JFkwvG`joI{8}#bN-tA1{?lXM?b_1U33-yEKTQp zw~D`Dx~Ke;H944mGapX63SZoFeq4nwnDl7;X8zpp^IT;<&;n8X1{?mSI87&J{B1hJ zH}mhDk7xJ>)2YgTnmrhQn@)Z+U(fk_@*5nB-=>qF=RfoLiNxPv!(YcAcxW*GHl6%t zeSqr)4Bue7j~0KMPX6{>`p&+o<~P{zyUUMFCqK`r=93LMGkk*$e_ev66Eprco&07! zgX53ooaD2Glqxc2Kup?rBfr6h-(COPbn^53c0M~Le1i?Yk3aCxSZKK?CO^;r=JO9zegu<#I^HHPsUd#j z-thChcs^V&RPh&V_?s0q#BbaiezTs)^+oaq_tgmvtRmtBK zegQqgLt~-ko|yb*J(laUq_tZ#F@oBRgTJ^5?!@*yU_ zO(%c*CPj8`k@361hQC0QgZws~{N~*H-KZxRzQKk+*~M?uRs3(&4!AzA;xE|nyT?Cf z{hoC4oArCH=ab)H!#|uq@X%Q3qLbg8uYbCfUxVqM@=M0chnV~}o%}6dRb=Npk)OeI zPyRYh4)WV{@~e9>;D-7KD*d->2E*_E{>DA& zUxfSy(|xq~+jR09eG=-Ikl)}~{5GBZwObfF$Duw7`3*MwK1B`1-=>qlMfhi)srd~y z{K+nUn@;|A;itX}!#CLQyT6}JC%@5$p?(bc4UWZc)5&l2XQ)p@euE8voh$w}o%~IA zXb054A-}tqY6sK@Qt20L z_>*1y!!0`bQv_3gi2Mc{es}t9I{D507t}W*zrnHiZ94h$Bz)>8k>6m$U+0RyO(%c5 z@Kc|O{019-cl>QS`Hj94^`FRZa4deCPJW{wMSUsq8*KP}uK3$@mHw^T0rjg?`UM;Q zWEX#)MJIoSVCrL$-(bVT`&$zLnsQ{RjH1{?l5SNv@{`Hemp z^~1<-u;F*d-=>q_=#NpKjQj@2;Et*1c+}4$zrnHiZ94gD@758dJ|FoFHvB$U{B62QzwlH4Po-b5;ZJt) zw^(%Yw+p7eAo&e8{OqlMZ(`F{019-h($fb3oZA=C~rW_y&{C z{#UXl2m5a}o%|`nPyI{s8*KR9>9^_RH~N{>*CfBevG{E|`ST=v>UWagV8dVMioZ=K zf4lHgAC&wC8-92EZ94glz9{ua$!~Bhew$8yqhCsWQ}P>Z_i!Lj&lI{EXs@QjE0yW}_6@cR@sG=8w@D*eJweP5M+ z!G=HC#b0aD$=@WH`oZKk*zmj4Z_~+d^oOZWOn!r7@!NFrw@CQZKPJDyhQH1gf16Hz zqn}KDW%3(r_}%fh>Et*1%+zltzrnHiZ94gDzpf)leQ5F8`Yw{ax_}%HZ>Et*1*woJ^zrnHiZ94gl{x=rwA_fYJP(ae}RkNrjx%`_aVNs@8VB!#oxF${6@c>`tIa6m~^(^ zZho82@bkW-1E799`3*Mw$(kH&|7|+?D}g$u=;8^@No%}7rPyK%K8yt(@rjx&2__-f|{07J3x9Q{`{-72x_YaWY;8^@No%|`n z&;17EH#io*O(%bz@N<6x`3;W6Z_~+NA^hCWKz@T`@!NFr*9!lA!f$Xaew$AICgJCP z35IWQEPk6#{ubfq{tEIN9E;zklfPZ~xgUf42FK#J>Es_?r@w!y@EaV9-=>p4Mfkbj zgW($-i{GY`KTr6%KZN`S$Kto?dbjM1F%~@!NFrw+KJ?7m?p!!+(nUI-&l%p>w}Ove0O7zk`jr-@(S*?_gu@cR2I- z@cjAh!265S#rC9(c2Yf8?Q>$uQ!RwZ#&_M&GtXu+jhIu!HW6 z{_kG}8~s@7!z()U0{BqBpV;X4Q(u+X=%Z49m)Pj%QlFaG=u1;SjM(UZQC~`7MidYA zXNiq|EcHPZKjtO*P`_GXtaI_9z8|sC=cE26vC+?@J{z&oSL6N$VzYmN`gX)dpN{(H ziY^(J`cR4={R%$RuO>G7)71ATHv0V3KO#2zMLPu>eH`isk#6*VsP9c|^tq}3r1+QX z@TiYW+%!#N?r$I-F5iRu1&Gal0P4RH8~rxw!z+GC5BCQs{*$zS)b~;D*J@1tePW}Z z&-LtKo|@qLHuVFD&H6vbE5v3z!tn#K86Qv|fY_|}b9_QP{9YX%#|y+}JaGD8jhnuz z>C~rD@wrK3>gNy}{hP5vRGorcp`Xbv`~{7N8Tuj@UZXL-ihgc(;rm_qA&nt5{XFNw zzjWcZT-bY@if@qrbd4be{mgRVc^aGHt8=Bs!Srs>7`awI4`@8V;Ab_)SJKb#HO5!b zPrJs!^bbK@1@Q*MJ4@preU6KMr3+uLF}%>vb{G8#jf4LEr_2588sjVL=VOf_Mg5#I zl=1T+*7}*Fu!Fz)xx$6ly6_eku5;lgjS;GT{^7zGAtxbmLHeC8{E7>|=E85f@BtS- zsBus}N%#^753$hCX)c`N!kHQeyyw8O@T==+=Dt*E5Cb)2h3t#HOl`edT3qRz-&$;lgT=;J;?2HPJ--#}K zt_xr6!dJR*g$r+W;Rjv#$1c3bh2MAKA?RD7yanZXstcd(!s#00tLP`&g_pSS8W+CF zh40WfnBQt$_yHHLbK!ayZgSz%P_sBEcMaZhycKxY;;qD6g|`~-I=t)gUXS+%yc_V| zh<792oA7=K@0ao3jJF2wEqK3zcN5-Q@!p2_t9Wn6yBY5mym#PbpYATacjNsU-del? zyvcYc;LXN62JcwBz3E0u*=6wIThkvj<*Q!3cSU5@5Fl# z-lO@={(tw499%+@dUOwRrH|8H#~CX-oQKI181?y#vCdJX%b7>}6l3M-(LTvodD_F% zjOlh3(tmUhFjl@E^)rl>uaUmJ0ytL2Ir+)V2P-Dw^Pfj;h&Z8Y@OoALX+M{!f zmHVhi8H19RViJIpyH^xec7F`7&CsKRg)N4johqytj&P7L-K6Sh_we{&#eqy1?F3=c z(zI_qJu+Ca*hkNX3ioM!-~s&qHnN5 z(`ioEadErq_Vio&n;vnDty`KI_;OLbJu1fuGY%P{?`411o}Va8Pd?iLz~G#I#AAQy z=;$5%3*TmRbJ{P--JSOfx}3>xAM*OCF9HjC6FfrIec~(*=I!?U+)sVxZ;ygJ!pXb6 z5NNC;dOzLK!;y*W>2bYBl5_0ChCf%BM-X&xgc?iIF%CnHOrD+N`|7=4`re)>=L`GS z9Qk}<`xa1rH>ho+?*)x^O;{8=`+~5DtHCUbuuH*UZ>|H2aS<4-!><5?MYorKf!@uv zU!cak@GJ7FFKrWk$ydbfUg0+~x^GPlr)JM~-IwYjM_fkgqK97^8cqzmE;O7JcJr#6 zWZypNriIL$vqlx}OeQBK{V=B7ot%+~Ehx6O{*nm4|>?Ls%+hErS@qlObBPs?}t z8-AgHbqi|r3*20`=IS>4{!#mKQrjLK4s$Q5`;Ir(MW5&11nY9Q&+C~4nLyYJ_}p;D>uik zNCFm$i6%Z|4in;Yi*tM%1#G}WDQ(JqtIcHy_kS$5Gb))I2$ zy>UXYFN_Pb3f>eKW-C|3h1r?A;leC~*OxhA)>Z0e8-4Fs7@?cE>nK)-?tjyakr%%i zd)JL`+SK38|?U83*16>*3E5h%Sh3M z-PNX@N4=y?lbHR(Z)el?-CfIOT)6II)7D`Zv1u!P1DpKTSFh>ok@b~p)^B~)nzo2` z#hRv=Ta`637p>_V*38vv=1w)=l`}8m<$pQ2W)^oN zv&#Eitwna~?2I*QQZrIgQ&Q$GC`~~J89rOy7O%A&^zfSRoaMax2e%K0-4VXTk2`Lc zq~eC*y!rXFbkyfZx$~{`h8$IuFVw_Yx?7NWS@p^c)q}(p;z5xJkr(fV-wxf) z-Bdo^eN}l*D3IW_z50INBVAdI%YRdFCAM`x_7Xp2s+uXe2zL1f6fb5DUI$x*%V#N# zXf)|lC^BXq%p6`%rsVv~c_ljX>-zFlXfn{oF`Sa(GF;p!wBii^^t4LSRum%_md7Mp zLHFb~vWTER55GT+5rhw)Y9=sB6h6fiZWQj%HtQ3`BNL4tObs7J?w}Mu-3(}y7<}pp z%xHedd}hyQCf%M$l^C=9n@UX8FHs6`_j3~66=4b4?Pv5EhaPy8I&+b#2Nv_z&|+L9 zJSWYr;dG@RS;3)DTp=~2c9J%03GWfjs+w20z7T>ft*Fkqp{Tfm7q~@w80?QL0cjty z)57b}ywo&xGq7&l?Fw63qKN7^H8mHv&z2SEqpm3q55fpMV~*U8nw=URnw6lSY-ePn z0fw`%c;H&->eN}h@)UQa@v3`&87^3wi`G!r*`H_dls40^T6kSq7FCy5`f=BKapfA_ z;_7xON}ClSx-?z=v(LMnqlHr3EAH1K)a>>IlT4`wua8HQp5j+1e>$##k7!R+>lzeN z4=#p?-=b)UA-*Dc>!{A9OcM|D0ZNP0WnP&(zvznC%_Oo& zYH;qEvlKZwmo4|_Oh4U^eotzu%Ip~2;pWFY)mh28tZX58+u}j)NwLLg?$?PKy0_G|)Hc0!| zY7lxSQOCML=#^CUkp`i6)7G~dgx*POpJ)(zC24)HLFkoa_FjV!b5$Yg5CL+8WGI zt-;K`-Wv3&)E)hXp)Vz`*V>3anaJL5F8WlWd#UBC}`;_)l!*I+K_RnYyj(H;cL=!MeH38}W zN=-oTB>PR46H3J!a zy&32m$vXN?L7zxhuQdmKD|NlyB=n8c_ENLZCldG1Xd3!NLVK@y=M$F^#}ruWFzj2^j~*&|o8dgLm-N3Jq@2&Hcu`o5DV^gRT!GvA6ex^iC4{mVR@u zq|q$39Wym&t8dgR3GAbqCB2eX^D&Q^f=O?G%ukcR-d+{xl`q)W=C*n#k$rAd7D}cy zdOE@&$nad8osA>Hc+Q%?x^Q_}acZg)VU-zSm6j4|H8av`R-{#Wq*X?wRb+_MBSV}X z8P(}CBK(>j8RGQF5T{3mI3qH|8Id8*NQ($@#`H+5$au|&l-G<%dCiE7{fx-i&xnlu z%*fc!jEw!v$k@+}jQz~W*w2iN{mjUy&Ww!e%*d$Dij3;4$f(YW6wa(j?`K7NpC0K~ zdStTGBh#238De^58Z#nepAi|a%t(2qrbNafH6=3ssi~3iNKK3UN~uwbNNSYapE@Hl zsi{%&MrxGIk&3K{DB zscGt*@$UFC{OeQG6kCs+&Vtjm8PT0iPxBYgoatXbosLQ~E=^6lW}_cBBIK{DTv=FD ze8HE}Qm)yUees;qs*1A04LF~-xN!Al6)SKy6-c(9n64_WEG+Y1TUNfjkYQc1aA7 zrYY)`@!e5RQJ)yl9sN}GjS(EvrEW{8s4QKN&IkJ!3sO^8@mj(1N}LRhn^0hrzG_bK znobrY`?lUA|&nS#gyD=dLa+ zI@elgoTeD2O`ST;v23~g*vlcxg#UjqFS z=$Amh1o|b=FM)mu^h=;$0{s%`mq5P+`X$gWfqn_}OQ2r@{SxSxK)(d~CD1Q{ehKtT z;B!jgw;#Rp$#IV3p*LQvLqpX}0h~pjTxi86CwgkZaG`lPW4}dk_Awu^1 ztBY@_768NTU(;}*ZP6xiT*$fOBseuT#K~mU>y}pqts?yUh9{73|RdB~wUvh~=lYh)D0XMMc&Y zez$)$|E}4d9;8j;u=r`~;9oyZYg>au+sxzkFXM4dNfrmhl61ooX2L)2S6Oqd*t-2& zCjKpACc|T}Mv-y#`<48P$_lHh))cNTcKi4JA8JmWOC87HBlx$vxVnViMSS0S@h>Ss z`(SWv|JJR!zI4qBoH4hu9FE-ad;Z6o(_U+nmi0$uz za#mtUG+Az6g>d}-Iay1x{Mm~Z=IheiOe!9q`s+B&VhX08e3=(nB>nzt%R{*&wtp>f ztDffYcnySQzNVt0Pw%VX=kuy~ zLTvk|h}IwYx6;nYZuvF+Tsuydj7QwPe<~lBt}eW`m|4Z`U(0`L|AOfS?k=B%e^)Ew zx(W|{R~Kd+`SQE+@%zgP{Z$)QFE20iS5#xum&zxarvK^$-Vlt8CoG+;W>#CyrMy-Z zmsJ+8M78Yp?}j+-U#`fF*p?gO#q1V*?D9_^-TpPlYmYVy2eIuRtX=+L<9}h$`-u4E zCTRc6cOZ887h=XQoQ_ZxYJDQpnYFf6?;1B&R!E5~0zI(d$ z_wtLdw-VV3XP`#&J!@K)QP6(nC*aSBQWGh+L2-qsf_z6x&&8F66(yxb zRk6ipTv*{0;J3*Ko~|DcC8?YIm0iB3y0EA^W*C}EPw?>j7vK&0AHN3a=vH1i>#>hE zMh?!JW~lI!5B*<;*Z7YTf}+)}|8p0`^jwkXZG^w~IlEE(y7gD@_>V4mO^f0${XBxd z`4z>*MKKD3rojiKzotN&s-AG1jYpD0el@aPOi>sr{NzJ9vwjWAxzww_}!=FFiTl@gCS0?<{#A_T#T|-hIe%mQ-KkWFCqi)%c3Xd1i#;ByB$U zrF*;+oWPdBz9%od+IiRO*|L4?04LBIKen;tG-ul(@V3QeJz4#b(@+rSbhgHiY1|t> zx^Z88QscKkfBm`{8LjZ|@WyP!XEx%M)zIPpd3|%d{}0!J{{Et$B95Mh!`V*Yy?Ae9 zTyo9gIA=#?_UX{@^1kLOC zo*SR&tZj~SmdrDFfU~v^>AJ|^na_iKEC;n z7ka!0m_F}t-v)1D^A(9-8lGRj_3p*6U*(}aWIEpCtephY8NGQsDEz^9T-!SK!4qv6qKR5;<3CNncZPf>;Twz};jEp2aQNL5|902n z(z_q89Pde7)jH_G6PX?*vk}g_j00sB%biJocp9BXem`e#R%bKH%Ra<$BI1H6r#%B; z4uomql{b;!$Jsspc<0@Ee6P9So4j{KAbCSc2jfvde+othbe!NW(Q=3U5zQU){JX7) z_joT%q;dRl&bxb2R!iwO^8ZT-9qH;f@_#b&pyR2zU^4PxVxrT@a1;&sd$MtdycW~l z)q66xpd2V358@NcKji)WD0j*o;~mQ#;xs{(A8+GjCpbyUJ;FD3dBzT58N2z$4*nXu zi(uFFqO<$`MW`P(qAuISIzqn7U$Q#?ioC#lsJ_$wtj-eT!BXTYm3N=``u4VXr*k&s zHM@CaU_9y*=2PYNovh9Sl5d&+4sV=|GM?3duma!1x9r;FL6`{$a{%fkPhb?v-i{(? zH|v9cN0|5?GukGy4jk1ue=IP5KLoSw_2$eHr(;&@C|~DEaJP2|_#Efywjv+wotdqJ ze4V$zeiZT!>b5<)e#t@Da~cq)${#y6UDFZGp6Ryzk7qm(?)LF85s&s{XWQY8FEkvE zcLFMn?`C!0fqXjwuabdpRA423`!Iw(7rc}4CgV5VdLg^GaV(2o$YN*xYmfoWJ;_ee zo$&wT@*g*Rbgc*Vb{y*Oc*Hj(n_TjL(bqZ3=kKr~tYpN#h1Nfd}Kq9l+$m65XDRYupB&55dcF zI0NbU2*23|v7Jc){znjxZafE=Zd>C|YV_cD&Ec+RTH{ZI+Y=fG06T}fW;}{;==Uw~ z*BQBeae-4;Spu1uxZWXgt@;dcEw$pBi16&VGJHF(jGu|?ACM>Qxc(8?IXr0AEfUwu zt+-xb#nmry&HW5<{WmMFe@1wATp7L{SH{o8^%4BGl7=lBdxg3khq@m z8R9z1itAGd&yFj@x8utAnYh;Aw;k78ff?5+5?9BH>tFHPakp%l-f0 zH|xMU(Ab7fM>#tU?@u6e)@}U#tol8s@fU~_24E`Rzlh%^-!~$isFN1k_0FNC*(mR` zQSP%EJ}&=->aT^jk6vAucB1Y;8U8PX!8WVFv{^LKW)-6CDq$UgHfyu#YoUD@iFhb` zv_1949_<0fKHA>ZH^UscwnrP(X56E#aE{dfLRcPGU#@Aa_=WJ?v<5>%d*!B~j@NNO zxNh1vL5nJ%!)TZO56Py~q%n$YmK$0W*<5L8QDn0uifq{Dnjz)NL0+lzI5SN?vHSLR zerPj&euQu52k+<159gS;M@iQih887Vr^ZNEmIq^)xSGZBNaIH*p`As4foXF*vpe5G zSyO#Q^a0yYHs->9GW?!|zGC9l&6zL7bB2|)$%qrfNJL#u(+fH5$Jmj1bU*se$r#Hp zuTH{PhW$a6FJV7>4BD(Wo$}WB_{Un~;~v`=?+LsS9|!-F8WT|7E`q;|f5GwSb5HSg zo&ee02>-7r8WC6z^AEE}1UACl_~MAb$!N3ahVmQlIpF}tXy|JuHU1tlXgkZ->1?>E zqwQfQ@ajLh?tiZf{r6LyQ5`4gvBlV@zP^3#g}%&5r#PeL#cR8{Pi)!V6_yxxAJ;e+aY>GMW|T@;*SW$1-;(Q)o_WY)b5%Mp9)9AE?NxCZ>A&L`1z{#4 zyt5JBg`UBy7&jAM)j%B{>sO9f_M$J`c8cx?v~^)D@9CJOXcCt*5tllSVc@n9VNR$U z5qJ&m+25dhHSU4iKf$ibcfvdu=oA0CGPL^8uAstQ|o(O&(z0X(V_AX^73S) zfpZXrkjvqXmm|+#hP=N7Wgs7AVKMq4mtu@IK#h~iPljxq_^XgJnhx1o!JtMYkXaDPV&=xSx(r3ACG}9UGPci&y zJ=`_Zd3`DkvpYQ~6LB~BzRq<0S>*1(KaR&P1rO7F9!&Oc z??nG~49Z0=c)geTI>$mj>Nm!5i|1i)ATo^y*fP?%;f0=jAfgkMC?nD3d zWrU;qyC(sUYup8_X`>szhu_X8gVH%Ry9d8nmoUy}v7S2I_4Jou_g%anecbi5u6M=+ z9sn-*cu=}ZuWy7JcVB?;81@L5hd1gmbhJJz7TS`q_?cw#2>ZY6J78gfYAi|2AFTUK z9^o7U^Kt>o@Yxc^2{7G#yI?ygb9AHOhnb_xLOEkQ*mnF~d%S;p>|pMimk&;Q?47VV zx<9Qd;~;x}PiMsJ&JR!y*>3v4&$*#yn&@X|;akuR z``IM}RJ*C#tO@YPp4U@l4gSr8+j;O?&6RlW*lvgMnuOswtlHKVZ>VimZ5`_c6;`N^ z-r_|aBz>|LZ>W#1>UMXzaP>W+wypn_6uWJ0Hnb>h>vM({rEPr@H1~H@aveRp^LC`U z4duwhE%_f^W23q~VRq+DT0UzFIL7fhYm;dn=d9g}HpF}b>8q-=1?2*H$=tD$*Ae9s zC4IM;^r7xBb%crYjjr^uY_qOn{bBb>F(PrY&X)a2&NH_n&z>pY)j4H$XExGk z<}|lp+^f*ZWE%fU93BlleO7TB4&>IrbOd1T~VHQN9$;?2A! z{k|5)>kKPiCI9GJ!Z~|8f17#hILvLUZwsDr7SFEEF7~-wI6rIp+zp*w5q<8nAj_`o zILreMLchz4d9^q-5BS2(7c{&Oe`*Kn&pluEpbi=o*U9jo?c1h!&{ZguH(8Cw&Nzq7_O{ts>AeNp?$zC_IRzJ1r8 zm+pG};N-HG4{lkb`_RrvjFph)wuz82`rOI*HsjC0x&Y)wztG-ydMEfY=RLl4Pvg0d z9sDKw-;L;hqy0ZnIuvvMp1C(B!*9i(g*j!zH^JBN%SZ3tbH`ne9c;Yq<%4Ih7M{m$ z+cUZB(SxOrzI?D0aRC2EHOC7-*CPx+!yVz<(0J}$d#+pX_`$c1|INX{@4TbJed)2S zI^4m+cLBnMANvvC0;GlJ+2CJ=^!^Izor3hCzzhIB|TXk zT}!-ZU)yeWGD|?;4Eiq6CxPBJ$m#6Lb~4-WT{utrn~%HhFQwcN*8cdc2>FbMd`cjn zWKZsm9>`~s_?wIG=G}Q=fc-@JNjGg1oejp{XW?%?)9^@k!>=H}J0ZVEAipU}enSqF zy5#4h{8(pS;H+i)$+C9~+Fcc|O_B0rymmo;j2G+pT!|O$7!MV{wW0WR%@3tH|C6r! z&taM&g9C`?WchtJ`m`+T%$JjpuE}eC9fOD7wdXC!{;k!&IoNo{+ZeA6J}_x3Wcuj$ z4z~UJ*9SMB`}c#0!$-}CYZg?6C)7f&;J>l6>weUKGhkOcA>}+J>(-90`;B~FLmVa{ zEXDJx=2;D%R`96uiMn?Z+E==N5%%>}f6ie0TNi(I$2^RkTZc4XP#6F0^V`t(u1C3> zX#6_eqr$&};SW;bH%*}3L?_T}g+CJEdks&S&I`|4^ru0$!#p=im|d?snO&P8*PErE zi+TKsaJK_%6YP5pjdQkfe*S%|hqYa}Q>{%YKe0wd`d;)?4sXmwfA-=A)G4a}+KPNQ z5`NHK+b3Nry+avx4EIWYKAq-MkY*p`_Y3p`DMOA;O+RviXY=+t#OnjlUhV1{tN3ov ze8a$3gL4Pjf`eOHg+t8oY^e)KF@aG^8-D~Krn*O0h|1s!y8TvSk z(U4dE4tl|%E*1Vwpx*{Mbm@~g<~bQJ=MqlD3q3#8UmFXP{WbQjlJJhg%Xz~Qc%kQz zq}D|6P0*iDr`&fz-jwHNv}u&%BkU*RTRjU?eV4ATS?u?D3@>;#L-za@KY$zZ<^r={ zNWY199oFCG`}7Nb-UrjYK7@W;C)bF^dprjc*={BIIz1Z-qpsuZDAIWbi49vvdTux{ z^6u~vi0kW;&oD;Wg7BiPBmEurM`ImnEz^Z?&p@Am>AQyMi;vrVXz2jt*MVsJ(Eh#X z37EbF`?a^AegE#mRBo!-gK^ECztRtkYiiK0w-q^ouQDw#{{*vb{7yYKMESiO?)D;0 zJGdtHun+baPY&~SJ`ekwp?7d|oRfKYZT8W0avR=RF>8oGu!o%Nfp?(itx z11E4Ecy<6|9EtIO6W|yt4R$pHeGP5?=FI&VE5C*Hw|Skud*%(mnk&}4PkZ9t?Yl5f zkp0Bw?Oexw4(+QclKI8a_{g?$^sE-E?Xi#-F);nu}+g|r&u0uV)8GV`Yr=YE3n{|e> zcE=#J+xUiW;rrc*_IlN$j~{&Gv6m12>Mr&d(B7eaL>qS_l+%~I1$PJFZY$iq{hP-Q zZhhz12hZ91Hrn;$4ivB-0yp#<-*gGXWtls|;a2 ziZEYBnDpy9gjwL3cVhwEPGNf{?(8schP!0AsbQN7|JlFf96+MS_nbG?_v{^yZe4uc zn#U^9Pg+%a*WHWvAOCnI`Z_nFzFUI9T+_CnjZu0gb^Ee9pGVpK3ff_}KEOiQpMrS_ z)>U-(B=Bib+|7agD7fRel$=7L_E94LzU9w_rZP2??EZ+yoK=@;4)RW4vZDWPN5=}4EsSYw)%Y~e}3 zY;%Hi%)4`rnV4yK7ir-43DPki7Ho6qzs!#*x?iqwQflM+4J7 z0j9ehp|RM;&g)Io-{Ks~8^1SE-iVW` z3lPS~;~;O;F{+-mbPtw;|7f%sZ^D0uyMww9NXu^EuIzY>m4=|cISyl`cr{k4d)V2{ zy5TW;3q3h-W4Y|m--pR-Z@lIzp`jSO0sI%}LcD&*2 z-Un0340Y8RsOPDBGYD@!@?}^4fQCt2TRG$6!>!Yu!>BWBy-%DGK%TChy!VVi+xG|3 z?^^G-PYkqe8q`pNa2%{zUISUczKLU4mVrt1V>0|0CVsqo2Isb$CKtvB+Rln=sN3|X z^IJD$J8Et1do$sIIbiR?T+MPWaD2Gp>Eqa=|8;Gk1WqAu_gtY6v-vZ>}`RMz_ ztM<&~F}k~1+|^Kq@o~F5{0YeG;cf2+@$rp^;^P`WM7blcgEox*vtAgx#A$%Mnu^c| z`O6zRUvNGSGQQ_c)DgdiJM1%$Y-m&}G{54BQl;9b|j38oy2c z+BQ^w=L0b9{IvpZqUEn&!ah8Ih1$0cKXhE;b@^pnI;5;JAB|x?Mw~7L|0L+4c*kiS zCaz5#TKXT5T}c1O=rOX-H3sunP6For!ADtO4yMx?P_uY8{lWM2-jx}ctk%~u124ou z=WWF1?dqHE9T-SVhQ8uges(_iFDN+`VGegXYlb4+6FC>I*Ui_#pJw#4Ylfmta*__P zEpV`wQja_skGf$qOv;S9cbrRbJQx0f_+;>vjD(+z-wEgo!ky7EI<)k~`tOgEdIoMs zz%A1bCFyNW4b}pXt~lh2Ls;{3@SAyrzq?*cK$|`svKWCfHWF=mg3^UbLYrQPGQv3T zh8#oXEQxtQ_0O(DdtP^YdczAhXGWH@lK8+gFM4+Gm>9SFA()Im^Mzf`HlX~zurxDR z&g$Y%{MhR%XZ7DdFIdj%H+`WY8EM{$xU*lzx$kF_&^Jq99vh|l9MdqqXuaLrP>*n1 zC&mSefOAcGMERN|`JYL<=mW{q4;@*}H^SxIy zxNfL)1JSRb{}{VJ_tK+xFWz$3V@f};5Pg7je7_Qe=U^@JO2|GK_MlMMtwW?P*qa`z z3%>7>uvr%%?1>WgSkwo|%ar*X^#3?ksgGaQfq1;T7x|`s)6x!iJeo20W#Vui;;?U` zCvY`*nFiM7b>P{8I`*keSD|jXx}y$hWPYfWdRNyii;*WTMV*m{_Ax=#FUHR^#Lo=) zc>v{&bK$H%=s(*p`o9)_8Go-5f3Jo~cgFs5v0n`7YBf;+qJnF!o%S|=p-D6N$FXG!Z}tdVw? z*3DL055g_ex))}5?e|Ym|A*?8QNem;3FZ)Dw%^V1M{K`~P+!^Yx7SstuswIT-?^ra zh-|Z)yq9`H$NUKM`Mzu?P>DVQ=L_Y%tqf!>({oTUpxbTyX_ekc~l=7Zl*~5Ph|XGj7Pt02uvmSo5!jJ#P{MrwzuFQA|x(d&1x}t-! z^WHKtFxcbk9CCp#vjpP`jwych6EzKIn;1ZtPPke|KU$ituw0{$%lgGV~OvFR>Hz3Chh5 zxUs^%Z(v6HA+HWQ5#bsghAgai7##+zLo1z$3lMG_(%b_ zlX^k`>!!8yCL{#*Kf->%|Dq4F>HG$?&-*7joo&(wI3M|s--B)S?O4BGXvyUjuIF>i zjJksT!qXuq<^g{Hn=nVuv31?;8yhCT9&;!&>NZ`8K87do#1QSL_c&);3jEszznLdc zAGCWPOQ4=d=YI5?yoJ7wwl@+wx~@ciL0nmuPJv&d*Hi1TEWtm!EG=U{!759q2g}mv z#=ZF6cC(D-F-|W={7u|H!0$qYL0u5We}NVMcR}OafQkPt68~3Ww!JR?P4{(P3U_-k z7of+gS&Z|{R)q5-*w_{n`OpAKthSrxMf;jhS`&P^Sj8;=vze8n-?H2#jH2my014cL0wGwU5~ukI%ak!+fmkGQ{L0{ z<1VQmSp7H_cJI0YN#V8@H-UuI+d6=Ayjm+`23DRbs$^hNgk68*>4L5U5VOKAnqC%~LP;XJ@w zhq~@R1iK%-w=AQL^(W^xRQ-AXXRbegg#P7H_Ae2}e&`MMsDFt$3-&L+0{Qi*{zQLK z)$gwU<=6ok>DQw^Vc2&6awq17O#S(x^ezmjv!s-LOm zng^>nGBwxyyCDr6Yi4l{4C5Wnfqlq%ddQpcNrqlh+i?iL>W>-TVOj?(YlO3;5wgAk z;c;$;>C8ns?fUTnV9wR?d$wb}Ue}K|HZWh+sQ%&=m=B8!oRNrp2J-F{*(R1`MSTjYq`_WwJ|Q(Ukt#nu>RtMKg--dUzb<mg)Q=^sOHp59 z0Zi)4(T(iiwSiydfB5nHk<93UPA=UuN(PcG8a)+PQe^>yxq ze|s01wWZm*|A=tT0{>GO13isCBj>y72ea??$BZ_Zl%1YCy9{M+3CdnR`jMhv4E=h} zJFB_};{aJ3XbM{!$U08XE2G`x+CcMHej#fE=&Pd-{vOr__GLSPc}P3^>h+tx*kSbH z8sop%;ns(ni*I4{;kYiD3q30L-fi@cl|CHnYtBQkj*q4HhCJG?)-|T6xlA2*jEB6e zPchdvnPVUo_kj|3&Z8pk7h?>A@7wkTu5EY%ry>5#LmuSe%OK}4d42%B2;|X1*i)`0 z#7NuK#F%SDSh`IS{v6ulJG5b4j`|&{o&;?yzNeaxggxg>RlCFQh4r~%7Up`LnZIOy zLft&872i2a{GEh8KIi1=*DjgcJWt}bS=JNJ0#^PbzMIikH*4$UfgXs;A6!plI;Oxa z^T~-Y-F*%=$8T!dK6{;FK6pM$+jkJ_XYRJoUZ?odNcm1E zuYXng0%-qX_NF|32mft({FZSv^4K}FNAei-8RhXf!|G<;CexC~!*I*|aSzO{_yo)k z9fx}4c+@AD8`?MwIy2$(L)Rgnqy4UR&kx0;&Qs$YtbwX>I~jEj`l6U0YAISWP|pvc zEHW&2`#lPMILa!Qa{&)}GL=r?Q_cqX)8sWefv5wzR>>R@{8{*Z_#9C#>xv%E5zS?u zJc@Hf0mzPRxbpW1b41FGs}29ub3{mg*Teyw18P!pM3`Sj+ub5_L@jEL=n*wX)S~8y zemAIr;c|`$JnfTFPjik){YF{bKSa$DHK{owtQ#kyex1B?Lf~w;RdYmBxNeL&BCH#$ zIU=+TZL)6s6xt`VR{ROp*X%i>`H+j<=6@5|jEUa+(6sp*8y0xKc{5D5 zJGtn0n0$daw@ltKFwpj*vq8UZIot{j7f6ftYgI{d(6;|`DdXDHc&^h1wTf~=R zAVo(T|4o!JJti96xD2$m2W3uYim&rEq{p=JW$-r(ewaC;7p?f0F#cwa2=VV2sN=r~ z@wfFycEP`B`Xf`pZ;y?B3U{Hg(IS+^g(#Dkplx4(wP(FH=9MnIihFb&u3{%{NU@Z?tE)_s4ZCnw@hm`%%13~oy5MM?lbP$@jtsXD~LojQjTB_kQ%l zdonhmt||2@u0*j|w||opfNo8aiBCG>!*9A5{!#AxFqY%EfjV5bgN6gBgF0Mer3|itiL#zlV(O5` zw=Ujw*W;DQOD&V%K|S)`fMYLi&6M5#yqL+TAvk8D91*7ZnI<3*s^ z^~f(VUb5?sr>%H@5#jjoeT?qe{sG7%D7QYun>xfwk5JD3p`M=?Isoo7f;c|s80}tH zINPmoE~I=oUoSdtzm;&#L^yUG^&tF+R!0p0KlR3QZQVBbwHNcohc`yiZ9^W~%5mcB zA>B6W)ls*N{aePFdXl>T>^pCk0hWo}w3!So5{bbZX*V9k9GyP=#W_XeVTD=6g|(wHsY9)eky< zP`B%3yWuDEoO`@|66QAw@a^38qhaqL@2EV8J^5bbK`;CB*pt5*^QXw;s-I)_2bB)! zn1yp)lT4fTBcxU3OWBJ!RPqbgZJq+H;H1zzWj6E6L{DHlOnbg>6x?yX&vPQr2g=Ia zb%I{^*Z})qAuPr%5qtS)Qonyc@(;%Wb@AKJ=QyA~{-h3mZ$(GlrOpmO+e0^oPPbf- z;6AasO`hEckyp4rXwQFhEl|}#=mSQZ|K=K9tUB`ZtPhT)oO;mr!wIHQ>&RJ{|GqEE z{P*4{^WWz|2G;zy?)&NW!SKGHULVwbKdcW@F3HFrs?KA7Z;XU%|Sr-QW8yu-)Gq580Uh-t}nTSXVP|oecY6e-C-;(FE;hJo1*BX9%qc zHhBYs^c)ZRoZd^ZCipw72`*LjbPM}?{C@}2E*lHrF4|o9ld!k@d$WN< z{k@*82~HG0a#3HRZqfB9;_?CFK)*L*9wAu2!v61!BhoPre0uHxYm%RGoiGu+t*GzE zNZ7IZfJ5mHVI9W$mAelZoO3`OC36lf9E-)6b7<*q&fz0jA2a%rhk#{_-7?vOy+l2j zbC`;_ewKdX?-^D%V{GIl{Y}u1`X$^_9?!w-!o2AFi*O#>M(j!1{4rJ&bg?~Bb>cs%B;-tM};d61J{uliaJ=V+U}FAY-bSFO;C@$P2% z^Af9#DbExbl%le7Dchn>Lbpk;%$ zpZ$mgXJ*)U^CWir-F_@_R(?kLZXbx86dm7fC**9t+m}UdYAzjeii2O&M_27r4(25= zH^DjK9hfUNYg1-jDpA6vtW=*6{09+#%4#o6%8|eSjNg=5K$gk_0= z+1U4Z2yK(<&$XU~vBl`1Zr~-DXL^HU43uN;0oVuqp>o85^*`pf;5Mo8WALNA2J%t% z>@~8N5r@6#mm(ccw`KeEoIdt^q=8?BU7M)FIxQ4F_M@I07XIa+xx-)N3jZ|;f4VFD zM`MIP(uDt}4nNKgfB4y9;m?W^{xnzk&rA5DT;Xqx5k9|{N`J;+71loNHy8OM{a*+R ze@v9{hq=Q4mW2NvOk4hCF~Z+t!mrig|I7}*S=*u9D4p{|ptB_};Ma ze;6hGKX8SAzJ&jESNO-p2*1*VU!%ic9tyvGLe227@b8Nf{?}aLpDf{5xx#;&Yt2#0 z-(nN~YdZYdcKCJB(YMO~`Y7R-yTbn%ZdCbqh5vGl@Y78AzT;F_r-j0Anb7Jg|53tU zA5ZyysDetMMf{|^4J z@-N~4&K3TG7~wx@!hc1F|B!@__NRS9#TjAY{{gg!^6v`&DhdB7SNP||2>%|~oA%7K zuRL?ew6SbMZ8@H(+@r0-+7H{-LBMV|BV2AiK_Axb#_MwPK@>M#y6+nd>+L9R4!PXC z5yj0rE;oOS;^s}4o83{|{IAQ+t|)HyxZJ!D#m!4DH$RNxrrG7@u_$hS<#wDA;&vD5P_K`3yDWTph`gHqYAHD}q>o1u+%6gr7(d1ua&p0#u z>8ebOYP<^m7`v%rw-k1tW{+Y4+;d)zdlWI&ZYsjL2!DCQ$RM;wk>A26dlZ$snH^*1uXJlb4fbY#SkN*z+U7gQD_aSf}$f2ci7&C|Vf-sN0k29*czkM&h zV-Dhmarw+PoK7{**FnUX6F2Xh zkfHCBuJAZ-9v)Z={;+gZ3=NdI?OqugxYlhqX?S2c?4s304)&))KGZ7+c(BJmLB|_q z3AzT^I76Q2KfrvK=RR0on9RkfPR`z^Yb|SpWklIr~u~MVVC@hs)G=3oU5YB-z@lP>LoAS zFzi%g2X|d!cMj~r^QP12eO{jxQ;4`v!2Krf{8@l~zUP8Z(Yv~yE}8AaSlO9z^FT+X z(VVl!d|!Zc-wn6XXyzP#&f6lN+=IEPd%g;{JWs5{KLBge15pM-=ZY~s9>?kA*!qRL zosRK7C-X!6?z-F4G5)5whS>?u)7<}U+LOKb&AFvFkZ-Snzdq!B?vrO8TmoDd@61&B ze!$2;8|JLlnW>wc#|}aFAQybl?|QClqSMK}6uJ!P{mx6lTZ8;ed-`R<$Ps%jFMW>D zp`{mLT^(~@(BYyy)HiJzuD@Txh`HIs8SNXf4tMXfSKk4C zKnL$>@;>yiv->Q{6Lk$Sb(w#QJ&!z}$NK ziXWrlhkZWI-AL13v|T&cravrgI?CVsuxEYa;Efg*);gaXKiXMa0NvHDMNTHmIhoOoAH(0aMOZUO+@kUP((p_S@w9>mbzU$ncS>6J zi8&Ez`aRYvP5Pt7mo)Z6qS5}p_TC0Cs^V%NpWSSd1tLZPi(eQOEm}U3@D(CzLOuWu zA(EifQkTuPuT}X&YN>v85F)w$zu_XlbRD zwzQ=dEUo|N+&QzEy}O&lpQPmNe=pq3dFISBA7|#?xjT36jCpOtzGomFYHx)|Px)oB z-*n9{ll^kxXKfF3-=k~!ZsPirjMAt6qS#?OX3HU4 zIJez`IHPt*lj~{W9=ovvcF=zVoQ-gaeoNm5f0>`y?-MC4oj=SBCpIp?J5CD!4qWTI zfupz|{0;e}`-f|Z_zT*8%?_-mMBf0=K2ML@op0ZP{wvX5PG_0xDV??L?}&Fd_Ho*Q zeVjV%@?LZY)_JA=lE&}!d4ZQY#pr(`Jl)Uq`xvz^>i@|Ocn81f5Y~PfmX2pqe3y^+ z@6-ojZ1n1%Q(k-U?N<@n`A@lA*7ecMI_EGy;4t5S>jsCOslT5oMyv5%>sTe(L(Q4l zjr$$OxSy~)#qop4+oKz7$LPC{-6QSCF31(fe+&7$8#0cib&HK@qv<|RWw4{Z&)RkY zY@b7Io%%ZDeJ`#DD#M2@b=-k`Q5~b~=6Gc%?!P_gTQk6?xd`;W!;3agYoNb~dKmVX zTYl#J*DXK8{Q1A+*dBfD)8PLG`B;`OjxRfl@<28pZRUaA8_*gZC&&iqi&S2o;=DMJ zmtWy}lWi&fTLsgO$n%wSeWD)g5s&gKU_ZQLHRs`+2&7}3jwW8-vs;)c6cl8ylvYMXB+B* z?p>vj<##1`{wF(l@ca)~zn5NtFp2J^kHMerqtwszd^mOv#xd7il)oJ7Ow&6Z*{_+l zLi~R;?TzPu@KqbUNVUNaIGt#>^nU+2YVY9E8ff&4hBk(2lk|)!_fvZ>O}=|t zkMLx_*tJMTZ99&4{?@Q~S8Tpdd*=oRoF*6T=zSO-k^FD#mDS(6ywQDF@m_{-leSgXc~ z>uA{>_=c^mZT7M|o`ZY)Y`q`DHPr4zIJn0}TlZ{R+jFxoM3@|er!?qXjdZMi8|5(v zcA`G=CH`h@Sw`^_b}BE~Yq-4cJz)Np!#p^+df!w__QJLO7(K6O?`d|!U;PGB-`$(` z_%1)s;hClyVd!4^4BLa|ZBafKB(Vqlr9JTd!hr07aDCZhYCrb4PqW8&khX4*O18(B zEcO_OaEa_eb={vmPDdEB$7;663AkjBVM*)(e`yb_Co&*=AY5Pe_;Y&S?PIQHk2OeJ zx5sd{hudP0*HDH;_Mp1%&mKQE?I1SJW_#>pd;9?TjC;<*^#Xrs53GSPAbTKOU-o#i zAA6)}_P~c8G4^-?I;zX_E%tZ_c}!#vs_Xvj@d<>XIBljoYFh*@wU67A*aQC39{4tV zK=wemzU;BQAA5Wk-yzcTAKgFxinR6iaR=MumvHs_$0CGFWDlzA{_J7StAjmW;JE;~ z;E+A8OkxlCOMB4wqyxF1B3xhgxVRsC+^pH-X{4>&<0`htgBE*?M7Tuupt|nQ9`BiU z5F77fdmM&K_P_=z39lFUOMBoOqXF3i;rg=2>qw`s{$-|Sj};bsybB$*?dvS|_!07$ z$R1SJ{n_JNrX9q_D$^actrITU<7-Lm0e@)^d}A~qdmvn2_V{c+_V^or>qytjr51a9 zo$Ya&#U6JfkBRI-b={vmRwE4Ac#P?e+Exdb?6E3|J>W0xf$s(eWDkVv%N{rMV~?+B z_IML%>(@(&?eQX9{r)ir;S$+{>bgIBOhp*7$7?k23(sSCE;sElDTzJcFYST(aRagk z!u4g3QT^CsrDl)MBW>Ltli413S?uv|lqHcpsIL37$Dd6*(7v0}9tYs|_51!J>e~kJ z`~K$~UthoPf5KtD3s?QN`f(cnzAs5W#$f9s4{Chj>xh$n@AZ}bQ=C4PU8Vmdr!Vk) zjE!POC)!iH8qeKf>?w6U-i0({yyY7kHY{3wrf5a`z`iH5%sm4d?Be)smy21`5O&jK zeE*DZ0KaBe<7qT6YRtARNOw1WzcqYE%vxP2TGwMO;@y*;3emXBgblWxx2+Mg^ElfqGmR%^ZCo8fdKg-BaC~YuH*P-xSvoOqgVa}VG^a$C--IIj#}CC z4cePp?iEbycv9XdF1#BYjo;xIPww4woqqePaVQ#Znn2~m96ho-jmevNS|#mpyRt*m zoa6K8xBpey)$7NNo!T%?OvSj!WpCgZ$kp5<}>Gy3fzq{Oy@u)P6NA-?X{0(DK zM==)l4#uL6V=Ri+$NdM|*fF#*+IMP#Zfm?(G}B>QKc~tIJFUkUjq~d4>O-(Kz8jnR z?!~stc5AjjezELE5;VB=^i6$h9k^1^RX`t#y&1@vSWOB__nBiw5YM654g~I7G1Xw%%ZZ47CT0v zFERZqq(99&TQ*AU_$S(|>Ay?*PlEpm<(K;*GmZ)HLwntJ=nS!g?xSY-E~&ea;)nk+ z<)1s& z>>I=-+-72|r3|+S*JaP^wkIw`c>135H_-nD^-F6oKZf>&w)YCneWCTRrGC`5WocLc z9M4FmEsx?Ini&Rr%-InZ?_Xb8i+6esxNQiBYj`y2k0Raz$UQ$Reqsh(;!TCyVZZw4 zWaEx>F7NDfHd1(dH@$NmwM`(7B8=n8yvwor9Qe@~7xmNh?IFGAm`de9_-@2UVT%yv zQM-8CjWWFP8+r!7TB=z4C@qJ+UwAA;d)yFj8QwRV*U5#WHew&Cjl<5s*xQrhi9;Ai zHtpMTj=7%-%`v7iS(P5;pZ3*LnC$vx^SwFNBZ7NqO8or`@4<1sUW>MW4X%OtxEAK& znwX0*@N#@JE!Wjs1Fm|fP48H5N1JyRVGah~sqMrVD(w|deW412w$LTIub{Tjb>Z0A zcx1ucpPJblYqQ%H-K53US2$ciNz?pnf;6r9dSC!y?ioOswgH4$J%BL&0faFI5N7EB z!c-3+%ryfDQ#^n$1p^2}YkgbWh_${h9YC1#2M}iT0K$wIKp6V~!W_r%kN(PaWB_5_ z8bBC&XVG6;uMQy0o&kjU{s6*!a{yt!I)E^p0|@h|C5+kE6pWUA&7skBf7$DqHfG}& zF2!B|c(0U;zBwE3WrY2LpPMq?Z$xFh(}>D==N6Umjy5WvrO8-hF6xhc0;2LontZ7y zU#`jcy%!CiugNnsxlog@(&RasT&~I2NI9Fz$Z?u7$7#wOrzz`kR%-Dq(&Xzk`9@8? zNt0_exn7f3XtH0ELz>*I$!j$ER!zP`lke8#do}rfO@2U=AJXK{X!7SZ`3su-Wli3u z$xmzYGn)K$P5!1Pe@BzQr^zp9@{ct6r<(kVCjVTMU(@7YYx0|#{5wtlgC_q;lmDv8 z?`ZP7n*47~wioxd)eKD@uE`@c`AkhdOOwyhwh6%!ZPi>cO}a-AL<5{Ux6H8`6bBr zvAhRzC(AEF{tnA8K+eX%2gOgnTWVSEhWrf6--i4{mcI%40L$Nie3)hWjg*cXCB^eq z$d|GFG~}5qKMA>vWm?1S<1EuYfh$@50^~I;KMEPYNz6F6Kz@kjM<9QZ<%b}DmE})E z#u%R&z8&&jmT8~B*IB+7@}F4#1mu6QybkhdSj>R(e>>y}EZ+*bgyowdds%LQd=JY_ zkiW=s2y!>e0m%Q$vJdhUQfP5*-Qz2t*CDT6_awE%=Ab*18%OQV;A zqhH^TenUU{_I~u6`q6LhN57>XeMdj~t^Mdb`_XUjN8i?sPjl|e5Jw!dcV>va>7%Qtn6r*x1k0XvI8Aih&%+2-kKKtmv`6d?yg5B)AB*v*O=;P? z)5KP!nHk zHV=2=^TwUSori{t{llFHhl`%!J7E>mPD_MX;@o8u%c6F=M3f3q>TFLF6&O0~uvKhL z6Gv@MjH;ioIZxQdIy-{1eXc+m1>jM;+5JtLgV))QiA*-Vuj5V6S=JL3!Bi5Qo#|VGzziVz&dLOgo;>?ItG9Y_S2k z-C)nzZx`D+KZ(K(n^v^dCL$G-6^g$|V8J1r&h42;&S?#>k5 z=|yc$(Vjv6TQVm0WQyGx&dyA+H{%3~Vb)K49?Qi##JkSnY|9iIDBkUkEO2%@ChVfv zotrYnVTbcXhS-um8%g)1llE}>#I2cPbA}VmyCZ{Y-;94eJ$zI-Vd-VgEq1ZNmIZOM z4Msm;Bj1CzIx}1)+CH`aEHtVv8yW#6x)qJeF#&B3iJllHHm6tZK$A-+|8*G?Hz8z( z^T05%GlRGXGI!hXVei&q>!|8w*-(!SPLwp*q4G0Q#QPPAE|j;+;q0P9<_NLhk##gv z9CS>;%-{{_&OMpp`ShZ7m^_|A{v8<;4`zxz8D#c-ecAD9+0Hk^IQ9uJ(WW#f-3QW& z_QOPuiMT(Y<)U4$OLyRou|9nw?iD-Iow!TvN^j@(TOl?>+H803874aHc%eWh-V8Yd z`Rqo$4ns~RbPX3rGn_ky;i4^S8!k>{lK*<=MA&18)46Gw*yW@M&H9cn|9F8qsB@yy zePqaXd(mcx*lRC>m{!yVk?$j;1)5&PXx!x5ZAECZd%5mDXA?dle9jGLib#tPhiy*0 z6gg@m(e8X6qMgJvX9vVI5>cDk;;4hfbmxAE=_H~65Hm>3bhbmxB+==_>NrQ8Bo1@# zhB%DG;m)lPhm$zM*#>b0iCNAABgN4y5>IpPgm~I6RIFL<4+&h9^PITusY8wrCgPjc6Vb7IeFA=kanCA?6EsHr-^-bdE26V zo+iV>qjVW1MSfYbA6hC3KnFfs1ceAXci2S>6%RMm4!WV1s_@z9T?9@in$`1spW}Ep zBVL$J#(SD9EBuPqD!(k5{#sGGl+#9GB=s4dtwOGE+c%{-Rg@f41Z5JNa; zvg&)}Ev`lgbgFa(&xHTLx8iOID-Uu0fj}b2P1R5txU9a!tu;FO}x%KKx!lJmU%2i!l zSvqIo5?9H>%9`T&m1T=u^Gn5CBeFPbgysbrjq-r6&InbxBMl-*SqX=|0e^UMW1|SJ z7EOL{vk?lreZ?Lm7%oO}Zg7YE!sGTC{yKL^RCsGc?ojKLYInUmhZ}w|SN~YkPTvyx6sOl}K9@5)rEO2`oU@=ZY zrNB8T@dcXdYTUJ9imWu?St%O5o=_mz5bztq6Yxjeo=6xrhRspzu&8hH`6ktQ!z(Ab z%_0hfj0D1y+;w%60)AhshzhLGswW&Y3{S(Pkl_g|_j{>qFifKnatj%kx7O=JO$c8= zmRy8AA;a*CT3?e92?SvA#-^~>Gs!27D7^k)Q)E(O0CAzw_?P1z8t^nV8h+%sF0k6~ z3%Khb8R3qbGF^K*-?&Ye?GbWvq>Stt|;U6hv}t*K}zDsXT4qux~^ zZ?oIe>MHj6%Dp}#%q5BHoAdI`$b|}6B1r{~{(B2GxSu?C9&B_fUo@>;3-MyJItE9voj5LJ|(L9y%>@B!1FaM^S zU9R~HtD8dgZjW*0E%~`O-CQ!a)Ef@^+^y9Sw1URP!8&(@RJ}!%mx-$PW%a*FX>q}phVue@Btv3{shvhCuU@OgdQ&50YsDzy zDlA4TYbnO7S~q5lMglfWjAlMH`UTN8&pNaH78X_-tA*bk^txb5m(LxJxD0C8F0a2n zAQj%Q%V_Z!LAv@}LEMz+x`|TU{yLY(XShR5Rw0EMe~#Cm#i#?dD-2IWdes^AxK+7=xC0rXh!@wDoUd)3Ld`7hgIVdc=RYRN=Um$F_8q7ehFohB>mp5GHb4Tg}p~i)w z>v3au`y*7d-f%*`Eu#0*Kvc9Lm@T{Ed5h`SU&Xrf@R8g0PTLmxGJROywf6vZNfh9=cHmLX~ujDk(2@N8BZ5P2Av(G|Xv@ z7~#r5Ng&t?U6nLwD_!-yVTh4XSsn^BE?H2)dR)G!*IrtQ^oT}YivAe|LcfN7683H~ z5Gll()}VpTv!q;xPw2yOAW^d zlPAL7;*z?_=6@mlO^vli$TUYF;42i17gZ3D`7t4GF{NJgNHAk-q1Rs;Xmor1g?LJU z!BCG8^!FjK3T0C+G@DeR2%8p}(~53dUPAOdP!ebiqSy3C3elh8Dgl`iTWDTuVR+Wn zEi{`tM1IaOJNQ_n?tXd*>4%)itG&W#Hc*(DNTNZ?{1Nn_Wcp+w7SIh{2JlErEDoc7 z%lw`I-36i29ps`#EjlRq-2wG8G(?;Qb2S`{TOlvgu7Y#|KdY6{`$ zE22HmphK>AH~At9+NAAcE!tU?@P3dGqnC8u8Y9Q5ZBE(}(W2A!Ah&o?d00A+ECCn!%$S9#QF{k@uHS zVO;3mTIw%wO(0>+y;15-DY37mY00}=Z>Gv|gOSBRTJ*#aCW}*hmxYK%st1hr$4SE8 zK#%MT@yOUu%uRkj8kp9AC_Y^Av6ffYBq>pvMmH);UZv!-xTd^7HuXY5zd6sti8*hg z2q$6sb%vkkbYKZPbFQKTzw~SH8V3Vp!hwB!Yk(cVj<#+LRp2M=1Q763UUWTzKR5{M z$B{AkIr(M$7RUbtcr(!{LAY)s-WfSZGoSHKM}!7v2er5{Cla3_2m z`Ggy(MYt!C9}mL8-DSWJ?vZ*7rNPY!;95@Cy6Dr`GHEF8NgfImT`?Yss zSJFfgyZ?^MB2VZ!sc9z zye~$Y*CUKe*p@B>*DW0QjVFAy!oImyWS;OKoFVLOhDhIR2*;s%VIRL-q#bJz_Ss%x z>+y=rh84ngUL4s^hu|Iw3wtiw#gYi@2v;=0rcG%3O~@nK zNp`caSHW#*7PhfyFFC7)eHq;KtA%Ys3))$Wum|C8ZV|Quw40$?yKfbzjlW%ttXU`053Cob<9c^|2th}q85H4c zz_}UcUYy9C$fiFyY-?cbmT|W1tP2FHQjDeZr|+4^Aqqf8#mL;x+dgOiblN7zgXs@t zkk@#ebk8}!VJpzC%%f^#ksfv;JbgHwdu5zU(eBJ+$;hA{?%~YM&PRrQX81HHx8R(H zNfmVDnz@C?(vjV^M1;?d*pdY`-4FNS-0@4vqx_ji>BwxNDcGNz16$HT*DxJ)P0>Nu z6dfDb-^chcyV=Z>q5kuK9UEfPEMnMzdo3L;?EaujVpabVp}nzS4S&&B-(UEeB;j*7 ze&;hR#5+~wwG;PXIvSpnuJ!MdHtDmJ-DT`{u-nb<^X%?sS6GgQ+ogw(-5|SN?CxcE zAG>sqPIR=~A$`}f+s1A;yFKh4WS8#oiH`MmO5Y9awzIpJ-6QNCWtaMhM91cJ(sv8H z9qjh7E6}IV;b52gm_$b>`)_Bri`^saW}{D{V>G+eMoY zxqQEZ9psbJ$F`f!!*0yDa`HoYI>l{Mnr;r7h^+>EO#+0{m6_U$CC;=lY@a zW4|JO(MQA_Nm5n-5A%IYR~P9ZC8sQq zvOvlLDGQ`5kg`C^0x1imEReE5$^t11q%4rKK*|Cs3#2TNvOvlLDGQ`5kg`C^0x1im zEReE5$^t11q%4rKK*|Cs3#2TNvOvlLDGQ`5kg`C^0x1imEReE5$^t11q%4rKK*|Cs z3#2TNvOvlLDGQ`5kg`C^0x1jppR&OA&&llWWcPV?_p*C{-9zjiWmkM&^0L?+%kFq~ zbJ?BE?mTvD*j>i1kKGn_*Rk8q?iO}C+1qlXLl339qevrcPG2gv%8nw1MD7R_b9vKF<~BA?2cu3JiEE< z&SrNWyEW|o@avMllii$eNIae0B6cg;t!4Kvb{}VVH@m-P_dRwm-znp}lHCe+SFw8w zyZ5oXh21Z)`wY9^Vz-m?`4h%H>>g*={;W(dlijn~y@cIrcH7wfGP}FjJ;d%A-{gF= zyOLeO<=Vvf%gSE{PyJ0T1_`S7r60Ccoe7UtSyx`n(=@#2fI7(4oxsxNtWFLMy{Tx5p4|``_ck)_!J@ ztN8i_MxEDP(;762o9es)u}Xlg`Cjj>GXmrnlXCI(CGKFPDP)uy&0fSB>TtG?vVFRq6*R0tp{+qO3F(D{&2+Yk5orOFj$Gt9S$!t>Wz@$NA_2B4eNG}Z69NatE8eL zAg!v35bAQapH<{qSu*zqufHy^y29Oxg01SXA;VG6N_V3{7K?f;T&gIa+3n|8^i}h!8Um3(g|{|jT69ADxt0*s z<<&vM@H8wkJb~qY?;5J0L%mizuQ;~GtFJBb1)A!rjSy8h_v^mtX4+dp)kOY4G`;%4+y|8r&fl+JrX}p6@9ugWoK-&qqcMgvg_;G_R~#tXcx= zxo)g;S2dFzA^DW#cQ;Be|7t0?mbbLHf<`EersMNQT3yY#qJ11lmDR|kCuBs7xxPTH z+cyWvtQ2i+c8alASq(d{RJwn0`KdZx$T?IlPs2*r@+NnvPP7Hvi(M{vv)k))*Lr1Q zNEnS4feb|6UR2lWs{^m8)>Vu4LDtD_zW^i~8+3jmG0Gq3) zyKw&+OE%@WX4V-ISTUTJPZ89@%%$##dwx|p8pQPLiC4DhT52#+J(Z!XtUBLSHuHv% zJBSLmB$_XC;NkdOUJzU^*;Zr$`bu;rRfaeGA5FG7VG)~8LIF|IdUumA;;Q%3MS)9u zer0v8X3YUwd#VdpWLa};?KW4JBsS~&NVOkx4^Fzt?478Ha}pO(zXaH{^P6$Qb0xYs zrdArO=T}|pX*Sz!j1kS6FHl#JZ0j=?)~+x-k+K?BV`EiKuB&XZ4-ro-^Ea1OHJ7=X z%kpQGbDDew+~AEg(2dw=iIi2(bXCu%|9r!wTW6coyyTMIJk2XSByf8wUNS$-_X@sE ziFOfkCe%=(^8OX3K-uWXOUlh&d9D#D2{id5M}*B!1S&P8TCHz@`gw?ZuN$r zpGt~7bl;;;MP{f)#;PVGoGi>dGYog=-Y`lLY?a8ob0U_ivx{8w7tWhsYTmwkV_%~D zIe}iyGP;#lR?iDG8l~P4>NSAp8pPBuR zUyW|Xwa5rJ(IbWkwb?#+mpdb5gmI53YxGcz>rXAW3o?V2x ziR`Wogv_XS6Y}`Da`qCU%5q0M4K6%(7_NGXcfaZH3%8nv=pj@eB^@$hAZVBcIAS8| zV2OB)k*s7p@xq3ICk#}Oi6Vy2%y~PZ8Ujznn=+dqmV?ph@t^@ z#{}SPn>V<%}PAbL&jwD_TtW#1GGclqODGjz33=@aI^y5ccxY;^L-A1Ac!+n!?RuBpx4nF&>cQkB-S|n%o`x!S zq#^1pZiI2hqg30k!=IybQ8ZYjYMy+gs4$uhA3ZgGfS=Z7;z_$XC=fo0rR%cG2d~~J zo5k1cX=42h;Sg=>Z1}r>vklc-(gmc_-RIYlh20-?3H~-{rSu^ap0n;Ma9-k^O2ZFDJ0QssZ|ANIyenEC}G1kDOs7 zSi7aZJlr7;JVR#M(|fsC!}ocq{d;)K7$J2VdIIZ4q>1(qQ~am_J1Q$-&ihe0&Rp?}%slZ)XTEsLIgQ(m-WvKe$!~^D7e609 zQ`|G6K>U8hEJ=^IQlD{bI4w=IO@`f$lHGFWxx;j0scyvpVI$pMWu!wK`3bd&BOgK9^U-c(Piqb|V8B5QLx=}XuM8{k|)APEk^E`1E8$Lho~o@eGG! z!#~Ihht0VAv_kT+t>2x|PjQn|4lw+)m1L;v(3uWLJ1SG8MIX0#git(m z#z2Sl#GlUmzc4)Z_$XmdG+HgQv*q*nqvu8OD+p@FPrysT*wjHq_wsqU~I1k(QXYRIlj%c^H z+xG(P$=ox%-M+)&*kSKF^RR6lXwHcT?HlYZWB1x;?@KG)YFlrMWbd|bw`cFL?XqR< zvN;?@Ik+R7G&hnR%yxF!580f1?9Ky@u8i>$CXDavkY*9jjTT~@txa@gOOLT*BzBCF zcrD}XT!|lHe1!2g7%!P2_2yHsf0=Pjk<`D%xT0L*OU6om_O%lG8H+^{Z&!N!7xpA(e$SB$e(Nt}0%)MtkzUc-1^SmG^=w?`!YG2@+062Hzk zw^`y7iqH5X=gRmuua^3281G~3Vcgj&^|vxU%=ih$?Q5id_<1tEEjLR%pYg%9690+u zzFQ@pa=r}Tew)N@##1LhcQL*QznLk&dl~cQf8qD)r(MGXBTQB+g;nRxa^)#>QNU zCosNxp2WKupE+ORJ&b?LcrWAcUL*C{>t%Y|a37=c=Q6&tLgHzR8x}}hz<5rj#QPba zjbA#%Kfw41;~vI8t&;kjdt`dwzE0vI#-G7`llY~K@5FtR@I1!u8i@}vE?g|}VaB7b zm-qYTRPy3|A z`&ob9{SwXSD<53@%@l`RN#W=#)#dtI0yBP0c{3PQZ#xFB= zJS@{Y#&`nb3vQC>RWL4R9AwbT*UYQ<7JG~e4IYxa~O9pp2WDD@dCy@jF&SOUy|v6k#P>=Uo$RZ zd}gCeZyDnmjN2Fo8Fw&#oN+hfHyHOYKHo3n6JM6;*D%gud+0JU(0wxr{v$ncsAozjH?*0V_e7h zVa6?tw=v$z_}h$kGTzI0598l3?qU26xry7*Aoml<^$Kos1VV z-pjaw@%U{rzMB~rFutF01>?sUw=>?scq`){GCsukHO2)`%J~1txPmd}qnhQ3FdoHt z1LI2>=Wdt$S&S z9Z$>h?PWZg@j=Gp86N{4H?mFa@0Q_n@w<<(^Ert>#<+m--HaO;zXm*Vq!8;F|CMnk z;~(I6Bk7MYexym_g73-r8=EC=V?1ZI#Jd@fZjm_q`!f7r7%yS`{Z^^(VEo`3i4QSe zd9%d1&r5#ETHw)m9(34Dk41#X2vNnjmho=J6sk@JHN%IXuai-ke_yp=`W;#?Y~q_Q zb}pv?M4gO3YCI!&ixA^AO#1OSxp|u5D=m8BFFgZ+a6FtQ`3fukXcBOcLwsFN{NS0U zS~NhW^c99^roTz5qkLUYd^P?;<1xfnSn)Sl_`06>?W1IX$8oI?Utz^xV&Ut0;vZuE zY{<5A~yeAFTN3M>8usg9Ok*Au^j`NJ|KU*TkYT~GW7^PghA!iw)C z0S7siT6n_5r*SVj>^Q0X3X`7NPXs3&go&@~iGPIo=VVI0!ivAsWcTuQJ@Grwk^%n6 z?N4FFx7MGoC%*WQ|2otw9fXOm>xqB#VpAxn;prVKEh?>`DFekln!$f5k}dg80`e|jH4 z=_^d(DgO=J@M814toD#=AYwJ zd~5ktc+wMp9f!xP9+R)I;;*;dKXg6u)%z8C-$LmttoYXQ>w4m=_c8Q-hWH967t&~S6K18r8=6v zt|z{jBLkH1^{cSrS2(1eFy&v@6JNcrqW4#ne}yS%qWtT6;up-7@mF&Hudw3pN4e-A zOzG=-;;Z*#^uCPJSD3<6`twM@K@RbCJ@J=Rm}(K?@+(Z?iQkESg$~8n^~6{2)+O*ueQ$Sn(??_Sf~q zSMN9JeJAB#Va2!FPuCNFokyns4^CfU#h+%q|8RKH6JNbgrT43pzQT&n=8xK6*Asu2 zA=7`3(^pvWr;&hzoJuV`Vd5XDC#?|ww4m=_r>)7nD`1SzJmlUeO*s{^?sS&HxpmsWPDvu{Lx_<|KEm7zQT&{lU;_G_itM~KtzMl9BQ+VRzwqPEFiLdL4Kd)Kp>HR+O6{hgS zuOa~lImFlX#8>bCX+8k)6{hgSxBhN@fBA5eI(!@htk*e#8>kRXubjQ z6{hf%eko2m2oqn|6JO0op!o^JSD3;Re=ANp2oqn|6JO0=p!p2MSD3;Re?3k*2oqn| z6MyW@rdr&dDftR3zV-LNt|$Hm=D&;!h0<48@vYB)x}NxIz6H&{AilziZ|#3|J@M82 z44SV&e1#Q%A_+LiskG>cpM9&T7UTK)RhYt){jB-d^~BF%ej(dWVa2!p{?qluSMy0| zehKAYVa4Aivlq?3t|z{le?s$7h_A5XXIc2Vp7?6M3e8_J?SGpjD84m)6`u6OU(zPS z(|i}=E3EhqsgCAf*Ass!^J#tz@fA+S*Y(6-#(bJjLwto5zsQolt|xv6^C#p;zQT$R zZ}T8rsf8y@{O&eWEoixr-C3(@=`;wwzy6Xjpm6W@2cjDH;h6JOzEd|glcAoFQ{67dyQ{302B z)PB02_+8AW`Ao!DSn+c#d|glcz09ZiPsCSP@vZfz>xsXQ`7~dO_zEZE>w4m=`BXH& ziuejEeupLhx}NxI{uRx~BEG_kZ_U51C%&4mMf10auW&NHt|z{l-$nDih_A5X7g_SJ z>xtiehYUdT!-%i2;^$cSx}Nww%%}Ne#8+7Ht>xGC#8>mpX#N@T6;8(2^~6{6(`ddL z@fBA54om)ZJ@M6iHk#i?e1#R?ntxqSd^P`#=ED(R;beSWPkc3B?v^~sS6K0jEcw^< z#NT_T3_$bkD1C($KgYt?^~68Ie43v}e1#R?T7F$md^LZM=JOF>;beSWPkc4skLLdo zUtz`Xu;gFY6JN~_r1^rxS6K0_`PcQtSMv#Jej)J{PR7^u#8>kVX+9$H6;}KrOa65| z@zs1qn!iYVg%v-?!q@f0SMwWbz9aD!R(xyubv^Obd`OxfNqmKq@pV1%)%;1CPf2`* z6~Duhe_c=f&bwp)ntw@rg%#hLe_c;}H9wQ)YZ71KWPDvud^Mkw=64cbVZ|@9U)K{~&0nSYti)GX@vZsS^~6{6U1|O+@fA+S*Y(6#^J8hgEb$dqe3->N2v=J4 z#8>laX?`v76((^!&K#U{5GKB^C%&40`*@k;D@;L&Z!N#BC;s?PAP^3kzf0*WoQ$vQ ziLd7O(tKayE3Eh(X6(KB*Y(6#^MPr8F!2>ud~5!7J@M82VVX}&e1((obv^Obd}Eq_ zOnikEzsQn*T~B;9Kbht$6JKG)&#~}zJ@M6iW}4qje1#R?T7F$md^P`>=0g)-;beSW zPkc3Bn&wXvUtz`Xu;gFY6JO1*ruo*yS6K0_`PcQtSM#xHem3zHPR7^u#8>mTX+Agc z6;}KrOa65|@zs29n*U9Fg%v-?!q@f0SM$SZzBus}R(xyubv^Obd~%v!PJD%v@pV1% z)%Rb0#8)^OU)K{~&4;J?@x)hH z@rx|^*Y(6#^XF+kJ@FM*{2U8k*Au_$UKxPq-xFV9#kZDU*ArjO&!_qN#8)^OU)K{~ z&F822{lr&T@jEQ}*Y(6d#`!;*DftR3zIFUg*Aw4&pG=@^nB*(0_}1|+T~GYA%=hy6 zpTdeCwB%pc6aO&tzs2b*toYXSbv^M6V3R8IE<7d5j5GKB^C%*bVg1(m^zQPnf5ntC6zvV$0KYd?8 ze1#RC;-G^trLXIWufD&a?=gt4FojQ4eqB#|^}Pmtzd?M3lks&u@zwVo^t}i16;8(2 z^~6`-gV6UO#8)^OU)K{~eLq6qlMr9wWPDvueD%EveSboHg_H4hJ@M7|DfGPx@fA+S z*Y(6#-?Py7EyPzi8DG~EUw!{V-@_1J;beSWPki;g41GUCe1((obv^Ob_cipr4e=FD z#@F@4SKs5%_c_E@I2m8p6JLG5L*MfdU*TkYT~B=Vy$^l=Lwtpk@pV1%)%QX4y%6yg zPR7^u#8=-F(f38fS2!78*AriTe?;FS5nthCd|gj`^}P~(zeIe6lks&u@zwWD^t}`D z6;8(2^~6`-LtU{<@)b_T*Y(6#-%ru^RFuBL$@sdS`09Hr`u>XeQJm!dsq2ZazR#lX zwTQ1U#Dw=>T~B=VJ=Y5!$yYcTU)K{~eg8$@gHielC*$jS;;Zk)==(9^E1Zn4>xr+v zFQf0xh_7%mzOE;}`X240%OzjoWPGKk?-O!hV|CE?2{{VDrSB7TOy4Kyn7&WA6yG1L ze@>F<`vk(BjOqIX!ut0Kg!S(e2Agq6%Kv@4ifw2C40%8681j6e31o|G~ z(lO|t95yq<^tVomCbr}6>A*A(ln(qHFtM7i+rU`OAANwanh*RIV>Q2aHsYfA)O`5{ z#%lgQ&37fen$Jq}e+jGky)+-2u$pg8^UDaU`C~NSim;kbMe}b7tNFDwpOmngFG};X z39I?nG+&Ugnh!|xKMAY(oirbgu$u2i-$xKu-#^fNJ;G|f9?f4TtmdcFd@90fz7);R zCVbvFlmQ2QFF;s*4?y#m2&?%?&oNf>d1!tS>DBxqnlDaR%?GFXQ-sz0D4NeqSj|_a z?;{AS?;q%U1H$Ti0-8TZSj~^4`SgUrwcuG2NAtJPqIX+x#Kc9>_%~Ygn=SZJ3#RYZ^!$Cpg1>9QFIezT zEcj;@{F(*7VZm=(@ZThc73GnAhMB+U^_FA7Q!Kc|g0Gi2YM+}dxZZ*T68~GJf2RdM zY{6f*;Fm1;O$$C|!C7aT<%_0wp#>LM@O2g(vfz6y_zM>NtOftrg8yW}VpMGY&avQ0 z7ChI2KW4!}3*KPCk6Q3IE%+4+K5D@uM#tuNoCRNQ!80XBt;nOqf@>_;Z{e@C=XVUWKy(r`28|_(gD%o$kPSC(d;^@4|UE&h0q=2j|JG zv;V)YHdb(vRAe?BOT!C))aOI z%71bfv^HZs>1$e>vBocJP2PzXY9{{zxen|=7P;1f4`j7#GkBr}u1Uem&kkr^YcqVp zrLCdK&s7B&$okScVL&TQYlMLwT;~ZL+LuJZlS1lYXYmi#1fA z>mi%GxP^_a)+|8HC5-l@EHF)ZDCn&(y;=vp#xzCp|F$GFm{a>*2$}+&yrrNK+q6E` ze@1~;^42ghfA_C9K2(@`jDmGRXv+J%^rSCjy)y3?_YgO`& zq*m`LZ8uV@F2O#=)*!NP7FKWC?bqtpyW4TB#;3nSC&*H1L z^3(U8)iN+*(`vc3buTve zukMAtds|{OCuUbc%`eeLYpjmnN01fz27)nO(VYWh ze0j^j7(Z;zMjHZ)7|-b5EV15UbE_k{4_!?7KJqTJ80p;)P!i)e0#yE%9RQ`bzV)B< zK_w^O^RG9E+U&2_$GXd3uO_-rU9VTv5WKHnucmiHzg|CWCqJuayy;^0?vue2ZrUeR z)cj+2>y!R{ZPTYhSoY_W-Z2~VNiVr0AIowpK79*5O_p2lNsmNZ?nzB!czHE;@e&fL zjrZh^duppawZ|UqJV~4Dsa^HrHWEtFEn{;WE>>Ho-Q3-WF^eOBs;L8M5b} zwHTXknh%NCA)d4*la;jBa_olSee5_jHPJ@&Q>{DEm-QwR-Kkk_>D=Eg<=F2z7rUTq zTcX#vU{kXv;=O-sTX6+Z{nHM>*a5YbtdU5^j}4|8g9~byZXly>u3Fmh9!;`2uoCw% zbYqlGgWGD!Z68rmDSIDCz}*$vBigOM_|ov(gRl%b=~ z)TRZb-}G|YDwuBY)%o)Nt0_zJWAC6>uE-(n(H!A^;B1LeB&^? z&1lQQp6BRA)sB2MuExeH^q^&neegB+>#J%m<5^X?d;IUgYHY%HMX#z3=Sqo%O^TEhf>&8~$ zTu>L8rT2Lurde2$w8Whx2WY2ys(HDtXj(I*IA2{PiFS3%%b!D?AU4LNV$Q$Tb7S&8 z6iLNaeOcM!T36ZB@h&_R<>i^z0)E_Kx8f@ENye;)d|45dAV2rJjuP9Tls_XxvLe0c8lMj2z{x=t`itb3bl<=f(%&)!%%~QYC{x>vD zy#FwtZMhczi`r*ifqHDOGjMwgc-#@yR{x7i>G72<#I187?wy0wG_5~r67~e>c+nN) z{h#RyPGO-2u`f7vr5gOsU= zX+ynJIQ2z3`8~oZFVmoP2ScZ1gWVUL`jQS(M{vpu_MhklPI(~*tqbUXI#9yiV4B$* zOdsmK!H_E5$?q73Qt<|@j~J4L9PI95NELdJdXAw~#{WboGL*_YX#I)mDJ`=?6Luog z%}!*-Q13)eeUVOn&vDAjG-%z$&?(tq_YtSQq=VEkobrPGCwhZZUdSQQ1C|=sgHom;(FF`{$%axFFgPV00$sqM6l|z<0fSP=LF)qgSb{3yFM*k6H&8It zyMdumtdrjr42g0LT6ZwCN;lYD!q6z~Aax5vqHzC-u3<#B4u(VWDt!usu%XeU9qOdpM4^M71*R%457gk?ygvhHnQen8m z5rNO#8-wnMx7O?PMp|i^Px)bYakJa&b4y=yeO*NF@`kH??nr$g)M$;R_lxj;hzmp4 zyF*^LKawma^W*#EdFXSk(aD~GuWoW4ef^i8mw5eNEr@mPZB4~1%EW%=P0P*bVa!DU z260^(Ev-J*UwuEJXn~Zz)^e3`O&w6EX#)y1eL$gR3@Fsh0fj0UP^ei03YA9}RsROd zGh1B$bu=*Z=MBvMd1eL3#f|!16+>$z+_a;M5WKH-9r}%D;EOfrQT=y*ggm$<91@?^ z4S^yK_J<;aQ^cV)>3LAfsNTPwvboRN1Jj@saEMMf8I-cB$~*O{W{f9tdxJMdjaTrU2 zmH9n^I=I#-Jy>1S@JGT6>r1^MEYKMUwH8OJ+>wUFmiGjj{E<1WW&Wl{BLpk?m&=NP zy$fM2L=Y}C!^EZ26bd1o;$YC{#nL_T=EY*b?j~Pkf!pt1ZeW?t7~9u*QK=@z)xyNfI>t&E8PJ--tvlkr^$9rzzsD^%>@R>M;q?7=WIHh3fT3%$5G)y$xhK zp(vN!^RxglS-Auw7g%&FE|0Kptr4P}%n1bI*uC2Ms6C`?wYIDZv?bWbsH<+O z4Vx<{#s$NI!gQ@!ii5F~2CEmZXJ3b`dh5M$6@;tTV}!%Bh@gcTGFCNVO)7a6#I|l4 zw!uozs93pHVq7t-+}@V{{-`y9vfgW|mufAyN>0Df2NDLQ(l7D`bK%Eig`qv6WN757 z8RiUAEmJ#?rbv>YPK)jUH6Z2O3?Xo?sXY;;GG>lfFQ^L|BzVs1$ZR%-`)TpHpBA6{Y4N$A9-sT^@wuNKpZn?Yxt|`N`|0snogSan>G4^e9-q}2 z@mZY_pW=-8=x4;oH8Z}9Gvf<1Gv4+y;|nx1KKg?A=nLY@I4eH-yxe$8=jFyHke3&q zkG%Z&667Vg9`X`2^}GZvFE2qu$V<=?@=)&>^_RQQDwEcLh(g;`M&;m1+M12e3LeypfeD3RYBsQQ}bQM^y#kVsT9ata9v*h zO*gx+@lJJ9sNU@{uDm5b_okam=9YTHL7%%7k9CH-adEH?PhC*yapDCCp38i$<-S0z zo6@?m=6bbc{(r;zmga(;gHohZHx_w{%QPs1k0-xOLtwP=q!&sJ*qpNA#gks5p){U& z(hH}m>y!;3p3)Kx%821fFVT<~B0Tw}8X9AQR4#K<9*oq{5F6kEBedM8lbgGRz=(~^UuzDe(75sFU>Cd-y_xUy;w8xzMEQ%oELBW^KTD^zy9c-uUXK!_`vZeFFj}K zhO%exaX)+L!iJYFd-08zc0Mxy+rfofCS<-`JZ<@}K41Lws>e?R$No@!``z|We(BXs z<1d)|_4|iiP;l7(-94MXc3;a|e`_E2LQ(TS)<53V-SDgX&%Lkdma(HhdGnpk}F5vbx%&@(MM}uIpbd&zF6S9_19nPy7Aso zhihK>+|Pe{{Ibh`IPN2V+%qz?c>AIiM_+vQ=F>xEQ;z*2=xjT0>4^>h7`b9$*Pg#_ zJo3Xwy6$}MipM_YjofnX4_7=C`Nkh^Ue-F#b?EYcFF9xOh3R|l?>;fH?K3MHF1z@h z--p-KtpC)T?|!Lrd*sdFOHbXL_2$CU9{=-xccnIS5AEA zf!y+i51#Y!h0DroJ#DM5EW57zhMyN6Uh~%JkAL^6+qOTmB=ExT>$@Glc=_d(_JvE* z-&?z5?V7t@`}TeF?wR=b2i2ed=NHmmyD>Q9wz&_!mKXZbcRu5||5N7Mg&i=wsLakKuZ;XX1^QJooIVHy>ZW zdd0}#$Fr|nv+;1%&g-sr`0d_ySNYakn}4?YZ^J zWzSsl?A2GllYU2L;HejX_3%S$o=#hQ)}gCrq;0u&@(sUyru5w1%fI=VLw`Es)sNlm zJwF&|XdF@2{GG+WxMkii-~Pwu-`)M*L)+FaoOkS}WA6HW=2Lk)!+Y<1=-lTY@L#v_cdrG4-}YYjxB27C&wuIJC69bFaQV^5nckO{ z++t1hi8nq@#aOpn|S^o8tyV~zkc7nxBTX`KcBNL{9f?ozmK1F-i-49S-E2Di{E?l zx9;I94|N*rH?Q#D(tYi{*U$g!TOZx;_|s!M?QcJwcIJI8nOhz?^vCsI{)l(hu&@5$ z??=ji7Md{ZSKDuSWMopy6=U1ntuMhmwvhSg_ocC>r;O??Q6A* z9{yLuV-HQQdU^YSZ{N0h%UdfW?&j88ipoa5^+qUb+av$lUHI6GGZ)u6c6>2!`fFGH zwcwrlJGTAqy2q!t{`kSK{OJ7Oj{3zfe;l}{yJz*IUtRvkb)Vbyr{c+zmlRe$G48C> JTX5(3{{Rq~+)Dre diff --git a/test/fixtures/native/node-mac-permissions.x64.node b/test/fixtures/native/node-mac-permissions.x64.node deleted file mode 100755 index fd53dd6d9f4c7a41d1989fb0fdb7d307223d15fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115040 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 Cu#Z&$ diff --git a/test/index.spec.ts b/test/index.spec.ts index 121ddad..f1be9fc 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -49,7 +49,7 @@ describe('makeUniversalApp', () => { const out = path.resolve(appsOutPath, 'Lipo.app'); await makeUniversalApp({ x64AppPath, arm64AppPath, outAppPath: out, mergeASARs: true }); - await verifyApp(out); + await verifyApp(out, true); }, VERIFY_APP_TIMEOUT, ); @@ -329,7 +329,7 @@ describe('makeUniversalApp', () => { arm64AppPath, outAppPath, }); - await verifyApp(outAppPath); + await verifyApp(outAppPath, true); }, VERIFY_APP_TIMEOUT, ); @@ -362,7 +362,7 @@ describe('makeUniversalApp', () => { arm64AppPath, outAppPath, }); - await verifyApp(outAppPath); + await verifyApp(outAppPath, true); }, VERIFY_APP_TIMEOUT, ); @@ -387,7 +387,7 @@ describe('makeUniversalApp', () => { arm64AppPath, outAppPath: out, }); - await verifyApp(out); + await verifyApp(out, true); }, VERIFY_APP_TIMEOUT, ); @@ -410,7 +410,7 @@ describe('makeUniversalApp', () => { const out = path.resolve(appsOutPath, 'UniversalMachoApp.app'); await makeUniversalApp({ x64AppPath, arm64AppPath, outAppPath: out }); - await verifyApp(out); + await verifyApp(out, true); }, VERIFY_APP_TIMEOUT, ); diff --git a/test/util.ts b/test/util.ts index ab7a685..5595be2 100644 --- a/test/util.ts +++ b/test/util.ts @@ -5,20 +5,19 @@ import * as fs from 'fs-extra'; import * as path from 'path'; import plist from 'plist'; import * as fileUtils from '../dist/cjs/file-utils'; -import { createPackage, createPackageWithOptions, getRawHeader } from '@electron/asar'; +import { createPackageWithOptions, getRawHeader } from '@electron/asar'; // We do a LOT of verifications in `verifyApp` 😅 // exec universal binary -> verify ALL asars -> verify ALL app dirs -> verify ALL asar integrity entries // plus some tests create fixtures at runtime export const VERIFY_APP_TIMEOUT = 80 * 1000; -const fixtureDir = path.resolve(__dirname, 'fixtures'); +export const fixtureDir = path.resolve(__dirname, 'fixtures'); export const asarsDir = path.resolve(fixtureDir, 'asars'); export const appsDir = path.resolve(fixtureDir, 'apps'); export const appsOutPath = path.resolve(appsDir, 'out'); -const nativeModulesPath = path.resolve(fixtureDir, 'native'); -export const verifyApp = async (appPath: string) => { +export const verifyApp = async (appPath: string, containsRuntimeGeneratedMacho = false) => { await ensureUniversal(appPath); const resourcesDir = path.resolve(appPath, 'Contents', 'Resources'); @@ -29,7 +28,9 @@ export const verifyApp = async (appPath: string) => { for await (const asar of asars) { // verify header const asarFs = getRawHeader(path.resolve(resourcesDir, asar)); - expect(removeUnstableProperties(asarFs.header)).toMatchSnapshot(); + expect( + removeUnstableProperties(asarFs.header, containsRuntimeGeneratedMacho), + ).toMatchSnapshot(); } // check all app and unpacked dirs (incl. shimmed) @@ -66,12 +67,14 @@ export const verifyApp = async (appPath: string) => { for (let i = 0; i < integrity.length; i++) { const relativePath = infoPlists[i]; const asarIntegrity = integrity[i]; - integrityMap[relativePath] = asarIntegrity; + // note: `infoPlistsToIgnore` will not have integrity in sub-app plists + integrityMap[relativePath] = asarIntegrity + ? removeUnstableProperties(asarIntegrity, containsRuntimeGeneratedMacho) + : undefined; } expect(integrityMap).toMatchSnapshot(); }; -// note: `infoPlistsToIgnore` will not have integrity in sub-app plists const extractAsarIntegrity = async (infoPlist: string) => { const { ElectronAsarIntegrity: integrity, ...otherData } = plist.parse( await fs.readFile(infoPlist, 'utf-8'), @@ -104,12 +107,15 @@ export const toSystemIndependentPath = (s: string): string => { return path.sep === '/' ? s : s.replace(/\\/g, '/'); }; -export const removeUnstableProperties = (data: any) => { +export const removeUnstableProperties = (data: any, containsRuntimeGeneratedMacho: boolean) => { return JSON.parse( JSON.stringify(data, (name, value) => { if (name === 'offset') { return undefined; } + if (containsRuntimeGeneratedMacho && (name === 'hash' || name === 'blocks')) { + return ''; // these are unstable for macho fixtures due to runtime generation + } return value; }), ); @@ -211,12 +217,12 @@ export const generateNativeApp = async (options: { additionalFiles, ); await fs.copy( - path.join(nativeModulesPath, `node-mac-permissions.${nativeModuleArch}.node`), - path.join(testPath, 'node-mac-permissions.node'), + path.join(appsDir, `hello-world-${nativeModuleArch}`), + path.join(testPath, 'hello-world'), ); if (createAsar) { await createPackageWithOptions(testPath, path.resolve(resources, 'app.asar'), { - unpack: '**/*.node', + unpack: '**/hello-world', }); } else { await fs.copy(testPath, resourcesApp); From 753a3a02401e29670cb1ee2f284fa63bddf47e5f Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Tue, 1 Apr 2025 15:43:48 -0700 Subject: [PATCH 14/20] Update jest.setup.ts Co-authored-by: Erik Moura --- jest.setup.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jest.setup.ts b/jest.setup.ts index 21ded34..a416bb1 100644 --- a/jest.setup.ts +++ b/jest.setup.ts @@ -3,7 +3,7 @@ import * as fs from 'fs-extra'; import * as path from 'path'; import { appsDir, asarsDir, fixtureDir, templateApp } from './test/util'; -// generates binaries from helloorld.c +// generates binaries from hello-world.c // hello-world-universal, hello-world-x86_64, hello-world-arm64 const generateMachO = async () => { const src = path.resolve(fixtureDir, 'hello-world.c'); From ce1199713a9c13a2c0a3876f688ffa2f250edee7 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Tue, 1 Apr 2025 15:43:59 -0700 Subject: [PATCH 15/20] Update jest.setup.ts Co-authored-by: Erik Moura --- jest.setup.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jest.setup.ts b/jest.setup.ts index a416bb1..ac10156 100644 --- a/jest.setup.ts +++ b/jest.setup.ts @@ -5,7 +5,7 @@ import { appsDir, asarsDir, fixtureDir, templateApp } from './test/util'; // generates binaries from hello-world.c // hello-world-universal, hello-world-x86_64, hello-world-arm64 -const generateMachO = async () => { +const generateMachO = () => { const src = path.resolve(fixtureDir, 'hello-world.c'); const outputFiles = ['x86_64', 'arm64'].map((arch) => { From a3ef4cb92fd0892065c5329f91e62346326c9c02 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Wed, 2 Apr 2025 08:53:02 -0700 Subject: [PATCH 16/20] remove unstable properties for specific keys --- test/__snapshots__/index.spec.ts.snap | 54 +++++++++++++++++---------- test/util.ts | 25 ++++++++----- 2 files changed, 51 insertions(+), 28 deletions(-) diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index 26f8225..be1ee68 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -627,8 +627,10 @@ exports[`makeUniversalApp no asar mode different app dirs with different macho f "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": "", - "hash": "", + "blocks": [ + "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", + ], + "hash": "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", }, "size": 1063, }, @@ -636,8 +638,10 @@ exports[`makeUniversalApp no asar mode different app dirs with different macho f "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": "", - "hash": "", + "blocks": [ + "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", + ], + "hash": "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", }, "size": 33, }, @@ -694,7 +698,7 @@ exports[`makeUniversalApp no asar mode different app dirs with different macho f "Contents/Info.plist": { "Resources/app.asar": { "algorithm": "SHA256", - "hash": "", + "hash": "27433ee3e34b3b0dabb29d18d40646126e80c56dbce8c4bb2adef7278b5a46c0", }, }, } @@ -707,8 +711,10 @@ exports[`makeUniversalApp no asar mode different app dirs with universal macho f "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": "", - "hash": "", + "blocks": [ + "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", + ], + "hash": "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", }, "size": 1063, }, @@ -716,8 +722,10 @@ exports[`makeUniversalApp no asar mode different app dirs with universal macho f "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": "", - "hash": "", + "blocks": [ + "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", + ], + "hash": "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", }, "size": 33, }, @@ -774,7 +782,7 @@ exports[`makeUniversalApp no asar mode different app dirs with universal macho f "Contents/Info.plist": { "Resources/app.asar": { "algorithm": "SHA256", - "hash": "", + "hash": "27433ee3e34b3b0dabb29d18d40646126e80c56dbce8c4bb2adef7278b5a46c0", }, }, } @@ -936,8 +944,10 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": "", - "hash": "", + "blocks": [ + "bb775443c1c6bbc9c06580111e671319a9f67cc8d3fec9443a3ee6450b443a66", + ], + "hash": "bb775443c1c6bbc9c06580111e671319a9f67cc8d3fec9443a3ee6450b443a66", }, "size": 49824, "unpacked": true, @@ -946,8 +956,10 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": "", - "hash": "", + "blocks": [ + "0f6311dac07f0876c436ce2be042eb88c96e17eaf140b39627cf720dd87ad5b8", + ], + "hash": "0f6311dac07f0876c436ce2be042eb88c96e17eaf140b39627cf720dd87ad5b8", }, "size": 66, }, @@ -955,8 +967,10 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": "", - "hash": "", + "blocks": [ + "d6226276d47adc7aa20e6c46e842e258f5157313074a035051a89612acdd6be3", + ], + "hash": "d6226276d47adc7aa20e6c46e842e258f5157313074a035051a89612acdd6be3", }, "size": 41, }, @@ -975,8 +989,10 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": "", - "hash": "", + "blocks": [ + "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", + ], + "hash": "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", }, "size": 11, }, @@ -1004,7 +1020,7 @@ exports[`makeUniversalApp works for lipo binary resources 4`] = ` "Contents/Info.plist": { "Resources/app.asar": { "algorithm": "SHA256", - "hash": "", + "hash": "16f5341e6a66b50659c9b40ca8cb3ed3f893d74813aabde99ac51af2ef9e414d", }, }, } diff --git a/test/util.ts b/test/util.ts index 6aae454..54abadd 100644 --- a/test/util.ts +++ b/test/util.ts @@ -24,15 +24,14 @@ export const verifyApp = async (appPath: string, containsRuntimeGeneratedMacho = const resourcesDir = path.resolve(appPath, 'Contents', 'Resources'); const resourcesDirContents = await fs.readdir(resourcesDir); + const ignoreKeys = containsRuntimeGeneratedMacho ? ['hello-world'] : []; // sort for consistent result const asars = resourcesDirContents.filter((p) => p.endsWith('.asar')).sort(); for await (const asar of asars) { // verify header const asarFs = getRawHeader(path.resolve(resourcesDir, asar)); - expect( - removeUnstableProperties(asarFs.header, containsRuntimeGeneratedMacho), - ).toMatchSnapshot(); + expect(removeUnstableProperties(asarFs.header, ignoreKeys)).toMatchSnapshot(); } // check all app and unpacked dirs (incl. shimmed) @@ -71,7 +70,7 @@ export const verifyApp = async (appPath: string, containsRuntimeGeneratedMacho = const asarIntegrity = integrity[i]; // note: `infoPlistsToIgnore` will not have integrity in sub-app plists integrityMap[relativePath] = asarIntegrity - ? removeUnstableProperties(asarIntegrity, containsRuntimeGeneratedMacho) + ? removeUnstableProperties(asarIntegrity, ['blocks', 'hash']) : undefined; } expect(integrityMap).toMatchSnapshot(); @@ -109,15 +108,23 @@ export const toSystemIndependentPath = (s: string): string => { return path.sep === '/' ? s : s.replace(/\\/g, '/'); }; -export const removeUnstableProperties = (data: any, containsRuntimeGeneratedMacho: boolean) => { +export const removeUnstableProperties = (data: any, stripKeys: string[]) => { + const removeKeysRecursively: (obj: any, keys: string[]) => any = (obj, keys) => + obj !== Object(obj) + ? obj + : Array.isArray(obj) + ? obj.map((item) => removeKeysRecursively(item, keys)) + : Object.fromEntries( + Object.entries(obj) + // .map(([k, v]) => [k, removeKeysRecursively(v, keys)]) + .filter(([k]) => !keys.includes(k)), + ); + return JSON.parse( - JSON.stringify(data, (name, value) => { + JSON.stringify(removeKeysRecursively(data, stripKeys), (name, value) => { if (name === 'offset') { return undefined; } - if (containsRuntimeGeneratedMacho && (name === 'hash' || name === 'blocks')) { - return ''; // these are unstable for macho fixtures due to runtime generation - } return value; }), ); From 5f0bf56dfb663284b5ea781742973189b8ffc79e Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Thu, 3 Apr 2025 08:33:43 -0700 Subject: [PATCH 17/20] force redo --- test/__snapshots__/index.spec.ts.snap | 54 ++++++++++----------------- test/util.ts | 30 +++++++++------ 2 files changed, 38 insertions(+), 46 deletions(-) diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index be1ee68..26f8225 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -627,10 +627,8 @@ exports[`makeUniversalApp no asar mode different app dirs with different macho f "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": [ - "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", - ], - "hash": "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", + "blocks": "", + "hash": "", }, "size": 1063, }, @@ -638,10 +636,8 @@ exports[`makeUniversalApp no asar mode different app dirs with different macho f "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": [ - "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", - ], - "hash": "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", + "blocks": "", + "hash": "", }, "size": 33, }, @@ -698,7 +694,7 @@ exports[`makeUniversalApp no asar mode different app dirs with different macho f "Contents/Info.plist": { "Resources/app.asar": { "algorithm": "SHA256", - "hash": "27433ee3e34b3b0dabb29d18d40646126e80c56dbce8c4bb2adef7278b5a46c0", + "hash": "", }, }, } @@ -711,10 +707,8 @@ exports[`makeUniversalApp no asar mode different app dirs with universal macho f "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": [ - "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", - ], - "hash": "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", + "blocks": "", + "hash": "", }, "size": 1063, }, @@ -722,10 +716,8 @@ exports[`makeUniversalApp no asar mode different app dirs with universal macho f "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": [ - "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", - ], - "hash": "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", + "blocks": "", + "hash": "", }, "size": 33, }, @@ -782,7 +774,7 @@ exports[`makeUniversalApp no asar mode different app dirs with universal macho f "Contents/Info.plist": { "Resources/app.asar": { "algorithm": "SHA256", - "hash": "27433ee3e34b3b0dabb29d18d40646126e80c56dbce8c4bb2adef7278b5a46c0", + "hash": "", }, }, } @@ -944,10 +936,8 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": [ - "bb775443c1c6bbc9c06580111e671319a9f67cc8d3fec9443a3ee6450b443a66", - ], - "hash": "bb775443c1c6bbc9c06580111e671319a9f67cc8d3fec9443a3ee6450b443a66", + "blocks": "", + "hash": "", }, "size": 49824, "unpacked": true, @@ -956,10 +946,8 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": [ - "0f6311dac07f0876c436ce2be042eb88c96e17eaf140b39627cf720dd87ad5b8", - ], - "hash": "0f6311dac07f0876c436ce2be042eb88c96e17eaf140b39627cf720dd87ad5b8", + "blocks": "", + "hash": "", }, "size": 66, }, @@ -967,10 +955,8 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": [ - "d6226276d47adc7aa20e6c46e842e258f5157313074a035051a89612acdd6be3", - ], - "hash": "d6226276d47adc7aa20e6c46e842e258f5157313074a035051a89612acdd6be3", + "blocks": "", + "hash": "", }, "size": 41, }, @@ -989,10 +975,8 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": [ - "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", - ], - "hash": "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", + "blocks": "", + "hash": "", }, "size": 11, }, @@ -1020,7 +1004,7 @@ exports[`makeUniversalApp works for lipo binary resources 4`] = ` "Contents/Info.plist": { "Resources/app.asar": { "algorithm": "SHA256", - "hash": "16f5341e6a66b50659c9b40ca8cb3ed3f893d74813aabde99ac51af2ef9e414d", + "hash": "", }, }, } diff --git a/test/util.ts b/test/util.ts index 54abadd..55bb517 100644 --- a/test/util.ts +++ b/test/util.ts @@ -6,6 +6,7 @@ import * as path from 'path'; import plist from 'plist'; import * as fileUtils from '../dist/cjs/file-utils'; import { createPackageWithOptions, getRawHeader } from '@electron/asar'; +import { determineFileType } from '@electron/asar/lib/crawlfs'; declare const expect: typeof import('@jest/globals').expect; @@ -70,7 +71,7 @@ export const verifyApp = async (appPath: string, containsRuntimeGeneratedMacho = const asarIntegrity = integrity[i]; // note: `infoPlistsToIgnore` will not have integrity in sub-app plists integrityMap[relativePath] = asarIntegrity - ? removeUnstableProperties(asarIntegrity, ['blocks', 'hash']) + ? removeUnstableProperties(asarIntegrity, ['hash']) : undefined; } expect(integrityMap).toMatchSnapshot(); @@ -109,16 +110,23 @@ export const toSystemIndependentPath = (s: string): string => { }; export const removeUnstableProperties = (data: any, stripKeys: string[]) => { - const removeKeysRecursively: (obj: any, keys: string[]) => any = (obj, keys) => - obj !== Object(obj) - ? obj - : Array.isArray(obj) - ? obj.map((item) => removeKeysRecursively(item, keys)) - : Object.fromEntries( - Object.entries(obj) - // .map(([k, v]) => [k, removeKeysRecursively(v, keys)]) - .filter(([k]) => !keys.includes(k)), - ); + const removeKeysRecursively: (obj: any, keysToRemove: string[]) => any = (obj, keysToRemove) => { + return Object.keys(obj).reduce((acc, key) => { + // if the value of the current key is another object, + // make a recursive call to remove the + // key from the nested object + if (!keysToRemove.includes(key)) { + acc[key] = obj[key]; + } + // if the current key is not the key that is to be removed, + // add the current key and its value in the accumulator + // object + else if (typeof obj[key] === "object") { + acc[key] = removeKeysRecursively(obj[key], keysToRemove); + } + return acc; + }, {}); + } return JSON.parse( JSON.stringify(removeKeysRecursively(data, stripKeys), (name, value) => { From c5f4aa537ca540e5ceb8f57963dac452c3a7bbbd Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Thu, 10 Apr 2025 09:03:39 -0700 Subject: [PATCH 18/20] update snapshots --- test/__snapshots__/index.spec.ts.snap | 32 ++++++++++++++++++++------- test/util.ts | 28 +++++++++++++---------- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index 26f8225..5b427aa 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -627,7 +627,9 @@ exports[`makeUniversalApp no asar mode different app dirs with different macho f "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": "", + "blocks": [ + "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", + ], "hash": "", }, "size": 1063, @@ -636,7 +638,9 @@ exports[`makeUniversalApp no asar mode different app dirs with different macho f "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": "", + "blocks": [ + "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", + ], "hash": "", }, "size": 33, @@ -707,7 +711,9 @@ exports[`makeUniversalApp no asar mode different app dirs with universal macho f "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": "", + "blocks": [ + "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", + ], "hash": "", }, "size": 1063, @@ -716,7 +722,9 @@ exports[`makeUniversalApp no asar mode different app dirs with universal macho f "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": "", + "blocks": [ + "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", + ], "hash": "", }, "size": 33, @@ -936,7 +944,9 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": "", + "blocks": [ + "bb775443c1c6bbc9c06580111e671319a9f67cc8d3fec9443a3ee6450b443a66", + ], "hash": "", }, "size": 49824, @@ -946,7 +956,9 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": "", + "blocks": [ + "0f6311dac07f0876c436ce2be042eb88c96e17eaf140b39627cf720dd87ad5b8", + ], "hash": "", }, "size": 66, @@ -955,7 +967,9 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": "", + "blocks": [ + "d6226276d47adc7aa20e6c46e842e258f5157313074a035051a89612acdd6be3", + ], "hash": "", }, "size": 41, @@ -975,7 +989,9 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` "integrity": { "algorithm": "SHA256", "blockSize": 4194304, - "blocks": "", + "blocks": [ + "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", + ], "hash": "", }, "size": 11, diff --git a/test/util.ts b/test/util.ts index 55bb517..740935f 100644 --- a/test/util.ts +++ b/test/util.ts @@ -6,7 +6,6 @@ import * as path from 'path'; import plist from 'plist'; import * as fileUtils from '../dist/cjs/file-utils'; import { createPackageWithOptions, getRawHeader } from '@electron/asar'; -import { determineFileType } from '@electron/asar/lib/crawlfs'; declare const expect: typeof import('@jest/globals').expect; @@ -25,7 +24,7 @@ export const verifyApp = async (appPath: string, containsRuntimeGeneratedMacho = const resourcesDir = path.resolve(appPath, 'Contents', 'Resources'); const resourcesDirContents = await fs.readdir(resourcesDir); - const ignoreKeys = containsRuntimeGeneratedMacho ? ['hello-world'] : []; + const ignoreKeys = containsRuntimeGeneratedMacho ? ['hash'] : []; // sort for consistent result const asars = resourcesDirContents.filter((p) => p.endsWith('.asar')).sort(); @@ -71,7 +70,7 @@ export const verifyApp = async (appPath: string, containsRuntimeGeneratedMacho = const asarIntegrity = integrity[i]; // note: `infoPlistsToIgnore` will not have integrity in sub-app plists integrityMap[relativePath] = asarIntegrity - ? removeUnstableProperties(asarIntegrity, ['hash']) + ? removeUnstableProperties(asarIntegrity, ignoreKeys) : undefined; } expect(integrityMap).toMatchSnapshot(); @@ -111,25 +110,30 @@ export const toSystemIndependentPath = (s: string): string => { export const removeUnstableProperties = (data: any, stripKeys: string[]) => { const removeKeysRecursively: (obj: any, keysToRemove: string[]) => any = (obj, keysToRemove) => { + if (!obj || Array.isArray(obj)) { + return obj; + } return Object.keys(obj).reduce((acc, key) => { // if the value of the current key is another object, // make a recursive call to remove the // key from the nested object + const value = obj[key]; if (!keysToRemove.includes(key)) { - acc[key] = obj[key]; - } - // if the current key is not the key that is to be removed, - // add the current key and its value in the accumulator - // object - else if (typeof obj[key] === "object") { - acc[key] = removeKeysRecursively(obj[key], keysToRemove); + if (typeof value === 'object') { + acc[key] = removeKeysRecursively(value, keysToRemove); + } else { + acc[key] = value; + } + } else { + acc[key] = ''; } return acc; }, {}); - } + }; + const filteredData = removeKeysRecursively(data, stripKeys); return JSON.parse( - JSON.stringify(removeKeysRecursively(data, stripKeys), (name, value) => { + JSON.stringify(filteredData, (name, value) => { if (name === 'offset') { return undefined; } From 405b1c34d42ee551c2005caeba182e0ba055ecd2 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Thu, 10 Apr 2025 10:15:00 -0700 Subject: [PATCH 19/20] stripping only hello-world from snapshot and only hash from macho-specific asar integrity --- test/__snapshots__/index.spec.ts.snap | 27 ++++++++------------------- test/util.ts | 7 ++++--- 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index 5b427aa..ed7769c 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -630,7 +630,7 @@ exports[`makeUniversalApp no asar mode different app dirs with different macho f "blocks": [ "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", ], - "hash": "", + "hash": "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", }, "size": 1063, }, @@ -641,7 +641,7 @@ exports[`makeUniversalApp no asar mode different app dirs with different macho f "blocks": [ "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", ], - "hash": "", + "hash": "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", }, "size": 33, }, @@ -714,7 +714,7 @@ exports[`makeUniversalApp no asar mode different app dirs with universal macho f "blocks": [ "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", ], - "hash": "", + "hash": "f1e14240f7c833900fca84fabc2f0ff27084efdf1c5b228b015515de3f8fa28e", }, "size": 1063, }, @@ -725,7 +725,7 @@ exports[`makeUniversalApp no asar mode different app dirs with universal macho f "blocks": [ "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", ], - "hash": "", + "hash": "2873266521e41d58d02e7acfbbbdb046edfa04b6ce262b8987de8e8548671fc7", }, "size": 33, }, @@ -940,18 +940,7 @@ exports[`makeUniversalApp no asar mode should shim two different app folders 5`] exports[`makeUniversalApp works for lipo binary resources 1`] = ` { "files": { - "hello-world": { - "integrity": { - "algorithm": "SHA256", - "blockSize": 4194304, - "blocks": [ - "bb775443c1c6bbc9c06580111e671319a9f67cc8d3fec9443a3ee6450b443a66", - ], - "hash": "", - }, - "size": 49824, - "unpacked": true, - }, + "hello-world": "", "index.js": { "integrity": { "algorithm": "SHA256", @@ -959,7 +948,7 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` "blocks": [ "0f6311dac07f0876c436ce2be042eb88c96e17eaf140b39627cf720dd87ad5b8", ], - "hash": "", + "hash": "0f6311dac07f0876c436ce2be042eb88c96e17eaf140b39627cf720dd87ad5b8", }, "size": 66, }, @@ -970,7 +959,7 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` "blocks": [ "d6226276d47adc7aa20e6c46e842e258f5157313074a035051a89612acdd6be3", ], - "hash": "", + "hash": "d6226276d47adc7aa20e6c46e842e258f5157313074a035051a89612acdd6be3", }, "size": 41, }, @@ -992,7 +981,7 @@ exports[`makeUniversalApp works for lipo binary resources 1`] = ` "blocks": [ "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", ], - "hash": "", + "hash": "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", }, "size": 11, }, diff --git a/test/util.ts b/test/util.ts index 740935f..7b041c9 100644 --- a/test/util.ts +++ b/test/util.ts @@ -24,14 +24,15 @@ export const verifyApp = async (appPath: string, containsRuntimeGeneratedMacho = const resourcesDir = path.resolve(appPath, 'Contents', 'Resources'); const resourcesDirContents = await fs.readdir(resourcesDir); - const ignoreKeys = containsRuntimeGeneratedMacho ? ['hash'] : []; // sort for consistent result const asars = resourcesDirContents.filter((p) => p.endsWith('.asar')).sort(); for await (const asar of asars) { // verify header const asarFs = getRawHeader(path.resolve(resourcesDir, asar)); - expect(removeUnstableProperties(asarFs.header, ignoreKeys)).toMatchSnapshot(); + expect( + removeUnstableProperties(asarFs.header, containsRuntimeGeneratedMacho ? ['hello-world'] : []), + ).toMatchSnapshot(); } // check all app and unpacked dirs (incl. shimmed) @@ -70,7 +71,7 @@ export const verifyApp = async (appPath: string, containsRuntimeGeneratedMacho = const asarIntegrity = integrity[i]; // note: `infoPlistsToIgnore` will not have integrity in sub-app plists integrityMap[relativePath] = asarIntegrity - ? removeUnstableProperties(asarIntegrity, ignoreKeys) + ? removeUnstableProperties(asarIntegrity, containsRuntimeGeneratedMacho ? ['hash'] : []) : undefined; } expect(integrityMap).toMatchSnapshot(); From dd55d494f3e671cfb7440187d1ed592090777fa7 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Thu, 10 Apr 2025 16:50:56 -0700 Subject: [PATCH 20/20] optimize logic :) --- test/util.ts | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/test/util.ts b/test/util.ts index 7b041c9..9211683 100644 --- a/test/util.ts +++ b/test/util.ts @@ -111,20 +111,17 @@ export const toSystemIndependentPath = (s: string): string => { export const removeUnstableProperties = (data: any, stripKeys: string[]) => { const removeKeysRecursively: (obj: any, keysToRemove: string[]) => any = (obj, keysToRemove) => { - if (!obj || Array.isArray(obj)) { + if (!obj || typeof obj !== 'object') { return obj; } + // if the value is an array, map over it + if (Array.isArray(obj)) { + return obj.map((item: any) => removeKeysRecursively(item, keysToRemove)); + } return Object.keys(obj).reduce((acc, key) => { - // if the value of the current key is another object, - // make a recursive call to remove the - // key from the nested object - const value = obj[key]; + // if the value of the current key is another object, make a recursive call to remove the key from the nested object if (!keysToRemove.includes(key)) { - if (typeof value === 'object') { - acc[key] = removeKeysRecursively(value, keysToRemove); - } else { - acc[key] = value; - } + acc[key] = removeKeysRecursively(obj[key], keysToRemove); } else { acc[key] = ''; }