From 6105471fa304891dc2b09472ce6d92f39ca4c388 Mon Sep 17 00:00:00 2001 From: Michel EDIGHOFFER Date: Wed, 22 Jun 2022 16:37:11 +0200 Subject: [PATCH 01/75] fix: typo on https example (#8723) --- docs/guide/build.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guide/build.md b/docs/guide/build.md index 5069d566d889ef..abf852479b6321 100644 --- a/docs/guide/build.md +++ b/docs/guide/build.md @@ -207,7 +207,7 @@ A single static [base](#public-base-path) isn't enough in these scenarios. Vite relative: true // Static base // type: string, default: undefined - url: 'https:/cdn.domain.com/' + url: 'https://cdn.domain.com/' // Dynamic base to be used for paths inside JS // type: (url: string) => string, default: undefined runtime: (url: string) => `window.__toCdnUrl(${url})` @@ -226,12 +226,12 @@ If the hashed assets and public files aren't deployed together, options for each buildAdvancedBaseOptions: { assets: { relative: true - url: 'https:/cdn.domain.com/assets', + url: 'https://cdn.domain.com/assets', runtime: (url: string) => `window.__assetsPath(${url})` }, public: { relative: false - url: 'https:/www.domain.com/', + url: 'https://www.domain.com/', runtime: (url: string) => `window.__publicPath + ${url}` } } From 31348b5860a136d4940ab58ffd696c1238aff2ed Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Thu, 23 Jun 2022 15:03:23 +0800 Subject: [PATCH 02/75] docs: fix alpha changelog links (#8736) --- packages/vite/CHANGELOG.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/vite/CHANGELOG.md b/packages/vite/CHANGELOG.md index d4fd9da24f9f09..77f767acc1785d 100644 --- a/packages/vite/CHANGELOG.md +++ b/packages/vite/CHANGELOG.md @@ -166,81 +166,81 @@ #### [3.0.0-beta.0](https://github.com/vitejs/vite/compare/v2.9.12...v3.0.0-beta.0) (2022-06-21) -See [3.0.0-beta.0 changelog](https://github.com/vitejs/vite/blob/3.0.0-beta.0/packages/vite/CHANGELOG.md) +See [3.0.0-beta.0 changelog](https://github.com/vitejs/vite/blob/v3.0.0-beta.0/packages/vite/CHANGELOG.md) #### [3.0.0-alpha.14](https://github.com/vitejs/vite/compare/v3.0.0-alpha.13...v3.0.0-alpha.14) (2022-06-20) -See [3.0.0-alpha.14 changelog](https://github.com/vitejs/vite/blob/3.0.0-alpha.14/packages/vite/CHANGELOG.md) +See [3.0.0-alpha.14 changelog](https://github.com/vitejs/vite/blob/v3.0.0-alpha.14/packages/vite/CHANGELOG.md) #### [3.0.0-alpha.13](https://github.com/vitejs/vite/compare/v3.0.0-alpha.12...v3.0.0-alpha.13) (2022-06-19) -See [3.0.0-alpha.13 changelog](https://github.com/vitejs/vite/blob/3.0.0-alpha.13/packages/vite/CHANGELOG.md) +See [3.0.0-alpha.13 changelog](https://github.com/vitejs/vite/blob/v3.0.0-alpha.13/packages/vite/CHANGELOG.md) #### [3.0.0-alpha.12](https://github.com/vitejs/vite/compare/v3.0.0-alpha.11...v3.0.0-alpha.12) (2022-06-16) -See [3.0.0-alpha.12 changelog](https://github.com/vitejs/vite/blob/3.0.0-alpha.12/packages/vite/CHANGELOG.md) +See [3.0.0-alpha.12 changelog](https://github.com/vitejs/vite/blob/v3.0.0-alpha.12/packages/vite/CHANGELOG.md) #### [3.0.0-alpha.11](https://github.com/vitejs/vite/compare/v3.0.0-alpha.10...v3.0.0-alpha.11) (2022-06-14) -See [3.0.0-alpha.11 changelog](https://github.com/vitejs/vite/blob/3.0.0-alpha.11/packages/vite/CHANGELOG.md) +See [3.0.0-alpha.11 changelog](https://github.com/vitejs/vite/blob/v3.0.0-alpha.11/packages/vite/CHANGELOG.md) #### [3.0.0-alpha.10](https://github.com/vitejs/vite/compare/v3.0.0-alpha.9...v3.0.0-alpha.10) (2022-06-10) -See [3.0.0-alpha.10 changelog](https://github.com/vitejs/vite/blob/3.0.0-alpha.10/packages/vite/CHANGELOG.md) +See [3.0.0-alpha.10 changelog](https://github.com/vitejs/vite/blob/v3.0.0-alpha.10/packages/vite/CHANGELOG.md) #### [3.0.0-alpha.9](https://github.com/vitejs/vite/compare/v3.0.0-alpha.8...v3.0.0-alpha.9) (2022-06-01) -See [3.0.0-alpha.9 changelog](https://github.com/vitejs/vite/blob/3.0.0-alpha.9/packages/vite/CHANGELOG.md) +See [3.0.0-alpha.9 changelog](https://github.com/vitejs/vite/blob/v3.0.0-alpha.9/packages/vite/CHANGELOG.md) #### [3.0.0-alpha.8](https://github.com/vitejs/vite/compare/v3.0.0-alpha.7...v3.0.0-alpha.8) (2022-05-31) -See [3.0.0-alpha.8 changelog](https://github.com/vitejs/vite/blob/3.0.0-alpha.8/packages/vite/CHANGELOG.md) +See [3.0.0-alpha.8 changelog](https://github.com/vitejs/vite/blob/v3.0.0-alpha.8/packages/vite/CHANGELOG.md) #### [3.0.0-alpha.7](https://github.com/vitejs/vite/compare/v3.0.0-alpha.6...v3.0.0-alpha.7) (2022-05-27) -See [3.0.0-alpha.7 changelog](https://github.com/vitejs/vite/blob/3.0.0-alpha.7/packages/vite/CHANGELOG.md) +See [3.0.0-alpha.7 changelog](https://github.com/vitejs/vite/blob/v3.0.0-alpha.7/packages/vite/CHANGELOG.md) #### [3.0.0-alpha.6](https://github.com/vitejs/vite/compare/v3.0.0-alpha.5...v3.0.0-alpha.6) (2022-05-27) -See [3.0.0-alpha.6 changelog](https://github.com/vitejs/vite/blob/3.0.0-alpha.6/packages/vite/CHANGELOG.md) +See [3.0.0-alpha.6 changelog](https://github.com/vitejs/vite/blob/v3.0.0-alpha.6/packages/vite/CHANGELOG.md) #### [3.0.0-alpha.5](https://github.com/vitejs/vite/compare/v3.0.0-alpha.4...v3.0.0-alpha.5) (2022-05-26) -See [3.0.0-alpha.5 changelog](https://github.com/vitejs/vite/blob/3.0.0-alpha.5/packages/vite/CHANGELOG.md) +See [3.0.0-alpha.5 changelog](https://github.com/vitejs/vite/blob/v3.0.0-alpha.5/packages/vite/CHANGELOG.md) #### [3.0.0-alpha.4](https://github.com/vitejs/vite/compare/v3.0.0-alpha.3...v3.0.0-alpha.4) (2022-05-25) -See [3.0.0-alpha.4 changelog](https://github.com/vitejs/vite/blob/3.0.0-alpha.4/packages/vite/CHANGELOG.md) +See [3.0.0-alpha.4 changelog](https://github.com/vitejs/vite/blob/v3.0.0-alpha.4/packages/vite/CHANGELOG.md) #### [3.0.0-alpha.3](https://github.com/vitejs/vite/compare/v3.0.0-alpha.2...v3.0.0-alpha.3) (2022-05-25) -See [3.0.0-alpha.3 changelog](https://github.com/vitejs/vite/blob/3.0.0-alpha.3/packages/vite/CHANGELOG.md) +See [3.0.0-alpha.3 changelog](https://github.com/vitejs/vite/blob/v3.0.0-alpha.3/packages/vite/CHANGELOG.md) #### [3.0.0-alpha.2](https://github.com/vitejs/vite/compare/v3.0.0-alpha.1...v3.0.0-alpha.2) (2022-05-23) -See [3.0.0-alpha.2 changelog](https://github.com/vitejs/vite/blob/3.0.0-alpha.2/packages/vite/CHANGELOG.md) +See [3.0.0-alpha.2 changelog](https://github.com/vitejs/vite/blob/v3.0.0-alpha.2/packages/vite/CHANGELOG.md) #### [3.0.0-alpha.1](https://github.com/vitejs/vite/compare/v3.0.0-alpha.0...v3.0.0-alpha.1) (2022-05-18) -See [3.0.0-alpha.1 changelog](https://github.com/vitejs/vite/blob/3.0.0-alpha.1/packages/vite/CHANGELOG.md) +See [3.0.0-alpha.1 changelog](https://github.com/vitejs/vite/blob/v3.0.0-alpha.1/packages/vite/CHANGELOG.md) #### [3.0.0-alpha.0](https://github.com/vitejs/vite/compare/v2.9.12...v3.0.0-alpha.0) (2022-05-13) -See [3.0.0-alpha.0 changelog](https://github.com/vitejs/vite/blob/3.0.0-alpha.0/packages/vite/CHANGELOG.md) +See [3.0.0-alpha.0 changelog](https://github.com/vitejs/vite/blob/v3.0.0-alpha.0/packages/vite/CHANGELOG.md) From 5dc0f72525c10b528bb5fdf44add67b10c74112c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0=20/=20green?= Date: Thu, 23 Jun 2022 16:12:31 +0900 Subject: [PATCH 03/75] feat: enable tree-shaking for lib es (#8737) --- packages/vite/src/node/plugins/esbuild.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/vite/src/node/plugins/esbuild.ts b/packages/vite/src/node/plugins/esbuild.ts index 16c165bf288a98..64a243f3e2493e 100644 --- a/packages/vite/src/node/plugins/esbuild.ts +++ b/packages/vite/src/node/plugins/esbuild.ts @@ -237,12 +237,7 @@ export const buildEsbuildPlugin = (config: ResolvedConfig): Plugin => { } const target = config.build.target - const minify = - config.build.minify === 'esbuild' && - // Do not minify ES lib output since that would remove pure annotations - // and break tree-shaking - // https://github.com/vuejs/core/issues/2860#issuecomment-926882793 - !(config.build.lib && opts.format === 'es') + const minify = config.build.minify === 'esbuild' if ((!target || target === 'esnext') && !minify) { return null @@ -253,7 +248,10 @@ export const buildEsbuildPlugin = (config: ResolvedConfig): Plugin => { target: target || undefined, ...(minify ? { - minify, + // Do not minify ES lib output since that would remove pure annotations + // and break tree-shaking + // https://github.com/vuejs/core/issues/2860#issuecomment-926882793 + minify: !(config.build.lib && opts.format === 'es'), treeShaking: true, format: rollupToEsbuildFormatMap[opts.format] } From ce484d7520ed67924c599d0e2527d53e0f818620 Mon Sep 17 00:00:00 2001 From: Dustin Ryerson Date: Thu, 23 Jun 2022 12:14:42 -0600 Subject: [PATCH 04/75] docs: fix typo (#8744) --- docs/config/preview-options.md | 2 +- docs/config/server-options.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/config/preview-options.md b/docs/config/preview-options.md index 7f99c916bab1f0..10ec82f38e3848 100644 --- a/docs/config/preview-options.md +++ b/docs/config/preview-options.md @@ -42,7 +42,7 @@ export default defineConfig({ - **Type:** `boolean` - **Default:** [`server.strictPort`](./server-options#server-strictport) -Set to `true` to exit if port is already in use, instead of automatically try the next available port. +Set to `true` to exit if port is already in use, instead of automatically trying the next available port. ## preview.https diff --git a/docs/config/server-options.md b/docs/config/server-options.md index b77c69be7d2ee0..6a5ae5ebab3aa4 100644 --- a/docs/config/server-options.md +++ b/docs/config/server-options.md @@ -45,7 +45,7 @@ Specify server port. Note if the port is already being used, Vite will automatic - **Type:** `boolean` -Set to `true` to exit if port is already in use, instead of automatically try the next available port. +Set to `true` to exit if port is already in use, instead of automatically trying the next available port. ## server.https From 2ae269e17588bfe1519600ca354ab4da0ed6ea18 Mon Sep 17 00:00:00 2001 From: CHOYSEN Date: Fri, 24 Jun 2022 03:22:33 +0800 Subject: [PATCH 05/75] refactor: remove unnecessary condition (#8742) --- packages/vite/src/node/server/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/server/index.ts b/packages/vite/src/node/server/index.ts index 9227746eb23c4c..1ca05bd28651b2 100644 --- a/packages/vite/src/node/server/index.ts +++ b/packages/vite/src/node/server/index.ts @@ -718,7 +718,7 @@ async function restartServer(server: ViteDevServer) { // prevent new server `restart` function from calling // @ts-ignore newServer[key] = server[key] - } else if (key !== 'app') { + } else { // @ts-ignore server[key] = newServer[key] } From 19fc7e5fc480b061c154b06a5a83a552b3fbd883 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0=20/=20green?= Date: Fri, 24 Jun 2022 04:26:31 +0900 Subject: [PATCH 06/75] perf(lib): improve helper inject regex (#8741) --- packages/vite/src/node/plugins/esbuild.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vite/src/node/plugins/esbuild.ts b/packages/vite/src/node/plugins/esbuild.ts index 64a243f3e2493e..10484369f0d710 100644 --- a/packages/vite/src/node/plugins/esbuild.ts +++ b/packages/vite/src/node/plugins/esbuild.ts @@ -27,9 +27,9 @@ import { searchForWorkspaceRoot } from '..' const debug = createDebugger('vite:esbuild') const INJECT_HELPERS_IIFE_RE = - /(.*)((?:const|var) [^\s]+=function\([^)]*?\){"use strict";)(.*)/s + /^(.*)((?:const|var) [^\s]+=function\([^)]*?\){"use strict";)/s const INJECT_HELPERS_UMD_RE = - /(.*)(\(function\([^)]*?\){.+amd.+function\([^)]*?\){"use strict";)(.*)/s + /^(.*)(\(function\([^)]*?\){.+amd.+function\([^)]*?\){"use strict";)/s let server: ViteDevServer @@ -273,7 +273,7 @@ export const buildEsbuildPlugin = (config: ResolvedConfig): Plugin => { if (injectHelpers) { res.code = res.code.replace( injectHelpers, - (_, helpers, header, rest) => header + helpers + rest + (_, helpers, header) => header + helpers ) } } From 9208c3b31dbd42540e0df953732b0352f06e8791 Mon Sep 17 00:00:00 2001 From: patak Date: Fri, 24 Jun 2022 07:37:34 +0200 Subject: [PATCH 07/75] fix: optimizeDeps.entries transformRequest url (fix #8719) (#8748) --- packages/vite/src/node/optimizer/optimizer.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/node/optimizer/optimizer.ts b/packages/vite/src/node/optimizer/optimizer.ts index 5592c438ece552..9a331e9db90ab4 100644 --- a/packages/vite/src/node/optimizer/optimizer.ts +++ b/packages/vite/src/node/optimizer/optimizer.ts @@ -1,6 +1,8 @@ +import path from 'node:path' import colors from 'picocolors' import _debug from 'debug' import glob from 'fast-glob' +import { FS_PREFIX } from '../constants' import { getHash } from '../utils' import { transformRequest } from '../server/transformRequest' import type { ResolvedConfig, ViteDevServer } from '..' @@ -585,17 +587,21 @@ export async function preTransformOptimizeDepsEntries( server: ViteDevServer ): Promise { const { config } = server + const { root } = config const { entries } = config.optimizeDeps if (entries) { const explicitEntries = await glob(entries, { - cwd: config.root, + cwd: root, ignore: ['**/node_modules/**', `**/${config.build.outDir}/**`], absolute: true }) // TODO: should we restrict the entries to JS and HTML like the // scanner did? I think we can let the user chose any entry for (const entry of explicitEntries) { - transformRequest(entry, server, { ssr: false }).catch((e) => { + const url = entry.startsWith(root + '/') + ? entry.slice(root.length) + : path.posix.join(FS_PREFIX + entry) + transformRequest(url, server, { ssr: false }).catch((e) => { config.logger.error(e.message) }) } From d9123995d440599e9ef2bb85b8f5d0fbe3dc7b1d Mon Sep 17 00:00:00 2001 From: Cesar Gomez <65884507+mrcego@users.noreply.github.com> Date: Fri, 24 Jun 2022 02:02:59 -0500 Subject: [PATCH 08/75] docs: link to es translation (#8751) --- docs/.vitepress/config.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 7baf0d9e6714bc..3f7762f2cdd2c4 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -57,7 +57,8 @@ export default defineConfig({ text: 'English', items: [ { text: '简体中文', link: 'https://cn.vitejs.dev' }, - { text: '日本語', link: 'https://ja.vitejs.dev' } + { text: '日本語', link: 'https://ja.vitejs.dev' }, + { text: 'Español', link: 'https://es.vitejs.dev' } ] }, From 87e51f7abe8a033acef52d896abb3c7b0c530976 Mon Sep 17 00:00:00 2001 From: Kenichi Kamiya Date: Fri, 24 Jun 2022 16:03:21 +0900 Subject: [PATCH 09/75] fix: avoid type mismatch with Rollup (fix #7843) (#8701) --- packages/vite/src/node/plugin.ts | 13 +++++++------ packages/vite/src/node/server/pluginContainer.ts | 4 +++- packages/vite/tsconfig.check.json | 4 +++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/vite/src/node/plugin.ts b/packages/vite/src/node/plugin.ts index 40845bf1f2dcfc..69b19415b0daa7 100644 --- a/packages/vite/src/node/plugin.ts +++ b/packages/vite/src/node/plugin.ts @@ -128,7 +128,7 @@ export interface Plugin extends RollupPlugin { /** * extend hooks with ssr flag */ - resolveId?( + resolveId?: ( this: PluginContext, source: string, importer: string | undefined, @@ -139,17 +139,18 @@ export interface Plugin extends RollupPlugin { * @internal */ scan?: boolean + isEntry: boolean } - ): Promise | ResolveIdResult - load?( + ) => Promise | ResolveIdResult + load?: ( this: PluginContext, id: string, options?: { ssr?: boolean } - ): Promise | LoadResult - transform?( + ) => Promise | LoadResult + transform?: ( this: TransformPluginContext, code: string, id: string, options?: { ssr?: boolean } - ): Promise | TransformResult + ) => Promise | TransformResult } diff --git a/packages/vite/src/node/server/pluginContainer.ts b/packages/vite/src/node/server/pluginContainer.ts index 86dcefe024542f..0a708ed62c4e6c 100644 --- a/packages/vite/src/node/server/pluginContainer.ts +++ b/packages/vite/src/node/server/pluginContainer.ts @@ -97,6 +97,7 @@ export interface PluginContainer { * @internal */ scan?: boolean + isEntry?: boolean } ): Promise transform( @@ -527,6 +528,7 @@ export async function createPluginContainer( const skip = options?.skip const ssr = options?.ssr const scan = !!options?.scan + const isEntry = !!options?.isEntry const ctx = new Context() ctx.ssr = !!ssr ctx._scan = scan @@ -546,7 +548,7 @@ export async function createPluginContainer( ctx as any, rawId, importer, - { ssr, scan } + { ssr, scan, isEntry } ) if (!result) continue diff --git a/packages/vite/tsconfig.check.json b/packages/vite/tsconfig.check.json index cd8f8d6eeb3f2c..d1e9f059c9409c 100644 --- a/packages/vite/tsconfig.check.json +++ b/packages/vite/tsconfig.check.json @@ -14,7 +14,9 @@ // indirect: postcss depends on it "source-map-js": ["./node_modules/source-map-js/source-map.d.ts"] }, - "typeRoots": [] + "typeRoots": [], + "strict": true, + "exactOptionalPropertyTypes": true }, "include": ["dist/**/*.d.ts"] } From 206e22ac3979a321e330fc9d6067da59097e25f7 Mon Sep 17 00:00:00 2001 From: ZYSzys Date: Fri, 24 Jun 2022 15:03:58 +0800 Subject: [PATCH 10/75] fix(plugin-react): return code if should skip in transform (fix #7586) (#8676) --- packages/plugin-react/src/index.ts | 5 ++- playground/react-classic/App.jsx | 30 +++++++++++++++ .../react-classic/__tests__/react.spec.ts | 38 +++++++++++++++++++ playground/react-classic/index.html | 10 +++++ playground/react-classic/package.json | 23 +++++++++++ playground/react-classic/vite.config.ts | 16 ++++++++ pnpm-lock.yaml | 11 ++++++ 7 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 playground/react-classic/App.jsx create mode 100644 playground/react-classic/__tests__/react.spec.ts create mode 100644 playground/react-classic/index.html create mode 100644 playground/react-classic/package.json create mode 100644 playground/react-classic/vite.config.ts diff --git a/packages/plugin-react/src/index.ts b/packages/plugin-react/src/index.ts index 3e7ef4e9c4e384..9aa3f94dc5b2f7 100644 --- a/packages/plugin-react/src/index.ts +++ b/packages/plugin-react/src/index.ts @@ -276,7 +276,10 @@ export default function viteReact(opts: Options = {}): PluginOption[] { !(isProjectFile && babelOptions.babelrc) if (shouldSkip) { - return // Avoid parsing if no plugins exist. + // Avoid parsing if no plugins exist. + return { + code + } } const parserPlugins: typeof babelOptions.parserOpts.plugins = [ diff --git a/playground/react-classic/App.jsx b/playground/react-classic/App.jsx new file mode 100644 index 00000000000000..1de7461b163776 --- /dev/null +++ b/playground/react-classic/App.jsx @@ -0,0 +1,30 @@ +import { useState } from 'react' + +function App() { + const [count, setCount] = useState(0) + return ( +
+
+

Hello Vite + React

+

+ +

+

+ Edit App.jsx and save to test HMR updates. +

+ + Learn React + +
+
+ ) +} + +export default App diff --git a/playground/react-classic/__tests__/react.spec.ts b/playground/react-classic/__tests__/react.spec.ts new file mode 100644 index 00000000000000..8381992d59df3d --- /dev/null +++ b/playground/react-classic/__tests__/react.spec.ts @@ -0,0 +1,38 @@ +import { editFile, isServe, page, untilUpdated } from '~utils' + +test('should render', async () => { + expect(await page.textContent('h1')).toMatch('Hello Vite + React') +}) + +test('should update', async () => { + expect(await page.textContent('button')).toMatch('count is: 0') + await page.click('button') + expect(await page.textContent('button')).toMatch('count is: 1') +}) + +test('should hmr', async () => { + editFile('App.jsx', (code) => code.replace('Vite + React', 'Updated')) + await untilUpdated(() => page.textContent('h1'), 'Hello Updated') + // preserve state + expect(await page.textContent('button')).toMatch('count is: 1') +}) + +test.runIf(isServe)( + 'should have annotated jsx with file location metadata', + async () => { + const meta = await page.evaluate(() => { + const button = document.querySelector('button') + const key = Object.keys(button).find( + (key) => key.indexOf('__reactFiber') === 0 + ) + return button[key]._debugSource + }) + // If the evaluate call doesn't crash, and the returned metadata has + // the expected fields, we're good. + expect(Object.keys(meta).sort()).toEqual([ + 'columnNumber', + 'fileName', + 'lineNumber' + ]) + } +) diff --git a/playground/react-classic/index.html b/playground/react-classic/index.html new file mode 100644 index 00000000000000..f0015ceb9829a3 --- /dev/null +++ b/playground/react-classic/index.html @@ -0,0 +1,10 @@ +
+ diff --git a/playground/react-classic/package.json b/playground/react-classic/package.json new file mode 100644 index 00000000000000..a07684af1feefd --- /dev/null +++ b/playground/react-classic/package.json @@ -0,0 +1,23 @@ +{ + "name": "test-react-classic", + "private": true, + "version": "0.0.0", + "scripts": { + "dev": "vite", + "build": "vite build", + "debug": "node --inspect-brk ../../packages/vite/bin/vite", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.1.0", + "react-dom": "^18.1.0" + }, + "devDependencies": { + "@vitejs/plugin-react": "workspace:*" + }, + "babel": { + "presets": [ + "@babel/preset-env" + ] + } +} diff --git a/playground/react-classic/vite.config.ts b/playground/react-classic/vite.config.ts new file mode 100644 index 00000000000000..a2044e99ae2f3c --- /dev/null +++ b/playground/react-classic/vite.config.ts @@ -0,0 +1,16 @@ +import react from '@vitejs/plugin-react' +import type { UserConfig } from 'vite' + +const config: UserConfig = { + plugins: [ + react({ + jsxRuntime: 'classic' + }) + ], + build: { + // to make tests faster + minify: false + } +} + +export default config diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 55ad67574c0778..6a036ebe08ce13 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -759,6 +759,17 @@ importers: devDependencies: '@vitejs/plugin-react': link:../../packages/plugin-react + playground/react-classic: + specifiers: + '@vitejs/plugin-react': workspace:* + react: ^18.1.0 + react-dom: ^18.1.0 + dependencies: + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + devDependencies: + '@vitejs/plugin-react': link:../../packages/plugin-react + playground/react-emotion: specifiers: '@babel/plugin-proposal-pipeline-operator': ^7.18.2 From cd59ee430051ee313559d3fd45418c659b9146d1 Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Fri, 24 Jun 2022 15:31:04 +0800 Subject: [PATCH 11/75] chore: prevent unnecessary netlify builds (#8755) --- netlify.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/netlify.toml b/netlify.toml index 5ff3c0d6323342..f618d808000f61 100644 --- a/netlify.toml +++ b/netlify.toml @@ -3,4 +3,5 @@ NPM_FLAGS = "--version" # prevent Netlify npm install [build] publish = "docs/.vitepress/dist" - command = "npx pnpm i --store=node_modules/.pnpm-store --frozen-lockfile && npm run ci-docs" \ No newline at end of file + command = "npx pnpm i --store=node_modules/.pnpm-store --frozen-lockfile && npm run ci-docs" + ignore = "git diff --quiet $CACHED_COMMIT_REF $COMMIT_REF docs package.json pnpm-lock.yaml netlify.toml" \ No newline at end of file From 32712668f6586734afa592384e325e9a8b528fe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0=20/=20green?= Date: Fri, 24 Jun 2022 22:27:14 +0900 Subject: [PATCH 12/75] fix(hmr): __HMR_PORT__ should not be `'undefined'` (#8761) --- packages/vite/src/client/client.ts | 2 +- packages/vite/src/node/plugins/clientInjections.ts | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/vite/src/client/client.ts b/packages/vite/src/client/client.ts index ceccdf345fbce4..509b5048da6d47 100644 --- a/packages/vite/src/client/client.ts +++ b/packages/vite/src/client/client.ts @@ -9,7 +9,7 @@ import '@vite/env' declare const __BASE__: string declare const __HMR_PROTOCOL__: string | null declare const __HMR_HOSTNAME__: string | null -declare const __HMR_PORT__: string | null +declare const __HMR_PORT__: number | null declare const __HMR_DIRECT_TARGET__: string declare const __HMR_BASE__: string declare const __HMR_TIMEOUT__: number diff --git a/packages/vite/src/node/plugins/clientInjections.ts b/packages/vite/src/node/plugins/clientInjections.ts index d63c72d6143216..4eb1654d09d7a8 100644 --- a/packages/vite/src/node/plugins/clientInjections.ts +++ b/packages/vite/src/node/plugins/clientInjections.ts @@ -26,11 +26,9 @@ export function clientInjectionsPlugin(config: ResolvedConfig): Plugin { // hmr.clientPort -> hmr.port // -> (24678 if middleware mode) -> new URL(import.meta.url).port - let port = hmrConfig - ? String(hmrConfig.clientPort || hmrConfig.port) - : null + let port = hmrConfig?.clientPort || hmrConfig?.port || null if (config.server.middlewareMode) { - port ||= '24678' + port ||= 24678 } const devBase = config.base From c2b09db1bf78c09df20d209a28568b0851ce5c31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90?= Date: Fri, 24 Jun 2022 21:41:09 +0800 Subject: [PATCH 13/75] feat: supports cts and mts config (#8729) --- packages/vite/src/node/config.ts | 80 ++++++++----------- packages/vite/src/node/constants.ts | 9 +++ packages/vite/src/node/utils.ts | 2 + .../__tests__/resolve-config.spec.ts | 16 ++++ playground/resolve-config/__tests__/serve.ts | 12 ++- .../root/{vite.config.js => vite.config.ts} | 3 +- 6 files changed, 70 insertions(+), 52 deletions(-) rename playground/resolve-config/root/{vite.config.js => vite.config.ts} (69%) diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 06b222736667c8..acda2d3f7d0ff5 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -29,6 +29,7 @@ import { dynamicImport, isExternalUrl, isObject, + isTS, lookupFile, mergeAlias, mergeConfig, @@ -37,7 +38,12 @@ import { } from './utils' import { resolvePlugins } from './plugins' import type { ESBuildOptions } from './plugins/esbuild' -import { CLIENT_ENTRY, DEFAULT_ASSETS_RE, ENV_ENTRY } from './constants' +import { + CLIENT_ENTRY, + DEFAULT_ASSETS_RE, + DEFAULT_CONFIG_FILES, + ENV_ENTRY +} from './constants' import type { InternalResolveOptions, ResolveOptions } from './plugins/resolve' import { resolvePlugin } from './plugins/resolve' import type { LogLevel, Logger } from './logger' @@ -825,56 +831,20 @@ export async function loadConfigFromFile( const getTime = () => `${(performance.now() - start).toFixed(2)}ms` let resolvedPath: string | undefined - let isTS = false - let isESM = false let dependencies: string[] = [] - // check package.json for type: "module" and set `isMjs` to true - try { - const pkg = lookupFile(configRoot, ['package.json']) - if (pkg && JSON.parse(pkg).type === 'module') { - isESM = true - } - } catch (e) {} - if (configFile) { // explicit config path is always resolved from cwd resolvedPath = path.resolve(configFile) - isTS = configFile.endsWith('.ts') - - if (configFile.endsWith('.mjs')) { - isESM = true - } } else { // implicit config file loaded from inline root (if present) // otherwise from cwd - const jsconfigFile = path.resolve(configRoot, 'vite.config.js') - if (fs.existsSync(jsconfigFile)) { - resolvedPath = jsconfigFile - } - - if (!resolvedPath) { - const mjsconfigFile = path.resolve(configRoot, 'vite.config.mjs') - if (fs.existsSync(mjsconfigFile)) { - resolvedPath = mjsconfigFile - isESM = true - } - } + for (const filename of DEFAULT_CONFIG_FILES) { + const filePath = path.resolve(configRoot, filename) + if (!fs.existsSync(filePath)) continue - if (!resolvedPath) { - const tsconfigFile = path.resolve(configRoot, 'vite.config.ts') - if (fs.existsSync(tsconfigFile)) { - resolvedPath = tsconfigFile - isTS = true - } - } - - if (!resolvedPath) { - const cjsConfigFile = path.resolve(configRoot, 'vite.config.cjs') - if (fs.existsSync(cjsConfigFile)) { - resolvedPath = cjsConfigFile - isESM = false - } + resolvedPath = filePath + break } } @@ -883,6 +853,19 @@ export async function loadConfigFromFile( return null } + let isESM = false + if (/\.m[jt]s$/.test(resolvedPath)) { + isESM = true + } else if (/\.c[jt]s$/.test(resolvedPath)) { + isESM = false + } else { + // check package.json for type: "module" and set `isESM` to true + try { + const pkg = lookupFile(configRoot, ['package.json']) + isESM = !!pkg && JSON.parse(pkg).type === 'module' + } catch (e) {} + } + try { let userConfig: UserConfigExport | undefined @@ -890,15 +873,16 @@ export async function loadConfigFromFile( const fileUrl = pathToFileURL(resolvedPath) const bundled = await bundleConfigFile(resolvedPath, true) dependencies = bundled.dependencies - if (isTS) { + + if (isTS(resolvedPath)) { // before we can register loaders without requiring users to run node // with --experimental-loader themselves, we have to do a hack here: // bundle the config file w/ ts transforms first, write it to disk, // load it with native Node ESM, then delete the file. - fs.writeFileSync(resolvedPath + '.js', bundled.code) - userConfig = (await dynamicImport(`${fileUrl}.js?t=${Date.now()}`)) + fs.writeFileSync(resolvedPath + '.mjs', bundled.code) + userConfig = (await dynamicImport(`${fileUrl}.mjs?t=${Date.now()}`)) .default - fs.unlinkSync(resolvedPath + '.js') + fs.unlinkSync(resolvedPath + '.mjs') debug(`TS + native esm config loaded in ${getTime()}`, fileUrl) } else { // using Function to avoid this from being compiled away by TS/Rollup @@ -972,7 +956,7 @@ async function bundleConfigFile( { name: 'inject-file-scope-variables', setup(build) { - build.onLoad({ filter: /\.[jt]s$/ }, async (args) => { + build.onLoad({ filter: /\.[cm]?[jt]s$/ }, async (args) => { const contents = await fs.promises.readFile(args.path, 'utf8') const injectValues = `const __dirname = ${JSON.stringify(path.dirname(args.path))};` + @@ -982,7 +966,7 @@ async function bundleConfigFile( )};` return { - loader: args.path.endsWith('.ts') ? 'ts' : 'js', + loader: isTS(args.path) ? 'ts' : 'js', contents: injectValues + contents } }) diff --git a/packages/vite/src/node/constants.ts b/packages/vite/src/node/constants.ts index d45bfa088f80f1..d85130aba14499 100644 --- a/packages/vite/src/node/constants.ts +++ b/packages/vite/src/node/constants.ts @@ -20,6 +20,15 @@ export const DEFAULT_EXTENSIONS = [ '.json' ] +export const DEFAULT_CONFIG_FILES = [ + 'vite.config.js', + 'vite.config.mjs', + 'vite.config.ts', + 'vite.config.cjs', + 'vite.config.mts', + 'vite.config.cts' +] + export const JS_TYPES_RE = /\.(?:j|t)sx?$|\.mjs$/ export const OPTIMIZABLE_ENTRY_RE = /\.(?:m?js|ts)$/ diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index 5967aadfc29f58..c554fa0396f87b 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -1056,3 +1056,5 @@ export function stripBomTag(content: string): string { return content } + +export const isTS = (filename: string): boolean => /\.[cm]?ts$/.test(filename) diff --git a/playground/resolve-config/__tests__/resolve-config.spec.ts b/playground/resolve-config/__tests__/resolve-config.spec.ts index 324d797ea31ad8..6682deb9805a34 100644 --- a/playground/resolve-config/__tests__/resolve-config.spec.ts +++ b/playground/resolve-config/__tests__/resolve-config.spec.ts @@ -49,4 +49,20 @@ describe.runIf(isBuild)('build', () => { build('ts-module') expect(getDistFile('ts-module', 'js')).toContain('console.log(true)') }) + it('loads vite.config.mts', () => { + build('mts') + expect(getDistFile('mts', 'mjs')).toContain('console.log(true)') + }) + it('loads vite.config.mts with package#type module', () => { + build('mts-module') + expect(getDistFile('mts-module', 'js')).toContain('console.log(true)') + }) + it('loads vite.config.cts', () => { + build('cts') + expect(getDistFile('cts', 'mjs')).toContain('console.log(true)') + }) + it('loads vite.config.cts with package#type module', () => { + build('cts-module') + expect(getDistFile('cts-module', 'js')).toContain('console.log(true)') + }) }) diff --git a/playground/resolve-config/__tests__/serve.ts b/playground/resolve-config/__tests__/serve.ts index d61ee70b7df50a..b2cc1ccc1e1e77 100644 --- a/playground/resolve-config/__tests__/serve.ts +++ b/playground/resolve-config/__tests__/serve.ts @@ -5,7 +5,7 @@ import path from 'node:path' import fs from 'fs-extra' import { isBuild, rootDir } from '~utils' -const configNames = ['js', 'cjs', 'mjs', 'ts'] +const configNames = ['js', 'cjs', 'mjs', 'ts', 'mts', 'cts'] export async function serve() { if (!isBuild) return @@ -18,9 +18,9 @@ export async function serve() { const pathToConf = fromTestDir(configName, `vite.config.${configName}`) await fs.copy(fromTestDir('root'), fromTestDir(configName)) - await fs.rename(fromTestDir(configName, 'vite.config.js'), pathToConf) + await fs.rename(fromTestDir(configName, 'vite.config.ts'), pathToConf) - if (configName === 'cjs') { + if (['cjs', 'cts'].includes(configName)) { const conf = await fs.readFile(pathToConf, 'utf8') await fs.writeFile( pathToConf, @@ -28,6 +28,12 @@ export async function serve() { ) } + // Remove TS annotation for plain JavaScript file. + if (configName.endsWith('js')) { + const conf = await fs.readFile(pathToConf, 'utf8') + await fs.writeFile(pathToConf, conf.replace(': boolean', '')) + } + // copy directory and add package.json with "type": "module" await fs.copy(fromTestDir(configName), fromTestDir(`${configName}-module`)) await fs.writeJSON(fromTestDir(`${configName}-module`, 'package.json'), { diff --git a/playground/resolve-config/root/vite.config.js b/playground/resolve-config/root/vite.config.ts similarity index 69% rename from playground/resolve-config/root/vite.config.js rename to playground/resolve-config/root/vite.config.ts index ed72046f940d59..a6ad03b2122361 100644 --- a/playground/resolve-config/root/vite.config.js +++ b/playground/resolve-config/root/vite.config.ts @@ -1,5 +1,6 @@ +const __CONFIG_LOADED__: boolean = true export default { - define: { __CONFIG_LOADED__: true }, + define: { __CONFIG_LOADED__ }, logLevel: 'silent', build: { minify: false, From eac0494c494dbfb2e3457c51ea780d97ca4d18fa Mon Sep 17 00:00:00 2001 From: patak-dev Date: Fri, 24 Jun 2022 16:16:01 +0200 Subject: [PATCH 14/75] release: v3.0.0-beta.2 --- packages/vite/CHANGELOG.md | 14 ++++++++++++++ packages/vite/package.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/vite/CHANGELOG.md b/packages/vite/CHANGELOG.md index 77f767acc1785d..4a0b6c8fc6f623 100644 --- a/packages/vite/CHANGELOG.md +++ b/packages/vite/CHANGELOG.md @@ -1,3 +1,17 @@ +## 3.0.0-beta.2 (2022-06-24) + +* feat: enable tree-shaking for lib es (#8737) ([5dc0f72](https://github.com/vitejs/vite/commit/5dc0f72)), closes [#8737](https://github.com/vitejs/vite/issues/8737) +* feat: supports cts and mts config (#8729) ([c2b09db](https://github.com/vitejs/vite/commit/c2b09db)), closes [#8729](https://github.com/vitejs/vite/issues/8729) +* fix: avoid type mismatch with Rollup (fix #7843) (#8701) ([87e51f7](https://github.com/vitejs/vite/commit/87e51f7)), closes [#7843](https://github.com/vitejs/vite/issues/7843) [#8701](https://github.com/vitejs/vite/issues/8701) +* fix: optimizeDeps.entries transformRequest url (fix #8719) (#8748) ([9208c3b](https://github.com/vitejs/vite/commit/9208c3b)), closes [#8719](https://github.com/vitejs/vite/issues/8719) [#8748](https://github.com/vitejs/vite/issues/8748) +* fix(hmr): __HMR_PORT__ should not be `'undefined'` (#8761) ([3271266](https://github.com/vitejs/vite/commit/3271266)), closes [#8761](https://github.com/vitejs/vite/issues/8761) +* perf(lib): improve helper inject regex (#8741) ([19fc7e5](https://github.com/vitejs/vite/commit/19fc7e5)), closes [#8741](https://github.com/vitejs/vite/issues/8741) +* refactor: remove unnecessary condition (#8742) ([2ae269e](https://github.com/vitejs/vite/commit/2ae269e)), closes [#8742](https://github.com/vitejs/vite/issues/8742) +* docs: fix alpha changelog links (#8736) ([31348b5](https://github.com/vitejs/vite/commit/31348b5)), closes [#8736](https://github.com/vitejs/vite/issues/8736) +* chore: v3 beta release notes (#8718) ([7e899d0](https://github.com/vitejs/vite/commit/7e899d0)), closes [#8718](https://github.com/vitejs/vite/issues/8718) + + + ## 3.0.0-beta.1 (2022-06-22) ### Main Changes diff --git a/packages/vite/package.json b/packages/vite/package.json index 378441a86d7d26..1436e3f275c1e5 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -1,6 +1,6 @@ { "name": "vite", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "type": "module", "license": "MIT", "author": "Evan You", From d4dcdd1ffaea79ecf8a9fc78cdbe311f0d801fb5 Mon Sep 17 00:00:00 2001 From: Haoqun Jiang Date: Fri, 24 Jun 2022 23:06:13 +0800 Subject: [PATCH 15/75] chore!: update rollup commonjs plugin to v22 (#8743) Co-authored-by: sapphi-red --- package.json | 1 + packages/vite/package.json | 2 +- packages/vite/rollup.config.ts | 28 ++++++++++++++----- packages/vite/src/node/config.ts | 7 +++++ playground/external/vite.config.js | 3 ++ .../__tests__/optimize-deps.spec.ts | 15 ++++++---- playground/optimize-deps/vite.config.js | 2 +- pnpm-lock.yaml | 22 +++++++++++++-- 8 files changed, 63 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 1e7ce0fe72ec31..f877a59b859956 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "test": "run-s test-unit test-serve test-build", "test-serve": "vitest run -c vitest.config.e2e.ts", "test-build": "cross-env VITE_TEST_BUILD=1 vitest run -c vitest.config.e2e.ts", + "test-build-legacy-cjs": "cross-env VITE_TEST_LEGACY_CJS_PLUGIN=1 pnpm test-build", "test-unit": "vitest run", "test-docs": "pnpm run docs-build", "debug-serve": "cross-env VITE_DEBUG_SERVE=1 vitest run -c vitest.config.e2e.ts", diff --git a/packages/vite/package.json b/packages/vite/package.json index 1436e3f275c1e5..afc3a952358902 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -71,7 +71,7 @@ "@babel/types": "^7.18.4", "@jridgewell/trace-mapping": "^0.3.13", "@rollup/plugin-alias": "^3.1.9", - "@rollup/plugin-commonjs": "^21.1.0", + "@rollup/plugin-commonjs": "^22.0.1", "@rollup/plugin-dynamic-import-vars": "^1.4.3", "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "13.3.0", diff --git a/packages/vite/rollup.config.ts b/packages/vite/rollup.config.ts index fc51e94c299e3c..102a1df2ec4207 100644 --- a/packages/vite/rollup.config.ts +++ b/packages/vite/rollup.config.ts @@ -1,6 +1,7 @@ /* eslint-disable no-restricted-globals */ import fs from 'node:fs' import path from 'node:path' +import url from 'node:url' import nodeResolve from '@rollup/plugin-node-resolve' import typescript from '@rollup/plugin-typescript' import commonjs from '@rollup/plugin-commonjs' @@ -134,15 +135,13 @@ function createNodePlugins( }, // postcss-load-config calls require after register ts-node 'postcss-load-config/src/index.js': { - src: `require(configFile)`, - replacement: `__require(configFile)` - }, - // @rollup/plugin-commonjs uses incorrect esm - '@rollup/plugin-commonjs/dist/index.es.js': { - src: `import { sync } from 'resolve';`, - replacement: `import __resolve from 'resolve';const sync = __resolve.sync;` + pattern: /require(?=\((configFile|'ts-node')\))/g, + replacement: `eval('require')` } }), + + buildTimeImportMetaUrl(), + commonjs({ extensions: ['.js'], // Optional peer deps of ws. Native deps that are mostly for performance. @@ -287,6 +286,21 @@ function shimDepsPlugin(deps: Record): Plugin { } } +// The use of `import.meta.url` in source code is not reliable after bundling. +// For example, it is affected by the `isEntry` bug brought in by the Rollup CJS plugin +// https://github.com/rollup/plugins/pull/1180 +// The better way is to resolve it at build time. +function buildTimeImportMetaUrl(): Plugin { + return { + name: 'buildTimeImportMetaUrl', + resolveImportMeta: (property, chunk) => { + if (property === 'url') { + return `'${url.pathToFileURL(chunk.moduleId).href}'` + } + } + } +} + function licensePlugin() { return license({ thirdParty(dependencies) { diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index acda2d3f7d0ff5..fbc5754af892cd 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -594,6 +594,13 @@ export async function resolveConfig( config = mergeConfig(config, externalConfigCompat(config, configEnv)) const optimizeDeps = config.optimizeDeps || {} + if (process.env.VITE_TEST_LEGACY_CJS_PLUGIN) { + config.legacy = { + ...config.legacy, + buildRollupPluginCommonjs: true + } + } + const BASE_URL = resolvedBase const resolved: ResolvedConfig = { diff --git a/playground/external/vite.config.js b/playground/external/vite.config.js index f6126b069cf49d..fde8e763f810e0 100644 --- a/playground/external/vite.config.js +++ b/playground/external/vite.config.js @@ -5,6 +5,9 @@ export default defineConfig({ minify: false, rollupOptions: { external: ['vue'] + }, + commonjsOptions: { + esmExternals: ['vue'] } } }) diff --git a/playground/optimize-deps/__tests__/optimize-deps.spec.ts b/playground/optimize-deps/__tests__/optimize-deps.spec.ts index df1713b3fc76f8..b0af6debca526e 100644 --- a/playground/optimize-deps/__tests__/optimize-deps.spec.ts +++ b/playground/optimize-deps/__tests__/optimize-deps.spec.ts @@ -103,11 +103,16 @@ test('vue + vuex', async () => { expect(await page.textContent('.vue')).toMatch(`[success]`) }) -test('esbuild-plugin', async () => { - expect(await page.textContent('.esbuild-plugin')).toMatch( - `Hello from an esbuild plugin` - ) -}) +// When we use the Rollup CommonJS plugin instead of esbuild prebundling, +// the esbuild plugins won't apply to dependencies +test.skipIf(isBuild && process.env.VITE_TEST_LEGACY_CJS_PLUGIN)( + 'esbuild-plugin', + async () => { + expect(await page.textContent('.esbuild-plugin')).toMatch( + `Hello from an esbuild plugin` + ) + } +) test('import from hidden dir', async () => { expect(await page.textContent('.hidden-dir')).toBe('hello!') diff --git a/playground/optimize-deps/vite.config.js b/playground/optimize-deps/vite.config.js index e268510d5c8d76..133d0da1e32b74 100644 --- a/playground/optimize-deps/vite.config.js +++ b/playground/optimize-deps/vite.config.js @@ -72,7 +72,7 @@ module.exports = { apply: 'build', enforce: 'pre', load(id) { - if (id === '__vite-browser-external:fs') { + if (id === '__vite-browser-external') { return `export default {}; export function readFileSync() {}` } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a036ebe08ce13..c9b8b2cb090716 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -216,7 +216,7 @@ importers: '@babel/types': ^7.18.4 '@jridgewell/trace-mapping': ^0.3.13 '@rollup/plugin-alias': ^3.1.9 - '@rollup/plugin-commonjs': ^21.1.0 + '@rollup/plugin-commonjs': ^22.0.1 '@rollup/plugin-dynamic-import-vars': ^1.4.3 '@rollup/plugin-json': ^4.1.0 '@rollup/plugin-node-resolve': 13.3.0 @@ -284,7 +284,7 @@ importers: '@babel/types': 7.18.4 '@jridgewell/trace-mapping': 0.3.13 '@rollup/plugin-alias': 3.1.9_rollup@2.75.6 - '@rollup/plugin-commonjs': 21.1.0_rollup@2.75.6 + '@rollup/plugin-commonjs': 22.0.1_rollup@2.75.6 '@rollup/plugin-dynamic-import-vars': 1.4.3_rollup@2.75.6 '@rollup/plugin-json': 4.1.0_rollup@2.75.6 '@rollup/plugin-node-resolve': 13.3.0_rollup@2.75.6 @@ -2021,6 +2021,22 @@ packages: rollup: 2.75.6 dev: true + /@rollup/plugin-commonjs/22.0.1_rollup@2.75.6: + resolution: {integrity: sha512-dGfEZvdjDHObBiP5IvwTKMVeq/tBZGMBHZFMdIV1ClMM/YoWS34xrHFGfag9SN2ZtMgNZRFruqvxZQEa70O6nQ==} + engines: {node: '>= 12.0.0'} + peerDependencies: + rollup: ^2.68.0 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.75.6 + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 7.2.0 + is-reference: 1.2.1 + magic-string: 0.25.9 + resolve: 1.22.1 + rollup: 2.75.6 + dev: true + /@rollup/plugin-dynamic-import-vars/1.4.3_rollup@2.75.6: resolution: {integrity: sha512-VYP9BBVI0pcYpLp/DkFT8YP+EmqmWFMmWXoTObDH6OouERxJyPsIj0tC3HxhjNBOKgcRc7eV75IQItzELt7QSg==} engines: {node: '>= 10.0.0'} @@ -3256,7 +3272,7 @@ packages: dev: true /commondir/1.0.1: - resolution: {integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=} + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true /compare-func/2.0.0: From 8108b1ba1f954241d3bdd18bbc70905aa2dc95f3 Mon Sep 17 00:00:00 2001 From: Darin Cassler Date: Fri, 24 Jun 2022 13:52:23 -0500 Subject: [PATCH 16/75] docs: correct pnpm command (#8763) --- docs/guide/index.md | 2 +- packages/create-vite/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/index.md b/docs/guide/index.md index 3ced5c248c4b78..f0f327c22988a2 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -74,7 +74,7 @@ npm create vite@latest my-vue-app -- --template vue yarn create vite my-vue-app --template vue # pnpm -pnpm create vite my-vue-app -- --template vue +pnpm create vite my-vue-app --template vue ``` See [create-vite](https://github.com/vitejs/vite/tree/main/packages/create-vite) for more details on each supported template: `vanilla`, `vanilla-ts`, `vue`, `vue-ts`, `react`, `react-ts`, `preact`, `preact-ts`, `lit`, `lit-ts`, `svelte`, `svelte-ts`. diff --git a/packages/create-vite/README.md b/packages/create-vite/README.md index dd00043cac4b09..519268a4d79da2 100644 --- a/packages/create-vite/README.md +++ b/packages/create-vite/README.md @@ -38,7 +38,7 @@ npm create vite@latest my-vue-app -- --template vue yarn create vite my-vue-app --template vue # pnpm -pnpm create vite my-vue-app -- --template vue +pnpm create vite my-vue-app --template vue ``` Currently supported template presets include: From 8b77695870d16e030392fe2ef9826140e61c6e82 Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Sat, 25 Jun 2022 19:31:40 +0800 Subject: [PATCH 17/75] feat: respect esbuild minify config (#8754) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 翠 / green --- docs/config/build-options.md | 2 +- docs/config/shared-options.md | 2 + .../node/__tests__/plugins/esbuild.spec.ts | 184 ++++++++++++++++++ .../__snapshots__/fixture.test.ts.snap | 2 + packages/vite/src/node/plugins/esbuild.ts | 115 +++++++++-- 5 files changed, 285 insertions(+), 20 deletions(-) create mode 100644 packages/vite/src/node/__tests__/plugins/esbuild.spec.ts diff --git a/docs/config/build-options.md b/docs/config/build-options.md index afe60c86052b36..e4882e111c51ee 100644 --- a/docs/config/build-options.md +++ b/docs/config/build-options.md @@ -145,7 +145,7 @@ Produce SSR-oriented build. The value can be a string to directly specify the SS Set to `false` to disable minification, or specify the minifier to use. The default is [esbuild](https://github.com/evanw/esbuild) which is 20 ~ 40x faster than terser and only 1 ~ 2% worse compression. [Benchmarks](https://github.com/privatenumber/minification-benchmarks) -Note the `build.minify` option is not available when using the `'es'` format in lib mode. +Note the `build.minify` option does not minify whitespaces when using the `'es'` format in lib mode, as it removes pure annotations and break tree-shaking. Terser must be installed when it is set to `'terser'`. diff --git a/docs/config/shared-options.md b/docs/config/shared-options.md index 2ae42cb88500c4..774c35df42a5a5 100644 --- a/docs/config/shared-options.md +++ b/docs/config/shared-options.md @@ -280,6 +280,8 @@ export default defineConfig({ }) ``` +When [`build.minify`](./build-options.md#build-minify) is `true`, you can configure to only minify [certain aspects](https://esbuild.github.io/api/#minify) of the code by setting either of `esbuild.minifyIdentifiers`, `esbuild.minifySyntax`, and `esbuild.minifyWhitespace` to `true`. Note the `esbuild.minify` option can't be used to override `build.minify`. + Set to `false` to disable esbuild transforms. ## assetsInclude diff --git a/packages/vite/src/node/__tests__/plugins/esbuild.spec.ts b/packages/vite/src/node/__tests__/plugins/esbuild.spec.ts new file mode 100644 index 00000000000000..50e9183b46e64c --- /dev/null +++ b/packages/vite/src/node/__tests__/plugins/esbuild.spec.ts @@ -0,0 +1,184 @@ +import { describe, expect, test } from 'vitest' +import type { ResolvedConfig, UserConfig } from '../../config' +import { resolveEsbuildTranspileOptions } from '../../plugins/esbuild' + +describe('resolveEsbuildTranspileOptions', () => { + test('resolve default', () => { + const options = resolveEsbuildTranspileOptions( + defineResolvedConfig({ + build: { + target: 'es2020', + minify: 'esbuild' + }, + esbuild: { + keepNames: true + } + }), + 'es' + ) + expect(options).toEqual({ + target: 'es2020', + format: 'esm', + keepNames: true, + minify: true, + treeShaking: true + }) + }) + + test('resolve esnext no minify', () => { + const options = resolveEsbuildTranspileOptions( + defineResolvedConfig({ + build: { + target: 'esnext', + minify: false + }, + esbuild: { + keepNames: true + } + }), + 'es' + ) + expect(options).toEqual(null) + }) + + test('resolve no minify', () => { + const options = resolveEsbuildTranspileOptions( + defineResolvedConfig({ + build: { + target: 'es2020', + minify: false + }, + esbuild: { + keepNames: true + } + }), + 'es' + ) + expect(options).toEqual({ + target: 'es2020', + format: 'esm', + keepNames: true, + minify: false, + minifyIdentifiers: false, + minifySyntax: false, + minifyWhitespace: false, + treeShaking: false + }) + }) + + test('resolve es lib', () => { + const options = resolveEsbuildTranspileOptions( + defineResolvedConfig({ + build: { + minify: 'esbuild', + lib: { + entry: './somewhere.js' + } + }, + esbuild: { + keepNames: true + } + }), + 'es' + ) + expect(options).toEqual({ + target: undefined, + format: 'esm', + keepNames: true, + minify: false, + minifyIdentifiers: true, + minifySyntax: true, + minifyWhitespace: false, + treeShaking: true + }) + }) + + test('resolve cjs lib', () => { + const options = resolveEsbuildTranspileOptions( + defineResolvedConfig({ + build: { + minify: 'esbuild', + lib: { + entry: './somewhere.js' + } + }, + esbuild: { + keepNames: true + } + }), + 'cjs' + ) + expect(options).toEqual({ + target: undefined, + format: 'cjs', + keepNames: true, + minify: true, + treeShaking: true + }) + }) + + test('resolve es lib with specific minify options', () => { + const options = resolveEsbuildTranspileOptions( + defineResolvedConfig({ + build: { + minify: 'esbuild', + lib: { + entry: './somewhere.js' + } + }, + esbuild: { + keepNames: true, + minifyIdentifiers: true, + minifyWhitespace: true + } + }), + 'es' + ) + expect(options).toEqual({ + target: undefined, + format: 'esm', + keepNames: true, + minify: false, + minifyIdentifiers: true, + minifyWhitespace: false, + treeShaking: true + }) + }) + + test('resolve cjs lib with specific minify options', () => { + const options = resolveEsbuildTranspileOptions( + defineResolvedConfig({ + build: { + minify: 'esbuild', + lib: { + entry: './somewhere.js' + } + }, + esbuild: { + keepNames: true, + minifyIdentifiers: true, + minifyWhitespace: true, + treeShaking: true + } + }), + 'cjs' + ) + expect(options).toEqual({ + target: undefined, + format: 'cjs', + keepNames: true, + minify: false, + minifyIdentifiers: true, + minifyWhitespace: true, + treeShaking: true + }) + }) +}) + +/** + * Helper for `resolveEsbuildTranspileOptions` to created resolved config with types. + * Note: The function only uses `build.target`, `build.minify` and `esbuild` options. + */ +function defineResolvedConfig(config: UserConfig): ResolvedConfig { + return config as any +} diff --git a/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.test.ts.snap b/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.test.ts.snap index 61ff6eeb4d2fc7..4dc2f50a8f881d 100644 --- a/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.test.ts.snap +++ b/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.test.ts.snap @@ -57,6 +57,7 @@ export const parent = Object.assign({ export const rootMixedRelative = Object.assign({ \\"/css.spec.ts\\": () => import(\\"../../css.spec.ts?url\\").then(m => m[\\"default\\"]), \\"/define.spec.ts\\": () => import(\\"../../define.spec.ts?url\\").then(m => m[\\"default\\"]), +\\"/esbuild.spec.ts\\": () => import(\\"../../esbuild.spec.ts?url\\").then(m => m[\\"default\\"]), \\"/import.spec.ts\\": () => import(\\"../../import.spec.ts?url\\").then(m => m[\\"default\\"]), \\"/importGlob/fixture-b/a.ts\\": () => import(\\"../fixture-b/a.ts?url\\").then(m => m[\\"default\\"]), \\"/importGlob/fixture-b/b.ts\\": () => import(\\"../fixture-b/b.ts?url\\").then(m => m[\\"default\\"]), @@ -131,6 +132,7 @@ export const parent = Object.assign({ export const rootMixedRelative = Object.assign({ \\"/css.spec.ts\\": () => import(\\"../../css.spec.ts?url&lang.ts\\").then(m => m[\\"default\\"]), \\"/define.spec.ts\\": () => import(\\"../../define.spec.ts?url&lang.ts\\").then(m => m[\\"default\\"]), +\\"/esbuild.spec.ts\\": () => import(\\"../../esbuild.spec.ts?url&lang.ts\\").then(m => m[\\"default\\"]), \\"/import.spec.ts\\": () => import(\\"../../import.spec.ts?url&lang.ts\\").then(m => m[\\"default\\"]), \\"/importGlob/fixture-b/a.ts\\": () => import(\\"../fixture-b/a.ts?url&lang.ts\\").then(m => m[\\"default\\"]), \\"/importGlob/fixture-b/b.ts\\": () => import(\\"../fixture-b/b.ts?url&lang.ts\\").then(m => m[\\"default\\"]), diff --git a/packages/vite/src/node/plugins/esbuild.ts b/packages/vite/src/node/plugins/esbuild.ts index 10484369f0d710..ee1c36db651849 100644 --- a/packages/vite/src/node/plugins/esbuild.ts +++ b/packages/vite/src/node/plugins/esbuild.ts @@ -8,7 +8,7 @@ import type { } from 'esbuild' import { transform } from 'esbuild' import type { RawSourceMap } from '@ampproject/remapping' -import type { SourceMap } from 'rollup' +import type { InternalModuleFormat, SourceMap } from 'rollup' import type { TSConfckParseOptions, TSConfckParseResult } from 'tsconfck' import { TSConfckParseError, findAll, parse } from 'tsconfck' import { @@ -37,6 +37,10 @@ export interface ESBuildOptions extends TransformOptions { include?: string | RegExp | string[] | RegExp[] exclude?: string | RegExp | string[] | RegExp[] jsxInject?: string + /** + * This option is not respected. Use `build.minify` instead. + */ + minify?: never } export type ESBuildTransformResult = Omit & { @@ -170,6 +174,17 @@ export function esbuildPlugin(options: ESBuildOptions = {}): Plugin { options.exclude || /\.js$/ ) + // Remove optimization options for dev as we only need to transpile them, + // and for build as the final optimization is in `buildEsbuildPlugin` + const transformOptions: TransformOptions = { + ...options, + minify: false, + minifyIdentifiers: false, + minifySyntax: false, + minifyWhitespace: false, + treeShaking: false + } + return { name: 'vite:esbuild', configureServer(_server) { @@ -188,7 +203,7 @@ export function esbuildPlugin(options: ESBuildOptions = {}): Plugin { }, async transform(code, id) { if (filter(id) || filter(cleanUrl(id))) { - const result = await transformWithEsbuild(code, id, options) + const result = await transformWithEsbuild(code, id, transformOptions) if (result.warnings.length) { result.warnings.forEach((m) => { this.warn(prettifyMessage(m, code)) @@ -236,27 +251,13 @@ export const buildEsbuildPlugin = (config: ResolvedConfig): Plugin => { return null } - const target = config.build.target - const minify = config.build.minify === 'esbuild' + const options = resolveEsbuildTranspileOptions(config, opts.format) - if ((!target || target === 'esnext') && !minify) { + if (!options) { return null } - const res = await transformWithEsbuild(code, chunk.fileName, { - ...config.esbuild, - target: target || undefined, - ...(minify - ? { - // Do not minify ES lib output since that would remove pure annotations - // and break tree-shaking - // https://github.com/vuejs/core/issues/2860#issuecomment-926882793 - minify: !(config.build.lib && opts.format === 'es'), - treeShaking: true, - format: rollupToEsbuildFormatMap[opts.format] - } - : undefined) - }) + const res = await transformWithEsbuild(code, chunk.fileName, options) if (config.build.lib) { // #7188, esbuild adds helpers out of the UMD and IIFE wrappers, and the @@ -282,6 +283,82 @@ export const buildEsbuildPlugin = (config: ResolvedConfig): Plugin => { } } +export function resolveEsbuildTranspileOptions( + config: ResolvedConfig, + format: InternalModuleFormat +): TransformOptions | null { + const target = config.build.target + const minify = config.build.minify === 'esbuild' + + if ((!target || target === 'esnext') && !minify) { + return null + } + + // Do not minify whitespace for ES lib output since that would remove + // pure annotations and break tree-shaking + // https://github.com/vuejs/core/issues/2860#issuecomment-926882793 + const isEsLibBuild = config.build.lib && format === 'es' + const options: TransformOptions = { + ...config.esbuild, + target: target || undefined, + format: rollupToEsbuildFormatMap[format] + } + + // If no minify, disable all minify options + if (!minify) { + return { + ...options, + minify: false, + minifyIdentifiers: false, + minifySyntax: false, + minifyWhitespace: false, + treeShaking: false + } + } + + // If user enable fine-grain minify options, minify with their options instead + if ( + options.minifyIdentifiers || + options.minifySyntax || + options.minifyWhitespace + ) { + if (isEsLibBuild) { + // Disable minify whitespace as it breaks tree-shaking + return { + ...options, + minify: false, + minifyWhitespace: false, + treeShaking: true + } + } else { + return { + ...options, + minify: false, + treeShaking: true + } + } + } + + // Else apply default minify options + if (isEsLibBuild) { + // Minify all except whitespace as it breaks tree-shaking + return { + ...options, + minify: false, + minifyIdentifiers: true, + minifySyntax: true, + minifyWhitespace: false, + treeShaking: true + } + } else { + return { + ...options, + minify: true, + treeShaking: true + } + } +} + function prettifyMessage(m: Message, code: string): string { let res = colors.yellow(m.text) if (m.location) { From 2c2a86bf8d050906060a2bd7c15b44e43bb069a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0=20/=20green?= Date: Sat, 25 Jun 2022 22:13:29 +0900 Subject: [PATCH 18/75] fix: always remove temp config (#8782) --- packages/vite/src/node/config.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index fbc5754af892cd..1e7b9583a618ea 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -887,9 +887,12 @@ export async function loadConfigFromFile( // bundle the config file w/ ts transforms first, write it to disk, // load it with native Node ESM, then delete the file. fs.writeFileSync(resolvedPath + '.mjs', bundled.code) - userConfig = (await dynamicImport(`${fileUrl}.mjs?t=${Date.now()}`)) - .default - fs.unlinkSync(resolvedPath + '.mjs') + try { + userConfig = (await dynamicImport(`${fileUrl}.mjs?t=${Date.now()}`)) + .default + } finally { + fs.unlinkSync(resolvedPath + '.mjs') + } debug(`TS + native esm config loaded in ${getTime()}`, fileUrl) } else { // using Function to avoid this from being compiled away by TS/Rollup From f018f135ffa5a2885c063d4509d39958c788120c Mon Sep 17 00:00:00 2001 From: JounQin Date: Sun, 26 Jun 2022 00:33:50 +0800 Subject: [PATCH 19/75] chore: use `tsx` directly instead of indirect `esno` (#8773) --- package.json | 9 +- packages/plugin-legacy/package.json | 2 +- packages/plugin-react/package.json | 2 +- packages/plugin-vue-jsx/package.json | 2 +- packages/plugin-vue/package.json | 2 +- packages/vite/package.json | 3 +- pnpm-lock.yaml | 327 +++++++++++++-------------- 7 files changed, 169 insertions(+), 178 deletions(-) diff --git a/package.json b/package.json index f877a59b859956..46fd322edb8544 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ ], "scripts": { "preinstall": "npx only-allow pnpm", + "postinstall": "simple-git-hooks", "format": "prettier --write --cache .", "lint": "eslint --cache packages/*/{src,types,__tests__}/** playground/**/__tests__/**/*.ts scripts/**", "typecheck": "tsc -p scripts --noEmit && tsc -p playground --noEmit", @@ -30,8 +31,8 @@ "docs-serve": "vitepress serve docs", "build": "pnpm -r --filter=./packages/* run build", "dev": "pnpm -r --parallel --filter=./packages/* run dev", - "release": "esno scripts/release.ts", - "ci-publish": "esno scripts/publishCI.ts", + "release": "tsx scripts/release.ts", + "ci-publish": "tsx scripts/publishCI.ts", "ci-docs": "run-s build docs-build" }, "devDependencies": { @@ -67,7 +68,6 @@ "eslint-define-config": "^1.5.1", "eslint-plugin-import": "^2.26.0", "eslint-plugin-node": "^11.1.0", - "esno": "^0.16.3", "execa": "^6.1.0", "fs-extra": "^10.1.0", "kill-port": "^1.6.1", @@ -86,6 +86,7 @@ "simple-git-hooks": "^2.8.0", "sirv": "^2.0.2", "tslib": "^2.4.0", + "tsx": "^3.6.0", "typescript": "^4.6.4", "unbuild": "^0.7.4", "vite": "workspace:*", @@ -95,7 +96,7 @@ }, "simple-git-hooks": { "pre-commit": "pnpm exec lint-staged --concurrent false", - "commit-msg": "pnpm exec esno scripts/verifyCommit.ts $1" + "commit-msg": "pnpm exec tsx scripts/verifyCommit.ts $1" }, "lint-staged": { "*": [ diff --git a/packages/plugin-legacy/package.json b/packages/plugin-legacy/package.json index 89c958cec08b01..01267c9c56ca50 100644 --- a/packages/plugin-legacy/package.json +++ b/packages/plugin-legacy/package.json @@ -19,7 +19,7 @@ "scripts": { "dev": "unbuild --stub", "build": "unbuild && pnpm run patch-cjs", - "patch-cjs": "esno ../../scripts/patchCJS.ts", + "patch-cjs": "tsx ../../scripts/patchCJS.ts", "prepublishOnly": "npm run build" }, "engines": { diff --git a/packages/plugin-react/package.json b/packages/plugin-react/package.json index 3ada42a44c0bcb..dcc4c57da10aea 100644 --- a/packages/plugin-react/package.json +++ b/packages/plugin-react/package.json @@ -23,7 +23,7 @@ "scripts": { "dev": "unbuild --stub", "build": "unbuild && pnpm run patch-cjs", - "patch-cjs": "esno ../../scripts/patchCJS.ts", + "patch-cjs": "tsx ../../scripts/patchCJS.ts", "prepublishOnly": "npm run build" }, "engines": { diff --git a/packages/plugin-vue-jsx/package.json b/packages/plugin-vue-jsx/package.json index 987b76debad33e..5d14a2dcd56cc0 100644 --- a/packages/plugin-vue-jsx/package.json +++ b/packages/plugin-vue-jsx/package.json @@ -19,7 +19,7 @@ "scripts": { "dev": "unbuild --stub", "build": "unbuild && pnpm run patch-cjs", - "patch-cjs": "esno ../../scripts/patchCJS.ts", + "patch-cjs": "tsx ../../scripts/patchCJS.ts", "prepublishOnly": "npm run build" }, "engines": { diff --git a/packages/plugin-vue/package.json b/packages/plugin-vue/package.json index 0c69c720094c3b..84cc1983a2c9a5 100644 --- a/packages/plugin-vue/package.json +++ b/packages/plugin-vue/package.json @@ -19,7 +19,7 @@ "scripts": { "dev": "unbuild --stub", "build": "unbuild && pnpm run patch-cjs", - "patch-cjs": "esno ../../scripts/patchCJS.ts", + "patch-cjs": "tsx ../../scripts/patchCJS.ts", "prepublishOnly": "npm run build" }, "engines": { diff --git a/packages/vite/package.json b/packages/vite/package.json index afc3a952358902..8b0105285f951e 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -48,7 +48,7 @@ "build-bundle": "rollup --config rollup.config.ts --configPlugin typescript", "build-types": "run-s build-temp-types patch-types roll-types check-dist-types", "build-temp-types": "tsc --emitDeclarationOnly --outDir temp/node -p src/node", - "patch-types": "esno scripts/patchTypes.ts", + "patch-types": "tsx scripts/patchTypes.ts", "roll-types": "api-extractor run && rimraf temp", "check-dist-types": "tsc --project tsconfig.check.json", "lint": "eslint --cache --ext .ts src/**", @@ -90,7 +90,6 @@ "dotenv": "^14.3.2", "dotenv-expand": "^5.1.0", "es-module-lexer": "^0.10.5", - "esno": "^0.16.3", "estree-walker": "^3.0.1", "etag": "^1.8.1", "fast-glob": "^3.2.11", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c9b8b2cb090716..585fd0b471542d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,7 +42,6 @@ importers: eslint-define-config: ^1.5.1 eslint-plugin-import: ^2.26.0 eslint-plugin-node: ^11.1.0 - esno: ^0.16.3 execa: ^6.1.0 fs-extra: ^10.1.0 kill-port: ^1.6.1 @@ -61,6 +60,7 @@ importers: simple-git-hooks: ^2.8.0 sirv: ^2.0.2 tslib: ^2.4.0 + tsx: ^3.6.0 typescript: ^4.6.4 unbuild: ^0.7.4 vite: workspace:* @@ -100,7 +100,6 @@ importers: eslint-define-config: 1.5.1 eslint-plugin-import: 2.26.0_6lykrgsjl6r2vncmjcievjkgyy eslint-plugin-node: 11.1.0_eslint@8.18.0 - esno: 0.16.3 execa: 6.1.0 fs-extra: 10.1.0 kill-port: 1.6.1 @@ -119,6 +118,7 @@ importers: simple-git-hooks: 2.8.0 sirv: 2.0.2 tslib: 2.4.0 + tsx: 3.6.0 typescript: 4.6.4 unbuild: 0.7.4 vite: link:packages/vite @@ -236,7 +236,6 @@ importers: dotenv-expand: ^5.1.0 es-module-lexer: ^0.10.5 esbuild: ^0.14.43 - esno: ^0.16.3 estree-walker: ^3.0.1 etag: ^1.8.1 fast-glob: ^3.2.11 @@ -303,7 +302,6 @@ importers: dotenv: 14.3.2 dotenv-expand: 5.1.0 es-module-lexer: 0.10.5 - esno: 0.16.3 estree-walker: 3.0.1 etag: 1.8.1 fast-glob: 3.2.11 @@ -1772,25 +1770,25 @@ packages: resolution: {integrity: sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==} dev: false - /@esbuild-kit/cjs-loader/2.0.0: - resolution: {integrity: sha512-1ijCpmiCQcOcr0dmwwwCpzv0inWpNtEgiXDWc74AL52AhvY108M26suhWe9PMDcF1esnPJf0YSeVBLLZS6SQvg==} + /@esbuild-kit/cjs-loader/2.2.1: + resolution: {integrity: sha512-pq2Z4DcqTBF7y1wQuIzFVqmHJVnmP6hgHEWN2ubPjeG7OzXMZ9NvozW+YA/MIeMdZWp1jcJ/EvXk2+mfEKoCDQ==} dependencies: - '@esbuild-kit/core-utils': 1.1.1 - get-tsconfig: 3.0.1 + '@esbuild-kit/core-utils': 2.0.2 + get-tsconfig: 4.0.6 dev: true - /@esbuild-kit/core-utils/1.1.1: - resolution: {integrity: sha512-Y5QM1ip6nUvycH8dc/bfNPLNyVt2ccBLB09lAndUvfCza/UwkAfYSiNMbcAnkLcEciEENMm6Lsyt1L98K57v3w==} + /@esbuild-kit/core-utils/2.0.2: + resolution: {integrity: sha512-clNYQUsqtc36pzW5EufMsahcbLG45EaW3YDyf0DlaS0eCMkDXpxIlHwPC0rndUwG6Ytk9sMSD5k1qHbwYEC/OQ==} dependencies: - esbuild: 0.14.38 + esbuild: 0.14.47 + source-map-support: 0.5.21 dev: true - /@esbuild-kit/esm-loader/2.1.0: - resolution: {integrity: sha512-zE7BepoWvVhyoHDEnc2whD9x27UzdRIcUguOD6mUx8PzYjEw2pdNsY+2sP9PeGxW6YJvtLOqcDj3tqhxj61IPw==} + /@esbuild-kit/esm-loader/2.3.1: + resolution: {integrity: sha512-CC0H91Oa02cczLswEoiLowTzWxvnS3tIBGkQa1BnieFK7HHV4whrBFGRlUD9rMHfyyoO55IuOqNujycXX+gI8A==} dependencies: - '@esbuild-kit/core-utils': 1.1.1 - es-module-lexer: 0.10.5 - get-tsconfig: 3.0.1 + '@esbuild-kit/core-utils': 2.0.2 + get-tsconfig: 4.0.6 dev: true /@eslint/eslintrc/1.3.0: @@ -2867,7 +2865,7 @@ packages: dev: true /asap/2.0.6: - resolution: {integrity: sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=} + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} dev: true /asn1js/2.4.0: @@ -3339,7 +3337,7 @@ packages: dev: true /console-control-strings/1.1.0: - resolution: {integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=} + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: false /constantinople/4.0.1: @@ -3755,7 +3753,7 @@ packages: dev: false /delegates/1.0.0: - resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=} + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: false /denque/1.5.1: @@ -3972,21 +3970,21 @@ packages: ext: 1.6.0 dev: false - /esbuild-android-64/0.14.38: - resolution: {integrity: sha512-aRFxR3scRKkbmNuGAK+Gee3+yFxkTJO/cx83Dkyzo4CnQl/2zVSurtG6+G86EQIZ+w+VYngVyK7P3HyTBKu3nw==} + /esbuild-android-64/0.14.43: + resolution: {integrity: sha512-kqFXAS72K6cNrB6RiM7YJ5lNvmWRDSlpi7ZuRZ1hu1S3w0zlwcoCxWAyM23LQUyZSs1PbjHgdbbfYAN8IGh6xg==} engines: {node: '>=12'} cpu: [x64] os: [android] requiresBuild: true - dev: true optional: true - /esbuild-android-64/0.14.43: - resolution: {integrity: sha512-kqFXAS72K6cNrB6RiM7YJ5lNvmWRDSlpi7ZuRZ1hu1S3w0zlwcoCxWAyM23LQUyZSs1PbjHgdbbfYAN8IGh6xg==} + /esbuild-android-64/0.14.47: + resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} engines: {node: '>=12'} cpu: [x64] os: [android] requiresBuild: true + dev: true optional: true /esbuild-android-arm64/0.13.15: @@ -3997,21 +3995,21 @@ packages: dev: true optional: true - /esbuild-android-arm64/0.14.38: - resolution: {integrity: sha512-L2NgQRWuHFI89IIZIlpAcINy9FvBk6xFVZ7xGdOwIm8VyhX1vNCEqUJO3DPSSy945Gzdg98cxtNt8Grv1CsyhA==} + /esbuild-android-arm64/0.14.43: + resolution: {integrity: sha512-bKS2BBFh+7XZY9rpjiHGRNA7LvWYbZWP87pLehggTG7tTaCDvj8qQGOU/OZSjCSKDYbgY7Q+oDw8RlYQ2Jt2BA==} engines: {node: '>=12'} cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true - /esbuild-android-arm64/0.14.43: - resolution: {integrity: sha512-bKS2BBFh+7XZY9rpjiHGRNA7LvWYbZWP87pLehggTG7tTaCDvj8qQGOU/OZSjCSKDYbgY7Q+oDw8RlYQ2Jt2BA==} + /esbuild-android-arm64/0.14.47: + resolution: {integrity: sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] requiresBuild: true + dev: true optional: true /esbuild-darwin-64/0.13.15: @@ -4022,21 +4020,21 @@ packages: dev: true optional: true - /esbuild-darwin-64/0.14.38: - resolution: {integrity: sha512-5JJvgXkX87Pd1Og0u/NJuO7TSqAikAcQQ74gyJ87bqWRVeouky84ICoV4sN6VV53aTW+NE87qLdGY4QA2S7KNA==} + /esbuild-darwin-64/0.14.43: + resolution: {integrity: sha512-/3PSilx011ttoieRGkSZ0XV8zjBf2C9enV4ScMMbCT4dpx0mFhMOpFnCHkOK0pWGB8LklykFyHrWk2z6DENVUg==} engines: {node: '>=12'} cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true - /esbuild-darwin-64/0.14.43: - resolution: {integrity: sha512-/3PSilx011ttoieRGkSZ0XV8zjBf2C9enV4ScMMbCT4dpx0mFhMOpFnCHkOK0pWGB8LklykFyHrWk2z6DENVUg==} + /esbuild-darwin-64/0.14.47: + resolution: {integrity: sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] requiresBuild: true + dev: true optional: true /esbuild-darwin-arm64/0.13.15: @@ -4047,21 +4045,21 @@ packages: dev: true optional: true - /esbuild-darwin-arm64/0.14.38: - resolution: {integrity: sha512-eqF+OejMI3mC5Dlo9Kdq/Ilbki9sQBw3QlHW3wjLmsLh+quNfHmGMp3Ly1eWm981iGBMdbtSS9+LRvR2T8B3eQ==} + /esbuild-darwin-arm64/0.14.43: + resolution: {integrity: sha512-1HyFUKs8DMCBOvw1Qxpr5Vv/ThNcVIFb5xgXWK3pyT40WPvgYIiRTwJCvNs4l8i5qWF8/CK5bQxJVDjQvtv0Yw==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true - /esbuild-darwin-arm64/0.14.43: - resolution: {integrity: sha512-1HyFUKs8DMCBOvw1Qxpr5Vv/ThNcVIFb5xgXWK3pyT40WPvgYIiRTwJCvNs4l8i5qWF8/CK5bQxJVDjQvtv0Yw==} + /esbuild-darwin-arm64/0.14.47: + resolution: {integrity: sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] requiresBuild: true + dev: true optional: true /esbuild-freebsd-64/0.13.15: @@ -4072,21 +4070,21 @@ packages: dev: true optional: true - /esbuild-freebsd-64/0.14.38: - resolution: {integrity: sha512-epnPbhZUt93xV5cgeY36ZxPXDsQeO55DppzsIgWM8vgiG/Rz+qYDLmh5ts3e+Ln1wA9dQ+nZmVHw+RjaW3I5Ig==} + /esbuild-freebsd-64/0.14.43: + resolution: {integrity: sha512-FNWc05TPHYgaXjbPZO5/rJKSBslfG6BeMSs8GhwnqAKP56eEhvmzwnIz1QcC9cRVyO+IKqWNfmHFkCa1WJTULA==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] requiresBuild: true - dev: true optional: true - /esbuild-freebsd-64/0.14.43: - resolution: {integrity: sha512-FNWc05TPHYgaXjbPZO5/rJKSBslfG6BeMSs8GhwnqAKP56eEhvmzwnIz1QcC9cRVyO+IKqWNfmHFkCa1WJTULA==} + /esbuild-freebsd-64/0.14.47: + resolution: {integrity: sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] requiresBuild: true + dev: true optional: true /esbuild-freebsd-arm64/0.13.15: @@ -4097,21 +4095,21 @@ packages: dev: true optional: true - /esbuild-freebsd-arm64/0.14.38: - resolution: {integrity: sha512-/9icXUYJWherhk+y5fjPI5yNUdFPtXHQlwP7/K/zg8t8lQdHVj20SqU9/udQmeUo5pDFHMYzcEFfJqgOVeKNNQ==} + /esbuild-freebsd-arm64/0.14.43: + resolution: {integrity: sha512-amrYopclz3VohqisOPR6hA3GOWA3LZC1WDLnp21RhNmoERmJ/vLnOpnrG2P/Zao+/erKTCUqmrCIPVtj58DRoA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true optional: true - /esbuild-freebsd-arm64/0.14.43: - resolution: {integrity: sha512-amrYopclz3VohqisOPR6hA3GOWA3LZC1WDLnp21RhNmoERmJ/vLnOpnrG2P/Zao+/erKTCUqmrCIPVtj58DRoA==} + /esbuild-freebsd-arm64/0.14.47: + resolution: {integrity: sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] requiresBuild: true + dev: true optional: true /esbuild-linux-32/0.13.15: @@ -4122,21 +4120,21 @@ packages: dev: true optional: true - /esbuild-linux-32/0.14.38: - resolution: {integrity: sha512-QfgfeNHRFvr2XeHFzP8kOZVnal3QvST3A0cgq32ZrHjSMFTdgXhMhmWdKzRXP/PKcfv3e2OW9tT9PpcjNvaq6g==} + /esbuild-linux-32/0.14.43: + resolution: {integrity: sha512-KoxoEra+9O3AKVvgDFvDkiuddCds6q71owSQEYwjtqRV7RwbPzKxJa6+uyzUulHcyGVq0g15K0oKG5CFBcvYDw==} engines: {node: '>=12'} cpu: [ia32] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-32/0.14.43: - resolution: {integrity: sha512-KoxoEra+9O3AKVvgDFvDkiuddCds6q71owSQEYwjtqRV7RwbPzKxJa6+uyzUulHcyGVq0g15K0oKG5CFBcvYDw==} + /esbuild-linux-32/0.14.47: + resolution: {integrity: sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==} engines: {node: '>=12'} cpu: [ia32] os: [linux] requiresBuild: true + dev: true optional: true /esbuild-linux-64/0.13.15: @@ -4147,21 +4145,21 @@ packages: dev: true optional: true - /esbuild-linux-64/0.14.38: - resolution: {integrity: sha512-uuZHNmqcs+Bj1qiW9k/HZU3FtIHmYiuxZ/6Aa+/KHb/pFKr7R3aVqvxlAudYI9Fw3St0VCPfv7QBpUITSmBR1Q==} + /esbuild-linux-64/0.14.43: + resolution: {integrity: sha512-EwINwGMyiJMgBby5/SbMqKcUhS5AYAZ2CpEBzSowsJPNBJEdhkCTtEjk757TN/wxgbu3QklqDM6KghY660QCUw==} engines: {node: '>=12'} cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-64/0.14.43: - resolution: {integrity: sha512-EwINwGMyiJMgBby5/SbMqKcUhS5AYAZ2CpEBzSowsJPNBJEdhkCTtEjk757TN/wxgbu3QklqDM6KghY660QCUw==} + /esbuild-linux-64/0.14.47: + resolution: {integrity: sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==} engines: {node: '>=12'} cpu: [x64] os: [linux] requiresBuild: true + dev: true optional: true /esbuild-linux-arm/0.13.15: @@ -4172,21 +4170,21 @@ packages: dev: true optional: true - /esbuild-linux-arm/0.14.38: - resolution: {integrity: sha512-FiFvQe8J3VKTDXG01JbvoVRXQ0x6UZwyrU4IaLBZeq39Bsbatd94Fuc3F1RGqPF5RbIWW7RvkVQjn79ejzysnA==} + /esbuild-linux-arm/0.14.43: + resolution: {integrity: sha512-e6YzQUoDxxtyamuF12eVzzRC7bbEFSZohJ6igQB9tBqnNmIQY3fI6Cns3z2wxtbZ3f2o6idkD2fQnlvs2902Dg==} engines: {node: '>=12'} cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-arm/0.14.43: - resolution: {integrity: sha512-e6YzQUoDxxtyamuF12eVzzRC7bbEFSZohJ6igQB9tBqnNmIQY3fI6Cns3z2wxtbZ3f2o6idkD2fQnlvs2902Dg==} + /esbuild-linux-arm/0.14.47: + resolution: {integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==} engines: {node: '>=12'} cpu: [arm] os: [linux] requiresBuild: true + dev: true optional: true /esbuild-linux-arm64/0.13.15: @@ -4197,21 +4195,21 @@ packages: dev: true optional: true - /esbuild-linux-arm64/0.14.38: - resolution: {integrity: sha512-HlMGZTEsBrXrivr64eZ/EO0NQM8H8DuSENRok9d+Jtvq8hOLzrxfsAT9U94K3KOGk2XgCmkaI2KD8hX7F97lvA==} + /esbuild-linux-arm64/0.14.43: + resolution: {integrity: sha512-UlSpjMWllAc70zYbHxWuDS3FJytyuR/gHJYBr8BICcTNb/TSOYVBg6U7b3jZ3mILTrgzwJUHwhEwK18FZDouUQ==} engines: {node: '>=12'} cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-arm64/0.14.43: - resolution: {integrity: sha512-UlSpjMWllAc70zYbHxWuDS3FJytyuR/gHJYBr8BICcTNb/TSOYVBg6U7b3jZ3mILTrgzwJUHwhEwK18FZDouUQ==} + /esbuild-linux-arm64/0.14.47: + resolution: {integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==} engines: {node: '>=12'} cpu: [arm64] os: [linux] requiresBuild: true + dev: true optional: true /esbuild-linux-mips64le/0.13.15: @@ -4222,21 +4220,21 @@ packages: dev: true optional: true - /esbuild-linux-mips64le/0.14.38: - resolution: {integrity: sha512-qd1dLf2v7QBiI5wwfil9j0HG/5YMFBAmMVmdeokbNAMbcg49p25t6IlJFXAeLzogv1AvgaXRXvgFNhScYEUXGQ==} + /esbuild-linux-mips64le/0.14.43: + resolution: {integrity: sha512-f+v8cInPEL1/SDP//CfSYzcDNgE4CY3xgDV81DWm3KAPWzhvxARrKxB1Pstf5mB56yAslJDxu7ryBUPX207EZA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-mips64le/0.14.43: - resolution: {integrity: sha512-f+v8cInPEL1/SDP//CfSYzcDNgE4CY3xgDV81DWm3KAPWzhvxARrKxB1Pstf5mB56yAslJDxu7ryBUPX207EZA==} + /esbuild-linux-mips64le/0.14.47: + resolution: {integrity: sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] requiresBuild: true + dev: true optional: true /esbuild-linux-ppc64le/0.13.15: @@ -4247,15 +4245,6 @@ packages: dev: true optional: true - /esbuild-linux-ppc64le/0.14.38: - resolution: {integrity: sha512-mnbEm7o69gTl60jSuK+nn+pRsRHGtDPfzhrqEUXyCl7CTOCLtWN2bhK8bgsdp6J/2NyS/wHBjs1x8aBWwP2X9Q==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-ppc64le/0.14.43: resolution: {integrity: sha512-5wZYMDGAL/K2pqkdIsW+I4IR41kyfHr/QshJcNpUfK3RjB3VQcPWOaZmc+74rm4ZjVirYrtz+jWw0SgxtxRanA==} engines: {node: '>=12'} @@ -4264,10 +4253,10 @@ packages: requiresBuild: true optional: true - /esbuild-linux-riscv64/0.14.38: - resolution: {integrity: sha512-+p6YKYbuV72uikChRk14FSyNJZ4WfYkffj6Af0/Tw63/6TJX6TnIKE+6D3xtEc7DeDth1fjUOEqm+ApKFXbbVQ==} + /esbuild-linux-ppc64le/0.14.47: + resolution: {integrity: sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==} engines: {node: '>=12'} - cpu: [riscv64] + cpu: [ppc64] os: [linux] requiresBuild: true dev: true @@ -4281,10 +4270,10 @@ packages: requiresBuild: true optional: true - /esbuild-linux-s390x/0.14.38: - resolution: {integrity: sha512-0zUsiDkGJiMHxBQ7JDU8jbaanUY975CdOW1YDrurjrM0vWHfjv9tLQsW9GSyEb/heSK1L5gaweRjzfUVBFoybQ==} + /esbuild-linux-riscv64/0.14.47: + resolution: {integrity: sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==} engines: {node: '>=12'} - cpu: [s390x] + cpu: [riscv64] os: [linux] requiresBuild: true dev: true @@ -4298,6 +4287,15 @@ packages: requiresBuild: true optional: true + /esbuild-linux-s390x/0.14.47: + resolution: {integrity: sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + /esbuild-netbsd-64/0.13.15: resolution: {integrity: sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w==} cpu: [x64] @@ -4306,21 +4304,21 @@ packages: dev: true optional: true - /esbuild-netbsd-64/0.14.38: - resolution: {integrity: sha512-cljBAApVwkpnJZfnRVThpRBGzCi+a+V9Ofb1fVkKhtrPLDYlHLrSYGtmnoTVWDQdU516qYI8+wOgcGZ4XIZh0Q==} + /esbuild-netbsd-64/0.14.43: + resolution: {integrity: sha512-2mH4QF6hHBn5zzAfxEI/2eBC0mspVsZ6UVo821LpAJKMvLJPBk3XJO5xwg7paDqSqpl7p6IRrAenW999AEfJhQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] requiresBuild: true - dev: true optional: true - /esbuild-netbsd-64/0.14.43: - resolution: {integrity: sha512-2mH4QF6hHBn5zzAfxEI/2eBC0mspVsZ6UVo821LpAJKMvLJPBk3XJO5xwg7paDqSqpl7p6IRrAenW999AEfJhQ==} + /esbuild-netbsd-64/0.14.47: + resolution: {integrity: sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] requiresBuild: true + dev: true optional: true /esbuild-openbsd-64/0.13.15: @@ -4331,21 +4329,21 @@ packages: dev: true optional: true - /esbuild-openbsd-64/0.14.38: - resolution: {integrity: sha512-CDswYr2PWPGEPpLDUO50mL3WO/07EMjnZDNKpmaxUPsrW+kVM3LoAqr/CE8UbzugpEiflYqJsGPLirThRB18IQ==} + /esbuild-openbsd-64/0.14.43: + resolution: {integrity: sha512-ZhQpiZjvqCqO8jKdGp9+8k9E/EHSA+zIWOg+grwZasI9RoblqJ1QiZqqi7jfd6ZrrG1UFBNGe4m0NFxCFbMVbg==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] requiresBuild: true - dev: true optional: true - /esbuild-openbsd-64/0.14.43: - resolution: {integrity: sha512-ZhQpiZjvqCqO8jKdGp9+8k9E/EHSA+zIWOg+grwZasI9RoblqJ1QiZqqi7jfd6ZrrG1UFBNGe4m0NFxCFbMVbg==} + /esbuild-openbsd-64/0.14.47: + resolution: {integrity: sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] requiresBuild: true + dev: true optional: true /esbuild-sunos-64/0.13.15: @@ -4356,21 +4354,21 @@ packages: dev: true optional: true - /esbuild-sunos-64/0.14.38: - resolution: {integrity: sha512-2mfIoYW58gKcC3bck0j7lD3RZkqYA7MmujFYmSn9l6TiIcAMpuEvqksO+ntBgbLep/eyjpgdplF7b+4T9VJGOA==} + /esbuild-sunos-64/0.14.43: + resolution: {integrity: sha512-DgxSi9DaHReL9gYuul2rrQCAapgnCJkh3LSHPKsY26zytYppG0HgkgVF80zjIlvEsUbGBP/GHQzBtrezj/Zq1Q==} engines: {node: '>=12'} cpu: [x64] os: [sunos] requiresBuild: true - dev: true optional: true - /esbuild-sunos-64/0.14.43: - resolution: {integrity: sha512-DgxSi9DaHReL9gYuul2rrQCAapgnCJkh3LSHPKsY26zytYppG0HgkgVF80zjIlvEsUbGBP/GHQzBtrezj/Zq1Q==} + /esbuild-sunos-64/0.14.47: + resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] requiresBuild: true + dev: true optional: true /esbuild-windows-32/0.13.15: @@ -4381,21 +4379,21 @@ packages: dev: true optional: true - /esbuild-windows-32/0.14.38: - resolution: {integrity: sha512-L2BmEeFZATAvU+FJzJiRLFUP+d9RHN+QXpgaOrs2klshoAm1AE6Us4X6fS9k33Uy5SzScn2TpcgecbqJza1Hjw==} + /esbuild-windows-32/0.14.43: + resolution: {integrity: sha512-Ih3+2O5oExiqm0mY6YYE5dR0o8+AspccQ3vIAtRodwFvhuyGLjb0Hbmzun/F3Lw19nuhPMu3sW2fqIJ5xBxByw==} engines: {node: '>=12'} cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true - /esbuild-windows-32/0.14.43: - resolution: {integrity: sha512-Ih3+2O5oExiqm0mY6YYE5dR0o8+AspccQ3vIAtRodwFvhuyGLjb0Hbmzun/F3Lw19nuhPMu3sW2fqIJ5xBxByw==} + /esbuild-windows-32/0.14.47: + resolution: {integrity: sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] requiresBuild: true + dev: true optional: true /esbuild-windows-64/0.13.15: @@ -4406,21 +4404,21 @@ packages: dev: true optional: true - /esbuild-windows-64/0.14.38: - resolution: {integrity: sha512-Khy4wVmebnzue8aeSXLC+6clo/hRYeNIm0DyikoEqX+3w3rcvrhzpoix0S+MF9vzh6JFskkIGD7Zx47ODJNyCw==} + /esbuild-windows-64/0.14.43: + resolution: {integrity: sha512-8NsuNfI8xwFuJbrCuI+aBqNTYkrWErejFO5aYM+yHqyHuL8mmepLS9EPzAzk8rvfaJrhN0+RvKWAcymViHOKEw==} engines: {node: '>=12'} cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true - /esbuild-windows-64/0.14.43: - resolution: {integrity: sha512-8NsuNfI8xwFuJbrCuI+aBqNTYkrWErejFO5aYM+yHqyHuL8mmepLS9EPzAzk8rvfaJrhN0+RvKWAcymViHOKEw==} + /esbuild-windows-64/0.14.47: + resolution: {integrity: sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] requiresBuild: true + dev: true optional: true /esbuild-windows-arm64/0.13.15: @@ -4431,21 +4429,21 @@ packages: dev: true optional: true - /esbuild-windows-arm64/0.14.38: - resolution: {integrity: sha512-k3FGCNmHBkqdJXuJszdWciAH77PukEyDsdIryEHn9cKLQFxzhT39dSumeTuggaQcXY57UlmLGIkklWZo2qzHpw==} + /esbuild-windows-arm64/0.14.43: + resolution: {integrity: sha512-7ZlD7bo++kVRblJEoG+cepljkfP8bfuTPz5fIXzptwnPaFwGS6ahvfoYzY7WCf5v/1nX2X02HDraVItTgbHnKw==} engines: {node: '>=12'} cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true - /esbuild-windows-arm64/0.14.43: - resolution: {integrity: sha512-7ZlD7bo++kVRblJEoG+cepljkfP8bfuTPz5fIXzptwnPaFwGS6ahvfoYzY7WCf5v/1nX2X02HDraVItTgbHnKw==} + /esbuild-windows-arm64/0.14.47: + resolution: {integrity: sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] requiresBuild: true + dev: true optional: true /esbuild/0.13.15: @@ -4472,34 +4470,6 @@ packages: esbuild-windows-arm64: 0.13.15 dev: true - /esbuild/0.14.38: - resolution: {integrity: sha512-12fzJ0fsm7gVZX1YQ1InkOE5f9Tl7cgf6JPYXRJtPIoE0zkWAbHdPHVPPaLi9tYAcEBqheGzqLn/3RdTOyBfcA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - esbuild-android-64: 0.14.38 - esbuild-android-arm64: 0.14.38 - esbuild-darwin-64: 0.14.38 - esbuild-darwin-arm64: 0.14.38 - esbuild-freebsd-64: 0.14.38 - esbuild-freebsd-arm64: 0.14.38 - esbuild-linux-32: 0.14.38 - esbuild-linux-64: 0.14.38 - esbuild-linux-arm: 0.14.38 - esbuild-linux-arm64: 0.14.38 - esbuild-linux-mips64le: 0.14.38 - esbuild-linux-ppc64le: 0.14.38 - esbuild-linux-riscv64: 0.14.38 - esbuild-linux-s390x: 0.14.38 - esbuild-netbsd-64: 0.14.38 - esbuild-openbsd-64: 0.14.38 - esbuild-sunos-64: 0.14.38 - esbuild-windows-32: 0.14.38 - esbuild-windows-64: 0.14.38 - esbuild-windows-arm64: 0.14.38 - dev: true - /esbuild/0.14.43: resolution: {integrity: sha512-Uf94+kQmy/5jsFwKWiQB4hfo/RkM9Dh7b79p8yqd1tshULdr25G2szLz631NoH3s2ujnKEKVD16RmOxvCNKRFA==} engines: {node: '>=12'} @@ -4527,6 +4497,34 @@ packages: esbuild-windows-64: 0.14.43 esbuild-windows-arm64: 0.14.43 + /esbuild/0.14.47: + resolution: {integrity: sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + esbuild-android-64: 0.14.47 + esbuild-android-arm64: 0.14.47 + esbuild-darwin-64: 0.14.47 + esbuild-darwin-arm64: 0.14.47 + esbuild-freebsd-64: 0.14.47 + esbuild-freebsd-arm64: 0.14.47 + esbuild-linux-32: 0.14.47 + esbuild-linux-64: 0.14.47 + esbuild-linux-arm: 0.14.47 + esbuild-linux-arm64: 0.14.47 + esbuild-linux-mips64le: 0.14.47 + esbuild-linux-ppc64le: 0.14.47 + esbuild-linux-riscv64: 0.14.47 + esbuild-linux-s390x: 0.14.47 + esbuild-netbsd-64: 0.14.47 + esbuild-openbsd-64: 0.14.47 + esbuild-sunos-64: 0.14.47 + esbuild-windows-32: 0.14.47 + esbuild-windows-64: 0.14.47 + esbuild-windows-arm64: 0.14.47 + dev: true + /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -4732,13 +4730,6 @@ packages: - supports-color dev: true - /esno/0.16.3: - resolution: {integrity: sha512-6slSBEV1lMKcX13DBifvnDFpNno5WXhw4j/ff7RI0y51BZiDqEe5dNhhjhIQ3iCOQuzsm2MbVzmwqbN78BBhPg==} - hasBin: true - dependencies: - tsx: 3.4.0 - dev: true - /espree/9.3.2: resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5142,8 +5133,8 @@ packages: resolution: {integrity: sha1-dKILqKSr7OWuGZrQPyvMaP38m6U=} dev: true - /get-tsconfig/3.0.1: - resolution: {integrity: sha512-+m30eQjbcf3xMNdnacXH5IDAKUMbI7Mhbf3e1BHif1FzBlUhBzBlmOVc7kL4+kB035l8OCyBdI3dNXZ3of9HqA==} + /get-tsconfig/4.0.6: + resolution: {integrity: sha512-yK9g+lk9PSaYS4RM9jnlmFSyymNDdLaIk42h6uOO6DOvqKEpL4KhUAcI1/7/sWe8+FWZe1/EjFXFfvv6T+cgPA==} dev: true /git-raw-commits/2.0.11: @@ -5246,7 +5237,7 @@ packages: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.16.0 + uglify-js: 3.16.1 dev: true /hard-rejection/2.1.0: @@ -5286,7 +5277,7 @@ packages: dev: true /has-unicode/2.0.1: - resolution: {integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=} + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} dev: false /has/1.0.3: @@ -7567,7 +7558,7 @@ packages: dev: true /set-blocking/2.0.0: - resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: false /setprototypeof/1.2.0: @@ -8128,7 +8119,7 @@ packages: dev: true /truncate-utf8-bytes/1.0.2: - resolution: {integrity: sha1-QFkjkJWS1W94pYGENLC3hInKXys=} + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} dependencies: utf8-byte-length: 1.0.4 dev: true @@ -8199,13 +8190,13 @@ packages: typescript: 4.6.4 dev: true - /tsx/3.4.0: - resolution: {integrity: sha512-WWakMoC5OqUXvOVZuyAySyETjAZ9rJxZXRbbOhYXDCeHF95hQUBa07UwUFu1yprlnrJ/W7XWfA99YTNKO//KxQ==} + /tsx/3.6.0: + resolution: {integrity: sha512-XzqSxPmyJnI7ZtEX/CLE/CSDkqbL7dK4jwtJRIZpV0EhCxWqtb1OqJPlUc4CVS3/MFdpt8ZxLpvPFohWRTHbzw==} hasBin: true dependencies: - '@esbuild-kit/cjs-loader': 2.0.0 - '@esbuild-kit/core-utils': 1.1.1 - '@esbuild-kit/esm-loader': 2.1.0 + '@esbuild-kit/cjs-loader': 2.2.1 + '@esbuild-kit/core-utils': 2.0.2 + '@esbuild-kit/esm-loader': 2.3.1 optionalDependencies: fsevents: 2.3.2 dev: true @@ -8291,8 +8282,8 @@ packages: resolution: {integrity: sha512-/+BmBDe8GvlB2nIflWasLLAInjYG0bC9HRnfEpNi4sw77J2AJNnEVnTDReVrehoh825+Q/evF3THXTAweyam2g==} dev: true - /uglify-js/3.16.0: - resolution: {integrity: sha512-FEikl6bR30n0T3amyBh3LoiBdqHRy/f4H80+My34HOesOKyHfOsxAPAxOoqC0JUnC1amnO0IwkYC3sko51caSw==} + /uglify-js/3.16.1: + resolution: {integrity: sha512-X5BGTIDH8U6IQ1TIRP62YC36k+ULAa1d59BxlWvPUJ1NkW5L3FwcGfEzuVvGmhJFBu0YJ5Ge25tmRISqCmLiRQ==} engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true @@ -8383,7 +8374,7 @@ packages: dev: false /utf8-byte-length/1.0.4: - resolution: {integrity: sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=} + resolution: {integrity: sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==} dev: true /util-deprecate/1.0.2: From 8de431920ae31eea2877b61eabd3769f3c9fff85 Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Sun, 26 Jun 2022 15:21:17 +0800 Subject: [PATCH 20/75] chore(plugin-vue): mark export helper with null byte (#8792) --- packages/plugin-vue/src/helper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/plugin-vue/src/helper.ts b/packages/plugin-vue/src/helper.ts index 64e27560849dee..45068a78bc3fdf 100644 --- a/packages/plugin-vue/src/helper.ts +++ b/packages/plugin-vue/src/helper.ts @@ -1,4 +1,4 @@ -export const EXPORT_HELPER_ID = 'plugin-vue:export-helper' +export const EXPORT_HELPER_ID = '\0plugin-vue:export-helper' export const helperCode = ` export default (sfc, props) => { From 7ae0d3e60e2b875d064a8c78766d381c0488fd8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0=20/=20green?= Date: Sun, 26 Jun 2022 22:12:44 +0900 Subject: [PATCH 21/75] fix(optimizer): only run require-import conversion if require'd (#8795) --- packages/vite/src/node/optimizer/esbuildDepPlugin.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/node/optimizer/esbuildDepPlugin.ts b/packages/vite/src/node/optimizer/esbuildDepPlugin.ts index 09866eb300c2a3..8803ae3a1f5c48 100644 --- a/packages/vite/src/node/optimizer/esbuildDepPlugin.ts +++ b/packages/vite/src/node/optimizer/esbuildDepPlugin.ts @@ -118,10 +118,16 @@ export function esbuildDepPlugin( const resolved = await resolve(id, importer, kind) if (resolved) { - // here it is not set to `external: true` to convert `require` to `import` + if (kind === 'require-call') { + // here it is not set to `external: true` to convert `require` to `import` + return { + path: resolved, + namespace: externalWithConversionNamespace + } + } return { path: resolved, - namespace: externalWithConversionNamespace + external: true } } } From cd320952286bc57acb814c5b8b13b1f73e217ebd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0=20/=20green?= Date: Sun, 26 Jun 2022 22:30:23 +0900 Subject: [PATCH 22/75] fix: remove buildTimeImportMetaUrl (#8785) --- packages/vite/rollup.config.ts | 18 ------------------ packages/vite/src/node/constants.ts | 1 + 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/packages/vite/rollup.config.ts b/packages/vite/rollup.config.ts index 102a1df2ec4207..8c3e2642d542b9 100644 --- a/packages/vite/rollup.config.ts +++ b/packages/vite/rollup.config.ts @@ -1,7 +1,6 @@ /* eslint-disable no-restricted-globals */ import fs from 'node:fs' import path from 'node:path' -import url from 'node:url' import nodeResolve from '@rollup/plugin-node-resolve' import typescript from '@rollup/plugin-typescript' import commonjs from '@rollup/plugin-commonjs' @@ -140,8 +139,6 @@ function createNodePlugins( } }), - buildTimeImportMetaUrl(), - commonjs({ extensions: ['.js'], // Optional peer deps of ws. Native deps that are mostly for performance. @@ -286,21 +283,6 @@ function shimDepsPlugin(deps: Record): Plugin { } } -// The use of `import.meta.url` in source code is not reliable after bundling. -// For example, it is affected by the `isEntry` bug brought in by the Rollup CJS plugin -// https://github.com/rollup/plugins/pull/1180 -// The better way is to resolve it at build time. -function buildTimeImportMetaUrl(): Plugin { - return { - name: 'buildTimeImportMetaUrl', - resolveImportMeta: (property, chunk) => { - if (property === 'url') { - return `'${url.pathToFileURL(chunk.moduleId).href}'` - } - } - } -} - function licensePlugin() { return license({ thirdParty(dependencies) { diff --git a/packages/vite/src/node/constants.ts b/packages/vite/src/node/constants.ts index d85130aba14499..a7430115b2baab 100644 --- a/packages/vite/src/node/constants.ts +++ b/packages/vite/src/node/constants.ts @@ -61,6 +61,7 @@ export const NULL_BYTE_PLACEHOLDER = `__x00__` export const CLIENT_PUBLIC_PATH = `/@vite/client` export const ENV_PUBLIC_PATH = `/@vite/env` export const VITE_PACKAGE_DIR = resolve( + // import.meta.url is `dist/node/constants.js` after bundle fileURLToPath(import.meta.url), '../../..' ) From 8bb452d6e22d9dbaeeb000d8dfc44c2d35896ab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0=20/=20green?= Date: Sun, 26 Jun 2022 22:40:04 +0900 Subject: [PATCH 23/75] chore: add dark theme images (#8798) --- .github/issue-workflow-dark.png | Bin 0 -> 275185 bytes .github/pr-workflow-dark.png | Bin 0 -> 230296 bytes CONTRIBUTING.md | 10 ++++++++-- 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 .github/issue-workflow-dark.png create mode 100644 .github/pr-workflow-dark.png diff --git a/.github/issue-workflow-dark.png b/.github/issue-workflow-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..fe32a6dc507b0c7c30f7055b6604536623e03621 GIT binary patch literal 275185 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

LPu+~=}q)V2} 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�-@j~H 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 literal 0 HcmV?d00001 diff --git a/.github/pr-workflow-dark.png b/.github/pr-workflow-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..35a53f29637201d262f8c267a86519aeba9be5f2 GIT binary patch literal 230296 zcmZ^LcOaGh`#-YEBO1tvldQ}l$v#3zMr0j36xl0#r9vrNOID(9b z&);?Tc{sk`@8|c&)AKx)`+nc=_cdPE>v~=9FimwO>H|y%h=_=&Rg@L9h=|B)h=@p6 zD9Pb>_$5wUgMSgbYAIbH!Zxr>5D}q>R21Z{dYb(1+n?}olzDru9&_PVI=|wr3%u+l zk?D3(oQ7XR-_aTHs#vMq%CS-njW*6_|H+Uu)Acyok9)%ux450O8gWKsEa9n$NTc}J zpHdT(YYncl%bVqFtxsoMlkn=1Tx!osJ_iwzP@)3=+b`(I{TwJ1O%CIY!vD|TAR^&H zqZ=On*Plk7NE=H+IwB`N^$!yo{`dFLng?hjDMoWetp7hRCn6?snf@P(ntfWCEEjA!Q0^z}yQxe#^$I6B$XjF9!~>@9xUVb0XrRiXX=|6$xKj zX-+~$MW2h7(nyqwW>-AWRS{5;b}8;sJio!UAaRO4Z&0U0p*$wPHwo?e2o}LeL1T%D z-lC7CYm=GtmHTLFo}96;9Qu5>CD%s#l+N2&7FmCzXbu(jB;WZkyWYa)p_eH>giraz zgGRH4e{6Vih;S&ODd^|t?9=2!4!Vpr9DgbsQ2r0|xyz4^OVW2wer%NCbFA3Rms%Z( ziI(y6W)!^{8-DBz`#rr;w>``9HJy8su2!Sk=={3{+Iu z4U|i_oT=EDuW$Kap~P3@GC!g+(UJB1ch^Vmhoj!oDyw0dm*!k!o=Nm32M%i-BUG`WRlfR* zIVoIA-oseVBpFR?@ZKya&TNQq0%(*BDP_&D{0m!x?VtwDg0BB~rZU#>LQ&5bjHPQb ze4x~;bxay-Sb%Nk(0Fn><)34x(XTX;rvKPBq4uod%6{5N*MPmQ9k@SMz)*K>Vd5mC z$n{t{KHZvXwgCQs?M;t&`0+{j(#-m;&2{^IntdBF`}S;6AuS3OL1l&A6Dk6O$-qqP z^S&)EzmW96yqGmEx%JH^BCq#;ys_6pvy#MK%91(~?{ErIV$98YEk=#*!+Ls361|@6oUcdQA6* z;bfehcaJrw5+zjDR%JOICjPRHNSp5Pj?+_$Y<{vcvS3;@4h)N?X#r(={8x`NL}cmlOr3ef40sY zU3;+mfI$=(FohbqvE1%!(3Ou#n8Fbcbs4ESG|^vHV%Pcp)8il2UWPWUui}>beKZpN zmJGz51_Q_6dK#YM1& z_30A&Xzt5Tn$G=cYafBlrF!iwe2j3woeW@qeim4Q&jq3rDBIp>SL^C$K-hhy{^F)+ z^}a>rSe~f32R2Q~LEm3U;_9&D`-rLQHvQ6llN%U^FYJ6=0tCP5uLda^dk^M>W|4~( z)q{^W8U{uTFG&sT);5jE(()(v$i|W)~X>vJjZ|2dz+P| zOljw_w4v_s#roX8_P8MB*GHAXG&0tU1rHd61gjq%KVmHB|LgnH&Y~w@4E=^5ilxEJ zgzdY}7J2=7RXShCmt*#cB=ZV3;Md-$z>cITs@?4%Cf(398>|e{D)V+1cm87T%kGv200G@o!r%oVZ!!GMZ*l{m5lu{E9)YbyOSH*s$f5nyuU_`0DVhBSvJq zj$A1O;cN5SvvH2y2czFpjo+M`?kiE9Y70%d_p^;?9?JT)<&c3_z{(OpjNF7Af zcjrptQ=5~0*O#Uo8pp^82NNU&iE735J0&4eZRn$JG$aUn&YIP}kSuto|KS3rz+tNT zW!O6QMt%Gb-I%f37^U)!dDYqk@sGLoJ-YOQM%Hqx6RjD;<=RGv2&+8cw|)Tg$%-5ZmT34LHZpEVXH$zi0sB} zul7re|~!) zz=8WAmG}F;!;?Bf@S*jD;|>zb2&W`iz$cQv5|77X{hsoICZ#+{0b4~IE5i{7r|oCm z)$q}_nu)wRZ=2ReFt-%(@wS@fPD7su<;}nDSSOl@3gG4Ji169nZ6F?_Y|Az^mGGG6 zuZ`h;>{z~fk^CUbctS&S%sQ!w*C?H#92mqc!z+m=l@4ZV_)qtW8|2$P^p+2_EZ&4a6!>19Xy_`+6kDx|w~VDJ9rdQnhjVh;>hX7TNF-uFH|&Oc=j; z$SO6E$?X+aqfRPm5}??u1%wgVM5*FOyY@b46qKeCgL#c9^>psawTa2S*?vjTsBp0N zVCzR^GGVJa%M)JU=2^e%62x6OI5-sg{nzaoC2zeW8wE@wPfOTI8UX5>PA%iYyT=#! zk<9H|Vf;9ND~KLB4t)|gJf8G>am;S~X?%d?(ReDHPBsd5R3NMO_Nt0oYdc^!ueO6i zyJ4Ev=@B@T>#y611PHTI6o}<@=qt|aE%!6LN6maauS%RmW3XM%G>>kCDH2YM-$2+< zEs;}|{@naOr4!c`{yi+(K{$P4nNR=F?5-KLM8>Q8j;G9LIeuZHwSIXZz;XM>p%oIx zvc>o;RFbG|y#0s)WNWHAA>(38xm9=_30u&iU3c;qgfudCM0uGInto~wHY>5kU3qy? z1=8&(&NLwJ2ebHXRW#fET$|R5CO%W5>ur^V&ckW`n``v3wrCmO6(@1GaZRU`)0iD2 zs*FIQsCCXbFJUiTNppWKs0x*F03L`_e<9H|!}5tQQZ~S!st&RxACmb2x%N!DY^LYc zx+|`Z);|tr2#q?qlQ0h=HN^PWCV`!o5E0)v;D+x|dv?}_ok7SXwozvN@~?&$`0tNe zGCdFR80NogPpNPndz8hqjnA&&=g2lGE4CjIH~)OcbAo|^P{)MoLjfnb2P+cOkWO}F z@y(R4V>vVud(RE9oOep5xG@)PM%T2is24la`QeLhtnA8QFn#P;P1Kj$^GW_|r}S-( ziS2ytAP?B7k{ZPeg5Ntm3yg0#cGf!5vN6#(UeK6#syojW!!QvcPj;9?*(|eGlqX5r zCqIiv$f)o=*{GO9@B19SitViuc^{2}onRL<2q>23k=OOu9S0^NF*(4Yo}gb9!6wA1 z8XucwSa1mf?8x`0A}0Bt>krYYJQjRGHu{iREMHC1ova9Z8uw62%(352ZWVG?GQm3xo8vNi32}hcyJ$e9BUuIg(bvA+H{jXo^B7Qp zjNr#>-koc+mU(KF;I|{ z(>Dbg>BZvfT&Tan23Tj-+P1&7%B%;_fyb-1uC&cXsu!j~UEL+wUFa9J!F7%3kVXK^Q$9@Y5FlyO5czK<7lk|w=Cc9`=L z2cWdv7Cza{g&49?<6^g{u|yyBe8&Mn`FsCF0pe#T6e5F2IAjZM*;8zOB$IF(HNSYsgY${RmWkK*YDUx88GyI>Kx4phXA6sDE{Q2A;2#K%$IWBQk(75>MRjz;N zcUBpy2FB3YmTtdugha&Elvm$qDS9tXa$SrWc=37zjAaV4VoqC%CY(wX*6R< zUFWV-6mO1z*So*$Q1#NmJ7Id|BBX7xN4bR5I;a`MZ;+#(`~)I^L6J+k{e92%CHs)2 zc!v{C*=Pto0z5*R$$?~}7zf4R`OkN$diah-)j zdl^)9YUdP*NE+zDLPO5lb!tLtL2a%r#z3f&gnd0oOhX0<){?I#?_N1%1aP*^)s?wn zVY|-LhUN`~)IC@PiC|2(^zhCWqbr9U-mvSnw=V-1P{Wl#AZmhmk{6#){BsOd`~lDu zRXXIYp!1ij?o|4bK%k7ux9_P#z<*urslS-I4qVGNUC*JvG>nO`0Y?$i1K0WVz z&F%T9)Q$D{v zV1O+8fa%^M@Za7d*WjliA9nM>At1(FE%xNqI5fndyMYCc1Nlu6?H~L_{oKwSBo)5? z-Fo{X!hTp(g-1c1f9V0e0EhF>ufmYGs2aox_Oz7^1%(I6&gudKO)1Yh_V->WM^fuM zgO6!Iu=qDSN`#?(_ah_{n3C~)^GhY9dd~W%8I0=pPz!KPKQnEOcF7s1a5#61SGOM# z7OKE8+i4MDaD4PO8C4x%$&nvo1G(+PER?9hr-55N&B+L#mY=$j62h7zn~lkCvYLLfCMhVky=3@^l!2)4h<9`a}zP7u4+wF zIT^#P0nA)Z=Y1Ce?KHVnh!8KjoW1YvxaikZKy3U!TL?TQdV$n?Vf@5HCedgr2Em#e zNq$@qm9!U_e)20(aj3>$zKO#M=w#}~Az8pQU}cB`3X}*V0JVwbwwu3kCO&HS=>=}O z=h7UP7#aT{UgS#0d-Z+t22fDK;L7W67lHAz8mWnzhiEEUgkPZEagJHUTN+ht249Nw(Jpa|v$IbSKKGkwNp~5pqOOjRweQYt zDR4AJs`CWd0FzrY{Q}#Y%Sm=U`9DZzXDuitr?bn~>P)^I5(&~X^=sFSWCOktc8Fc5 zd?od$pi$=~rirqzyDm%`4EuBXyRgMBk-;LUnWlUQAp?QB(*ewCc|u(2D+x9kawS{* zmk^qIFgFgx`$y^RCeK*a9bE<3c$_U7f75BxtumZZ#IiDwm_Ay`ef;Jh2*Aovswl{s zL)}X5aENU`1e>PY^FN-8)z4IH3+lYR8ULEC(Fm?sskN0((uAi22QkDP0cXx zCTCB9<8o?yp`Q&z#ZgG1@zI>BnA0Wh_>RIUBE1Ki=o#i0G{$P>wm88z+8K|GN+z(OO zYwU#w|A$#QSUB`QHX80%AHr%>WfPhJ<{;l7gCopTu zY=zdE4Ht_(-BLPj@*iIyF@<3GTt`0P%0&v64uZ}oEDRis?F^jOe7UBm5UH5@~~?rZ!$ zYFypoIHriiMH;|mg9`*F%I7X+SjdjczGZ-km%@VID*-=ZpMYUPm}uQrBN{)aWSVO- zt0PBxh!zlv&=!YPEWpdTnm~$9H?8o$MRWPdX*r0(Hp?AAZ3*zm`mMP&>7Um8*TpIA zU|TB_O)rM*cjkoF&+}v^m@g#_y|tb#tL9OPWTFBqbww;LukzVbbRmJ_9-op84-K+mwL%F150!NopFgSJ-@zL zy3S{8i0lBtAW!&&h_U^H^E;n_PCj6*zX~zSFpS(d?A_2WNCNxZ z3!Tpi>Y=x0ztGeVeF+(Dcp-VqUO*`|WfaOL{?J=@NBT)eiZPzEgP-zw^;MG~7RaUy zw*(rh+Hb&unh(@a9pym*m72G-(BDMC!{N`rK{ul1&y3cCpAfFTZSm&C9o{ ztnIkcxIek%UMshx_tz}4Y_{Ew$DF$QIFRegL|M<8xq zg(+6ZAm^*!zS3PB>=X(SUY_f=!){&-LN&cJ5JAY4ELv8P>*05;Sjy=_d0%%>pK3R) z4=+47`A=0~Z=QJu)|(r(JhjPCF51_m6Fd)ONj;K9-((~n7FZPlI78{AABbe$QoeW8c4yus|p|RX{)FV#6 z$agj8#}I6+e8`{>Urh|B>UH*T+KDsp3lSN-ZJ|w%f@-nWZSz>^R9e*+2eX^}6<5l5SS)ytB zCAtZ4|Mn*xOk?|xaK*yjV7j8m9aW9t^9-q#eXCNcag z5doT6JbJEK#7Hx$t}c$xUQyhK_UjK8C%S*b(5yP_qok0@!<{IELa`(LCEum48(I+I zsmg$>=fdN%tGN!6viGEEi)FM?(0N0Fq$sn!;acQ8d@oJydBv^;wj z<=B!I7As^bvmo3}b9@_UuT#Z!#t}$6Xrwk~s>0ZBpx8b0?g*5k@8iBhDlTaM4lYtq zyu$K9D4FJZZd*jZNOAP`HwM#O7cr(-e5uo}A*urn=uvmMiDnmHX^=|X`ptuoD!rv% z+V}opWCw629x)6qe%4?BGM?moDj|=TKDTW1b^oqM(l2x zr~q|RgZ-}UqXwhUi<9l?P^(5m1NP||i+fp3oP+bBf+&-#uP!q(%KDey#UrgHzylOt z3y&%EQjQ;R5m43;0KA#nNG*;5V@l{z~yB}f@crXtau|0O0(J=#Q<%;vw6 z0?6nXubjb-7NEV(7J&drL#FMv0vaD-`}FXOWyl7~fZZYXpHsfrc-l`O`FY08iMW3l zg*!7CbH7HAk3vyDx0r6d%Y4l$gC(BiGTH4QktQLWM4D0rYkqA%pc8%$(~sBHX5~n` zLivCp1O6i(a)BWV%c*J<5-+m4hR@C_JxD=v=1|l6Wz}r!hrVS=K+0Lktv1STv&38% z-$n4V7Niw}*jO5yS+_`h8HyR6;Uk&dXLo{~IRuv?Ho{3C^FCNxg&kF47KvD&hY2cW;q4kQ2LEKdTyQU_QuJ+V)vH` zm+Y>!p8K~pD@3S3)vr`LUl}xb)Vkx{)6&hQ9{O0e^G=oL@ZhMfPS;M~gw6VZ2C$&; z#o1UII(+9>=j(+mdby}~*Kr0O7V!o(wp&;d^Cu5^LK7+7Z+$5mFet)K_^wT4K!?AU zh}GSUMgU|0TF~2lgUNe)lu!3N`T7?cS>+@dzY*~1AZgEw3_>K0Qh&mIAp=B9``qe! zZyt=;3qS$}A-|#2ojpN&B2BUVJ7I>1xPSx*!na5>o_nMq^pMh5k57(^gG7l38@ z6|b@dleZ7%UeE8q2Mpb1;DBs_$QU48Q=~EqF}`o#jX=FBh-nK96*{U~=6g->;#Egm3-UH``D^2lpXt?Dg+Y zPV6K9=Y6CUHiClH6Yah9+h$o4@-EU@cka7uZLIOdscbo~(R*WcEXiea%^f-p5oDu~ z7aqeSS9J#21So0LTSC|{iEjWJ>87fPZM0LICZy6MNGd(gx3GUFl{yuofe%JXb)>b} zW33^NL#Uck+^0TizrqwNK~SgIB$0L&yW5rquGpftz8=v)8tRtma%U-Jp+Z?51+Ysp z2(eE!uq1`w|>%^U$cP|987196>G^*ztubVfMIZKI!;%$=`FdHJUL8#~$F0}*3e(z)y zAJFGTb7SRIJ*~@rK}p&fOyQmY%+&X1qV??z+e-pf_y-q0%&lwCVWUr2 zZRH9te^v%+h+3eDg&;c|?E6OqAZs+zk1!kXnUOYh&Q=N{A>-F?f5^8;{Dp$e*UbE7 zM}9d_z}7@>l>SXu-Np-NQ8+Wx_103aKTYLGPoP7LdNpqbKoHH85~L*lwhr8QQMakU z*x|18(Ba}i()DQ!-qW<)S3EZhfJ7(vVPF-_0>;$PtjCqyw*Y@D%5NQ)yw&M$?DrhP z@*-zWq)~OsP@(@#cI{V}&kfW+7K&KfSm_BX9?INW$LeJ#N;e_mD}+I0Auw72hXLqk zbfsqR1f0MmN`#%GU%07qADRW7zwUi<8-I(3UQaD_hSDItxJeK_Qw&>yQm$A$9fGfkA3l>g^=2(|^MCa;Gz zvdK&o?Zt%7#kAX1x|F3TROsDOjODqYK*%LL#n}W z{+w>|N_{n&dX^zHxAOi`1(BD$-WB|>$T&W|cp%d-q4*y|7@e#!Yp1Ntmc=IFQ&<-P zq}c?`6HF6+(g$QY(>*oX`~3Zy=0LDe)E6%Nwtdo>F0#b+d!lp+2!6hkY|ox3FMfDj zvSYdnD#ZaMERBELZ$R{UhfiZQ_IZkkZLMIazb&TRmFaBOS#Eu$_R)p+)5@ts0SU5e z;r~MIL(r#ny|J6LD8Cj5Vw>8Vbo7qfX3d|{e)V-tbQn)^g{<<5{rEU$^-icXgDPQkdIJE0tVO>Xr>h$sZ+6;R2VQfBz4Xz>M;U}wJ-=kcZ!UcWzp3@anylF_&;^}lI0lng9s~&1ee2f=r|M%Z|$32o4<9adK+@@H-OmE_A9aw8T~kQjZTzy znBhM7Z!Y4Z?qRVgqxy7+(QPIfnXT@wYJHUFxQL57u7ZSaIUOLduHyzUCQ%S$e7;x3Ko^n^QgVdb7p({;*UkrRM#0XTu_65;z%+jhL9L;Jb}<5_0_-k2L8odLn6E?y zlE(sqivec~>j>^p+urbNl|TOAUN(Zs|BN*nPDI6?(!R8{u{vd53DgdQL=|Xyl_AD+ zLeS3FS|0oqobPp`^M{DvnHP!VBcObfDIM?5%d|dqNG~9lru!awEhfn*0@!rSLkGXU zRK*AUm)jqrV>ncW}83@=e%fjGr0;c6gRS%iDf#6>3zS4txzX`=+ET0}$pVAiy=ANdjUpz(6 z`z-zT+rU!n^HvAHRkV#-U%vwVcD{^MSFec{PWU$s%B_EwdkI1VmqattWo5TxeGrnz z-~K#!T%z;Rh+%<)0g=SbHXg%oli491?Ab`3ZVA+rpGjAJTn8!#e&t)oi!lYz(^;k# zvCDEaJ?06ZAtzfI{ zUXS^`ANt7m2awi94keIvjiQZjOEp-yX`FC?7FsK1C&boRU=Nl-x0=4$9X!lc(aY*Jp`NYe7dd5;QgI%i76k;vUVb+oe#d zQB}K(=pWpv5ui5)YI3h7M#&v)GpO`ep%kehrY!}qJ&PBY!v~=M&&w-KI;20<(PF6f z01;rg;{e>LfacHM;tF+@yZqJNM-mYqf+~b$=M6-}6^D6%3cBkLM;M1Nt_?}Dj?7+I z{STkBtK@DR3RMdNx9F*efdgE^haJQMPMfAs7b|XDRqMm(DCZOaF#yEa^5Vdu*uAbjoo=SgHZN@fUd!K zH`SvCaU@xoJYZ_UwxLBq-<5CwoNRPWl7i$Ddn9l|UclUq)^aDsLia=!;)oSME?sp+ zv5}Eo6Qup$qL0cMGAQ0|$e96T8;OwJioB8Nbx}791B8HSz~<=kumusN0#~Gj`%S|$ zCK>9-5#cik0{l0NH+`BOo+p4V(o}Hqv4aHR2j#IKBsA%-K+~@lq{->P+0Fw)X{d>P ze#8Yut4xBREe#ER<1lYjAM$GcNdFMlirX{!r-_saNToI>Rd5{#Zv@Eov6U7MRgdl;U^W>)Q4Zz)0t zH$2eWt$!(3qR?PL0z9U`P9UYZ+rBSIo3rzS#isR9H@cv0KFvZW^YuG-;*YjyU0B<{ zf73YFxi2k#Hw&OEeE@;a{5ZeocOpnx{a4JX=-lI`p!LN8%~&n4a;mx;Kc0;$olMF6 z#GAbQ4tp#cx^)O29xdtNpaN|yvS9%J)VlOlyPV^S0yrmk_}M*D0=FPwkn}aT+O#!l zfeubrj$%(8Dk2|MjpujvUY;cd+C+fgL|^>u$glApFTGXhU31 zIN$tv?zxyF`Fs;2^NxqoX28Rp>wbLOjaZ}!>`lPPP@x_R7+!yV{2b^C0C|C?&||85 zG}fUd0(FE(_uZ4e$6-gf^Vfc^5#4}HtBbLMGnISw$!Rx`{9jEms4Ae)uKZksDCj^a zZD)mz&wT=|0J2eTjYK!=#tGfz{lLk!UwUJWmI>JMJ*EFXIqoXL9&CVZ1f4UgB6JoJ z&BhsRIVHlnf2t0GU*#s3YNlKe1~TO@X#o8}`e@sUxJ8{%%tYz(z83_)bh?djXz765U6!YfSEoy6 z(mdyW((9@}Kc@y7r}+#pU6sX7}BN2SAA5^q3wO-!Y&-Gz+EF z+W5=-ZarHC8W+@M(?%er`z-3 zloEx@Za*HAK*v6ZZWttGkD)oF`iMmwL=pV-;YhFR@#EAzLPa)^Y^>A9?2$&_)*gh0 zRWu^4hJM1kJ5}&sNW0n1^&+(@NGU=F@9dAhf`AlFgakxF;ni%DzUh6ek)*ZMm8btT zy2@LV(BpQ0T>e!PjlYlg-G&a8 z?!|QH;VNN^s(%bc{h@L{mftWz*al}Xa#n^q0ttvly(R@2yanHVL`29Jh7=>2dgTGz zAmjA--FfILYtXsQ_cRy4!FYx4`T)_ zr%8TQJ;4bRpxrTj#~_)8@D;>-kuXv~r32vIPVQ|72d=3UI4k<-2qw`>&~#^fKTLBc zC>`P3z<_MJbKlrkJ%dc|HTR8Ss+D*E2I5fvM4j19#d3h?SaY=-D+w?Csg;a$*<)|i z#n#@Q2ddIQ)1=tVhN><@{RPwGz99_j0Wia_b)$&ZU(mFiAD~HrnbFuRXkl1Er%4F0 z36STf+n%PF?pgjRWIm6|$X#2B8Uqv(I1&imuVvQeZ5&YApep<|0onwFt+<5fY2Y9F za5ic0vs;qNG=%5+vcq$aTx22u6Lh6y5a`B1%8J-QOSY+O?Q^kgvN7OJ+LzvM}E`DC?x2I(eD7} zS4*5>Amj=(>LziPYCll9e8Xp8)RC%Q{=x-2#Z@RL-!0Su?Q0&+8HBLuP}v}J8@lta z0MXHhM;w`^2jWl2WQVksA$mR(ean zyDa$Xp!shmw+h39!EsgG!yx4^BpXJufALS~Y36F3V+sdip_Ln#d}t?65D{;K7vYoK9nLs*&m)Ck4UC zvo>0pXSO;F9c!WPM9Ow8Xe3fqRctO9juTAqHZ%~VLb;Pt_CU?YXkgIzc@SAr*24Yx z1I@)LC1YIBLpFI|H7|NT7@Cz=RqM+14iUCL!5H19GlFr#=9^5FsDtR_vCXv@{~3gBD?@);zb!i2WBXOJAk-wl5T|hF7qeZ}u%(x4wFK*0$sFuf`%8j`i~MaTrX2s4XVN$%-T19%tOHh!!YQ#6~@qlH57#bKnJ9w z1l&o(WH>bUuL2}sMSrZ*B%I-Y8*24Dig;jFS_idM1x%enJ1i{Mp$`M2f!t-@i_uUQ ze6yIjc54D@LYz)KZGHh6Ljhnvz!Ywa-XpyY3`78U;-xu>T@y#f&rpy+bdyS<8WV=d z(=0po<2g<@M&sGp+U$#IDHY_yU>5}v!)s&Elc|MPj-B1!t?)$LI_p^W9z;?}Lw5EU zPNEN?j-lgn2_nwuhicZ3$%s1k5o?q~B^0WLZ-A}0mwJYhBSAE8mK!T`y0#neO^>E! zUl0aeoUnk?T*vMu5+-U;gRVhPIQV(AmV*on}pG#9G&6fL#GJBdm`v~gJp!VjuFrmYA}ODLu&30_}5jYb9UD5B}v|s zrwpL_%W9HAx=#^rA@b3OJA!g@G8}&|0Tc}%&3qx0&-Ken>{G?SqRk6G4{_U=@0Udy+9N8g+rV zuSQ$X-Ig&PqK=`=#;p7*$OwF2(H%Z~ZD<8*6h1iK51J;nFKxx?HbwTH;0J)KtUaG| z3Gps4Fo`Ob-{9};ezP!7@#pnc4cWN%Og$x^t5EXf4Q@gji=7*;Hhee-Zfba11|*c$ z1@&Qjocq66G)kEa!~>kj{QXe@Oxx{wpfBp-Nxwf_MCR(gtpJ7lE}!Ny%<)6Jqg@L#_G3lg%Rd{puvAxJ>k50-e-4_A2p9ao!N7LE+f(V(#7y& zCm_J*nQeeCE^RtP(R7f7(-_f0Y*hqu&oIDC9A<1zN`UWJG1K6`DB@CP_!dF)m#&I5 z+VkaHI+x4L2Sh^bTiZJz*i4lzLVd&oUry~8wv-15^_KJ|>+vn=cZmgdUBaNJPX&BX z-Ox&r)W7h;2iZ0I#4ivY=04s)yXBSMTOFK`O__b_VK^AaSl zbC6IwY3LvqJ%)%}1B`JRM7O__0457B*ArRR6M_yCulzt^p7GNno&c{TsrY z)%^C3IHr4fK=tPPEE@7fWkCI9No~s!YZEMfNzmcCwf?L;;5!uY_OS^ZDu->_UPo<~ z36eBFj4`&Kz)MlrAb@$MVzFs?WX)fvr(^jIxF;2Ljr4?%)4=|4R$@|;E8zFEH{#A9 zvGyQcs5PA@_&g$&iRRVeHN2Y@l*`RmvuLr(gdM*>58`lkx5c7+)5Xz7vae<^pQaw2 z{LTCPeWo|NWMkgvSD*mCwfR28mIc%UIXY2@4y1i@3en>l7Bm>^tw=z~8hlK$R)z%w zjt08dYdj^y?qnlWvR!ZIAnetHW-J}JSNeGTvICAgXv5{b8(ckdTdOi=`N5SkrGFw` z%~(M<(=4f~*^hBSI^Cc5%tp$IqI+ZBh5dXbCd1y2Q?&F4wJcK5YN(cfwLYDIv?{;8L_@DG9b{PZ zH76r#prdamI?`X}W8Yrr->oG3<|QB9U+OX7$n3~wYRPh_d9_i>1u{cMEDb}Ry+Gq( z86q66S{FTyu|xQ!^|KLTe#-?#f3>QClE4;uT<|@Pl#D=Y9%@J7=!7t=e;d;gPbP=p ztEsCNANqDmj5bfbh6Q^biNy2X5|~RJ)y*ZXhp?}KI@(t|1S2W4lElV}SSz9hi}eBD zKM%9+w}ssCy%X2OI<>(`OhK*AboXjB~`pK%*XD z1XD^EI}BUi>hSqInXno7tNaK;!+i-fUk$8~0kA-Mvd=gWxK9pDFuNHWyynxF68Laf z21Qfh94*F1^U$u9bMpje>RMsq22m7nLhHveJBHg$6XSiH$J?3_@}SZp=;$e}8qneJ z|3>ax00O{RJyB|6ZnYE{jBrXtqRh#jaV;@t8pD2sQq`3-602=1WBj}={(HrbE;3}m z+Qc@+){8*^pPJ;dkUOKEz`TaE=DuD9n}2mX;cp5V{D4*vty#3hDM>9-gaE8iuq9gs zR~Lks7!TT*wsXC0W?a60vo#V-U9VIz$zeXTZpe z?n%GzPtLTVBJj+Q@FxP%rIb=joff*7bO?&bfHI$Wx_ixk?3I4jDl86QT8}^VPy_;S zZ$`toX2%$@SErf;@Cy8ECI$>{c74T*iGjV(HO$xk__lb!8KT}Hw-oF{a0)tMzXE;a zjoN6%g_ju!Pan=IjX`=M=6Ux95Wu!oWb%^POHltk+KBUV?yD@Ue-Tu0WrF4V=3%;^ zi(HjkJs}cOT-VJ6a4FTsL}}@RzlZHE6w)FaKt%%CFwd+M?v+{cGq&yZo}WEKUwk13 zF~vqw*i0aRd(XKJe6R?K(|0}&qi<2f`^fd3rVnH-+Fr>*;g(-uxD5YR1g|Mgg&J1!_8t~ zzF;9GT}NhRa33i3x}1Iy}A7WA)A`k4EfX5yMET9;FY z_POYVVrR0AskGSnJ{-=U!4xF?P04#Z;ODPa(nUVz)tO9WounaodGTS6cOUi#|DVx% z?h_|YXdw(yOjn+N*_NzfWt8*TkuJ7 zP&WczpxK2OgV&YS`ODm{eB22i)mb1dx}des&Trd_Gf7p=3@Rxyxo2kGepVJoaHZ$PRWvNDf zJl9(T9j)liw)fKPxovd-kv6@Q7yf3HzdwiygqX6=(}j^R4M{}eETH+`Ob(fCYkR9x zuN$eCh0y^D{s^vb(3`MUN>2_b2@f6FGyM;X(I7=wGav-xK)TX%-5I!%C};o1ggEIMj7 zNqK6!@?>!D6+{h(e@_BzGW5qcN8DUkQHMET9 z?4Cegl%~(V*t+K|z9NIM*ZmWAyM~BKnUgY!Iq-up^&KL5o(Iuxs6%({9y;UyPG-Of z${uZ68^-7&bBe-V^OmQeE6DcfwjhDSB7FdZf$zVc9o`)bgs^{*6e?*RB*+4bR|mH! z2ndxeXt5Z@sqPv##B6DR@8d9#I=!2VBY9vF{$tQxbuk8 z^Mkg0^`7ILl?{R(h_!{ ztP;h37onz+`3>kHJ=lEUvZohHnhO0FR<-l$1ha$6ex0nlz)@)bVU9>(M-l278Q~`^ z^S|BswxO8}s23@s|6bK$-FyLV0hkVXnY`zMsZT&uv+|4lI8U$w+R%ML$aPJiL=d7l z$nt)k7t+Y1;7pf2+G)~MZumKAF~V>(>`oBn-w9SEZ^HEJC1mUYT=D!~E7S+~saB^x zzUR{_w@HCeJBcVNVVG3~CIAIs4u7sfuE}C2zz_u`BP8jwH`kL1UrhP6yb{8bBM(a=Q%_cC}DO2D@w^R|@)qA5JqXVUTFRaa*%III4XR&e^8sn` zfmXTo9085&H`%H&Tn`f@Jp@~{e`cEYhkt4<`e)!3c`8i96wYX!IqvG4G!v$D|LCa^ zD4v(YrHeNoHF!C@t6!z3kzR;2D)ZJ^Tbkkv*q94Ju9i3eb7{yZhf;y5Th-u|FD9im z&t()Ax}mQGw-qPY`2KR*!h{nOIv zG?)Ja)KV%ij(L(LvcUeXBL~-5^@x$4Y;Ru5Vm>H-M?QWiDKSxCxIg2X@6gAqA-kFD zuC|^!P`$7MO_kq`{jAO6)qUIb*Lq;Q*fy2s0J~)Aac#Sbeo?*t?`oD+YcsNMw;R1B z#rn%lst2dU%e^-N9dZKFD2!;1SsI=fO=P+|(+YTv6Iv(B;X-fy*RNeZV>8gV_{HCN z`(cq!S;n?ZZ{CrKe+hm zH`LHlFL+H5wNfwGe1qCw(EX$miml&2Qpt}%C%kw}EntN$_e;glKilrOq{Wx>YiCy9 zn|f?|SXPAC_bd)f`_rtGceOiox+2Y3DqU$CNjt+cUVbY*@;xqO=F?S2`m#%~j9oOO z{kfT$H?gJ_4r&)~nJD1?e9QY%fS+EI7#m_c;3?Aax@vsFQ_ALxaS}q9lqi)RuPC|I z=O_IZe^(Y4Q$G6rsrK2UVZR5o+}?dQ!S#7cy%6!3x>NS*UIE-i7Pc^O!41oJyyyKb zxUpgWwMKt<>+^t_ZU+T>{PG5PYMv|9M*A;({G zFT1);>v>pE`xyJ3Pi2m&8j+ZuP9G1~9-tZj;^MeQx3%qa#aPU@@RwW+oS> zaGkbm0KaYP*jqT%ZZlo=J1rZavDAXhyrp{IVjqKjVadIc>=G`%RE=#tP5x-d+ zw`F*l?Nw#(W>8TZg=F_cjB`Dz`_hM7@UiGzR)|{cdEuoX8;qnuWa6FX7qs=bVb0;t zyjR@WM!UVz_|B@b@Iy3Yhq5 zeHPKMnwU7|ASlgfdR5)L5!W<8hrL&Z&HlxnI^%;aSG@k3Z`xfkS(3uTbh)iE#^+LY zoP_&ilZ$wivEi|1eR(qz=T9;f;6K^8RgF#;pIH@4 z&RouGQ|p|$GRp$vOb-R~ zDJ(3?=e({OWOD2*ziVoRcPQZDUV~s`r~sI_+z-qB*zN znY32|C=QiXEozFf2iGL@KI8<_E(he&G!-Qq+m9z$8N9Laek_Rm2NWTY&Z?f z^R)Q>eGFX2!dLADj|4`=t-Y|L3zWH~?I$9vEm%Tsy>Qr*%wfF_f3IVC5S05Jx#z>K z@i?M$gv%pHN1Ee?k-JDLQ%EovMX^e_H|q%kbsw=xPc|jC>=A1qf5|5ZrqeHhY@tfsSx#!kH)H$Dl0wstFMFUSI+;xOZNyQYS*A{vF8FY7n_$u3!rrECXKj z?=Prs5~llNpc8{OGymHDZct|{l?bRKh!Z*s6i7BDI^vY|swSHAf!puSD@)UT%w{Jo z&+h>zDBABNki(8_7IDMqiEhZ>YBe+ruA~Os z;j{^>N#)jjd-c@%QzhF-TN{%C~p$ZOR<3AkxS%G>AurnU>f3wzcILtT=>d|SRPzI%g5urJZ=AS5-Kmdt{l$F zi#0or^`D14Av5tDB14J}%kNLFfN+cX`_XVH=6n$e$UcQ<$Oa~GB)hMaul%GcLOKF7 z1E!!%8Bd#TX851$xkyrc)2LpB3vM+5+0x;c`R5s7OW?R!|8v}EJx!#Yu(dkIwhH|> zOK6S~pSy5xPkl*5@`-;IMnJk6r4V8qES*e*%mQj4Hstb4SR2n z5h5#lr(F^%J1aX;QpiYl*<@w??~kYTe1FgXy3W=0T#q_FpZB=O>wev@`_j7{T@9qU zy#w098DG>lBU|}XDVoX*We_?Gkx@JpHJTCh0HW{zdK~C=d=35p3wUe-uu6CT*8|`mNQg^xqcx``iTJBGJIl<%B|g96~Yy`NRvI^gKuc1kI|u;IHBW z$R-p|7`Xeu`8w)6rlt=)gaJ2VzWkNy1mJ}C(DCbOU87*(gTxd%kIT^i^)yJpiHKbR z7yiWp-;ajBB)X72$IuZVbbkFn`}W9=GMyxX&JmIkl|_8CGm}|;f?`8_D z|Eaeo|MzbDtS$8Tse-0WJj8pQ>$`V&s(%t{wot_>fIbN>4!z#g(AEWTcQ z71h&M1f2fQ;lG7KqGkZ5e+)w%$MurX*MH@9*uj@LKn|>+D0B332j>9^r#mbA91ziE zDj-{?_Yxzoh$G(Dc!IO*+z1qqD5|NCa{hf%fh)}{;nakv#~|&N(C2ApW!48J1rEq# zSmitR!gmdF5+Jkw#GL{Bi!|Si?*O9Yw~DlwE5+<6?TD+GL7^UMq5FGE zo$mu~`$@(4|6YcCOU{0=@uQ>kj}$C3Yh5D*XnQFNLf(3L>Cc>e1_z%B70 z)oChX>Lw~;vXKL*r?0QWKgUUu^*OxSmj_A_Grjgzu7HeLOA6g}j`-iNE~V+d^7skA z#JKGG)G*Rc>GZNlkQ>Dwp# z$|EM4Rc-*{q{n?vpX`D68DWKYTXWa^z>fS?2f*5I^+FF;KM;SI-H!0FV^RP5#0a6? z;DrGOnN`8ICow&83&UMQ9%XLd+ffC0A1n(R(P@SJk@EGF-}H;Fd&4x6_y4`>urt9( zH+&x$P|g_Z;7UP0)S40w<+;^=_JuO?LPj8)2eh3xebDVWn^*RYj~dzCzdwWuwzoM7 zdtSeI{@HJRR6VVe3UDGvaxgJos7uSz*)>ZFjMwu=V=m%3@O^hhxb0y`wEN*gQs_I{+|=$ zNplJ6#@>KQ^9ODqdRy(PlLoN-p31N`hX!;`s32>DU{!5$+di~SLM4MJ;{R9}2T+YK zM-nhteiKN;T|M6mp1{N29D|c*eXTr?582eqTyLSy&;_DRV!*(MV?2I$$w0F7f43^0 zhX8cN((;+I*V8Xo2JGMrj(T1;R)w#lL^l3a+9U38IQvAIK4N_iL1|L%c~a|B&q(0+ z!EyNOvv3UuKD%FCtbb&=-`%tr3}waTq=W2mBMzWwnvT6PKEEH?kLNVl$5Pb$k?R0R z?8X1jN=?AThH{YXGX@e?9~|eF#f~y$!w%8FqKAr|Q>Q`pxngy0gd;HBGULAvG6n@< zev%Y4OZNkJV)3s2&c(WhftRB4FxEvLzC(qG5~7!?J_z>vT%naNBdMblIp%+VvW>`$ zJidg?{LpJ#5DQsAR^szqIbI9RSK0>f9>S?&aEYX2p z05P8X|Gjm@Q=DnXFAqhD4`EiodnJwEbrpammga=7qO^aM%848VLz{w-^@-cjec;Ae z4h)?8*UQ0+Vofo9K8tTIJ`H3*sGE%+% z`}H|CmO{07M7{hU8}P4Nmr)IXWj|DZCk=p>w|w>Mzs(tJik1obkpG5bF+?DrjI4p` zJ?g4&tOReZiJb2DOph-jr@I=sUwug5fcF0XI!cIw|9PMp_6n2(0o&(t;wLsZ)@;bJ zMw=w<9BUWaRS-1dzb#ei^IzX!;wG0lV8bM4cd9aRjgO-^Wmj0BhTec-Rw{-eRY_ zI!ONatFkLFkxXK3n?UY{IU9C%5P1Ig3IjKLrs%Vu_jxd-HUF~ph*hXy6NXTA1qfxO z&=FDwoetywpA84;LL-3K`{hYl;{QJz4jAPak`RJUzqHuZkGTtFxp^G0Lidps`g-Hs zGvp-(!RR|fCvY+14@pk_`_9984I~;EM*5w5AsR3SRcGY-Ean(r2?i@Ph8PiMZ)5!( zBXW8W(swr?GdY4$b})E)`@c;8Dl|TUg0b(oUCEc-Vi343R6Nh)f`cMq*W-;EvniaDY~XQdmO1Kxx}xSBrn&OM)8JDrBa8z^OEz z9eBB4J~Nyt`|5RECgPf{#dO~6_$$pp2p~=n(s`Zs|LdPCpCESX2YHT9PmIeyZb1Za zV-vkSW~#dM!nLxNTMHP+T~+@6WFsN{`#OI}WAkfvGnGJ6D84PE;<1*&S+P-7@_9|F z(IHnZ>N6a+X@FNQh5JC>$&wO-UTAvYl8qRb5emYwHt|>BhTB;@1_^o4c`^f6t}UbG z@x8wzhCd;q&TeWsuI?UcVr2 zIwaEUM|tQxXuc=~HV%6F7zcKdedJj6+nVveFHpnk|2}S0X5QY<=g@|j_(e@=zb<3< z7hzxH+TJW}PBwp|@sTMQsDHsRFVozn-SOFDA8|wot-n#eo%WV)->W$|Amvc1;0=_1 zEGMw=*r}#nYOCEklfh|oJE##Y$8>X3rbog<({X&c3u7Wypn>?Jb%;A7@E3#*B`trp zv~blbp}77&+`_ecwj!z4`subE#&3Xr#rKO`=;pY~TnYHmPu3LMIiY|u9zDYok2^$m zlLB$1gg&f8%i;Sa$khY*`{NU6!xbU!wkw~8AQ1r^?T(*(L5FzUpP!~Hs3aq&@T;Jx zzYcZSe()RWtz=tTYjss5^#_Df(F&Q_O*E0r{2KhHH@tHkMo8{uzpWEVvnzW@)<@^3 zDc#o9TXk)YMw+`jFAi@n`Ad8XXUHFdarOIJ)~sHnGg zQAuT@#|_IWo;|pTg<{J_PTBSFz6fv4IbZ*+wfnwB+8cqEh1Qjvd0aA|w_aFAcvK#$ zsh9XXOCz_wG20hfHyj})TF@RUFk=f-j1;mGrXBzg=6NStoopml_$wA!z$QBs5Qd&h zEw&yLI64fyl=;CYtTS8_r63la+H(ssKs&&WXBwF7T|l{|b*ABg+rQ84AWW3XS-6V5qaaw(=nkBV+%(>rih;Besa9><#cfVyoSZ-J70 ztv-~zW5k|jdbN!cG^VOXdh;iZa^9x!j{I0$TTfG)*hjwFjBo4sej^(fHW9tbO2_vK z{Z^Rz#MF|dg?XV{aQLG%+oBXuay_Tr|I%!h!)dK6B3ZVqOX=%w)5UF}8PkEAjH8p= zi5`Ack2zM$t8S%(0akmwDaSddDLvP8KaW}H2Z8rb-M@7)1wkFeOAWnyMxqB$!)S>q?|}Lyde!FLA$|f0upRN;Pt{8Ldv7JHlR7$ zz01h?h9U4{+(b{m*a;~A9Pi=*ugA8=Rm-2Q_5%;?Sy|qr^qpW1_l4>bD7!p{nNm_i zVH`*%gCtYzCrnVDoNAIg=}ln-4knqjt`q=`iaQcu^u>!$0)=HkG*Zm0n#k~gCV#~^ z2+6zP_eyVme?N0C&8{Wy+C$NQ?Xl({Xv(-j8>BmM7w-1tJ^;gpd~l*vND~DI;X5%Y z^I)6IiqW&I8)rCUly2R*fS7u$Dn{qA?i=<7O_?PfcTn3%qiQ2RT)WC(>SInl3@(H6 z$@IDN#-otxTrWif)dV0e^clPLSlL0VTp&d8J5h+fJW-l{ zWfo}CP3M&ik&8ipsPaPgGtQhYWVv zi7)fYXTCuJc@khw=7*UyO&sPO^2kHRNT60PnrAK4kh1D^u0m_CU9C7ujCy3YVo@W7 zuehGxu-jALY7=o{3Jk_0phRbQ&-vS%zZZW^b+BwQ&smAZHC}2w-Pva2!LRr4!41OP z6L;vPcj&cwcB34EC=ODZ)7bWF<@Y6bwuc4Y zN445jtJRa{9cSU{uE6U{ZnVJRP5XHD+sNN9UwUc~ekht&39(o|5~7!$b^M^SvpLwO zWM)s1DPzTmV}^+VZICf~$9_8U=K;R*I1Ca~9?lpE%!=n5n97kNdOx(NjJnwx?_8aq(F)d^EM_$le~B{!cxP_Qx;iHy+XBnU z%ZozOTbx~o?=3+Zj37ZedS;y~Myd8r(9Y@iMbFVGMP9tS2v*erY;&tXSeIn6B=76IDX$$53n|CJAsC*eS0&j@myK4_f%2Jq$C5^Sf_j#(h&vg7Pd zJf}Mz4-DOMP~TO0l!abUPIieww&qSI4upMMi(^@X=e=i28;c$;m}{KW2%fh|ahNI@ zjzX;Yb9^Si70wV+mwUs)o~2Z<{+CnrLILt!Brt`KZO@XEo1A=1jv!J27`okrQizzVg1LKliSay4sLgI~|=K)(SiFbS)ywxlIDjex);_oSFuA=$l}2 z?Xh{QAh|USsp%19(o@k9W%7pfY3Pt6hceF*U}|u3g3g7U`VH_(-JB_+hD5YP%DJ z7~M$}7TZW4we0~hJEPR6kKX?clUVK|L};&5mcX-pQ@$O(gM*$(8LwhY&g`t;%I3vY~`ACYIS8VuaS zA3F~5%n+nmX10h(6FO94dB;IW75y*g!X+VlDfa z#oxZkl#%L6yZ7Vom*-@|1)wh&H29~eaX(Fid}YVt%A;Of?Q#PQ-F^1uN+w_rAtdt( zhiRH_Yjubqe}n2KLWEIcwC)HHj=B_?K;9fV$2flK2Sl#dJwHy#ZiI0}IoK5UUre)Q zR*?ZcT$^dA4m!G>H+u2UmHH>93sWF++<;)R7(Fw^sq+(bBG_Q_;T|WCA(Ix~8@;`d zLq|5E&HEM5FJkI2Wg^E_*aMgQS$<`{ytFDegrhRZ-wok!2$@z&5A`@L<^yn14lViJ zAZ1xsphdJRcmXN~V;6&TuKx71$nPdBVT6n7FNUCJ@DmSz9z$?)-L}R3eYc}!zd=Q5 zOtjbLSOj&@m$PZd z5xC_|vdF7>t`IFmI-6ndt`q-QG;o-Z>Lm~nvmxQE6!cyRG)7(jc^lv~X1EXZ&^Xg% z>j8Vhz1Ox_;qP6i(?qo2xFexm^+WJHl5XWRKrQoX?JD%A?x8mYd#BDDN=7{jNc)Lf zi1?(C9`}`!KX+|Jk^t~sDFpo`Q2S_qV)9b5EA95rLoq@|0EnpOCG?ceAPs&-4sgUG zI*0f1Q|eu0#A)!fKN?Z3IJpM-OdpWoZ4EQ1 zT3|M(pyJ=wUP5s&@>rV#5@R4CjUl99Q6Ee`Adm*cspnDM14D9taPm?|C!rmU_2I)m zj&{x;-F^DHunA;C>u-_vs@Bt1Ak!)K*^ysYCysUk3Z~_7vFSnPh5l+uz+Uw z{L9ZpQB8E*jVK>Wz1jy_6_;x$e_0zLh@CE8{!!0z#di z#=bfwTC~;!7^M9W%h~4$)_MT$1P}2xTfUZ#fV7ARq^4VDf|ZNvz54WJYt-&r2*E$v zVK>V!e~v6gj0y@ZLzNJkk@Bms?2wFC zvM)LH5YpA?8TIT1oq0N|r%=NzJ7ySv6Y=^!pAd8owC64i1NCNVm8Vncr+?cycP%i! zU=1MLtJEXEUt0j3@4N{>QtR$Wvj$jNg-5Bs%na@p4Gyiu2u=6T*I^vOq=v*O-8u`? z{<;NVE-~<>#=l4l^I>mc5HLW@`-Fz^%KH~o6)?%Kbsj3Ukn5Ru3XMFh(griYN`HE~9_zymnqB1<6T%jD0rnLpF zG-WUlwhT0RN`R}`JM#w6s2EyXEv`TBjs1*yZvS}z!G4l_tihm(J)=s8jz4c`D(?s8 z;o_4c@v7dUeGaG6vP7()=QYe;tF+w7r-L) z?0%Jt@&|L__7up+ucsc|xdM>tj>m&PNlpfc9HSlqbk5zR*kkfZ@s0xo=gD_v9B!pq zQA8^nj1+lK<2;IeYveOuZwF#7iSe29k55aZm~5ZNDi8p09bHz8n?;}uznPL@irzKD zLsswA#auymuyh^l08$lrJsel2m`D@0U^En+!ZZx9?9uhhW34#Y;V6g8dA*U_an`{HXM*wGaYAQ11tKG6OVU z4X^SruNi2|@`hBd-`Kr>6bU|TDxc`y?j68V!5(TOEghLa*~PH!_9P;4wYCz{@&5E7a!6Q+2ogVDEq?q|3i)pXkZrmqoc)tcc5vi=*{BYda61cpREm+mxL zg0o;zuhOTK<7m7m9)jsUkw)g>Es*jk12xkYSuXYdeFO;o?Oh-We1;UmjuyQ>kMc~l zbI8opMR{JdpMtS}YRpwb*N+&1^cu%G#oz0mL`wCNNo9-;J=UZQnSWf>5PT z4>pg4^EObXi5xCJd+v;8b+3L5V`B9^wf$rxDePHkT?x3%o^{2_qjipz_oF~EO*tX< zmoaQoK*wv>Y<(Ohv#hsAM*;#K+k$|=(bip*(q`13tprT4l+PZ{g-Ziv z#l;it}maGWA6jI;9W%Q(Odd$o$ z>7j3xLY$eb>xmFJwg#3XPO7{Z1cHPOld|_+LQq3o{Ie#@CbR{P{oZSAK{$eDR)8%b=o5?aQY{7bT;Q#56upg=&94H1*FQq6!vU;7C3i5@8)ip}cX#IXZ$p<`t27 zdI&kW>#gdLz>=nlw|hS4pWNub5G|t?Tz@n)gzOWwbfU!WX8FeurjE!&dz{YsXjTg2 z#3SlD#Zjel+W@p&A(n+v17f|JV}+coOH1U}?{Dmz!4y;qc4n;K5LWlMxbJfLI)l5u z&AhD%l*zQWPj=t0@{alr6#{Q5RHBc6pUty3YBtxXMe!c;>ooVb8(!XbT<2&PjL_u& zrgh$9U4d?EH1mfae)G0$7yrRp&hDo)Sy$a~i|Jbk-V3h$SqATS6`CK=n^6_U;D2f` zgr}Xjz5MiX6u{L*qx{+Jg#iqAm9fz$RT{y`j_f7g&AA#0J!Fl#rTVc}9}>>#2cJpU z;I76p`Y!;gRUhoM+ZHqWos_)=8Qs0HJNx6GBp3&DFD#E_^hiPqzdZ4?J6>uqOnz)v z_`9d(u0qWgAuC?;vC3ZoV;p83*Q7teT)}Pe36V+~;;Wqkk+X;=G=Xff^HBZWm+mZ1M?<4S5okI!d^e*)xKRc&)^5vdpb@wmZz3u4<;-l z9+H{&{Z6k1bj6}f3oTVT_-NEyCGuV_8z==k=V&#jS&oGuq;vE&IVy5f-P^tyIU8 zEm-mjyVs=K`OW%mgWT!}FC*6v=eA4Sw_it0q%R;cBZn}N_A(wu7JRbW9XVSO!D)_k2>0_b_mWl!V8g-4jK@W86<}Bac znMwzJNn33f`^zK?ysm^42F?Ok`QS|O$ERr$xCOmdCnoB6jdDiAlkXvZu?Xh~WQkIs zP3F0)QnON5gbR-|b0x&(e0Y5d%X2+lVj7WtN=3p5DVQ-ly&YD9x8_KG3V}wQj*!lx zWO_0w?ULHb_azbX>96*T@OyoSB!aE`Y@7@!raWv3eVb&mb>1Z4B88%k+#Y(zb^AW= zgZJfjlQ`LgWkP3aM8Hbyym{7j^Y#<7(R?w^xu$!u$wzpDz1R2mJPz)U^{_0ve7=!a8SE*>6q{Xtno2o2X3SlReaPZIE|_$1U3l3;_j)JYgzd7wu#z#n39iL8c?ltUG73Q$)kxa%E2hksrfe zw-c=X8wE(jB(RY2U?t!B$OKQ8hYd3!eJdyI$;uDv z9hU@H1-rRvR|WRgXy#`5scRRGs5PxyY!1b7%v?*MSV}$BUJI0 zrswVXFuq$)g}ZT_*4QV1rduU$x z97y%8{RIqgi3p?UWn(&zjXulZ&#zqvv3HOZ6fWM_1&I!Rjns>Ju{&J#w&Ey#*ZL4< zglox6$P3X4be$dO=NHXCCQnyy&E%NMYl(iZMmEyPN=Wxk&t3I4fXKum&EQi%O?v)u zlmzui{r<6u)>l+n!^@`rpKtfQ?^ss)f#QcO)xx)H&qMw*<|3zFs+LhgmS1|U`0*D{ z>$VnaRFSB(>J&XPeqs+yykJ%nrwub_I30EZ@fz+6eV=2v8P09S0OgEOg!Lo z_-1_21G9~G9X$2`aS?yvzL=T=K@>&Nh5MW#mw#Rvq?z(7)kabyoH%gQ+HAqfUla&b zCnrdC-{wqwfbyL4oeEQU{z@t-Yz!YkZle19Ij>6H;?@Tfm-=sk7;|>Jmmd0kEJAsL z^(@hYVQ<5P6DH2H3_OlwrB=YMyzAHAC{}S&acY3s;te!di}OROk^;ILc0raXw{8s* zQ#t#ysPQ=I52~*vqi}6Q7++E}<%XIsGdf6M{)Ug?cngynA1c>Ta7)y!q@i6_{TR+yP(=+Y>MTHjEI_aT zlv#icTkDyOGchtg?Ijvk-SE*2N{U>Hr<8mvb1)-e;h6A|+qM2o5vkdm%5w%=nPv)s zBtcd7_*!Sp`AQ9X`6v%$!h2eXiVE4emsC;PBJ_tiKjJ;OELc>N0C}HgrRUWqSui`P zB;B1-PM73yobU6Xqa)gBAaqVSNB0L?-~3xa!5*u=EvE6zdynJ_v3TJ_vV-+K+>TFp z+h3UCCV-ojF$t&<#ZpLP9ws(DelIq{u)s=sn^ z%Q&J+N1J!2nnw1NK$uTqe_2|&@FM2C6kWyr5uP7NOA6^KkgkxpFcFb%_47ayr#d1gk_ft731l=5BB_)JRWuJSFM zas>+Zsv**OIE|M*Z`7IQ-mXlK4t);+&|1ITH~hW-aNpTB2(G>S9r$nf$Prk}_xNm^ zYln~DKHmPqUMP!6`eypErrmb@g`5T@s|v(F4z~;WDlPNf{noNv+HkTTvPb>zHX#|{ z@fq1bCx<;o1htnjzYe-rf_w{vOV|U`gCq9xURO1VDT^tArI6{~Wn5bhXc5g*Kl=|ZQi8#Ft|k?5j18gF~xNqtl1Sro$-1H~D> zY%n7O`kviXQ=<={uzjtM^oaXj1i~AO#G)qK_&2 z=?tWDa_3Um#g!cIA!1I4J2$4x<|=2IgY?=^r;nCr@oo&0kEGMGF*#NN<9zH^`?0}w z)E?5Bt)|bz-%X>ScYXM~Qs#lx!e_~Vr*6O;1Iv|Qg==-_QZCObo=Kt1eeGoJNmcai zn9@Bov$Q$l&S!s6AOk=P&xdz7-eeAXRSo&!RgGO}J;gtjgi(z_U~&`-?WQT88?8$s zfBY4bh(G)w495q-TC-U&hBeqJN0O?!nNuU{=By##L8culEBwibH9s7muu6_|57 zYBOSjF)KdnSy;%q*wa2J{BdR4qM%r|}ZK)A`2cHHyEWGQdyCGl;aypjxc%r#n&6>4yN- zyx~OjLVCwVR_aKzFwQ>Ded)?4>N%>TDBMDC-nq#l+3bYp%+yACN;gOXp&F}>)?*ue zy))W0VXAr;rHe;2$7%ZF7yRny-d$FxuJ}&X0-DDcPD;d%e%F-dNN76C@|%g3{g#Y3 zu;Q(Ez$YO%*5s&>8jFFi0^a!}^4-Wui>TN<>zHv;id3q4&3r~0QG{AlCdD1Tgg>syfkPY$ai8E69 z`?YTbus7|Qj(YqOmi;Rh=cMiScGzFjZWqn=?#=f1j&Dwi^X%EnS;nQ!Gq8$iVqSX2 z6%)$dL5%!$c88Dp)+t2DY~bE+m!N7Ap}Q8(C}P~{I#7ak100a)dH!SK*bP9VkNG=o ziNYko2;t~LD`?4dt@u;0uslM{ipNGI*t|UTC<*!Bbb`cVU-dfsye6MeFntD%;?UX{ z+@b5rr0}ylsYE?R2Xt<_+*BL4tY|Pze=rX+EBAglNoHa01QVq+QrB<)m=uaQbpPps zHz4^|lh_txQq=OK?sT>9=+g^8CUAgtG%#+Pr%YsF(nHnsrL1>hEG z@$-J^BLAl*#!HDBv69E0M|*m{{dnS^lEDxaHpUj3ab_Mp&U2dbFaWKPiQeBEe3vUA zEDY*@s|ZIOnhGUt_^2AJl(Y>Vd6|k*KhS-Wy5#6~YK|*1YwLh@x;gbIGOV&np{FfD z-S&*}pP~dd5(k~2>K?F(il?9clOV*45ulLV>*fZ>rWdIT2X@y&i1BJ`|MOQ+F+u8v~R&~{Qse&#{AX=8^M?0kV;Ys3&0JH4_Y=DWAxR;195c*}b=(-28R6>ez6>;`d6nY{1mGBM}^KS>C0I zEwluVbgJ;yXp*U-L`W1h(zXCoPuGtg0yVUrTp zmZLgx3CQP0D9MuDlXp!K+xkS#?G$3kLvb+Wq7M>letDjVQiP^tTY+BC!b>8QrkzO<>VxZ0 zf$WE_qke=KQ!B1ri0o!F8MAArHg~*`Nkun)9!9kG_%%j_eFn-2pUZFm#2!P7)&NAa ztK8k5Y(&DbSVv{YZSbR@wb2!c1X=pd8@ndJ9JDLEM87U{01vMA4XuWF%@?sYQZ--% zAe9|;MnGi3aj;-`Y;~d~eX=49K88}oR6*#bhCHve(zU-#nB_472w9b>3cb`pd5V7K z{Gg81o5|y=;Z0^Cd>uvLQFj0U6B2o*S~h*SZT<4)R{t3x5XYNl$ZRcvRhS{+`( zV8tca_QE9>Lx&>xZ%&%h%V>PxzejDV8exNxjdIe;^JamN4qLVs)9-qZQw*e^%oUd( z?KI5LVTkebAjnwa55n3}mli+;Fti8`A1^x#78RmSn3u>$r6 znnG^Ffwl$l65efot6xZIn|of!A729sc!!5;#!he4KelTK=*NemlcN5ia`4Kbkb?H; zmLw<^_d^Z;EA(hRdmEvOrBt}H3!j~j=>!sC@H|+mv<&ial5m@Plm##YLr6|N*-vod z4p2IHat%g~PL~4NER}3j+8Z-EHS$+53hrUz^g0^8>SsA~L)we%X{&{8WHrey5U2VoL?-cBS)MN)#283KwNEr)dMCom&r}PI2 z;0}|C%0bGS)@mD4zjU@|Kqe^ru{2o@L#xW5ccInx#RuJ@b%Kha1x*j)%G?xUa))8W zoGbK&D10n(4rOu6zvNUDLM^ie^hUko60~Rh{6ToKuxRE{@~yxGL52&1JsL%6~im!uebYe4TFl1ebr5u0)7(tV$i~H zi=GP_m%V!%yTep+`}ST#>J7haivd;M*RyorGASZ5Z-{t0_g9gdPh zSnpj|8vr7m2Gn#GdNf85ol1A8DgsWv@hn&U1e=txZvZ+IGt6%?@6(nk)0^1~PRii; z8kmmPM*bN)TlMqIQi%fr*mmkRWLyNN6s~!;eo@)14{#Pb1D2n+XoQsjjZSHU4WaeWwH!g?KymOmFV_vOG#Nt! zUcF-M$RFAy%)!xr{+!G%4Ol=sgeF_1j?y`1k1uS2JN7N^1!1~UXS_l$M8=%*`o z@7dRlVSBVP+0{PN4x|&~F|WJNC|6rpz&>)<-K++6jRaZ6PPvn7Py^N+$9@(LI(o)r}A`$7-;MgX4vsLd?ila=!5Q8gfZU-;zK! zG6lQ7QYH=m)#gzIsiIs|t;oz~^V0BbS=G{kwv)MXKX!$fJ>$vp>97fY^(%5&2qSt| zgc(M>tf%n&C=`=58OS2PUgE1gGQ<-5^5ON5>Pj-No!YX+PuG=f%j^$y^CTOwy6o>b zD*&LS@+MU3-u1(;p9$y5R1WVpK1ly{YFGHuR~Q+$c9UazeScMBmx8upb%ZqPye|PgabaK z8Z(a^g3?*c6nSzhdoarII0s^`-YeBTljutK)| zXErMz)Y^%Lcl78mkd1JyG(BiP^Jx7=Taq8jM@hswPygAy9pV81U9?`>zfQC04%abw z9&tod>dHC++1DsNJmVjrBzB4Ob0Ynh6w-4z)#u7JsiO#WeqykLUM^;Iv)c#eg*Wem zQJB8K^lZ43OY%Ajgs{q*%FFK%j#c*Iv!C1abg)2rFlnpG<%o9U1Ln|?g?C3D+Q|#8 z42miboQfxD7M%~39*sY1!!!nSjizShHoxD@5KTGnqp~&UK|KTMQB-{*qHXW3!yKBbjlG@9hndf?FRzsCMTj zL1=;twZx^t8uqD(w^5siaS9lr3VTe{bPG(sm_TT`uB~x(4Lu+iwOKGJtC6z^D-~*|&ptd`;MYbkz)w==x}j%Obxa(1-Agn)?A3(= z_l{e^a2hv+RnJeSwNa$JrAecNA1UOH{vMcLtaI3IFtR$bBoY&4c0(_^dTP%{MvrH- zqqDw!)SdH@_Xld8q*w4vjJBaL;e77>uIFhB=1(eB-<|fTT6fMDKPd;Z$&KHg5NGJ+ z^<jbg0?AoMC)H8Gnyb$&-@I zy+`p{GG!N%02Wz))4;Dmn4gobh?EY0esG-7+!vvFh4loMn`UC0g|2>2#;Ks;-fSEM z-lD#Gi`tlU^GIbuCetBw!s^N$j;6yRbN9tHuXs zrII<2(Gspx-S48fg!epVM)||!YV9kN4RvM0N>U>+r))^YPO``$oLjFq*UvJHS%vvQ zf!M8;7|i>57r{@eviu826RurIm+b+a8!?B$>Kxf|f9pdE4ouFfW0`%FQ^F}Lp0)v= z^oxGURBsodbjm>Ds7)H^FD_R3u2qiK^PSzydnAK~2+%aGS5e@uXW~XFP{3^0a+7C| z@^Dw*$f)Rck9Rd;da)%bc#znIDzE`s02o$4mj@|`U8@8TWhY)NRT{j;WS4*GBKllq z_L{{IPaA{MBLfxy-c9e}Cl^9mlB^{6&>uT*sk2bjJbL?DJ;|IfX7Jx$N}~Qb+?W%`{<+ zI=OB7;s-Ra_YZF?cpNJyp=$A54%+gdZi@ZI1sK`LQi=K7s0CI_jHh29ps!<1vo59w zB#W=GG0qWeiE?;}`Ovj!_qyGiZ-a)t1GzAYNFuI1*b3Fa%fp6QRor%3DrJG`K7*9R zrn325BKa6MXuZBqRzoLrnnU-;$`k!(4I80kY8IJ++26)ZBKx8L%+`XZRy=SOQajzc z52RalrAk}fb!F9L4YFq8-gvEe2H)Y2B#x^-;c&wsQimEgq)aOULn0DU2-aEkaH{@z0TFv)%>`DohV|5u)7Ws z-mp&Z*i+f3xK8WvJ*#VM#1^fdhz_hFdQkQb-<+WCDHn%uv`5hzKW^PzKBm1qAIR2` zF(wQIX7+%&MqMTHUBq~`U=e%Y*zkK$j@I{7z%^Lh$<^*Rx4pq0cP)csX3_*}4=wLc zau(&^FkDr+`y3@<`mv@4owEsE^HP!*B>h{lB(iGQm5R709kg7pG>2qVLrFayvXu z?Elg_-eb)1g2U^+I_e35}CavR^_{-5pS;S z@cNr}D2Z%EKheLtzp3Cv_%SmKZPUvH6=svKR86$+6btlJd^EewKC`yt!USTw>p2xq z+_`Ok=SMo^A{h#9A`_MlK$5j_2P$H3U4RPB^55zdS_e@*>@iCH#(E}e_NQSFll*nG z+n?1~1c{>@)DQXhQ0rwHqScH%%|VAYyY&ehG?TaMyZu+NJ6{wJL-5M zZ})zhTdc)&=Na0D6--%OS&9Ya3F*~Iz+wM1R%Bit2Yd2fmwi~@2V0iqpWMvlfvSdNipNNO$~HN5r2lEg$I~t9x-?rNXb%noO0+=JY!*y-V{F zFH8LSbrDhoz23RRip!4Olidy|5V90K!cMP^pv$61e#0yJYSo74nZfYWbF~FTQqI_1 zr@Fx&6O=5(P*j!Q(aI-zWYXsR(4MU6bM_VUiW3a}Lr;d%p)gpu-)1$Yl(C#zD3!LE zMQKj`+iP5@lxmJ>a6&3a>bmkIvIJG`e{Qjj4 zJ!Vz%K+cK>jY~PtIn=P4)-gA&Y0h;osZrfXq4cg1?_q9ie>xX?QF`ij%jOB{#sfl0 zAK42_${hT*50)GEXt(+#@GgqGn%hJZy{V!@U$If_meCmTF6__KmT34Ifr-X!%8Ew^ zh}qc8xmdT!Z}GX1kFlY@X@zZFOcI=48u&W$hP_2hgh5x!=c0U@w=#z^t)t07?}WN# z1>eNel7cKY!+oSIY3W4t(wDS-whCy|>!1BLV*Fe?NL@!J%*EA4?JWwoG7RU7;rW<0 zts6G7isP{hkNBjxeOH}R_@sw0jf_n-!_vWr;!y;q+G9Z^!K(DTe46PAeTx=vY5RWY zo>_O+$5IOB!EDZgCW{c;*it@TR_9g`(F3*KPQXWx`mEAfheuT@{>7RMJ5BU%4}qDf z>?EIdu$4z0Sy=dMp+^tSpCM9`Hp}d&T2e~NE zx8A*`ja~28UAzg>cE-s^7N@B1zDYmeZ$rLF?{H(U#=IeTk4;CA_-Q& zQ|R%KOWHZyPXH`qrR_qrHRYqtL9xJ<`8CXYHcRo|XkD1wZgn+TMk4gf zT@mG7=COl!eY2{f_bSePxu&moZzj8hwUI+eLoVuQiKet^e2uJcbPXfD_}&H$$*-J- zbxomY7;Nhzax0x>4?dO3x8@~#D)Uv2zZM(AQSB2f!slsE{xJUH6j@dr%3^2%$y7pd znR+WaXbF<`6beFL`%{eg9xp=UOUil{({w%7R>zTP@iXTbP_@abG&ZBthNoYNQ0%g& z49YlMBdYgUSo6*ys4u)Q?)WZ0_GP4>Jtuu__q)#stub7CtMX9m&4LQcfhZP=MX#|- ztUhyuH?M2QZktbs|KM-7;EJ?dei`K}q+9p>J;+73BAp($5}+v?DWBlnsLYlk2)va& ztC1HD)Gimmd(5V1F;qE*^Nj zCf68e;{bK&f=>sZH?2Z$Ydd+s|3WVZYs^N3z`lXc_|CX~nT&eMGx}C5kNfws`z~L# zkp?q8`K8`q<9*P9KF`?`T}BuD7h5;iE|ET7;A~S%%s(n}OS^Ezks^yFQ;2@|iLm4_v$`a2Z7(NQ%%bf6~lV*IGZt7-7S!zy&QD6Zg_Yh`l!k+iq)|7q4mV4l>U_5 zb_?(J;jJ9}at;jE2h0uzQ5MxF7%{}Dd^+7*<~D8c9HKan_RB+1Ao-?etvBli2%*toAvP7m*O(^u(6FNM3>Qjl!1= zhw(AasM!lL_5;$-B+V;Wxq7VPy%TZ;Tkld$Cab<2cG`wC6P(NnA3V2QpM zEWl6QT@?SMo|63fV^*@mL8gAsZ#>YQt$(vl zd;Yh`xhPU`E`CpCKD}Y9#w33L`_wJ(4TiVX5>@JX3>J9A=rM|8b6$lJqfSbY$mUjG zkUvYaXem3XO?!}}REtu#ea#TC>n)3t%|3J2G^J$) z$9YkutdR*Wc3CB4RVO`wXSB)sZXdsf2=+D=b+oBT9>WYzmeAhTf=izOQ&Kx_ZMF## zGh<$hI{v>49LK4#XA&?AfU@5IO5WpWP^X5LLCcX3JB-m`1P9!N7$eVog4p`WzTL!Y zrD%CY^b_Ix)!QjFK!Re@iOa*@$L?XhQ!997j9Hclq`OWhW_Qe@qmIPTG6z2)+q1Wo zAxK`?fy0CE%D~+^@A1hv4~?<1=7p>E4pb zxe>h|M2Ui7n^PKA8X<#ke6Ftv?nUO@++UJ6og33bZ6y!eRm?ZInWh9$Z6I-8DKG>W z-fTZy2SCCiP^z6dv*Tg@`CA%b7^CVNu9afbQ$lI?&+h79Fi&#q^Uj)Xe71{u+7ei~ z_ln<&{kD=vl>_$c=N!}X?00ULu~qo!Ut^hXQ1%?kE}7J3bJZ5Rj!dZ?N6-x1^+vsfIkvjuBYj-eYx&D9y=C^W~kraG>lHbHr+o4 ze&ZF78=iB8_#CDNkH5(p4r@9tBZ~=FK8v=dm*vIuhRq`V;eEXpjnAGXDLZBb$5pXC zhyu-+m#ae&+11LwJb z*RK4DmG{^wR?`bb8U-iXydPP~?>|QZZIURC>Y4q)3kaF0=+2j#HqKgH#U4-lQa-RB2+kc92asHQ`%i{NcZisVm_}ZZ zP%$_2(tscJl{=tV!g(J}ti}BW=l93#6P%pf!O1yDd%A zDeA98NK=OH^SK{Oz1Nhd0y4-S8}1zZ7+dse>q%ao!yQo5HHMnBtw?mcz;B06sAb13 z$ee*9hMSnup zyf(PgMA;f?f+ZZM!b(s?ctcsYl4DXT_Cj}F#oAcf<&sp5!@ru6Vs4;8CU*MM^UK3X zRZ7A2;_$vR83>Y}9YD4N>_9)+n{@Eg(xMho%_?WtZWiUOOq; z22-!EcRP)6)<_YY;KYuM-8Gz;1mc=EAZ>lXt+Q&@>?T(^MDpi#H@F>otde%5k&yB_ zwtd#{$qr*3D&3d*N(wmgCjskpf^wA;G<=&~VuEZBp?+w&p)kW6gK4hS#H1zAf0HUu z1LcSoKc@_Nq-=B)A7J|dGs@YKf?#dmEnPFG7XH|sHPvj*EZIDe*U5wOxg8Y9)_S#G z{6DJBJRZvRf8$J}2E`1rWE*3xY$1_dV~Z@6Et0KJb`lZB5|dpL5t8rk|iZu zNQ^B@wz9_W^R%44zt`)$&L5qQn&)}ue(w8oUDx~4`=vMG$1z+Ub-1EP1;930)CtNR z{QERz?L;H0Ci5E|I#skhBaAk1l-`rzR~#0HZBa4kOS)Ebkl(jI@%{KIHc>w9E>(f8 zI}tqR#}Q%T^yjK81Bj=8@a4Xf53Q?=1!zlQAX+$Eb&o}l;kGkm!HTrc($QuoOPt9l z>U+XSJn{)fmdwqE`W*R-Jx7m%A^u>wR>5iV8w0IBmVVV-TnU)`PXlY%If3hw_TS6e z$cpL-x(({bEbM9v_h~ex36c~oW;4Dfn4*2zaZw0e$Y>boP{m5|zCX^{tuDXXnwc$| z5`O~9`t30x{q&TWkD^|;%`hdC_tQk1ZxDAOQgY-?NSMDz&w(Q3Re7Nka-g#opltR7 z{mG@_p?!v`A06fEw)xpZRyhGbY>JP=`T&qB(RF7&`D_0Tp;R}qh&Q1h+!|m0;`BD0 z%=TE+vQL7n6)W?3U;Di4o-|9>2SQm+jq!Z93hVJa4^-aBJ!9BSdWu(-q|mTg4#B8; zTo!;EZ&P>w9ROfMsmO;`vuiYINEn;lr0)<~i}greP+`H%!Q1X4v~2jmL7`HRp|wF> zW(9fag+73+!)xL~B3;KAk{-JNU=Ad#G60fFVw{<0?y*sM8$;g6&q}gA*4x&(?3Y{M zC%6peFv6fd$9R3k^uxd0tCZRh;$T6jW9u`;08ofLgpb9WXN(L)er#{FK?p&g5LG9h zeEM2FB(Ub)3_O0~4j?F%qU&qOEXKm+ewe6(bj`AmXEiZI84rLzN=7f!RfYj!Mf!HoE(M#B?D{CHH*-l)=vT|cg$M{jNp=m_-aS0cKkqli zJ*o?>S)ONq!PsDCpGVd7-}w}avVQ|P5U*qI2p|Jt%;>QTTjU=7ft}0V$J6BOvH^Fl z;DP639Z?un+kI(XsoAODGgt&lW+{RiAQ)nsA&s6kU-szl8iq&RgWkEpM<;}#C`(Br zNs}l7@6m_VHcX8p(ot)%_CGy}2Yd>-M=8GQ82HwGoAE|`4ZYpgy#5^;Y))Lfy9;99 zvQt;3Z7ybRr6{0Cr$i^N!cDRXTPnk_90?YPGsDbPC+xnN;~n4>&3=F&oU&^C!}=@| z!%7lVLcpr0A;mrbfAiTn`v=k73SCMtfI4T4LL>+c;~-0Tqjf#8l5+E5C9=!q-D*>% zHt?cjWu6u)fy|&7^#p7-i>!uE4DMj7c!%4C+ZnNo^PCEq_IUmZ9(B`>+&Jpn46FDo zBB5OZ`b^Sg8kLFXt*Z}rD6e+Pdr;Rbvk~Z!TB#}Fe$!1v=Kd5*F3@B`2p!4Od!u#d ztZGXTBp6J&&ZQplmb%iyIEJj+&^Zxtny2%SnY99VF%Q&D58Lm5r-A4V1k!e?GK+=81_Ia}!Jw z?^r%8`zrGH{=};Wd+365#o1Xs?9oxg75^ogDGrsB&}G(_Z(YdsKzi{6CB&XH8RH#P z-C>FT6taUxZI4l53FY3>4rS+FwQAxQP;>X5vN==Yey4n)c|W)9LkUdlN~KrZqZ1GM z=0UwEp2GX?s9!pIV_)jB{H7aAQ3>R7vnMRC3mx;^wtc6_OUX)5V*7p$LQaeeCAPd{ z|DG_L{HiC3k|)Z3t(fpBcL?3d>eLqT63Jt#wrNv!T79_y;W8usU=R&hp0bC1Y+5Sn2sr*(mzo*ns_N86rV|4$-HVx)evh~T7F zDv~L?PAk9E`DP4SkRkJ%k9mBx8Ou^{1SEs!Eeiy0qfg;Yq@L$s-4TXjnzYfzhUkH6 z@+xi3sb~)nrkq!EFqVEutv9~rruX*o9RB#bCDu3U%DK`rX~ayB)@|(?#TJ@dvMyf{ zY7D$T1nT@(mxW6Su0fOD;YFv~jBq^5UJcYstizUH%fzwuzfyDOM5kzcojA zzzA>h0U7kn8~tw%v29j9s0kF3zrB*tY=op%_h6Hk~h_--IwoC(<)W}n`FGXz;Lf5(O z*Hj!eO1Hy{xGwd32sJNigqVH1TdSnIwzk{U(x#m%R8z$)J9cL>c4LH<^(0o$rd2!| zHhDd{<*>Eme2Zi%eJ(@;Fjb$MONN=$GR%^&yi=5{`haKY6_VL6qV|-CWOAsEivLD) zj#aSn+_5mC&d>ZDWo+@R2aPB1mp1ES@JRodrX1m03-i}MiCqq*?8S^u&W@~B>%07Q z?K$J!!LN0SidI2$@od0xu5LLs!DuZGQz;cycMV5D_EC8Cy`;jX(1f3U#eXATmLP2B z^5$XW*Jw_Tx0gx%JLGW0*SSYfs=mA=ebM79);ZQgT8Bfu-tTV2?KH9Jk9#-Ti~iOD zo+Wep3tz|g8HM`6FjX3>&0JyNKFTA|HZrW}HJM9aV~l<$@PlKGevy03Q#9Rh_(wyX zPr?55Rh~r^R!@w8KUndGhu-BA;&G?|9;TGY+!_a=Og0-09I{wnu3_#0xk>MZJwEh% z9YWH=9?mbC!#yZv*!vN+sv~^c-qypgb19lV3@fh|CXefw6m80;l=5sd<~6RdzQL$l zF>?KeBq@D)j^q!M_Fgn~4Y%4&(mY@`imWI#U=VT578~|73>f3G+9_;HdN?=q+00Ru zOCwDDNsJErx8b!A-U+_W0^=sPd&e|B^Px~SimAKk5@ZH71v*e?AqsrJXu#srJK4=Q zrIF|7LMjd3HOuag-2%ts&QP{YTobN0DvD|EBgVRC{!TQWtS8JYvop8zht$qG6uoL2 zrcsywnc0M0mNON#E4cma55EX}&;r#x-Sm_i?%2tSb4BUpIay4+DK#reRBX;$Jsmw+ zYTKAEU|&_L^7KzO`re!uA#JP4iUW^dpyeh~4OxLQO7al(@j-K~ge6ZhwC#;kjV)o_ zkG4L*2;XB%a*ZM}n%Qv?wo$zm(WOV`lxuEO-zToW6}ckmYHgHWh7R?@l+5<8l{nbK2~PGt%jDiBdV7euaNfmGI^`V;6C7_0f1>Qr zh00bBsJxuKd`yGO-iB1Au_PVdxP6T`iY~H(I1VH0jsu2cTs=`qK2yBo%NC2+C313> z^^@9c!|VZlkJK-^Zx8mY3={2Q=ew^!8YL?GmG04!uV+R+TcbFf&$D-~QuBwth5UMN zQ5|Ay5%s*bU+_Drq?w zga4s7_v%p1$IsK&euE=G^6eXXcF(SHZj*Ku4q@|1pMN5u{8|>5+os0t@7GC<317zHk?yjEFP&?a!*V8sL(sV!PZvMVb{5neB#eS%zdI^e< zWrB#a9AwRh3NC(dkZgWon0SnL!Hk0aek4=q4qbxDixYp1^hA6)#+Q`tL8~COSXxKB zZ?98-%E~Dnue?O7MU-f{elIO~mu^Ag>`?jwh7t)Ax0W}t5a>vXzI)~=UOSR|n9Q0G zIbx=iZ2#K)cu*X(8B4Kv;1{$m_ls*oit%2z-D_#jZJTlt99e3plU==#Kc(P!BDKA} ztS?ywJ@KmN=|Xg2+SSq^GvFv_YCmUVp$=0E^Dxnxk3E;Rrz09O(qlonpz~67c865W z%<0r~rhT%SWc>IxHWk^#iWV@{K{I0`K`W1+R?~M~ZTpk8djka#jFyOfRL)+~vafOb zc7vs4J!ww$XC=yo*qhTV*pm*b*aqNuuai9v3NYSHa=p~z=lt^{TehA(s~4%w`UewWrAPZ!V> zR?_RnKQw9!h_~4vLPKjo$*z)^=BanGo3pe5)mPnzYlu1`h`VY;kDXmlK{K3*GAK7`j-sbpLhSu)5iOuC^=<~oAoIr-q`t_ zsnH4?tZK(!y0dmkd@uX&@a%~?H0XOb=0slbqFr}@J#trtEd_4Ujj&}(Tpik(l0VXE zacp}iF~#)2eLLl9%WDH6(H0#0g-+423Rep)w4Zd>-?vTPald8WuA1&E&;Y4ZZq8+N zi+P1|18swSr-9w>_3>nqcb8yF&kcE|rqjAiO~|*bi2qHY`)kV|z*XCCT>JjyT&FxS zO9uT82Ob;wx5ANKwIQ~D7N>DRYT~i5c~D17k=-VY5t=uy^&YJcJ+kmRK-|h&VEArM zVv8^rF7D%bKuXkt1m~Ckp!#N-qu2H}t9M64g>Rv#Q>m?O`9e}L(-4OEY_fWke^cm* z;Yq$j*MiF8y5_1zR@C^%{CU4wzj0H1jy(`+E4Gu&4%o1fW9VgCISy@U)kUM#osR6- zb@Z(l^nptsaQvDj2t~4U+wQL=a8S3f-IEImsy*Nub+nip`ld_{|D3JG;&zzEv#$t@ z%eQ=^wOiQw088hhwL?WMP;@SDF4&#Uzn#WHz$CKwO1yJ0Czs(uhV@cFUVGi-w#_R> zQ*HB+t8lz2?B8xynMXza4F)bfDDL{@14ZKeJ?rBU-Daxz1upTChB$*YuF;WkHk`7+ z$ziWhhkYq4`*=S+k^MV;lVw(&u8(D^Ih0AWP@*OnIfz!5Y+J0sZp83DW$)G5lWr%t z{gh;v!=So5uG}O4!V;>Kad?heI+|9VhtU`P!(PGv14sG^9uimdI<2G4AjOYKgnC;@ zctBF1rO}?6ofga?*HfbWk`=w?gom#BSvnmpn+kD1hTl_uZm)6*-F|)4R!_a&nY+IG z-#z?!pvUT!9MOZ^Yzn2Xn_iuMA+E#B6HR1$>`H*DK> z#2%*S$jMLDhsj#1E|-?oXfD+uf&Vj`OyQ#bLzCZcf^dDRjsozo7cC~HA6q>&y!{5Y zKU9Q_83fYWC-SxM27q|llW=Gaf$e-a?<07sqRb>P)!n)zPU5c^qgfaZk*nP(_^>EsN z2)MWI*u`gCXd$1XBIX*jG!wpK#5MZ|t@YdS@Vt^`vjzthYGt?l>F=dav*n18``KK7 zyyt!})&4E;c1oV{*v?7hVVaMMK_}eW_(LYcAHqz7nXKq_SiL@B?h56KYp2y;3^)l| zL77}ON&#z?(T(z({k-?(FSjaP92ISH@5L=}44)bijAygrHH>1$*lvJfQ2M(tclB1|~de3b^*tXXJgTm4K`v-$Q5oi?9!qYR@>TqF~}u z;*w&DoAC0f>^;8&7ZgrvpNx2eT_mn`W6z=RKkK%<4j^x$TYa6Gx%H3JW;f1r2=no% z(*?HwnQfOE3?*B*=GPl+9M%z{EK*Yf-*%$@XgH1fsDNc2ID($@H#weIJ^i%uJW%?P zyjVLrkDJi2r^&g=LY1N7&z!DZ2PH6dgav|}YUz<4iF()rv&Ci<``0I(eoGQLXzjc( zQvscG96OOovkzD1Pi4~ecYnSc5R$wKip{VuWHI^?XolDE+kf|H$5pc+qC@tv+7u(>jJu;2RGN%O1DR+#2NA4*5 zs0$8WU-bvC*2`zh;BN@wSlj}8TWO!bM~mNrK$t27GX{`=0sOkkA&>>SVbFNsKgg)| z0c!LDa!Lnvs#(k|4`1)lJ^4EcLCji0%L1wMkjF6btuD;2hHff)7K~;j8I91;f1%z9C|A|ZG_paQa ztxca;gy@U(S?Y~{Nb|Z$RUVRCwRXOtaQVHiMCpax(l=l;7Qe)qbL;n)DpEBTYyF@L zF(R5ILx|%_Z0D(uzj0O~XcXn{E#)g^{t$11RCDbvQ_d0Q>IleaihCj;*wuvR;BdVS z@OD?Qk_+`C*^_yL$Co0jw=jA2OE79E_zVDInZ=5Ix_e_(+t{c%()Lc@G6O)5`Q!M+ zKQb(6ztEhqf*4kVM1z=U;!5peYI@guSe)j~CtgGkCvj z#q0>GWP%_Bcq+aiT(@G#ky*&BHYV^dmd%{E{K4GFMpE481n6F!-D4ia$N9Q;uv5x) z`&=~(bEds|*z+&{Y{=}XsU_kw!E5U}+h1yK$Zz~hC4?{OW*imiq}k_!5A08F{8{-V zFu&}KchUtiPTbe?0Laiq=!BQNvjIZnKFs#>_CFw#my21Lp1Lu5hF>|&9~x}C6as{< zlP&+=52Siz78umsNKq98C8fr1HaY8hU;Mpv1_($3QSA`SOpEQCn7m>!`M`GF9$%has6~kGmd8_BVa-2 z5DY>HK~B!DL+b#yPdTkl7)N?SoaMp$Tb%K8SHh-m6JpwP1=yh{@Fip=`~m|!^%Tdq zKwZie}ZPX>7OsYKt9Fn zIgeExgVby0(h^ESCz(tHBo9}zC|Dm}hFwP{nlkSGoaFKYw>OG6$c%v2~k9Fgs%C2q*CWHz07BUVPc9^I^y32gjDq z8B}Q1f258|Ha&CYqZPyDc!cR#l=Tt1)cle7_}C@=?9TVB?TJ<8K;J4s$aXW3IO%HW zxuuc)8HlPEDnB5>kgf+uzsB8rW^kt}Zr#0pw`q?Ogn!xkcWuR0N|Vy^ziw?g%`5H` zGw5?P!trVBZBF#rEBJy>EPE#5Bth(WpXsxQ*o1g7vFz64BBzo})RT`Uu{s%Tb+4~) zwErxhJ@EFRS9|}mXy)Q&zujJ~rEPwh($eE=>EBiZ)_*|a?rZVi2a+2^5c5L<=YKKQ zBUOW`%09rtJcE`>ppYTTMMP$qIDCRNQp12K=jD2U%a-ln>JV#*csvxWF)2Ch3s>9{ zvfQFZ6vRtV>N#o&&bVV3;X8v6`7vx)C>n=reI zDqIT0SM8YXaVfZFn4&o`*WfNZT1WbK;C)xvt@A#(@!C+8V+WxaEWxL^F|EE=7kP+Y zPq`u^=Uo^t+q?on#Ff&Rpi!wQs>yQyo!iDVo2VJq82>;CQ<yA$yg`>)a>~gnl6<>Iq6;KkWS8N|&w;5;JU(YXv zC$b+A(3h{k+hYJE#;G}l@x^)2@7VkzV377hHuptZZI7Wrj_Pa!hWggAeJWaVk2zWH zaG1)PiGcq(X4ji*%)EgN72rTDI#64oeb1K^0H}poSR@Zw1#U_Svmg1)`c>FS!0W1V zo*&Lx*IoJk`(*V1M$QWX_ZxSUVwwRK%p`4dfp5Vm^Y5FG6N5)+EsbzP#P@p++HYfi z`FlCR`(xq@>BNxO-W`2DFf(N2pU^Fcu0~?r>hiqz;f*{mS!vw5&Vs=$!8(12 zZ+8v*mrB@_3q8c8&P2r>*L3#>!`}b|ik#VSHf+>^pm^>->PVK;x@t!-A)nI1?y?A} zb$NkVfc@6HubS+yAO+hG21oAR8=OE`3{fF?zQB0KqWPMU!qPX}JCY+^rh@|Nirnmk z61~?BJ4s|KX40&D@IiYK-O*mzEo8|!lb#_&&6mYBhIR{0sp)&K!4J1K8fZDFk^!OF zl-uH}c?NLN(|6H~?d9CR^gZc>e!fT$(QU0&skq0Memx^AsHP}yRlQD{lg;_P$OE$m_O?H~0z^h|^QJURBf)M!tAS*EOf-}&L`3t6XrRih9L-=Q)0xu8{SQXF8L zI*sZmKXqam&`hl7N#C2H-M1CUsb|o-VV;}01$#+I9`@-W0*zbtHCzsPLg-ZAdO7pU zn4ze5G1#4Ft`(co_Fb5U#K{{FOnO=O@An;+Y)vft1H-)LTjcv1aLt>s%JX1JX zhN0Fs+czQ~Gsd0}c&>+`K$7|a?FVPM6{ay|@|*Yc6k@$}cTZB*iuRgy&PJ@ltYfWQ z|7r$4q@V58{Oh;_nGyE<%gisOGp!s(zCgsGsQxX8;*M#K|MrEwy1}1aWnU_Qq$Vu= zXZK9Rr(xW)HvtfP@R$}v_G6;^5ns}YwJvY+=Ep|LL$#Amdb08 zKFe~_uhcBY*Wo_FbV+lRS+hi6HYDBebw6gUE27jOyZtd+BmcOY45@#MGi`sugYC6H zgpK?cRxj$SVrSwiaf|5_0e>wpSQ7Ak`<{cjg7w|73%2mp$Mbi7pT_P$Ewxum$^oWE z`m@y^+usYS)`_aiYn4hDvCEBjtfV{)NVK;~D?mfV(jqK6`p{WiE8J#Ksby7V3nU#a6xrbRPC2v-}B^pMB6#3;eR( zQKHOG72sQ2Zf*V?KqM$mHVD?dy!|w?conNz!mwYYVJawPU0^N!DBghhkn+4x?aftG z)nepude^^fej_(3eY37BmP@^-<6oTs4u6Pib*$0iYT(U>jkba~1WILuk#QUB-}n&- zng$^V{;D`1oB@5Mz=eF2gxjkSYfXyyU@P#x`sxh&wWd8S->fGJ58r;O%45z;mcTXX z)UmfNe>#&1NTYKcBcC}XLKHdCo^M$E_hg4-o97c7wsEB~(`8Tw$}bfQJncBj{^c+m zjVDZ`*Oqn%-QMA}@ku8{FVR%?>A!|H&$wW=Mz_*Y*3nZb${!qqQbSpB9s~ z?wJ$X$JEG-gm|zKR3XCIUtpdCm^TyZ9wmIzgIjn>-eBRhoDa*ZaQ5~QEx?_?HIh3S zFDH6&`|twW&Kt@KUgpG4qYZHzZ z$*l+Q31XKkpdL=+JK}bUT~EZ|JZ{9$WuIIP`uYSE^`AG3+{FTiJE{coyYYwn&NL|D z>~W!cBLhGJ@Bzv1#luT=YY=1nbO9ojKbMQQggtT$X8pi;Vn$g7a{AeBuQjT2)?78~ zQAXt-z&^Aj(|FFdj-e6;S4yszuEIpo9pQ*tyb7!&_iQNjGA#u@7;t8-P71r`KH3n` zXq_3E*!~)hBd5L7z&|#SXz6*IO_RSNxRp_sn4%CkC}|S8DechqA}lLV(O2Xy(bXgj zH_ZH9i6d(FSM`li?;1EJ+Up!fFtN@P(m(iGI24QM^Q}$825^Dj1B99mNW$PEQ9D`%}t?)3pO+ zS;Yac-jJW-NRy8Q(R>i9lHe?Hr{+n)!<=`L_3D)g9M4x8nK*9DoN)utiHnb~T6&Py z648<8kZXDxbOR+|rukFz_mE9PXmy+p1x3)$@UIFRjkctLW$_+>^>#Kihxq$$dG|$R zDkOZ((m(-5r{( zzn^kR6#Cp9C0w;8-U{if`L+1yK z!(`Rin-c|Cvxjk|2En_;^*h|@fE>r?b4%^t3F;Lhny$rG5IBmkD zSil)7B*G%SNthhXEbui6C0)k`KO8%uFJJ#uDUUPqoJ3;Z>7`st;b09$;azj~LQXb4 zb$3e#-Cn9}VUR_8Od|P+Z)JGzy>=D4ufOVB;fY|`4&xkX<>*~x5ElENw`ctNR{&Ze zM?olrJhts_5g@{x*&^vO0FQ2Nfj!-{WA~karbNMT`ukM=JWHaCYqvsCx(rWsSx6^> znfV*aqjxA64a1Dc6IvM$KEW$~|NFzCsO2V=iQneZUGzc$hr=`jQcSoE?3i*mYZq9% z{2cCxb7(b_y=!v$l3?8RV#S?<2OYOKo*$$z5sG)OrXozFw}STws8V9E!w1kEUXRVf z8JSu3G>$@xn?&J6$sK)gcm75RMQWzzbWj*w)j*fpjPH{U+0sto6dlGjDIO z_~fD&T@n}{gF(fIpj=>h=<<&6bnBp>-%ZUKN@vAT8fbUd6d23+B}hXUftEtXOkPA7 zdjzr7gvS6GpRq>DoxyV+E1jUIXEGoot6_}HAXS^uu9e?Sx{F*aK6RGDe)h&0zO#v! z@BTS{QH0W}mg! z1LlA<1~oo@8waER!M2$O?8&e7fP)W|TM}O4^z_6ykOEur*_2+|UqT=x56bH!=*7-aDD++NbgT1nuKj|Jb z1dFz|3+*N;PRAd`GwL4gz9CD33ffOjSDur6lNEJ{HJ$r3` zZsXK=vKdPLH8J=D^gWE{6-*3Pmh<1T6fB2=S@_ZZ5p@_VvBSmB_xL&$qT z7k%{T5b$+m?gW5SE7^V&S#cXZ!#rbKer@c=D{s^UB(i2b|Uh>rUAMa@HMTqafI(*5y@X3XR{k zxdF4)u4)(>^)lV&AJ#0qkCf5%SCh64#Pc0N49+v~+Zitb7tNW8mK;tcE0Mpz5$^OB zX+!x%LI5nM|Mu@enTmb|1O5musFkV@fuEOOoa(xV<~WCZlaa~kGYN{LdfjjpVm|zS zzzmq5HnO||Q8~NjbDy1jlsNkH@Ru;=r`G^!-mwdez#)nv3DG@0a$g_bwSd>xCcn}w0FCzR@|L+RJje<>nC7A-kn)Fl%tRbJWujORK zDK2PF%BWxZMa3KM2Y>1mQZ@FgZU*uaW_5B8EdT8ip(GgY-o%ltx7|!aAzWuX(fShl z1n1#hZT>peu_@Ec0!TH=EaWd_?)Vk9%1X}{U-~wf7I`GLq(MSae9d0mHV)_$gPN;264-hJTrnpUs!U@n;mIb1eMIG z;Pdp#_K-Bb=>2I_EfTV~v75%ktQ_>Ywsfb>5zMHwq2S+*v|;lvAd0%Yj@t_M8%V0T z;A0X>TC~efJWS0B{Q1I9KM}7lqk9jNn+I1>?E5NL1YxalFv^f%Vdl6Ka5G4^V;a$+ z`f9ii%p6_jYeN$2`3RFR20hhxtovtkBvq7kwlfk`jZz=xySn55#ZsA6@yoU@QWw5@ zpAcw_Z0v;1WW%$=BAtRCu9~$|?cR4Xj}lG{$cNB~Kqobc%Y8fU&w5roT^YYsX;5 z<}@UQn-$qxxsnCdeZeMvEa?qB`+-kxBGWKGdUNf-Fvkr19Est`c7=YVERPEpp@TK> zN49GUmDqkq)#%aE)WcYR4*ppVjzI+jW87ZMitdmzJ{Gm&Zd1 zFyT;;#ZD~3cihNZA&58QNaSHt;KO2(_nedR#-ZqBXi4JkG>*X72UDr^L5$_KT|*S_ z1y)v3?UnMQ3+RowOP~QvM;t1_96M=|OG`1c&6^YOq`u=n`TkzfL&^$wgA6~t7PpR6 z-EfTdjyj_;o(_(CqY>?d`;`3hP{qJyzmFs&kWfWWPQy>!IG=8 zh2jDs0We2QBbG({48WFzT1T_kt;MP!b|%^?oLap64r{;=0S97)-Ofp+8$p_U=LXn`lqj;{gqu;1LA67~LD8Gu49}N)b-z;!nOI<7%V%F6OLgcIoF*{GjKn#5Dqe35 z({6w5{X;BmstmG{`$#^w&>s_y)FIZF}}-y7X*FSA&du-3v(%N<{_?9y(&D_m7 zfz!C|L{AVjk-&U-5&HcLz#Q#)z5+I{Vv$v-2jOTQn(Spe_AnL@5aTFbm+8vV5%TK} zt3}%b!cp@xu}dekxR5r?yKA+=UrW9T*B<7|51*&$NSD>>s}$f=n>C>Q5GZOR((^d4 z6!+Fu*aE$P)PJz&%~SLCtbbr~mTIyR?AZBXstG&f&ps1}P6zN=@hz+g?5p7&6m@bPJjf4lJ*4L(al-wnl$0l5U$qR3Vq^6dg!>XI-tTFF zmH^@hFJj_D-!S*s*yD18<7|%}5hIgWZ|V(2{N zvK&lzwg?E(?Q?IFA1{IW+q4-TT>G!_j*Q+xQucV`WyOhZo(r}~S5@`l4XbW_>P6in zvXG}DNwLdUkUyS3gn6Q#+=J|8L{bH}^zo;Q=qbwaQCSBwpMFq@T4Sarvrk>bVIWU~ z$vi7+rxTz4Q2Wm{V#VQ^SQFB<&0??P!h;WPZy3z(J!fz9!K-R-sX+XCQGsghk#xsN z-+C<@EH#lu!~6zZou!C&It@HAZlShQD|UG={qA_1FBMUaqp zjm#3tx2sBqHCv5wD$Dfcs|@>a8>Od}^+c#XITkF`6JEWW*N7*|1rC6{Mc9G1LLq8F z;dJ+qXSn?P#Oen_I{KD9m5?m&x>EJl||9e>-%Qj+52d5=)T+bX@j{SLCq}l^fMfR4>Bv zGJCx*$NOUkFY&(eUK{^JRK<5x?IXmCLpBg(rPN>4)7ubOENgtigM%_R0b!f@+H7xN zCMTEfQ8^Um8R)oBnKx8zk=9BAt&DTWnZ}c`E8|zFLK~VwEQba6kc6WISxH1!cdm#5 zt&R8DXI+;Y`sKDasVB8eRzzq-Ex*;hs5dc%)XgA`)w&rvcj82EkxgnO4i^aQAB!+w zagVeARQsLFD2(2GLSC7zNvLau_+zhUMPll<{2pdMHE)LUW;M6hCmZ&C`rJ@4#Frc) zp*W~hQnwuOzt5&_H9aM=1WsSB1#a!BQzL?tbqpx_#H_}z^|R1KcuM{4og)!_W&4fh zjb224g~Exnk(@L3gx8ISnaJ5qMfK|$UfC?VyECr%wk;%d0nR#(vxDb(T#dl(9&YQ& z@yzb*%66^E2%YyFFK+G>dPBrGRK^VVY3Gj&=M;B!X{mK;zM64*orspdlcu0mgT{+^3!-) zm4np9WmH-vR&ldlrgy@e9k5nHf-Ryyuy5qcboiLULxK(XN@+8K69T`aVjHi!L@oO} z*tE;l#Dp_e3>^v4V>Kj7uFuzOOA9|P`RL(}WzcRp4PIgN&M^>c9Z1c#9Qh?k;Gg9x zZ+n1Px}wb;y%(5_2*q~@+VV{KlfeJ{Gf61wF6O5?=2M!NU2fLS=+3atcYRdk#AYGB zmlDWCvC@7S9E|JsleOE`zE`uWAu_WAB^{uj1@KO}unF)+mcm-pHvKO|dXCP(>|U-cq&yLHXb zE|fDoG3{r2uB~yY6M3#{H7;{Z5pzdV+f}a5_eZeFZO$u7(1hFd@NG!5CbTD2#Kpv% zH0XM-*{AhFvHf~vS7%cSHimant&N>;_=C^Z2JQZ*#;XAxycx#G)WY9~#O(5hpJz&Y zRx9zu8)U>LO^q<8eL$ramo-UfFMUB@gv=x2H_#kZoe7i^W*0bO~y#da*bd0 z`oy-Gh3guLv~=k9Vzkh`OA<}+!}S4aezrJ`l=3IBIVJY*fDA9 zAg)+mexI6Nr}2iXyawNj(U+R^LfHv>|Igpy-^y3KzY6z*tBcr;V7&QK=n0 z)_j*=Ydxzz&?}#$3mgW~#Jn33!H77{lY;boTYe4c+xK@D5Fd^fh~H|jWyGbOcz_OQ zNtZ8l%rRT^?7M-n?kZ6<$n$X+AUASxD7EgnfjPr;_IL=cw(2g)TP)~FFy*?vPqts|@8hqfQcoQN87RcYuqv$tUkeK;FO zPcUIVy#Z5$b4M2?V0~(o~r2gYE;zi(2^){WAdTJ#YnL3Xxo#o$6bl- z7UuolUMSlB@KJ`Ih>Yu3H(ylxtj!7X2bKvr@-@P5^(5X7jdjsE9HM$vjHaPbZZHB$ zc-)m)p4#U%%$09o%86Qw<1j6YS|8bCfRDQrCe?Rg^K)dQknLyQ`OpJ|gE}XDts@nA zIDB>nXnGOYL6uIkb>q)YYm9Q#F_E&#PlP2y*}F-AM7uwJ8{wmTyl7gU-3_tsn()>= z%FE8Nc%+z4*y7d$AJ|X*{)a+KJ$(q%SbfCoLX0BE$&37Vk!O}s;=wa{mlhqz5WhU; zdLAgjcz=xQ37_cc{Cm(z>00*K0PPt`)le3xc<#&5q=QGwcfFjXHmIk)EtK2i9;J!~v9 z{xa7cF249MZu?UWCLuZO%9D1nmpX2>hX754XBG;o^G;6yYM$?Wajn@?>r|#xMd4GF z108EU7l*!0S5|*$dS86doOjXwZq93aVT1c(YEiqV&uW)2o$I&`dR^1uX)f(?_8S*Z z3w*c91^8`?^2iE<=H)}l7dbEf!_{o?!_F3U;#_;i?I7-xaYVpkKso0!^-1T)U-Fe9 zp}(jfr#F~-j`BFSnl`?hYRV>kcb>V#l!WIx}_w?bm!&9QV`^bh> zaCy_e36{TKxq1dHG(si~M{BVLJB6HfMs19>rhW1-^5K~OCNzoh5wh20)C}8keRA#| zy>4Q3&Xf32t{^R`=ln8- zEBIIpoLT#?fD)Cw%A@kbQnZCO(ai^dqhsU9j1KI_ltB28mea9)Fsc0AMG9XAC_v~5 zepHJ5f}u4UTi@aECYGC1I#?=_i1H&H!(KE+i&w4KDh$@$M582{*z!+v$T%A6SI;Ya zvnPy~>i7Y}#{9NsA>W zx~(ltHN)A0otcR&)tz_n3+6VjM4!IU4{bLewCkJP6A$z?%s=7+$Z{$2UiV`XcwZx# z&w`GK)NN`%0z<=|&M4P7?Xx?P{0+|jQMVJV`S2FUu4=|v0HKEbgpkCWFh_qy zR(U4YV?Fi5*`UxMz8i`2Y_{?pA0RteZSM{^AJuik%BXYS|?Z}G8DV>TF1%}d_A4Mjrem|M{U>{++ZXZ8v&H{&I!HQ5%@oS) z>;<3bRISoq2SlR~s)XJ;NVlp4=nwy-G8P7EQLenxtDvMgKZqe_ARX_CTf5s>3=Il{ zsR9>$qcfo@a_o6r3`3f+K(z7y6q-2WLH*;@RQnSdj)YIgr7#GudR=_C4E#Rrm}+oK z+2TgIbZWkpzz$UCeg5KoxE}EwC;|RauS=8nZr8k16EQ}F5_e=I{mHp72B|t3Koo@g2ANimUEa0+v4%sa0B;T!0YzcN=YFbO zfZm|{w^nVRUJYM9(e^>m9t7eY(u-W7IGmUTa=uW~2`ClU?FQ5LGJ+w3V?Z-1J9vy# zc8dpvtVK2zKq5#EX0}P^xBlO&OOG}yx6ZE(`V0gTOUHt~-(&_uRWxEDm38f(_+=vn zIChv4l=Fap3i;b<2Mc7Z2!P{x94SU&HEPR0Dv0Y;#F6UI;1E4uH4MGwQbAilf~bZ+ zTV$T|V)(x+YmcK2^B^>m1wif5*mn01yNaD;bXT)C2=IO$%fQta%7LlDuZN$2jZuYZ ztyp%t#GbG!kY7`^XJ3U8p;lyQ3j=lS3_tvUTqV!8g&`nS<`Lud{nZY7BSAN3wy2FqqoE)fjJ&=nKiRag8E0VB>7)~<$E zd>i5Nwa3S}4WUAV1>-&Wz8+MY){S zn9yV6KYNDb0+R5xE`~#dLgK~YBN-1xLVl~_g!p(>5LiVICyRJ8?OgbbR5vO?@^Kba zUW1iDE1=8It(kcSz=zGXO)z2Gx78H2PA1nWNDr5l%^|y)-ghpV21S0V2-DclD zp8ox5orS9(%{(jW`<-uiS`ClRdgS9Pg!m(9WO%(vfn)zAdNy%yWICgfgiivMwOhWE z`JgfSxUf6e-fu}(!SS~YJS(3%5T5=6t2={##XVTM%r%F=jwVS0)B5I}*jxwm#gAOS z|71l7B2=}?eky_QSvR1fq;1^(NSvzZM8S6jXLX}Q&XjpSvMBd?rU0AY0YG)PTs{j5 zbd$-0DGj_ZrV~1)nB2R-|DOGZ{BX} zO9)_hr0xSu+iuML_~W91#3Pd&eCLme2p1|f;ovlE-$6l;aF30@!nL@Fj%3;T7PK{W zs@Qb~GzkYCRS18AGqxc2*&i?NudQoNC^XD?8=mC;y=JEpB%OOCmov9E8sPG@x575} ziwo?J5E&QRVAO;8#d>n_$#I;A+Mr!a-xbsvFpP(@S&8U;y!;%Kw3j-&PTnM7I=`U| zH0FUyu+EOT{r~wRMVbVsi2;wxu`k=9>w2N|$=84RAxSU59{3*9Apho^Dyj6sfB6?eOwKz{kU~-~V%Y9}n0g8gi+cSWdnnjfH zLtu~bHhzBjf1c_mwEZwj7K%rpHm+YgADIuB9Mu2yWM|D`tS>b?eS;3>L69~i_@GMY zm$Lv1wRUnK6CD%z3^TBP(5QzH)ZgHh<#JOrFZbOSL;DnP$`ekx^ zY6?fyQ5f(`FgNRD2OCy_IYzJl_{D3W|06X+-C&q9g|~OwbNgBzrOV#U-zQ^!-%;e> z@o&*{-lN2a(D28j@e)eE5GO`8q_`%5>SZhZ3hd1Bd3XPNuu=tn4S8i<`bt2#OFc~! z*cM3vJ=Ryq?Mayio`qETqwno$AS2HL6VAuNIX~PlmXS+NveWLEW=fqsTID1C>?h&TI?zDAv?(sOgf;xs5ryQ%a_`UQ6$?j~!P1{pB8IrBpgZ?9 zA_KSnNMx>53^m$*ZcRHie9@CRgOj>t= zh=TyYy$+eQ5&*E(bk;9&vh&e(#OJ_8s~j2sescRUj$f<5uP>(iENn7;c5r(es?kya ztn$h)_qxR-GSEQ=-0NU3IARb{z|u&&R5BDoZwa+1&nkO%#WP-0fe&14QReM55tu}& zMS7rOFUkr_l^&X!4%mn8wgl1*(w6R}ID)))7g+9HxXyna<#+#6hQY|wD#~^eVv&G# zx83_b;_kA!``-d|G>U4|Fu;!+@(;5xY?e}pf|aTztSMF6A=yOQI};`B4sWO;Yysf~#1mDmq#i@)?Tx`VaZyydJHb>Fz*Fk0-*xd4 zPgm~@UQ^X)!YAy)jf$#wKR@H9E>BBZx$ahVQC?nEzHb6v7bURUmuLM7gS|A3XcaKh z{2y1>0ZwK6#&bH=LFu53>`i2ry&Wqv%1E}TY!Wh$5hAlhW|9%fii{MQWwmS(qGT&O z{`V`s>VI8b->97NzR!C<_w&1dL#&VH)Nd&ud?hIMQG0~xpwJbv@%e$bk=ktI#j6}$ z;Q&$!n|nhtV>~A*4Uyd{rVvAcYej5BaMT5!(3-1XaD+eoz?uSzH^HiSBn;#cegcVn zJR~w;=BE|n=VsviiDN+$-jYs^^+=zVG<}d;{zdP3V4r_G5zjY+So{)m(f?K}_s+-1-zR)7vd4CS{nIuz&> z=0yDFNzK}8@ZqXMtK%-?PIo;5&#<`WxJ{(1TPtz;EWged#?FOVf?20`%$!ECMxP#d z6^0a=04L3M9jH0yr_LwL9Spg}u6M(u`@I%AFMW6uko=@(HB}|X<)17;Z*RcQ4g@Vh zztj%Re)BXWXX-KF`IEh6u}YWN6WK?pXgP+2?IuNn2HAQYsM+}tZ_6l91~%&1;@|N44_O=Jtq zTKm`kv2LJAR`ple@7t<+TL>h6M(K+Wo9bfsfyN$9m<;&+(p-JZ-i-!B^&7p46pDW; z9Tu-a$XLcC=|mKjey8}jd9azC2+Sk(c`8rYCBdHI7t&cLbU>Atw3oCJ>HJIdYbOJe zRUyEQ`7UWwMK+(D`Fr9q6OU|P9&PMLA3|>J#z}>-MuO>wni)fZwM?}+(}?ax@*|yQOe|gZ|6wx+|q5V?*0%&jtXr27+ zok&mO1YemE_Fvm%p=5t zcPA0OJ8d??mz%ysPfCEZ%Q+%Uz^uO_H@3o{OcZ8k0NFI=3TI|_6j{ht6NJX%4?}|_ zNZG8`b4%N?DgH3c?ewqH!LOlzs!n)Dr$rm--4?!nlKGty+b7%m$LO5TP#t#hYXjAt z2x(mCL5@DrONU3Ls{2bX>yAljyd*2*2c@ijk*$yGX$8h8+Bg*x-zh|eD&o80Q9?^d zQSWSL=w0f0yxLO>mKAkm&9sLP%L2r8KFjgkdVcTM=L+1NjU}Zu)TC5RzRn~-F>{}?yv?_ zSE`ER$WeDcYU3F>*BtZ|z04B`fc)TQF8#yS8`8Ola>;XytIFs+TVjn_=mZ5j9I^dgYR0y|K-sw;lqal)K(0rCJ*E1Shx! z?OMTw3YW;75g-KJPLz$LbeD9NP=D8nyu?}bf|Zz(n$BbsH|K`?%s?-~j2X92<20p= zkIN+*8=z66nzDt{fOXd?J8d)NAcOWrDlsDOx-RcusoF1!P#>gsQ{`4B^nEn%;%sWZw)E4psgsLT%-2#h5$G9+Xb@YHCIQxv%{kD}S z$R3U;h8ygR1TPmAgQv)O5~dZLU^oZ;0g1r$H;Wd)!^v24%>J%BGC@Lfpor`-`x^lh zhOp}snR}DO5fKa{69b{+?n5vK4hSN$dGlYQVE!?dyMxu zZ-ANARXAQL)J^_(cyzh7r>Vi4oK#y?JOkO$1QHEjbr)z?pFa-K604hys^5X$(z zt^Oge_u$Q+>l2=7ECZWFFoV#^=f7d@51(Sfj;7`0+0)q#bxYq+P;doAGuqJuQ0mh<*MXGdo-*~y!?^s2G#uC%|Jj+62t6j!!Wzo4zv zrD(25)5^MOBka=<5Hoh?8;|eaATb<60{M}~lz^ie#k7`$W2}R$GTjZ7rgm?KJ@|BG zT;psqfyr=hXa!oLaC__eNymh;Cd&pwRK2Q;^h3+dEY}NX^*>|HTo(}*Pr7Qr#NX?N zO;(2tV%)=2Xej4Ha)+<6iQgNG#(Xr;%~UWu2>c#d0K4YdWi1&Lj4mCha}Fjt zIsi9C!{ebwewFI=)0-UCSrB(BwJrklw+%v(H7yI>&B$~Oxk5$Rrc}gq(G4ezhV7q!m56oeca&t$-#G@S9KGo zgnsFvAWMnJIo%6J*8|XHUP2xD?!4B*)sE1SS+B$PXMB>+aRnK8J%yahAZ{XNQ9LhZ zuErPViZbu9^B)9l+AUK+RO}=<2M$Ep#?CvxXeMhj?Kcg?L=?7WDFTnxKA#ib$W@8F zEACh5{&m@3PCz{-)~4I=+*tr1qDtP5ka$9olrq2(^I zd}J^dJ*Q}S+j#Ur7i@CBe;uJ9u#=ffYP>N5CO_Qy?Rn+D&+>*^FtK>yn}55G^)t+w ze=0oM4~jgi*gf=Kp=01vP?`i<9?y;#pOi}rz|IwjE7u!j!bJbTM9FzChH5jv4d4B| z$ot6ll9~BjgVPldOZv?_2Y)YL3#=@o3rxMuoo4-?pcVE>^2Pg&MZMy@`5!WE=-WfzlZpe59a3*7G$47mC9zMWqnGrkWDoA8dLV4(-rC>qsl(X$)K=f9Tng}E2axA-eMm3gxuLS-7{slFV$J|A zsh7$$(v)>HwS3P&k9ZJ>cwZ4{2du*r^Do66 z+eL*CO;Uwmvm-?oMEEGEc5km~|Cb0Du(>|8RSBLDEhh|%>pw!IIGl-09l$ujp)rEm z;%ML=8sZI=&jkB9n43i$1~_*OBewxFF{NR|GY3w^g-FREWpF}1KfY*r(+SvxgP97W*`8LO3KpYeO%MX=gUzX^FSakTVPft+r zUib>iSZf;M-K)3#o)xO;;4L(h8K>z2#ENSyN)gR%nmHeT-$75cVNf?-)wp+3Aa8&l zP8w9Fp&^4>WP#<>FGvm>+o+A(06g=WB)>XXI0k`uBhV3kPSLZmmKdlzS@%#{9p$Hz$Vh_4UDCVU1Qi<|*q z;?3F2E7@6=2z=dv=6yDda!0(sAyvE*Cb1K)`X5DpS8iHXaEAgSmHrFgU)qoF?mje# zsFg%)3`_pny~q53gu~6Db6_gdmbTHtk#F-n@vH~^!b>G1MMT@|H>b8G%Z0ag?Ux6 zU9aG_ITHdgA^t2B8qy8}&&H0w!RPfRDjs|S+THU5CtTge+B22>za9%(fGJiLAcK&<)mMRl%Hvuv zD|nKvcbVe3E%H=BJ$oVnV}}74N*g0qD}X(eK zdD1(pfRmKqB;`gEDA+I$K5dgvzOncZVn{!Nj>qY+)Q@PedJ3+B=kNrc!?X`MystUv zoj!Fg-{9>a_<}%Iw6z1MMv*WQvEC@1x`+LLzPK!CmW{)oegaRA+qUdal=M=zlT|ht z{o78&m&5Av$RXhh`0p`deYb1<=D0_4=_xA>%345Ee7dY~q z$yow9VX!LYw$ySBGq>-S_9j$GqlI=rm<@5Oh32n#iYB1srqm=oEXqP)GQ=g$0aRPA zf%^}+{90euvYdW&dV9L`yX|At#}u;Hi(~N!vfFXTIxpq-4c;ejHvAG_0NZH+0E+jo z^ZcnB-#BC~SeTn-z^VxRSUBC`(^dj(QU#2v+Mq={E+iTQnLG5ug&u^lhxNtu9I8{O)Kf>!W5(Y?y8d&CLJ!%h52s*Ag2G+szerl706YFMgJvBJ#hqKeTN@c zW>psD%X4WJXiDHW0Z}z9tJw-XJFpq z4n48k`)n<~r|aL9{!|J^RIi4=_eprQR7D{Av@}g+Wo@VI04zX3F!cg4e2N4=e(iEd z>HEF8V)5^oWXZyiT-Rx^=!tJ8Pg_9T))3z__S*@^CTr z>pyjw8Oz#P>1OL*yN~i2B56cM-T^E-mBdidAN>v)T#Z_JCjbxNAe-^_A3anbhC$1z z``(}>WWSA|e9W&Ar=sw8hR>YL`_7lbYPyH%IAciWM8Y6FfVlY~o4ZE8)Y-qrY(NIU zGAe5z3NXfr9}jLqo3}kF&9(J>l6 zb3Y#84S-9wc>!Ehgt_Dn@KPWI$HpL05Yu8pal!LdV19FRa0Cf{A?MI+9kVB{oPiAL zA?vu)I$z9~LeOasz4;Kd1TkGuFe20ig6jQDTciK-W9pfmkfP6PT$yla7}#%TvFS*ni%}Fy*E>g- zpGS&&&fg21X*idvD>}ahs`Z9yDT+Hlqj80SVYSq#H!z9WbNCDjUpCIdQ_I(uWz+V& z4D5I$e!eZS(XxFHD`^%&izwG!0oSX7(qUctc#LOGj}n9#Rf{J$FaD|i`n_k3-|WO96`*~csvm8a5+3& z8JiBUkd{VoVmyJMQ%SBR`F4}$F*JX#u9^5jdFl^qh&wD0$LAZ=1d`qM%_EbCT}-qx z4!TD&2#v@O|lfBOhO!FJ6 zxw0*w6TY?#`m}p<;VK0qNE>6*5sRrshWQ8yF426RhW_G-Xa*P+3Tt^>lU;7HdCX3w zVZw=81t`QA@SrI}0d?qlZ^Ra~c%edjc&6q!iRkA)b1K15-`*y!;cz%}(CG};ZNBb> z6~TrjR5(#&5dy&%SvF|$m{uc#XF>@U<;YgA)JZdI45EcB!%m3Oh9|-PWB5bFbOrN; zmg)3am7Mxl2gBD86rH*8RW;w4=huyan+xg_M5^s`;0X-J$ngWpb#oQ6I6tT-1JGL8 z4VCXbKvFt844^?))ny>>?i}<|_jDcI*o27mhM%)TGP9nAOhd>#zQkGsDc9t-Na$~` zf>m!b`JsVwN7HUN3K6rf!IM^!AAGT!)=t==;!C_mEyu-=#{gB(s?i34mKEXEL%S;~ zbq_N!X$6u*LwCoh+#zN0?I=WB7b!9{IbiJ|l&kJpQ)P8eB!6H>BHvMNz0&LCs}H|O z*|`}kzRUE!g0&z3jCbYpcvryL-$N9bf{8B`XDffbR)X>vZw@pX8YRmg*b(^w{>=f{`?QYEK?{h7o~GcOqlcsUncA@ZLCzFEKsMEeUa4Ut z=z-&m{o+Jcl7kC0!hF_6@>e@Sw`WO{Tx*%}iRJd_Q*V-8ejX6k)%=HvHTx{yhBzh9 z29wvKWtk!n7L4XWa;gUFO*ppcfAHb!EI@2mq4EUn-cj% z_$SgOFKt2J&cA-Zkz?e^Psc`ff+|YQzEeOY?USQni8DY9G!gsFCGYT~oY{*xNwmr) z14ED?)m9m_q`bHy4T}A#-gt7aS`7l`?@{8DoN8+-RYgLH!uIzJajeyF1(7_!0M)$$y?YhY2t;3%B#(Zzjv zep%J($!Bs;GN-x(odlr>t~zm!m_W8WV$odq!pA-ez~k2MpvUX`Ghs-V~qd zxPcv_ew%MwhZ!pjBwsw#9n>86Z1YGRG9oTJ*=y3%%F00yZ?<#%){w)_oe9BBjCiWy z&~>BG+nD@lz$!6LydmfgGZ#At^Yr<)C-jJCL4s`iDV~F?H6-j5 z3x~N`OWJ}Pj8qN3{o1XNeP~$JqU7dS2a7M4j!z3;T=2~o!6eI{WUaWrC82s4Heda# z-_vEoqm{;(ZI5_6`8Yg6EDKVFxJ=M=(%#P$GTASM)5_T`vCJS)K-qqIRvDy0hh5Cx zb{)=sm7kt_^{-dNd*fi#Su9Q%Dc6~K5~TW&)?yr=FbfxfS5HJeMZ62Dsdxvbne#ye6g&m)4qckpRYfEIGy;2d(|9UZ# z60e)G7ldJkTSDDPa!S3_SFUzz`fKI2^>;Q)>b<|X9{XUoGR5SfyK%wFHzxBgE*m!j zrL}8G+%>hMbO@()9CxQ^M|acua$WW-qaA6d2wm4oXdq*%V!^vVtdNTGPrNn64&W(6?k?PaC~$D@~uoIumKfJkELt3laH zYbzd3%iQP_tLdj<6%_3!I)Xn%M=DZLuVMe2kq7M}qwG~4X3`F^4dJ`ze9nOKC$V02xhY4D4~7}J2A z*@N`sEtL>QUX#Aii*mI|UMtI3Ix(-Msf?U+IL6eAKJ@|t)Esk#DGK@4zi@CE(=XqA z$@BI7twGK+BcXP3q{p1;=G~zIQ1mpvbl`2nj~LwJ&=uSh=1-*g3Yk*&qnq<&S8k+; zd}_Si7N&v+c%MBb6!GvfK`aVdLiOlqe45<25Z=Rlg?%LLTes&mR%V8p-D*&a9VW)7IM-;e ze!eIo>cPXK7pocBQuLk5u;*$M`&bSV?avoKe+4ZnAEvDtL@0w{&GdjF z7#(#oT->`Dbb}*BfaJzPVZ-tzZN?}Hx%TA~heMJ_&Y(ScZ&mK7&!V}}g&$>QnF5kk z#$aBp_!8GeJKs0^xF4)23|VzN-%_a^62<=1n4dPECZoRiZ66}*XbjR_(DlSeKGn$l zI;JQj%oxh^v*ATZTUdJMX)A6D!cbexG>99X^s;&bOYoY^Y!ls)T8|mU;p`R6TbMu| zDIuS)V__Bxkm+dpAjeM?PaM<2?^C}D7NM0bTrbW}sDh+Rxl30hrYeGRUpQsjR(P_o z(}glS!*?38dmcWCu+hdWFL7g>1JV)if3ZQqE+$96&?GrmMNTDMvqWp;-pFPzOQcOT+y_3vOv|e zv=eL@PSlH}89tFyOj_Ptq>_C4Qgok)ozBtb+@|n#%xvu}tK*AU?xo{Dg4@W1iF%WX zb~+iNoBms|5#wz~8!gz5%S>O(Vx7 zX%eflb!_YBlGA3dkPcN~w%-XVsbd?g-q1TLyU0-(7aM>v*Ef*C$q?>|c*J}2_| zTt!Zk49ww>wZ7lT@NrfY+tFq*>4r#C{)K^A3S=VR6J^8Xe9lx2EW$T8qCX!F^P`FZ z05)0;%{;9edVa1Z2^Z@MvQ&Yw&jSfo;+yeP*Jw9* zCv4~Iuy0FZV#=kNML4fCkY5^wluR-KcA$!~IjSo%F57auToS11c@uqje~|zc7X$lS zb5%PH<_TRx;;~N!jq7}t7r&8HFf;FutK;B~w0U`&0K~ zH0{7{-EdD4KKK;b;@wqs-;8w4xGQMSQp_}CAV^+>LCpWkXu_#7D0B&2Y?OY{H!scl zNKUL4SOoIz92mGbQDJD8Nd0*>(uxPCQ5ea_Us3GJUUN1hdt2JY6I}yajuH_)5;vMe zV-Fb8@-K@LQT=$w_p|Zq4d!SRUIoGsZkgAPQ$EC<@?=WhHvr^wOX}~5iMwSDKFJ%N2fj>A+-yt|-4)Th%?G6-FsH^Y{pJ zu+vs5D6ontxPNpgM->wUG%Ifv#fAQ0S-M7I5TY3~%&38=87;kCrALYuD6By}Cak{8Mah zrlsz&S!G6!-dve;(O*;Ho`N&wK4nH&UEFHx03+Gm4_vlK+^(A-n$(IQXm$louI6F1 z0f{lhBn9FZuArMA-P)oj7K>B{`FPfcna4C?keH1l8k2j`I&5+8fEZa%VJAD+p%#15 z$=7LS<7-z-Ro(uB{WhZZ1PE+?G@zUt@;)I=&0$hzf?oFdQgPVSwu|{wU?1_AU61AR zOD>VrE$pO+(i9jm0jtn%f#tLXhcc4|dBJ?_RdzDXIE{DT)`NrTGDJzs(F0D*r}}aw z9VG&~g)#(E8xpT~we5${KHHaseA^_p)LE7Z#bUx^&l7H5B+-+wE9Kvu<48LT*Lb~` z7`!jZ(JPOHvM$lidsjn;V={K}0e-+yI)*##;aRe8jh6n|($~t-5v#Yj{GO-jZwzvr zy``@&Ng%#bvwhhsp3pFOrgg@7#VPoUscJqqpgEiz^!b=aboAY#FVx|)+28?CV$dCU zP0jAM+t<$f3GTiIeRWwr-9TtGK4p^8xsmM*wPJo#IZ>C%@_@{i z4)bkkl6Q*X&}jG^^Yn=3#crT7=LyN|Dx0bloW|1Q=_5#eXE0-}g!SsrTyz5cs{mG(KAOCg%8wHBkp!nQ z2z$7fHPRnYcPTamX@+G0LL~^hBBKVa=_%6dvmplQQmS z8z(N!4c9`S9IdQwz4$un= z|7DZnrk7Kt_6I_CAiV@x#Jy|SUYAdv6Ayhjq{}bmJpCKMgoMM(hSg0)cW{zzO#xfN zO9BXwHVJK6OCX60JdE?)Gn2UK1W2}hP%}c-9Gi5auyni^r5pobl2qH!L^S2c1tsF`n zhdwpN30Q4}wQd1%Gm_h;2(c3zVotYx0)z?hb|eDY$iprGBN?dv7y` zv83q=-{y><3=rt5{1FvY|F*j8dH5cAS1VO(5>}RIR|cGy=FP=lBU+scgLN-Tm?+d3 zv-y%Y%?nl;#f6Woq?+3W?mI*4Wj=l=nEXVA)f4$7u~miJlG)#1{ohk(ZNNCk!f=6g z%s}MBUymFX&%^2;j3G@A&Bxh4+K7@ZM%f$4IM27yqoj{B6w%c3C;SlbI-eVV>3~cp7hIBV$3MzZgZnNAzc0aIs5i*;KNRY@LM0i5*INrWdODA#Zyk>%{*q*MU6db z3CN%h0IbA@gRY3jJ(mdakb_;Ms8qm3Vm%q0q|*F5m(-y_jTQp9yoDnA;3 zj|X6q?SbRYKf!6{(;Etq1_vD9VgYgF3u{z|&I+%W*Rks%9YWdcg)`cu_;>8sAGqaJ zj5keTZ7s?E?|07A**CY9OHth^##97R6l$Ci92*b>;>znXu*@*)8M`|2 zk^bLL!}$GVi!g9HMv=oNt?l!B+<(ml0YOqJ6oD9Na$?74pKsVXJle6W()LF;Mlm=N z>Z|I|{`-14ke00YgU7h?EXp(TR?6Qm*Q=Qh1=Rsc(zslEjPGB%R?HYsRNWvIk?13+ zGIxin%_mTZ?~)gQx`RlcVwnHW>;=bYj8;L*fQ&1gaTb^lm5GauGJCJJJ9@Hw(dXlv+-3txaj)~aLoEzgL5Y&omS%X~bmbdgdy??LLUKO(^&zD?) zb1e{lCsoSJ+LHWDrpDH4hu;8rbJ{G|z%*kJn7-QV)10@Gz*#aEaR7A#dBGip(AQbT zAN7nXpuesH{?aoTvl_ggV?mJSL0}{#YiP73mDvGGI|EhDJ%rXJ)C-bp20=r!kmdMo zQYGsJL-DFmBJYis4?+-}RBq95vy)>Iv^fg;-G~{sED31>FzX1%7J^&v%jxR=A!RTg zz)XQQgv3vuxtW-WYSeUV?QTCr`wp1;{rZB;CYIs-adZ#WiOmL1+8OC2D)pSy0|gAz zHDs4F!V*WH25QYF+O`JU8?JkKhRO8LkllHM`u28%mM#iWmoI`ZLQnfhQ< zj*liet>;+G46vbGfz#9W;jv5ECv`s=tM4|&`TOk_##$V}7=Wz#&6Pb@O}85;3KYW4 z@d6Oq7|LeJL)Cw$q4d}uFrghl+~7#Z$eOntWra@ot1?DyeP(){W|Ibwq@hI(LJU`z zwh!ivzDxL(w(2t6X9!J7!y+EIM&QKq9a^iL#0<<|SBQYQ`3rHP*Ju{Sjw3g6`^(6Y z0svt~_Xx*4>?gbkX`ZHBCV+UXjl}U)$D#%b#7x!+p7s-Qxm@^a^+KCp8bZH*G2*LN zj(B{zqp!}WAKRY4btwmrtoUd{6k-|PoCVcp{6FSsA41nw@teXCeqoIqNp3K07@ z{Q}wU(rj)iTcX@N&7S#BLhx`|geeDF48ZtVBS`#fdf>Je5+0W^c*@Uz@HORI90#_x z6G*I`J@noWA@i(T^itv{EUpQnSWRY>>D+GH4%IxD09{n;&0vkR?9}V8z25{%FUm<@ zXrg*6!$S*rKsmEruG5cEhQz54-A8{cM&>inBtt8b@KhCX&jhf2Vn0mX2(Qi?FJIg> zx?L@flkpd@h@9u>*|Zuz*nRyIFk!fsx(t>iJxXR_pf|If$*~2Mh~jxv#Y^`VV8Y$D z6Pmg%!$92u5iGncivrYY;#J7ugwoQOEV@QWQ( zF-3dCROAFxE+0hGTt$2w&h$TL4C8l)DrO|FwYHao%$vFII`0R9K!gt@`GHiy{M-5) zw-r5>rTEOCqs_fe=`S!5(lIt*LK@zfP+yYV_;Vk@b6_Ja>B~^AY&BoYt`nff4|LD= zcUHMOj#j|Bk`U%XOlIw?$70n6V5wf*>iCW@)7tW&KJ_$qbSRJWTHbr4(!MMU0!d@& zx5L|pz)d;B0|}6T;I_gRo3M@#NY)l?BMI-0H2?5czriBE2F%^6mJ2rOR3R{lqabgN zON_D;EbOga#-s^#5Fhs7(USmfTH13^_hr=!qu=~q~_^*IKy%NX=lHo@8QnT1>i{x=9VqV~MSZEQ;>v+)xkm?IL6VHq3 z^@7#=1%TGnPezSDpes9(`$Ll27R#sNyU@bHF6;*dj$}Uat69BVeRsb@RohzB7eeWm zp|uz<94|uA?-seXr)pVx@aZJ&JyhPW_ z0UOj7$AqtDO_P1Dk6?Ah2`@pXXLAMx6Nu&!y+@b-JQ9qk3Z*@@U*V~KidiTm>~wh? zRl9WK=tCd05Hp1ZQ`5Rn7ze#lao7YKEnM6=O{JbgN>iU8t%2gG8k0N)H?=SU6eF7v z#;)U`*KwIFCTp1M1spe%m&pmg@B3-hH}l|;=ix4LoUX3fti2M5lQ_aPO~7>^EUUE_ z(zCqc4q^C4=&yghe@!spJ*wz*sqdO?+-CzaJS_o#vn$N&h1Cw%o7X!{sl#7lB7fV9 zG1IN1d?p3^tTopwF8`~y3sGW=mMe3gDV{Tw7IUf6YXSDRUk@Zw4r>2Da|n`Pn4(^T2v}YEUm0PmRC?Ih(Nlj21%^CWbgP?v<)mZC@}+ z9oAc8;}fqT#?Cx-sWw3BHIUE8K@0Sm9!OYcV<^2$Gc?ix;C=>l*4}wjBGO;U*L{IR zpi!^&aWc5l!v6R}OKJ930-tCjmd+P13Va$*jJ-;c)|i}c#&VZj?4Q#TBLPL?3hmOj z_Z$a|p0NMfYJq&pO;DXRe@)RpT6WX#!4WOm@FR!AR_s8R%aS+&q{p^`{aWUH_blI& zogh2ek6vgNZX{=gAZKdV(=v;#LJyBelgrWPp-&k0TbSk z!HnVNEY|VHhnN>Zm1q3QR%$uau>pfN^nDlzZ1^CiuqS5Mr-8 zEiN1&n(|#O>x5qD4Eq_|lLY-8O}LRVN0y~i^O7ImpQ18{OW-B2rFu5};UQPnb5(b( zn49BLqFS7OP;lF&qkU$-xtFdcPI<%s_T&va(wFAIh-AJuShl?d?Xquot+Fw{9N|j% zQiZ$otqs=geZp1{K}0^kp>dkD(!v;gSfce%wA^1V{R9N}-T5cScS9A_$>2ls@k~+^ z2n>Z&Hh<05QlWm_0bh3Wyd7JB^gCAVdgdY^hQ;%{fSqZB!%-*#5vrX{q6t2&Dn7a2rMK9+~Kw+YAqM<4%MqvY9+Ei?4kP;c;RxABxB3-5CQMIW9-zC zCKzR^Mj4v4Irud9(tUtX7q7zDM3f69wgC9i<08^mziKbyJI<;qGKR2ui~USinTzV4 zQAh6Re)4zBD~IVNdm3+x$<<2|+RZmD(~q^ZHzBfo9_Q*b8Q;YtH6qx64$;wrp3z%d zVF45Y!5uK##$I{-8w+|UpANAD*CZn>xxEFndj@YVh42ykMh85x?b|+)=E=3OO`h?>}B!GFW*=3yL%x?q~roya_f4a zMAUqOvgPEg@dKqpP0pnrqhybtyj|JXBpT~!MZ^5vit^rQSXe>0uyBlh*vB%D?tSY~ z$|)T@bk(L-NtPceTbT6d z{C)HHj9-I8LtA&zr(MTei$cscly=X$K%>OUMW$T^;+yNk7OwKR2_5D%3GnmopvH~G zdXsILLGYP37c8V&@%a#?=FdZ+SSVfjzwTZ-8yn0iKeEdOXl1hF1@`w0*hJ=Dqwu?g z7TxG9s+yx&kyK_p=}8=6g;wp8|KI>fqcPC(^Dnc`MzqV~Uk$J-yjsv-)J+XnIM^X4Yr6 zV)@|EPs!zq< ztgSvf0eb>p4+Fh6IKKG2F3ZjvdU`5OWvsmR%f&o;J&eO0K?8k*ME+~$Uv!+^JiiI; z-6!*qtSO*LovrX9S$ADzL;BmOPP#AW2~8Lh`^Znp>?L?{!dyh_wxyy}YFd;cBZV4O zbydA=P{*rh5390t2mNX{gA|#x+=i;EXXrbwY6VLj2x!t;j!@NqL6aVwlEyiGTA#Pw zT{Hc#V3;lt0Ae3W@7JGM3ne=vZJe4jRN=i@LCl@>sAgE~@c5_~g+ieE1A3MOzI@+E z0tuOiSDviXZr$N&<#&4Z?g1P%ZnWHr-Qn+!5fk7>AQ0&MGNvJ#zYeh`Im(qXWQEi9 zwi$v$-L+N*WyTQd5uUCRh~X-#W0vRs$uxNok~M}yU;+`&N2_#M?VW4gvn)9A>s_+_ zkP~y1Pc^h0Q?`=I(QuTN>y_j!fx}(h2JiJ?B+wOX?H~GmQnPO{^)Hsf-gF zs+fC-K;)>KY6KIoL(LHa%$vPTl=o?CE8#3-4YCPg)6O-qL#w7*@(LIqYXcDC*9DXe(H5RR4=bGjc*s-kkr^`DqrGY_6<1m)P{T2eWEw&*Rd;6k;#6%-xuoT@0#Bd1@-h3<(ju_GMa zH|wxccvB}VQ1ax3JrOyFLKpdw2<-f!YCASPA4=W}20A|CF>G;r;=XykIBZwp+;2B9 zaV98Tv`OV0-^9S7D;sO4VLL9*`B?~lf-F(zdGk%3-|X*yV;0h~m+R7(lw3#iCe3BT zISC#C1D^SE;^KR4W^Wv|49i*apX7>)+v3j-W#@4>3lSx8PB5xUncJ(D=e%^kO*n4e z8QgjE)XlV}j|@DN7YVrDk1!7jnKcBYz7YCI?N;03HxqJVsiGs<&Asw^;B0hZaP-;P zSb)s>YAv#YbJT~juPDrUl225G|9lH^ALim$znTR~o-nBvHG0DOaTm?JsOc}jJHv+c zzWp0_Lx>TDohr!@ObRz}SK`qNDhao_cnS1A5FQNud7S&s>HqrnJTfyi@%~#yo$@># zrTw^#KR<6q6?jf4{^{;th1oL@$SqDRhmm600AG<;^|T;&LW#|=^#o*X%VLn%EIdxI zac4v!)}39#DZt@;z1q%%-z9NR|Jthgef?d#Qb>lLXL1U;3X!&deL(hgw3#d;5aa_# zDfE4JP$^Ci6cX$L7-`985&YvjyB{$PgOwzE@d1qMnzOC*9{>JIin3;ad1)*hf~3-?L?Q(*ve}`s*WiWg*zY?&?MK0!ySQvxD=O9kmTUfTI&E z+ulDq$GsjHew1zJn>2Hv3?_U)oOENK>3_e+hN^x5KA*P0GOko6Rm5+(I#h&|1SC}ZWyTFCl@C=?#i8&PC5B>+urSF5J0cM zwYGAoo^MoUm+s{0VGUvlgwY;Q2evN_N&@GebsOpc)tJMKZ9Fo09IJTQuXj%d(oknUd zyO$7)KSwxx{vzN!SpZbH6lH`fY~M=8Sqze-YYm8maQuxwA03ZiVgsPi8Hb5W)Ca)i zWB9prFQC9!v1BhBdI4rG4JQgVcAgRKIW)*dDP6&HHv!xV6G4zL=D z@9m>|1p+e8{K#C9-#_K4H4Ny65WG<~wSWaKvj);BgH#ho$ezJR*8n5JRzQZV)|RGe z%AYOloO)zy$$P*wsuc_%>;S=M2$cEn8^XdtXa&Y&A0>Fw+VA~lH8sc$1Fk0m&T=B| zgKqknBx*bF@f9qc#DIj@3h?^n>&r8A|Go!kq7RLrHjMzrJU{pA+=1UqfGGSW#NM?* zjk#~E9qe}gBMtHeIWZ{2zo-HL^foBNEI(ml^LycgOiLXuSlcn%d~;;D@~q*`ZuAOK z>PsaWd#lib8t|@pU+uXVF#AM&$HLJ7jilI=eY$R20?-nrUekx|_rc<;Ip#phmq_FA ztTqBt$8=0tqm}D2)tw0u8D6D9ZNLTqHsSxQ*x~Y@V16b5CXu(m*8k!^D;D&}LO`?= z0l|irxtsd)->RWzFBGUvL_m^t3jBOz|J)WTP-@qfAHNKnpL00(i=FNI$UZ!jjsZJ( zg2u{6dJ7pJ-=;F>kKL0WQ zLd84A_`gb!rvI=2x)i3dcjk8J6d<9ZlDb}+3(aOOJfZ*89}wmjZG#Me^>5R zC9o}Nh^#MgnHv9Ewnxwa=j>*rGsI zntLlu)On;{9Hv)J^C2*LT7oL;msf zK$2qLW+a`o?pwn3-?P!^Wi%4vDFkCtKrA}`EE$50xAw&??Bf97orL`@^q+T$pcR7@ zu2&@gE=ef!O6!|fpr=0-sk4*niod`#2YSq;Z8IG(nT)x|ikBo~zj#y4KXe=hQ%?;6 zl%@vv%7KyBy9RQKa(mJ|45CFYb*6K!4AGbk!wDeXNGzU(EI6JKw?#0I(aOMc_~pNDaRK|9%VS&xk!E zsA0KpZa&(6a2Zj-3d1m8WVgJ|1rE?s6fm?Upk)RzyUq_04nk0TiGIv~@Xzbfj@fR~8*17PX= zgky@%Wgk_yi!%=jRJLWagB1EkMznnfdd-p)iIv4!lZN=Mq}cEE8K z!I^|ov*`o*@7=qa9m)0l{xQH4dgN;9JF7!0QPOM8h^O5+G#-MGDBHG0l6zpM6^P!4 zf)R}%;14IEl`*BbqJL-iPoz+YqXc5gPytU$zO4q56I1e@U?s&UeWLIoNM?2J_-%PpI#ObN_6B(6Z_6A3wdZLJ{FleuUc*}Tw??^DEDlx zPK#UIm0H#-5*z!{hDQQBPJXPzWd+|cqceBg|J?vI2d%LGopCYFwzaHW|7b(&_Ll3T z*xc-(dXswhgjv$S79v(kgz4fHAI%1lDJt_{hpMhUNEUM6dRW!u=?iD}A@hra%f2<> znV106@1BYDtqa3jXVcCspSOK{adF*qLvY4%%j-qNx}-srDepO-+k{Is+2*9QnGK#W;VF1@i(+p)3s&WEyfBK){! z&V1A~I=#@vn{q=kVd&%G16u~Q9Vs3PH8At-f3|P0Z^$oE0)avIG3TKJTT5@MW_7+0 zj{jT?A$*@(f29w_&|Q93zK~B`oM~{2hf}svqLI?+m*kll&eu0iT*^FN^(`x@@B6*6 z^0%f_m~{z{gQhE2n{F;pFH_P^bflTSt3ON3RB&tN*pIE{eySt-AYAoX1odp+S_&04 zPtp}UdrwGVaKhPeo=pG+5-D5)h^5WtohvIZ{Q9wqI1?&zE>W+#WlrkyYw@R5b?Kz= zy#NLeE?`+ayh={hLzJn9FjEgU^qBsTeNj7#vaLPaCawMNB%& zO-^L6!)Z>H%hU>$FJA+K<#BLn6$TOONob7i#)@D6?k^cp4Y*?yk~y+85h z-l&>8EYA;>WF0K&ImkUxfBmk^9mO2SeUrpL&AT4Rg`Y7^__0M2uW^TulYQ;WKyUk5 zVFTr!t(lUuFJ9p;Z>`kAzjU`I5Bf4xy9oI(9Ki;DAsmjB-2!K`JKjf2=dPJ%u1T)= zu%8j)@e?PwyHVRfwpCI%`)ebyW_eK@-+gC(Yq`O6%hB&Mhe5lk0nrjudxoxoR4&Ey zOM$j&Lz{JelV6k%vqeuddA`omD{e#Ve>9{t+cLO=sei3d~P1jHf> zX|=w%snG47U6FQr$97TKDJ>(c{zI-K&oojcdtsxJ zK&T;Hn%K#wnA<`GgkxV0R#TCb|LihKLLi_01ka${wAns+u6J-yk74J)$ta9R?6cr^ zyO5S~0~oMHZ}PUAjonuGGxp`M6EGl=nrIDs(9LgpqS<;4S{$|(BptAlOi11pQ|UZ3!PTwMiJ zRoT}Ee6&i3(jXlYN=v8+2!be*4=DkaZjdfXX#^x?6qS;YM!Hi)I;9nPln6+D`{Fn= z|8FhV8rK??_s%`{oW1w2C^!iIN61Y^aUaS72?%+%^6dre`WetODTPis8=yL)z@>Y` z)Zl_*&h1x`X-jWG)phcWaI+_TK!tu+XU*dSS`NtROE8p>Ky1MQLhk{4?HS5DcmMkU zaM%i=s7prV?ntF%4pyz^V1bQ0c*R)}ReC1`VquG4@@~7bmXbG18Qg<|&{Sf5{ z8p2r2!BJuXNL&{IroD?>b}g9NZ-xc_eYalc%B^=`Ae;?(+u2ZB|J+WMaO_+emW)2G zrhsip;fJWo5iK-yjh(=D=g4?gQ1-iO{k@Umh5W$P?-_Ct?t?9iIUu|XP-^kavb~ms zTT&2qle0m*gda>)lTD*84NglfL(=R8Fs~BWG<|*f?^WkQ;Xprj5e8B3uq9XFt-HJw z`wQ0RpI_0@SV9wabqLKX2^=ew1uQ8XG=<1QROE2n(I%Z4F>(MqbOSm00eBBvBc?D= zBvnV4#moQw(8FR7FB|JfP=boMZ`?!PJ!&?bt^b0F(?^70$<8S1wkNrqXNtJ$AndRr zD8#w&;cIkZI}|a@fUD(2NOVqWpm7J=ukOYm;_y>`zy91yF$72%=Ct&o0dd`(jza%a z&LUu?8{ud0v`+<2ojKSqUxd^CJ>mr%M)UZQ0M5J;d=-gCfu~m(00+(nrwKf5UKAtn zr|gTI3=aNwzxUHYLGGckj?P_R6ile){wXJsmAYAj`Z?)gyPQ)7gOmk-Vgc}p@8!Qs z`>m27o((xT2X2YDnQ2%Opu;qWdH-e^>Y2L9w_hbZ_aG4OGnH>moI*pn7@@|66& z50FPKXG~V#PO4oBxOI^PY{TOMKR4jp69S+c63$6HGTErq-MQUzr~W_Qk}WEk zFq#{@ZvqUw@@JhO8TkJX5eWvsi=Q^`4K(~`4=|_70m_;mo`7V{|64#6p_70=2AqT<8yRq4#L)ph|Q$TKZ8CwR3l-k+e|17 zY0G{W&!CzU{AUu2^p`?@95*{OXz%h&$WgH_{co< zcXL!&qdkzYrAdj7J!(Xw?UGOeoV~{@^8YU3mt*UMk}r?x&iXrJ0H`;I3Dafv|Ge-w zU!e2=J_$lRd-Z8}p&S2k`DS@n8l1fjig$PL=^+VV7rO8KsXWM+qVWzMxbpX2P*R!( z4x144PPM06Axc6DJf0f^FTP3o?`E#05Qmw7HP$vb5njOy-t`t9IIMxYTl%efK;VEp6bei;T=>bC(y7jgNn1AN{WpEO?;|Mw%itNLQ45zGO%9;xa(X47AP zWsNpOw#LwIXZRq(PFjE=SGh(abcIVb_e;+H$rquLp9X!cD3ti6IJ;o6*aMzNJXvQX zv;X@DPm>yP%HT-IONMIv1;^k`8TgkINfxstJHf=ar#o3>@;m>_HE=fIdF`3<);_5O4&D5P2Cyv+I|mmejjz9SE{)401>wUe5MKq zr9+Q43fWphMYI~eHex4f`625t!L%I z3e+W2K4X2mUu?G-`~-ISras})pp9ye4n6iJ(J%yoWga8c^nikJ<5@lM&TWvPcgg*a zSv8p8voMajDSljp_UGw}lpw`Ufk8F(aqHgxZv}|lfxzG*Y4Y8EeZ}n$7hn_m?7lXE z*9e1!l{BRuu4_w#W<5NwIcs@) zcMGozw{CNppbVS02ZpvkS#38#So&}o&6OyyPCdR#!yw`iM;ITcM z_7{WcpGlL+hF9y8!ZK7)YUYF$`aOXTssR53~?JY z)C`zIm%8WQCs#4H+bNDKb&Chf%|~?0tH^j{?vcaLkb1dy$6~eV$}#eFsAEvn`jKip{#dyB=;w-nKir^li>{ z*j4_EjN4uRwzWFfsh}ra{=4Hxh&bCFnr)R{gJGQ>FY0}U8od3Z0H0UCdS&lc%~nXI zN~f9*o8^e)+0>;^PksHB_%7AZ0t$m}Brl;;@&)%LVnJk~vhnew;W4q7ftG%&_fH#xuhp@n)_A1^s$k|rS-i|r4ad5^@ z-f><_JNiykiyyGHyK;St?_^ipx7}x7y=RiECgEyxQE&DVsamY?$=^kjcB@ORT-XGN zswH3V7@}k5MICNt91XkK+_&XScQet7e108X94*dh4dyAMfK%NFHZ1V|$E}j4(^5J| zNr#!N14i+E$v+VPtK5@6&=ie$)y4q}f*Or)*#@ThxgH6&n?%#mSK#7zG_1Y}Ce+Sx zu=y~retJSKdey(NDkExD2~(b8w-e`DCmpAc!ZLjQN*!_0;%Tfq^0Jd>&P#hkebV1O zfSBk_t%ZL%G$O;x3s7E*(OJKXfw8i3$5js)iChHNI^9le+w6|iK5jSVS1IwoPT04N zpU=q2+w+79SKzDSaAtbnQm&7T|L%-xdsD#^&A5H>Er%XKY~tl=+0aZiSM}ohA3!V3 z7sbv#eZ=V87ckw-*YCBENL)R%zuFWTQ&4kMlbL_cMU3xmja$MYD#Og12?@jj)kWe> zY-TqrS83NgO^S6*Re!G=cYJhq3u`d+RX?NgRV>okH8?6%hoPL&W39oBTFy8sTy)M^ ze6%*Y-sdqaA~PW(?soEMwCBR}?Tp03gR`Q~UE2t&r;?hR-a&R-LtE@&loFOoGPrQ} zT9u8MF94T95CDS*q3q8~b~f`{(-e%Vrh3VRbY$|<3u|hrOsa$tQ_(GoGaM1smJ?o! z=_{DDZ-=g?crGj`+=EQg?{#AV)bkD7-c<@Xqm=a8H`6UpvmD#$uG`nvYS&hSDpnUX zS2d1w>0Q3ANprk@5S{B`zL~<`fy`Z%*Qb+2c4|l%MXVye$tK<^75XmzrqjA~Knv-h ze_9T?95FDxIwkP7k9S8mTUvuQXkaxXYI={?fUa@!)SF3T6>td^9E=G8=>K6~y$_wXKxs*$%ucjlj zH6*C!yAI3wzCgG^2G`J=uEiA!?bDHGeON>)ZnsTU&dAE{SE|#x$^=MlD-G{R_wPw| zmUPa$!*=*CwFo(J5j$nKM3D=zUBC~9{!mjFr;^PN$(6tL2L+ulN$TA7bqcGW|E zH)F|(9hk%O7q_G9yuCIdDDdgY!`p=Phvzu0?9!BJl{tNPPE1eNOWl$1DeMk(1>lRD z-_(C=@5F}FQ%2(xjy?`FgQC>DN#c8EWKt6r#s`j8{X!>GXs;QcO&#CardqjdWt7=x zTi!0mICV-sn^51*B>C&)6FoznOU7mgo;ES;$|DsA1Qd;3-zs#>SmzWkJ(jW&^r3xg zlvDNv^)5g(x>dwZ%kAgA{o?l1F_XVg{3kglKf4=y|__5Cw zms~W)$*f4g)Q@)n_4FrRi?pom+Mdy++UV)p%@#k+tiU7p9EFzYW@%NfA5mX7iM-P> zKEK4>){HC_I&64f-a~CZ^Z461tUFRuW{tpNCav!Rs zzgK6r@VdW_+b;5u4c2X`vX7ARF3dkXYAAc`MI-&#b_)}g{At}78+VrYXe1f4OZzk8 zNs8>ZqM6U(f*m`;JKcSnisSpqlZwfc>dC))BS}1$_WHCrd#enxFz@Ni*O}1M_U?@` z+pfXCRzt-z@Lfx)9;I%1GfK;RZWiVc^!nv=JUu~9+6YT6=i{p`0xO+Pklxth3n6D} zbRKyEv>zcinE%3+xL9nRYHeY)H}G?PIO5K6ZI56=g>L(Byrlrih0;yEWavFW^UuKP zaDZqI@%b~byZHwPvm%E9*W=?E2ekgrdYWF_K*7t(>ATK_naX+ri2FFv9BnDI5$CUy z%_IHv37i-R*Sh(tJnED5@N~fhh`ukE>G%0a~PC~ zT)GN8f7%2xLQimqH2;t(Zw^QmnF`l&LRvE$Vxmm9jHR6iI71W|KIx4Tk+$0x`7iTF zDEfyQJX&%@tP{^%d>FsAk%?4}kC0CTgQnq79`7CamRi65%E9})WaMJTfxvp9eY9Nz zF7D^tjTIt4Dlo-IFaHb(!Yh0K2W|%Y1?Fgkg|Pq?bN7O=W;qn;F%(9w=Zex0)Cnr7 zXHT!SMKa{eMRrw+^opC7)_@-M{V|*oUILs5DhXX@L!|OJ=eLiD&5i*?poLU|n5z@B zl=G)eAo8t8D&o&?Zm*ov=RR{BGe$JK({Aw``{U(5f2dd)i?|zj`(uzGCNd%&@ePJ{ zTn;!0$;Vk+mHss-_+GsPmn}sdztkOC=?s6ua3|C@LO3_-&Ow$$6vaw7S8<1hncQ!* zpkgMhSfcph--WCn4vVjxT1}+i34Cg$sLnb%;Ix#=j2AscCTc5X8h@Jpb`ET6Q~TAe zM&k4LHU)EzLzB9}@X}_q+}5_mdg1h&TTlS!$sHmC?}>zl&viaN{qH?o`!nTFXaFsU z>k2#;hrHI%4M3IZ^y@PJZ6A-=>Y1VQp1O$4)(X#^yIJjG?Fc6Qbo)H%kesjpHQNoH zxUj!_V7Uu8e62IH+c46O)RL<_9^$h20n_+{Kr5i69$I|r35ZQIuEP(ph-?0UHrg)$ zSo*1k?ThJYOsq;-aF45vaZ0>fDbi+ z6!2w&#HSEP_u??kKenc<%NLa2;yI z(M}%~a_3m=IB}%<_;H+h;H$(l_$lE?ct;`0J_!77&2(Ps=il2RQx0NeOK$8zN&lY5y2 zF(B^;EsY2m&J9S5(?eF8mJz25$z4W-|8~4XQwQE4lY~5&u%^Q2F>`eqfL(Ju8o`x= zm|Nwapp($VdjBR#K=bY02}D{d%KQ;t4J(*5-xfOcQRDZZI_xplstunc;%<}mwL}ua z>~9vKkgnqy=s-UOi&M`byaeE0l^=EN2n%t5NmY_W%bD7P*T^Q&!P8~>a?B7%JmUt9?-Myr0U>(>xw{Q?X`OUJIk-S5`* z5AI&9?Cbjh8GEqkygFXWcp7YzRYA-puyyYSsaH*>Fla%l(c{^Flh^QLn1nA0XSn;?1d_8iCBx(0zpeCnN$52pQFc0T1 z6GUJpNW}=204*24`hSiO)CQE>s(#N)2z8yIG6^Ji10SPf+Lde3PUsN{7*``Oydxkj zV{g}%kWl2&Iwakb433X>Fs#AZP4~b&K;|vWCNF`Oq`7?_kBj|p1u}jaiGhZ8}(+SLyo7pIxV?kjL;&D5>R`L0z z3Jo-nbO9L-i=IMX5UWyc1rULw0y9Z|~$j1tLX~Zl%LZgN{Ee5^S;^ zCO^P1hLtuE*(aQ4g&iCzNyz264?9rQ=&bZVl)e;5nng&(h~nCc@fxxyA#z;UGqhfC z5e}LLs1VGBEF#{VNciCmgg*uoGTT8w6-7XYkMw;X;p_ii8K?xUv`dE%8?gSlHLgzk zpa|kO;l6G^rOPc41`l_{_X?7IH&5`t&jrSbOKEX8+L2S8nH}5Yz!^NT5&KEta?y!S zL0-*6kn}Na&c&%egG;AB6;2Ct5Q2&Tg8a^g0Qo}2SKwH!g$F!rO%FI#8Db>uqL-!j z2fazXSW&wbNYC`1%B(DzwcdSrwqfiw;SPS zwya~Hz#EpK$K2k8~!ZdAyx+hozKp*C{g`>&qGw<{M}vo^iqW_ zQR5nN$Z@G0Pa{D?oU_Fr8D-BIZ7QKAEjNC8Fju>e9=5BQyUqX2jmV2;=0{*)8B&YD_*Lv2QCy{Ey%Ht56@w*Ya z06yt>;eWn1c@mhw>w+5b0R*f?$NSgAvwj%hR0iR8da?ghU}Xe(z#blay9$`4Ig%oi z-}L%;u-C4X38S2BkZZ#jtX2q)T|q^9`@mAJ#gTVyj2=m#tiO%9BYaB}kBsa1jtw?) zPU|>=JITW5&%X|RkvenRuL%Cw>m7tZrr~sn_y}nlbb0@7MFp&(yL{b<^nL+u{*FOo z&9}(<-8+Z)uv=d0Em?x|_9Akh@y!T{PJ*mnHHz_)@Zj^4$aTX;s>|GVehF9@EV%`r z*0mlSUr&BG=L7+*vi#y#m>Zv34+NNd5~2@2HUH1oE>t)Lrg?Yr(RdLHz4_1Kqh z5#dB!6ourCN=IJYD^$NZ;vv_J;%za z;@tY7ci4-D)6=#G^41Z^mM4ptJE{^o;2>H|Y`Btn2iat|2nq97T* z;P9#9jDjREF{?x7U%@nWv~12HZ0u*6%V@_*I?-;pxpQCWqm;W#EjbgDbFIx(e3xwz zWEQxFyklYEd7^oyK%KM#=XVR5`OS;#lguBM;2N>P)b82PEup!kP)45cZBmf3UNuRO zMG9Xd-|TuOUz>77C={Sy?u>53`|}LBqZ>0=?AunnIh_m=zp^J57bD)~P=VaQao?RD z)PTd6m2_#UuI>Ri%AM+VhwC#15YuPC_LaD-Y=-n_{C@2?yNKxnL`&J=ouoBFoE%4I z7w+vMyfHL1zve*Lz95~{NR2~K?*hM1f>CE+z%_ULl<081o>Ea3;Py0U%d%cwNAkp|?}WTSxQG+C#v>fg* zt2f#M2vAN;0Rg8um+(>L{Ht^N_Z9=>Fq@%cE@IdQ6?V^o5K;TVsfHYfk9Cv2X+xJ= z0vkPmWI5|~6>=HIbX?Nc3E2Y`e;#db7F!0}DEMuq4N6LPe_}A+2AH4BFWt1dZ1UOu&VwCA{*-t8BWF3;t<^stw)W6ij5Fp{4;L&~SatEpVz1G@ zg^*p|tQ;WEfZ34r?p&OU^!FccoT}7y>D3W~yL}brV!7TMou@iQulb`WA3g+Lhe6S? zxgQ`n+Q}bgULmKc$Vs;%O#=uC>NT-D$UF~aT)v=6&Fi=XG*!D}km)!ve`Ez|ImT)+ zYRrXjZbXJHN0ta1EPuFh{cTfdr&SG_)SQp&Jqh$ z)K^KFe*6WoIMF)>cr^z+Gd1{OHlm_7~=y_asJRP=DC2%VDQ#_)4 zI<69?B#!SWa6fg!H=6qiS9=l+YV#W3rJ}z)cL|YmCxa6YvA?det^g$lv82DipmE4- z$dpdk?CnAJefQbH!2BN-+#U0Bgf>QA;7OOXKHHW!wDoS(K1&UG!hKYc_UcCT_AE9N zBfU)JE3oOku4(#E;t*6LjR(hwhSAH8CYw^olpJB!(`+u_tb1ULQ@O_&le&)ebUtJb zNlM`MD43D)6JPZ+p&0afh*Nd?w&*UR-+LKya119sFx#=(wZv*OJRoEM+ zCfULKD4KL6Y3<$pk0uw%o?uHn-BK+kc#MRm#G{n%-3le>4Q$6{ZC2#3ZGe5?C}P}* z;*Dp0Yy+eHveSXrIQ3=+aqUT%z`XY8-8&o!3ggI+kP17dKJ~U{v$S`PtDD9n+i?{i z?Svhdv?jq+P#|qZYH~n`>r*2B0X(fmd=B@?Baz7WG~fECSLq&%ov}zYK01Ql=(}yX z!Up7H6`z>=q{n=XsvRWIW(dD$Y})@?@yv4B{9d={l&9lz+*2%iRV>1!&fQF(kaMc9 zr`%?rs3!G$Gu^poZt_^Cuk;B4PMh)9UGSjPnqtX%2J3k;q59R9DKhIeqt5Ww!5LQBq-#F5&9U;#!s3-rqV% zW{ZVP)oc{$>gma`kXeEyKBEnRx%X|315CEfRPFBCBGktFS7zLmjI0w$ImuR1aWdA#oS-jDuNmIL^Iy%b_rzf@TEWSTp>#Xj5lHZOW z3}_Jd!#M4ZMU)9|gHQk@?Gw(wGj-@fVR;gIQMG+oC9kah2lwUfL&n-3B6uwRF60XZ^`gynR1K+S-~=e{HcKh zXCrnpHoxUHf90(mOhzRP4n6wZ5oT+Dg|6t=%(w(c@2%8OVM4Mn7ZDbDK{-!Oq57cb zDU@v!KhpzE*UomI%ZbiVW}^53DAQ;tnU?atn%H`{W1j+5GJ~QH2?UaPLR(+xc3SNZ z7hrHE!r&Arb&9GL>@Lm)67-(X3XDW-alf;owy`NBFbvH;sNljmzL%uT!)Hhrm}DQ0 z860S!9Mb8~G&)}$NkBo8`@&s~(nte0*N2@<=`w^e3PpHi^0~Y{_uvXky!>mqwU(T> zS+}z-Dm`4*y6Gew<{tL+ysHl@6_u(ScE7^#m3om>%Dr_XwUsD2&D@6OG_gpHEbVqh z=5u>ohrkD|?$Z74)WRIfi8Jpmb+|`tGTNoOXH;#|HnI&K*jmuJM&H1}%2P@Exm?dDNKOY9?Ww}VRZM9?FC!o$$YAZWDf1^r>jWNxm z2LpcHB&tpy!oscq3xU4oFtz0Ld9|BAXwnZv6{*^FbrgM@6s{!Q;d8DEvTR-x)V`@R zerxblVH}L5y*KX8BxhhGU2xpv%Qz*X>?cpu&X>rV6H58?4r4F7`K%|3R?%Mg{=&ik z(Rf+45Xobb1_tGVG+Jgsj=8ijohbRMc8PuzYVH{uy<0SCQ0UD>#-aD@9<)`6y7BKe zJY-0GZLKVgFNHQfs)_gQZBb)lsZ!h90-jPej z?t43b-VBy=K!EG^ULn@N*mC~3)k@OkS|iyeZyUFTk7gT< z7|}Ha+SEm)4DDuAI?nZmN|p2Fl$3O@tFjMPZc-?S6ECcH{Th#|@TZ!>-z5rV5Kcc?T}Ve2d&(rQ1Lqk?isDsTUrqZkhj* z>9;>K^?Zc=%_~0Lz=4E#DcpX zS$l2b3+7Dc^hU8JI`c}U1xBTn8BNUTeA_i z6~4rI^%@7)PMVX}m}f?BpF4;7SG-a05!E;XS0OeI)6yB@9?!=?w&dG94L=pr^29&J zCkoA!t!7B(^g#DuPwD~RfEg$14Q!EURQtys)TZF-GUNkI?8fnajuWMIQBA)He5N97X*GXQl!#laJ6xNo zvAu=ce_F~1Bf@86N3(QZ$*vpZ2&1$d#+Z*;KboGn`?HFeO}O@Er4?~#Ef}v#ig7d= zu~z&gczl|24{SZd$b^hOt(ZNxD0Prz8p*vL+;`x&Oy}bNvT8B5jI+N|p}qAH1NFHG zjta3Icj$uq1vp;PmA~@17U-1-r|28omP0R)7p$DlMC-)&v^h4E5Q!zxCaj~kTJ$-o z_b%t{O&w5(ohl_&xVJ-(b@HnJwN>cPg{{^oti?I-$ME9wN0lrU9PN)miI3I z@TI)pHma{LO-GS#}QNXT2C0CuUXO@6>+|c7sqesoB)A{iA4B*h*E7Ped&sFuM)YR zG}p6iiuV3c0%rw>)Wea)4P0i!nlJ8i&1d{)P2%VEHLD$JUsLT*mUEF%p|VbWwefaVxR0&AEtgWa562g9z0NB zjie}RryOtiB5M&qe7!+|%O_Di2UpAoTcCoL#whbiUczXFDdh z@2Gc0b0doE=VRtps(Ap;Q`d3Hb(t0A8nc!`Wm1ZfCAuWhbt_N>{emW>tAl4Cj!+U{X~; zE30gRfmmY$u_PsVFBtArcca&fG~5$C6&W?gO+NqZCLZnW$U#8MP5Z@0-S>VqGkXj=VvSyn zYPor!$tZ1B=+M~r`b{gERkrWl*$+MTbEkczRR(XE==|Lg~)BjMzu+r%@(jxM{A0q|qw7V&9W&!+2m= za8hRlqC5gx@(L+iTCRWSG00iBh?P+Md`M|oizF=edN>#l-KtGL(fX;GtC5P*=48TE z<`k6YbD4q2plSagib>r$JM4tC_GFA}s&qkLgRm##D`3kV_J$aFVWbwCY*cSQlTmnJ zn=PIED<#L1wi;$1`sYu*aWM~Exolre=U+`PZZnKIC2Od=Kv))#Cb}f;Z8*N}FLk@v zorKDCqPgNSuSxe)ZUyRgds*Lkl!;I+74anrvXq7;1b_2#5LQ0<%fJOkgbYJy2OZ4o z2pkIm!nssMnsY=A6xtN3-O0XeJMp5G4boc`)4Imat)e9x zqoCq=0&mfKx10Aa%H-bq*$ z33lv(FR%A><&%~Ok82y!j`EW0drzFLlYErhx(UCaf?u4Ty!bB7_d~^v!W_n<>$V)9OZbZj5IA>*VEEgHQgyS_+7FahT^BxGDqf-KJnWXzIAcmst zY#tpti$RsoE_8`8s9xUqoWsa3)EF6W$$Yh*xcf>8NMf5^!0?xLP;bGO(WTf1JW)n%tI2uFaNu zB9Pi2cbC=nlgsVi(6u#t`D?o=2Fy0kgDu|yJgD{Eei7eLji6nyMHT~+!0XTCy_<1I zdr*-ER2WIWJR;4|8*cY@rmdY;=e$KSWv9ba(&F;uL^2A zdtbV9L-<$i#n}qPhXe#kol=m-AJOVgICZTAmRP@+pZd%+d=zUZ|iTw>80o+Yp&8P7|J?s zKVk{yV3%5?1`?m>WjCduK6}^az?rU@k=V0hgYMeS;R2&mIBBY2-K9v*ZJh0BrU;qd z4(Hk1d?XWY!IshMCuiMyDOQ|ULPTsx=mI_tT9=Kq{yKbBFzw9X+)MTH zRQ;(R7zQOcBna44(M8M-@&$$FEsbZ4Ki?>8+8+7K zjQrZ0YsuLtbV6x#fx}yVh|OxG?NLTEYC>0r{e5y0J%uNMgiNz@tT;0MMOLh`ao*%!vyT=f8`-hiIGMCY=dPT~oFrqrHrz*c zLCN^=?q6jSMaCNbRPxQ-z4+FC5<~XUY}+Dj**6H19p1+NAi6D)fi)yLbGEhzXo=^= z2?-00S{#X8m5{S-C8RjSB_e>db)Vq^#w(^^;&3z45*NF>9R0$Z`a&CcyG(++(ZHl} zjXIF9tXmAk2B+QP8{Dw{Sie_>=yY8^*C%75WMrV?FpHlKq1tMsu6<7Fe^tDA1Yp+n zs|K|ypMF*>#%*J@lj5K4UZ)-B^i`xCVVX;ZG>9M*Nv6ZT`@_n6xVu(IE! zZFcT{Ip~raRIjOaBF{F;n-#9AQDHoHh zt8Kburdk-v*}j$7MSa9t%%~MUZQ&^lgV>wPKe!wthZ*=kA)d^IoA1!WrSWfHVVP1c z)bmZ7C=~nwuq&_nu2Y`XN+y~M@z439Q#ho;u7}Fm zklKZlg|MiWsZ>YD(!IaM%M%ODSh!pTTNh=08S7Z`a$7Cn&-s}lHvvc7y~b=1-Rrp= zKFW*JB8PQ?apq{QvEZfW{1fam1=o_V;JI2aSY~_%zAXa$H?q{L>HO#wrfMgw_jA5* zsDE=hfhYirT2JSx@$;Z9{y__rR`+As)kfy*yK^Gge5H0%zErYvR2#n{NFm^|qGR=H)uqIMs9=gMVv#a1c5nZv=6=a~YtAO#z zZ%LprW%7^b#Z#$GS13KEdJ-jKo#ov8A-p9YIb~e-1Fw9ITA;NNb4H(VglN(BRjU}s zSbo5m4{=K1Bkd)W8*TACXri*~tSUL$8T93w{FkXDDYo8z2U=~3@DtpGRf_WOQJTXS zXR1(!g+xhO!;6(SJvjYpZuaH!yZbSX}JUx?i8J201p!D2_RC*vVz`!YYJUpH!P zH4G-LN9&8%>(4iLgO90&Kps6SX$;m7Wo-`u-=aVMHNG4xMr?E*ViX`cod^dW9VoeW zU0Od+nsEAxN0O|7;+0A&toeY`SHv%48|)04onL4E&8xW=jwL@4YJ0^hMU@+FQtAs@ z!Gzb4kZp?`?J0!Yh45%T0;8zSj7o^!yf5A0!hyhYNY_pJ2p`RxPCp#*ycaVL9B!jxWQV)k1Q2RgjMDr7mc;v;SH`;bT9tVayvY!N1{?hfi&0;JdcPQ;e63z;Ie>lcFn&Ur zJ9UbLk;jKT!6H%w%+HhaMiAaJBIcCGYl;lb1HjJ7EK-Z=x1b(Ha1!zo=)oh5yj{iK zOnU3{ZBcQF+VOwre?#zOY$0AH8*s8SDb%{moFU4P36L)bA8^Rx|2@JZkP9uq2wDUT zD$YN(NpzPzUpYtK4<&;?X}j34(TV;yw>bmCB`wmFG99V0pYrJzpOxaHBM6Da^#a?1 zZb%Wcq5V)~8D*)$ebz5*t^%&tXNcp(+1POqRDC>)R;!#rMj-#CH2)up8$~-= zFCsA8gbtceEwx?Ev?qThO5hr$rZGg{}=69)Ax`2(2HWv|$-PXdJ`mvD*D zzLn=OK{pNw2CvFx<>4f3O`UmONk>r$*32T`m=0lSZN&1GZIR4!6QK@G-;MFu0OnK9 zQh)AjxSSS&omYwFE6BIkeN#uv;{{}(p5Y?X(xw_(wX$EwgmHlBek^@72L$>e3>o@{ zf5Gt)a0sUcB1U=!rVgT}EuF{QZ}`?Nm$8<)^K6RFdIMiG?B$r*q&oWZwE4LV+>Ixq zqwNCm7i`9dQ=L93BQ6owy9hJf#K!FcsMyzorEDi_gcr}gZ1kjQFX<41zfdt`8gHrK zel_zZ0phap4)}f-KuLVFN)vNn)D4ys+ewIqVmvDU#NU<_avV5_G1>@l_g2RFZo`%u z0*<5F^j-IPDyj89#}iO)6T!X{Kxy;*$7a^a`#H?*+|=E>e9^X`GRne5PRr z0{NpkZ(|x?a-T08VBvQwtr>d=T|&<>O^z|h zG`_1ptqn+3g4Qlm3{O@~=7EV`(tTfc@hdV5TI5+8^Fk~Ofc6+NFvPXu>YjBs>dh~@ z1)E?GoJ5h-O_0JgrBjf5e;)%?h!+_}vG1QUB|Bw z_^XypM@I>SW;yWx@RW9}RCJHzW@lRiVS&!91d8Av?)XKV3T)HvGH{EqKyIHJn~ADp z0X%RGsF?0jD;Q z&{qRjS&=KJu*+W8_xTNi0@UUUhImD3bE}`AIZ5zcbR1RlrrC*;ivtE)c~5|?Q(4PU zo^Jn1fKCy1D!bQ}d*+IPDv%MDw!(YB`K33oY`UE0BZFTv&Cg1v)`&B4ORRGAt6(u| zEasQ%k>)&Dw35vPG#Q&ER!z-F4Z2bwhtuNhSOd%Lv7;WaD9AD13?KzfO9lznK|A5x zj-=B(!rDW8Q0$!jX@lEWQQm>t!@w+EXKz3Qzu@}Q}4H2>*i;a;6syiU+s9L)~Q8! zw{R{FkcOOKdj6ktkUZ(agV<7LMW=f#x}e)QJlIPC?$3OnT%@{P+0<+bHTD|Fc*>}U z2+~5{Ax?2{mlqq5hMEN3I7#y>xMBtE^5U;Ked|4Jt_Q>?F7d^Xt%60XbqgU%neUuZ zZ8as1&m=^{5603E8@4)r_A8x2(pn)=s7NnamAWWI8AZ|JaDccNUUt!a2?YOvNU^U> z2bTk{*0c$qp}8<__=8GbRG{sJb;PpCJjndtWqm`EJX+QePLx18%Zq-_@(;fAJl-CN zHn$qfPl~aZOka)+L+j{x>hX%E(oiBCYdQv~CuR*i1EtgF@2!o`jy8ok!D*&i84?rk zlkG4v({BHjWJpqLgT}xq2DtvVS`vzU=k8S*3YQvAY13miG&dv(AjhDo1fmA2W=~8+m|edMllnSTVUoglV=1aJ z`<5_Hh=b0_V0x01A$=OuGt8W)^c(;|S+(aLt-2xW(F*KFOuzb1eGiGE=xrh%*5U z();-pfRtSyQ?t17gfu)Q3i8+TKG_FuW#&eS%e1G-^=4svZ-0$jws30vB4JM$Fnv9P z)>YEdk}p+)dI(ReI;6*5g2P%L?FX+XlNe-l*>^O`CsB!A-a+(bUKsp|ZwQ z4XfKvUC}@XR7fM7t~gHhy9yBtBU9ilVp%`!nN(fIwq&+pi5X>7T>C4EfHgu{DP&Ja z#q`F}CzbQbz#C>6!8MAoZ{)k2TW2PFdoRmQb@X)wjKcT$3dCc?zdy4(`0_s7EWCur z)%q$uqL8@m!f?*oV|@7|11EstcljI&8`-rqc*?IRk1@VPmq}#Lk|t=xdvmF`kX9hZ z#t0oBC~F_W9>}FLl|n)GQ=*487PTQQoBXgA*^881*eAtYfTpk)hfI;*oV4UF(=hJ2 z^}6Fmp$_R9h4=X)qGm(RvA=j(cdeUZ`NX;3hKSCO3dO0R9P^o!M*~_$K!Ws;^G)sf z5x_f{GI`TpU!FjGimX}3zIAmz6jaW*a}DJXR1YPC#VUTYJ;yk5)+>*_HLOb|Z|~na z_uYVg`x2$X@QsV2>thSD}913XQ}5eY?m~a!bT6vJZ1EMlRiyQ?ci_$g&XSCi~o?ggN~|uqpI38PPz* ze|xGmfIu4-L8TY^Q2nB4UUI zw8q`AhS=@*<=VVR6vz^f5eH3!B6bkoHm+kY?q)|i{L!h;nDOqzKkW-^alNp z(zNyIyN|^MwDuqUWf#$ZTGkd#yupPdL3|P+Jx>UI@f_i_Hmq{6f2*jiP3f0v&+Vs* zh?zhUXo?UKq-4yDIr>pA@_s$Dj_hr@Zl`!+C93gt-mf>0imzaasqt-quNJW0xz_YX zzWO%|f`EbpyyW^yt2hzC-tP5j@X0F*{{jWWMF?9_AA16Isy^3xX~zqEFciD-hC@en zAJKURHNow}H+Zk|rtZ8+T`cUPqVq2w+m%+_vDmChLmDMr@Nt1dt(1P2oTdC?E3~M9tOuzG*K*{*S7&4vIp3-#)A; zO9@LiOV?7;(j^Uw3JW5QGzuu)(zzlaN(mw%h%6wDbf?W*&ApFj})&R`fY7x1ueg?T&daWEA2Ilb9x z1kT<9{^vLwO-SA^8 zD56d3GAkWfU$*>Hdnt0P|NY=~YPYM!%y7#^)xY@*+L&S0wW==vth0QicA+;4TUWssMfSejqc%miTfWa`Vv zo8koeO2(rf$8T!MNpcPox#<^>(4@%UvOO3u;JNx#z%lY|+t9?>_|b{vlOJi_EP|ip zGk8jD#`G;J+oY$fJ!GGm|3(P3RK&S4nAwHR-P0#q${)?yiS{78yq-PmJnS@k$S+SK&*zfa7!;dgYz8*ZO4S*lM+h9jICvXHC--7X+5Ie#M7k3y1amIblI6TEe|ziR z7gcdFbq{(Qn(d1?VI8HD7cAm_^AoM_5{2*y*cFdL#N~n|VY?OxmIp@JWfmRFZ z>`=5p;>Yb$r_O+M`Uw~VExXhe2kEVjC~UdRBhSQgySDOZ z3W(M(?nmoogK<0dZE9222t6@6uc=y=$1#K%9SHb-jCEZipTbCH>Ydo?Bq9!%HLI=I zd)KzFLB80qq9cM+L?xhnVU7DOSNtW^#?=9H08`*HK^R?lE3x4%_u5K z*7RP2_$Rpv-7^#9w24*rnXdwF*;4mxAYrxx-6fM5Yq+6% z=Uq9W-^{WjketD0)2|N#g{;i)EPUNBwjNPczad$TmDdr(K2!Ah z9ljWTH;#Q8C#`~iQ--%MBh)twzES*KxnV{lZ{&DHDCva{Z(z4FM zZdfPbvI(|qC_i^*@jbHXH7G#~V=M0hf7;15HEq(@nd&(AG8_okFhxZC_(0*#Ml}|D zta0OXKuTMDh_0BOzopFLrDu{fpkq@VT&S1kplwv@m9}bPI;qaq3OMN zF24=#MTW{5_p?;E&a@O&eCSuwoW!lXf0I!<{=0;$j7qFsLOGKy-#;9!K-RLE?_1># zb?*zuH<}azgK}G#(cQ%(93o`twAjzgTAVR#^%(V-x56|}KvfLJ2CD(}Z6}q|C=G=s ziHB0YS^PSW?&B>L1>c^{hx$0`Duk%eF9*f^Bz~ktv%~tH6-&6whPPb6Q%Wu};^()W z7_OKXT|l(z$Bj9SRk9xe@E?>#RV3^%1v@E-(1Q46R+`FpK%ZJp25rlnHAYi6(JN#q zuj{cQjvlyxVh7fS(MnSd4f`JGJu@s@ghVSX|Rx5spp$$m=rn zMk^AsaW{N+0E}!Gv7n^T$=9)3jhqSB?8Zv69#1t+@ad3vHL)^I>WaGJ6e>Ob5s~A6KMG(hgRA>?Yv6Q`0k=~8_AP7jv&Gx@~ zJ7hVR+{67_TI9|71AV8S3i&N#$cN9$L_bXQ{dnWOOY0w%NT0p8Oq9bGF>-eX1_ENk zmzlHKAijdIzl0V&#HdE@ZU4Mt5=!cMW%e?yFuaQQ$=eF2f9COkWji~s9!7eEVUD%r zMyQ4j`^&*z{U-@-d_kFaOhuk=JtXOZ`QF#2{sD%7>CDb~{a=tYUv6I03G7&)!lqw0 zt?;v0?$Z#__d)Ldc%p2B={?)o?!pu?LRA}Mg~vn>Btd zoLBzr4ceLQzqk+a8qZX(T%=@G5rGnpLf@yaJKsv^SL(?y+xnT}6f|YWjFaBK`q-$T zKMjZu*XHhLscd-8SGQiS27k`8_W(Sq?WWe*_{2*(l%lrzq*&UcXmI%(_K3|QW(}J$ z^X_6A^_kQUn1I*|yZ^Uo4;_)`BU4Czk^{2!-|qwImeO?K9!?#ZKY^x<0p2?WCZrHX zlD4Q#qFJQr8%eGm?lpR2oRUqfb=B48kT#O;R&8^|7d5x(J4!-h=c3utCFqaRebg6O zLb{NH+awDo`j4C_)~ICfH(b`B+4e3QZksa(?0OTusbq2p7tt&|IW1@mU5gus|z5e z;+l?C3_;>(-u{Nz{&U)Xlb&w$ne;lSYQ0!*VKQCQIMu|mgu54Mz;)ekqVHO7bvj$( zEp<`n@-DAfBi9xUXcmQ^Lj(RS#cWJ%nI1O?BivY|AhiU_^y1$hBI!SsNYRs7Gxl#Hx!|ZPimb^)eY@auHOJpaaEe%udnv?3f-n`((*j&wzlB$%`ibyYHrgCg2 zn!-Oc%=V|C0@-CoI>rS4Pzi+hSc?QR>KmmP-3u;h2#!ZvI3Lj+ z5c^f4=L_k5Bs6Cp*IZ>%umQ#KkYwFsnOa~ZU*uJOl#r^#no(w%e##$|@K|2A{XVqz z8zW5oTT--A+iu$Y94O_XjnZzpXO|Vy8hqeqq>GN)aQ47+iF$ne7P9=2<#$}uF+acl zr_++B65<|P#zSB_i%y{PE71qasc$tE63IB7cZ^lab}h3{cZU|BOXgCqj0r^>GSgbj zN)D?G9*|>?3$;F`Zuf|&JxFgOC*+ItxU)BnqZ&)GS`G_wkI~%4jdS5D)^{ONE)p)D z&vDlOa4;aGNqQBp;zD`n8EoCO!_(+}A9ccQVrcOf!B!-t!Q&VQj9U{OS^S^UUya!{ zdTpd;u-J8s$PLYaDoFj`&`B$gDaQ3gfCSe0_H6jqZHK{S8z1WjOd5@0o_N%(8kqSiv zRusC^>c&MouKT#q;r)P(blh@sm5H#PG()!=Foo6TEW`ZTIDwq8wF=P zoiWjyOb2%7+ye^(6 z|LwNALZIOxi;40XX@;I`^S5E)Bu~EMJ>XG=_b-lo8)`1e$WnyU2iVus>em*Z{z2v_b>@-A1Sknj$RBwT@7e=i*?J%l>vmR8lPP?o~T>6CRc zstq95pZ?@c`QXkw3cl>y^A12tp{0TSR*Y0-iag_10=lJ3vouA`nIE~auyCU#I{2|n zSvg0c4|nvD;w8cB=cMGBRL{{}DJxBM9IQm9?gyFSLd4GzpIZi5kDlcaRlPwE#b{cy zN4d1xlZSai?jo9OfkJQ|tUw!TBNXXCC1AfLumTZ?y$g?j1pTgS@+*d@xZZ_Xzv^4H z(Bh2J4F`*FZv4^kBI^YWz-{}|gy20SK$oMfvHN;LiOAgZdeR>yQ49ZMh9m)(`M950 zLj7aCdff3?1Ms5366bsW>5$oz!b7lvZ>SqQ{6Qv9qA1P6UxBlCa1oVmZWLq~=2o;U zZrK+()+wIDZr#d4!2Fr`a4cyODO3db(?)k9CLK~tQtgr$B{l{o_|4vf-D9v ziJIt|{cNWgqany+5EtKBPxyuES^HgQ&!j9`BkcA@zXJOtI$aE+bCZEHmf6zwVeBjT zrkRO_wl-JpiZe-TsM5{t5BU`SU{MXHUG~|Bm9xzk6Kr{s{4DY-EO4Mgp_J`mNbc>n zR*0lH{%cx;Ythq*9p+p|gB=TW-`|EqYa>?pap+pL{RdbG99)ZFBrIMoq3WEmZ`+hv zlF1aGr=^m1SbQG@f&m=E8yrLJgOBl|Rowq@A)OaFEcO4m(=Xl`BgfJ9kqp@#f+fQA z(A{@h+1yE2jfzTL+i#QmNy<42Uz*8=c5NioY~7`D7C>~9WcH~)&Wkj2t4N z$ua#KJ&hB^<*Vet?zmMOwk(U8@E2~3e(xWnZ4>2980FIccAHRXSPoAWu`t#=UAjMBY2yeU7y>$D zT3dXYEvPPdzqu}Rcj=}~VxJP-HJNX2r~PccxY_VKF22XRpW|)LK*@Tgp?>F1I~Ff_ zL{HaK>*+$(ptK5AqV6cXrQUVkFLk9|ZmIj);!RMPU&vFl5YwXX9~d{=2x(J!N#4AB zqTb%IRw8R&9)9xxR1iD#GdakeKjXMQXWv`Ps!rmu+q-gkis@^HCvE|BVzhP8!wd*W zrP_(4+nVxiz&2mWo7g|FKlk}I@V(S?l+3vRsSc`Zl4A-B3Nd3zqk0=z%>)s2uLfDG z#IPsu^-F=QO?3eFF3EgWB=S$d)p5WdX4p zlK*6bOInR&kFVn4uWSpK_nzi@Ow88VhsnY#&zf#CHqBJsCC=ud9Oc+}G_9T>H-<*m zTlPKOhY{l{TXV=ZM1O;t$5q9c^-=!_z$X^Ah*gaI?jWTx1qPV*(w8zE=mqexPffXq8;FUq({V$f@S!wz6wvHME{A+)i^y z6_4* z7bSn#h6F}F@PHiQBOdvr0>7X8w>ZJV05N;$I+;<97wa0UqN#-yu$z-}Ldb;(kcxJ~L} zB#R(?6Y)~ZmV)q%BsgV~ntqPiF^jLK@2T~sEl!YhfAEyzr*|pFT&?)8uy@*L0YqZi zGGX;SxDGs-Z6v&Qh|bq5SF8z;-7|GA+B?x^TT}$-<{J-&qva`=l6)BTvpGP)b~HRI zd0|Zlfg-yDDMT`sn|H=*h#+4?$eRE_&_h<8Fj_33g=8h%iXtTZ9xO;2CJ$c?)$IJR z;`w1IQeD!oi50p{XNY>Eq`UgJiI&4GUu2%pIbTqakb%W)59N*&E!ZyPN_vWQdwo4sP2BujQX^v_QhvbUk)H7a zbkK^YTGb_F-4)6R1=vw}T@-J?_i`Yv{zoo#GDh3BSM{6xbHcsOuHd@tp|4Mpm{C^% zra0U_!}Mr=y#VVCeT2~$^H6GesHy^hI*}kS*$->`Efp=eka54HnBB0@8pf}!s~RDH zNdk9-2^f>I&f6F1F=8vaqVK->|F5y_Er8}!gJ>Ims(!mP66-V`_yjK~$!Ng8^tR5? zMUfDPIL8vG+o|K?Y1-=-`aWd)D%=5i7Fk})ii$jv;ox&dk#Bxuajt3a>aJk1EIy|P;}p*1BHd1k&Uq_R=$ z_6P&G&0=_K2DBw)tg$p@+fZ5=rZY~SEqEtlo?LPME=gU(*%~jC6ys)$4I!ONg@PHg z&n`H5U+F9#NZ)F{a9r-qXQQJ|UW{|FxO7}36OS7S%c)+lXGaM$wXo$d7gqVRbzM=# z5lQ|r@&3)uw3w+}86!h?FNVf~_X=_~MGeK|Zyq?7unsBwESW92-$5(mUa~Vpld6P#t zg@u^LsWQ#hF5>N+w&RgSTaj-MMW@iPJPy0Fq*I>h5-&WS3Q|CUbB56vCCC$G06HkO zpz)-+f>*{?5V7=xq}dJH}HjRR$@#e1>_(81@@HRzr#_pi1^8C5vkz~iMWa6n+4r4 z&_G=rqM>0$&3iX~|BnR_SyF3%_jv^z?nL+wfJ{&NrlJUz7CYjPYu|o!-xN^C_Z;asmX61fuL}yjI?>4&=bc%{hax-Wvb6R6xg# z#S9{e)@i z_OHcrG!CQBhERADxZ1Wi>+7SF9zZ0eHUK8=+6sO6?~@B?x@fGC`$!bo%QUvv;CNx2 zKBpNxrsjdruc^uP+yA+glaf+{T^*kV09RE`X{B%)?A9CQ*wi;^MbseGxnY05DGof0 z0c)SgkXEtB_RP#=EmEBwwZD4>Smd5y>DMjAcm9HPAPvNEMHF!8r2Q(cS^Jc1e`ng1 zD(C`}da2*Wv`cHY<8S|6PSj%vGN~TuzX2Z|>TJ*?9xr39D8$*jg|$Zhmz#e_(%51* zVrcUMxD&WC`5oL_2D4^^YCpIM_TI&O;QxCslzUB17UN+%JZRzWfUI|IP*s(;`AeEZgFnp+LpvZDsn$S1;)O$o-} zdH9FAF1-`z%UV|kl&Zv4C5A27ldelbBq^6b$FIjI^XGq7y|zLSBx+Jh56HN+1j=I& z=PC*VU2?IMgi?&@$+iu@nI$JPjZJ5hvqZMN(Eiznt^g8(MxJyj==(9`q)A8}M6 zx@^4l>xfYgMzX~D=R<=Rpef`hMpvN!cWst}8-Xy$e|AtHlteC-gqbt_d4gFE8^+!yQ#fR& z5I9!5VPuZFX`fg9`{y2HVr9%k^Vj500;**S6hL`7QSnT2Gum%&wY>laFK6|G6#rd( zI^fb+v_9OdoUPI1ug=jiO0R!X4Cu=((ADv{=<`a}wn@FGL`dtThf_d^b6NIuiOd5$ZBorY^Z#R)MxZ-!02NH11d~1WqxaizTuXfe z00a!A#>5t`Pbk69fc9Q*cpGzWA!)|XuEyo^w|1+GV8?BPO0Q_9lP7R6eGa&q%1S-S zy-rp?u4r#QOny`gn8jSXKY*ZH?gti<#~@aIv!QPk$Ih$eg;lJMRAU0I=QvN3&~8Lo z?*az$$GBW*xpnGDZ7w}_+1DrO#8Wx~QnXcIg}9zh7a9g&gjX?!sZ{_Z&bJ~>dMBzu z_3u$*$1dtnANB$-$ZBc8&y8WsX&f!~^nuwggSu`0$}&ce{U7QrQRO|b(JBVkv(5ma z+?NyucN*oARYAKSMqE*#(ERWj>6V3ou}kRsaKVsBANwSCG*`$9<^(X-ELd)&6b95s z=tbCr&0R}{4`Qtj%4N)JR0~=lEg0QMXJ8b#g^^|bel&dEHq_fe^CYDSY*rHt1-w7a zflXrB$kf^awCwYpU3L^)z-4%TG$6T}=G;bM@Z1h(PlUb@o4Y{1|I%%z3AYxgkV%P2 zB_l2HD#t9MtG&G_KU#;cQ&KKTSCWSd^VMH5Gys2-YD|ktz)TjrLwmeG-v0NF1vi4$ z|1=QSpTby3>T}~2mH*J#0?+Y57&fpc`tb5&)W2VgRV-F&)vsC#s?JQHJG(7A1BG}2 zN4+}eF@Ob5cGH2-I>u*vm2aZN>@zNbTI(OMptH3wGn#wEyT;nSwcvWKSNoCBhVUDT zc*8e7Q)DXD=eseO^^z$7XBW`(eFX7dh~-{1_;gK(0(nLgsdA2iLV15c!k&6{uP_cg z2E{xQqfqTNzKXGCKcHB#{4l#r4;CRz*a#2&sxzTnpihLQLAM3};qM_ETDFgMWz8=OC7Eo}T<%nY z4J|RkUDUC6ChZT}KU0HQN|*Z@>Y}KvLoc?)SKsB*rE~W=$SB0ydOEhMmla8uI1> zEl~5V-U1d}U7rvAB_Up#@p(9VCop*gYil=XjIM!te_b+TZcV+cqz(XZZ&iYwR14e$ z@|@3K<<2`cl94?H+NUnin~4Cn86g6umai_pPB_E@qf*Z=l!VvDdX0d*9Ru@WDIC?Z z0z!*J^+(Z8`imcLfzcf=cciesW|f%2K0q&bn(wkp<2(F35^=jFEw&AQ6mM(b&{fFo z$j+!=qQi_pOdTJf12k)wz57N4WdxV)t3_pqXO=v*JqqTy~s;oO8gE zCq}Ncek@Q;JK_rlAP(OEFOsQ!aI>;d5ij`kmT4v6<~c(>nlb=K%yuKJ0Pi>0ssU{w z>k@N_Vmn;4``f&vvAX<+lRfG3UR0frCU|?=+eT!-$+PcObr^6g>sx8_-c!WPC|n=4 zIIN1p+YZI3aqouP#DK4Wy7v`lga<_`mzT+xJk}2%{=T}U%5&iDJd)hx;YV5CQ_i(l z?yXCKso{+7WFC*gZ6t>It)>^J<`west@Z{?LIbj&BId3Kmuuk?10O4 z(?2g62ZAS^Yx@Gm-jL-1$p@rW@m~Ai3Os|7hd% z%NfLVrbQ$Xuv5lV@b=+q8E4v_e=00qt0yg?w(2*F4D)~}PGSaSo*UV=y|kuxi;mw9 zXY{sxx440`#<3+#8EKVb^UWxTIFhVo?35iWznA{cjV*pCdv#oU^%=(`snTC3& z%R4~RPZROSldKc;wF922q^~v`1$u1U>Om|P1Kc>^YRnB%=sY8QQIwpmG=j62vzYnf zRW(wsbmpjzU`c%y`8A$b75>FNHDNgOIm7Fm;$(@iW5RX2&^wyCOj$uMR=^v%D(lRw*3fuG9Q`iSvykjdc zb!O+e#-JIEC7|{1M!;8&+SaAkx$%lX+_9*-_lFaRS`T-9Bl_YRP2=A0#s^%qa9Uyp z(NZnyS%2KKLGph)S;$2WBgdFyFe1T!P+$OH`YQG(0|-uZT;iqo)Lxqnj5Yaz7wSln zxr2;%3?I)MDE`jXUqhhZv)|2OFqii3H#Z)q=E_S^p=VNZjF|fzIB4s31DifM=9)DS zxjb6Lb#Mz40VH9U~p88z&&idyt`HZj+c$DP? zyd%I=;Y6~elO_7(oTYn4mSnqX@n&TsgrEvIlbrh!O$9i%Dra6BnayEJwv&9PLVq}U z!G6kj%oD1d*Sf$$*rX-gw*;it4PLa)#J!z zqJjJ0k3Z{1q@4}}($NNq@-w$SG_ip#kssMADYdu$at~m10yx1VtjR=e^M6XG5_jTNuVJOSp`b94)j^ z6uK_F^4OgC8J&RCWqHr4!{Um;*=CIB*EM9_!64J!%sD*tF@U~~Hp?v0-El@fd0*kg zZ$ns2nGNj7ia~z0{W$?FtGPH32@g-bd*6cex-pfY@G3@vpiLWj-5 z;YY@9mSvnoXbW|En0GbD0{eAXqC0D_rQb1_>p97^O!5Q~kk7i~)Q3~Qf`kWkh=;ld z$5pK?VaQ2XP)VH)|0cjuOl)&vzY{?Uaf8y4Umc&2d`L!@c2B|7@r5;EOV3n^-+U5=Ok{pM6?eCbp(ztL0rA9;)d|z)Jho~cC1w$ zmw3(s^h0Vmwu_?RY*ZvvuR>ghTso#rwvLYvdeHN3K$bnwW5{rE)T#JTtpp$eHb^^kB12iGdW8*EmqwB~zvXWWVc z61*?j8HOyf{n12QA{p904>&XyldKn8&lnU?$CB$hGsh9ZF`V;Ms-R(#_nv{+ZQ+aw zXrIq;g>926a?FQP9y=vGfa?k~*%5F1X9!d43hGvM7@As82X|QiA~LY$qdZ(GOscd_ zu(5E9Z&C_>dhJ`!gCDTQT2dw6k(w#8c_X36+P97VO)x*H2G+S#QWib<^B$z|Owx$P zQ$Yu?$ZEXDFS!U?NJcv_c_}7k;8s=vy4`iiI0<_Eq_k-2P>D7Oxr1h_AElWu+$>0^ zik25)0-HK9bVGEuh`k~GAt7eGWFgttoE}UP@eoT}V;F-i~lDsC&#Df`Ai#Lx? zlG+zRL^ves>AwtZA5o?veYXpjm+wfZzN_AYesC3a`EATM#@Y8Rh47;4%r)LV^i;gV zqb#xU0W?m0l)+Jq87si!3w=|09R*=w+*5&Q$-eplH#jB;)jR(BHQs#}G5?l3?S6T6_mo&PGUJ+O8&aJIHR>uWX2ai+?gNr09|bCfC~er^mNQK(H0FKc zXmAG!-A4?1vVfe;!ljLtQk19I(=V)$|JIDpdm>6Our^2+=W#QGy${x@q|4u)X~US+ zyny2>eG`-JZcB~a^K4a?Y3&wGDXF#@EfFPSxkVQf@ga+owxQDIc9u&oZ(M6V<^2pd zBw1-eO2y`iy48%6C(|>TvskKkUW4OL5Ly_==LT8f0m&2cy)#YW+-2yJopkD_P3^>X z-kupRPa=#D_KXVE%Nup}+|Ysf+S$0($w0O+=;b_p#C~aZMh?X5-D#%}4Y5S4X5Dy| zf!E3yE$`Z;A=qFPoeuL(hJ`kASxd<1vaYOzxJE!+&RuuSkfGLE8eivSpkd(qC+kG9 zLyBG^4jfgKib{lgao@J}_v_{H{-iw5Z(VC?wnrifrglm`5%%qETK)pZ_;}a5rCITH z(40~vv3g;uw=Sp>*o9~+yICy4#lC`JFBL5zUNN#NWC~d!@h%@CVi8HwYMAqpCN&3A z?Waca1Cn(Mfy}a~X5#;Kn$nV;*+zfeLAg>L_3nJ{WmC^J z1%4ilaha%J&1G;zsMxiH{&S=Lj+Nf!DmPfCmnsYW4k@M>w@x5!3q2qDu{9Cm#T*uZ z-UD*br?K0DUz8Fu@?zKNz2Bqte~o_03`kCSgTEdAtflH5MA9v-#MV)9u`A@E2wi`c zxN-Fze3uP;r;*T(5gsk|0++H?fo9fi^B7J~rjmBWKqdLo*oO`Q6BU!9&Om(GRIZtC zbPQy0ep)^~+Lnxxy=29w02A;+CmRcUR%2$({rS4R`8QK?DLRL|#eV)s%^#NfxspjE zx|7jNN~eTdwL3%ndLntzy3JUP2Nk~mZP=Hv!Ol})o;&Id?`Cc~2tPm1{xVOeHb^LH z`%x^JAkF09MM%fsn}?qNk`RZL`nrhh?KSCb#FTZ7(ev{EYA|oGW_f=Fdh$F9iBvSu zvR3HtkTYk7Zlgv?E5`_1^5GGocwiVyn3+ zdroyZ`Xi_dhQSmfh)s5`3r;^bL16R*>QY7d7m&2?Z2PCU*-%sj9*t@2zn!M`KaBZ) zTK3fv4oINyaSQfftA^~ba6N=3nFmNvW)0!X5fji2k&Epq_FU+V=6B4pqFBe~3Y3wR z$q4lo%j)fVy=MLL*^0>iea^Ft(6{XG+HX@Rl!Kj+Y8#<$%(?clc|T5&DHKuELo?t_ z-uYo*mTj9{`Y53&Ya?ATf{?6gegX`EJ#AFfp{ZN$WerEOXr+99Dmc@qd96pcxrTWn zk71}B;$<|DYvfIqWR$AB$~17jJ+OL!wiG2F*MS`F>6V6mFwu`O6~)<8WHdF7Kb8)N z^19Dq82z(WzTfA@mz&bwm={MWlwQ}9$VILMFYmuzf+1^Q7Bsb{==CC@Wy?`6X{Vtw z8N>>h-uD@0@{VLEGJQ6`*c9xqU>GR&Dma-u3hD_KIlK3EBzQ`eaREp2lWt<Tv;Z?9myzV~bY8!g1^L11htf~~6E z>mcW!b(%PQz*irsQGXvaj)pu9h1`FVboLYor>UxsSlD%lb;+3aSnd>A@%7&c2U%)e zo)CT`OT1uO2>gGo@gi6wR_IQ;Z+wTJL-?jPJBk$&0O~BV>e?onXts3Zby6l#@`ygZ zBI!IR6*qtq^8?E$FIJL>pZ;)ksOiF5xo(HJt4NnW-Vp zn${$G7piq@V^Lni-ZR1;`zgZ@^Y=H5TElX;Lz=VrLWsF3?n@V^w@$S-bJCv6kh7gs zR&yF;e@V`HjV63-vba`3TsHWE@m2cmF?u!HhUDswIu=I-E=O?7lJbM|IOLzmUY*PE zI{Cv_3g*{?(yXd+2W~PkziHp(ycX1qAsA5Cu&rjSL|a)%K}0RYvfQ|g!`IuUO+QM6 zE#PMJ@gIkliavVGwoAwd!%J%Poj25NZUvSiV)Joig`Qz(*63(H=A34nYWHlJHRS%97H_wrn_!8CbB+k@291}$B-5Xl9*Q{EJV6v4cyVJK9t_l>Fdy|d z-iDlZN{n&y_3dsja}L@H1o35=?AQu98r2t7iM(P%nUd1IoJ#pfbYE}FnCC0DnT0tY z&Ys1(+}RtIAn8b(`(sBIiw}6WD_pPdS(xa%NUC?k$~5~_3x#!xbX|!>g2Ay%*%q&R zhBSJaYTxp$YNwmBuQe`)7&%Qv}WqjYKp(e9K^H9cH6b{m5`QY!E6sBV#-@A z+TAu9fR~D$g+iHU3y+Z2j7los0TfT)g@E|AB@54f&`SbyiDD><&4JHDh)A_nQC2#e z-cE}D{E4=sdYMGr4j0rhIf76Ouu(_mP@sgfa)X$0W1Y4CHz>c%h=_?1Q(NLlpIJei zK~~x>{BENF#E=|E>U;N+bNQBCTle1fktrj@SRMNtVe?ZsPGl-o0xsezJ1hQ(MEQXU z#(tsHZR4SgYiwhPaLW`zzO-8CcsbrK-7B#=SqnBHyHgtd?Ss$;^^2%bievHp_Ew1I zk%}o|o@xLmL(?VeWj5X%;vV&JI(y;g74R~cc1yZ924esDV=)wGgR>im_q0Vg+$UKZ zihsZBG(zu-H+FTYS*BzSE+b)X-{qC>%msOA{hP-f2z?q)^3SRZK>EN_uu{&y@ z72_lspBE;J`vJPJjhSVf!Rq+NM@t)Z`)?BhB?&2N*m=%bj+oFvCuqP`tCUD4K=DL) z^tXm+{+Pv3>!XByv+vPr_SY2%`JuH4N*E6;7n&Xz>Xy=22x{{taP|U9>rNE2iEp#T zJJL%oc2Kg-Go}h6FJzt?E8$YLt)$L}I{J>0idP}$KZFt+Ny<3Kg=+uEBgtQu1Vy zp`_-7*it%3T`93-Em$EYVG4!V<=Kv59;IFgrin6RF`iwZZ5gm_IoE8VQHZySv6B-k+Jq)Kdhfv0PZ)7<@h`3VNthB_ z4R=-~6!o9cXJ5ywM)vNzDN{tXsjK32kf!v}{?Qf+N<8hpabv-_oNYPf31ahuaF?%0 zv{9j4m#X2rikxK$p#FdE6WNT*O9xw#ycRI!(t?c6GQ+mnGH;KTyaSOUmALhE0e>;1 zhnT6f_ga4t?x-qU;0^2Qt`>_`Xy4=F_^;&q;r@3$^*1Xfo&U%#_^(*LI&I}3V;UCo z=WySdYEBZXdqZ+-9BJuKQL1l4h|#;bLcEOa(;N$-Tq`f2-52Wfj;gNNed=Eax z&bFRlOXmn#Y-`+)@L)KG@BhAi{P{l?;8m=(a%`37sAI(LA2fAOT|Ad@X7ft=vi1CU zGg1aLjbI!=4;m8ThG4FGqJk5=du+e8q;fez z+!}7hdxpUvH@C%H?>2Iig9lNpsXBQ^`6p?okWu4UkWZ}QEu}4@jLRYyjH8hq<5S8w zq5*;aGVO(kIPrpoJAs0D z8#Je$=`}uOc7`cX0CJRtYgs(BZd-_F)!KWiOjf6$mJ@!re}H5FmhvEt>e)DgV+j>m z=CwkKA9e6rG6Wv?zH>!_ZX|hU1V>CvbzH4w|2^srey~{f^=O5C9fjf657z%yvTnxZ3bmMuo}5Yn#mQhV)^&3z{{b-$1M*El*RcdwgO7CTEZKe+@)k zN?)Y^)b$%?IAe5mQMHqPdX;{O9!jJ&xT*E zrv18VaR^z5NF|?7H?y>-n|}IJb-TqaA0&Yu$EP^(k&EIEO$#K99}=% zlN!mtNNwPgwmb0<4RC((h^~1(*?Z>q@mKc1CSDL$|JLx5`bgS&`o6;+zyQm*BA?*~ zr!rZ13btWt)guO7G}r(h<=ih|(R?Ue=JOIL@uSAr^J-Pb?|(^o1bQ#oG~m zAv)%u{(F=8B@t93tpn-FIFc1%@A-*&!w|_W%LdztTn!heVKR-#Dt~#MYsPsQe~Ckl zlI}u+;Ds`d82wHJGj^rdy;vIIb{|MmDRpFRhGECTXM_9{DyHlw;3-O|NELlr&M<%Y zp+Sia$gXgBZVBpm63@qWJW)+ylip0x6F0%}RKE3e+}3=Et-m(5Sf75!M-pa#&;E6cRSCA)}s1x+rI+a-**MZfc-&uz=DUPNMLUNd(xIluRZ z1%JBiZ`JuT(C~pJBhukw=8sbc1u1WIr1Oy!S*ey4!Fv23e(CVV1!alC@CL68R+jKX za#Ewu&ORNglZ+;Xs1lkA0Y_Ei$1V#Fp2p?HB@Jmk_5E&q1buh%#m&Wx!}T3$ql=F+vm_ez2Z`^kIz75Q28_Z6=Z-{aXsu< zFN=u0xM|xn-pDk2lxQH<;XYcn?W<^w7p&6dbp_G)bu&b85JaxBulSkp=dpnn@cZKD z!GX`kRk1a{Ze$$(^mktH;#v~^0<+GUu9?}r(32#A~Q0< zSV8piEf|A55mi4peei3X`ZMR2A*G+moy=O7fr?)%k$rrr=krtMM7`dG45^3Sm`I?* zo1Pa&8O@W#j?zaJZv1=*Jlo~f;G36RLB{(XIIbaT2w?&WvTpU>2#Gk`$h#&*aQRX} zP}B}h?Pnf;oE0*7C{0@=P}0ch|CGADDC0b*0^G_XH-p%igJ{F=9Qj1eDXU2VNyu*2 z!0>ByuRP;JAmU$DRC;&tFZjvZG!373T+S#L=r!;jo|j~-&}+&hr^rM~P)CJ^hVMllnOHyIj7q~ehp@6yrk zRPjvOd>do=nJs=tqGPks{({gv#iv)=f1wywznZ-n^d&MXG>-3RUxLJL;vUrM-R%wJ zp7eYZ>9kduLx@~uHT|X3)=bn06(iXQ!=;C@l%wqA3+;$XFQ(Cvs&%TGf#yGB4Y9gL z{N|6p??(K|9CU#$f6UlkuD|zZ0zssCa`nqo`HIOoIrO;3$=!@x9@%5Tj+WQ?h(rPZ zJ&*k8%s1eh*5Q3n2#vtP`7sku+9~?qr_4URjv;F5}+Yt zLf6*4xAgG@NcKtEd!x+0EwV$yI5s%eS>#y`$1#Ar~)2sYJg|t>shv6;FZ2ygE&c z!UC0RnlxwY$E?LZVfBFItAn!m`iWPX=ew0v^J$lbXP$j}R~*K$87uSDB0iTW1{1u?HN&;H0ETSVE ztphsuyU`qZ{si^S4VB|hQbpeMZlDidj@7fRwOT*=hZb6k1k|E8E#Io;84GF_Od%cq zeD)PM4!_TWs==S;&+FSfLdjbM(Tih|_QFxC%Sv_EtJnYa+m!?#Pu6)#ViY*>G6~eB z1*=FT&nM=LEV=bd=A}9mS8IgXaOcVJx!g2tpZ5S<%(=4i|L{gW5R$OHVR!lb5B*`4 z1b&R7xR{9~aYzA<>q6l-z_Wo~ycoeS)87{76PRF-ZzOy2GrzL~?ppq$uHy*@fl8q5 zhf~cT@j1$JauznDzVRu6#X!Ki8;w^iM6I zReOgG9#jWYeeCCq2LUS>e6}ddA5_O4rat;twYBqBkknRH%cFlR)d8Vq-sjB2atf;1 z>wGQfPtJ*@pfl>@5A21LfhCmHhv$zj|NcE&Z1Cy8Q2b9h%8(r%Bwfh*!F@Rv ze47{pD-Td1t{b2Pg+#B^8*Be!p>EI}mrFp%RRPDsTA*BCF8NS2-2vSN9Bfyjh7E|5 z;3y{7PG*x5YFS@T84*LLzyDqSeaO?g-7qN-$4>(rM#DUryJeXD5`=Y!6{E~ki*b(4 zs$Kg4EvF6w6F)9G17{^=am9`7jFS< zMN&}7_S*s^tb@*rx3@h2%IAJOKa|%nGoVA8QGB%<)iyluiKUD9HthNJsQkZz>m8P+ifZtY7LC;{fqn_k_KEMvZX>To!oH zL<`tWZ*f4?oYG>7XThoRq@BFb`rc2SpI?Au2Cm%KnL2-+xJkg=gBk)=CJ#V`n97rJ z!2j*H%KQB{sq)XM0^r|1vs+Eq_i7=0i>ap|}F% zW9g4EEOjgja1;ghF%FN>ID6e>nV^R{4FIFxYR0{F=8GF(cNblR@*qD%o?*zB@7i#@ zC5jM}Cl8@Z7!UB{i@X0LcWoWP+1mpd(kPIv>;?{aZhsaZ{)aLu&k2B|RL2DL4^Mlc zONX{9&X7|8oZj0lVKq!GjO780B0bMIBi>R{j$y+KU~r#_R)Wg`uwV+X3XkMs^)>%* zy%fQE$T2IdLCe{&{X+CJ{3Rnxb`T1K6QGX5ki{PHHIjWZ$-v|{2H))# z*AtDBzk`QN=%>&}Heov6Z|&I886FdMoR#2NtO0(bPjVlJ(l+mh5QSmr_~>&l{;cb# zK$G*=qATVA%YcA-3jkdQ=9}3A_k32IL50D&i~Y@k`X!_19QM=86Tq2?&f{O-!>D&2 zZcR@DVf!b4jsbG+g8UT#eu$yDuVZr;DDTL}SHRKvZ0rmqW~xJIpg_KZ$0c{ZA?yJ{ zcwM*0H(BW0)j8AuA6wrYj%6Retvl5%$)>VyTiFex?2POvvSnm%WzVvAL_$``-g_jQ ztn96fC@Ya{-p{3;-|s!%<2{b&c>X~5bzk4{ndj#`=bQ8pY~GQ;vbj@({;xEgoFb5$ zubFa~=mu=iu^p^>D8d9vNuk6rR6;S zzKj*gvK9G||3rw|t?lr}74X>ae~i-wv&|Bx!gOG(yn!cRS9b+) zf&p#(g{ZOzuw?lVg)>$?xNPnR3eQ#S6_fpWfH4;8OC#NL1sdr}03+REH}iCR6|ADn zl9JcWxgd)m6v^@9qhYSV5%RvxvqCeJ9PgDT;8-jy#(m>zHUX=^-iZ# zYak`MVSdp=LG)4`%#Kj~6dtA(a3pL~tH4mx%P0b@nTF#0e1PttuxUSo?zzRnMEbyG zFxJcANv0WZCP4&eu0=O!sI&gvs)+a#Axju{(J`Ut4J9QaP6RMwn6p1u@Q%3XLr|J} zf6UuR)nNhH43c;oLfZr_UIfxbo{BWXzX)Ng?YY5$t46?zBU=b4sUjUXs}m;xNH~SS zp!XZ^bnFEu_qMJA&2*xROvCoUX7Bdosx~k9QC^%zS{lvx!iJ*nslj`;JHRXH?n$`( zYaY~LP{P7@#dXcH(kYi&%{dR5R!-aQtd8E7d%_;ZB~L@xU`jvtaqj@QShw88#lKNe zz2y`*$7c-pD_#=w-h)Sgz-U!w~SlLHF!K}39Cp1zv zX-04Pb{q4|$l}aT%0e)e@x`Z*|Fmq+9QD--8(o{9wz`FZzn~)CHvOKb_f1om)Hv1) zt}GUP9ty8g?$y|SkJhN&_SgZkHNAM=!~N}TIzGB8ZY|UF=!2g{uc-NKl06k{!r4kc zi+#A52;)6n4>-JT&UM`gGDgSa{uiZTP@(c*Ge5va?&F8|y_4DxkE$gjZZ8tyZs3IT zNcgc$Zbvls5t;3w%o2}=B@_4|MLv1DTm)}S*oyMTH$<-ATz z*CxKO{-(1ifFErU@VJZDM?Mz=QoA3RM1KL&^ci$O!zvP6gJR}>olUbMdZO>W2k>k1 zgzVh?FySL7&bS*)rM>6LIs)9(*mYqvM4pa=dk6G=&(>dlaPMi!GqMp$u8S>qmw0iX zjmy>t5QaE~d|L**@(;nwKXL;1%O&5{TW~%8rO+toqvT_}7hWb{UIB5(?V-HO8Z#UD z@2t^*YKjAoTA!QK{waB>XC4J6r7^hJhtW`u(9)EKZ0Pq@3)fN1Qu;9ip7_VsoUfpB z|I6RUQq)VTFg=`7>dra||G|2bJCW>?==awC1Y7-(uarIHAwptIYSks&w_tLDvsm9& zQ4oPqksFR-m2#(3^Kez3{elf#_kJJUt5&_(M#4!@%W*#Rs#`8Q)E~AC!d~OV6IzshE(cofao2N? zr>t7?`#!k49#cQgWl~I>{LS`NsO?6jQm7}eduw~*m)Iu%i)=q?9JNwdKNOqEy%;eb zO>tt5yxg!tE^#+A zrzi2JePChPSO!x8H#r@Y`&)g&Dc;?e1LvXb-gBC@&-S{k2b6cd?2%Yq;aVL1%`_*STH^2^@bF{%S`mFl$(tJk-i`V)oz-1I~Tvpu`p_A?5B=g@cockX?@6; zCXo=KJ#BHons8<~y=6At|JlSZrIhjr5i9O`?vLLQPW(zD9$7R6@t+$P+6YOt-=XZd zMTOQJRe5Q}VuO`%9h+^%?0iNTzo3449%VfC4*3`yeH~@Rc-Mh}wEdlZ#-Nt$bYXQ!3A5^0F%rOXH;tTleyE0{wG}frW+M%?m`+XY@2zuGGe-#xqLqB`q2_ zt<9vQUYd8NezGNxy&)=sau#Y;s%sZQ(kj(^EBOXbK0fCwNFUX|Vy@2iJmAHpLq6$9 zuC`cPHkwy4Hv{oG*}fG%E_8aea8~R4-J;kt&-xj3O8tdiqJzbS|0s3!7P&MsM(;$b zWu}3%UONCPA2m0x73gjWwO+GFZ>zH92JQ#ATK_iqphK)TR;fDs?#6AYl^2nGRh2L3 zBco-m8K+)+&agJ~sEcZ}1&9vYjJr)sR{d*J9G)rxRYjp4eMP*3PbOLW%F1xfU&oCgu&h59sbWN0`E50 zieCBnhe0~h&H=h9V^kDnY`WM)xbteo1RB^CN8j)%dbIOz&hK%yDr*E(o1yBTD zqGB4MHA-VVizmF+e}3LH(uwfPt5{bw5y`Cg><7zl;KzT9U7@KmCB~1wA-r^pkW8O< z_LOu>W3wv4yIvtDx)SIyKWt9NMlqs{lH#9B;>n_<;X%(;x;pgeo4;oi_8khijlX@FuocB#o;(EqUBeMD4YSd z2C7*heO?N4hRI_6?P~(kX)~U$`-Ts>#i>cBP@|(=^>UMU7?Gu108T zs-Gh*391mvAZ%AJ(DMwDqWnfK|HrAq@H7N^LZsoO~QLpZwzD2E{;nYr!ac z6D6JKwat-QnrpVfWoaTh!SKheBw;)>>OUFebFX^Wu3wmUJ})~QZ1Fn_Nxel>fdHU) zsXbHMnI39nQYH=0{nFIYci2^SFn8B!nOus9i~_ z(vuVx4-2^)qzF_Gjhwp|Xt?8?jR=NMrQGgz@4huKEvt4;-}y4rH<_lO@M>fv+u8<( zZsx6v?qzkh1{;$$vd@rz_4?|!Zb_CBW5MZ`Z~Fnq&H_v2x}j*C$M8UrKyMMo_-Ix- z6^8n;?Xb%st)22e-)3$)9|Zrr36OVj?c-x!G@; zG)4J$Hv%^0XjNH_(!jY#mPGDgY8B}tD9$Bz>j{`f zGBrkoKDT3U$Iat?BcmW(ITOIL@HMv_#7_OZt(nC_=W>HakW{ry#KKtG;vxL0i)q z2d&yc7X_auF&)3ha$}2{C7X-FO%{k~_WE|xr4z|{DhSk4i}>bpe{_A~lDqw6L{F}= zt`h(8D;o`x+-UwXiYS0MI00_VKXJ)9PD zwjrArQeD2?C|tI$Ekr({_tCsX*uAt6wg}Rp=h<{{Zb7B;W`UR#<^U5x9~QO4+1s+F zRNKLpdxavq79U5x;jCJ0z{|x;DOhYj(wyCGf6mfACotv?89>jckiYWX`)Vxko-639 zHCv=EP#bWzBhzj2P5SzOChdDy1+_qMbMdaBZ^sqqwPOA;sM~q!Ozxi!XXTM}Ci6>? z>T2>czS+xRSN~ZtQTNYEx>b)Jm4xWdH|I~1sFbugO|hTlpXbi4shMm}mKwf?b2RMJ z9MYC!3Kg$JPT{%BViV5czrvnObsX0pAGy}Qi60#2`>kdu)DY&};2O8h)^*pL($B)_ zV^lZcopT-uZKImGZkk`dx*M8f%{5RiXwbecH6Y06UD@;Dz3?;oGeJg#myX#DCes=x zV|_~TFD9oA8r%$~i4_9UO#2-9+`mqpmo?`NX{Y}vNwV#x;hpeDHTC)Qe^>zhLLViO z!PB9?4Dfn)^spXpQ&}1&ZtxEGUpmG0Wz@&wccXoe-H&?=c}z^?@8Q^Az}jLHVbR~zAy%K_`gzR%9~dQ~2vC|@L(z+~qxzaJx4D*2fr%D#}$ zwRP?8`ggtlm5yZQSZtooOuuTy-3*&vA7EP)&RiA^?0oMn!P<+%HvTRpj_>`enNw}z zbDH#jXuAfOYV(~Wi;oPO@J~$+GqvbnZ)=g~v{pT0B#5d<^-=|wSWdFPKYa}5#2zMP zczl47Q@p`?Ax@pK1wlESfCr+E@1BGwS|Gdif~LAg*N&YJRp42brK}z=wk76{mPI z4-zA+PE>6F64~WzDB~?)RM^37VkdaSUHV-nit9Z9h3`?y8Hgs%)8FhVrhXaPa);)w z+s?0|CNYX&huI}RRqml;OaTOVljq>UTXE>lwS6|6`IbZpC2+fWT%IB+_5+h6dQ_%s zj6P_sAA~goUMr`s(4td|G zWeHKZ-*vAi8n|}2oP-+QY4WqAyndy4!Hlz^`rSQ#UM&s_J7ze@JK{1KnNol>eaohc zqR$h1CR|jNddN(uEkqoo?hIpf4U=IdHX(@#3m-V1&M0py{}y0lB5VL2=kp}IreZ@# z1wHt(k0!>bN`0QRr1JfmGPh>avZmGpeY_@rwPuS5J;9)Tr>xJi&h9j6KgdDU@KG)< z)QuKzz8_vuTj&QTxEh5rDvK5A(K3Fa3T5Wx>)2|Z1ZJmyrX$)=uGeE+990)SWlLZe zOJkj85un~#Xuy&?DMuH}U>Rfp6Hav3otHy@au+-VnBm*zn`Gp%H#Hzmb9hxmikQ4$e&Fx(?{R>0~zAk-VgSJ$WCa z7~h=p`I5e<0^5C}D9NTw26=&34jzL@fMFWX9AMBzh#T(xjLWJN_!#0_+3OOK@ZU%j zV?9+}mUQfMw=q5Tvxx7klfU%syW0z5n>V}NwJq|=YhKUxXzKZry4C*VBKO9b(%T_k z+Zs~U%)1(9iUeISKjR$266ne!CaAxgsr0UYx(Cl$07s_?^TnnK@9;3OrSZo3PK&kp zTrzAsBK=Jd!vRrb(F9QQt&iW`3c<6wH6!1?z--&DBA%>-6H(*+IWpI=ly)MsMC6bR z^dJ#Q$YZ1h!3lj3k6$8A(E@E}*qIJq68Im5Ly5qjrm*XmG%>WbL(dAy6dIPL393EU z=MMTx9xAFZ#jyJW3i86#!OHM-V?8Aqt$WyP&6j6c-%HOv(PLoiBVWBsQgNxx>B3_b zQL&^#25EtZJ@TsHzY9fZ&$0&YqQgbe7qHcj!(AvQVwL z`QQnCM|1;&Ndt6(%x5EG6n)kJi znR}N$*#{U?Y(4_(E8O99mRn0ZEhGif%87OzbDmEJ;*;i5@ zBkMOgO3FH*(zPrZM)~7j>$TqGjmo9m1A@oeEp=W>_Y*_wH*V-J1^#O~JbVqo5arBS zZ_3Ua`Y#vDNQjRJA`tQenj8vmJ&1M`piAn17>pRDP>=KY%kyN`Vfz^tGt4riW zXSQi8E-K!tf2(@;_3sY~uAE@R9P%F(=nOC{&K;#wA#4W~;^huE9ud?QEiBxwKibPt zRP}#^BW!#+^tlA)xK&?(<17!^AKRFPnY!~*;&$hIU40)(A2HNGkE9kVAK{F;@*WPB zVd9u1sGlB8cA9Z}C+t_~)_bU1W{m%3|G2-1?L<>NT@47sZ$%Fm4YC&g1K2VCEtwcP zzSVZnf06w#MkLFrF}g0!Ea%KAvT2`2(Pjp+D#k~-EoIN}2wD8Grtui=HD42y&i!MT z|8m4$4#V8TOMy{m3t2^K+6Gg`u(dai5hyUP_kR$9-6+?t{4J1vVTKn-3|=|II_ng<4q?>BAJst$I3&AET4)R)f*5E+I~YF?1P zWRwMT7SnM-v1Qjfa0o8?;IAT`lb2fj!M>Zl@*L*%+;-p$wnO$saWk?{(#Tn)?zPaYsrb@#OVFCGMo z2%_h;tDpV~%qZcAnClQ}RJTKC{%zIsE|?DB^q4a^dp=u zzPS(~j$?#04K4i#!~vab-HKYsHpO-kIx8h9s&99r{$}iX=q_k(Pk+bllcts}OU++K ztlwSOZ~nojVdykwNaGRp$-}lKpsik#!1|B7hQPZXo{7K*g~Z#TlSa$-gow+Vvchq8 zE@x2K8(J>iR8K#PA`{K_Ab0XX_ip5(R}y`kfeOr_`y2DDC?1A;xd7ybKr> z6;<^XxZrm3&t_J=w*DZe=l6{;T|jEMUD!FHf>@+<1jFOpgwFlYbREzde8Ya1?nksE z?1q2pkDw;$c26kxdN64tMFPZTM{%&Vukp)LPZ|nkbcN7vssWy`YPgRjw9~w0v)Rab zc$f&G=%*Vhp|DxVjXXDe**IaQ@Q+desXPScC$Yv34U{@I>{kGXZUvKGq;c1AFtKzb z_~4LT^S)IP#JhsT-S6dV`u0F1)wu>={pm@=_!Hqrg!lrX7<0Y=(2~+S012;SP8Z6yNRlWU;l9c*t;DixxEz%qUoFoZrV-Yo6?2i)+lT)vA!+S0SbL3vTBtXvg9wcCvC6=H+IaLR<1v*|# zJiOB`oopo`+mrMuPqaiI8|S|T;t?xk^kJRnrE`AO!p86zD-bG?r|uSBx4n~}f062T zCD8q3XR!lQ*-POIN{KE64OxruPV2(Ze%*4PbkChMrLR}ih|w^+%9#(`2Gh86(1uKs z)Kb(44@1By-U|ee>Fquzi>|?q>NxbXu;=@s1wW2K((P|;BJ3s?Am!LVh{4|4G~$HS zcgJOM6J)*q*Z97lfTdcf7O}lF)an2B{?%|VoOz$$BC*}(4UO>$98#3FKD4L2X4Vw-cO&xo0iTJkmA117^3*>j)aDc z5&K^OBi0G8blK@C(thy+BLy4$&Eu{j5WSq`~ei5d`-AxMWOb~?DU%4ko(Kh#vdbr`>@bg+uRXPCXG z9>2hw1Xj53eUA%IEc+uJ=N5lm2z$QJ>LcQtVWZz(AtYwjv+Mp^*Y)lZ%f>iE09x4r zjH558mhEcMO%8Nj#7Ae|;heW^+jXKh+C^B@z;sgIc{*%8?m4RGzw5Mo5;uG%!q%v; zT16NMliIvP#s7J;Q^WcQHy@}$b(;|naS*njL5wGmAJnB2uhmZe55XY@EPi>75M<0x5p6Ma-NQl;%o>7>NhY9|G-~deN1^xtN*B74=`)I9Ew zPrIL-ZL9f=|DUaCX8>EHAMq1twWb?+bJD4??d;w@o^b;~VPVZ$LTh|4}Mbs372gfZV$VpsB|(hOeBy|Ko9ss@a(h zb~m9rxh5t!s7}uMS_GJRa3fk?=6~avRwi)tZ7MPNoOVh zfR)LI>6bSWktu^*4kZ|m!Jq3Bug9!nN z`)!T!HZDvK17vL7gx@U>AxE320yW%QRCguN2Mj32A5%a?MqHzs006RDuKKm=GoG2#G5Zuc{tgDIj+rkZ{F z@7Wbkeu>6B3`52p&F($UN{_Ka*vSBSd%|*P=JZ7SZ-xVh z9}|pRTQ$2?u#pJQp8AUa_JHx;zA*A zMBE$FED+TKz9w` zza3h40!70_6rRge)f!tl4Pp>`1w^2=snSdb5Wepvpik^~gbI8L!oa7*c2bFrn;`D?|TX!)N!fyc5y_0ebx_kPynn;GhMp{&A{esK5+1X8@}66QCSye<%!} zkg?sr3w2U+wB~Cw6XbI}4)>}Mp3poR< zm&^IxmOsfcfVvuxxvf)Bj#`5Pnk`_we)|2r;BLC6OA? z;?;>9A=(4LB`M%9`0zFSvkfuGE_5W758H1eDHh0=e_eQEOg#c)!@1kitN+1wPN<|JL8dX(}f$AKo{ISLXlT6Xp>gwF?p+hm~f<3`57W|?+$b` z>D5uy$Etc7R_Rx+Lzq;9K%ocqJonwxCtjwVLb}uO*PqA?qyT!wc*S(4H)qRw8dvye z$G}4KymrZb8rGp!h6_=YP42hBK3Bgnit9L@Ikr7shy}FtbSR9huU0ST=fk*%boK~0 zH_SYkYap%yuHf^J2+?CcsA%$f95?}8E2=V|7D$nKV85Td8wjL}2!gADfW&n$VA;ON zp4Ujnez(4jrfcyjSFV3wF~g0vL)*8E6F3SI8wHj5e(^;qIKlWE61B5ee^1Ri>-$1B zFkH_!JuI}G;w4feFv+It*!8^~@n=%mp!*qMo>s`z4GBFv_+~g)Z$+)k(P2qVC@&q` zu2$IVIDaFpfCPe9FLao6B$1EoTWJcxh|Cb_wCs$4tUWOak=wu^p9vm7rCbWeO$T_6L)deddNEpI#B z;yw0$7$i|h!?2gRq=f6f=ML|&B*QT{Nw-ZNqMH=Xwy@}PgEF?gc67bCm}Ci$s;RD#+3--v*jnT z3_27VuTW04&-wzHTh|(byw=>8c}rgY?sE~E6V0V0nyoff7^HEYoY*%KEtx*9agXc9 zOdIy5e(EFInY_^|+s)ERbCNjn?yQ1Afp2l>aHRfF?^a}s=lMuRjl)PH{|aI#z}&_m>upx4kCHerI6aRu5c3LP|E12l$I_Df>}L?{~HNbZ2{TJtdzrH=2n{ z3`9Jc{Fxi3yx0<0tm;_w#kLCpb1p)6l80~Ax@S&t=Y~gH@6MeczZ}Ab3>N)7U+-y; zhOK|myOXOuNa`3uWnMq$++E`}=X@4OO{|ZO;ll5IvGs6D*kX0Fl1vKjmf{tQwEBv1q5-($n%C)z>j6P;5zOk&XY!W(Cke7t z4}N@+YU8ysU=i^90totpHAtvT_G~8?#Q4SRX}$StKLmChu&rI0>0N%dmOT}E7t?7K zr)gOhJptEs3W<-A`P}~S z_d^2jvq;v~!0c76tBZ|@$yPx6QUzycjQQirmwHe4XCiq(q-%~|D^%_E%4r1`1WU~x9&lBuyb zKt`w%Qh34MrevgMfH*@8_)^6BRsi{E`D59qrpN4-C|)FlDT~$ch-T484@Ze9qUt;|Nae_ADck8CcD? zzYP6sxupat@N;Zxm+!Q^PV0{yp-!VxIQ;1$4EkvDW838#It`x`1(6-Og^n0`4~pPc zv(14>Z(yj>X9;nB-a!QI#kR5%w=-qLG4$|6V?)f~1;Tq`$&h5M!9194vn(YjVp9mZ zJdGT9dQu}BJmU>^cHFY~nf0+WG^P(&l4PDBX!n>gwImNRwG7EtH3N^<{W zi;Q_8gISyX>|6f`?F}HxNfK}_ULGqkZq;~?2owZ-Jcf@Su^{jsN9G$Tda8ra4}C-c z(mKWXT5I;qhUkm4RS=k~rs=5sjY=?|-$|X&{lk!hYmaMZ=6pC-;(dgGn1a_T0g8V6 zlQ70Itp66NuubXtQ!RV|>U0{r?~wbL6_pPzHA4CqUITrP!*5~0z_|^kcx0)+TA>w( zU^eL10#cnldyz8s*Dz1LGgHLzqVTb8&04kjCMzgrgG0H`h#XdI)uA8}A1`b>c^tw_ zderg3qOkj@H$1UT5K1U(;HdK74d-N?{DXv#K&rZcj67{aK3NISWZscVg1~){5Fczq zs*S;|^pYX#II)}8v^46W)``cd;0g58o)n9aCiQe9^wh1Fji1^eWV_kd$>j*rHlX^^ zv1x6U1w^`*#yV#<;DOV?&aFj_YoEc$tMiE}K1QfO>C6TK$3}7i_E6msB=q!t4rj*P zEt=&k58Qk0CI8(yFe$21lB=I6ARuz4P}*W1!G^M`kRz0nb_iG@4)+fq$T>MF&a{O9 zr+2l*{q@QX7lt+>{83!00}y38fTJzIzhRFIrL5D0supuxC#ML{t+dARc3yH2)ypKO(S+8Cy_<7-4RDQ(Ewt1?KKBL-$5kRNNq0s~lAC!&zBCdsN!{)REa*jf^_ zRdx;fO;FC@awn02C?KEJM3T;1G|6U2jo14c==d-@AHr4ENN3H|faf4L2Zkzc(}}os zpQCpA2!mg)kcZ~m!$?lSzvHKlfky2)ntp@+G--8{o|~4VNU5w(ie?pQt2SBBSCJ64 z|JVeRiT1}whuYxPI>XLTx9*j5KY8&wybdtlRi?2&wjls}@N_f@=^*MKZYcHH`3IwEOad>|civmp4AsHl-_9OK{efK)3(3z@&9}u?ZSXvf zkkKt}=^N+xVx0Yq{mKvuy=U(e?1GLxW77r}3~q|P+X{BjdN!mo5Q1lK1Yx=(Nd09c zm6X1jWI4&05zgWT*|^=<-_zmontk?j3mR9#21lSchPaN~iAtAPNtTWK%PA&+jB}{W ze56N{yXg}Cm5pw;+Vw_{=_&B7Ye3H8=!0F%PagKxk|nQlHpml~^RC#`&1NWl45IXUUfHC@Kn>{kLc5l3{i^gB%qBZsgcp{$7 zRh85K69i-bHlQh`TI!*~1d)IzDu8mHOC+RILo`_s zIPMWT^(iPw#gr|mlnTNW!G^q+%a8Om=&4x}aleL=G>yaAh9Ciwfbx^_e=%VpXXV%D zrs8(ZytC%?0fe2Dgqfdz`8e?ZNQ;VVyr8D_ba@?OvG2T3I^|;mGe;qH)P38cL37jO z^B3$5ut(F@5fL_h<5w&@n*)j6b$=-Gx8yfeF`SYRa05uazQi^cB~D8Bu#W4hY2^*Y zz-R@{{_;bb;~oE`WeEI#S$>`BS=dGz#X>L)nsG$`_16a}jQovr1nUW1O)(;Hn}cOOt5eov6QK{F7N)6GuNiR4;!&=MW6sKu=7 zxNi-~Z}Q?vjTa+aLaz88ld?!XoaTnl2DEkCg=L|tXNKaJ4m73Tb^xD4WuI6`GhtC8 zKQPIl;GyA7X)d|9i}nsGY*~U}*m~y;p#@3T?1+GqDirq??Mt^JZ(~UYV||xdXk? zDf)1MS@sys;@?o)?@QG8HRet^krfz}XJ?9t=L(kKpfyJFvx~q^Y>gMf$T^%4@Cc!$ zM(TjID$7VlKVmxI%8w~RY~H@|F*KP#6wWiO6|Gzp$EOL*LLnA z*}PlquU~&#a;9iQb&M`_oN6n1Y`%(E-cO^SU-=pC)vL|JcdXVkbmkdBjapIp*~~B zwnwM}=kYLOjr2-=>Ffub8nqHXv1KT9ukl`I2`GjURr6VX5ehZ>`^>A&)e|zbFK>m4 z2m$BUUMOwzy2+u|xf}zwY*3p~^c*YQEE=Q?+ILq5t;E;%obFJf)45q5>SaUx+|_TN z(=yPnKs2r8g_kR3&cVX@`4kC0lz`4@)%E_biYB`{-**_cEyh0>&p7e$!)T*MJ#7n< z*GU2XBtb9$38d-Kxq|5t+EdMWNSN~$l#g^+9wDdP`zCfVTSNf_NnuX4&4ZG^yX~*S zaSbrm<3fiMkh@+IVk-8vjafAYi&t48a}hU15X~%-U=n;aG&x9uU$sr`4gDpgDx!J$ z!MPa;xfP4GSO&t0{-CaJ%Iu8U*ogbwD65yZXKib+BP41}Ta_R>VLF|5}o zwiqIkRt$XoshR$S1fHKx$KEhW9fpk(6nZ}a^yB&UM=nxM^!jB;&GheoH<3b7sNm6( zI~5TohKywR4qm6jtoxl*#+)Tyw*ekr`?V|EM4D%Q!g(pDJDutro&zDOy zSb(&d`Urwa<#!ARVi1bBr7E(G!KB@KP_2DrfF)7;v5=POf|suvZJ+5)21Niq*5aY3 zh|iCb>HF@!WH@qQTrkMONdWHbChiN5UVVdx&z>RKjL(B0KaHR{(>C592zxy3IKN&M zDOUf#i~q3TMQyru1$R-9+Q!mTv#V-Cs31-C=j-v9E3pkl&i3(fOsaRJpP~$X+&b;$ z)P_+8yn9zZCpWZ_$SdEBxS)i-nkFv6BKW#z<&Vwuvd(sB2Z5J}DA9U}h)#|w`|CTqP@uLubJRGg zk28PG$O%L>D&0mtQLv|&t&W$)nCOX;&Mbp=s5bZ)1uPe6O={6ri^tQoN1JP$NwtqR z7j)@y!nXV7Xa!ZT35EbRnYheD{w+m`plET+-j1`q{^D!i?H^vYNIZ#GKxckUT`OoW z}S?iZIbCY-H5OMX95(A7vYlSh5qz+w4vRTh!D+>O0BalR#u zf{!NGf}grr*nbjT!AKnh1B&n12xhuN8g}njXs<(e>puQl$PCGAF_hG0fm;{rtf4cdgFAOq?5}D|0 zRf{79y4FDiF#&==h0(@-UHKp_O2KY6BXuL1NuqB)=+#4?YV4Hu=Pz{5U+5*1zow*h zm13||FXf({c9KaH-}@@W%{gW*z7HZ;A{ktps#%4c@~K#DzrS;yeoGKXS@1zrJ$P+< z#f~HR?c%kT*o^}7xv!%J;oX$7zHCDbmt3zJ8U~+_He%K>eoeOEFFUHvTP0CR;vQ&!bnF877@j7b9;i;x~cfor@C1%FalKX zua7Z%4*jlTZcs%zq;?b6MlTE14A(l_Gv8cL#e}#0S=q3YdSBVTDtN#8sp%uPq2RE$ z+y;KGtIO2=_Ile+DFEa1#l`0H80rPaK zx-jA@5Yn8Ed^85jI~RxLFiPPR6agL;P-mWe=@=|jmG$ehO=8d|6fndMx--Mf1q3z^ zQkY0}2ME;>i{V{Jkf~9Y-KmZA)8eL=P5yn_LjpcfzgmTSpd9db>OjGu%zef{3|^%D z#;GA6rR+QDy&DED%>sAYu?W@)p>amTel|k{Lyg+I?g>rnSUZXA`y_bq-XdyfIC3qC z&I^|x5h(J9nEuZb?o)dN%6}5ofv)O9xrSKe=Nob&UqbyaQXyu!BqSt6AiNC=K4KWw zsOk=efD3i|Vs>rdwf=IT+3`{juR{J!F_R4d6~>?^n+F<)f1p0>b^c_%F%d+lHfq;g zq*EdhvG}l(m+>qY3-Z!@fMRJo705wwj|kSB!Q1c>dY;@H)IJ(M#jr1*KfgLzb)!Dx z2{m#duQK1yQf5SYv&dj@2Gq|tc4Pl;Xn&NKfvq2Vcwn`8^W zKo%nDqvz2kjVokEZ$)%UjJgkay)GkXt63De!91W)qMX~@5X3>y&I+$kOEm9-p1*M_ zo#y_P=Ne^ZRR$^l>;ucA{DeH+`ss43sW`+!JVI3|bRbAM9)s2pw>MGJCtd?{h^7Pu zIS|0Qx$T@;E%cu$5_{`$FunFjXY`EsB((2(+4=Kdh@2w4blosuC{w8^8wAcp$hg?C zF$9LF&Bb0vQ#nMj{0{FG9*gfA;a>m{#$!Ir_GQdp^kmlwE}{@P)19n`nfGZwJn%P= z{)PItRm^a!oEzI(2--bSFV5lfP?ebt=c*qm_JqLxf5q7W!D!tNwOItV5W}p1b3zL& z8}i>THBkb85wDW3HFn!!#ROt+_hLUIN@U+mrIQUiBG=NCXBvIw`91y}yHn^iURbZ+ zI-a%o7;okzw|-J$WfK0AgPMwcz!rhf|NMc3Tw|i#65&Ep7%cnzM+(#HVTynII|eC` zu7a>rF$mU8T;!i8i08FVoUrJV_JOFMw{-h#7~J(LdK-XbPC!Y>_#CB;*CFT`cTZuo z&YXB>cpDQqef~yQZ5g!DEW!mFzh$tKPh9gWaLpSCm<@94TR;FdVbSpXOkg$H_z`+u zopTjr7mPt+C}1d0a|8&YjG&v9zU+n+rBe%vi8mxcJl`raz%g?Xo%s^ zj>|MpSq&FSJnYXNO~hVre|Qb{tT@Z44N!_pK_8G-MoOKq%>}qk30?}Z-#71Hjr$bM z`g#XT>(qbior$cs8NV%4J2oO*m7|gq^Xx}IqbBcDty<`lJHSlMx9@Av)7JxLuX1+H z^7+x%7h#`V2$1+OL+&!tZqNp<4UP@o6{I3mVm6em4ifX)+BoUBN~aVg`V?ciXm4D( zt&I5z(ZW#9qh9R?sp2^C;KT)CG0Wla>uj##jR4|&$^gJ?{!a`IN4wtKSOtoTVyZh1 z%`0$NwySp;S(Z2N9YYg(@vR^nsBN7Q7RClh(}f*VrRQ>bA%Mw))bVa!^NJr zZ$@5mXpaL0kYo)68wp9UcqIUUt4T6(Wl$R`(EYNN_b@ARxgdk&8bC+Np!B|KpqOUs zd!F>V`w`wHu8+|Ejdr)d*?0H#gct6?z9_IRvJaj>>!O`R1R&k+ECzo^)-f3i{k?P& z7SMK7J_>NtPkG-g>R1e0lNFk>jLcRkrWy~g!lpi^Oq0IJ4rWAlhQ0^4M zP*;MKU(&I@|GVekx}taX0ezsBrJOF;C3N`v!L|pd-ncnYC3FcKw#|$5TPDlQuE}fz z+0%H2eEju&7yarW4WRTb%9wqIq}DOcwJPTf02A8NgH+Q&SK2CY>h{!c=o|cGlrcXL za^K_Aq~Bk5!I_q!S_qskR{3+we7I|jnd7A=fy{RrV62NlIlrWnSV0I|=<3DY-7_+p zjAWs7Aa~vyi}NfrWl&rPn zJfJCVIhd*R!Tt|K;Kk6doxu4xW=XQwv#xb1ZQE2r>=@9|`R!@qTBMPK#@<1%vL9!q z7LDX-zP=iv3qq$H#aiL4aT@N73B1|;>lN9Tb2656FLj@P=${jpwCt4Jec#JAmi<6JXz=%* zE>vteh}@@ZoqPVAC%rZbl9`m@;3Ov?+^6K#w!B?xH8oCxBMg22Wk@NE`g$tQrNFyI zkYWGU$%tZufS?#$%Q)a~qsctx7~rkhP%7CEivUVZ7je#ftdJ)eB7)P^HnCJ3sG!&f z)7lbP7XcX!Vvogao9V5@qSGMO@j6w6E;!7f4>5dB*d&3erLrCZ8CfjzKL*~{pufU3 z^>^rdg%bZc5M&jDW)tNvCgso?J-jv}*&U2|EyAIvapr1W#&0bd#?)SX_b|he+S%(%oQDP(TmU=qcZnz}gP!aEV^-cxlN2l>ni%s=G^E5=x z-!~$Rhe#xL0PY&sOmY(FB@=)w5b+B1gUZh0U0I3dU|{*vW^SDJHSfE1`n`^P=ff>2 zWeC0geBw=v7Rm1=P9Iga+T8foSu+#8Cmt?!e$-`>xc%Hk%J0hWo!DbU5~JJm&GiKr zL-Pi?g2_3jJG&8S+bg_Q7BZ`|-K@H#O8LKU1YLh^!YG6wt7SRgg%V3tw3(^z68^0I zj1LBz1~s1fkRVW5JS+djQ99xR*C`;7tj|OL@p%JTPwXS|FDMBSiRTO&0N=R5acrep z)kG?)Q(>i@13{_WF#{K(L!HkTpZez{ZhbB$GP|0qUZQn73<06D7%^KIr-|g3G9!ts zLr6R2JlNW&EjQ}OWHFD59;A~iiElx>KB{Ug`O7o0EDZL>3S|h{!qB51t*>S!wx2)x z_)x#f=V`jXlE&-rs>O!VtPo5EQ$AXAI9bsZG?4J~t~F;UuwU(_MM4O#FJKh+EhP$> zyI`l9YO8n1V92(G(S~(gvF(dW7hCn!wq>LZnyRgT>zk*_MOCT_UHIIummYJ$@&ADR z>cbphfE*i5Vq1dRNm%=KKN{qDq@tYRc50E7FKM!nSB%)n6cH(6SH0GkxatC92#IyW zSBH0|4P>4qs_|R`e3boE zW5}c=aT=bw!UG?S1{xV}-H~M}vx7+c{7yGQoAw|Y7GIpmqrvzCbX5yuTxSb0#n7BS zLcfQR|}#m=PBG zzNz-Me73a(PUBrvG(`IL5&t&0)7qb@6;U+aVWx7_kC1~Zg4?zwZ-eew8N7Luc(LQi zquYc9o$)4@!ZP(& z3((h*ZT*cFV|Z>GrsSv(esX-UJTC;^^!|3=K2>l%oEihG(4SZ=1zBiy|6tUgrHGp> zuqCYM2Q#$~J$VsOvLl9$1u(P;$4&4?>;y5j4VdU9(At0KrgJiYbf^%De91Z~msQPm z9;-{<`r|qNqcE2?mzKUpDAh{43%Yx*6CQHC^aP!RGt9y)XrLAnFcsGz5_n9r&Uf6` z4!TJ(L({1(`y1+(PS3MKsmGovg$^s4#S%)NHSm@3NQGa$TK7z-{%HHVhsJ7Di>?Zu ztrYJfPgz`zOpw!9MuX*@xjV$4+-F(vpxgkoyF_vAmHKGWoZ)Eku8+5bBv7jKI@-tT z-H2aa(-6-#BCOfhK@e2N+5`om$lnXebr!7NE_yxdmgIKBes11LXg9de6Y_5Q*|X?G z6pil7;kmSOY}y~aJI#=E)cw1LyogDjO?yUCbij-z9{=$b3>&-xZBDsJF*>-L^qFZs zGJh4Cni~M$ivw6!n++#?!6y2#Ph5?*R-4$Rh-kX$LzpBkIQ`wLzHB4){NWFg6wV(F)m8b+X;$*MxkGFM$I7PT_ zN1`aDX!Y`LzI^vGHcJ!ww8CRlJ_@6B4PDJeW!SMFeGal<@;Sfe*_lPW)6O>t*X*+9 zl}Q+8-(f$P5(N@@KIH`V7}BG-L=6Bv)ikK~qzX2_bgBokl2${{899sBv(Gm`u@8+x zG5NkRwWEa|i`Q?7`8c5;`GT^lRE5M6i+8;zP|zl^Cv%+eN=mGQhb6gUF;@YMM`vaL zqq6`8dcY$Ha@6SO*o>|KZ&%CWHK*|gt@N5FJ~5ifVFE_ohTu2}#ZVK{ zy(owfLD*BMbr;onjvE%89sGTgY%`DChWP_eY_cc2T##H3pfEwT6_DfSLFS$Ur+26& zkiP$Wa0iG%2qmqcm~LNN{{514Y`n)TBa6-FXYJTAB8zb9p^f^&=OV2l?iN_jD(?^@ zJ=`?~M04bLue(bwE!lH93fn8bqDv6Uikv&^km_bDABXGj3^9z zAr%RJFq8TBL;sL)^Wo1mHPcaEj9B6c6gIzE^(k>vaQ7^M%d5G=aD8_9?OkHTBDdc| zI%$Ry$h7rE1M;n2eMx$n{wR@$cBks92M2HCqrb7wij(ehAhHbLh8b`MIVKVBSI?ZrzT4fxax;*K4OrkIiWpwXV&JV2k5vpa*^^!b zq@x%)5CAbT^}QW6)?N-apKeqY0d{f81eQ?M0Dzn=n(4P9AJ|PqR7y0IoK_(i+Cpv#eA1~^ zAXW|Nmf?@01cXnJKCDHX2ih@%lsjmfIZt&*jg2z0k`_tR(=u>~y(;EB@t(xu1FkxK zlsFDJ&j?tQRi`WO`5qvgm-lvwP7wnP`xE-(m%l#|FuKm$l@upKQ`?$+iB|EJ9ng^q zQW#O5Z)rwS5x2X0gkt=gC7KAu;h{9y`)Gs&tfIzn1bFiZ% z33ST7cpdE3FHcQS_yt3-ju5tU+Yl>^x0p1XQR$e6n%N=IVH2-Wd^tX`{0zAzKZ*4EkFZp+i zK^0 z{k^DO+WUa%Ov?03FJJ%oVXcH;K*rcGb?={F#9bywL*8s-43rbBQsC@QHZ1kd7E6n} zalJ?XRVxf^zgE=MK?C;T%uK?CG>WsI}Q3cG3xHyzVZ2qh*3%k!<>)krqaUoUMKAIZXh0i0W&a#;BL`#N#>8F>S zbyq2>P7q_!*gnoF3*s6y2V}qt>4X*ZBJ8msQIG0@A1PR1*iKygiW3`&y{*jj0|p!( zqhfjrP-yd@yhT-`fzzFHg^ah0VOKUz?$h%2lRBiU#p_XwoVw_y#BfZ{7)nOue$RoI zM7?{6WJ}g~b$$Uvjk|og&ZBMNgFivB2bi<~dcLa%4<1~ATxaJuisZZK3eeKxfdD}& z?~wkB8R7<)OY=9p-H1JHNTgq-fBXS~Q#iK&K$89kHrZ9{mfBX8rL& znEap@!OUVUT0Y7e1Aq}~xxPK!xp_yuH!#rpDHPB4&EnOp#jcliFGOHFJ--UxFLP1( z;D(-#NJ{_!Hh`;3GWXx!ygYHN`{JZ6D6{jtfNXg2XkSA{9|cxMe(UsI`MP}P+`no0 z=HoFY$HJpKDL8nU8HCAGXVEbLmgCC0Zye^wn*Zm!=SEDBGp5bQ0Q!=y)BE;YiW4C* zQ;H?z+Y3V%GAQe!ly=F%?O&9KP3vTH@F3}KWK?nYG0RY+yN-gYzz+L$vYSm8xZ2V2 z3v?po@{ijdr1z*Ef@Oh$?P8$TvK_1qPoOi}I&{?I73nqCafnUWvjCt09^H#SP)9Q$ z6I|C&2?#&Yy>kf*?+4g=HY!;nVaF#_AYpRR^se)xpq+rW_bfCogW>?```|6VB^L)B zuro+Z+rU)PqE=oNy|msl5L&$TsV68-5%aLK;Pg^@KayxiB?D7Cuy?t`;5F~LX zM||)sRoWl9N+FY79IrKIAg!(?@DZ?I-@_vQ6k~KjFXiB=t9cqA7v*0CN#~;z?B}-j zo+)h}h#@DwYpP|#DsF^>f`YWFO3=|<$XOmsg(3y3m~(OzfEJxZRc3u)@1%EbK<}!Os!7P(^JA&D*1QCjm#mQ{zR| zhDZEn=ZtT_cXUy2MF|4jMgwQwF@DXr&p=JujuiBON-x>(viSSFv1IYT-vW8P+BFI^ zv<(R;LH?FM^#prcMi~dgO@Jj%kTI7HxwoWRCbWrHpZZ9$0tz$%40rUSV#VA-F+MJj z@;2(M7ZeoypGSh^?%FArn}x4;T>~;{2Q9jn9sqlbKOPyY--qkI=W1uS`C=|A!Q#yK zghSLCBx>O*V8^19tY=c_G8ME8C4*=$mY!_uh|!sv;kl=0?k*Ar%(@+BD?AA6o7GgH zY>`tqoTZ;B2IxBWZMgTdVSN?;vk92XIiv}An|*Y!i0r4x-P$v*Y#%&aMT#%5H!h&v z0CMdcN>7fZr|9P<(5O_HG4NchjMrWU(mKi(v_rX2C2m-! z%#r5r*}b}fdi?zy*HaU26`!2-3ts~XNDr8ee4G}fg9KY_*yCzr9$wvuGuvdfc zch|>L@7#(?LK|QnSFz-!_Mv4uks(M-Z9!YEG;~>3lA*2_3JcE9&xA5@f9gGIEqiPm!^?EIlq7ec*dI|k~g*ZOTsXf< z^~*!2RDRU~+I9PyCtUxO#_Q9OJ#mnC#TzT1LDzgQAjqK)G2>Q__M z$&=q|JY*MFL1<-+>U2rQTxcozuu>3U6oTsE#ZDI&sf>!FrzjoLWM89Sgfl5)S^(@zh2tfz@+b6RGB?e z-JdPNx3e*)`tmE+RNx+O{kSVvl8fFROuEw$Hb zja**rw}P{mxeK!*4_VV5e{w5yoGPD1(I9p&qpi2oWS2-|1oJuqwJ6k)Q={!O$QnV8 z$GY9uVbR?@;u^5NM?+R6f?rmyJ`=JYax-8A#C*ONwDp;2K#3z19|(igSi=4u!6rF&&CvcceGF97!@=s`WY!FZQ*3sr1h$2N2p z094N-pG7dGj8mBeNC5lphxBCa=a*yfg$r0o=x{28T4)CYfr2yHV3MhwR<55%2W?_P^G{W!Juem}?w*r-t*JtMBK<{l=i9K4pl4d# z|HQ#fRYen+vbedYoavS+3&sWB68ExGY7Wn?_yGUdb9mKN)wV3Ou_zU&@HozqYUyq)Y`g=cG*qkE#kBe1 zZCDvRJRfY}{oO=1IHsS*SE!TzZQ!8BVnYZpR`^j;m3N@*jTXl z@G=-T(Ad~O8dW~CPibpK^T4qmEt9tgL?xASaP7!D&l{zeG__mV7a2Jg%#z%uTdDT@ zoKIX*$w~+yEONBpyjI?-l{$U23w((Y?Rj}7EGVtJVyYEC&k)I?} z!x`n+MDl&jzt$K>GTxfh6Y@Jyp6tsf@tP}@56Te2)QIed$H8TRa+jlsW^xif*% zR!~HA1Tl-*019*lXQVbL20z)TIssM1UOs>xC71U-AmT66oCOf~3y#uU^cL^#V;-9g z`Oo_x0yWzH^rTrbT;r3_P-@S6)7vnTM?*j>4Ji*Sq({L&%1@IYiNVkGeI%)kpbw)R zOt$+gXFIPK)=5Hnc|fh|J}mTDa;yqYK>KajXyC#N5eLl2gJw`}0g;w3!L1sK__m0{ z?$O@TTal6b-3E@By81)<6W5;zEB!HKP5w&A=&$=6LGOVN(g*nR3$%(4M-%ryp`yiw z2ttD$)Sic{T90P*=!1gb7xemP?-nTfI+b9`3e{aMc>ArNa-c+PD?5UE)3j%JW^w!*v;jYy8$hSFk=)26k_r4yBp@qD z;8vl~F#P5O$h_CkO^qX7gyIamLnnxWpS5oQTF3_Wx~DF2Xuf%a(^TocX2&a_ zI<6X`DMflfJ=pvns+&wlxO`=9)GUK91I+`vZm6alvF#6_>U{p%%t^46D8Bi#Vlo|g z);u!+Yg_k5pNIn#d31u8V+;O(8AIl<-)1{ms@l%~BCTJJ?EApfFJW zM*qQ<+%Fh>><=3w3VI#V0cYSGI)NXq7(T-C-^YTxgYxOy&VJ%|iWo)f$hmpPp$SbW zO<@?|(}e6#r~v5$oIAC{#$*ON3j=HmsyUzVJt9=(R;imWp{_voFU{hO9&ksKdUGV2 z%VjbP$sz~Eg6WEixhMHj^C~F5!Ie5-Uzd@uvXQT~@qH4S< zw8e65o&EPw7+gypiM)$N?ie1>o*318y!;Zz8N|!KpbqduUU>mK3yiG@8=)`n8Fm8o zX+s0d#xJLbTp@gErE#gn_a{M;l0V`|(cYL}&neE=M_9fMS_CVAuz}BC0b#!Y^WyT{ z5|txOv#px#E3zx?=YPl5hVx$q@2~nC=$GI-Rr_UJ3N)5y>H!P>s+woHH5wm52+POL z-`*!$)Bf%|@2pZqY3p0vw8<*Oec3Ke|Fm?i?zJzVCVz%c#duqZQp-SQSs{(0>_IP> zbe1>8yOk7ep_8qAEY9K(%{10Do_EGR2o)k0fadH3WO7Q*?BxvBp5jCF(+M_Y3Kn%u z9C}?M8VGf?HQ@rMMPrtcQCnQ4M0qEZ{0^D$w{l5A=C>oNDg#gGIu=}f?Ygd&tVBIv zC^issZUPnPmhaKqrV@s&YR{#9KS?uOe3}mwME0Q*D?b92b&Ui#1MP$O<{tz^xU2Nn z$PbDv3ez=B=adhghN+s-=K~+UgVGY(;H9tCW=Gjg4*WfJ01u~8R2~o6l|&wy=5IzY zhEp>ABDKO19TR0C{~DU?aOWd}7eREuA$POk(v*n5C8|RNeuejVjhfKv+HfH&=s{)u z&O-|&?o{m$+B$kN*3ra^g$l8{yx}9hF=Owz zo#O9FTok5`2VUm)XanAak{5-BPx!t5XD6?;@X(}wRh?-eIEi( z0v_bYEnfLukAI}W?<5<+Hz);`0xPaN}%rcX+MSt26cc#73Qy5PB= zNXJ)V#J99^vp&l~>gcGpU-1eWK{x2z<}Mdu@*^ILi_!-MxG2sc0iXd}UCr80 z!=MJo=;x=Me;_lm*;6N8U+41>9@zuIRy6T#Z1JQU% zK%u&oO?(fM;+`m4H@(r|(0!vRC*E8%gKTdoiSCUp@+@wzY128ilq!SPa1V5Gt-F#c z*WoPd07C-{@ZOG6dSwqxR$xiiFt zV;meDTepO}4yEk_bm26990QV99$q42SAVTQT?p;FQ3{8dEsvimB6NrI>E-}JK?igU zPe=psb8fsQDCOp#uK+|cHEXZ*V%E<=Z6aFmN&szK=~CZrm#DZpP~Treu!(H@&b;b5 zBFNr2#XupJ0u)T@6tMf(!87#n{IAY44$Aw}|L8%4&iO1rls zZ_Y%s1YVDRZwT7N2s1ATTB$XOx_iEl-$D}sN0vbsls5z1!HBG@L1Nu@xu@2@eRdMx z(?VooS(q=AB7e<6=4H|7vWI?5N5giD9omNZiO^$^Q)Qqr(BS*4L`|+p(oVBip0Q~& z1{{?Q%WlGq7?(x&@c4{7RKy}N`Lb6ih630ljFW}!`eeBdZ9q{bvL7HadlBbZrTe!B$l zcI(7qyZ-aK?|*|fH}HZ{iRBucYQhelX=dhRUp);)6K>;65bvbhr3@9UN}PJ$O%vVS z(lIk`aLt|8Fog1&9~E4^$r49ryqTA#k**^a(l1nQ5l>qLpD|2hPDlW@CN~EqD|BZN$o{|U;l4h}AA+wk5#tSqn6VLtE6VW^YM)<# ze&04YtsG>v^6js@(|C3FI3e#VQv90T5{1X|2a%JdLgnme(NPS5b|{07oW!}JYs4K! zmz5smO1%ees9cXLc{9UirGd5T-F_t^U!@54+e*mMqX3%nIp3Rqq5%huEL6qFJ$IA& z?-3+<1Q$wR`U#hY%Z6{%{2b9p%6M>fS#tof@9i{o7+nAN$+$U_Ap9qv0HDLA0F8-&EW{Rmt*Ygm0tB=ra7R<=a|L}4#? zJ?C0u1u9H^4xJqqv=15HZ*i4~_ofBgKY6I?|!`qJ0*{+YobSP6s#B0)3 zs=r{7c#{e>L_7pHKIoFT0(!nZ_cUF}$YLNcERI$fZ(@_B7$2?>gkPh*S1fx1H5E(0 zLYsV?^7<`n6R4W9PeZuY2d%a3r$?L=2J#kvPvA8rbT|lueF`dUfW~{NRsGm)JUQCl z#?*G3Z;tXV{wqA1mzBxzXs(lAJNFK9cBF+qET9`&502tha{~XlT)4Yx(LT8oim&j_vzTqE6pftK`9|r z8-%K7M*coOd^x-_fhD0b-#Io|MkOFCw{DEPGivltWZ$?IS|9sb&!i6CZ!gIqMhN7> zNUns+VL5mC?AJh7Tt@IuzVqc({q>?EP^!;9pj+@|=L?16WzU=K()M!fp!qDFY^5?5Nu@0gQvEGO5IZ z4mxi8c(E^UFW_`bVf-`C)d)CW^_FJ`e}UKaOnUCqzl#u$yiq52kq@vE^LE&K@#qH7 z|ND4?!JpU#Ly}j3L-{ia$YWFwN9aXsqZE4rk{Vzoa(;b_M~UGI&;;M0_7bV+aFA(h z3lfjOx>I9UzUzzMhwVF1Lr>odJcG}FC@cs9^ziVtXw~OjzPRig&vm)1-KBQV{ zwSa=^>eFwamEuYrUx6w(fAf%_3q#jKas)3qMMtSFYVcw-am54SeSHy z*f4wu);{Rk&bgx>Y{;MH&vAP!Or%4Uvu9;NT|#w{r>Y@ODp3odx9x^>vBv8j8s}_+ zy5|1n2P$zW0?zT$vG%io)D8ugwG9+Inc%Ul;bLDkqXZNwl0ZRK&>Dsc3{VEW1PR;% zb!NRo@;UfQyPgG}NhY|G!_iWa4O99|4epWQzg{@G*YxDt!hSp>| zcyuhfrQ#UhBE}Rhw^)oK)uW zDz8@xY&+RxO`Udr}v+jPPOL@4wn4vctJ5@elPB0f^y^| zhheID<4k_pz=Kq}8Dhs@F81PzT%aLf;OYlua`SV>&~U(i*%N#%Ba0CSF!wR?NAK%x;NDf?$cWb?AFcMki+?N4o>rFE;8nrZV+go!y#s;DLouKsMWLN66GEu zK9xdYLg%_2MX#ZzRX7?bJ=U6b160}e`}vpyS4L6i)3CcF|9>F>UKFW9?rB$5f2HQu zdK0qxD)(Z%;sWSv+Mto=+%U&J*fO6`3Pp&1u#@OZ;^2I6`$ zt^_7sOT3s0Ggg>d(u_)dPdpa+dlL#6vZ+-MkOH7Bdx0^O4OV?JL_&ufc$^P5fR4u$ zn5g%l;_HMLXaffU*&OCEpn|m{>Tk7pbd%LA8Q6C(4<_#Y0z#O9sIsnnhp26m02a=) zp$1%Nv&;r23AAp2X>as8uB3lL|c9ml-DdU?IHL9;Fe%KO5 z0HDc(Ee%|Z9t)b_TCRWU*j=CSW0#r?VFKJL;8)wOJUjjXQs)E-Q7=)PwrTr{^o<}F zc;=u}oeKHd*u^yMG{YbMgQCadFj4<-D!!c z?rt0OK)l5Kz4B*NdPT135>R~<2AZdEp~E@_1cCg`wLmORK%;s#*k>J6QRqFo8H8~~ zaN!>cb6kfI&ibQId(0Ofgbf0pSOiDc!2+cPpoKm_;Gov8f1w?q6h=^1B(Yooknsx| zTC?CBxeO$vfr;uM$1SkosrbolxD^DOpc&Qekbq?BuoyrtPx*R3sv0pefseKDnF-K1 z=D;>QIdxkQj;YNTM#SBOZz$M13oSOH#5M3-%7(&H2h2e*MRq2r_m#@q7@BT2|N12W z3B!{<_&;!RG)T34!4h9npPhLBVFJvXvY}P28o5k$0w>>8brttFGOwxhg8tS;qzWcm zOCtQ74T$m&^j<~Sqej7*+!?*U;1N%NC)8gd%LVic+{wigg5=oQ2t=@>9z-x;Ty59Z zHMj!f?CXrSKm7+8VMqebf`$!5ZNBISBkQcdBSw(Y5j#E({Eaq8?!f_Z_M+LEZox(Zch619(F zPBgTX$LK$F`+Iw61x%wk5gREK2c&WGn0qYlZ;(1+kOkFn>?hQqw6+Zc?1(c=>uO0J zwPuuOb_!Es1zw-66YlubMq1B&p7753{`tnzOY0-gpvb<#k@nDA(w=2qs)dnLG3-60 z?|H-Di@dw@L?l?+)i#0;e_-NkDGhCvtEaYp0EN?fTR+!z_Ep*Xh~^E4Lp>gbt@6RY z+D9KU+qw+2iBe|+yv>{ZR3lQH&LN;Y^xOXd=LS+)eiG%gh^u}u8By~hdIMP@4_Ql( z7lWGOi%CE84LFpYLGg3NaQtEDNNIOvsPIU7*8|!qp+<+H)4-r?*g|V9K1leZnM<5Q z^|Hgj5UF~2y#~3PHT_71Pl99pJQ9rR3a790`z1LeR*Cb;Jse*Cbf1dt%p?w2DxEIXGmSWN@64?%JqF8jI;NK#S=awS z^`Q+l3q=PE2@na%93Mr~jFOklQjBy;DrxvRswJVmq4IpFfVC9Nu!<)?y{I&ua{Ix@ zyAt)oYvjl7_F_r)_JO(X0}{Hb>kjUc?x)I_q*m;hwRO7}l7;!~-Ng%4f<{))%o;w( zky@FjUG`LEVruNKI;0fLY+u8MpsSZ*>!tZ%Z-FnhK_iR)dQ4|5!3;1UV&9XF}mx1!7eLQ6~oY-eIJv zY9KaSfutc5YDU$}+AkjWh_kX_qE9gJc*_MiU81;>z9KJm;CRPJnm+d7-~$w9?FWt@ zzIw$)$NMAAu~)wez(^1|F9@4flB4$71(9Z|VAq3z`g2{4UZxM3K6lp?3Q%jDeYf0S z{5+F3qo0{0!^jZ3-gVu_?e}n2`hlqgIcFy8#)gj_PcN8f%I8#fe4S-!usp{-yIf<< z9*Oh|%dW|GakfuUlefYf$a=3|-+#*On~>E86HJ~O z*7t*)BZLp#;^%O_;W0j>tPi6^cW$oM8>XpxGCpY;j(KTx=K7Yw`GVxhI>7P~2zCER z3H(qv)YGAnY6>c=xU(B2n=PQ|%lgfH4-W833am5^_{mo)jh^rjRJx>7w^02N1!G{7 zCo7x4X7X`wxFbn9jh?wOI*PKMEj`i!a)U2m4c3=3U#Z;z(El?NapVKF`$0W(5j)#; z{G=`k&EtKsbT;h7B9NX_7+!Gs8{8|9uYvMAe*sHWlm-ojF^rMnqD-yF&+ky$1Wn8Sp%NY6D7v0+4KU2U65u>fc-)?h!B>Vl~KbDfS?en zCDg|pS`YB$UL{8tJe&&I|EA}wLCXK5JLKU!;jv(Yq;tuDdU&Gll_QJ=wh)gvl?tG9 zP}K1~^dAkiW_{T#cUvkN!x^QDOM`0SGnz76=)7ov2fSV++IBz~g1(8q#@YoYOs$k8 zaGc{{9Ne+=;1#6&c@%FHhCy(74IMDYjY`D3>iag+1G=+7bis+52%X!dWwzzp&;xIT z@66}Ih1`OF{tgy8C5=nM4mHHwNGn-+i;kzHenCcbzrO4@yX>m-Yi3Z#N7(s*t^8Gi zlPDK>pdHGYKnPJpro+l1z{YG466HtL1Q27Kui8O1y$gOB;J^S6e z?=TierHlbsor|pORf^ycBk5}KctE$i%wL|Mg-5g5f^a^VWiQF{;U(@SjE?Bcv+GX= zn*w2gm+DJ?w4~Fr*9cQ9T>|{Db=&)ww;oms!hW!&Kz+zCQA-CoAan?p*}?0ErMJdj zCr+gx2#*B%9vv)owjN0=a5RwrDxlh;EewzQ?;|0V$AJ|}fpkzZhXy1CP#o!%gDDq@ z%9z53JGPcvm-S9_(E5fVL$AN}es2 z0jNCG;|}mA$^hnUCcU@|?-15yfKN%`xZh_ObZPG-!2sKJ23~7$47~&!=pA^QlDI#k z={UO1CVL={QNu`|jk{Fr?u7I?N|}N%cJ`KUB`;}1lkX+bb0r{dgig3i*E}nz|88^| z)Teg#R4S6{9|Lw4p=~Cx{t%cbCx_+UgZ0IQjNdP$bbPBmTt?i!zL#!%GcrzNpB%en zin>;iP^O#V@K$Jo>=~AvLqiZBn|dtv!12rGFi0sE44~=WFe~o^G0SZ{6-0*ysUD;V zeGW!VkhpU(8mDizmtd4oWCJ$^UhHgHD()^xnFac!bMSOU4j5@$R6v(3E7Lg^ga$MTI36fl>+yhF9SmQy{RE-wWEc zxqhvI1DyvCiq@qL)dvVVqHXgpX$=|+VECLupVT%hZ30VTEcpN&;o0EBcNrzB_Wr|L zNuwKk?1)|bB}+(`qpNyl zv{wnEMus1b-&AG_&P#269-m6;hF$=xxeh2VN4y))-%CT{@H}3(04pP$uBRLPFm?Sm@#xEbR5&oeX!hEaBAk8`TSt?BFtpeW>{Q z63)w$ezWE{8U4t2moX46NN$n((9cXRpf)@JCtjxXR}szzA0rA+c%KOs zi>N2yUEmTN-dL1-`7rGNwjIgWZz|m_H{nz-@pOX)qfgLyjKDTu{W5TN`oSy`rtBJI z4G04v(~bA+9|Yk2nPb5z=Nj;`*&vguf?Yh(-&*%Xfg4@H5*URI#P#0W%4|VqgqTu7bBi9k~Bn zA$xe#EhbX0LdpwvsKi3Jat2PV6Gl&>Ea><(ho_sZPcq7}pu^(dfPy!i9e3L_39zbs zp>!+$hVR}FX^?}lRBC@1`bq=MC|$6U_p2ap=#Og0wLg+49U6LpSUM90&~y1xR@V z<3?=|hYf~KU%;LCV5|6!<_pwMQGM5180?y%G1W;r($qVHlZ(7BUS*~x;o+2dO8%KY z5SV@x9Ldavxoz}&0&U*7txLl4b^NHWGOsfX1if+7$RL zMU{c+vnAv)4j*M3M8}WyJcZixa0haKm^cWzzgY2axV!2rMr}Ln)xJuB-|I1YQyW6a zMw(_(&YQ3EZ1)bELg6OO_D4Z8v^YJkIelSNA1tH_LCfEzM>EQ+n>r!ca2pq*r0{)Q z>lX;UPT9%h)M{4Uh~&+3A!=0=&CEL~gKhxl7{?qUa_adJ-2RiwT%} z^fi`yHu)KL7V$4&%cAW8f|Z3)RE;5(ukXK-y1ZL3PQd>fBj`WLMacYb1Kbqyzqc}T zjt^L^Z0L<8F#zdi_ul=ARhR}8R(S;sqh^ud#jE~%szE1xkRcc~5eOF>c?|W7M#ju3 zo7`r&=oelK`ieK{3OqYZ6c=#W)_Q>M-x7ebJ?!@bVF$mEI?0p(PjwxpszDsea`m%F z92El**o%ViJixEMN1=I0Nbz}G%_(LJozrIKkMp{VJzSVhUkgc6w}3s||13fk?J3G< zco1KuKxcU>K9Q1P^(8`&sQ(2js}Y|yJwQIt4uPU?wx#M@1%F8Ohq4=97ughsKUQnC zK_6!X{m%|Zwwn{_)g3TB$riMl3AD;28tMNwIT};EnNA4uh7RZElU^`|miPncW#okw z5h$L)Q>)=y4=1C+%fc6w-a8M_ppy)2=P$+wC=Ehq?+d@w&kgnN4VruJ0GssX36fMSkfktW7m2YMQoX9hme-9U4`(2apXJwnVUq5Ii39KZfGF2Q06k*97J2;}A z`gziiBg+milf*d6U3(aNgL=jpy`fFkd#n$2OSQ)z5yk z8AzNlE5ngfaw?YcD+|A@VOmH2>R}Pcj(#KrFuINw6wN^JUn^b%;Oh1ybRHFJlr&%M zHEixgxgD~qz1k2R71>r|zTLV~(jAWL8mOsjfs&(%^i zLpcyC(&99g^u8C6{K(jok?03DU^gl34CH{RVnc#83`UYtJV@6b_MD`d1H(~0D8zJ0 zB&~g^E!_a>?BkbamKy=#sB42)`>i=Jpn_3hf#Pg&9@2}wpi}ppc~*UYjx9FKuwzbZ z>=;;a!34T({%X zK;v6yUb;MmekVFCO7xJaKW*a?#Z_rst4I2nh=N`b1ZEZAOm8V*0K1M3L12o>4+BdA z=c#I%qw`Bp@gtC(^S?zS>;kJk0&kdZD#s9+D(Nl&Q(`ltT>Jc0wR8`qn3E3(s>YQ_ z3LM#Xp)BG!&4qB@A~sGkwXqyrc)qXL%1A*g-1S(w z_9(^oBAJJmCs;a~{9k^lh!^luWIVCg?9Ja+A zm_a-t^TDsOgy= z64V-Y-cYucxfXR~#AESki;}k$M(utlP%X!&y@Yn~!oBCPvjnyQ0Ei^C@Q=xx4faS0 zcbuB(A_S}jd$r&T_)yoE*UqQ$SfxW|11jU6P4B=SoXbX~fw1%7^Qv%MN(1*pzL^DR4So;j`?25ks^P~Q z`|MO7fGE$E>Fmu|F`n2O`*{A}E&6x#A@84PnFi9Qe(>GwhQWa}Jd4C9z_e4s6;Ast z&E(jBqgI*Lrx}+jve@T88Zfaa7AFukM2lnh9u|^&Fm9;vi}vBG`;I?aJNAshfE!e- za=3k@DF|G61%gZ0=;Whp0=sN#XvO*O;#tVoK*#Cy+_7U#7T2&{fq!e8`1!y|PJV!z zq2dDGjhcS1q)CNeaa`qKiXWp_(guXaF4k1TZ>*mJ4kYWQMWYG96oRC1&JIYNQ1PBU z5DLhByNO+aG%e>}M@+tzxkEXr@CTVT_|a25ir&WE$;rsO(qe6R`2m!^g*0)Cel7-l zjpBk5_hc(kYjU^eZx!$ztA6n{`r2=hWENd&=a|v2D2{V!X4edn4cMS*&R*tyN%%N1 zAn*8D6(=h(E5{*DtT5PNzsO`uX@* z(~yQbVFFsi?rAk%r}?@Z*H8y2SeAy|7vCKxw;S0bDcNd#<h-y@M?o3weOCP zCXoCbbYWBB71h5rMme&isSl?Al1MzwN0aQ7##c+|AM^0bwd|XDbpK7w?~yDScS#l^ zVI2Wihi?-3HATSET1l0N z-sR)-XIo3Ch5xPq^2KMAB|I+gAS9H$;Zanpj&m|6+$vfeY2?_(V#*GTpb<(Op&U_L z9B~1A>>4aAO5N|{a9Bki{FGvPyCe3y$NQ#4Pv9_ybio!_$I;~L3(!1IR?^617OH7- zhH!Nr0IO-(0&)**W&)gen+kw0=kIWbyxq;4qS`E2_NH8i_4adj2*sL|?gTFW44Rr( zXIRaX&&0$nI8j#6))dR6q#te?%_<@vIHbwM+V`e4%)3Y?3ia?P^&rO+@l5k=?=Hj+UP~PW>3WJTi%N}R7v~oibvLcMkVpZ zi^pA!6a|EQu9HvdfStd)Ggu;F*-47t&w*LoLnj(5vcaVW_17eqXgZEWdC_J&#B zU7|d@@+tL(vfUP+**jQ->&V~HLFTx#5BcVwF;GWq283TD5=`@iV;!g57t>rW_d%_& zhflyw+}rK>j@sj?eX0JZ+f(CmGvpHw0t@h@W)M7;qA5nQkDGV`C42n?$?J*~&{q)2 z)stQQ+lNX$EIjBpUxA{Aj@3$O&~3$$uZ`+La+xSqldBkcI+toti0Nay3NnsmX>|X7 zl*MU03~ti92Mkw&N7mXd^Ql!rX*BHz4@-R6tiAU5`el*Ia3ey+D|T;$me{=|q&or? zb%=8QDYd^+FaZIoy2K_p6glG+EFe+rvZw^}$RA6*V{HXa)?A8LwO^lVk8?B(a6H<1 zV9IGICC0mT=be_5h0fqvbfpEOQLgF#o%izSU~I$qcxz`C6<>U%MhBfxN<@o_)Ft|R zDd4JL`Hj#+!G1=(NX171*50d03a@+W0XPA6LkG7cbFB~^Cb9s9)*=z1cvTI`L$-$% zx^z$K2|b*m-&1F`M?j?!GQ6<>m!rJzhs~K9&H=xVhQ)TqYNYHcKC@||{LtrO3dqpD z#`7R2@+4IFzFhKPAMrKSQ|Rmv`;)|OV#WJq8F~;qVYcefADqrN)+e>hZ>83Xv-mDV zzK{mGOr1(S$VBd#(uv>JkMVZkN}>l9QiJq*Un@hC3c#@KFm>fBXrq@66AnWSV`1b~ zaKWOnfGJW$sJ5j-gPX@K9rJW{^YDKCL@&A-CLZG!@UfkbIQ!P~OLs!z#hj7TAx#AX z*$RpFAsb8m!Ti6TR7FTATEDE*q8O$z)uy`4o_?{)6}n!+1QiEgYAQFXB;90J6Z*8v zYk@nlVDe;kjrA+9=HbW|T?a*T7O3K`L+DsG4Yc{Tq8QS=o}l2~U?kVr5G8gdGd5*7 zS65w2qds7^<)~vu(>vKtG`BdfjxHrixS&{k5!rb>KUA=obqQ&+s;6Pl-pzHV6?P7e z56~$$Nm=u@RMvXR@Vj{TiuFGKfq=FJ_D0SszC(mX-=X^@lTg6F*>f`PxoV!}b_HM0 z0k5>KK0|M3fm#Ev;`<(T!#}ncux7IWOUM5vLi~3E4_Q>n_tm2ATUi?C5QPN2?JKEq zi(EShU*XArN6Y`X(fND$i{u2?pLZ63T`$PmPIGZiJ~7}jkG(RrG4fjetX*P1sJK`? z0~MKwFt>w9jfMB731Rda2$g@v?p$0~y7r>y`RBk95EB>~I9_*bl$qDeDrEO}va*1n zGI^20hc_Q@Hn<}XJhrR;PdY}v-+d!2!s#=ljf>bTYH(ym zt5M!+#Z!IKQoyPsFd>LOot5uacGa|fkVUR=W2@CE=`Tn4l^A2TkbeC3-|P>6e?HKj za?N&d@&E(HlGWwy%`@s6pGQV4Y%eRsww%B3H)0;IJHzNM@{67)bydwYQ&?%Py%Y+I zE{CL_3(yQ{>rKNdv$GZfCUr4S)=H>7ZT0+uB6cyrZA`@L7Brddp8&^khech-Z-;48 zI1i0Q&rw>{K8Y}N=NY={U-i{1dDXC0fzW#1U)IxrBZzl8skIS}XK694>wNn4uAko` zsM3;fhGSnMhp>*9lK?6P`AXg*QPFE)=iPOK&sV|(>Xs}+%^!2ssnyxu1J9o?CFoSC zZ<-gR$k%kyXcFe9P5hbGI&F6BB$w8So8S~d&PgU0$^s4(lQkaF=R&i`Uo!x zoB>zBculysW6>q~<#6v!Ti^Rwx^fpJFu!jBwWTy1#%;3wW5LD7AvB*p@C5>51W~GW zL|gi*;JIAGd=+_a&D|npm8Bp$SnLciR(lEp+IwzJGshjV2LudlYPY}bZx+oFpuXVt z$?3&qm_5L+%dbXa)NwS^O8aJU8G%^`iQ-dyZyxViQJ%k8aZNT}e6;b^Jtb|_UgN8V ze{O)JU_bz|h3vW|GP4cy5@o)%S3dImD+V>CRxjyXnIA7SwdS2naOACxSpqdio_LI+ z5*}?4DlJTH^YL_W)nymhZLV&3LoPTCnmq?6TN*&}KP!2b1G0h=T&&88 zc&=lHMR|xdVGuUKq7r}tA~*K`hujFE!+eeq$OV5=eek+MG_We2u2yHP^zDpevEgC< zo0}?tf}3>$a-JKgMgk?oL|5Uvn*_Au(OBOa;8yL}^C|f^xweNOi|x_DdQ>1e=9hPY zH(nkA?wgmc<-N%{RL?M|{0v%b$WX0vfZb7Fd7uf~)}2bd;|;Bvc%$taTS#K{vwlu= zxxVaQVVY(qGCcUM0`4i4wR?sT;11zLg6Dl8ltd*IvpQue1xg}vWJ7{!_9|5CMGkb? zHtkJ=oTMI+ngAclwN&u;(MctY>MJ0jB1nY_FqIJZ=2D^jCY6C_UnMEO1 zdS?%tIIuY~^2k9UwWSUE?$j4T!32FUIPk`;n%zY}bRmHyaG zLa7L+k3noCYO4o&&`U}2xfh}YAoZ+4w3@!yNidX#pMYgjeiU|578?8pCC9_0hENhc z``Xsh)1h$D{Bw)|z(p$QDLjLYGAM zj@LmOV1?EODcA^h7E*1oB(qbf90;G=1|~|dpp)k-E|cp;3SNOUge4OmL1(6 zcXL=t51OnERx6_8uovs1#9EP<7%a_x7@EC}O{dIekVO_x$ksJdQw@CkVe=uQaee8h zkKc*Rvm|Djp$4EIaJu9lx*fQ6qfiuvHFqz0seDED}L{~J)n za6jbk<%KoMjk0SnfjwPZ4SvF(Kob-BCXi=bAl9Zz4Sm%k2; zX!9)~0Z@-bp|$fwTc{w@W1;tP1KQgzGhtvJZ9r$p4RC+SZ;@i7d+h&lhVIZ2Y>B$ll1fbxVD%Ap3LpOK}7C#G==1IMttENDx9Bi;45mA~5Wi&{+EX4J7 zM`)S_Xs-ceUqLi^OW-z_PN z3pp^3vdZ5HHuJ68KSv8_MXn!ioP#HFT=%Ct*o!)ARHGn>-aLrQ@((YvyE|R5Qkv7@ z>aVfcVUN8$#8`2LY(G}&wR_CVh_3A`*Jc9_)JQlzA~ao>{bLh1%x5*Hhdt6RK|Rpn ze@Ww2?0CTD_$9m`Ok`B6I{Sv6J%pYJGPGtWBo1SlNOO*AWMiqY_Q#Gs1C@DOa_{db zKi_6D$!xv1FoQ+Jl7jc8#%Tx^CW9dYgPv4?D{i z!f=2(TbP+>vtt%I*jkaF#Ns)uu(126BFzr_jsj>aZwDkXe$0sSqxTp{HnLE4q*yI; zB$hN3lO5(;sk=dUP+E~$T67@ky0zFbcW@ytFvIau7*06TpfqlGbQ#*rChNY%<*-Db z=3LNw3$uYfw3`#4s2naiRuEUsAJH0tk5+p2(Lgr`nkdXB@cD4nr(_i0;)8^~K%vGb=g3_=8~Ffg z7gnOW5OfFX0&gnX-O6_vUGqb|OE}x-RCn(G@r1?!8(^CGO^dSnBtCo0jr@Fs9*K)E z*vsnf@4MJ$O60DF)auZSY5zY^CVEI-15M_|%KkIHzWVR$B9m#T!q7}shEXGEgRtN@ z_j3PI7VYt=-O-<1xy(w{OTE21VUnU^^lgUF=isDc7aULfs#rky!nqG6BX%NBg!#o; z=S&+Mi*obGPgNEW6?(z`^lafX72)>E_N&IPe$w7dC_FFP`5^YpSz$@E_koovqj;M{ z!+~-Litq=tI|SDJX}LPksjP34erNAN!Pn-|RhEHMe9pKp^GL`b^67AFaDR2M(P(ys z2s9;T!YrtQ{Lgv)PHN02KDF?^hAJGtReOW>hSUQ7i}bOewsz@9pF!~wdjuT89_-$2 z=j!(1|IzgxU^V~m|2Vx*G*G8adnsB9X{qF-T^cCuCE8nYDh*n+XwV{&k*4-gX=-Wj zG$oamme&7%7T)jA_xk;>%jI%iIH&VE&vD<6`!OOU_73aq^^~lbg|5pn*u0y+Jfw?v zqWn=8UwW4_L^Qv-G*dw;;5?(i$+SL&%j61V4>Ns?dDuE=nl(=6Y4Z~V^C)Q=X&=vm zmQdZmlKNHyIQtE`?iaj?UD-`Cyn$K8kNG!Wg~jf@0HUR0{906jYf{$+nc<1GSPIYk z+nbA9vqKKUqrNr!(!;;s8ZO)v>{mu#O&Z^@)w=7xzPRr(&RwcqQeRSx^d&C$E`3xM zT9O)YGTz$Sh9kejz46z`dV=koZ?k`B<4>=bx1J}^E{QaYUP@fmU|jy(n5$-dL4B%D zR;t3|KrW}Yl%XFMzdEwxOU=A}bMEGXo~<}ht{nSC zFL2Hk6PyQguGe$dZncn$zlFpEbE;=0SKQ$goIwVRASLMmCUyT5+of}3GV&F(u`6_# z`JB$H^|FQ$ZtgG*jx!}+Ca1?v%)Q$JkBTgldu7vJ*fGPbkhXo5!R)CJI`PB1j@v`f;WE@ExKiA78s7JMKDFY(zA_{&%Jzp0Jv6I%@J! zh1OCS4Mfcm<;54)?q2{1A=UzUdx^Es1~VpU9*%|+@{90*v*wx0yw}~{CJdc^RUc|0 zmKkFfK$P7;`AbDcH-@cM$S^-d0DqZX!heF4KzQVYVzEWA2)4J93tvKI*oWZa#b0)3OHR=iYEvu z6OsL@?N-+Hk1_l}{NeG{8XKZ!2JzCQ<(}&Ob-v%Xr;dp37=Cp3?6r9n2qnI%DPit5xWz8$MIlKV!ZYe z=P`GWRyxS}1F~H>9Q5qA-6h<$vl-ln@lB)=lOchNcroLSJl2lIVb^=I&C1OwmQHWB zgoqyZRxhe!EWS&NkdQQ%4r&oF)V!elS`pfIkGtmAXa#}(s@}H5ha09Bt(9ETyi(u0 zVx|smG16c?PU+7%d{=eR%U2c9F#E3ga$@6jMHl-K{upH*hIv|i=Do!FpI&hjNe1ky z@#UtzUTuaHN7f?VO5Xj_-m3ql`GvDbQ*P*FS~Kl8H1i)@I_#OKv{b0Fvi0rDNsY6K zX$e}P7Pq#Oe+;>_@(I7VdW!Tz%D(j=>6q{C+it7wr7?>!c06ADLk~*+xV!Llh>5D} zW0KdKyChOS%2%EZtzRu9Q~5v_5u_QGZ6_5ve`a%Z|52htxa(}GEZ>nJtl-!EH0LFT zTi>4Xf1=Cuk)I6WH(*I&JSQlqUqmi~#g&|GfHHK}&r!nmV?xC_J12|@=H%BaFhQM3 z3g*v37T`E}^CoP02$BD1tH_f#l(N1-ncZ2oe)G`28gvjZupK~vVk6U)5u#0K(Mgl?CUb+Z#MPzUulE!UOwZ# zGOOKG*8VAflh2Fc zOdOt=DA;OP_ywhzl9fNLWwA)Z{JG)N4VXIU23$?{e>8R z+u~zPow6x)>7g@YlA=0qXw?|boyHGXZ#A3K2QZmfIUikqJa{50;mVQcS`4jcXEAZMq(l>w<)S~?%RkJtXY4xss(5X>j{4kRMtikv25Nh6m%q?;tn zQ&>q|dqZG_m7{;EFE9P{_0MH4d&8+()`9iI?;a{s%ic>pd|y_?P=uM;q)FC{Lx|Rj z+D|BP57oJP+DchozV14z_hH!6j1CLmMyEiWA%pvJs$c71@Z}dj~&64bd39GQt<1C7;01 z=HNe6D4YtcwgtcHz8UXLwTmnt;1G{<*}r_UL6e3EZ{|^`4+j17)g;Tx(-(|a)G~16 z)jsT-Lz~{R6x*V87S!pwuHxh+&4&VDxjj&b>r%{3uhC1WVcRQypgXc$CiM3q3GCVA z2LZjB4H!1kF`V)o1GeJcA1(mreVc6S_ybW|Nt$$5#nb~wE1K7w+B#xi^CxMcfCcLB z%3QgTo&L(3pE%wVu2V@K5c3UM1W$ z(Mwm$7qJgFqJOs1O!_D%y>D}>%PmoVJl8wCd77IfCHvHT4d$K7hH3fY=HlxF(yMW} zf@}7)vVvYGuC<-k zheOg&`3yp?R%XSEKoMpX=BM$(o*9QZDJ4+yQ$vweh(R>=ldlASP1b@ubt8RRTVCM1 z&kmH-QD8hqcI)fGL|Urpv&ie^heyd!{0(ES?@4Nph#Y&#X&!4f#w)u-c22ZbAIPM= zO-&O$f5gIo&4jYux4Y5Gw=1!kHSC6WS>Jt@5r0FaQbXf#seZ{XiF2d8LzFGeA}@}= zDEaC$fupW%TYHuwCdFUlJgRY>hKJWWgA|D9U&H@j3jlvingPcx;Fru(C2{?G>`rwq zokhfQZvgzbb0NKjmsVD9t~WX>2>QCL`rW}*?|XRi zWs&M}bpc&Z^-3|Ct369TcL{~LiuVOX$@12i(%*hCl*Hz7;UZ^59CPBUha7NoZ?=u% zpn%c7%;bPs&>C^L(bddB!|r2h@s9-!Yrutc^^$g1UI~Dj4l56`EVkM>@s%`hA26x6L((}P=&aI^-vtmvZbG-X7dlUt!&!w z9df;Afma=~Ft>DreuPh$P+NG&ogw5tS;Bdalb40u8uwSdhpHUN#QG!6Lo(8OAw5FD zru0~4qsL8F68hpo#A7&_(H9Rc5f9FK&a*zOBB_)4X!9z7$k8q{LQ#+33R95RW9&&z zd_RYz$Hjf4+NqV} zF_wqc31zFxbo0#CpVW7`^YW@Z7OLVrz(u4ii@`}_A}&Z1xVK)w%^bUi3aHW;#3TC= zOxAb%zmLcWqR4KJL}C`Q8i^$CVDBp&y$LhQ=yzER@iUYf_e%Ufc9;hHTo2rK_*~=$ zXvR&?57xtEL6MRUtXl(aPVDWg#hk;1*mQiWY(%*Uqk00HJ3}UacPC&!VjoN$uRe-u zr($C84LeLlSwbFSC(hK08;aP#3Ni{<;NyLlX&pqaiF0NQ=EKY^{=q>SddX@%!8ZTqg?$TnM#ejhoth*3rp^3oI72#7;DCX`3t# z`SbOSlz!bv`X@aPTtzy2_ytROwKjn^VQX2f(0Vx9^i4tY3Qlr==H`5zRJKRs_^8BJ zl3;hDvFcqR&GoKf=7@90it0L1|d!8Ye-K+VA7P&v@XFW*dVkKmI4o7|F6 z22r6RMMr#8Uaquty;(Tk&}aX5n| z=vK*6rxP(&L9ABPLG;=`+}!pitiJgTB0{C0u**h<>EJy*UL7HcEoiiB=DL(5+v@=1 zpsRohD?Y)cF;9zZbT9ZxMOW?T#l`U8*Z?z031JQNxzP;nQ!@rEq9$2@lZ}$CxHC%bb?dp2{eTIYv?VUU2k@TR(En z%QTMOOS->-r`o&Vq{B#Mgk?9D-t7D#n(6~vywZYR3b_o*$%j2v%ECu0T81X^9}x4y zK&l)UU+!5&UAu{Y+PLNN=}YksJe!sQJrNHt|0W=|wvs}I+TBArwYT@Ba~h5~9>|pv zsSX$gSvapv_wfz)YFby6)({&F`rJ2j!mszD8ju`>4th>9K)7Vdl5SFAInx8WAH}J} z=nvPX6wyCGbs_@+E_Y!~p6zQgO)9T^&^OA3qnYvA9Y(B~V9uAvlK5z(icjKxpsK9j zfeV3cs(vb!R(_(c6f94Fk#-;49Zk>x;ynfQ84H|UwW^nZ;W{!Bk7E?~1 z88K2-$d%w$5f~ltpxlQgbNB1Z@L%yg_JL^IZd*!3~O(ahpRlAgE$aIdM2*paTE+(G@RYxd*w*5o!wz9F&aJu z?s2(L@)gh!95=nNpsa1ogR8U!?OlA8st(36QSadtN-E_Kvxv3Hbx6OoAd?*Q>sm;- zbo5<1KXZeW27OQRnq!Y8ez*&$PPrQZ|bJ8v*J7B3?e%V^YF&>m$-Nf_L`-WYD9yGvwCENY+_!2|4 z--@bs29IA?)}KDK$h-T2ye;i6NZ{s`?AqL#n4P49RIP2g>ohIa_EeL4Y3=^u#4=)~Z)+d#1=2_bzyyS`3|i&wJe1 ze!l+u!)-+G39od^*mpNEIrA7Mm^zh4{?WaXpvs`+MwXnEFrpzFHH~I~fulL9 z@t``?dn6!!?jzH$@t!jqt7}YHctiFACcR9{o=wKU5o|=i&O>ZpiBWjjX`=S zG{g#e^cx)wkmfuJ%f@2L6vjI7azk*vTn-F>J@xx2$YApZiy__SgtPjN)f_a_2gs}C zSEJ2_AM>qeaGc|+xVy6s;irGJe{V$gAfPk+#?v4dydrOVm8nZJ{`bqU5Y(Y};S%fs z7M>ka-JBV8WA7=^nEL(jSwb=LygeYMt|S>lju>y#3O}I?PF!Cyb}49Eq>~&M_2&0O zl6EJ51*(ZfMr3Xn*GLi={cp8!TmT;I8YDg)g>ysvzl7$hqx>%)V40_wv6{+o?+6NBZPj2Eue3uvaZvH>jUzf~=iSqe5>qf4>Os zsWcHRX>>kWeJL$LlMw#4yg!d3pv;RH;o7c%=UoMw8AV|7MT}zvu_VME!yNHU^eL79 zypL<2jRo@c1t_{~M(-9}On=|$6K?3K@1ZQ{6?;LU_(>~Nm1ZxNJ6_t%d*lAeCi^;< zLYR`l2*-2s^c2zWmGz1PlUDRY3_0n{WPCid3_Fe^tqZYQA;Ytmm@Cc*(h^nm*73e` zepOfR61opqak$2`pFsZ|Qgf$QpTMf;g8|!7wFGOF2wJ|Pz=-}%l0ch7BSS$83x76* z4YUF1w%NrfmfbipRll6H4_dlRtT2|cFX3;V7JSqu=iFPNQnd8i_s3G|YFKoGAP zLP}QFk(AEeFO=$_x4vsnRfe2yDZW4-)G5m_RHRb*(vAh_cZ3z7U$<(FvkH>vn+0ml zH6VJsDAa;|_2}4&G9T6NHJotO|I8;hZ+0>+c}< zdKo-aiIt)-xr4W?qLV5A?>h;a_`NIr^&Oc(p&ju5`%VlZpOFFq1x4e}nVNPI?{3&C z$6_ir~#0z4d$2l7JPzg^RqvKrZt4xW|?Nxv5sH-kN$hL7~kf z=scc4_PvCNBNFxhA@_SP-ADcZKl=`3K(wtkh?8c(!Q=P^n(q&PpFw7_ci#1Azh%JB zl_MR|wM+i0LLVtanQ(8rhb)~WFOGwmp5QML&Z)LGYlI#KJE{{>WJxsbfn0}R?r z_ntVv`TZj$bCpdr2681_2cw=WnEDhp+wXjp@<%|IsX&j-Nr@qb_v*P-tp=J7WH-!r z?db2O_6`y5Xh!E%tDYUPO$`{re#2dOb_sN7XzhcGSYUs8kVpnBV`0w?H+J`4Sg)6{ zDxXiw?%dVK_j(^yd6GYr4r+zL)#>oFS2^jNUDPooVS93Y(ME>E9U7yl4l^t_FWQG& zo9pz#JRl-K3ioFjw_bPt86S#byX`+7jJFf66Agt(rFEdAeVSD4xuPT_#C9Ws*c2t|B&sG8(Oyw~6+5EbtT0eW^%0jCWCz~oR`UNpm8&9%O< z<34S(c7FrtcEPFs-$VZ1Mhxg~rf^OGN7*0yM&JN`;B=6YXXmY12xOI>LW7Lb=T~|} zelKl`t}Yqu&QUxC_zRfw_ka;`Nu`69@9xzSMt<9uUW#5#_QR3QFLd}>dm85Ws{+e~+7 z+FH~AYbM*WAMi4B5lBNR)_2u)K@O@f-c7Lr z$0&XH3{e>s4xekG`HAhwW$g(^ym93`jIRo2wpK^3QP6|>;2M-23CIG9^T}=K(&L|Q zfep9luvRHvlqrru>&ktCwIf!k!x4+vmXEYi2Zg)K5d(J!VUK|iQ zT|q+A4TKsi5s}ZF}o?uyzTax~A_>Te}vqjZCp%_0HtJhbYaLsxd>PE-(zEKF8#nVW@{#?L(kXM^gJQ{{$$fAEGXy;9vNI!^9&y#p2x z9jYK|5$bwD0^3%I5e-C z4GnUyvXwxsBL2aoG8@Jp=A7OPcBV=H+yc%)Zi_Li5HJpkCSS(tz3&CW)Kua4Lz-Wb zkTW%mOiS~Bk<*oeC1DYuQCH+|Da0ZM(}`ZVduKpJ>*%w1S=VNq&G_}l^<>RiudPMq zk6V6xYo1EX6Q831Qg|3eQ3x{T;hbRg@q~u*$GlOIW&5jPi64Q71|YLqe|;8GqE<$y1_AgTpmTbl zB{>UZpWGc}Ymc%1=*+pKCb{0CUdy+KB?H~2Pd4A!@5JybO6%wohd$2>rY9}Tfb&3;_?lzv;J(u%SjK!m;=}yUa9I5tVo!lU`MsIa2Gr``L*9Y%^0p_CPgGB(d_ivSi|1dGzY8Jq z`COONUCNZY4k|x;;%ahZUjk9}UZPPV531aUn)s3vr663-rWt@%Pl~Hu^V^xFL0~)r zStz@2&pB*oDPKTKK=28;jaHPtYFtc~3*&g!kL1SH)GZwN5X0L1wXd-Q5BOS`A&ufW zJr|9lHV3F0?^9-Bg|VLCq&J@M0f>bCIrF3AM|jOx?(DyduE$RP(p3{KdG4$mhW3?5dFAMm{b+w0)LxEUR{Cg4CcUK&~M@iz9i7K}Sovzt8NU z$~2JD)q1Xcpev)xY8wK5^|8ZJc5NT6j&=!ip9{&T?Q~`R9@BbkTg=2DOZ@JduM1@` z1=X)QhNN_8UeZ3V;Pi_}i09U7*BNKAC@_^KR%?WkrRP}UgK4$`5S<^Ca{N=6aFY?N zhGzeBe?SSJh50w$-)pivbo;uvpGX6TOVazdEBos zLt52Lu;n^{e=bSK)GLTWQH6z!8c||^I0zLl%bQHz{RmxE;eD z2yK;|OrrbO$NVO-nRD2Va&EioAa2J>n@aVheC#7%f?PYPxR_|fdI~PC2~IG3=hnV1 zd*F+!*TG8Kh;M>wLl5jfxs6zaK5ZV^7sb@T#gqtvAyz5r^z)D6Nj=v;B>vM7&SFvR z32J@SY2uI@acco{YV<>Qh_>M#es{u-@%o?bWd*m}ZizYWxV&XxRv!fS6NGqtC0 zw#p93Uc%PM7FaCkzg$hL4oNnBvSN~q1s`(kHb6#r` zS5nksg*}p;WcL!2j%|e62T4D;?*EyAs3XN-w1o(s1-O$^cYX<%S zs_)Bw@NjRmQVVnv-W?q>-HOS`m}Xu{a=sXMsOvD*Q<&br5i1E`q)9)!Jhxcvl^HYT zAS0MRvNP;zV=a>-;ym+eN&i}pxZf`&-{~gdGZ&{ z_!0FGg&JPGZF{qrYn=mgg$I}TVPb;$75c5K>Ql#U4s2N6b!RMQCJy>W^swQ)p-;1{ z$EKt0-035D{rz9|SIiO*TU{tIC|n6+2{n?EkGdc;uQfr~haqj2yrkQjBc&;&5wCew zT=BMK|An;jDev{+x!cEG9Po2ot4!k)2CFez+y2d@O>Nv0DVDw#6JJP`-ugG&y5hhI zvPFHc$@xBN5ys-7FD_>9BIFVD)+P|erWQ?SDcv0*Asq|o?SJLSUfE~~?a^iMa+=3& zj(E)6wf#a|>A>duajV5Ze5CFk783AC3DqIHZ!}b?6yM;xGG0 zVBnViBke&V{>@0iTEN0nuA+4D>8YKZRfw7yFd+%=z#n6)pbK4mO2>Rt@|t4h<9d#G zbx}4pqcc8I#k0|d*DFS)qL+{3iA|??O22lGkjKxmcaD@YWgXT`8$LX7bv3lllQGen z0PlHG+bvGgqwt&h>GVHbfU^s=>~*&G6}tWx&;8hsb5y(-v%J0ED}|!yW2iYri!U2~ z&Q8E~f4Z!eFzL8)i-4Y2e*C0g;nNe53dy8Gb3SBUwLkOhd_U}~I7VZ(wLLVOA4-^V zQRlmYOIo`4YJuu@K{Kf%nULyf0YyqerBTK-sqP7piEEbomu;pciJ2*>@}K`?ujTB} z{#6h$nU~Hkk&+ZgUwpKPtnSK~tfQyDmrs&;;e;>gg>uu4g2xGJOAHe)bo~~V_J_`U z`6rHgxy}NwhkJbF^4zKscc=rA*v zWdd3TR1$Ei5K8%dm)?toYL`pUN5Xo0m{8eH9D9FE^$h>(R2=^7pd#l$K@Z8;*!XhCZe-H}?8gO`<$; z8eMB+HOaN)?7RP>T-+%5BG{CnBe;TvT!}@^1mg~z2*Zqwq;C*?pqSA9_#XEg=^uQT zHP)n4D4I)#XqN5yLnk%Dv14v^2GA7n^q4%lmMJrKTKFWcaBZZdc>d|~i2F;JW-C$9 zcs#%G$-=Z|nEfr9uqC~kC#Z^ImuPaBFg+ei)67XbVpHg@Djv9H5$?-eX>Zuwr1D-u zT!4;;X8+s+|C@99))S{T+)E;G)b;cW81gEusEEcG#}d60{7OYGw#MW`+2M@mrsbhe zESiQ~;N$o2y^Vy9jZp0lp_nTR+xu)^!YP42l?h;*EP!o_RI8V8A0WuYI95vLhFviu z)=h;kvh8vrF8p1Kwyn`D_NSb3N8&4jg3yUJ1p56 zbAR&vICMq=^BYa4yMo|0%AossRn8fb44+Xx$mCNn&-9UP0-xykvPwFv0v=jSXe#5Q zgcP{ygkOhpynAFccB_yho`E(*gDk6A_}M5Jq)p)**lG_$@%Y7yP|eZnfyiRZZBNR0 zMXCAHl%X?eZ}0g%g{trw;U z58HWj0EBpYA5*)x;x^d|V>bc9G0aodQ~tK>9CxMR2GrAZCQE#TRTmF>Ed7GK7OSHW zrSRxr1zXZDkhpxUj(jx&9dyguL(LG01^K*7k;#14(JM7Cm9*=YwIv>7i89;D6e}%M zYbXf9PjQE_OOCu#tYi&udH)ZyOQlg-9lc?e`$bhM#nh+r@Fr(NmV%SErs>_@me z4PAN=$kByqczh;c48F{5#X!ML8M408!zaHwd{#W#q&Hvl%e@=y_9D6>)aa%{bqbwd z(|6hPdvkXMi@oF}$;kNFy}q`Bq-Sf|QB!g^o`)P$CYa8013#(<1@-HPXRQ=?cu!^V z{L{w+iyI(&X;pHXoJ|XcTO$dwOyvcxNbk!l4}`y6Pn#o(xyHkgud>ywUZd%EEl&Pe6)VU5H+W$ z)sc|KtSD#|Fqxbf5jXh6Yn^<&Jit1EtS_VTao$$4sO=f8vcPj09)E3_25FqCS{G^(Sex2JMpS*daL@(KT+`NlRnI>o-CQ``gp5?n0iw ze}C#oj(XFrL-fL_6@&{ihiNDjStS-;5Vj0(z2<$iJW&+yAp7eTjmX*$IrGAVFK5e> z4jYW&w%!Ivn{%81Xgd0S%z)emYBDMP&k?wf+`}ED@Qx!dBe`Ej#5hhp0p1$*>E6Uwu;y)Fw^g zvV2W6c5jd8TDLP2Cia+RQgYvr-6aNLz5B_BoOU?7;@bN_oW8*N3NFw8{;Fh$d!pu_ zCjr+Zx4AL^77-_Nlz3KRnCV5sb3eODtbXmnTQf9ZSvzS4TCQwpHw!8$h}3=}GCd5# zog(B--b4_(MT%%q)KZ?|0AzQ}uMElMVD^%2liO1*<~n^H z?CL2&L|WGf#xVJy-|L^)V=y*$O#W)Pbi#YA`fVJ` z8BDFkd4pKca_GRkmM^Yf?93H)zW@Ch`q8)rw#pkN;T}+JjvP%I{4=mRK#uwp zP+a-<0A6VXf;hSR*^5rEKsIULc?rkz1%n_Zpf^0GtW}Un{{!Fseh>0QglR!Mnd_%x zDcwxBr?K0|e}g2_n4m{xKPTG`#{NSS4mq)AFb`1HQ$u<&IMGkI`l2Z}6`42F*<0N& zV{I)#!gVtB^S|TwApbJ>ajn5)Q5fdsBa@GAu@Mk+!US$YX(^2LJVzLpGfM~W4$A2r z#A=TW0&BzBkts3)Esrkja|LTERTi#-G+33=^W@)pvQs+1|BJKv2iV!qJ1d|4J4?$z z^JVqVXN!;e5G0}0WjCE}JJ{wz!BJCGHqvL9Q^j9wX~Q2(?4&?D)D51B2IyL*%5 zP8r;*c1RS(s)evXh;4jNa6RV4Obl( zJeApjqCCnyAli)HFnE2J?czQHNN;&*EO+P27BYhe&syH|He#3H`s^ldh&|JcVpve< zHDLRjNc%etZrg~@yl;!>*UC}(JLNg* z4ZcIY*BWAsqxD^N8cw?8!}q9%&MTpbAE0q_NPjk35B{j`hxb-X=o7dr8;R**j*EJu zO9v%M0&-T2h4ZyU!mew1lZ+%g^wl@G}%Nv&a59vh$eD1hlh7N(k#}ZUu zbFqb8M5C?Tki~IBuuhcIAaM75ti;kRV5hHwA&D=86ela>xEOC=LA(qIM^WtV@EE=# zpDU0|Up|L*)gqKVc4(fY5O0ud2!#jI-ns$-kN)lBXg$Y3 zM)$FB5Sh{<+rc>M2JmmAFZxiLzG{KQs>_47?GO?-4dA`w<~sO2=?%DT{_;6<8_2GV zE5Nv{IjhXUW%>*3>LTAu+4lJotR1$9GX|-*qepTB#GrL-13-n8*|9FVPlRp0H<`bs zdRy)mAan+pbNaC-EkbU`xvS`yM_#gq12Gfj=b_3t!v9xA41{@g8^9c-yTQc=R+24I zG4#sSR!>&ak@^}&xQ}9koU}=qs;Jod5kV!$f6uJAu1!v)gIBdj#NUe(4k~Hiku48! zbFOMTwuHk_C;~GtIJ{av3 z_|U1YEA-#F!;r_ zrx;dz=c@w((>0{{ialxdE+;CMk~i&yMU2-Y5gRm(8qh<P5cAw)LlyR)JbzOK+XwT_jwyRz>P*cx& ztE`8o(cz%t+(Xl+Z&Wc9GDCopx)6&Mcoo7!plm&UdUrCgGqQ(omn0b7ix3Z6t)_u- z#ONd?q69@+LEl$FuRy)0OY5S7;b&vN`)veeY!Md`r62_FU1s%>3nS{4_G~`b%#zv$ zQOO8AoSTRMlP|y&@D4Y>Z%VF`v-NPfC$e3HV^wTELf#114kJi2Lcz1Klh_UuPFkCD zdyqVUvQdZJ9g1@OhaU9g9sZEp{Ob%%bZBiK_?9llE|hK{Tp(su?dH3>d5DGc;9b_$l24!B9SN{aZYVA|SDE9YR|M{9y(5SBxvvSA?FoN!{Tj}y*cDsp z#2L13rNL}UUVQl?ixi{`5BLxb#sX7oh$LOF(ya6Zg|VucMSt#o!UcPr1a^pM4sybr zTc(H>9eOEXlFUZNkAq-rFIlHWF1$mlG zv3UzGDu}6+C~JL9xI9OQCXK@#VY=x^Am-Ur>gLU0d>f(vIJHX~4%!an#0>aE!sJd|latOMZ+TEVT_djRU5vsA z9LC{{=YBod%;ieqwpUVBx5BAeZfw*hF)a)q{K~~sGbW|Gn-@gNd<|w(4vCF=?V?ab z@=y$&zAqgjU6piLTtfSl%2jpDjsyTz`bJ!1hs39c7NYw>d0p^YE9bv;J}?zQPl4|j zspkmW|L&?r;{$t*X04h>m*s9a@ux{AfCSC#tSc)Taw=&kE+|b)6kk`ZD3BqqJ-L*V z3I-%E$n`|#2}HN%reBp^WsUiEO8<5%Uz2@t-h;Y!TKuDZ}f~ znpIE?w7B_9HY~cs<27roMC8E-{i}r-q5#Dc_Y~FdcMl)o0?yLOYMV3En+#J<6pCHO z;EZGmifN$c9;3<7<~0=zZhnwVy-QS*!#JM5BkRb!*{x2S8&}^*trh&IPTlFFs8IPU zs(@%p*TJ3M_^w8vRi=z-eMEBhDQ|{nKY`Si2i>{&hk1mcz~Pt@Cq&X)X{Ojtm%?Z8 zv?_u9Tc+xQ3fmL#WU+w4LS3PvF`vyzZ;!Eh=_xYDS>_KAI^2UYYk*dhzc{6OX(aco zL=E0q*jk&r!j|a6ZELEG!N9gCJU8-s#AQ4Tf&canehAo1NvdI*# zv@f}+l;wMkg!HUpPywum41&V?2Gj;ZI5JRV$|(%4K@FWRKLBQ?skq0L@wm`4;56Oy zh+G9otRITxWhioo$qImSu=<=*L{uHk$!_{4gH8j^1Yi)mD7gxjMk_@#?maE5}=z zvZIg9a|uKxN6Rxgo*k`I=&5LM8|_dHY@UGRA_tE`bbc$%v0(wI&*4Eg;19;o{IT zXMEyMFsRJYU~3-w%uRxAGa+z$c%CHy??tnq_*Fik$9aqCN=bDeIn@3PeUebHchZY{67YDi;>E=a9X-fGd zRu<|7#C82)(w(1a%qk7|BFi=g7Q zp$2``LXG@ywyr$)UdMkLAc7iNIOgcuLKp_{3;6wc0Hls%onR02R;mAg+NuBczRY0w z>M}d1j~%OH*37xM%h6E7kXNQaA`$PQ+P2I_;Xb;k{kvohGJ+kiFP5%D&G^rqe_C9Y z5716eMCYYlEqR-Nq9HfWC^Z9_c$}K&LSWx@!&~aN_h?z;~uoSlsDg zS(q`<-dKSlv~#fYzc6PNgwnV>JV?3q&>B%h&PrOw@4l1|G4djZ=J6IVDMbKo36 z_yuLZ$!Ta(pT-dN0~giS_)sj@eVv%18Vj8e7c8HNEN)vpg;jrKV(b~?Veo9BoBEfzUPEk*O zg+Ty;j6eF5sp(xwFZ_O-D-5jTCIhWvj{w&?L&zHzOCKW6K`Cy2K>`VqY(QG)?t3hHRV1?&*n)5dv!JaMHzLjWTDFAF5^n;n*y75pak1(BSvYEHr3A1nLbA>Qcye zaO}KrX_pTE=N+qLSfZqxqPM{tomS~f2ib2z9XF*nz{z#hq0DwDSqPaG@#`2+Jb%v_ z7JVbeC5uRl$Qvn>fChhl3T)GQr$8>z2lRBZy!w-x1>mu5^YdHF4-eo#sZ+Ny>uddi zBzC1asNF*xzk*mxxUm@(bCh=Z-fx`nLeNDCS-FkPFf; zJ5phV-XKeWvFau)k4`vt-`9lUVs5X}8n~7BNFQVn$@m%kS0b>x^Izc*=7Joj&U~Y& zjZpR9LT2cz?k(yQ^>y+g(BAp$UG4L_S9F8V#s+MntSKE zo0+BxSGvcuAnMwxC+h_xu!onyXgt!>f${Gdw)3DP1K{|I;~VAJ(+hne50=RVFshwL z(MtJBH!m$7dIJqv;?iQb=wm4Cz1NAh2x9rZIB=?R)M@k@A z5+(;KN&lrlvKi$Cv!?y6zw$I-*60EttTJS+RHw}vDBo9LWsf1!o>!Jj4pnAW2e9YK!4!#B;j4e z8w}@5mV4`oHFsFeQ01v|1J`YoG-(DMe9{ZVurWWPa1xM63MJKjBy@y{QllSE6kokQQ!1oF_T30f;_XcXcLg@r6*4{>Z`}f8xO9h+U3lvjOFr%o__%Jx6 zq@L~2&f>_?wwi`)o?L)V2N2se@;e@kFJ=I|&V?QJZjK@JVa!7!=f7*oy8;@X;<;*N zK7MONQAY&HfJf&KT>Oh;pP-Ew1s*(Nz9VNtqz3|kC+_pk<<&&Q;(X=p7LPWJSK!l=J{>T67(`uQaCV;Fzp1?h5+px=pI1|@W zol6U3|GnryD-7O^;$Rq#E~Gp(pMvUn()!@;-FO94>vSYrGvZf}{ z2?km|)t>9mA6Nq^Xc-&4>5y zo?NTUNDI;fmtmZ=Cs+*YfDL5aK+taa5VU9I3ra@;UO{Ea7YwP)Dv}I^N-PB2j)5V3 z7J0W%S%dqYc00w#n1}?v+ zFhBu%47HrZKV9R;&q8^)hBR?-F4(>BKf34lirxc`f^ZV`VC5K$Ri2!3P)~q}QRk7N zQ&yb~kce|_N5s|F&H|TRD{-7d_2H&#U2CS?T0ET`~jRz`(`4kL5&~4RZI}SH6 zPl?9ACvn(yg6RXXaNFx{T!z)OtLQ>u(%`Pf1zuY<=W}*HKNYz*T!-R`hP($Oc*76| zBJAQl&9jMfQDD5{0LAT8&eC3>{ zPM)P@bYEjC`1-`E7kaNaX8v%Tbpazt0hE|(wmFVC&1UfyK5z zA(S0tYh4RA_6e2(7X%AZJxH1&0Z#0(sasz3@BBAAL8Vv$iO1&I8~C_qd30r`K6Qb>nSsvO2DIN)i$}Uaes3hRMzl zjY7;xd>#Ka?+ujLhfXU!%u@n&+T-TzZCK>_&HI)M)w2lxqv6#y0tIa7CiH+!UU-lc^ju2K{+|!_lmdwl&cHsCt)+H4ChU#! z2X3loK|SNI#IXXKEb4$EP_L#x@uWK+4sQmB%@x^T4UqgzwWWkEX5vn4f;SL}XKnrQ zqg+^No%J!G78~{4n1h$;1Kd;}cckdh+-c5vBSG0K``K$Vd*`=PdiBFA1+TQuXmtOhNz*FvaOExTd{-Ajv-T+z5^tF&_^#O}x=QGSu}v_;%xGq=w+8(CIy6FM>r^26nNvM8h1Pg+$*LN<)HGyioC z+r?Ly0H%q-gTWH6=TzdwI=~#<0jJ3qH5l?$2>aXD)8rzaa|OE@zj`L2v;42q1md;`QdytnF5B8=sIxVvJ%Mg z#uY*@AhVO-1P{JDHwYd5)YIy6{K=SqB!vq_BH<#co-Gv0Z3!g!15ZFS^Rvu53y9>g znw#Ai&23g%dzZbdEil3$BjsRw$@Lbt+fZR2;JL45@C|9Nav+-#MJ}%bljdvMT6a~y zV?Cd0|0b;5e$#V;k8NsydOJas8Z{8fB8pUX^4BFD_>z9!5LefOO~0YI^eZ>49qoCZ z96s$~6#sHhAm45gqStNWT{@3xjjkc+WO-U_dCF! zU_h^;wMO7QriPLqcf$)n<21>y&5+e_1B!=|#yHVzvuFYv7z@Ty(!28sop~&WCQDOR zBCX<kgaFnXSXx#A!z=}`Ft6+BKk}ti2D3Y5gY_rXY!@*YqAY|Zt%E^YcH=athq7Sl zv<!ksdnKEYi1)mx@9+P>HZ{!YO9a2 zP}wsXQxoNfKd2P3OW<6XQ@9AG+#zhk6BwBQ9?%I48kDy3$Hn_MIbXKF;w ztRub*MiQ&rqsAd(_>p{(;`8DwuBW3=C`|H6koUp9?i|Z=+#2gz#EyIN%kr}fTVmjq zHA@P^H=skGENo1zhBr1jGL}v;H&Onr!W{+ox*-3C>uk@975mns=2G2_nRjMa8{oB! zT=p8Dmh(4j&i_fy=11OeRPV^cDdG%~CD;UM`#|^I`v>;frEVgvMm^Z|$=LZEC6zJu zPF(XsgSCm)q-k1@M}mfP;%t<8!9zfvvR&q&Uz}%e?B3tH%tsIkOP2ogfiz_r{l@bS zYmLUfjw0H=7*|oNr){M&F8o5@Hd{=$wzCW!PUn86#F30Ot2n)6f-!W=qX(x2;4M0e zaW}}bh-?#{>n5*<y-ALPN?>j$N)5>$1K-igFs)!zWbnN<50`icic!bl(z_jOkIm z83(&@6VCR*Ya2qIUChID9z);vEx9gFycTj^IBh;j)QBvYHR)nnO>iUP_KkFcWA^%j z5$3&*^g>?!Aos>Yz4e$3_Iw(7uOth;U-=2)8?DeF#5Nw!X8Zlb;;%Z{3zxb3-Y{E{qbTY;DwGoK9h1v9lL<^+HtZVTM!^QP2V`LaBH(0M)`A;d*bUP zk2}vF(|B95cBY;Us}=`{n-eFIWYV4FO#XOE+X*1jQUHB_CcwyikJBl4JSU#6K4zc9LQ z03fQ$z~%v2$+%`=eZ%9b__f)py8R`w0GfPRm!V2ZQo(D~@@3bOoH-#XL&*GaaNB}p z`>4Ywd0yhN^49=gIZHAs{|?9rJ9NNABJxwf`oKl5Fdk;}Fp9=L027cJR6jw*vT>#C zW~&}f$)*05nhdz9Ec@1m7u$FWMM*NV^I3i-9^0j^Z zAP~!lo536Fe&rQvrFOSEG9m|ZyU1L8IZ(hxrsDpwzv>g>(&TDcoPDjg%bv^p5q^ktClbV!hu6~njZFuwCaN)Kr{DiP)mM7n)q>l5iBR5`0 zuie4K=@?aiFxH(jMo)vG=%>HW+OeR8^)Z52GjTlGcavs1p| z`ww%mbLw)4awRqi>*NjjGW^7^oe_VP+>r~^5ND}iJ{N!X{qV+MKLIl^Ysji4^hA5N zl#-p2&0tg@8O0dx8wb}R#S^iya&zqCDyj@W&FWYE7HvASlc;830;KLR*;7_Sj6~;3;K^7%-H{1Fm9rF=PQ(C%UgNz=>NQ&9O_ROE8iAi|y7R_K z?70#O#-`srpVnf*$X}z;&AKi-*A={2UN^a?LN{kr1pg}^a`3VjD(IAb!Vf4sTv*?n z5B3y@X{fe$H}KoX;6%L0&^kI$-9*~3CAM-PW%-O|X8i}^GT-f&YO6`dh{Zd-_OX@I zC2y|$aUHIg4%Z4lurW1F9AsEkFU339CKQXO8m!Z*U(l`p^>Tz}GIv4!V7SWrZQof9 zXXz-D&#gntTX#Fuq8w;lswd6uTNWhZ>C-Z0r8Fc`{O(x}RWI{P6dDzX2i7v< z?HK&(^|ui~ASZ*&HxAs;Ka1T;f!CWl-#Z}<%5sU4!<#h#r(RnVOPzyqHc4oT|5B;k z$JK9bG8@fb>kf&vParN%8PNI9SJqJV4k`l%R!1J65p53+nb!#&3d(hDC2s|*isNeJ zOX#9}mi)p+jcCrYs(O5Uc#IPx(iDjI-X)wQTfhT;!%})fnbL(loFsnr3(qTdCbzV73#k>LG3}QE=F0@7V?LvI`aN+r zj}Fig^Ish5PS$|4-N>TaCx9+@vvl&E+|janNh_H7Ty8AFyV&xTi0IVFT_>YWUC>SZ z0RT3dNjQ04Vbjp|fwy+$66HerVa_;6-LCcfO(vQ7U}u+GJ~P95^zWqotxLp?r_cZ!5j` z+dsH?r^M$^=p~z9I$LBx>B9=-p6)N)K53=i%Z$~1Kl+*fU<{X~*;S*3PL0bC+AdMa z_?r@YEUpDs$+$cf>wBZMqBKRea{cNI&QS8}_Ea6mFY&c8l)_T-XnWY8ajji;VlQL0 zq`td;RX@*LPWMF5X4zzGTdpJ{gU1mp?lMxeV7SUc_0rm>VqtB3BcQO3??L#%%RA#% zT`ExVo;sbxgVCjcGK)RLj!JWeVk~(C2qZ>;mAzGaKjCM0zZaO1l8dc$QIwS3!D5ot z!nLIFI(~TC-+~vbC`L%HfWdhpe#qt{IT?jlu5F_d^bye$aMOPof8qs*!&8!ZQ?I1l2Y8MLcl;8X>%k$6JOo& zf$~I<12Gj>QNX}Qwuo5S-y_9mm{Jx-rrzC+62uUwN2nS{_M}Qijvr@(R3Qk3$S=D0 z^|H1^u#nSlj@+EMkJ--%9Mhu%h(Ec7~ zRcrTEzCvg9m}*>MPcIYOBr>;2kaW)8pd2mCj_o{k`OUvm_h&t&bZZz_!TZk4%W4=` z>zqv5UHK`#)(M)gU3^UB!1PzQH+gQ;HQMX8R$e9 zcRv3|WgA!U(vycs3B$lzQ&)YZmH#SX>ir0O?#-uYppiGA-}U0satk}X>r#e4 zLS#2#BzXl;cysyxO`t9mBMmdmCSKu|K1v&Qxb5B#gg2Mp+j!641FEc)BYfp3idCRk zxJ0=XTGAQbFY$jtoC_pGGnZjc6=Cme0YO>q?ywR--6v7VBL*c-7l8at75`?8N)d6S z0ki*wgdg@IjHQ=bpkX`iEhVOWd6$GFw;zKBdZ_CiFJP??{SVWU8%KU|6@ZK;a_2~) zN3J=)JD%K1k%M849%VO&QUtOnLMCr?!^s_=i)>9L!9iyRA#`%d9r71T5U%$m0H=4S zYMH6V7?ucZvNwce?}CQI+ka9f#1OyVSZM3@^3AQ(xhr8;nVh%HU!5yMX5rB z2()22tY`hZK!}qC*r@*ifjwjtpOSJd1Rx#KB`{7Fp92 zhwZfQNItO%RMK}aQdYsZu7?L^|HZ}dSQ2^sWZhjLdIpB!-#{iT3Y&(8)&glUuuGWu zZ6rN_;_f(+dp)3;&ew8`ykR(yaiQd?6CB3W!ro_acE?OMe_Z9{K(dKCV;BZKlrtda z4g~on`lu0)_cU@AyPmVdO7On{*9l}<7RanfAW2<^g4r~|GA~dcI@&<1S4X&Ze&E6{ zEU0dbP`*ufzIiVMkCRrM{oxG;jbgU3hDUh(hbcuNU7BkLC!mC8ltdK14i#BkTNK7QpNB`?Bf z4{7hO4HNde@Hc}a(Ou*SgK`B8d9}vS8bGib^8B&pef;0*@Y212w*gzqBpA~@ddrdI zCv+Z>5Wonc73^T-JM}o#dGBjpVnhq`$(@~9;_TKD=)3y?6!Gh&cn79~Pi_)NoW1#` zY&GvJne^M68|h(za#4sGXj3%2zZYaSfb-t^+3|NOp_ip@szhO+v`stm8wj|6m^;?6XKM#!Ey{<|~3L5Wm0IL+PT@DgE z;*OjX>%acaqVtiQK}f#bz1>M4M4(}pvT|NKd`51E9D6-M7-|V{YF%pSznk!oj)?7q zhQv5^EdDo4_>R44N;g37bi-rxqwP}!iiRMt(QpUpVjeAMejHho{%xkUig=!g{L32< zXp##|(W0*Rx^sVqw=leg$OjN|^k$-7{4>6Uh7iI_d=DL!>GMC#{6ofVcaC^#C+QU+ zKtvMVuQ+?`Dmrn%bK@%T^kC#Wt979sz2$P)5lXyZJ&1T>ZU)Byql8`-#+pIBWu?rB z$$n&w0m{y-G9c(X!7DK~+w=afTh}=ICjcaoh`@4TsA?7Bt}e^$0a|W=+z2r&_WDfF z;Cy%cRdZHruL2(J((C+%eI`g;fnB1%cjK&i$nCcI+s-^*$= zcyH|;95<(r+5teS5sWsDzGC}XxL*xnpR)gP0SX|^=p&h^+rxiH8ivTp^IV)z6-b%b zJqK~64gov&AGSV8^k_iBdNBL~@mQ@4XNTFPyZewX#nAEw^!QGseLxRYz2f+tW9PTQ4gH@V3uPM+gtbg}Z(mUG zo|1B)ZjH%Qti)f^GkrC%d;SE-iNch`{Oq~E=TU%HeEwzD+f15z7}wQH)udx6gAbiW zU~Lxt|Jo8z&QuAAAd%r+4wxmLE&cnT=$Xtv&CVgY~GP|j6etP1a1WtR%l@uO? z>06*d_JE%m;sdmjt)jzvS377~6-^#fQ;8;$1^wM8{Lb4%nN) zNY9J?fpWrVsvh?2V}V;iul?u>+~{nF=V&Gaz_To36j?2eHLgN85^HJ^RCwE#Zy=Yy zBl$H@HNItB;r-jWZERaFF!2 z$LG>5jO)Tx0XZOQzZXzxA}8a4GAJMBx`u%X$~4`0+breZG;XsT<)Y;GT=)y2 zI|eLL5?SZ8#NKNl%FP(Gz`|CNQAQ ztsZ9t;=5?DbiEOF=`-p48kB?C8}93}tF73X%nZ-%rcb<=QVE2H4kMCC<>M5rjr0nB zCpaEnBt*LM*?d-Ryr9B*md8((=SW(k6qg?x!*-{6+4jojYQE%$0rR`75|aj{QU&e$4=2 zN0zw4fV%}K3RVhB>NIQWf!q;pZ$?A8An7iHqN^wwLeD<+!735O90DgQOHZulYPNy+ zDM{}{mRvdJ8^W@N8SI$cV87Z2K#Hs9iXC@5uS-Li0%OS!S$f5v2hJ|iDkMfEpL-g` zb1V53N{;bu<_^<5659Nh^R}t#NyEYNd*@(~(G2I(ZKz*T;={JK zufnEAZLWCSRG6lH5o%Ak5BoK_BiOa_zRPhGt4`p^t@_H`oEcd|pYI7?0v=CbF%_r1 zc8mJCVvuos`P}y{%F0`+H^sd8InBoH_}|Gae&y+hhKXlD!1!%z4hSHRUSD)^M}lPh z0eG5|dyr_91=^2$UqHb=JaAN#>Jn+J!`xlkcfyXd-7t2u+#;epY?cT0B}YqhM=k9v zk}F!bU%|TmP|x*7Xwqx#-_YuWTa0;I-Y2y45OaWem z8b2&a$GW$qf~#Lck3;h8f|J!y{{E8pD8tqr_(3;1$@O)2Y87%ck%i6?V(p~%B6<-A zjUNgsAZ660{ym)-TgPgTgkn(OkOmwNJi6ZX zGbO+xWRMIaaDcU(!EcwisLBY551S)L5=9^q_2IrTt@%(mxUQxsCw=Idsx~QRM;uv;!ph!pgt?%xR3~;l>xH`c@>6Hk0hg(~NlKBSzv!JJU zWFxTAs0qGw)b{=&$gY}%+Ke)zbTRH+i0$V=yI4AE?=>kbIi4f_l)N@vnmY2sCXU;{4`fnEl+ujDz@b--50q4>4Snz)BHP}QfDyGpGd$r`yIEZY8k%MK% zy!Ik3QKH!CtaZ!hHL5i;^QPpC+1Ew*8YbgYSVhGx_fCos$uvI)3TOM>mv`wxd_8C% z{IQP9(%2e2K+~Z6b7JFIeZ5K38u7#)KezjBN~&@5+Sza11+y+Z^_c?t)*pfTwTDn( z(7WF>y~j=3YtFpwi3I|)v4P9*K6{v1+WahMKac7N@_q1jJrg3ieO4Gc!a2rSydZYq zl1uz#lO6E#R4JEY1Pup(*DB~w$8PYpRPfpW$K8$(E963^_lB)|-e%DBQ@kP1ZHnPF z2cP6;7gfM7R^4e-i>;E}p!-Syd5ap0V1drZB7&ED71HZ9L&alS()?`=xd@0BkNK8f z_~Ox1mCJi2E2sW_>=5cw2NyX#;dIRx?9kgQiHV|pA8Ws6;-##9pK;_w=cq!0kC!Y! zKlVU%>Lxtb9R6MNyk%O*kevj!c%{=oMvYfFJOQpeJk_yeec5+ecZ zGu!=L%QkGJuI(#aezoU){0@himR~sPL*zp`tCx3O<(PNkU_bZ)JINFk6j=y;b18cf z6(Shp=1a%gQ>~ZA-QElOPC6K@Enn+@=66ItP%CCenA+_%Qa@sbpifB8&)?H(Mpv{%G*oEapp{tYKpnco2Tk;`+qd`<(B8?<3PT2AW15B><&k{kC-L0^AtJ$YRA|m-Dt#n(cr_zdaN@3 z=Y@$oj5%V-}8}HREl^G9JdW+)On$2yy=KYN~7$-zXr(eP= zUSqd%0FzVMJYV|f;KrYiD~{0Ii7MZpUzy8~+X!5bnTzuuzx2JH%Dvh|hP1ELEqw=N z=zv*9IMVj{oyX5(?Y2qJl@h657C%q>Zj3IkpU#Z!xeLSCI4+V>^Pw_-O(lVNsgG`i z&@R)R7kMXAg^&pYlKxO}?_cUA0TCmddsrWyNfXi3;CPezh7fJbC)icGK=~)6p&|Az zcf_(nO8Svhb!Y@{8Rk(~x=yWfF*`CPMl`FDriw(0>zP)15t+fv!1ms7Q_wT22G{tf zEijn4*C^_Qoj`2c1{WJU;rd0;G#8WxWG=Nb(9+P8)ezIY3y!P8V1u!NYyo;${ATph*b*cQQq@!`A=%Zi`m?6DpqCogPEr(y^>N;dE=sNw;U#^wb z)ZoW()xBo6183+2LtHHK_xjkH2-ozROMM}K)x}!PB*$bTL#|64ZlcO{P&Qek55l&D zt}8{Viem!qHNS(4E4yALpm*r>X%?cj;!3tx*B&}ijPsR;F-hc&+54Cu44f`{u&!q^ zJOgX*Z6m&$(+3}#!z`#oI(bK9!P1D8TyqO}Y9ZZk@fbetiH|0nkvcy@A07omQ+-Q? zw`t+-<%{Y+=Mon^V#nO5G{@#d`tO-91!c(ZTLPTzVNSDut?Ka<^OFrLu^X}d=FN1! z@czs3)8!Qugdw(EUw7J<8~sAvm#P?tXJx-toQ+;1bJ8N88U7PuKlr8VSpD2-rysSv zi{*x{lM?fS?h^tKp)lafSGOP?r9d`QdXYFlrS7SYXPXs_~J<{7<5V|?!f>U<9+pAesK($d;zXY-bX zO*B$E8y~S)zmg(2Roby|afoi&Rd-0?!E*n%i)&Hi_l>g^2o#f4r*PY}xt}rG_y<)$QRJ_1NiC#06DBc1 zzrj{Zw+*n7zeiB*)jM~t1-MEqTQ|M5<1UZ_A^>OPWt~?-TYx6>Qt0TP)zc^NzFe-R z)51Gj4ZBph1k=|D93-S_ZMv8$5I$?nFYnddV@zz3kh2!$ya3x*euA&Z@|8DIMdh!(%c-KBby&7 zFNqZ&?4IF#Z(Ztjc+I|in!;*cCYY+l`}&_R^He+CbhDaZ8HcwX6>2~7uwCADYl7S6 zTGtt~`~&5ZsTw4q*e&%f&nb4|xJ!I+$w%i(WZPTWOD5O&BEdhz(z}m8k^J=%;`P&+ z+Q>6;XLj?BrcjXq7jaJHh|@8MRb5nRL0i9!d+k zGhELWe57P4`I9-PHD1i=3Vv~Mth>!kDvukRxg$5D^lNB53acGZL+E6!K4BQh!RKGy zXQG5*d7(+uko#%a!&Li%7OA9WKosjdwoNFenPNd{_+q~2S~S(2cy0pZ5mcJcVFXho zn(ec2oG{5vFTDp(eiLsc3E5|FDMq;uhjlgh{EbH;0-W#raGX$lb6Pt6nXoCO zXNdtCWftjanZ(hsTFROVuesMEGv>D0*d@YpN3TcWD2aUk>`!~rdOjIfXVd%Z9^*-q zTX<^lMRcS6ZE*%~F2wyfQTV>t3_O{8xgiLmSb|V+k(b{0C$gxe^z|#~Wt{G?da7QsP z9*R0{a_Ihplh;!F)tD!5oWZ~BUsTPMl-9e~h`r&g*A=^@b#zER`Ka+cr_HsGSMknF zxv5p6M2iR84@MqfBw}lzIJ_x&@#1(q+2o>6sJ5(NmnP&;RDH;2&#WaL3!v`$ntt8i z%b6}pR`uJs?}E%^zqy#~=+=bHcl z+}l;`Df1#QHLBM+wJR9_QUC>xGa{NV16uC&j*3rKhuH48@;cJ;=1SE(W09XL4{^VU?}I5t;f3#jq5jGs9o@uN}%N(klE+zalb6KbfsjrKhTc0Xf#l7 zthNjWe8dWwLbSYL?5oEK0qkZ`IbmbP9OkCh!>2T;^>e9HuOmX+MmLYQ)QaXH81h+h z95vxn-l7pNfh5RXXS$22N{63kG!QsXsn>%y=n9 zC~)61o(OZ_XRk!k4@j7fQkIx#Rz2#2R2dHSQU(jDz$LC@T=uQ=x<{s6Qj=XMl(d`$ z4Xv|H+ee~=>;xhcncP0BaCZ~(n@LH|oEG%zx)tFy3mJrkvoH7wbWv}c87acZn=zDu zjEi&ilagQ9Tt5l7m_?lzoPW|5F0>X^=#iSp;yOl=uqV{*Tlch3c`l`M@jfZG_Y!0Y zjCFnu8f?-R@|(ySN{YAU!QQZVoQou$`6Nu)!${tj+B|3?6Na`h)Q+!6L49rA>u52RP42`DA|4ygM$=@7PaMIo2 z?z6cvmD5S&VH#qzm&aav$&&UGxZRfBipnLoHU~L%S~+5$q?qf8e9uKM4NpXg0=Lu{ z&`VEE&(CX!v#f5=9Hfy?ZtP~v5+EL{5})Gv3nuf>B3y!fw!EWG?eo-O?h{VK)qbn{ zUVzo%1PHbY2U>o)EMY2-78oq0&fk--aeHj4KYX{#aN)#9H6G3@CiqtNVCj+PlC;K@ zp62CoCH5cG_3oe8RHTqjg7o%6m%y_w1nekh=U3)eZ*XRBQ$&|3i%e=sdhY{Fp*b8E zB-cuMBC@jd(~0D+XX5i`C-%0dw=UIv)%bi`Of*C?(hbLu_y8aHHE4~KroHuRN++kVR#Qqh42B4nkG~DH&vBB+P4-x`EZGqFrJ7W_zOPU# zdCB9QRo?f}dj9sp*Ch_isJz6MiQPPERd2yO;c`PV43~(L@{nE2nI$<+dA~Te)XGTD z_3$0fV%HC+7GuM2SXA4G#5!-gghKl*V0NL@=MY6G$N5?|BGv$j8u~KurCHSxJDL%D zQ?u@FV-%;Tw;-vk%lAUChw90qRx>vL3e@f!RBEbtje8x%+%93l&I=V+8V?c`Do>=A zm%V$h&xJ%Rw?Kk0KA&tXm69YBrqi@`5Zg^cbNt~iGb+v|kv(b%EbD0_@$jdiZ_~d5WF0LDi;AhTAR4RUxS zV!(UkH;^aNqs$F;yqW5{IwCeHljkH;wk4@jVsb1YhM+N@narh}bV2&ioYaHHl}dBr z+6{)e;;25@@o3oh zMp9Y9F>0&>!LsJI!GQkojl;r^l})e{Ff;Ak3c{w~7=D?)ml!cfbTyv1u>o#V$1)!L zj=zL-UsihsXPafCZl744leuFb=LD>drXHtH))T}dSW!ku7kM}GNOp=#Fo@7O;yjmB zBG5=fdT#2W(As{Vy=TbTuu@ZkkMNr++DtFWS*71ysRU-6v)OzkZC5Oc**>ta330I8d zWzniS5Wjc8wC}uJ*3*%0YX3hToZeF3o16P=vCMa5ft|v1>Fd8a@47k+-(|v+djv2P zta3H@z+RW9f-kV46jg7`9PsJ^nFxakK!Y&2xaZS~!F*WBTZbw#ac^dGC!(#E}k!aTM@ycNzjChnO?+nZv z7}|GUC`gU|#Gl09A35{(2q%UZrj93C zvd7zy!}v1R^=G{*Kg9R|hpCiaN&lXJ1?DN%?n;l!*#A5wjha#ZpkYp~Hdu`Q4&l+x zPGmKnhZGTW&=MyD=T_6fG6B6BxGK8Ep;v#?BBv<2;J3Ae zFo-m>K41dFh(iy%M8Ti8K^zm+%J6_A%(5kNHSR97oF33;W^M z#S%H_=Y5B}A^7_k{;wJ~gR%?!>8wn8d=H;)2pZ$al3s2Wx%4{wX4?moeS*$9s{nA{ zlt>@l9cvaN!nIhUBap|uJ8+5M0{8+ZiW9#^!^NOcReMdD#0jV+Vm@3ba>)6+)HaWL z!(jh&DadeNfVnE{oN@Gs4THRp8Km#No$7pJc;wWS*59LB`8+&DJ4Gabe=>t}`2MNN zVWz7cjEO5|jy&ZJmWxE>nCpA9=XNPx*TX82*E!%e<}m7pH|bm!Aao)q%VTP=!t?Q| zsej>3%IZciMioUk8Q+zYnsBGsRNzl>JWvQdeg{3isQ8oCeMOa#>2BS4ux^x$1E3)e z^gi+69h9&#-D&d@Qk@Else_M`>8a~QsI zW$N!fw0&ocUM4x^r36BR&?%Ia<^5B&f5N5Q_#YPlUJXd3b+?gSAB%2*vDpP4{fn{$ z{1Pk~C69pAua$^v(FXwh3%l`;qHLQWj5^d&i9`>`VcQJmbQ3VR76tXc>62xL9rgzy z9z6eWCGg1KNPzyP1@KpMI-+M+mRL!~q3b!pt{5T&AcscB!ftjQ7`daoa_>Xw@BgXQ zZ^1oF=BhN2l)mg;+9jS*0asId)(FPuW}to(MXm!=pwR>6l|5UhD`5jpg2!NX6Ayr_ zsNL){c_69eVTyaLs2deCHUHiTdE|HX&36;5EKUOL;#h!82G#Dj;Qtv^IPe`{k?xrR zMfVb3Bgs)d@tAih-d{5bk#g`vrTM52Wp8*>JaNPxGAPY*R-3gh7h3Bt4{mRDqHWO( zjQipB;jt)WoxwgPJCNqE175Irol9&w1wS`%;8foT&ObptUe{2~(?`P;WE(CHp6fzd{t z^rQC>vvunWO!+J{eB$gtzu)aiC9wvMhYveK=R1HUb-f%W@r*G=Abh*nId&I(3Pe$2 zZ29YKEpRh<3zZ#G!3*4W2gSJ=u=tHV0lG@AU9t8H z=Gk9XUBRzN_*LWn`qa3bAISP4o+E6MFxdQN z=#<|gDuU7@&#WW0b98`2ZoGmo(ryQ}gE+3l>GioT{|g?#M@xWLHZ-jfB zzk5NFHb6?U-M3_E+nmy?$q&S#1|^J?h03SK6huCg;eDn945k}kwqqt6ovNekbQ;`W zM2srEctka6cuc7;D#l;H0tvzkKC!)wEO~c!`pc-z86&TT-~tog8Oo_py3F9d z0iY+epi0Qkh_JuLn5~843mRW0BwCHs1WtgMJ(swbJcptRIi84s2Rcn`lEe@;g@dtv;eyTLtriM6x3%8(7rj-OYGUcXt-cn3P$l!7{Lt40L$O zAMpF_YZ(5&0JXm8Ri6P3bu#?Qe!R{q@{^u`<%VWCb z?GC0rPDFGGF+8-i7uNNnsUdVhoe#3i&a7$|b zHz*-JKvsF}o)l3$_5^Mc*WYR2_Ie$dtuu?Q27W2Vo@Z^X#I>xm?Vn5jRBjCVW3x}TpX?YvT7|dtli(yK6F@tM*a-p~~ zo1M~8F*he7M6T65^B?={dh{M50$2t|%O#&{fEelBr@0gW*EVQmeD2K89yq@#@7^f+ zlGre_HaM}?TDTK`U@$`MT)JkyDV6M{PLRB|N>QW#Q_S%D@6}lgD=n~ExthoS>FYT~ zr&7JL8$fRq0q(^6l?xj0_y?TKuHxH7>!sdve}!|_TZ+9ho6Syz38ZN+0K$0zfzFXL z@-S0W2T8g`0lO~zWehB&Q;2bKu7lx*cVgS&toJ&6kg%km+27LR zdenWv8_-Ugf7)tqOG}@2m;i)A9nRf^VFe zh0H4R8(yBhp;(}O@K?MI>?GgJ{J<12*6mM?L~Gy%N1H?WSl|mn*UeQ+lCk0;`mNPZ z4CsuANUQ|=kJ|yQ1E5f}JRA%nV4-!D(L=%f z?>;+ulM= z_oH5(QqWtRG=6Aw9D_8L##COPS!^zTzAmPIf^138R{h)gKReXFYRWh;RF(k$iF3f- z%(@W9`AF3Tqmz|$=?4rBNj>vg|DH775m?afSRWCy<_nIA=yO0u-K%hm+GI?@nSB$E z{Q5YmnB$l8D7w(eQ^A?pVx=?)$MM3= zDJC+?Q~|Io+LEGUTEU@9^H!(AFU=rdGK|EC3owa9?ggf%hxai&QwlF|mD{1bqSCk* ztiyA4)?wSuzjy5G4)^mZOo_<+)D8s8DWZ9iZ)Cs(oGJrv!SpAnC!mTNI}H7CUC5DB znH}*^)}_!Wf@(U~98O~@6H321scH$<%bGn34-hT_jC3;MS;L!dP<>=o&i91r$iT8= zjGv@zPwSzrS%7ml9{Da^xA_@65?bU;F^XKEssrx=l`;YLtctNXOZ(;q{b#CZK~gL%mP;DCOw##7!Pax*E7Rq?I_mfH;jh!5AzN~=8oa+fW6 zpW90=OrZzLi|Ujt5%i((!LUfoDY7#mR}a3jxc!e-c?64Si}uJ4oiPKBt2VA5TEq~Y zCpI9oS;eLPe?BkJpq&oTd+z8{{7H$i zwZc|#-D2;(dFJajc&O+YqZ8l%`ln4>lcyUM+Mhz4L$;-y56iA?Nq!x@d8u^uSFQfm zeD?HqFK^E8>1CE_8uj&cAkLfBD$NTcSD9nl*?Q^&1Jf?kb_ckBmr*(UCQcGAzQND5 zsyXmGhiG44*-996^V6ht1~&IqRgTqf^E5X7ZGU_OtU@@&ODtTs!&dTLtTR?+8(*Ty{%`C4mqGugBy7WL))27|0lCS&QdhXl4}n{ zizKQBdoA-rfjwy``nych8hW4;5VjtAWAx1f^YCe^?bQNr&t;LIHRm}d4^OCf69Axl z*xaU5TDqnnmAvI9@XbUu%N`EJ+pSPN<=+{u4xOX;18>0Ye@}{F;R&vG68Qy zJ}G&hb|2YRfM+3j?Rp?>WogA)!LbGjsJCDBe;uXmC`u`=|3i9X>#iyP``Y&f8}Xiz zpWcO*m-xl$kOpnCXiBn>+LR3_ROyuP!T89P%0jrhB%qc)*Pf%@#J5DO@36m18{d5X zS;kBpa(;ZI7n9LaaP3rokc22reSUSB~MwG_KYQXAAwHxSdmq%!TF#OZGb zN}de3$wIS(|6knXA-UYc_n^{h1{2UoI*coDiVlhL;?`kdeN_hVV@%i^Chy&SV2Ac? zKt(ghRVw24`@cWC!?}q^RPh(T9Bp@sXK#1z1=w^FPz)~$E_{2ly;?C^sW@VYTy4KX zqN3}=4p9o6V&yC@@bQg{Ip3!L%~EzNhk*TnTeQ<3c(-dzh}R&7$yX!n!c8;4oqhot znHOrY0+I8LpqFUQG5*lJF#Lgi@X9GLkj2Y*1GDT)&iAjN2Ql7lYW|iZL=?)Aaz@@v zo@XiJc~s1U(i|V}T!EZCWt_Ne>N|0~PbsiuCqO11G7QB3xcK3ZT`#(~GUDm(#5>f7mAh}3R<<@74|{{V!$H~Pl;Jta|qeRnHHh=Ceo z!B6zZzH9q~*czV6T)drv;{eQoPVkfT-Jj&g|8^bZ-Wb*=`xY<^%8u-B;H__aHGI)@ z_pMJ=Gy=xww>CE*#fbo-DGEvs$BxJ8tMCMX}(uxUfcb{3TWMEl2x2GRD^>m zmcm6J+{Ixtc_M^Em;eG(Uce;o1u%!1+F0lPy98z7kQn^w$QDnt3N#1$9WG8cOJ3gPrM`!@&;Ye;2e1J9sxkQJTyU zmZ^ZPMi`|3qp-iq7NVoxppuOP6U{gPle(EevG@Y2G?Rb0^xq|m#~cGRE}2pkgh{v1 zSF|!oyQBRJGgubSP21&9XUXCb82K#h^hbyJfwHd1^zHwCc=wBA2C_NvvXNyVN;faPm4D>l2j9IgKlLY&Vs8fTEy9KT z`p!Xj!=?c6cPs4@a*8?$#Mz6?7yjy12v7Kk4}vOj=&V7p-FPWg1L&mBLru342PbO` z=NbKfed2$Y4qto>fgQ3GEgIkh-1w%Wuk-garz-AoqjA!OoxKrhDiA`fX<^d0N}lAS z9LC=aIP%hq{@X}nCEP=lstf(i|M@ST74Ag6sUrX=VxZ~LGt18U7k~C-4=&<~J;VoH z!OMc!o?|LrWK8ba)Lw=`ty+ok#cdFTgD?h%D z%O}%X|64LQvHK4lxt@G)RhKscrDiBPPF#9ghWbDW5L3SHd)oH`ddkxH`(Dj-)o<}!>PZ3^3AUk`NaU?fHJkajxZQD4fv?lf!{d{&8&kgYO!3eM zy8oiE$-TEJ=)pMK6==^bP+Qxq0?8Q4*Obz;zH$a|)^biamqcFj4UUof+hw1F1e#zP z@8A6YuRG7c4tE~qjdTNy*$j@D(Ye8|Qb$RqcFnv0-41FQ zxZTJ)TOIxhQY4T(4x(CV1!%bFPbqNZThdgbNgkhlAqfsJFXN$3?Y!dlx6_fG;2f#| zwwJEvGSnDN4kB8HhoMXlKg1aR1DssC4XvRycOqg9kz@I3KqAtCCI(hbfHPa~;N&24 zyf0DqJ-iHn#AZlOFfQnKy5=jm0RBaZvFZVADIlxSuR%)s00AN=H<*&h7bv$gv%ORQ zyBa>TA%$m2Nj^{lZhd_g4cmeb0)WXNdI(v{O{6~yBQbDeVOdWBD?P|!83y~?thJ@feBhkwG6ASDEZH`j?Tk_q;~eNUe`lEwQHZT)ul1s+T7 zT#u^9%C=;6iBQ~4B3|{RT8A09W2UHk;*9`od%%@9g6>OP#v62WorgzOa#n3?bX_V4 z=6Sp8v4&f2h(tlM_M{pC?~KKej=`-zfmnX+uFMAD>?`nl3yeeVKzqJZldV5$?!O{O6 zH$Sk;2P*OlZ~y?Tb1(AzX52(1x@%`2{(&d~6XYxE)&T}nH>3AO#hpmXgL%qhq@qLK zt&e021UaPKA;_Y+E7!CInntzD8YjLYFUON`_#@;(Q8bJ}q)t6S^mWa(uE1De28(D& zuRL5Kyhui|984gD_xJOLMcUhwinJzmE6Y$l@d4XzQ(p0FvfG*jh z?E}5$f_+`o0}c-ZL-QVoYGUpk2QF*b%q$CYEhr0gPTT<1QHJL(_ zrz=@H#?wl26(~FS9ZFC9maT7rc4*#8HnV8=S&%8_u^pd1qvH+(!e$5Y zD(-HD-|>G?LDldIs*Gu~Y`lvn$bm(VW$*$`O&IxUHEwq+wxphc85qAa!Fa;Qb4G%Q z>|RvEl6R0%NLQ0<$UICRn*pEIQ^gM=-@`bR`n7uZtzY#io{()AeN;pSFkdGx#Yhkz zRB@l~@uhG1b;3E`GaH*!!Q@#D+L z9NF49wdehfd{;`_+i*oNK+NgPf<`vf#4)ls;Cu#kEB9~u$e^)DxEewYWo}4UV9^75 z->!x>asL4G`}H7q?)h$rz0%`z#~w7vS6S;p(%<`Y5wOWZ&ANbo+!TU4+v@~$Urd`r z{gtH?yrAf?d7qfd@@@X;eQ`;!n-6{eLtlA8DZ-7c6$tHJ1?)!*LBd*~5fJh-Qdq&= z8hB2j1>9_Rp*kv<3J5`lpr*c0HbJ7u$#k2opAf}o9GODW=!t&J^ zYiN9lHc`)}*QAiHo zadD)(i{jE@v=I7<) zmd!6@+I=|fqU4V_M6jQtZmbz}XJ84E@A&v!W!5g*K=>|Sl#h%QsILe3lHIvy{x%2r z^(>f%0t_&dd!-FS6^g8=3aO;;Vm{A{2vxlLk+%4mK~u(>K<$89;fhfnp!gQgOIGCO zRms(#HmpHhx{HK`V2d<&(qlV8Q>FUpEX5%w5fdJtl@Jl1Sh4d_`T3^CHa;h=m!&Rt z-0-f^OQaW1mhf3!{F4i?q!W25=TnAO#>WdWX9Fhmvqnl%SiLsbMgn*dPqz!nUz;Xg zZ*~LU_mP1LsIeIVRXVfwA%S1Ce^Kxmu^#CGG|RM;%5#w$g{auQe2b0q4iTUDD`T znIB4m{mZH7&!!czr*eMrN`p88c{MCodxB<8PxfV;vS7HxRiX{prp@L1upGgaKsqjw z33=&KMt$cYksk#GJu_+d&P`AWW7oIy zpZFzRVx^ndU#d*ikQ;sZj5BLU-sTZ`B6d%6k+8pZNf{d|w9cUc&3l9h^=6O?zBe2C zi;CKrn*z~!kV#K>+M-XvR1MF;Sf3_Gf*#YmK!<-*Bnj{;? zlUkgIN*zTIhD=iEFrQu^no=B>8#=yQiwj^p#C^|(h5mNNwZc~`?31MgWEt^q*)fP; zexoFzgY`j}HZMdB0$%i$uu&5C8M1r-(Vxa3b#Em-%w z@}$~?T;)?r;sN}#5Z>@eKg8!i$#N*?H7UjF7IdUQmgl>k{2i#?-!>U)DqRln59(~E z;0-QEeah{3M_z%UBTxc-+`RopH~&Q~#qcyreJhUMzn^hj%|-dlCRCOdJbF3qcO7`J znRb+j&+&7NZ_=!yA31H7wICg%@lNOXBUwprMuy{;{n(d0+nJ9wwE%kC2)Z z2bIe3Fg>@b5ygF(W2c)(k{Ze;B_q0V&-b;MN)5?QT=L$mOX1`~6z2s%~6OESkncb&W(9kv`i z@m{tVnUOYf6TT5`my5zQ3btG={L7-`=WY{=>@YTTUz(iJ^rtRh*=rjS9+(4)Fvwr4 zEF@|2RN6O~sNe8RQ46BwiZUkiz7(3{->6)`;}`p~E{HxhP_nLnpG}yhe?3VxJP~ov-k#=!S zsDFx^KgS&1#GWRQCWa9-2|Zg6;G0=Pq~euceQ;V5c3DQSf4;H>AKIx=4=9Xd7sk!E zt1jf9Mv|dAD6Bj zs-1o+vMD$~BxWgdPd2CFxHqXWF*iAmGrSt=_tL`gyJpZh<&&{3I$k)+wJ{Dx9%_u!Dt9}?;IcB-mg{)eRjf&wM@@_tv2C`uQ-H$y$(M9IBy9QngWk)-d%e-89?GXy2u4+@CnHSA<@y*u zy$zZM2b&v+AJAlP)TOcyAF*sTg+NSmuz9%1^(v9LROe1DE+kI*-_{AB;O8%hcp4S%Tcmf&bE+DIixn5E{(;gZxq zD&HL*mY>s!hXknCI=NIQAJJ0Cm58LB^K^;uPzku*P?2PS*7-`65!)(Qr#p47ISN#Lcxc1R$u%oq6-Z-wxIo>(cl1yV! zdawEY%|Bs!&Z14UTN`pnu}6xx66Dbl(WOH)cqc{S_jRoo-G4d#!Ng>ph0we_hC2+47!L{l zY?G*~Au~8inLDoJMmi_*)%;-^b;v?@?){e4GCXVw`Qf*(#8aa+xP9W5^BO`FIP8e2 z=$oF7`YPPMAi73JcXBM+2~)ba4j^+KZCg@`OP(QzO8{B_;Z2_v)vSmXaq1P4RF(=0 z&#F7aw8U$st75|fU(3=rx+GF1`o;(wa%=o6%KiL~nsfN_OPSOMn`$an{B^=qgqh{` zGra=e)KyYp?$gMKptH=Gv4$=g89=O^$j*NJ$9;+JAVZ88Uf}8iImq-m!W67!c6{DR zM=%hc(YTEDy(pPR6OFc~(n!pzrD+&)wyHuKp2K!?1zlcUe!|POf7#l12&jb(mbWFn z2leY>jh5EdVzFfei@uxKAeQ0AMN}-CUjMV`%G!N z3T|oIA^0w`*8uK}?r^!}&~^@%=Jh=9Ku5kMMJ|x3d*zG%L8Xp0XgF`^3@#Cc0pbG% zw@hfBkBXFofXa2A_gX=^mZe5==v93iKP0MhyAqdaIMOa=;1IJsDx|!O z(&?@P@3U*aUj}3b?8Aby=Z9Ax1>PwOL#2f7Xg%@nrfu3S3SG1#k%h3|G=SWL{L(0a zt+jb;h;mA#Wt9?QV|jhe_GFmQB$&n=&bR%lYzLPr0j$vkuJMl*+yKZd_rnTl3KAx( zTYT5J+CkyhDMcX$eX0<;(+XZy?B0?R{#P>pM0|h3{6`LXBkpvnDN;lG_mE~4{{Yss z3@C#y9Os8`zzVgfwUBQ^qf6oDwfxK#mSvf^=|URmw`Yc8;YJAOb3u{+4elVtkkImiEWF*GoK-Or<(__oZo~Y zDwp{b_AA0Q0&^d(4KkDzG(QgeU)oQ1PXIWbU&5~a#?TU64<9E{WN82U(fOmB4F37( z$@f99qYr&!lF^i6zU@QWS{Rt#ISy_>v#b|_j~W9IYwliXkO7W`#;8;nY~26~+}WQ9 zEWfeO4$bLf#z(ywS?0mTx}B3$@_YJI3*RxMaE8&nz%sNN1OD1>5s2a4eS!;mTxyTC zZs&Er0PJaGH`p{29?Zg>w=}KmYw)JNef7kxWw2bj1NCakWqVP|Tm9alE-%%ST4fI~ znQkf9vJZHP9`Ia&G}$VCbLwcF*@NOW;|6RRNlxce?pBi_gTNOsKoS0cAxU;}Lov;e z2hb_Kb3~X4Fkb7Ox^#7v_`G@Hm*RCAgLeY;`Tg@j%%-ZEw^S~9%!$5{*#)Y(F2i%^ zawNZOAL?@0+o`o5=Xha1JT&65_4?SEn_;X13y3FQ!X|jn^%K9N!EEsi(nWhTK)@D!WJ4_WM2{$-R$tLBn;&Xg#qMukf~^9l~rke;~|3<&Vc!Imzz2!E~S%n54HF zyv3CBjDEuh{?{o2kPLAs3%Jy{X#p&x99INQr3WJc17U zDGD4yL}MG6)diS$6|+CSz?PkBf2o=rZ(JX>SyRBlt-@s# z3WE*^v*eA@Oxs{6nw|4VGjOuAV}T4#^o#lTG>u}bFmTQ{@za@`18XstCf>46sb;X9 zHJTJ!?sgr?t=yLnR=;>vG^GT~=_{{HQ(gkAwjfB0zYh|eEcbLOS^27f|DpVVW`FDT zdJ5x2v2Sx%=U9CmCcn+mj+S=>gZ!j!$@BwXO2o4VNnK_(k{tvQ#6tVI)0SqCS>0c( zkiY)WNC`FK5(RH@<&SS&4PiOiM+0dND*%TEQsylE^f842C*H#r{3wX-!Y9lZG%Cwq z4>7pKEFg-Bx@j2B$53}Ml|CU7LyaRiwlna-UU#bdVm`ECPh*<9gtIS3Z6Z1?tBM_m zd_WB2LG+`;`pCzq8!=0B|4zGV@@O0`v;~rGE58h$5}#UAq$}|JT*Nd2NK{`D49g*=ADC3^M~ib}SdkM{}vW-i@%G$s?#zKQwU}1O~HZ+2C9} z^jsDzrSI?H*nJUuIsa+RkmHQ4;#q;Lw@d*}oc*uEETk^;tsPBU8>&6UKJiIKk&i!1XML>XQyfuNv4#KWcwb?CWD#)!LVd&=>=6 zc}VP+e&sZlyd|bh|0AAcpEBljcsdzA_!w>)thY2yi4V6_o>uPaLCjsJ+4?6FFRVqk-AV(c1a$heIXZ+9~OdsjU^cVXpfm7`Il3i*Sfn-;&wbp=Z)r%+t z%^Po?_5V@w{>ec3^{;|z@Q#}!X2CR$lljG4>Fah+`kwcdB|gEegrjvFL`K~1rR5~4 zkNikxPUrY6#Gr{vXbK(+Tiyo3L?3nd@aOxY>d)SYTuWU1a?RhFH;=KD4C_LC#;s^* z-SXYH7s97v@%MXE(Zm>H6B;l2JZU-M%S`LSR)}5jG$q|d7^R&k z%&BpcOXP4)&%dJlX;^DBf;=B5F$p_bfdqj+GZ$_T_BkG5;_q+%RhRh71QG-3^ma!r zwI<9FpI9JuYoDBYgovc?ctD+5m*0&3=Y+COJ}cKZM^BTbR>kPM zl-#gefEcSe1iF(lkNbb+=2T6VEcrA>ncRn6ftP*ms?Ox+UC`(0F&sBHjtrDZKH;6= zsd~$`v&grcfx69ZO@i)9?>Ugj(Dg5gTgq zvX1_m!^<3W#&0Y^G*J^N67Ym_ZV8z`rDn6pLI*_acTSE@EmCuTzU_2{oDf zX&VjhanT*%#Yrd%<%Szo5ymVM+Y&cHOj;|_Z7G%4l=s~0KH4ilwb*K}_Nj%7=-ZcBeI&c%(Bf=vRzw`{I&3o5X7^_203F&N|E=g;B#|>_;E7uRdX4vT?$j8!_JYUS zwGyM;YB!Vjw)0=?lF~(kqIH;0Q%w2qCH4wt6~0X<%Yv?zSw6Z7esH4RM7{QTGAobi{$Yn<8Nv z9cHp7%gV}9C;zR~*A>fw3(qsE^6@2O6YB|>w^(Z!h$D4+!zI=rnoFHY_2!L$(&1Z_ z6c~2Gq%*fJll{=*)=tz>;vnr*iQ#T)M(-~ySh$|J5$x9v`GLnAQ>&BC-#gdDviN;< zj{L5isMK(89^%jE@Ws0}9Xq#Go}+n8)3bEEkb`?rXPNN}jMCpZ$og$ON`Gh3C#YvH zZrSlnW-elUNgw090MlCQd5U7Hrj|5?S4!eL2Q^XA_gfVvnAax2`H=h0OkAAME_+h& zfiy>?q;U{gujZm|GQeC(KG}NZ?RwoDnL{umpwmdzbV12hl1v;S2$WJaWiu_&rT^N< z|NaRXmpW!RAM<54cgCb8#%pGkT5VW*elZ`wK@pSguY;^Fr$ z)c%YI->(s#L5c@PdY=)?c{#b-_gdtrgmvLkA_@l)v~ad=e*Nyz7V_`r2X9J@6*4e1 zgxZ~8*Wt)zGa1dYL<;)I6!9;Gz{T!{r>Ou^zpdrFHR zsCOYl!Xyp+CdZ3-jCIAm2c_SPQn$DuujVFRG5R1*^5rdrHLy4F9^)e&?!~O~tbS=f zYodV7czZ=|de!+9p4;uQ65RCji?Z;nFNbd>HoB$NXQcS?Iei$0b~x)(T6}^DDc*nY zNGyL8i8taU>=Il0>;#4dWY1V55xF=33nTreI#_e(~$DDl)J}-T3nU#C+pXZ?# zgSOFMmLpC>5TOtPYyn&NbM~OqpT=tWJ@;@Ma;~AWQ5YpX5S&?RiQ)^b+wM)rF!%6;WA=#rUKvJ;PX*~Z8#HMm14*N^n=Ee(tUUZ^8*eE9 zt4|err5X3CL|nr@%Z3-ei_Ot8%r~S2t>dmUiQnT#6tCdd&J(W!F@L*9Jge2|5~y%Z zOrzV&V(lDwv+yd~Ik93}Pdn?#;8hR>7L}^Zm9H6+;f<{#2pR+%2Hsj*rz`{0xiBCe zu`~GB|0*wfIm#5U**;l({|dHcszb;#R4YepJHrl)6NX3KnY0KhGs-4&`7;Pp2jt0T z>;hRcayVuCs4Kf4_#Jofr^>xJhs^l?T?;Qzqy000)=b@SmIsUe2@R}w<4`vEa0O0P z)1y^Vuaw}x@-hUaD7W%ljB$hfWP6e&z95hkL?Wo2_5GMIlkwU)+W&Fj%4Yhj`yFNx zEerEvE~(w{pN}vRPHxSXwSf(&PPG^NtMd;IDmA@-IVJO|<`zw* zc=K21%I_19hNE1ne&ruSx?lJc@-vJ9SqEPmVy-f6WL7&^p#C$|5%fdH&)hWHSvk4B z7J11Y3>hXs+w<0All|%yl(#+=I`>pSR0SAw=bJWBPp@VF=S}$Y;4Hs@5`aNJ85QQi zY<_zx>Dtd6Blv4w&Pw5?hPJC0Fa5Vf;O{SwCJG?? z38*na8tE;F6WxGON$sE1Vr=En1jZsT_}50Kfc7??-&ijGt{9@jN2tYb+@V_;xasiQ zW%C|Hi9$+FD{MfojG_lwd!n&uHe?kZvUn7)Y@GvYNgI^N;o(7<)PLMbjgCanJ_;kg z=(LR^F4H_hHe-BM6>Jn|-*WXLB(O>1*P%{Gk6~6_`?cuT#R-XtCt?EH{t=X0}U@icLUmun|5x_r6HiB-Iq~U52H79 zlC5^q4#>3q*Td&tP3J(iU+1Dl@tb?C>ulD}vaMOTv|y2o`GRM~a1x;a4DI z?gdVMn-}4}th?@QXM5tnmcPa7fD1r%vwH}r8rcs;q%pGNoVR@k*SFsdU?4=YEr4j@ z3|DrmtH~QQ+oiTFmZ8XuZMvBV%yVIHCLEGsbi4PMtS2JsUIx-xY{4xMKMR2HB46x_ zFHI|?wcaA(mzn`0aBAG_Fc?(KYMfYQs80M@p352S0b zl@?bn@|zcKAc+O`l9tBuE(mNJLU8f6!ck#_+J*$%8!21;hg%Sxnm2yj^rL-tqgz|Fe;(c$(9#=C2P{^SPkCEG5K zgJz*{Z2;IpIFdn=5V04k^A-9XAM_2ZffrlUv0sYerD}XcG+&+Dmm9pGRje!0qpr6* z`|e%Hzj}jOPOqZMwPoN2x9d9&*>~G&K!<>qMjk{Zxm9S%uGyGDbo@r2UZD#ck;gBl zgB<0U4Ism>Dku6jwRY2p5IFwTlbxUlYmq7ML8OWYq|e6%_XhTcbRu+v1keo^vA<&0SV44RS6Cfr zcF697u<}~Ff1dvv{;`pQwoh?s2=H~+2}f1M zQ2GI{LXa<=Reh`O5@rA~=)LM*PBacvdMkf&ci`w|`3KsoN_r=z4TyAIS0b=F`}L*fZ8+U$)`F5P`2zXcwQd>`Cr$ESQkFYms=#qJz-E!N>p@!Dmj- z&=97iufwuA=+28a20g?EJ~9;{DV6p|djdYt3a$+im(|p%CQUt`6=N5p!oL3%VDf9f zBPS#paq`5Xkyl)!C-UYiS`7txPl4q?cWZ(O-=1qWvks9u+FXSSHBRc^L~QGLn1Vw+ z=aFDLQUoHhW3&%OJ)hKz@2JK+b{FF9DkULk@y6m)UMNWuVljpK;wRYn~5SIq@8>`cwS;IiiEJ4(Fb|R>U^yhsQ!pBmr1DIE`nMn(dDv+pH_y7jGlr~z;_+>y z^P@WcFEkZ|H(RoC)~Ro14qt&af?#x5Bgwc1DDrm_P%-4?#rXS9*=+l9ezIo-f`~!i zsh+tdc{6uYCg)`M~t%JUJ#H{^! zV)|scg`~9|x10YI$8jbUwXwgCqLSb{WDo@C`T*xT`mqi2BxNLT~_Hj^dJtmnTSrr{B zk{$nepYbG`LUK^3m+Xti9?WL|{#ouMb>{BSa0mr5j@UQuXxx?a!w(Q7bHa5r-^&Nx z&XN_KWBz5tPuq!X%BB_RMOJy*LR+tJd+UeeO!y)GL0Il%=(iwA`o6k|Kg5Jot$GWRWgs zh*+ZtTVhP1(OB1a60N*(E)6B+vNo5L_fVKfwCU82JxzHtB*w;v#4-wX4JLW5eZG3# zOdtJ5^JT~*<(KGtus`f}Cv$ZZ5fBN)usb;#Um;?{6mQ(EYc~VlMUi`N?6Yh7*Egtr z4M;d*;L+I48G9x%!Xq_0&fL+FWD+1{J@l^7zzr8pkUGpmG`gbpLyY3AAw!%Ss`07t zfkB;Q$6@F08+Fzt)YewdPlcJ|4tH|)Sk0wCmBDifqw|)O%Ukj@*M)^;Cx_+B_YYBf zy3*{r+>zzRu?E*^B%8U#MAWc$$L^uiF6EIfqlxHeRoJ~gPQcq-=$i@?ALSx>nz3N& zBl=LRJ-RlJ0;8d%t&rVc<;00Qjvai#SB9@YE$iE$N}4PCU6GTqlb(BXjCSIdpoSP+ z7CwK5BDo*US6{pGZ;%*h@C}_&*5fM-}kF4=txwtb`z|7w2P>)*v*Fw?ly57oVac z+aNq77Blny&{9%}c*KU$vcZXPnfA2vl5`=5RH$l8~$fUpl5`H(#&Z3yC@Oue>1mdBa;h?Bbjn`r8zbi2qhCPt?YMor$gWO;(ugF}ha1F{ zPqVcg(0XBGUnfq(7ykZNd@rH~?|x4sJ%T2bVpx}A#*4+M>e!Y>P#Y_2D{v+^H4*bl zF@QE`Ty!qmGt->)Net8m2e5Q_%Kx)g4qt0;U^|BS~7!azWTFMF8wZs3HG+x0#` zXKVH@sT_G28!sX4FVmjuv`Bp}@D>+zCt$jnKgJQw?iyys3 z+6WTVR|ex3?^F1?4*8q59;yAA#6GF_|Ai?00vMhIBiMF;ky&)C<;TUM&{z!?K^I-F zIAfDaVIAvd9BJ%6`@0VY5Px<$q|8ozfHq91zwgLtyWoh8i>{fJUDDWbr2Pu4$=D2O z`2P6%L3_(;p@`|?XNkLZHRO0+>SPiU$=4}Rbzau^lG|S|rju^;Q1;U{NO3Gb@nJUM z2D$O}9*y4|X0t^Oy;dXv6{(!aK*E<`_Xvgon24SEV#kvuliVa0HYLnqdyE2uc@VKN z_|mC#x`2RKr&4B+(!CY-FgBV+w5xV_V@<|qyl?kp z8(=mcGN~}7NDl_?1e5+3r~$SrI%tJ5S7^}HpbCxTv}#mr zX-=oc5GKu^{ZN5~7u8<_pqonAfH*T#Qq|YK{&*BlzVC>Fl1>1<$nv4nWLf%(qY;6l z_;(NK?T}CrgBB8ceIq2ibD_1ao}|LAEJ2CgNB&@t^seF(8b;VHUD~xa)G@}9a(N$| zG`{6_=99{Qe2t7$c`-)D=czR&l=G_f)l5+lGut^89dE_FEpsvOCkOrN^u z(W?7xK(Nrvz9i?|JasSaU%eKBpnxzIxp3+aj4)b@rESltVlTh>DB6^uNW-Ta!M&fh zN$H&fl=sKeuA`I|9<9<@6J5ftqu4I!5JumL@Mh4Uee>N3)$Q+w#HS(7a4U?wnON68 zY6a8=l?#GeOLTy-i^Xg06Y+{4<6rIF6ZB3zVb~uWwgsfw@4WeN&{;An2=<;Q4CpR*w6bKO@b%b~2v z{eElw8Rj7Ivt)!3-!OrZrm^^z_{R8A`eq~>q|~WqEaZQKM-xAvO|3-8i2m6Xt}l)Y z_4tr>V~>c*9nokwf+b6f&n-kBKbE_S*fpeoHFTvTzKgZ>%mB70?IlX_DfG1WHUM7? z#1d(-#xrRTO*p=>=W;PGU{A(8AGu5A&8YDPM5@As9Da5CA|fyA5Z@h>N}Qq$B7T`@ z8whQpo(2AF5D955`vd$4drr-oJFp5)b{tKs1F$mXljrd-sN4jBw9)xs`eFt?4+Pch zucPUoDx6o5jCnS(s`s&dX>~wbC}3x6F6W@Ux}ucLG1bi&z6^xnxR)J|b>d^7eV%fMgV&JHTN` z>V_2etyyD70&X7J!v${q*p>DY3m@&=$1nZb65ojJUd9@D~1Ky zRvC>514v#t%=Y)mvvEaTj2Em628Y~s^XNRb%1IJ1Q#LjXYZU7uu}L(qM+i837fxK& za(;0#Q|e!c6au?}F)eIQBfvniz^}s~-#mv|qlud^O;f4fzjAEtSo=)0mR>GZI#k2Q z#P6kpCDmhaVNEHtN4U(5lHRcJx~{aC#y;9*Fyu1Z#UvjuUp>98gLBrl`3(U3`Ef*C z@No?y$F5&7+*JUT>Zp!w&pFKbT;)pb`;EA=@BmT(bnlTBr%!-3U1#8cTPA{?3tlAH z;<4pKhasHppVpZbiowTG&E<65hPm57Kxx*Mu>GiO@V{OZc|ZBfYr+~fIy6+#uOf~U zrn!{bPv6*SO?sG(f{0geYF* zCHW0q{e`@H*ZzW)d3ACs`@KMpqNuOQ?iI>!_z8x*4-x8vMYXbTG{TJIbY}bZ6p(hG zN_lz%Q)oggfi6;(<%BU$d-Uo&F}YtQP_r$Gu5jn&=$&jCi*SxHW4LGepKAsSPmchH zfP1zEmgt-{>U#pGOl3&~L$|^J#lGkTgw9)hG>?(``n3q@T-N+`(Uh=nOYYxnE#2X zi=kyciAtPREDqNBKOuQJGCZ~pu@Xi$jExTxg_r+0Nn4pwpq8CMC~pundMAr1{{Qp& z}cM!6M+o1bP zVky@={fln7d);-7xxb60!DhQ{BBrEa@V0QQehjV!M~$oAW<7a3+#fIfmBo|FbN&2A zgY@oY+l*+v6S36F0k^Ol3fu{8mi6nx`6V+wllXF}Ez!x+`HhvKuc95+uiZPuQl`gU z-DI@Qd3joJ4RcBoYg-*TZX{99XWfTUas!a_4EJb|ELm*0d^sw zu2OG(Jw1j5XCaM$|1KeM8ZXr;bcOTsi!&l3EwBlvNmJZ zg0cT&<-t!#O;Awq*|TTt$Ma31etp4v_q|HI6QiTQx>tV(f3^S5y2tWeUnTMa0@#bE z*8RV}-DnDxsN-BB9*=}_;p{&@S(un z_Z1ktT!48U>!Cx3%1yNn?)z=w35msN;KoZ4w^s)HSq`w2n$0o@Vf%RqDh6*b18W5B zjw#H$kPz$M)`WmxXZQELOJ(nUiEsm`p5>p%H#RmjQbfiTeqLU*B@tMaEWN+)29Xg< zp!hB*R5}0OJEss?0GPx!0Z+{gY>f>hPF?%s0CGh1e1=hFWk9*Q84eQ#4mmdS^xuzA ztB2N-@%S;Nfxz)#-k{ds-#^CFF!Ss7S!cVuyX`!0Jr0O8d${7L&p)5JpNB%B;QO

m)b#5AE=`MMVx8d}o6G^Zmck!S|mZc-ukI*wWmL2Ql9_W{TOLCy%C5@&kdm%DNuJ9f;lbmHws?sUo4%=o7MbVrKx$kxEq zm7($em{qf8l9gK_W;bpWy){c7Fl)0LdO6EJ0Jly!ObzwHlKzyXrRCzeFL7eOZ_X$h zMKSb9vCY$&k%|$DgRRoLD+-gD-d;=xi?>v78Z*y%l=5upwkYv zp)_RZ!GIy)t@z1~6sBsELm`D(MP>(Dtva&?vSlxcS++1=d^HPe9M(T0L@81%+(Wn{ z&@gN1ZZ$0A@`y}4+iXyLwXi9Bpu*Gh*6rKhJ5zKGEIkT%hPqvD47^|M>ycdE8NQe- zx%mCK-d3E|%O%5)J!W7sG~DC2F?8nc8VAM5ijIm(kVRh}NAz2Ev;XdFv82x!!$KKE z)KwK-7Di=DY{nnF4ZOII*p)V=^m`|tR_A9YEC2DU-G*dSR}If&9IvD?F~dgayqA$) z&Ucgc`2#=^XVKicu2y0ddB^X?hqe2zbL!`Atx$aT(e`=Anl_ZeT!{?-?vOeD^F|prTNC@gPulDF_SeqY_&=0xqqrLV* z<)N~ta6z_nNAa8dlWFsshnxxzRWKawk73wOc*og$b~4Fksg$#?XJ5sgJVU)1lSodr z2-pT!KM%|H+;Utg8i*Mw>>VWd^tpeo*}@>&l10Qlj)DG0Hasc<^R7bgXJ%$rEf4jq z6k8>Xyz59z>3`sC#UgZiF!R-`viXBO)nzY=2?&UYl(4c|f~$5z<{qV6ZAC?9ESc%) z3le90AO7c&F4sbT^(u=ENilwoHhO6EqL?ABFST?;fJV`Md;P<7lR@G4{hLWcM-{*B zzkfZU-`dzXRnlX-xTZ&D{ZY%%WH!F=>U6&yxu*5{!j~m@4OVDtmWrI75gTYY!~c1F z&Y{!8z`*kDodd6}JmKm(XdVk1c}Y6c)xn2X`|@Ku)4xQ+)as~xL(Thuv9-Zq)+rjc zrtiBWF0vvygYQ*~t*x|*Pv_2F>67hPc@UNTN%(8)vX2juz?bX?jSlXmAu*0u;|I3v z^-D@hmbN#R52qIF?{>u-~aiSxku3G z(624+&wg#qzn3C#nxu_l2mbuD{}c+ilM5^|#KwweGP2$hz&}dz>ey^KBcJ~V>mQE% literal 0 HcmV?d00001 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 71a4aa09841ebe..65fb07f88fad9d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -180,11 +180,17 @@ You can set the `DEBUG` environment variable to turn on debugging logs. E.g. `DE ### Issue Triaging Workflow -![issue-workflow](./.github/issue-workflow.png) + + + + ### Pull Request Review Workflow -![issue-workflow](./.github/pr-workflow.png) + + + + ## Notes on Dependencies From 1566f6141a75cdbd6f33b0cc999611314e5af8ec Mon Sep 17 00:00:00 2001 From: patak Date: Sun, 26 Jun 2022 15:41:20 +0200 Subject: [PATCH 24/75] perf: avoid sourcemap chains during dev (#8796) Co-authored-by: yoho --- .../__snapshots__/fixture.test.ts.snap | 184 ++--------- .../src/node/plugins/assetImportMetaUrl.ts | 4 +- packages/vite/src/node/plugins/define.ts | 8 +- .../src/node/plugins/dynamicImportVars.ts | 4 +- .../vite/src/node/plugins/importAnalysis.ts | 4 +- .../vite/src/node/plugins/importMetaGlob.ts | 8 +- .../src/node/plugins/workerImportMetaUrl.ts | 4 +- packages/vite/src/node/utils.ts | 13 +- .../__snapshots__/serve.spec.ts.snap | 312 +++++++++++++++++- .../vue-sourcemap/__tests__/serve.spec.ts | 309 +---------------- .../sourcemap-worker.spec.ts.snap | 14 - .../sourcemap/sourcemap-worker.spec.ts | 19 +- 12 files changed, 378 insertions(+), 505 deletions(-) delete mode 100644 playground/worker/__tests__/sourcemap/__snapshots__/sourcemap-worker.spec.ts.snap diff --git a/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.test.ts.snap b/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.test.ts.snap index 4dc2f50a8f881d..3efbb7a0306f86 100644 --- a/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.test.ts.snap +++ b/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.test.ts.snap @@ -1,164 +1,44 @@ // Vitest Snapshot v1 exports[`fixture > transform 1`] = ` -"import * as __vite_glob_1_0 from \\"./modules/a.ts\\" -import * as __vite_glob_1_1 from \\"./modules/b.ts\\" -import * as __vite_glob_1_2 from \\"./modules/index.ts\\" -import { name as __vite_glob_3_0 } from \\"./modules/a.ts\\" -import { name as __vite_glob_3_1 } from \\"./modules/b.ts\\" -import { name as __vite_glob_3_2 } from \\"./modules/index.ts\\" -import { default as __vite_glob_5_0 } from \\"./modules/a.ts?raw\\" -import { default as __vite_glob_5_1 } from \\"./modules/b.ts?raw\\" -import \\"../../../../../../types/importMeta\\"; -export const basic = Object.assign({ -\\"./modules/a.ts\\": () => import(\\"./modules/a.ts\\"), -\\"./modules/b.ts\\": () => import(\\"./modules/b.ts\\"), -\\"./modules/index.ts\\": () => import(\\"./modules/index.ts\\") -}); -export const basicEager = Object.assign({ -\\"./modules/a.ts\\": __vite_glob_1_0, -\\"./modules/b.ts\\": __vite_glob_1_1, -\\"./modules/index.ts\\": __vite_glob_1_2 -}); -export const ignore = Object.assign({ -\\"./modules/a.ts\\": () => import(\\"./modules/a.ts\\"), -\\"./modules/b.ts\\": () => import(\\"./modules/b.ts\\") -}); -export const namedEager = Object.assign({ -\\"./modules/a.ts\\": __vite_glob_3_0, -\\"./modules/b.ts\\": __vite_glob_3_1, -\\"./modules/index.ts\\": __vite_glob_3_2 -}); -export const namedDefault = Object.assign({ -\\"./modules/a.ts\\": () => import(\\"./modules/a.ts\\").then(m => m[\\"default\\"]), -\\"./modules/b.ts\\": () => import(\\"./modules/b.ts\\").then(m => m[\\"default\\"]), -\\"./modules/index.ts\\": () => import(\\"./modules/index.ts\\").then(m => m[\\"default\\"]) -}); -export const eagerAs = Object.assign({ -\\"./modules/a.ts\\": __vite_glob_5_0, -\\"./modules/b.ts\\": __vite_glob_5_1 -}); -export const rawImportModule = Object.assign({ -\\"./modules/a.ts\\": () => import(\\"./modules/a.ts?raw\\"), -\\"./modules/b.ts\\": () => import(\\"./modules/b.ts?raw\\") -}); -export const excludeSelf = Object.assign({ -\\"./sibling.ts\\": () => import(\\"./sibling.ts\\") -}); -export const customQueryString = Object.assign({ -\\"./sibling.ts\\": () => import(\\"./sibling.ts?custom\\") -}); -export const customQueryObject = Object.assign({ -\\"./sibling.ts\\": () => import(\\"./sibling.ts?foo=bar&raw=true\\") -}); -export const parent = Object.assign({ - -}); -export const rootMixedRelative = Object.assign({ -\\"/css.spec.ts\\": () => import(\\"../../css.spec.ts?url\\").then(m => m[\\"default\\"]), -\\"/define.spec.ts\\": () => import(\\"../../define.spec.ts?url\\").then(m => m[\\"default\\"]), -\\"/esbuild.spec.ts\\": () => import(\\"../../esbuild.spec.ts?url\\").then(m => m[\\"default\\"]), -\\"/import.spec.ts\\": () => import(\\"../../import.spec.ts?url\\").then(m => m[\\"default\\"]), -\\"/importGlob/fixture-b/a.ts\\": () => import(\\"../fixture-b/a.ts?url\\").then(m => m[\\"default\\"]), -\\"/importGlob/fixture-b/b.ts\\": () => import(\\"../fixture-b/b.ts?url\\").then(m => m[\\"default\\"]), -\\"/importGlob/fixture-b/index.ts\\": () => import(\\"../fixture-b/index.ts?url\\").then(m => m[\\"default\\"]) -}); -export const cleverCwd1 = Object.assign({ -\\"./node_modules/framework/pages/hello.page.js\\": () => import(\\"./node_modules/framework/pages/hello.page.js\\") -}); -export const cleverCwd2 = Object.assign({ -\\"./modules/a.ts\\": () => import(\\"./modules/a.ts\\"), -\\"./modules/b.ts\\": () => import(\\"./modules/b.ts\\"), -\\"../fixture-b/a.ts\\": () => import(\\"../fixture-b/a.ts\\"), -\\"../fixture-b/b.ts\\": () => import(\\"../fixture-b/b.ts\\") -}); +"import * as __vite_glob_1_0 from \\"./modules/a.ts\\";import * as __vite_glob_1_1 from \\"./modules/b.ts\\";import * as __vite_glob_1_2 from \\"./modules/index.ts\\";import { name as __vite_glob_3_0 } from \\"./modules/a.ts\\";import { name as __vite_glob_3_1 } from \\"./modules/b.ts\\";import { name as __vite_glob_3_2 } from \\"./modules/index.ts\\";import { default as __vite_glob_5_0 } from \\"./modules/a.ts?raw\\";import { default as __vite_glob_5_1 } from \\"./modules/b.ts?raw\\";import \\"../../../../../../types/importMeta\\"; +export const basic = Object.assign({\\"./modules/a.ts\\": () => import(\\"./modules/a.ts\\"),\\"./modules/b.ts\\": () => import(\\"./modules/b.ts\\"),\\"./modules/index.ts\\": () => import(\\"./modules/index.ts\\")}); +export const basicEager = Object.assign({\\"./modules/a.ts\\": __vite_glob_1_0,\\"./modules/b.ts\\": __vite_glob_1_1,\\"./modules/index.ts\\": __vite_glob_1_2}); +export const ignore = Object.assign({\\"./modules/a.ts\\": () => import(\\"./modules/a.ts\\"),\\"./modules/b.ts\\": () => import(\\"./modules/b.ts\\")}); +export const namedEager = Object.assign({\\"./modules/a.ts\\": __vite_glob_3_0,\\"./modules/b.ts\\": __vite_glob_3_1,\\"./modules/index.ts\\": __vite_glob_3_2}); +export const namedDefault = Object.assign({\\"./modules/a.ts\\": () => import(\\"./modules/a.ts\\").then(m => m[\\"default\\"]),\\"./modules/b.ts\\": () => import(\\"./modules/b.ts\\").then(m => m[\\"default\\"]),\\"./modules/index.ts\\": () => import(\\"./modules/index.ts\\").then(m => m[\\"default\\"])}); +export const eagerAs = Object.assign({\\"./modules/a.ts\\": __vite_glob_5_0,\\"./modules/b.ts\\": __vite_glob_5_1}); +export const rawImportModule = Object.assign({\\"./modules/a.ts\\": () => import(\\"./modules/a.ts?raw\\"),\\"./modules/b.ts\\": () => import(\\"./modules/b.ts?raw\\")}); +export const excludeSelf = Object.assign({\\"./sibling.ts\\": () => import(\\"./sibling.ts\\")}); +export const customQueryString = Object.assign({\\"./sibling.ts\\": () => import(\\"./sibling.ts?custom\\")}); +export const customQueryObject = Object.assign({\\"./sibling.ts\\": () => import(\\"./sibling.ts?foo=bar&raw=true\\")}); +export const parent = Object.assign({}); +export const rootMixedRelative = Object.assign({\\"/css.spec.ts\\": () => import(\\"../../css.spec.ts?url\\").then(m => m[\\"default\\"]),\\"/define.spec.ts\\": () => import(\\"../../define.spec.ts?url\\").then(m => m[\\"default\\"]),\\"/esbuild.spec.ts\\": () => import(\\"../../esbuild.spec.ts?url\\").then(m => m[\\"default\\"]),\\"/import.spec.ts\\": () => import(\\"../../import.spec.ts?url\\").then(m => m[\\"default\\"]),\\"/importGlob/fixture-b/a.ts\\": () => import(\\"../fixture-b/a.ts?url\\").then(m => m[\\"default\\"]),\\"/importGlob/fixture-b/b.ts\\": () => import(\\"../fixture-b/b.ts?url\\").then(m => m[\\"default\\"]),\\"/importGlob/fixture-b/index.ts\\": () => import(\\"../fixture-b/index.ts?url\\").then(m => m[\\"default\\"])}); +export const cleverCwd1 = Object.assign({\\"./node_modules/framework/pages/hello.page.js\\": () => import(\\"./node_modules/framework/pages/hello.page.js\\")}); +export const cleverCwd2 = Object.assign({\\"./modules/a.ts\\": () => import(\\"./modules/a.ts\\"),\\"./modules/b.ts\\": () => import(\\"./modules/b.ts\\"),\\"../fixture-b/a.ts\\": () => import(\\"../fixture-b/a.ts\\"),\\"../fixture-b/b.ts\\": () => import(\\"../fixture-b/b.ts\\")}); " `; exports[`fixture > transform with restoreQueryExtension 1`] = ` -"import * as __vite_glob_1_0 from \\"./modules/a.ts\\" -import * as __vite_glob_1_1 from \\"./modules/b.ts\\" -import * as __vite_glob_1_2 from \\"./modules/index.ts\\" -import { name as __vite_glob_3_0 } from \\"./modules/a.ts\\" -import { name as __vite_glob_3_1 } from \\"./modules/b.ts\\" -import { name as __vite_glob_3_2 } from \\"./modules/index.ts\\" -import { default as __vite_glob_5_0 } from \\"./modules/a.ts?raw\\" -import { default as __vite_glob_5_1 } from \\"./modules/b.ts?raw\\" -import \\"../../../../../../types/importMeta\\"; -export const basic = Object.assign({ -\\"./modules/a.ts\\": () => import(\\"./modules/a.ts\\"), -\\"./modules/b.ts\\": () => import(\\"./modules/b.ts\\"), -\\"./modules/index.ts\\": () => import(\\"./modules/index.ts\\") -}); -export const basicEager = Object.assign({ -\\"./modules/a.ts\\": __vite_glob_1_0, -\\"./modules/b.ts\\": __vite_glob_1_1, -\\"./modules/index.ts\\": __vite_glob_1_2 -}); -export const ignore = Object.assign({ -\\"./modules/a.ts\\": () => import(\\"./modules/a.ts\\"), -\\"./modules/b.ts\\": () => import(\\"./modules/b.ts\\") -}); -export const namedEager = Object.assign({ -\\"./modules/a.ts\\": __vite_glob_3_0, -\\"./modules/b.ts\\": __vite_glob_3_1, -\\"./modules/index.ts\\": __vite_glob_3_2 -}); -export const namedDefault = Object.assign({ -\\"./modules/a.ts\\": () => import(\\"./modules/a.ts\\").then(m => m[\\"default\\"]), -\\"./modules/b.ts\\": () => import(\\"./modules/b.ts\\").then(m => m[\\"default\\"]), -\\"./modules/index.ts\\": () => import(\\"./modules/index.ts\\").then(m => m[\\"default\\"]) -}); -export const eagerAs = Object.assign({ -\\"./modules/a.ts\\": __vite_glob_5_0, -\\"./modules/b.ts\\": __vite_glob_5_1 -}); -export const rawImportModule = Object.assign({ -\\"./modules/a.ts\\": () => import(\\"./modules/a.ts?raw\\"), -\\"./modules/b.ts\\": () => import(\\"./modules/b.ts?raw\\") -}); -export const excludeSelf = Object.assign({ -\\"./sibling.ts\\": () => import(\\"./sibling.ts\\") -}); -export const customQueryString = Object.assign({ -\\"./sibling.ts\\": () => import(\\"./sibling.ts?custom&lang.ts\\") -}); -export const customQueryObject = Object.assign({ -\\"./sibling.ts\\": () => import(\\"./sibling.ts?foo=bar&raw=true&lang.ts\\") -}); -export const parent = Object.assign({ - -}); -export const rootMixedRelative = Object.assign({ -\\"/css.spec.ts\\": () => import(\\"../../css.spec.ts?url&lang.ts\\").then(m => m[\\"default\\"]), -\\"/define.spec.ts\\": () => import(\\"../../define.spec.ts?url&lang.ts\\").then(m => m[\\"default\\"]), -\\"/esbuild.spec.ts\\": () => import(\\"../../esbuild.spec.ts?url&lang.ts\\").then(m => m[\\"default\\"]), -\\"/import.spec.ts\\": () => import(\\"../../import.spec.ts?url&lang.ts\\").then(m => m[\\"default\\"]), -\\"/importGlob/fixture-b/a.ts\\": () => import(\\"../fixture-b/a.ts?url&lang.ts\\").then(m => m[\\"default\\"]), -\\"/importGlob/fixture-b/b.ts\\": () => import(\\"../fixture-b/b.ts?url&lang.ts\\").then(m => m[\\"default\\"]), -\\"/importGlob/fixture-b/index.ts\\": () => import(\\"../fixture-b/index.ts?url&lang.ts\\").then(m => m[\\"default\\"]) -}); -export const cleverCwd1 = Object.assign({ -\\"./node_modules/framework/pages/hello.page.js\\": () => import(\\"./node_modules/framework/pages/hello.page.js\\") -}); -export const cleverCwd2 = Object.assign({ -\\"./modules/a.ts\\": () => import(\\"./modules/a.ts\\"), -\\"./modules/b.ts\\": () => import(\\"./modules/b.ts\\"), -\\"../fixture-b/a.ts\\": () => import(\\"../fixture-b/a.ts\\"), -\\"../fixture-b/b.ts\\": () => import(\\"../fixture-b/b.ts\\") -}); +"import * as __vite_glob_1_0 from \\"./modules/a.ts\\";import * as __vite_glob_1_1 from \\"./modules/b.ts\\";import * as __vite_glob_1_2 from \\"./modules/index.ts\\";import { name as __vite_glob_3_0 } from \\"./modules/a.ts\\";import { name as __vite_glob_3_1 } from \\"./modules/b.ts\\";import { name as __vite_glob_3_2 } from \\"./modules/index.ts\\";import { default as __vite_glob_5_0 } from \\"./modules/a.ts?raw\\";import { default as __vite_glob_5_1 } from \\"./modules/b.ts?raw\\";import \\"../../../../../../types/importMeta\\"; +export const basic = Object.assign({\\"./modules/a.ts\\": () => import(\\"./modules/a.ts\\"),\\"./modules/b.ts\\": () => import(\\"./modules/b.ts\\"),\\"./modules/index.ts\\": () => import(\\"./modules/index.ts\\")}); +export const basicEager = Object.assign({\\"./modules/a.ts\\": __vite_glob_1_0,\\"./modules/b.ts\\": __vite_glob_1_1,\\"./modules/index.ts\\": __vite_glob_1_2}); +export const ignore = Object.assign({\\"./modules/a.ts\\": () => import(\\"./modules/a.ts\\"),\\"./modules/b.ts\\": () => import(\\"./modules/b.ts\\")}); +export const namedEager = Object.assign({\\"./modules/a.ts\\": __vite_glob_3_0,\\"./modules/b.ts\\": __vite_glob_3_1,\\"./modules/index.ts\\": __vite_glob_3_2}); +export const namedDefault = Object.assign({\\"./modules/a.ts\\": () => import(\\"./modules/a.ts\\").then(m => m[\\"default\\"]),\\"./modules/b.ts\\": () => import(\\"./modules/b.ts\\").then(m => m[\\"default\\"]),\\"./modules/index.ts\\": () => import(\\"./modules/index.ts\\").then(m => m[\\"default\\"])}); +export const eagerAs = Object.assign({\\"./modules/a.ts\\": __vite_glob_5_0,\\"./modules/b.ts\\": __vite_glob_5_1}); +export const rawImportModule = Object.assign({\\"./modules/a.ts\\": () => import(\\"./modules/a.ts?raw\\"),\\"./modules/b.ts\\": () => import(\\"./modules/b.ts?raw\\")}); +export const excludeSelf = Object.assign({\\"./sibling.ts\\": () => import(\\"./sibling.ts\\")}); +export const customQueryString = Object.assign({\\"./sibling.ts\\": () => import(\\"./sibling.ts?custom&lang.ts\\")}); +export const customQueryObject = Object.assign({\\"./sibling.ts\\": () => import(\\"./sibling.ts?foo=bar&raw=true&lang.ts\\")}); +export const parent = Object.assign({}); +export const rootMixedRelative = Object.assign({\\"/css.spec.ts\\": () => import(\\"../../css.spec.ts?url&lang.ts\\").then(m => m[\\"default\\"]),\\"/define.spec.ts\\": () => import(\\"../../define.spec.ts?url&lang.ts\\").then(m => m[\\"default\\"]),\\"/esbuild.spec.ts\\": () => import(\\"../../esbuild.spec.ts?url&lang.ts\\").then(m => m[\\"default\\"]),\\"/import.spec.ts\\": () => import(\\"../../import.spec.ts?url&lang.ts\\").then(m => m[\\"default\\"]),\\"/importGlob/fixture-b/a.ts\\": () => import(\\"../fixture-b/a.ts?url&lang.ts\\").then(m => m[\\"default\\"]),\\"/importGlob/fixture-b/b.ts\\": () => import(\\"../fixture-b/b.ts?url&lang.ts\\").then(m => m[\\"default\\"]),\\"/importGlob/fixture-b/index.ts\\": () => import(\\"../fixture-b/index.ts?url&lang.ts\\").then(m => m[\\"default\\"])}); +export const cleverCwd1 = Object.assign({\\"./node_modules/framework/pages/hello.page.js\\": () => import(\\"./node_modules/framework/pages/hello.page.js\\")}); +export const cleverCwd2 = Object.assign({\\"./modules/a.ts\\": () => import(\\"./modules/a.ts\\"),\\"./modules/b.ts\\": () => import(\\"./modules/b.ts\\"),\\"../fixture-b/a.ts\\": () => import(\\"../fixture-b/a.ts\\"),\\"../fixture-b/b.ts\\": () => import(\\"../fixture-b/b.ts\\")}); " `; exports[`fixture > virtual modules 1`] = ` -"Object.assign({ -\\"/modules/a.ts\\": () => import(\\"/modules/a.ts\\"), -\\"/modules/b.ts\\": () => import(\\"/modules/b.ts\\"), -\\"/modules/index.ts\\": () => import(\\"/modules/index.ts\\") -}) -Object.assign({ -\\"/../fixture-b/a.ts\\": () => import(\\"/../fixture-b/a.ts\\"), -\\"/../fixture-b/b.ts\\": () => import(\\"/../fixture-b/b.ts\\"), -\\"/../fixture-b/index.ts\\": () => import(\\"/../fixture-b/index.ts\\") -})" +"Object.assign({\\"/modules/a.ts\\": () => import(\\"/modules/a.ts\\"),\\"/modules/b.ts\\": () => import(\\"/modules/b.ts\\"),\\"/modules/index.ts\\": () => import(\\"/modules/index.ts\\")}) +Object.assign({\\"/../fixture-b/a.ts\\": () => import(\\"/../fixture-b/a.ts\\"),\\"/../fixture-b/b.ts\\": () => import(\\"/../fixture-b/b.ts\\"),\\"/../fixture-b/index.ts\\": () => import(\\"/../fixture-b/index.ts\\")})" `; diff --git a/packages/vite/src/node/plugins/assetImportMetaUrl.ts b/packages/vite/src/node/plugins/assetImportMetaUrl.ts index af3fa325bfce03..6d7a657706cf9c 100644 --- a/packages/vite/src/node/plugins/assetImportMetaUrl.ts +++ b/packages/vite/src/node/plugins/assetImportMetaUrl.ts @@ -3,7 +3,7 @@ import MagicString from 'magic-string' import { stripLiteral } from 'strip-literal' import type { Plugin } from '../plugin' import type { ResolvedConfig } from '../config' -import { transformResult } from '../utils' +import { transformStableResult } from '../utils' import { fileToUrl } from './asset' import { preloadHelperId } from './importAnalysisBuild' @@ -81,7 +81,7 @@ export function assetImportMetaUrlPlugin(config: ResolvedConfig): Plugin { ) } if (s) { - return transformResult(s, id, config) + return transformStableResult(s, id, config) } } return null diff --git a/packages/vite/src/node/plugins/define.ts b/packages/vite/src/node/plugins/define.ts index 9859676e693a23..1baff98c9b5ad0 100644 --- a/packages/vite/src/node/plugins/define.ts +++ b/packages/vite/src/node/plugins/define.ts @@ -1,7 +1,7 @@ import MagicString from 'magic-string' -import type { TransformResult } from 'rollup' import type { ResolvedConfig } from '../config' import type { Plugin } from '../plugin' +import { transformStableResult } from '../utils' import { isCSSRequest } from './css' import { isHTMLRequest } from './html' @@ -144,11 +144,7 @@ export function definePlugin(config: ResolvedConfig): Plugin { return null } - const result: TransformResult = { code: s.toString() } - if (config.build.sourcemap) { - result.map = s.generateMap({ hires: true }) - } - return result + return transformStableResult(s, id, config) } } } diff --git a/packages/vite/src/node/plugins/dynamicImportVars.ts b/packages/vite/src/node/plugins/dynamicImportVars.ts index 7093ded9253a39..97f605c1758d53 100644 --- a/packages/vite/src/node/plugins/dynamicImportVars.ts +++ b/packages/vite/src/node/plugins/dynamicImportVars.ts @@ -11,7 +11,7 @@ import { normalizePath, parseRequest, requestQuerySplitRE, - transformResult + transformStableResult } from '../utils' export const dynamicImportHelperId = '/@vite/dynamic-import-helper' @@ -209,7 +209,7 @@ export function dynamicImportVarsPlugin(config: ResolvedConfig): Plugin { `import __variableDynamicImportRuntimeHelper from "${dynamicImportHelperId}";` ) } - return transformResult(s, importer, config) + return transformStableResult(s, importer, config) } } } diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index c7b4d5c8bb3f1b..9a39c792388400 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -40,7 +40,7 @@ import { removeImportQuery, stripBomTag, timeFrom, - transformResult, + transformStableResult, unwrapId } from '../utils' import type { ResolvedConfig } from '../config' @@ -711,7 +711,7 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { } if (s) { - return transformResult(s, importer, config) + return transformStableResult(s, importer, config) } else { return source } diff --git a/packages/vite/src/node/plugins/importMetaGlob.ts b/packages/vite/src/node/plugins/importMetaGlob.ts index 661093676626e6..7f3695178fdce9 100644 --- a/packages/vite/src/node/plugins/importMetaGlob.ts +++ b/packages/vite/src/node/plugins/importMetaGlob.ts @@ -17,7 +17,7 @@ import type { Plugin } from '../plugin' import type { ViteDevServer } from '../server' import type { ModuleNode } from '../server/moduleGraph' import type { ResolvedConfig } from '../config' -import { normalizePath, slash, transformResult } from '../utils' +import { normalizePath, slash, transformStableResult } from '../utils' const { isMatch, scan } = micromatch @@ -75,7 +75,7 @@ export function importGlobPlugin(config: ResolvedConfig): Plugin { server!.watcher.add(dirname(file)) }) } - return transformResult(result.s, id, config) + return transformStableResult(result.s, id, config) } } } @@ -426,7 +426,7 @@ export async function transformGlobImport( files.forEach((i) => matchedFiles.add(i)) - const replacement = `Object.assign({\n${objectProps.join(',\n')}\n})` + const replacement = `Object.assign({${objectProps.join(',')}})` s.overwrite(start, end, replacement) return staticImports @@ -435,7 +435,7 @@ export async function transformGlobImport( ) ).flat() - if (staticImports.length) s.prepend(`${staticImports.join('\n')}\n`) + if (staticImports.length) s.prepend(`${staticImports.join(';')};`) return { s, diff --git a/packages/vite/src/node/plugins/workerImportMetaUrl.ts b/packages/vite/src/node/plugins/workerImportMetaUrl.ts index c88046465f0f42..1b05e6d4a137e1 100644 --- a/packages/vite/src/node/plugins/workerImportMetaUrl.ts +++ b/packages/vite/src/node/plugins/workerImportMetaUrl.ts @@ -10,7 +10,7 @@ import { injectQuery, normalizePath, parseRequest, - transformResult + transformStableResult } from '../utils' import { getDepsOptimizer } from '../optimizer' import type { WorkerType } from './worker' @@ -136,7 +136,7 @@ export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin { } if (s) { - return transformResult(s, id, config) + return transformStableResult(s, id, config) } return null diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index c554fa0396f87b..e2c7c8862b930a 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -1028,16 +1028,21 @@ function normalizeSingleAlias({ return alias } -export function transformResult( +/** + * Transforms transpiled code result where line numbers aren't altered, + * so we can skip sourcemap generation during dev + */ +export function transformStableResult( s: MagicString, id: string, config: ResolvedConfig ): TransformResult { - const isBuild = config.command === 'build' - const needSourceMap = !isBuild || config.build.sourcemap return { code: s.toString(), - map: needSourceMap ? s.generateMap({ hires: true, source: id }) : null + map: + config.command === 'build' && config.build.sourcemap + ? s.generateMap({ hires: true, source: id }) + : null } } diff --git a/playground/vue-sourcemap/__tests__/__snapshots__/serve.spec.ts.snap b/playground/vue-sourcemap/__tests__/__snapshots__/serve.spec.ts.snap index 7a262ecd9a6f82..e91b6ce384c562 100644 --- a/playground/vue-sourcemap/__tests__/__snapshots__/serve.spec.ts.snap +++ b/playground/vue-sourcemap/__tests__/__snapshots__/serve.spec.ts.snap @@ -1,8 +1,149 @@ // Vitest Snapshot v1 +exports[`serve:vue-sourcemap > css 1`] = ` +{ + "mappings": ";AAQA;EACE,UAAU;AACZ", + "sources": [ + "/root/Css.vue", + ], + "sourcesContent": [ + " + + + + + + + + +", + ], + "version": 3, +} +`; + +exports[`serve:vue-sourcemap > css module 1`] = ` +{ + "mappings": ";AAcA;EACE,UAAU;AACZ", + "sources": [ + "/root/Css.vue", + ], + "sourcesContent": [ + " + + + + + + + + +", + ], + "version": 3, +} +`; + +exports[`serve:vue-sourcemap > css scoped 1`] = ` +{ + "mappings": ";AAoBA;EACE,UAAU;AACZ", + "sources": [ + "/root/Css.vue", + ], + "sourcesContent": [ + " + + + + + + + + +", + ], + "version": 3, +} +`; + exports[`serve:vue-sourcemap > js 1`] = ` { - "mappings": "mIAKA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;;AAGP;AACd,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;;;;;;;wBARlB,oBAAiB,WAAd,MAAU", + "mappings": "AAKA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;;AAGP;AACd,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;;;;;;;wBARlB,oBAAiB,WAAd,MAAU", "sources": [ "/root/Js.vue", ], @@ -23,3 +164,172 @@ console.log('setup') "version": 3, } `; + +exports[`serve:vue-sourcemap > less with additionalData 1`] = ` +{ + "mappings": "AAKA;EACE", + "sources": [ + "/root/Less.vue", + ], + "sourcesContent": [ + " + + +", + ], + "version": 3, +} +`; + +exports[`serve:vue-sourcemap > no script 1`] = ` +{ + "mappings": ";;;wBACE,oBAAwB,WAArB,aAAiB", + "sourceRoot": "", + "sources": [ + "/root/NoScript.vue", + ], + "sourcesContent": [ + " +", + ], + "version": 3, +} +`; + +exports[`serve:vue-sourcemap > no template 1`] = ` +{ + "mappings": "AACA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;;AAGP;AACd,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;;;", + "sources": [ + "/root/NoTemplate.vue", + ], + "sourcesContent": [ + " + + +", + ], + "version": 3, +} +`; + +exports[`serve:vue-sourcemap > sass 1`] = ` +{ + "mappings": "AAKA;EACE", + "sources": [ + "/root/Sass.vue", + ], + "sourcesContent": [ + " + + +", + ], + "version": 3, +} +`; + +exports[`serve:vue-sourcemap > sass with import 1`] = ` +{ + "mappings": "AAAA;EACE;;ACOF;EACE", + "sources": [ + "/root/sassWithImportImported.sass", + "/root/SassWithImport.vue", + ], + "sourcesContent": [ + ".sass-with-import-imported + color: red +", + " + + +", + ], + "version": 3, +} +`; + +exports[`serve:vue-sourcemap > src imported 1`] = ` +{ + "mappings": "AAAA;EACE,UAAU;AACZ", + "sources": [ + "/root/src-import/src-import.css", + ], + "sourcesContent": [ + ".src-import { + color: red; +} +", + ], + "version": 3, +} +`; + +exports[`serve:vue-sourcemap > src imported sass 1`] = ` +{ + "mappings": "AAAA;EACE;;ACCF;EACE", + "sources": [ + "/root/src-import/src-import-imported.sass", + "/root/src-import/src-import.sass", + ], + "sourcesContent": [ + ".src-import-sass-imported + color: red +", + "@import './src-import-imported' + +.src-import-sass + color: red +", + ], + "version": 3, +} +`; + +exports[`serve:vue-sourcemap > ts 1`] = ` +{ + "mappings": ";AAKA,QAAQ,IAAI,WAAW;;;;;AAIvB,YAAQ,IAAI,UAAU;;;;;;;;uBARpB,oBAAiB,WAAd,MAAU", + "sources": [ + "/root/Ts.vue", + ], + "sourcesContent": [ + " + + + + +", + ], + "version": 3, +} +`; diff --git a/playground/vue-sourcemap/__tests__/serve.spec.ts b/playground/vue-sourcemap/__tests__/serve.spec.ts index e42a12e87be6a2..1ace0d7d1f4306 100644 --- a/playground/vue-sourcemap/__tests__/serve.spec.ts +++ b/playground/vue-sourcemap/__tests__/serve.spec.ts @@ -29,310 +29,55 @@ describe.runIf(isServe)('serve:vue-sourcemap', () => { const res = await page.request.get(new URL('./Ts.vue', page.url()).href) const js = await res.text() const map = extractSourcemap(js) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": ";AAKA,QAAQ,IAAI,WAAW;;;;;AAIvB,YAAQ,IAAI,UAAU;;;;;;;;uBARpB,oBAAiB,WAAd,MAAU", - "sources": [ - "/root/Ts.vue", - ], - "sourcesContent": [ - " - - - - - ", - ], - "version": 3, - } - `) + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() }) test('css', async () => { const css = await getStyleTagContentIncluding('.css ') const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": ";AAQA;EACE,UAAU;AACZ", - "sources": [ - "/root/Css.vue", - ], - "sourcesContent": [ - " - - - - - - - - - ", - ], - "version": 3, - } - `) + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() }) test('css module', async () => { const css = await getStyleTagContentIncluding('._css-module_') const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": ";AAcA;EACE,UAAU;AACZ", - "sources": [ - "/root/Css.vue", - ], - "sourcesContent": [ - " - - - - - - - - - ", - ], - "version": 3, - } - `) + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() }) test('css scoped', async () => { const css = await getStyleTagContentIncluding('.css-scoped[data-v-') const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": ";AAoBA;EACE,UAAU;AACZ", - "sources": [ - "/root/Css.vue", - ], - "sourcesContent": [ - " - - - - - - - - - ", - ], - "version": 3, - } - `) + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() }) test('sass', async () => { const css = await getStyleTagContentIncluding('.sass ') const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": "AAKA;EACE", - "sources": [ - "/root/Sass.vue", - ], - "sourcesContent": [ - " - - - ", - ], - "version": 3, - } - `) + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() }) test('sass with import', async () => { const css = await getStyleTagContentIncluding('.sass-with-import ') const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": "AAAA;EACE;;ACOF;EACE", - "sources": [ - "/root/sassWithImportImported.sass", - "/root/SassWithImport.vue", - ], - "sourcesContent": [ - ".sass-with-import-imported - color: red - ", - " - - - ", - ], - "version": 3, - } - `) + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() }) test('less with additionalData', async () => { const css = await getStyleTagContentIncluding('.less ') const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": "AAKA;EACE", - "sources": [ - "/root/Less.vue", - ], - "sourcesContent": [ - " - - - ", - ], - "version": 3, - } - `) + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() }) test('src imported', async () => { const css = await getStyleTagContentIncluding('.src-import[data-v-') const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": "AAAA;EACE,UAAU;AACZ", - "sources": [ - "/root/src-import/src-import.css", - ], - "sourcesContent": [ - ".src-import { - color: red; - } - ", - ], - "version": 3, - } - `) + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() }) test('src imported sass', async () => { const css = await getStyleTagContentIncluding('.src-import-sass[data-v-') const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": "AAAA;EACE;;ACCF;EACE", - "sources": [ - "/root/src-import/src-import-imported.sass", - "/root/src-import/src-import.sass", - ], - "sourcesContent": [ - ".src-import-sass-imported - color: red - ", - "@import './src-import-imported' - - .src-import-sass - color: red - ", - ], - "version": 3, - } - `) + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() }) test('no script', async () => { @@ -341,21 +86,7 @@ describe.runIf(isServe)('serve:vue-sourcemap', () => { ) const js = await res.text() const map = extractSourcemap(js) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": ";;;wBACE", - "sources": [ - "/root/NoScript.vue", - ], - "sourcesContent": [ - " - ", - ], - "version": 3, - } - `) + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() }) test('no template', async () => { @@ -364,24 +95,6 @@ describe.runIf(isServe)('serve:vue-sourcemap', () => { ) const js = await res.text() const map = extractSourcemap(js) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": "2IACA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;;AAGP;AACd,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC", - "sources": [ - "/root/NoTemplate.vue", - ], - "sourcesContent": [ - " - - - ", - ], - "version": 3, - } - `) + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() }) }) diff --git a/playground/worker/__tests__/sourcemap/__snapshots__/sourcemap-worker.spec.ts.snap b/playground/worker/__tests__/sourcemap/__snapshots__/sourcemap-worker.spec.ts.snap deleted file mode 100644 index 3895aae40ad402..00000000000000 --- a/playground/worker/__tests__/sourcemap/__snapshots__/sourcemap-worker.spec.ts.snap +++ /dev/null @@ -1,14 +0,0 @@ -// Vitest Snapshot v1 - -exports[`serve:worker-sourcemap > nested worker 1`] = ` -{ - "mappings": "AAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,uCAAsB,CAAC;AAClD;AACA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC;AACD;AACA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/B;AACA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;", - "sources": [ - "/root/possible-ts-output-worker.mjs?worker_file", - ], - "sourcesContent": [ - null, - ], - "version": 3, -} -`; diff --git a/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts b/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts index 801369d8cb7271..a0ad8e7a355b8b 100644 --- a/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts +++ b/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts @@ -1,13 +1,6 @@ import fs from 'node:fs' import path from 'node:path' -import { - extractSourcemap, - formatSourcemapForSnapshot, - isBuild, - isServe, - page, - testDir -} from '~utils' +import { isBuild, testDir } from '~utils' describe.runIf(isBuild)('build', () => { // assert correct files @@ -120,16 +113,6 @@ describe.runIf(isBuild)('build', () => { }) }) -describe.runIf(isServe)('serve:worker-sourcemap', () => { - test('nested worker', async () => { - const res = await page.request.get( - new URL('./possible-ts-output-worker.mjs?worker_file', page.url()).href - ) - const map = extractSourcemap(await res.text()) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() - }) -}) - function getSourceMapUrl(code: string): string { const regex = /\/\/[#@]\s(?:source(?:Mapping)?URL)=\s*(\S+)/g const results = regex.exec(code) From b7d268b50098905e1b948f68a9c191749df04706 Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Sun, 26 Jun 2022 21:48:17 +0800 Subject: [PATCH 25/75] chore: set local packages private (#8790) --- playground/external/dep-that-imports-vue/package.json | 3 ++- playground/external/dep-that-requires-vue/package.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/playground/external/dep-that-imports-vue/package.json b/playground/external/dep-that-imports-vue/package.json index 2c088c73cbb035..0fcd4b186a979b 100644 --- a/playground/external/dep-that-imports-vue/package.json +++ b/playground/external/dep-that-imports-vue/package.json @@ -1,6 +1,7 @@ { "name": "@vitejs/dep-that-imports-vue", - "version": "0.0.1", + "private": true, + "version": "0.0.0", "dependencies": { "vue": "^3.2.37" } diff --git a/playground/external/dep-that-requires-vue/package.json b/playground/external/dep-that-requires-vue/package.json index a12c43b40fb282..a71847a02bb969 100644 --- a/playground/external/dep-that-requires-vue/package.json +++ b/playground/external/dep-that-requires-vue/package.json @@ -1,6 +1,7 @@ { "name": "@vitejs/dep-that-requires-vue", - "version": "0.0.1", + "private": true, + "version": "0.0.0", "dependencies": { "vue": "^3.2.37" } From 4a6408b6bb6486a61c410df74f968098a72ae0bd Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Sun, 26 Jun 2022 21:51:41 +0800 Subject: [PATCH 26/75] fix: skip inline html (#8789) --- packages/vite/src/node/plugins/asset.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index cab050cbdfa652..ec8ec66ff0dd21 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -383,6 +383,7 @@ async function fileToBuiltUrl( if ( config.build.lib || (!file.endsWith('.svg') && + !file.endsWith('.html') && content.length < Number(config.build.assetsInlineLimit)) ) { const mimeType = mrmime.lookup(file) ?? 'application/octet-stream' From 3f689a4491cf2d63ff1d98a57422c6b4aa8a0f03 Mon Sep 17 00:00:00 2001 From: patak Date: Sun, 26 Jun 2022 17:04:24 +0200 Subject: [PATCH 27/75] fix: ensure deps optimizer first run, fixes #8750 (#8775) --- packages/vite/src/node/optimizer/index.ts | 1 + packages/vite/src/node/optimizer/optimizer.ts | 19 ++++++++++++++++++- .../vite/src/node/plugins/optimizedDeps.ts | 4 ++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/vite/src/node/optimizer/index.ts b/packages/vite/src/node/optimizer/index.ts index d9b5d4897d667e..f50b0730096c96 100644 --- a/packages/vite/src/node/optimizer/index.ts +++ b/packages/vite/src/node/optimizer/index.ts @@ -61,6 +61,7 @@ export interface DepsOptimizer { delayDepsOptimizerUntil: (id: string, done: () => Promise) => void registerWorkersSource: (id: string) => void resetRegisteredIds: () => void + ensureFirstRun: () => void options: DepOptimizationOptions } diff --git a/packages/vite/src/node/optimizer/optimizer.ts b/packages/vite/src/node/optimizer/optimizer.ts index 9a331e9db90ab4..37a3aef745b4f3 100644 --- a/packages/vite/src/node/optimizer/optimizer.ts +++ b/packages/vite/src/node/optimizer/optimizer.ts @@ -83,6 +83,7 @@ export async function initDepsOptimizer( registerWorkersSource, delayDepsOptimizerUntil, resetRegisteredIds, + ensureFirstRun, options: config.optimizeDeps } @@ -521,12 +522,28 @@ export async function initDepsOptimizer( let seenIds = new Set() let workersSources = new Set() let waitingOn: string | undefined + let firstRunEnsured = false function resetRegisteredIds() { registeredIds = [] seenIds = new Set() workersSources = new Set() waitingOn = undefined + firstRunEnsured = false + } + + // If all the inputs are dependencies, we aren't going to get any + // delayDepsOptimizerUntil(id) calls. We need to guard against this + // by forcing a rerun if no deps have been registered + function ensureFirstRun() { + if (!firstRunEnsured && !firstRunCalled && registeredIds.length === 0) { + setTimeout(() => { + if (!firstRunCalled && registeredIds.length === 0) { + getDepsOptimizer(config)?.run() + } + }, runOptimizerIfIdleAfterMs) + } + firstRunEnsured = true } function registerWorkersSource(id: string): void { @@ -559,7 +576,7 @@ export async function initDepsOptimizer( waitingOn = next.id const afterLoad = () => { waitingOn = undefined - if (!workersSources.has(next.id)) { + if (!firstRunCalled && !workersSources.has(next.id)) { if (registeredIds.length > 0) { runOptimizerWhenIdle() } else { diff --git a/packages/vite/src/node/plugins/optimizedDeps.ts b/packages/vite/src/node/plugins/optimizedDeps.ts index 3eff36bd1bc13e..3db6d850f7f286 100644 --- a/packages/vite/src/node/plugins/optimizedDeps.ts +++ b/packages/vite/src/node/plugins/optimizedDeps.ts @@ -108,8 +108,12 @@ export function optimizedDepsBuildPlugin(config: ResolvedConfig): Plugin { if (!metadata || !depsOptimizer?.isOptimizedDepFile(id)) { return } + + depsOptimizer?.ensureFirstRun() + const file = cleanUrl(id) // Search in both the currently optimized and newly discovered deps + // If all the inputs are dependencies, we aren't going to get any const info = optimizedDepInfoFromFile(metadata, file) if (info) { try { From de8fdd8fd7676785f0218bbc81ff65e5e5c00311 Mon Sep 17 00:00:00 2001 From: patak-dev Date: Sun, 26 Jun 2022 17:34:59 +0200 Subject: [PATCH 28/75] release: v3.0.0-beta.3 --- packages/vite/CHANGELOG.md | 14 ++++++++++++++ packages/vite/package.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/vite/CHANGELOG.md b/packages/vite/CHANGELOG.md index 4a0b6c8fc6f623..0c045980902122 100644 --- a/packages/vite/CHANGELOG.md +++ b/packages/vite/CHANGELOG.md @@ -1,3 +1,17 @@ +## 3.0.0-beta.3 (2022-06-26) + +* fix: always remove temp config (#8782) ([2c2a86b](https://github.com/vitejs/vite/commit/2c2a86b)), closes [#8782](https://github.com/vitejs/vite/issues/8782) +* fix: ensure deps optimizer first run, fixes #8750 (#8775) ([3f689a4](https://github.com/vitejs/vite/commit/3f689a4)), closes [#8750](https://github.com/vitejs/vite/issues/8750) [#8775](https://github.com/vitejs/vite/issues/8775) +* fix: remove buildTimeImportMetaUrl (#8785) ([cd32095](https://github.com/vitejs/vite/commit/cd32095)), closes [#8785](https://github.com/vitejs/vite/issues/8785) +* fix: skip inline html (#8789) ([4a6408b](https://github.com/vitejs/vite/commit/4a6408b)), closes [#8789](https://github.com/vitejs/vite/issues/8789) +* fix(optimizer): only run require-import conversion if require'd (#8795) ([7ae0d3e](https://github.com/vitejs/vite/commit/7ae0d3e)), closes [#8795](https://github.com/vitejs/vite/issues/8795) +* perf: avoid sourcemap chains during dev (#8796) ([1566f61](https://github.com/vitejs/vite/commit/1566f61)), closes [#8796](https://github.com/vitejs/vite/issues/8796) +* chore: use `tsx` directly instead of indirect `esno` (#8773) ([f018f13](https://github.com/vitejs/vite/commit/f018f13)), closes [#8773](https://github.com/vitejs/vite/issues/8773) +* feat: respect esbuild minify config (#8754) ([8b77695](https://github.com/vitejs/vite/commit/8b77695)), closes [#8754](https://github.com/vitejs/vite/issues/8754) +* chore!: update rollup commonjs plugin to v22 (#8743) ([d4dcdd1](https://github.com/vitejs/vite/commit/d4dcdd1)), closes [#8743](https://github.com/vitejs/vite/issues/8743) + + + ## 3.0.0-beta.2 (2022-06-24) * feat: enable tree-shaking for lib es (#8737) ([5dc0f72](https://github.com/vitejs/vite/commit/5dc0f72)), closes [#8737](https://github.com/vitejs/vite/issues/8737) diff --git a/packages/vite/package.json b/packages/vite/package.json index 8b0105285f951e..dfd3b4a893619e 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -1,6 +1,6 @@ { "name": "vite", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "type": "module", "license": "MIT", "author": "Evan You", From e53c029ef645d1d91c284799489a11d1f41303ec Mon Sep 17 00:00:00 2001 From: Yash Singh Date: Sun, 26 Jun 2022 12:12:21 -0500 Subject: [PATCH 29/75] docs: clarification `transformIndexHtml` (#8786) --- docs/guide/api-plugin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/api-plugin.md b/docs/guide/api-plugin.md index 51dc3ef6e0f78f..4f1ccf5c931b63 100644 --- a/docs/guide/api-plugin.md +++ b/docs/guide/api-plugin.md @@ -332,7 +332,7 @@ Vite plugins can also provide hooks that serve Vite-specific purposes. These hoo - **Type:** `IndexHtmlTransformHook | { enforce?: 'pre' | 'post', transform: IndexHtmlTransformHook }` - **Kind:** `async`, `sequential` - Dedicated hook for transforming `index.html`. The hook receives the current HTML string and a transform context. The context exposes the [`ViteDevServer`](./api-javascript#vitedevserver) instance during dev, and exposes the Rollup output bundle during build. + Dedicated hook for transforming HTML entry point files such as `index.html`. The hook receives the current HTML string and a transform context. The context exposes the [`ViteDevServer`](./api-javascript#vitedevserver) instance during dev, and exposes the Rollup output bundle during build. The hook can be async and can return one of the following: From 6851009e6725b17608113a5a63474280075cae1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0=20/=20green?= Date: Mon, 27 Jun 2022 13:59:04 +0900 Subject: [PATCH 30/75] fix: /@fs/ dir traversal with escaped chars (fixes #8498) (#8804) --- .../src/node/server/middlewares/static.ts | 4 +-- .../fs-serve/__tests__/fs-serve.spec.ts | 12 +++++++++ playground/fs-serve/root/src/index.html | 27 +++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/node/server/middlewares/static.ts b/packages/vite/src/node/server/middlewares/static.ts index b5eb087b7b467c..9f18b6391face0 100644 --- a/packages/vite/src/node/server/middlewares/static.ts +++ b/packages/vite/src/node/server/middlewares/static.ts @@ -80,7 +80,7 @@ export function serveStaticMiddleware( return next() } - const url = decodeURI(req.url!) + const url = decodeURIComponent(req.url!) // apply aliases to static requests as well let redirected: string | undefined @@ -123,7 +123,7 @@ export function serveRawFsMiddleware( // Keep the named function. The name is visible in debug logs via `DEBUG=connect:dispatcher ...` return function viteServeRawFsMiddleware(req, res, next) { - let url = decodeURI(req.url!) + let url = decodeURIComponent(req.url!) // In some cases (e.g. linked monorepos) files outside of root will // reference assets that are also out of served root. In such cases // the paths are rewritten to `/@fs/` prefixed paths and must be served by diff --git a/playground/fs-serve/__tests__/fs-serve.spec.ts b/playground/fs-serve/__tests__/fs-serve.spec.ts index 747b46ecbb8287..2111cac80cc4e7 100644 --- a/playground/fs-serve/__tests__/fs-serve.spec.ts +++ b/playground/fs-serve/__tests__/fs-serve.spec.ts @@ -35,6 +35,13 @@ describe.runIf(isServe)('main', () => { expect(await page.textContent('.unsafe-fetch-status')).toBe('403') }) + test('unsafe fetch with special characters (#8498)', async () => { + expect(await page.textContent('.unsafe-fetch-8498')).toMatch( + '403 Restricted' + ) + expect(await page.textContent('.unsafe-fetch-8498-status')).toBe('403') + }) + test('safe fs fetch', async () => { expect(await page.textContent('.safe-fs-fetch')).toBe(stringified) expect(await page.textContent('.safe-fs-fetch-status')).toBe('200') @@ -52,6 +59,11 @@ describe.runIf(isServe)('main', () => { expect(await page.textContent('.unsafe-fs-fetch-status')).toBe('403') }) + test('unsafe fs fetch with special characters (#8498)', async () => { + expect(await page.textContent('.unsafe-fs-fetch-8498')).toBe('') + expect(await page.textContent('.unsafe-fs-fetch-8498-status')).toBe('403') + }) + test('nested entry', async () => { expect(await page.textContent('.nested-entry')).toBe('foobar') }) diff --git a/playground/fs-serve/root/src/index.html b/playground/fs-serve/root/src/index.html index 951e14ad2cce91..6939e0f4b09ed9 100644 --- a/playground/fs-serve/root/src/index.html +++ b/playground/fs-serve/root/src/index.html @@ -17,6 +17,8 @@

Safe Fetch Subdirectory

Unsafe Fetch


 

+

+

 
 

Safe /@fs/ Fetch


@@ -27,6 +29,8 @@ 

Safe /@fs/ Fetch

Unsafe /@fs/ Fetch


 

+

+

 
 

Nested Entry


@@ -83,6 +87,19 @@ 

Denied

console.error(e) }) + // outside of allowed dir with special characters #8498 + fetch('/src/%2e%2e%2funsafe%2etxt') + .then((r) => { + text('.unsafe-fetch-8498-status', r.status) + return r.text() + }) + .then((data) => { + text('.unsafe-fetch-8498', data) + }) + .catch((e) => { + console.error(e) + }) + // imported before, should be treated as safe fetch('/@fs/' + ROOT + '/safe.json') .then((r) => { @@ -106,6 +123,16 @@

Denied

console.error(e) }) + // outside root with special characters #8498 + fetch('/@fs/' + ROOT + '/root/src/%2e%2e%2f%2e%2e%2funsafe%2ejson') + .then((r) => { + text('.unsafe-fs-fetch-8498-status', r.status) + return r.json() + }) + .then((data) => { + text('.unsafe-fs-fetch-8498', JSON.stringify(data)) + }) + // not imported before, inside root with special characters, treated as safe fetch( '/@fs/' + From 9508549f1ec19d9485f7ba7c1847972051ae15e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ximo=20Mussini?= Date: Mon, 27 Jun 2022 02:11:39 -0300 Subject: [PATCH 31/75] fix: preserve extension of css assets in the manifest (#8768) --- packages/vite/src/node/plugins/css.ts | 22 ++++++++++++------- packages/vite/src/node/plugins/manifest.ts | 9 +++++++- .../__tests__/backend-integration.spec.ts | 6 +++++ .../frontend/entrypoints/nested/blue.scss | 5 +++++ playground/backend-integration/package.json | 5 ++--- pnpm-lock.yaml | 19 +++------------- 6 files changed, 38 insertions(+), 28 deletions(-) create mode 100644 playground/backend-integration/frontend/entrypoints/nested/blue.scss diff --git a/packages/vite/src/node/plugins/css.ts b/packages/vite/src/node/plugins/css.ts index a362fc124c4150..01c72d0c24edcc 100644 --- a/packages/vite/src/node/plugins/css.ts +++ b/packages/vite/src/node/plugins/css.ts @@ -143,6 +143,8 @@ export const removedPureCssFilesCache = new WeakMap< Map >() +export const cssEntryFilesCache = new WeakMap>() + const postcssConfigCache = new WeakMap< ResolvedConfig, PostCSSConfigResult | null @@ -179,6 +181,7 @@ export function cssPlugin(config: ResolvedConfig): Plugin { cssModulesCache.set(config, moduleCache) removedPureCssFilesCache.set(config, new Map()) + cssEntryFilesCache.set(config, new Set()) }, async transform(raw, id, options) { @@ -453,6 +456,7 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin { return null } + const cssEntryFiles = cssEntryFilesCache.get(config)! const publicAssetUrlMap = publicAssetUrlCache.get(config)! // resolve asset URL placeholders to their built file URLs @@ -509,22 +513,24 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin { pureCssChunks.add(chunk.fileName) } if (opts.format === 'es' || opts.format === 'cjs') { - const cssAssetName = ensureFileExt( - chunk.facadeModuleId - ? normalizePath(path.relative(config.root, chunk.facadeModuleId)) - : chunk.name, - '.css' - ) + const cssAssetName = chunk.facadeModuleId + ? normalizePath(path.relative(config.root, chunk.facadeModuleId)) + : chunk.name + + const lang = path.extname(cssAssetName).slice(1) + const cssFileName = ensureFileExt(cssAssetName, '.css') + + if (chunk.isEntry && isPureCssChunk) cssEntryFiles.add(cssAssetName) chunkCSS = resolveAssetUrlsInCss(chunkCSS, cssAssetName) chunkCSS = await finalizeCss(chunkCSS, true, config) // emit corresponding css file const fileHandle = this.emitFile({ - name: cssAssetName, + name: isPreProcessor(lang) ? cssAssetName : cssFileName, fileName: assetFileNamesToFileName( resolveAssetFileNames(config), - cssAssetName, + cssFileName, getHash(chunkCSS), chunkCSS ), diff --git a/packages/vite/src/node/plugins/manifest.ts b/packages/vite/src/node/plugins/manifest.ts index a0e231a3e034fb..e342102946904a 100644 --- a/packages/vite/src/node/plugins/manifest.ts +++ b/packages/vite/src/node/plugins/manifest.ts @@ -3,6 +3,7 @@ import type { OutputAsset, OutputChunk } from 'rollup' import type { ResolvedConfig } from '..' import type { Plugin } from '../plugin' import { normalizePath } from '../utils' +import { cssEntryFilesCache } from './css' export type Manifest = Record @@ -100,12 +101,18 @@ export function manifestPlugin(config: ResolvedConfig): Plugin { } function createAsset(chunk: OutputAsset): ManifestChunk { - return { + const manifestChunk: ManifestChunk = { file: chunk.fileName, src: chunk.name } + + if (cssEntryFiles.has(chunk.name!)) manifestChunk.isEntry = true + + return manifestChunk } + const cssEntryFiles = cssEntryFilesCache.get(config)! + for (const file in bundle) { const chunk = bundle[file] if (chunk.type === 'chunk') { diff --git a/playground/backend-integration/__tests__/backend-integration.spec.ts b/playground/backend-integration/__tests__/backend-integration.spec.ts index db3790ee67e4ac..f0589783cbecf8 100644 --- a/playground/backend-integration/__tests__/backend-integration.spec.ts +++ b/playground/backend-integration/__tests__/backend-integration.spec.ts @@ -33,11 +33,17 @@ describe.runIf(isBuild)('build', () => { const manifest = readManifest('dev') const htmlEntry = manifest['index.html'] const cssAssetEntry = manifest['global.css'] + const scssAssetEntry = manifest['nested/blue.scss'] const imgAssetEntry = manifest['../images/logo.png'] expect(htmlEntry.css.length).toEqual(1) expect(htmlEntry.assets.length).toEqual(1) expect(cssAssetEntry?.file).not.toBeUndefined() + expect(cssAssetEntry?.isEntry).toEqual(true) + expect(scssAssetEntry?.file).not.toBeUndefined() + expect(scssAssetEntry?.src).toEqual('nested/blue.scss') + expect(scssAssetEntry?.isEntry).toEqual(true) expect(imgAssetEntry?.file).not.toBeUndefined() + expect(imgAssetEntry?.isEntry).toBeUndefined() }) }) diff --git a/playground/backend-integration/frontend/entrypoints/nested/blue.scss b/playground/backend-integration/frontend/entrypoints/nested/blue.scss new file mode 100644 index 00000000000000..67be4f93044cce --- /dev/null +++ b/playground/backend-integration/frontend/entrypoints/nested/blue.scss @@ -0,0 +1,5 @@ +$primary: #cc0000; + +.text-primary { + color: $primary; +} diff --git a/playground/backend-integration/package.json b/playground/backend-integration/package.json index 5c713942228ae6..aeb061f095391f 100644 --- a/playground/backend-integration/package.json +++ b/playground/backend-integration/package.json @@ -8,10 +8,9 @@ "debug": "node --inspect-brk ../../packages/vite/bin/vite", "preview": "vite preview" }, - "dependencies": { - "tailwindcss": "^3.1.3" - }, "devDependencies": { + "sass": "^1.52.3", + "tailwindcss": "^3.1.3", "fast-glob": "^3.2.11" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 585fd0b471542d..1398973edda041 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -361,11 +361,12 @@ importers: playground/backend-integration: specifiers: fast-glob: ^3.2.11 + sass: ^1.52.3 tailwindcss: ^3.1.3 - dependencies: - tailwindcss: 3.1.3 devDependencies: fast-glob: 3.2.11 + sass: 1.52.3 + tailwindcss: 3.1.3 playground/cli: specifiers: {} @@ -2680,12 +2681,10 @@ packages: acorn: 7.4.1 acorn-walk: 7.2.0 xtend: 4.0.2 - dev: false /acorn-walk/7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} engines: {node: '>=0.4.0'} - dev: false /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} @@ -2808,7 +2807,6 @@ packages: /arg/5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: false /argparse/1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -3056,7 +3054,6 @@ packages: /camelcase-css/2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - dev: false /camelcase-keys/6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} @@ -3733,7 +3730,6 @@ packages: /defined/1.0.0: resolution: {integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==} - dev: false /defu/5.0.1: resolution: {integrity: sha512-EPS1carKg+dkEVy3qNTqIdp2qV7mUP08nIsupfwQpz++slCVRw7qbQyWvSTig+kFPwz2XXp5/kIIkH+CwrJKkQ==} @@ -3784,7 +3780,6 @@ packages: acorn-node: 1.8.2 defined: 1.0.0 minimist: 1.2.6 - dev: false /dicer/0.3.0: resolution: {integrity: sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==} @@ -3795,7 +3790,6 @@ packages: /didyoumean/1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dev: false /diff/4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} @@ -3810,7 +3804,6 @@ packages: /dlv/1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dev: false /doctrine/2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} @@ -6448,7 +6441,6 @@ packages: /object-hash/3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - dev: false /object-inspect/1.12.2: resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} @@ -6783,7 +6775,6 @@ packages: dependencies: camelcase-css: 2.0.1 postcss: 8.4.14 - dev: false /postcss-load-config/3.1.4_apxnowcr5uhxb4jlsbpuejnlvi: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} @@ -6818,7 +6809,6 @@ packages: lilconfig: 2.0.5 postcss: 8.4.14 yaml: 1.10.2 - dev: false /postcss-load-config/4.0.1_postcss@8.4.14: resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} @@ -6911,7 +6901,6 @@ packages: dependencies: postcss: 8.4.14 postcss-selector-parser: 6.0.10 - dev: false /postcss-selector-parser/6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} @@ -7129,7 +7118,6 @@ packages: /quick-lru/5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - dev: false /range-parser/1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} @@ -7965,7 +7953,6 @@ packages: resolve: 1.22.0 transitivePeerDependencies: - ts-node - dev: false /tailwindcss/3.1.3_ts-node@10.8.1: resolution: {integrity: sha512-PRJNYdSIthrb8hjmAyymEyEN8Yo61TMXpzyFUpxULeeyRn3Y3gpvuw6FlRTKrJvK7thSGKRnhT36VovVx4WeMA==} From d5c50997dca46c6b901fd951eac492f96271b511 Mon Sep 17 00:00:00 2001 From: patak-dev Date: Mon, 27 Jun 2022 10:12:27 +0200 Subject: [PATCH 32/75] release: v3.0.0-beta.4 --- packages/vite/CHANGELOG.md | 7 +++++++ packages/vite/package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/vite/CHANGELOG.md b/packages/vite/CHANGELOG.md index 0c045980902122..7564a2ee5bd3f2 100644 --- a/packages/vite/CHANGELOG.md +++ b/packages/vite/CHANGELOG.md @@ -1,3 +1,10 @@ +## 3.0.0-beta.4 (2022-06-27) + +* fix: /@fs/ dir traversal with escaped chars (fixes #8498) (#8804) ([6851009](https://github.com/vitejs/vite/commit/6851009)), closes [#8498](https://github.com/vitejs/vite/issues/8498) [#8804](https://github.com/vitejs/vite/issues/8804) +* fix: preserve extension of css assets in the manifest (#8768) ([9508549](https://github.com/vitejs/vite/commit/9508549)), closes [#8768](https://github.com/vitejs/vite/issues/8768) + + + ## 3.0.0-beta.3 (2022-06-26) * fix: always remove temp config (#8782) ([2c2a86b](https://github.com/vitejs/vite/commit/2c2a86b)), closes [#8782](https://github.com/vitejs/vite/issues/8782) diff --git a/packages/vite/package.json b/packages/vite/package.json index dfd3b4a893619e..7b134fd5770250 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -1,6 +1,6 @@ { "name": "vite", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "type": "module", "license": "MIT", "author": "Evan You", From d90409e2afa91c34d124a28b8c9cadc915815617 Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Mon, 27 Jun 2022 18:44:51 +0800 Subject: [PATCH 33/75] feat: respect esbuild minify config for css (#8811) --- docs/config/shared-options.md | 2 +- .../node/__tests__/plugins/esbuild.spec.ts | 29 ++++++++++++++++++- packages/vite/src/node/plugins/css.ts | 24 +++++++++++++-- packages/vite/src/node/plugins/esbuild.ts | 11 +++++-- playground/minify/__tests__/minify.spec.ts | 18 ++++++++++++ playground/minify/index.html | 3 ++ playground/minify/main.js | 5 ++++ playground/minify/package.json | 11 +++++++ playground/minify/test.css | 4 +++ playground/minify/vite.config.js | 7 +++++ 10 files changed, 107 insertions(+), 7 deletions(-) create mode 100644 playground/minify/__tests__/minify.spec.ts create mode 100644 playground/minify/index.html create mode 100644 playground/minify/main.js create mode 100644 playground/minify/package.json create mode 100644 playground/minify/test.css create mode 100644 playground/minify/vite.config.js diff --git a/docs/config/shared-options.md b/docs/config/shared-options.md index 774c35df42a5a5..c6a14b24cbc830 100644 --- a/docs/config/shared-options.md +++ b/docs/config/shared-options.md @@ -280,7 +280,7 @@ export default defineConfig({ }) ``` -When [`build.minify`](./build-options.md#build-minify) is `true`, you can configure to only minify [certain aspects](https://esbuild.github.io/api/#minify) of the code by setting either of `esbuild.minifyIdentifiers`, `esbuild.minifySyntax`, and `esbuild.minifyWhitespace` to `true`. Note the `esbuild.minify` option can't be used to override `build.minify`. +When [`build.minify`](./build-options.md#build-minify) is `true`, all minify optimizations are applied by default. To disable [certain aspects](https://esbuild.github.io/api/#minify) of it, set any of `esbuild.minifyIdentifiers`, `esbuild.minifySyntax`, or `esbuild.minifyWhitespace` options to `false`. Note the `esbuild.minify` option can't be used to override `build.minify`. Set to `false` to disable esbuild transforms. diff --git a/packages/vite/src/node/__tests__/plugins/esbuild.spec.ts b/packages/vite/src/node/__tests__/plugins/esbuild.spec.ts index 50e9183b46e64c..5f063301799cff 100644 --- a/packages/vite/src/node/__tests__/plugins/esbuild.spec.ts +++ b/packages/vite/src/node/__tests__/plugins/esbuild.spec.ts @@ -41,6 +41,31 @@ describe('resolveEsbuildTranspileOptions', () => { expect(options).toEqual(null) }) + test('resolve specific minify options', () => { + const options = resolveEsbuildTranspileOptions( + defineResolvedConfig({ + build: { + minify: 'esbuild' + }, + esbuild: { + keepNames: true, + minifyIdentifiers: false + } + }), + 'es' + ) + expect(options).toEqual({ + target: undefined, + format: 'esm', + keepNames: true, + minify: false, + minifyIdentifiers: false, + minifySyntax: true, + minifyWhitespace: true, + treeShaking: true + }) + }) + test('resolve no minify', () => { const options = resolveEsbuildTranspileOptions( defineResolvedConfig({ @@ -140,6 +165,7 @@ describe('resolveEsbuildTranspileOptions', () => { keepNames: true, minify: false, minifyIdentifiers: true, + minifySyntax: true, minifyWhitespace: false, treeShaking: true }) @@ -157,7 +183,7 @@ describe('resolveEsbuildTranspileOptions', () => { esbuild: { keepNames: true, minifyIdentifiers: true, - minifyWhitespace: true, + minifySyntax: false, treeShaking: true } }), @@ -169,6 +195,7 @@ describe('resolveEsbuildTranspileOptions', () => { keepNames: true, minify: false, minifyIdentifiers: true, + minifySyntax: false, minifyWhitespace: true, treeShaking: true }) diff --git a/packages/vite/src/node/plugins/css.ts b/packages/vite/src/node/plugins/css.ts index 01c72d0c24edcc..50a835e9ad707c 100644 --- a/packages/vite/src/node/plugins/css.ts +++ b/packages/vite/src/node/plugins/css.ts @@ -19,6 +19,7 @@ import type Sass from 'sass' import type Stylus from 'stylus' import type Less from 'less' import type { Alias } from 'types/alias' +import type { TransformOptions } from 'esbuild' import { formatMessages, transform } from 'esbuild' import type { RawSourceMap } from '@ampproject/remapping' import { getCodeWithSourcemap, injectSourcesContent } from '../server/sourcemap' @@ -55,6 +56,7 @@ import { publicFileToBuiltUrl, resolveAssetFileNames } from './asset' +import type { ESBuildOptions } from './esbuild' // const debug = createDebugger('vite:css') @@ -1211,8 +1213,8 @@ async function minifyCSS(css: string, config: ResolvedConfig) { try { const { code, warnings } = await transform(css, { loader: 'css', - minify: true, - target: config.build.cssTarget || undefined + target: config.build.cssTarget || undefined, + ...resolveEsbuildMinifyOptions(config.esbuild || {}) }) if (warnings.length) { const msgs = await formatMessages(warnings, { kind: 'warning' }) @@ -1231,6 +1233,24 @@ async function minifyCSS(css: string, config: ResolvedConfig) { } } +function resolveEsbuildMinifyOptions( + options: ESBuildOptions +): TransformOptions { + if ( + options.minifyIdentifiers != null || + options.minifySyntax != null || + options.minifyWhitespace != null + ) { + return { + minifyIdentifiers: options.minifyIdentifiers ?? true, + minifySyntax: options.minifySyntax ?? true, + minifyWhitespace: options.minifyWhitespace ?? true + } + } else { + return { minify: true } + } +} + export async function hoistAtRules(css: string): Promise { const s = new MagicString(css) const cleanCss = emptyCssComments(css) diff --git a/packages/vite/src/node/plugins/esbuild.ts b/packages/vite/src/node/plugins/esbuild.ts index ee1c36db651849..42e5bbac76316a 100644 --- a/packages/vite/src/node/plugins/esbuild.ts +++ b/packages/vite/src/node/plugins/esbuild.ts @@ -318,15 +318,17 @@ export function resolveEsbuildTranspileOptions( // If user enable fine-grain minify options, minify with their options instead if ( - options.minifyIdentifiers || - options.minifySyntax || - options.minifyWhitespace + options.minifyIdentifiers != null || + options.minifySyntax != null || + options.minifyWhitespace != null ) { if (isEsLibBuild) { // Disable minify whitespace as it breaks tree-shaking return { ...options, minify: false, + minifyIdentifiers: options.minifyIdentifiers ?? true, + minifySyntax: options.minifySyntax ?? true, minifyWhitespace: false, treeShaking: true } @@ -334,6 +336,9 @@ export function resolveEsbuildTranspileOptions( return { ...options, minify: false, + minifyIdentifiers: options.minifyIdentifiers ?? true, + minifySyntax: options.minifySyntax ?? true, + minifyWhitespace: options.minifyWhitespace ?? true, treeShaking: true } } diff --git a/playground/minify/__tests__/minify.spec.ts b/playground/minify/__tests__/minify.spec.ts new file mode 100644 index 00000000000000..b8d4e458e968b8 --- /dev/null +++ b/playground/minify/__tests__/minify.spec.ts @@ -0,0 +1,18 @@ +import fs from 'node:fs' +import path from 'node:path' +import { expect, test } from 'vitest' +import { isBuild, readFile, testDir } from '~utils' + +test.runIf(isBuild)('no minifySyntax', () => { + const assetsDir = path.resolve(testDir, 'dist/assets') + const files = fs.readdirSync(assetsDir) + + const jsFile = files.find((f) => f.endsWith('.js')) + const jsContent = readFile(path.resolve(assetsDir, jsFile)) + + const cssFile = files.find((f) => f.endsWith('.css')) + const cssContent = readFile(path.resolve(assetsDir, cssFile)) + + expect(jsContent).toContain('{console.log("hello world")}') + expect(cssContent).toContain('color:#ff0000') +}) diff --git a/playground/minify/index.html b/playground/minify/index.html new file mode 100644 index 00000000000000..1b599018cd92b6 --- /dev/null +++ b/playground/minify/index.html @@ -0,0 +1,3 @@ +

Minify

+ + diff --git a/playground/minify/main.js b/playground/minify/main.js new file mode 100644 index 00000000000000..e77c8a997b3314 --- /dev/null +++ b/playground/minify/main.js @@ -0,0 +1,5 @@ +import './test.css' + +if (window) { + console.log('hello world') +} diff --git a/playground/minify/package.json b/playground/minify/package.json new file mode 100644 index 00000000000000..e46abf8c4b218c --- /dev/null +++ b/playground/minify/package.json @@ -0,0 +1,11 @@ +{ + "name": "test-minify", + "private": true, + "version": "0.0.0", + "scripts": { + "dev": "vite", + "build": "vite build", + "debug": "node --inspect-brk ../../packages/vite/bin/vite", + "preview": "vite preview" + } +} diff --git a/playground/minify/test.css b/playground/minify/test.css new file mode 100644 index 00000000000000..dab6f886b3cf82 --- /dev/null +++ b/playground/minify/test.css @@ -0,0 +1,4 @@ +h1 { + /* do not minify as red text */ + color: #ff0000; +} diff --git a/playground/minify/vite.config.js b/playground/minify/vite.config.js new file mode 100644 index 00000000000000..43eca91a5c0f30 --- /dev/null +++ b/playground/minify/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' + +export default defineConfig({ + esbuild: { + minifySyntax: false + } +}) From 895a7d66bc93beaf18ebcbee23b00fda9ca4c33c Mon Sep 17 00:00:00 2001 From: patak Date: Mon, 27 Jun 2022 20:28:55 +0200 Subject: [PATCH 34/75] feat: experimental.renderBuiltUrl (revised build base options) (#8762) --- docs/guide/build.md | 49 ++--- packages/plugin-legacy/src/index.ts | 78 +++++--- packages/vite/src/node/build.ts | 180 ++++++++---------- packages/vite/src/node/config.ts | 57 ++---- packages/vite/src/node/index.ts | 6 +- packages/vite/src/node/plugins/asset.ts | 50 +++-- packages/vite/src/node/plugins/css.ts | 49 +++-- packages/vite/src/node/plugins/html.ts | 113 ++++++----- .../src/node/plugins/importAnalysisBuild.ts | 9 +- packages/vite/src/node/plugins/worker.ts | 57 +++--- playground/assets/package.json | 6 +- playground/assets/vite.config-runtime-base.js | 30 +-- playground/ssr-vue/vite.config.js | 78 +++++++- 13 files changed, 415 insertions(+), 347 deletions(-) diff --git a/docs/guide/build.md b/docs/guide/build.md index abf852479b6321..48d2f5a14ccf9c 100644 --- a/docs/guide/build.md +++ b/docs/guide/build.md @@ -197,45 +197,34 @@ A user may choose to deploy in three different paths: - The generated hashed assets (JS, CSS, and other file types like images) - The copied [public files](assets.md#the-public-directory) -A single static [base](#public-base-path) isn't enough in these scenarios. Vite provides experimental support for advanced base options during build, using `experimental.buildAdvancedBaseOptions`. +A single static [base](#public-base-path) isn't enough in these scenarios. Vite provides experimental support for advanced base options during build, using `experimental.renderBuiltUrl`. ```js - experimental: { - buildAdvancedBaseOptions: { - // Same as base: './' - // type: boolean, default: false - relative: true - // Static base - // type: string, default: undefined - url: 'https://cdn.domain.com/' - // Dynamic base to be used for paths inside JS - // type: (url: string) => string, default: undefined - runtime: (url: string) => `window.__toCdnUrl(${url})` - }, +experimental: { + renderBuiltUrl: (filename: string, { hostType: 'js' | 'css' | 'html' }) => { + if (hostType === 'js') { + return { runtime: `window.__toCdnUrl(${JSON.stringify(filename)})` } + } else { + return { relative: true } + } } +} ``` -When `runtime` is defined, it will be used for hashed assets and public files paths inside JS assets. Inside CSS and HTML generated files, paths will use `url` if defined or fallback to `config.base`. - -If `relative` is true and `url` is defined, relative paths will be prefered for assets inside the same group (for example a hashed image referenced from a JS file). And `url` will be used for the paths in HTML entries and for paths between different groups (a public file referenced from a CSS file). - -If the hashed assets and public files aren't deployed together, options for each group can be defined independently: +If the hashed assets and public files aren't deployed together, options for each group can be defined independently using asset `type` included in the third `context` param given to the function. ```js experimental: { - buildAdvancedBaseOptions: { - assets: { - relative: true - url: 'https://cdn.domain.com/assets', - runtime: (url: string) => `window.__assetsPath(${url})` - }, - public: { - relative: false - url: 'https://www.domain.com/', - runtime: (url: string) => `window.__publicPath + ${url}` + renderBuiltUrl(filename: string, { hostType: 'js' | 'css' | 'html', type: 'public' | 'asset' }) { + if (type === 'public') { + return 'https://www.domain.com/' + filename + } + else if (path.extname(importer) === '.js') { + return { runtime: `window.__assetsPath(${JSON.stringify(filename)})` } + } + else { + return 'https://cdn.domain.com/assets/' + filename } } } ``` - -Any option that isn't defined in the `public` or `assets` entry will be inherited from the main `buildAdvancedBaseOptions` config. diff --git a/packages/plugin-legacy/src/index.ts b/packages/plugin-legacy/src/index.ts index 0f0fa668c8a502..ca79a56f160146 100644 --- a/packages/plugin-legacy/src/index.ts +++ b/packages/plugin-legacy/src/index.ts @@ -6,7 +6,6 @@ import { fileURLToPath } from 'node:url' import { build, normalizePath } from 'vite' import MagicString from 'magic-string' import type { - BuildAdvancedBaseOptions, BuildOptions, HtmlTagDescriptor, Plugin, @@ -32,38 +31,71 @@ async function loadBabel() { return babel } -function getBaseInHTML( - urlRelativePath: string, - baseOptions: BuildAdvancedBaseOptions, - config: ResolvedConfig -) { +// Duplicated from build.ts in Vite Core, at least while the feature is experimental +// We should later expose this helper for other plugins to use +function toOutputFilePathInHtml( + filename: string, + type: 'asset' | 'public', + hostId: string, + hostType: 'js' | 'css' | 'html', + config: ResolvedConfig, + toRelative: (filename: string, importer: string) => string +): string { + const { renderBuiltUrl } = config.experimental + let relative = config.base === '' || config.base === './' + if (renderBuiltUrl) { + const result = renderBuiltUrl(filename, { + hostId, + hostType, + type, + ssr: !!config.build.ssr + }) + if (typeof result === 'object') { + if (result.runtime) { + throw new Error( + `{ runtime: "${result.runtime}" } is not supported for assets in ${hostType} files: ${filename}` + ) + } + if (typeof result.relative === 'boolean') { + relative = result.relative + } + } else if (result) { + return result + } + } + if (relative && !config.build.ssr) { + return toRelative(filename, hostId) + } else { + return config.base + filename + } +} +function getBaseInHTML(urlRelativePath: string, config: ResolvedConfig) { // Prefer explicit URL if defined for linking to assets and public files from HTML, // even when base relative is specified - return ( - baseOptions.url ?? - (baseOptions.relative - ? path.posix.join( - path.posix.relative(urlRelativePath, '').slice(0, -2), - './' - ) - : config.base) - ) + return config.base === './' || config.base === '' + ? path.posix.join( + path.posix.relative(urlRelativePath, '').slice(0, -2), + './' + ) + : config.base } -function getAssetsBase(urlRelativePath: string, config: ResolvedConfig) { - return getBaseInHTML( - urlRelativePath, - config.experimental.buildAdvancedBaseOptions.assets, - config - ) -} function toAssetPathFromHtml( filename: string, htmlPath: string, config: ResolvedConfig ): string { const relativeUrlPath = normalizePath(path.relative(config.root, htmlPath)) - return getAssetsBase(relativeUrlPath, config) + filename + const toRelative = (filename: string, hostId: string) => + getBaseInHTML(relativeUrlPath, config) + filename + return toOutputFilePathInHtml( + filename, + 'asset', + htmlPath, + 'html', + config, + toRelative + ) } // https://gist.github.com/samthor/64b114e4a4f539915a95b91ffd340acc diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index 52096a476f7391..2ae5c81dff0fd1 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -22,7 +22,7 @@ import type { RollupCommonJSOptions } from 'types/commonjs' import type { RollupDynamicImportVarsOptions } from 'types/dynamicImportVars' import type { TransformOptions } from 'esbuild' import type { InlineConfig, ResolvedConfig } from './config' -import { isDepsOptimizerEnabled, resolveBaseUrl, resolveConfig } from './config' +import { isDepsOptimizerEnabled, resolveConfig } from './config' import { buildReporterPlugin } from './plugins/reporter' import { buildEsbuildPlugin } from './plugins/esbuild' import { terserPlugin } from './plugins/terser' @@ -831,109 +831,89 @@ function injectSsrFlag>( return { ...(options ?? {}), ssr: true } as T & { ssr: boolean } } -/* - * If defined, these functions will be called for assets and public files - * paths which are generated in JS assets. Examples: - * - * assets: { runtime: (url: string) => `window.__assetsPath(${url})` } - * public: { runtime: (url: string) => `window.__publicPath + ${url}` } - * - * For assets and public files paths in CSS or HTML, the corresponding - * `assets.url` and `public.url` base urls or global base will be used. - * - * When using relative base, the assets.runtime function isn't needed as - * all the asset paths will be computed using import.meta.url - * The public.runtime function is still useful if the public files aren't - * deployed in the same base as the hashed assets - */ - -export interface BuildAdvancedBaseOptions { - /** - * Relative base. If true, every generated URL is relative and the dist folder - * can be deployed to any base or subdomain. Use this option when the base - * is unkown at build time - * @default false - */ - relative?: boolean - url?: string - runtime?: (filename: string) => string -} - -export type BuildAdvancedBaseConfig = BuildAdvancedBaseOptions & { - /** - * Base for assets and public files in case they should be different - */ - assets?: string | BuildAdvancedBaseOptions - public?: string | BuildAdvancedBaseOptions -} - -export type ResolvedBuildAdvancedBaseConfig = BuildAdvancedBaseOptions & { - assets: BuildAdvancedBaseOptions - public: BuildAdvancedBaseOptions -} - -/** - * Resolve base. Note that some users use Vite to build for non-web targets like - * electron or expects to deploy - */ -export function resolveBuildAdvancedBaseConfig( - baseConfig: BuildAdvancedBaseConfig | undefined, - resolvedBase: string, - isBuild: boolean, - logger: Logger -): ResolvedBuildAdvancedBaseConfig { - baseConfig ??= {} - - const relativeBaseShortcut = resolvedBase === '' || resolvedBase === './' - - const resolved = { - relative: baseConfig?.relative ?? relativeBaseShortcut, - url: baseConfig?.url - ? resolveBaseUrl( - baseConfig?.url, - isBuild, - logger, - 'experimental.buildAdvancedBaseOptions.url' - ) - : undefined, - runtime: baseConfig?.runtime +export type RenderBuiltAssetUrl = ( + filename: string, + type: { + type: 'asset' | 'public' + hostId: string + hostType: 'js' | 'css' | 'html' + ssr: boolean + } +) => string | { relative?: boolean; runtime?: string } | undefined + +export function toOutputFilePathInString( + filename: string, + type: 'asset' | 'public', + hostId: string, + hostType: 'js' | 'css' | 'html', + config: ResolvedConfig, + toRelative: ( + filename: string, + hostType: string + ) => string | { runtime: string } +): string | { runtime: string } { + const { renderBuiltUrl } = config.experimental + let relative = config.base === '' || config.base === './' + if (renderBuiltUrl) { + const result = renderBuiltUrl(filename, { + hostId, + hostType, + type, + ssr: !!config.build.ssr + }) + if (typeof result === 'object') { + if (result.runtime) { + return { runtime: result.runtime } + } + if (typeof result.relative === 'boolean') { + relative = result.relative + } + } else if (result) { + return result + } } - - return { - ...resolved, - assets: resolveBuildBaseSpecificOptions( - baseConfig?.assets, - resolved, - isBuild, - logger, - 'assets' - ), - public: resolveBuildBaseSpecificOptions( - baseConfig?.public, - resolved, - isBuild, - logger, - 'public' - ) + if (relative && !config.build.ssr) { + return toRelative(filename, hostId) } + return config.base + filename } -function resolveBuildBaseSpecificOptions( - options: BuildAdvancedBaseOptions | string | undefined, - parent: BuildAdvancedBaseOptions, - isBuild: boolean, - logger: Logger, - optionName: string -): BuildAdvancedBaseOptions { - const urlConfigPath = `experimental.buildAdvancedBaseOptions.${optionName}.url` - if (typeof options === 'string') { - options = { url: options } +export function toOutputFilePathWithoutRuntime( + filename: string, + type: 'asset' | 'public', + hostId: string, + hostType: 'js' | 'css' | 'html', + config: ResolvedConfig, + toRelative: (filename: string, hostId: string) => string +): string { + const { renderBuiltUrl } = config.experimental + let relative = config.base === '' || config.base === './' + if (renderBuiltUrl) { + const result = renderBuiltUrl(filename, { + hostId, + hostType, + type, + ssr: !!config.build.ssr + }) + if (typeof result === 'object') { + if (result.runtime) { + throw new Error( + `{ runtime: "${result.runtime} }" is not supported for assets in ${hostType} files: ${filename}` + ) + } + if (typeof result.relative === 'boolean') { + relative = result.relative + } + } else if (result) { + return result + } } - return { - relative: options?.relative ?? parent.relative, - url: options?.url - ? resolveBaseUrl(options?.url, isBuild, logger, urlConfigPath) - : parent.url, - runtime: options?.runtime ?? parent.runtime + if (relative && !config.build.ssr) { + return toRelative(filename, hostId) + } else { + return config.base + filename } } + +export const toOutputFilePathInCss = toOutputFilePathWithoutRuntime +export const toOutputFilePathInHtml = toOutputFilePathWithoutRuntime diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 1e7b9583a618ea..38da3cf5503768 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -11,12 +11,11 @@ import type { Plugin as ESBuildPlugin } from 'esbuild' import type { RollupOptions } from 'rollup' import type { Plugin } from './plugin' import type { - BuildAdvancedBaseConfig, BuildOptions, - ResolvedBuildAdvancedBaseConfig, + RenderBuiltAssetUrl, ResolvedBuildOptions } from './build' -import { resolveBuildAdvancedBaseConfig, resolveBuildOptions } from './build' +import { resolveBuildOptions } from './build' import type { ResolvedServerOptions, ServerOptions } from './server' import { resolveServerOptions } from './server' import type { PreviewOptions, ResolvedPreviewOptions } from './preview' @@ -59,7 +58,7 @@ import { resolveSSROptions } from './ssr' const debug = createDebugger('vite:config') -export type { BuildAdvancedBaseOptions, BuildAdvancedBaseConfig } from './build' +export type { RenderBuiltAssetUrl } from './build' // NOTE: every export in this file is re-exported from ./index.ts so it will // be part of the public API. @@ -262,11 +261,11 @@ export interface ExperimentalOptions { */ importGlobRestoreExtension?: boolean /** - * Build advanced base options. Allow finegrain contol over assets and public files base + * Allow finegrain contol over assets and public files paths * * @experimental */ - buildAdvancedBaseOptions?: BuildAdvancedBaseConfig + renderBuiltUrl?: RenderBuiltAssetUrl /** * Enables support of HMR partial accept via `import.meta.hot.acceptExports`. * @@ -276,10 +275,6 @@ export interface ExperimentalOptions { hmrPartialAccept?: boolean } -export type ResolvedExperimentalOptions = Required & { - buildAdvancedBaseOptions: ResolvedBuildAdvancedBaseConfig -} - export interface LegacyOptions { /** * Revert vite dev to the v2.9 strategy. Enable esbuild based deps scanner. @@ -351,7 +346,7 @@ export type ResolvedConfig = Readonly< packageCache: PackageCache worker: ResolveWorkerOptions appType: AppType - experimental: ResolvedExperimentalOptions + experimental: ExperimentalOptions } > @@ -493,28 +488,12 @@ export async function resolveConfig( // During dev, we ignore relative base and fallback to '/' // For the SSR build, relative base isn't possible by means - // of import.meta.url. The user will be able to work out a setup - // using experimental.buildAdvancedBaseOptions - const base = - relativeBaseShortcut && (!isBuild || config.build?.ssr) + // of import.meta.url. + const resolvedBase = relativeBaseShortcut + ? !isBuild || config.build?.ssr ? '/' - : config.base ?? '/' - let resolvedBase = relativeBaseShortcut - ? base - : resolveBaseUrl(base, isBuild, logger, 'base') - if ( - config.experimental?.buildAdvancedBaseOptions?.relative && - config.base === undefined - ) { - resolvedBase = './' - } - - const resolvedBuildAdvancedBaseOptions = resolveBuildAdvancedBaseConfig( - config.experimental?.buildAdvancedBaseOptions, - resolvedBase, - isBuild, - logger - ) + : './' + : resolveBaseUrl(config.base, isBuild, logger) ?? '/' const resolvedBuildOptions = resolveBuildOptions( config.build, @@ -650,8 +629,7 @@ export async function resolveConfig( experimental: { importGlobRestoreExtension: false, hmrPartialAccept: false, - ...config.experimental, - buildAdvancedBaseOptions: resolvedBuildAdvancedBaseOptions + ...config.experimental } } @@ -759,14 +737,13 @@ assetFileNames isn't equal for every build.rollupOptions.output. A single patter export function resolveBaseUrl( base: UserConfig['base'] = '/', isBuild: boolean, - logger: Logger, - optionName: string + logger: Logger ): string { if (base.startsWith('.')) { logger.warn( colors.yellow( colors.bold( - `(!) invalid "${optionName}" option: ${base}. The value can only be an absolute ` + + `(!) invalid "base" option: ${base}. The value can only be an absolute ` + `URL, ./, or an empty string.` ) ) @@ -786,7 +763,7 @@ export function resolveBaseUrl( if (!base.startsWith('/')) { logger.warn( colors.yellow( - colors.bold(`(!) "${optionName}" option should start with a slash.`) + colors.bold(`(!) "base" option should start with a slash.`) ) ) base = '/' + base @@ -796,9 +773,7 @@ export function resolveBaseUrl( // ensure ending slash if (!base.endsWith('/')) { logger.warn( - colors.yellow( - colors.bold(`(!) "${optionName}" option should end with a slash.`) - ) + colors.yellow(colors.bold(`(!) "base" option should end with a slash.`)) ) base += '/' } diff --git a/packages/vite/src/node/index.ts b/packages/vite/src/node/index.ts index 4655b4881b7650..e1a9de026ffc1e 100644 --- a/packages/vite/src/node/index.ts +++ b/packages/vite/src/node/index.ts @@ -23,10 +23,8 @@ export type { BuildOptions, LibraryOptions, LibraryFormats, - ResolvedBuildOptions, - BuildAdvancedBaseConfig, - ResolvedBuildAdvancedBaseConfig, - BuildAdvancedBaseOptions + RenderBuiltAssetUrl, + ResolvedBuildOptions } from './build' export type { PreviewOptions, diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index ec8ec66ff0dd21..0403009d4b69c4 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -4,7 +4,7 @@ import fs, { promises as fsp } from 'node:fs' import * as mrmime from 'mrmime' import type { OutputOptions, PluginContext, PreRenderedAsset } from 'rollup' import MagicString from 'magic-string' -import type { BuildAdvancedBaseOptions } from '../build' +import { toOutputFilePathInString } from '../build' import type { Plugin } from '../plugin' import type { ResolvedConfig } from '../config' import { cleanUrl, getHash, normalizePath } from '../utils' @@ -94,20 +94,12 @@ export function assetPlugin(config: ResolvedConfig): Plugin { let match: RegExpExecArray | null let s: MagicString | undefined - const absoluteUrlPathInterpolation = (filename: string) => - `"+new URL(${JSON.stringify( - path.posix.relative(path.dirname(chunk.fileName), filename) - )},import.meta.url).href+"` - - const toOutputFilePathInString = ( - filename: string, - base: BuildAdvancedBaseOptions - ) => { - return base.runtime - ? `"+${base.runtime(JSON.stringify(filename))}+"` - : base.relative && !config.build.ssr - ? absoluteUrlPathInterpolation(filename) - : JSON.stringify((base.url ?? config.base) + filename).slice(1, -1) + const toRelative = (filename: string, importer: string) => { + return { + runtime: `new URL(${JSON.stringify( + path.posix.relative(path.dirname(importer), filename) + )},import.meta.url).href` + } } // Urls added with JS using e.g. @@ -128,9 +120,17 @@ export function assetPlugin(config: ResolvedConfig): Plugin { const filename = file + postfix const replacement = toOutputFilePathInString( filename, - config.experimental.buildAdvancedBaseOptions.assets + 'asset', + chunk.fileName, + 'js', + config, + toRelative ) - s.overwrite(match.index, match.index + full.length, replacement, { + const replacementString = + typeof replacement === 'string' + ? JSON.stringify(replacement).slice(1, -1) + : `"+${replacement.runtime}+"` + s.overwrite(match.index, match.index + full.length, replacementString, { contentOnly: true }) } @@ -144,9 +144,17 @@ export function assetPlugin(config: ResolvedConfig): Plugin { const publicUrl = publicAssetUrlMap.get(hash)!.slice(1) const replacement = toOutputFilePathInString( publicUrl, - config.experimental.buildAdvancedBaseOptions.public + 'public', + chunk.fileName, + 'js', + config, + toRelative ) - s.overwrite(match.index, match.index + full.length, replacement, { + const replacementString = + typeof replacement === 'string' + ? JSON.stringify(replacement).slice(1, -1) + : `"+${replacement.runtime}+"` + s.overwrite(match.index, match.index + full.length, replacementString, { contentOnly: true }) } @@ -341,7 +349,7 @@ export function publicFileToBuiltUrl( config: ResolvedConfig ): string { if (config.command !== 'build') { - // We don't need relative base or buildAdvancedBaseOptions support during dev + // We don't need relative base or renderBuiltUrl support during dev return config.base + url.slice(1) } const hash = getHash(url) @@ -423,7 +431,7 @@ async function fileToBuiltUrl( emittedSet.add(contentHash) } - url = `__VITE_ASSET__${contentHash}__${postfix ? `$_${postfix}__` : ``}` + url = `__VITE_ASSET__${contentHash}__${postfix ? `$_${postfix}__` : ``}` // TODO_BASE } cache.set(id, url) diff --git a/packages/vite/src/node/plugins/css.ts b/packages/vite/src/node/plugins/css.ts index 50a835e9ad707c..f7e56a0ab123de 100644 --- a/packages/vite/src/node/plugins/css.ts +++ b/packages/vite/src/node/plugins/css.ts @@ -25,6 +25,7 @@ import type { RawSourceMap } from '@ampproject/remapping' import { getCodeWithSourcemap, injectSourcesContent } from '../server/sourcemap' import type { ModuleNode } from '../server/moduleGraph' import type { ResolveFn, ViteDevServer } from '../' +import { toOutputFilePathInCss } from '../build' import { CLIENT_PUBLIC_PATH, SPECIAL_QUERY_RE } from '../constants' import type { ResolvedConfig } from '../config' import type { Plugin } from '../plugin' @@ -464,27 +465,33 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin { // resolve asset URL placeholders to their built file URLs function resolveAssetUrlsInCss(chunkCSS: string, cssAssetName: string) { const encodedPublicUrls = encodePublicUrlsInCSS(config) - const { assets: assetsBase, public: publicBase } = - config.experimental.buildAdvancedBaseOptions + + const relative = config.base === './' || config.base === '' const cssAssetDirname = - encodedPublicUrls || assetsBase.relative + encodedPublicUrls || relative ? getCssAssetDirname(cssAssetName) : undefined + const toRelative = (filename: string, importer: string) => { + // relative base + extracted CSS + const relativePath = path.posix.relative(cssAssetDirname!, filename) + return relativePath.startsWith('.') + ? relativePath + : './' + relativePath + } + // replace asset url references with resolved url. chunkCSS = chunkCSS.replace(assetUrlRE, (_, fileHash, postfix = '') => { const filename = getAssetFilename(fileHash, config) + postfix chunk.viteMetadata.importedAssets.add(cleanUrl(filename)) - if (assetsBase.relative && !config.build.ssr) { - // relative base + extracted CSS - const relativePath = path.posix.relative(cssAssetDirname!, filename) - return relativePath.startsWith('.') - ? relativePath - : './' + relativePath - } else { - // assetsBase.runtime has no effect for assets in CSS - return (assetsBase.url ?? config.base) + filename - } + return toOutputFilePathInCss( + filename, + 'asset', + cssAssetName, + 'css', + config, + toRelative + ) }) // resolve public URL from CSS paths if (encodedPublicUrls) { @@ -493,13 +500,15 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin { '' ) chunkCSS = chunkCSS.replace(publicAssetUrlRE, (_, hash) => { - const publicUrl = publicAssetUrlMap.get(hash)! - if (publicBase.relative && !config.build.ssr) { - return relativePathToPublicFromCSS + publicUrl - } else { - // publicBase.runtime has no effect for assets in CSS - return (publicBase.url ?? config.base) + publicUrl.slice(1) - } + const publicUrl = publicAssetUrlMap.get(hash)!.slice(1) + return toOutputFilePathInCss( + publicUrl, + 'public', + cssAssetName, + 'css', + config, + () => `${relativePathToPublicFromCSS}/${publicUrl}` + ) }) } return chunkCSS diff --git a/packages/vite/src/node/plugins/html.ts b/packages/vite/src/node/plugins/html.ts index 9473afc19bff8e..5287e6e5208ab5 100644 --- a/packages/vite/src/node/plugins/html.ts +++ b/packages/vite/src/node/plugins/html.ts @@ -29,7 +29,7 @@ import { slash } from '../utils' import type { ResolvedConfig } from '../config' -import type { BuildAdvancedBaseOptions } from '../build' +import { toOutputFilePathInHtml } from '../build' import { assetUrlRE, checkPublicFile, @@ -239,7 +239,19 @@ export function buildHtmlPlugin(config: ResolvedConfig): Plugin { if (id.endsWith('.html')) { const relativeUrlPath = slash(path.relative(config.root, id)) const publicPath = `/${relativeUrlPath}` - const publicBase = getPublicBase(relativeUrlPath, config) + const publicBase = getBaseInHTML(relativeUrlPath, config) + + const publicToRelative = (filename: string, importer: string) => + publicBase + filename + const toOutputPublicFilePath = (url: string) => + toOutputFilePathInHtml( + url.slice(1), + 'public', + relativeUrlPath, + 'html', + config, + publicToRelative + ) // pre-transform html = await applyHtmlTransforms(html, preHooks, { @@ -276,7 +288,7 @@ export function buildHtmlPlugin(config: ResolvedConfig): Plugin { s.overwrite( src!.value!.loc.start.offset, src!.value!.loc.end.offset, - `"${normalizePublicPath(url, publicBase)}"`, + `"${toOutputPublicFilePath(url)}"`, { contentOnly: true } ) } @@ -358,7 +370,7 @@ export function buildHtmlPlugin(config: ResolvedConfig): Plugin { s.overwrite( p.value.loc.start.offset, p.value.loc.end.offset, - `"${normalizePublicPath(url, publicBase)}"`, + `"${toOutputPublicFilePath(url)}"`, { contentOnly: true } ) } @@ -474,7 +486,7 @@ export function buildHtmlPlugin(config: ResolvedConfig): Plugin { { contentOnly: true } ) } else if (checkPublicFile(url, config)) { - s.overwrite(start, end, normalizePublicPath(url, publicBase), { + s.overwrite(start, end, toOutputPublicFilePath(url), { contentOnly: true }) } @@ -535,7 +547,7 @@ export function buildHtmlPlugin(config: ResolvedConfig): Plugin { const toScriptTag = ( chunk: OutputChunk, - assetsBase: string, + toOutputPath: (filename: string) => string, isAsync: boolean ): HtmlTagDescriptor => ({ tag: 'script', @@ -543,25 +555,25 @@ export function buildHtmlPlugin(config: ResolvedConfig): Plugin { ...(isAsync ? { async: true } : {}), type: 'module', crossorigin: true, - src: toPublicPath(chunk.fileName, assetsBase) + src: toOutputPath(chunk.fileName) } }) const toPreloadTag = ( chunk: OutputChunk, - assetsBase: string + toOutputPath: (filename: string) => string ): HtmlTagDescriptor => ({ tag: 'link', attrs: { rel: 'modulepreload', crossorigin: true, - href: toPublicPath(chunk.fileName, assetsBase) + href: toOutputPath(chunk.fileName) } }) const getCssTagsForChunk = ( chunk: OutputChunk, - assetsBase: string, + toOutputPath: (filename: string) => string, seen: Set = new Set() ): HtmlTagDescriptor[] => { const tags: HtmlTagDescriptor[] = [] @@ -570,7 +582,7 @@ export function buildHtmlPlugin(config: ResolvedConfig): Plugin { chunk.imports.forEach((file) => { const importee = bundle[file] if (importee?.type === 'chunk') { - tags.push(...getCssTagsForChunk(importee, assetsBase, seen)) + tags.push(...getCssTagsForChunk(importee, toOutputPath, seen)) } }) } @@ -582,7 +594,7 @@ export function buildHtmlPlugin(config: ResolvedConfig): Plugin { tag: 'link', attrs: { rel: 'stylesheet', - href: toPublicPath(file, assetsBase) + href: toOutputPath(file) } }) } @@ -593,7 +605,21 @@ export function buildHtmlPlugin(config: ResolvedConfig): Plugin { for (const [id, html] of processedHtml) { const relativeUrlPath = path.posix.relative(config.root, id) - const assetsBase = getAssetsBase(relativeUrlPath, config) + const assetsBase = getBaseInHTML(relativeUrlPath, config) + const toOutputAssetFilePath = (filename: string) => { + if (isExternalUrl(filename)) { + return filename + } else { + return toOutputFilePathInHtml( + filename, + 'asset', + relativeUrlPath, + 'html', + config, + (filename: string, importer: string) => assetsBase + filename + ) + } + } const isAsync = isAsyncScriptMap.get(config)!.get(id)! @@ -622,13 +648,15 @@ export function buildHtmlPlugin(config: ResolvedConfig): Plugin { // when inlined, discard entry chunk and inject diff --git a/playground/css/main.js b/playground/css/main.js index 90f74c96793c55..c39feaa64af167 100644 --- a/playground/css/main.js +++ b/playground/css/main.js @@ -92,3 +92,10 @@ text('.imported-css-globEager', JSON.stringify(globEager, null, 2)) import postcssSourceInput from './postcss-source-input.css?query=foo' text('.postcss-source-input', postcssSourceInput) + +import aliasContent from '#alias' +text('.aliased-content', aliasContent) +import aliasModule from '#alias-module' +document + .querySelector('.aliased-module') + .classList.add(aliasModule.aliasedModule) diff --git a/playground/css/vite.config.js b/playground/css/vite.config.js index 639a1302debb88..c501213b47cded 100644 --- a/playground/css/vite.config.js +++ b/playground/css/vite.config.js @@ -10,7 +10,9 @@ module.exports = { resolve: { alias: { '@': __dirname, - spacefolder: __dirname + '/folder with space' + spacefolder: __dirname + '/folder with space', + '#alias': __dirname + '/aliased/foo.css', + '#alias-module': __dirname + '/aliased/bar.module.css' } }, css: { From 24a9469cc290b691b0f0057cd713fdb637b4dbd5 Mon Sep 17 00:00:00 2001 From: sapphi-red Date: Fri, 1 Jul 2022 12:17:19 +0900 Subject: [PATCH 58/75] test: add #8461 test case --- playground/css/__tests__/css.spec.ts | 5 +++++ playground/css/css-js-dep/bar.module.css | 3 +++ playground/css/css-js-dep/foo.css | 3 +++ playground/css/css-js-dep/index.js | 4 ++++ playground/css/css-js-dep/package.json | 7 +++++++ playground/css/index.html | 7 +++++++ playground/css/main.js | 5 +++++ playground/css/package.json | 1 + pnpm-lock.yaml | 16 +++++++++++++++- 9 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 playground/css/css-js-dep/bar.module.css create mode 100644 playground/css/css-js-dep/foo.css create mode 100644 playground/css/css-js-dep/index.js create mode 100644 playground/css/css-js-dep/package.json diff --git a/playground/css/__tests__/css.spec.ts b/playground/css/__tests__/css.spec.ts index 2cd70ea0ddba1b..3c9f5fc4ea9b0a 100644 --- a/playground/css/__tests__/css.spec.ts +++ b/playground/css/__tests__/css.spec.ts @@ -349,6 +349,11 @@ test('PostCSS dir-dependency', async () => { } }) +test('import dependency includes css import', async () => { + expect(await getColor('.css-js-dep')).toBe('green') + expect(await getColor('.css-js-dep-module')).toBe('green') +}) + test('URL separation', async () => { const urlSeparated = await page.$('.url-separated') const baseUrl = 'url(images/dog.webp)' diff --git a/playground/css/css-js-dep/bar.module.css b/playground/css/css-js-dep/bar.module.css new file mode 100644 index 00000000000000..9d62f66761fa3d --- /dev/null +++ b/playground/css/css-js-dep/bar.module.css @@ -0,0 +1,3 @@ +.cssJsDepModule { + color: green; +} diff --git a/playground/css/css-js-dep/foo.css b/playground/css/css-js-dep/foo.css new file mode 100644 index 00000000000000..515ee7693bff3f --- /dev/null +++ b/playground/css/css-js-dep/foo.css @@ -0,0 +1,3 @@ +.css-js-dep { + color: green; +} diff --git a/playground/css/css-js-dep/index.js b/playground/css/css-js-dep/index.js new file mode 100644 index 00000000000000..853094b806fa97 --- /dev/null +++ b/playground/css/css-js-dep/index.js @@ -0,0 +1,4 @@ +import './foo.css' +import barModuleClasses from './bar.module.css' + +export { barModuleClasses } diff --git a/playground/css/css-js-dep/package.json b/playground/css/css-js-dep/package.json new file mode 100644 index 00000000000000..d762f6566fdbdc --- /dev/null +++ b/playground/css/css-js-dep/package.json @@ -0,0 +1,7 @@ +{ + "name": "css-js-dep", + "private": true, + "type": "module", + "version": "1.0.0", + "main": "index.js" +} diff --git a/playground/css/index.html b/playground/css/index.html index a2ff46a70f78a9..7e591ee25f0a5b 100644 --- a/playground/css/index.html +++ b/playground/css/index.html @@ -117,6 +117,13 @@

CSS

PostCSS dir-dependency (file 3): this should be grey too

+

+ import dependency includes 'import "./foo.css"': this should be green +

+

+ import dependency includes 'import "./bar.module.css"': this should be green +

+

URL separation preservation: should have valid background-image

diff --git a/playground/css/main.js b/playground/css/main.js index c39feaa64af167..c9384b6a79013c 100644 --- a/playground/css/main.js +++ b/playground/css/main.js @@ -47,6 +47,11 @@ text('.charset-css', charset) import './dep.css' import './glob-dep.css' +import { barModuleClasses } from 'css-js-dep' +document + .querySelector('.css-js-dep-module') + .classList.add(barModuleClasses.cssJsDepModule) + function text(el, text) { document.querySelector(el).textContent = text } diff --git a/playground/css/package.json b/playground/css/package.json index 03c4964f0284ea..11dc33c48f7aa2 100644 --- a/playground/css/package.json +++ b/playground/css/package.json @@ -13,6 +13,7 @@ }, "devDependencies": { "css-dep": "link:./css-dep", + "css-js-dep": "file:./css-js-dep", "fast-glob": "^3.2.11", "less": "^4.1.3", "postcss-nested": "^5.0.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 67f75f4da8630d..790ac42ccd2b7e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -377,6 +377,7 @@ importers: playground/css: specifiers: css-dep: link:./css-dep + css-js-dep: file:./css-js-dep fast-glob: ^3.2.11 less: ^4.1.3 postcss-nested: ^5.0.6 @@ -384,6 +385,7 @@ importers: stylus: ^0.58.1 devDependencies: css-dep: link:css-dep + css-js-dep: file:playground/css/css-js-dep fast-glob: 3.2.11 less: 4.1.3 postcss-nested: 5.0.6 @@ -411,6 +413,9 @@ importers: playground/css/css-dep: specifiers: {} + playground/css/css-js-dep: + specifiers: {} + playground/css/pkg-dep: specifiers: {} @@ -708,6 +713,9 @@ importers: playground/optimize-deps/nested-include: specifiers: {} + playground/optimize-deps/non-optimizable-include: + specifiers: {} + playground/optimize-missing-deps: specifiers: express: ^4.18.1 @@ -8709,6 +8717,12 @@ packages: version: 0.0.0 dev: false + file:playground/css/css-js-dep: + resolution: {directory: playground/css/css-js-dep, type: directory} + name: css-js-dep + version: 1.0.0 + dev: true + file:playground/define/commonjs-dep: resolution: {directory: playground/define/commonjs-dep, type: directory} name: commonjs-dep @@ -8877,7 +8891,7 @@ packages: file:playground/ssr-deps/no-external-css: resolution: {directory: playground/ssr-deps/no-external-css, type: directory} - name: primitive-export-css + name: no-external-css version: 0.0.0 dev: false From 1748fe9a3b79c16f6320471a2b04c8806f302f65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0=20/=20green?= Date: Fri, 1 Jul 2022 15:35:55 +0900 Subject: [PATCH 59/75] test: fix flaky glob test (#8875) --- playground/glob-import/__tests__/glob-import.spec.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/playground/glob-import/__tests__/glob-import.spec.ts b/playground/glob-import/__tests__/glob-import.spec.ts index 70f7ec252280a9..a7297511ea4649 100644 --- a/playground/glob-import/__tests__/glob-import.spec.ts +++ b/playground/glob-import/__tests__/glob-import.spec.ts @@ -81,11 +81,15 @@ const relativeRawResult = { } test('should work', async () => { - expect(await page.textContent('.result')).toBe( - JSON.stringify(allResult, null, 2) + await untilUpdated( + () => page.textContent('.result'), + JSON.stringify(allResult, null, 2), + true ) - expect(await page.textContent('.result-node_modules')).toBe( - JSON.stringify(nodeModulesResult, null, 2) + await untilUpdated( + () => page.textContent('.result-node_modules'), + JSON.stringify(nodeModulesResult, null, 2), + true ) }) From cad27ee8c00bbd5aeeb2be9bfb3eb164c1b77885 Mon Sep 17 00:00:00 2001 From: patak Date: Fri, 1 Jul 2022 09:23:08 +0200 Subject: [PATCH 60/75] docs: simplify Snowpack comparison (#8871) --- docs/guide/comparisons.md | 42 +++++++-------------------------------- 1 file changed, 7 insertions(+), 35 deletions(-) diff --git a/docs/guide/comparisons.md b/docs/guide/comparisons.md index 1e849f88a71a68..e582a8d389d0fb 100644 --- a/docs/guide/comparisons.md +++ b/docs/guide/comparisons.md @@ -1,38 +1,4 @@ -# Comparisons with Other No-Bundler Solutions - -## Snowpack - -[Snowpack](https://www.snowpack.dev/) is also a no-bundle native ESM dev server that is very similar in scope to Vite. Aside from different implementation details, the two projects share a lot in terms of technical advantages over traditional tooling. Vite's dependency pre-bundling is also inspired by Snowpack v1 (now [`esinstall`](https://github.com/snowpackjs/snowpack/tree/main/esinstall)). Some of the main differences between the two projects are: - -**Production Build** - -Snowpack's default build output is unbundled: it transforms each file into separate built modules, which can then be fed into different "optimizers" that perform the actual bundling. The benefit of this is that you can choose between different end-bundlers to fit specific needs (e.g. webpack, Rollup, or even esbuild), the downside is that it's a bit of a fragmented experience - for example, the esbuild optimizer is still unstable, the Rollup optimizer is not officially maintained, and different optimizers have different output and configurations. - -Vite opts to have a deeper integration with one single bundler (Rollup) in order to provide a more streamlined experience. It also allows Vite to support a [Universal Plugin API](./api-plugin) that works for both dev and build. - -Due to a more integrated build process, Vite supports a wide range of features that are currently not available in Snowpack build optimizers: - -- [Multi-Page Support](./build#multi-page-app) -- [Library Mode](./build#library-mode) -- [Automatic CSS code-splitting](./features#css-code-splitting) -- [Optimized async chunk loading](./features#async-chunk-loading-optimization) -- Official [legacy mode plugin](https://github.com/vitejs/vite/tree/main/packages/plugin-legacy) that generates dual modern/legacy bundles and auto delivers the right bundle based on browser support. - -**Faster Dependency Pre-Bundling** - -Vite uses [esbuild](https://esbuild.github.io/) instead of Rollup for dependency pre-bundling. This results in significant performance improvements in terms of cold server start and re-bundling on dependency invalidations. - -**Monorepo Support** - -Vite is designed to handle monorepo setups and we have users successfully using it with Yarn, Yarn 2, and PNPM based monorepos. - -**CSS Pre-Processor Support** - -Vite provides more refined support for Sass and Less, including improved `@import` resolution (aliases and npm dependencies) and [automatic `url()` rebasing for inlined files](./features#import-inlining-and-rebasing). - -**First Class Vue Support** - -Vite was initially created to serve as the future foundation of [Vue.js](https://vuejs.org/) tooling. Although as of 2.0 Vite is now fully framework-agnostic, the official Vue plugin still provides first-class support for Vue's Single File Component format, covering all advanced features such as template asset reference resolving, ` diff --git a/playground/alias/package.json b/playground/alias/package.json index ee345bf1f9ce13..4b49ca8d346ebf 100644 --- a/playground/alias/package.json +++ b/playground/alias/package.json @@ -10,7 +10,8 @@ }, "dependencies": { "aliased-module": "file:./dir/module", - "vue": "^3.2.37" + "vue": "^3.2.37", + "@vue/shared": "^3.2.37" }, "devDependencies": { "resolve-linked": "workspace:*" diff --git a/playground/alias/vite.config.js b/playground/alias/vite.config.js index 530fe86a3de2cb..634871877a0f56 100644 --- a/playground/alias/vite.config.js +++ b/playground/alias/vite.config.js @@ -16,6 +16,11 @@ module.exports = { { find: '/@', replacement: path.resolve(__dirname, 'dir') }, // aliasing an optimized dep { find: 'vue', replacement: 'vue/dist/vue.esm-bundler.js' }, + // aliasing an optimized dep to absolute URL + { + find: '@vue/shared', + replacement: require.resolve('@vue/shared/dist/shared.cjs.prod.js') + }, // aliasing one unoptimized dep to an optimized dep { find: 'foo', replacement: 'vue' }, { diff --git a/playground/css-sourcemap/__tests__/build.spec.ts b/playground/css-sourcemap/__tests__/build.spec.ts deleted file mode 100644 index b30284731a76d9..00000000000000 --- a/playground/css-sourcemap/__tests__/build.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { isBuild, serverLogs } from '~utils' - -test.runIf(isBuild)('should not output sourcemap warning (#4939)', () => { - serverLogs.forEach((log) => { - expect(log).not.toMatch('Sourcemap is likely to be incorrect') - }) -}) diff --git a/playground/css-sourcemap/__tests__/css-sourcemap.spec.ts b/playground/css-sourcemap/__tests__/css-sourcemap.spec.ts new file mode 100644 index 00000000000000..f63ef8946eba40 --- /dev/null +++ b/playground/css-sourcemap/__tests__/css-sourcemap.spec.ts @@ -0,0 +1,443 @@ +import { URL } from 'node:url' +import { + extractSourcemap, + formatSourcemapForSnapshot, + isBuild, + isServe, + page, + serverLogs +} from '~utils' + +test.runIf(isBuild)('should not output sourcemap warning (#4939)', () => { + serverLogs.forEach((log) => { + expect(log).not.toMatch('Sourcemap is likely to be incorrect') + }) +}) + +describe.runIf(isServe)('serve', () => { + const getStyleTagContentIncluding = async (content: string) => { + const styles = await page.$$('style') + for (const style of styles) { + const text = await style.textContent() + if (text.includes(content)) { + return text + } + } + throw new Error('Not found') + } + + test('linked css', async () => { + const res = await page.request.get( + new URL('./linked.css', page.url()).href, + { + headers: { + accept: 'text/css' + } + } + ) + const css = await res.text() + const map = extractSourcemap(css) + expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` + { + "mappings": "AAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACT,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACb,CAAC;", + "sources": [ + "/root/linked.css", + ], + "sourcesContent": [ + ".linked { + color: red; + } + ", + ], + "version": 3, + } + `) + }) + + test('linked css with import', async () => { + const res = await page.request.get( + new URL('./linked-with-import.css', page.url()).href, + { + headers: { + accept: 'text/css' + } + } + ) + const css = await res.text() + const map = extractSourcemap(css) + expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` + { + "mappings": "AAAA;EACE,UAAU;AACZ;;ACAA;EACE,UAAU;AACZ", + "sources": [ + "/root/be-imported.css", + "/root/linked-with-import.css", + ], + "sourcesContent": [ + ".be-imported { + color: red; + } + ", + "@import '@/be-imported.css'; + + .linked-with-import { + color: red; + } + ", + ], + "version": 3, + } + `) + }) + + test('imported css', async () => { + const css = await getStyleTagContentIncluding('.imported ') + const map = extractSourcemap(css) + expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` + { + "mappings": "AAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACX,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACb,CAAC;", + "sources": [ + "/root/imported.css", + ], + "sourcesContent": [ + ".imported { + color: red; + } + ", + ], + "version": 3, + } + `) + }) + + test('imported css with import', async () => { + const css = await getStyleTagContentIncluding('.imported-with-import ') + const map = extractSourcemap(css) + expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` + { + "mappings": "AAAA;EACE,UAAU;AACZ;;ACAA;EACE,UAAU;AACZ", + "sources": [ + "/root/be-imported.css", + "/root/imported-with-import.css", + ], + "sourcesContent": [ + ".be-imported { + color: red; + } + ", + "@import '@/be-imported.css'; + + .imported-with-import { + color: red; + } + ", + ], + "version": 3, + } + `) + }) + + test('imported sass', async () => { + const css = await getStyleTagContentIncluding('.imported-sass ') + const map = extractSourcemap(css) + expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` + { + "mappings": "AACE;EACE", + "sources": [ + "/root/imported.sass", + ], + "sourcesContent": [ + ".imported + &-sass + color: red + ", + ], + "version": 3, + } + `) + }) + + test('imported sass module', async () => { + const css = await getStyleTagContentIncluding('._imported-sass-module_') + const map = extractSourcemap(css) + expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` + { + "mappings": "AACE;EACE", + "sources": [ + "/root/imported.module.sass", + ], + "sourcesContent": [ + ".imported + &-sass-module + color: red + ", + ], + "version": 3, + } + `) + }) + + test('imported less', async () => { + const css = await getStyleTagContentIncluding('.imported-less ') + const map = extractSourcemap(css) + expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` + { + "mappings": "AACE;EACE", + "sources": [ + "/root/imported.less", + ], + "sourcesContent": [ + ".imported { + &-less { + color: @color; + } + } + ", + ], + "version": 3, + } + `) + }) + + test('imported stylus', async () => { + const css = await getStyleTagContentIncluding('.imported-stylus ') + const map = extractSourcemap(css) + expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` + { + "mappings": "AACE;EACE,cAAM", + "sources": [ + "/root/imported.styl", + ], + "sourcesContent": [ + ".imported + &-stylus + color blue-red-mixed + ", + ], + "version": 3, + } + `) + }) + + test('should not output missing source file warning', () => { + serverLogs.forEach((log) => { + expect(log).not.toMatch(/Sourcemap for .+ points to missing source files/) + }) + }) +}) + +describe.runIf(isServe)('serve', () => { + const getStyleTagContentIncluding = async (content: string) => { + const styles = await page.$$('style') + for (const style of styles) { + const text = await style.textContent() + if (text.includes(content)) { + return text + } + } + throw new Error('Not found') + } + + test('linked css', async () => { + const res = await page.request.get( + new URL('./linked.css', page.url()).href, + { + headers: { + accept: 'text/css' + } + } + ) + const css = await res.text() + const map = extractSourcemap(css) + expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` + { + "mappings": "AAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACT,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACb,CAAC;", + "sources": [ + "/root/linked.css", + ], + "sourcesContent": [ + ".linked { + color: red; + } + ", + ], + "version": 3, + } + `) + }) + + test('linked css with import', async () => { + const res = await page.request.get( + new URL('./linked-with-import.css', page.url()).href, + { + headers: { + accept: 'text/css' + } + } + ) + const css = await res.text() + const map = extractSourcemap(css) + expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` + { + "mappings": "AAAA;EACE,UAAU;AACZ;;ACAA;EACE,UAAU;AACZ", + "sources": [ + "/root/be-imported.css", + "/root/linked-with-import.css", + ], + "sourcesContent": [ + ".be-imported { + color: red; + } + ", + "@import '@/be-imported.css'; + + .linked-with-import { + color: red; + } + ", + ], + "version": 3, + } + `) + }) + + test('imported css', async () => { + const css = await getStyleTagContentIncluding('.imported ') + const map = extractSourcemap(css) + expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` + { + "mappings": "AAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACX,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACb,CAAC;", + "sources": [ + "/root/imported.css", + ], + "sourcesContent": [ + ".imported { + color: red; + } + ", + ], + "version": 3, + } + `) + }) + + test('imported css with import', async () => { + const css = await getStyleTagContentIncluding('.imported-with-import ') + const map = extractSourcemap(css) + expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` + { + "mappings": "AAAA;EACE,UAAU;AACZ;;ACAA;EACE,UAAU;AACZ", + "sources": [ + "/root/be-imported.css", + "/root/imported-with-import.css", + ], + "sourcesContent": [ + ".be-imported { + color: red; + } + ", + "@import '@/be-imported.css'; + + .imported-with-import { + color: red; + } + ", + ], + "version": 3, + } + `) + }) + + test('imported sass', async () => { + const css = await getStyleTagContentIncluding('.imported-sass ') + const map = extractSourcemap(css) + expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` + { + "mappings": "AACE;EACE", + "sources": [ + "/root/imported.sass", + ], + "sourcesContent": [ + ".imported + &-sass + color: red + ", + ], + "version": 3, + } + `) + }) + + test('imported sass module', async () => { + const css = await getStyleTagContentIncluding('._imported-sass-module_') + const map = extractSourcemap(css) + expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` + { + "mappings": "AACE;EACE", + "sources": [ + "/root/imported.module.sass", + ], + "sourcesContent": [ + ".imported + &-sass-module + color: red + ", + ], + "version": 3, + } + `) + }) + + test('imported less', async () => { + const css = await getStyleTagContentIncluding('.imported-less ') + const map = extractSourcemap(css) + expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` + { + "mappings": "AACE;EACE", + "sources": [ + "/root/imported.less", + ], + "sourcesContent": [ + ".imported { + &-less { + color: @color; + } + } + ", + ], + "version": 3, + } + `) + }) + + test('imported stylus', async () => { + const css = await getStyleTagContentIncluding('.imported-stylus ') + const map = extractSourcemap(css) + expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` + { + "mappings": "AACE;EACE,cAAM", + "sources": [ + "/root/imported.styl", + ], + "sourcesContent": [ + ".imported + &-stylus + color blue-red-mixed + ", + ], + "version": 3, + } + `) + }) + + test('should not output missing source file warning', () => { + serverLogs.forEach((log) => { + expect(log).not.toMatch(/Sourcemap for .+ points to missing source files/) + }) + }) +}) + +test.runIf(isBuild)('should not output sourcemap warning (#4939)', () => { + serverLogs.forEach((log) => { + expect(log).not.toMatch('Sourcemap is likely to be incorrect') + }) +}) diff --git a/playground/css-sourcemap/__tests__/serve.spec.ts b/playground/css-sourcemap/__tests__/serve.spec.ts deleted file mode 100644 index 6e7392952c3caa..00000000000000 --- a/playground/css-sourcemap/__tests__/serve.spec.ts +++ /dev/null @@ -1,219 +0,0 @@ -import { URL } from 'node:url' -import { - extractSourcemap, - formatSourcemapForSnapshot, - isServe, - page, - serverLogs -} from '~utils' - -describe.runIf(isServe)('serve', () => { - const getStyleTagContentIncluding = async (content: string) => { - const styles = await page.$$('style') - for (const style of styles) { - const text = await style.textContent() - if (text.includes(content)) { - return text - } - } - throw new Error('Not found') - } - - test('linked css', async () => { - const res = await page.request.get( - new URL('./linked.css', page.url()).href, - { - headers: { - accept: 'text/css' - } - } - ) - const css = await res.text() - const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": "AAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACT,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACb,CAAC;", - "sources": [ - "/root/linked.css", - ], - "sourcesContent": [ - ".linked { - color: red; - } - ", - ], - "version": 3, - } - `) - }) - - test('linked css with import', async () => { - const res = await page.request.get( - new URL('./linked-with-import.css', page.url()).href, - { - headers: { - accept: 'text/css' - } - } - ) - const css = await res.text() - const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": "AAAA;EACE,UAAU;AACZ;;ACAA;EACE,UAAU;AACZ", - "sources": [ - "/root/be-imported.css", - "/root/linked-with-import.css", - ], - "sourcesContent": [ - ".be-imported { - color: red; - } - ", - "@import '@/be-imported.css'; - - .linked-with-import { - color: red; - } - ", - ], - "version": 3, - } - `) - }) - - test('imported css', async () => { - const css = await getStyleTagContentIncluding('.imported ') - const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": "AAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACX,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACb,CAAC;", - "sources": [ - "/root/imported.css", - ], - "sourcesContent": [ - ".imported { - color: red; - } - ", - ], - "version": 3, - } - `) - }) - - test('imported css with import', async () => { - const css = await getStyleTagContentIncluding('.imported-with-import ') - const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": "AAAA;EACE,UAAU;AACZ;;ACAA;EACE,UAAU;AACZ", - "sources": [ - "/root/be-imported.css", - "/root/imported-with-import.css", - ], - "sourcesContent": [ - ".be-imported { - color: red; - } - ", - "@import '@/be-imported.css'; - - .imported-with-import { - color: red; - } - ", - ], - "version": 3, - } - `) - }) - - test('imported sass', async () => { - const css = await getStyleTagContentIncluding('.imported-sass ') - const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": "AACE;EACE", - "sources": [ - "/root/imported.sass", - ], - "sourcesContent": [ - ".imported - &-sass - color: red - ", - ], - "version": 3, - } - `) - }) - - test('imported sass module', async () => { - const css = await getStyleTagContentIncluding('._imported-sass-module_') - const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": "AACE;EACE", - "sources": [ - "/root/imported.module.sass", - ], - "sourcesContent": [ - ".imported - &-sass-module - color: red - ", - ], - "version": 3, - } - `) - }) - - test('imported less', async () => { - const css = await getStyleTagContentIncluding('.imported-less ') - const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": "AACE;EACE", - "sources": [ - "/root/imported.less", - ], - "sourcesContent": [ - ".imported { - &-less { - color: @color; - } - } - ", - ], - "version": 3, - } - `) - }) - - test('imported stylus', async () => { - const css = await getStyleTagContentIncluding('.imported-stylus ') - const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": "AACE;EACE,cAAM", - "sources": [ - "/root/imported.styl", - ], - "sourcesContent": [ - ".imported - &-stylus - color blue-red-mixed - ", - ], - "version": 3, - } - `) - }) - - test('should not output missing source file warning', () => { - serverLogs.forEach((log) => { - expect(log).not.toMatch(/Sourcemap for .+ points to missing source files/) - }) - }) -}) diff --git a/playground/css/__tests__/postcss-plugins-different-dir.spec.ts b/playground/css/__tests__/postcss-plugins-different-dir/postcss-plugins-different-dir.spec.ts similarity index 93% rename from playground/css/__tests__/postcss-plugins-different-dir.spec.ts rename to playground/css/__tests__/postcss-plugins-different-dir/postcss-plugins-different-dir.spec.ts index a1e0b4810c8ee5..346309f7fcc32d 100644 --- a/playground/css/__tests__/postcss-plugins-different-dir.spec.ts +++ b/playground/css/__tests__/postcss-plugins-different-dir/postcss-plugins-different-dir.spec.ts @@ -6,7 +6,7 @@ import { getBgColor, getColor, page, ports } from '~utils' test('postcss plugins in different dir', async () => { const port = ports['css/postcss-plugins-different-dir'] const server = await createServer({ - root: path.join(__dirname, '..', '..', 'tailwind'), + root: path.join(__dirname, '..', '..', '..', 'tailwind'), logLevel: 'silent', server: { port, diff --git a/playground/css/__tests__/postcss-plugins-different-dir/serve.ts b/playground/css/__tests__/postcss-plugins-different-dir/serve.ts new file mode 100644 index 00000000000000..16e7d655f5ec15 --- /dev/null +++ b/playground/css/__tests__/postcss-plugins-different-dir/serve.ts @@ -0,0 +1,10 @@ +// this is automatically detected by playground/vitestSetup.ts and will replace +// the default e2e test serve behavior + +// The server is started in the test, so we need to have a custom serve +// function or a default server will be created +export async function serve(): Promise<{ close(): Promise }> { + return { + close: () => Promise.resolve() + } +} diff --git a/playground/css/postcss-caching/serve.ts b/playground/css/postcss-caching/serve.ts new file mode 100644 index 00000000000000..16e7d655f5ec15 --- /dev/null +++ b/playground/css/postcss-caching/serve.ts @@ -0,0 +1,10 @@ +// this is automatically detected by playground/vitestSetup.ts and will replace +// the default e2e test serve behavior + +// The server is started in the test, so we need to have a custom serve +// function or a default server will be created +export async function serve(): Promise<{ close(): Promise }> { + return { + close: () => Promise.resolve() + } +} diff --git a/playground/dynamic-import/__tests__/dynamic-import.spec.ts b/playground/dynamic-import/__tests__/dynamic-import.spec.ts index 1eecd801f200c9..86c42a4d79a7e5 100644 --- a/playground/dynamic-import/__tests__/dynamic-import.spec.ts +++ b/playground/dynamic-import/__tests__/dynamic-import.spec.ts @@ -24,18 +24,18 @@ test('should load data URL of `data:`', async () => { await untilUpdated(() => page.textContent('.view'), 'data', true) }) -test('should have same reference on static and dynamic js import', async () => { +test('should have same reference on static and dynamic js import, .mxd', async () => { await page.click('.mxd') await untilUpdated(() => page.textContent('.view'), 'true', true) }) // in this case, it is not possible to detect the correct module -test('should have same reference on static and dynamic js import', async () => { +test('should have same reference on static and dynamic js import, .mxd2', async () => { await page.click('.mxd2') await untilUpdated(() => page.textContent('.view'), 'false', true) }) -test('should have same reference on static and dynamic js import', async () => { +test('should have same reference on static and dynamic js import, .mxdjson', async () => { await page.click('.mxdjson') await untilUpdated(() => page.textContent('.view'), 'true', true) }) diff --git a/playground/dynamic-import/mxd.js b/playground/dynamic-import/files/mxd.js similarity index 100% rename from playground/dynamic-import/mxd.js rename to playground/dynamic-import/files/mxd.js diff --git a/playground/dynamic-import/mxd.json b/playground/dynamic-import/files/mxd.json similarity index 100% rename from playground/dynamic-import/mxd.json rename to playground/dynamic-import/files/mxd.json diff --git a/playground/dynamic-import/nested/index.js b/playground/dynamic-import/nested/index.js index 31dcd07560836f..0b229055b32b7c 100644 --- a/playground/dynamic-import/nested/index.js +++ b/playground/dynamic-import/nested/index.js @@ -1,5 +1,5 @@ -import mxdStatic from '../mxd' -import mxdStaticJSON from '../mxd.json' +import mxdStatic from '../files/mxd' +import mxdStaticJSON from '../files/mxd.json' async function setView(view) { const { msg } = await import(`../views/${view}.js`) @@ -18,7 +18,7 @@ document.querySelector('.baz').addEventListener('click', async () => { // full dynamic const arr = ['qux.js'] -const view = `/${arr[0]}` +const view = `/views/${arr[0]}` document.querySelector('.qux').addEventListener('click', async () => { const { msg } = await import(/*@vite-ignore*/ view) text('.view', msg) @@ -27,12 +27,12 @@ document.querySelector('.qux').addEventListener('click', async () => { // mixed static and dynamic document.querySelector('.mxd').addEventListener('click', async () => { const view = 'mxd' - const { default: mxdDynamic } = await import(`../${view}.js`) + const { default: mxdDynamic } = await import(`../files/${view}.js`) text('.view', mxdStatic === mxdDynamic) }) document.querySelector('.mxd2').addEventListener('click', async () => { - const test = { jss: '../mxd.js' } + const test = { jss: '../files/mxd.js' } const ttest = test const view = 'mxd' const { default: mxdDynamic } = await import(/*@vite-ignore*/ test.jss) @@ -41,7 +41,7 @@ document.querySelector('.mxd2').addEventListener('click', async () => { document.querySelector('.mxdjson').addEventListener('click', async () => { const view = 'mxd' - const { default: mxdDynamicJSON } = await import(`../${view}.json`) + const { default: mxdDynamicJSON } = await import(`../files/${view}.json`) text('.view', mxdStaticJSON === mxdDynamicJSON) }) diff --git a/playground/dynamic-import/qux.js b/playground/dynamic-import/views/qux.js similarity index 100% rename from playground/dynamic-import/qux.js rename to playground/dynamic-import/views/qux.js diff --git a/playground/dynamic-import/vite.config.js b/playground/dynamic-import/vite.config.js index b12d8347287a2f..96baaa74798686 100644 --- a/playground/dynamic-import/vite.config.js +++ b/playground/dynamic-import/vite.config.js @@ -7,17 +7,19 @@ module.exports = vite.defineConfig({ { name: 'copy', writeBundle() { + fs.mkdirSync(path.resolve(__dirname, 'dist/views')) + fs.mkdirSync(path.resolve(__dirname, 'dist/files')) fs.copyFileSync( - path.resolve(__dirname, 'qux.js'), - path.resolve(__dirname, 'dist/qux.js') + path.resolve(__dirname, 'views/qux.js'), + path.resolve(__dirname, 'dist/views/qux.js') ) fs.copyFileSync( - path.resolve(__dirname, 'mxd.js'), - path.resolve(__dirname, 'dist/mxd.js') + path.resolve(__dirname, 'files/mxd.js'), + path.resolve(__dirname, 'dist/files/mxd.js') ) fs.copyFileSync( - path.resolve(__dirname, 'mxd.json'), - path.resolve(__dirname, 'dist/mxd.json') + path.resolve(__dirname, 'files/mxd.json'), + path.resolve(__dirname, 'dist/files/mxd.json') ) } } diff --git a/playground/js-sourcemap/__tests__/build.spec.ts b/playground/js-sourcemap/__tests__/build.spec.ts deleted file mode 100644 index b30284731a76d9..00000000000000 --- a/playground/js-sourcemap/__tests__/build.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { isBuild, serverLogs } from '~utils' - -test.runIf(isBuild)('should not output sourcemap warning (#4939)', () => { - serverLogs.forEach((log) => { - expect(log).not.toMatch('Sourcemap is likely to be incorrect') - }) -}) diff --git a/playground/js-sourcemap/__tests__/serve.spec.ts b/playground/js-sourcemap/__tests__/js-sourcemap.spec.ts similarity index 86% rename from playground/js-sourcemap/__tests__/serve.spec.ts rename to playground/js-sourcemap/__tests__/js-sourcemap.spec.ts index 5cd5c0e448b72f..a7ecbdf145af4a 100644 --- a/playground/js-sourcemap/__tests__/serve.spec.ts +++ b/playground/js-sourcemap/__tests__/js-sourcemap.spec.ts @@ -44,3 +44,9 @@ if (!isBuild) { expect(true).toBe(true) }) } + +test.runIf(isBuild)('should not output sourcemap warning (#4939)', () => { + serverLogs.forEach((log) => { + expect(log).not.toMatch('Sourcemap is likely to be incorrect') + }) +}) diff --git a/playground/preload/dep-a/index.js b/playground/preload/dep-a/index.js new file mode 100644 index 00000000000000..42c97c2d826ec6 --- /dev/null +++ b/playground/preload/dep-a/index.js @@ -0,0 +1 @@ +export const msgFromA = 'From dep-a' diff --git a/playground/preload/dep-a/package.json b/playground/preload/dep-a/package.json new file mode 100644 index 00000000000000..d45aab10cf9379 --- /dev/null +++ b/playground/preload/dep-a/package.json @@ -0,0 +1,7 @@ +{ + "name": "dep-a", + "private": true, + "version": "0.0.0", + "type": "module", + "main": "index.js" +} diff --git a/playground/preload/dep-including-a/index.js b/playground/preload/dep-including-a/index.js new file mode 100644 index 00000000000000..4fd1e37a11dd09 --- /dev/null +++ b/playground/preload/dep-including-a/index.js @@ -0,0 +1,3 @@ +export { msgFromA } from 'dep-a' + +export const msg = 'From dep-including-a' diff --git a/playground/preload/dep-including-a/package.json b/playground/preload/dep-including-a/package.json new file mode 100644 index 00000000000000..0b6febf47c6266 --- /dev/null +++ b/playground/preload/dep-including-a/package.json @@ -0,0 +1,10 @@ +{ + "name": "dep-including-a", + "private": true, + "version": "0.0.0", + "type": "module", + "main": "index.js", + "dependencies": { + "dep-a": "file:../dep-a" + } +} diff --git a/playground/preload/index.html b/playground/preload/index.html index affed21f9791cf..5b6acc4190a6d9 100644 --- a/playground/preload/index.html +++ b/playground/preload/index.html @@ -3,6 +3,8 @@ import { createApp } from 'vue' import router from './router.js' import App from './src/App.vue' + import { msgFromA } from 'dep-a' + console.log(msgFromA) createApp(App).use(router).mount('#app') diff --git a/playground/preload/package.json b/playground/preload/package.json index 2b76252c1e04ff..c72b346dece591 100644 --- a/playground/preload/package.json +++ b/playground/preload/package.json @@ -14,6 +14,8 @@ }, "devDependencies": { "@vitejs/plugin-vue": "workspace:*", - "terser": "^5.14.1" + "terser": "^5.14.1", + "dep-a": "file:./dep-a", + "dep-including-a": "file:./dep-including-a" } } diff --git a/playground/preload/src/components/About.vue b/playground/preload/src/components/About.vue index 2e73e80099446b..b19a3e3f196b5e 100644 --- a/playground/preload/src/components/About.vue +++ b/playground/preload/src/components/About.vue @@ -1,9 +1,13 @@ + + - - diff --git a/playground/ssr-deps/__tests__/ssr-deps.spec.ts b/playground/ssr-deps/__tests__/ssr-deps.spec.ts index dbb169647fc603..1e81b5fc689486 100644 --- a/playground/ssr-deps/__tests__/ssr-deps.spec.ts +++ b/playground/ssr-deps/__tests__/ssr-deps.spec.ts @@ -77,3 +77,17 @@ test('msg from no external cjs', async () => { await page.goto(url) expect(await page.textContent('.no-external-cjs-msg')).toMatch('Hello World!') }) + +test('msg from optimized with nested external', async () => { + await page.goto(url) + expect(await page.textContent('.optimized-with-nested-external')).toMatch( + 'Hello World!' + ) +}) + +test('msg from optimized cjs with nested external', async () => { + await page.goto(url) + expect(await page.textContent('.optimized-cjs-with-nested-external')).toMatch( + 'Hello World!' + ) +}) diff --git a/playground/ssr-deps/nested-external/index.js b/playground/ssr-deps/nested-external/index.js new file mode 100644 index 00000000000000..1e211c295b64ef --- /dev/null +++ b/playground/ssr-deps/nested-external/index.js @@ -0,0 +1,9 @@ +// Module with state, to check that it is properly externalized and +// not bundled in the optimized deps +let msg +export function setMessage(externalMsg) { + msg = externalMsg +} +export default function getMessage() { + return msg +} diff --git a/playground/ssr-deps/nested-external/package.json b/playground/ssr-deps/nested-external/package.json new file mode 100644 index 00000000000000..40d1fd957af246 --- /dev/null +++ b/playground/ssr-deps/nested-external/package.json @@ -0,0 +1,7 @@ +{ + "name": "nested-external", + "private": true, + "version": "0.0.0", + "main": "index.js", + "type": "module" +} diff --git a/playground/ssr-deps/non-optimized-with-nested-external/index.js b/playground/ssr-deps/non-optimized-with-nested-external/index.js new file mode 100644 index 00000000000000..cab1f9715fa51e --- /dev/null +++ b/playground/ssr-deps/non-optimized-with-nested-external/index.js @@ -0,0 +1,3 @@ +import { setMessage } from 'nested-external' + +setMessage('Hello World!') diff --git a/playground/ssr-deps/non-optimized-with-nested-external/package.json b/playground/ssr-deps/non-optimized-with-nested-external/package.json new file mode 100644 index 00000000000000..dc212bfb46caec --- /dev/null +++ b/playground/ssr-deps/non-optimized-with-nested-external/package.json @@ -0,0 +1,10 @@ +{ + "name": "non-optimized-with-nested-external", + "private": true, + "version": "0.0.0", + "type": "module", + "main": "index.js", + "dependencies": { + "nested-external": "file:../nested-external" + } +} diff --git a/playground/ssr-deps/optimized-cjs-with-nested-external/index.js b/playground/ssr-deps/optimized-cjs-with-nested-external/index.js new file mode 100644 index 00000000000000..adbbb819ed31ea --- /dev/null +++ b/playground/ssr-deps/optimized-cjs-with-nested-external/index.js @@ -0,0 +1,5 @@ +const getMessage = require('nested-external') + +module.exports = { + hello: getMessage +} diff --git a/playground/ssr-deps/optimized-cjs-with-nested-external/package.json b/playground/ssr-deps/optimized-cjs-with-nested-external/package.json new file mode 100644 index 00000000000000..d2b17b82d7cdea --- /dev/null +++ b/playground/ssr-deps/optimized-cjs-with-nested-external/package.json @@ -0,0 +1,8 @@ +{ + "name": "optimized-cjs-with-nested-external", + "private": true, + "version": "0.0.0", + "dependencies": { + "nested-external": "file:../nested-external" + } +} diff --git a/playground/ssr-deps/optimized-with-nested-external/index.js b/playground/ssr-deps/optimized-with-nested-external/index.js new file mode 100644 index 00000000000000..3b0d9135b3e5b1 --- /dev/null +++ b/playground/ssr-deps/optimized-with-nested-external/index.js @@ -0,0 +1,5 @@ +import getMessage from 'nested-external' + +export function hello() { + return getMessage() +} diff --git a/playground/ssr-deps/optimized-with-nested-external/package.json b/playground/ssr-deps/optimized-with-nested-external/package.json new file mode 100644 index 00000000000000..a1596220e04091 --- /dev/null +++ b/playground/ssr-deps/optimized-with-nested-external/package.json @@ -0,0 +1,10 @@ +{ + "name": "optimized-with-nested-external", + "private": true, + "version": "0.0.0", + "type": "module", + "main": "index.js", + "dependencies": { + "nested-external": "file:../nested-external" + } +} diff --git a/playground/ssr-deps/package.json b/playground/ssr-deps/package.json index 81068e24d3474d..20efa9753bebc9 100644 --- a/playground/ssr-deps/package.json +++ b/playground/ssr-deps/package.json @@ -21,7 +21,10 @@ "ts-transpiled-exports": "file:./ts-transpiled-exports", "no-external-cjs": "file:./no-external-cjs", "import-builtin-cjs": "file:./import-builtin-cjs", - "no-external-css": "file:./no-external-css" + "no-external-css": "file:./no-external-css", + "non-optimized-with-nested-external": "file:./non-optimized-with-nested-external", + "optimized-with-nested-external": "file:./optimized-with-nested-external", + "optimized-cjs-with-nested-external": "file:./optimized-with-nested-external" }, "devDependencies": { "cross-env": "^7.0.3", diff --git a/playground/ssr-deps/server.js b/playground/ssr-deps/server.js index 432ff69ca3b7d8..7075cbcacc4d7a 100644 --- a/playground/ssr-deps/server.js +++ b/playground/ssr-deps/server.js @@ -35,7 +35,17 @@ export async function createServer(root = process.cwd(), hmrPort) { }, appType: 'custom', ssr: { - noExternal: ['no-external-cjs', 'import-builtin-cjs', 'no-external-css'] + noExternal: ['no-external-cjs', 'import-builtin-cjs', 'no-external-css'], + external: ['nested-external'] + }, + optimizeDeps: { + include: [ + 'no-external-cjs', + 'import-builtin-cjs', + 'optimized-with-nested-external', + 'optimized-cjs-with-nested-external' + ], + exclude: ['nested-external'] } }) // use vite's connect instance as middleware diff --git a/playground/ssr-deps/src/app.js b/playground/ssr-deps/src/app.js index f5b0ad810421fb..26df58bde7439d 100644 --- a/playground/ssr-deps/src/app.js +++ b/playground/ssr-deps/src/app.js @@ -12,6 +12,14 @@ import requireAbsolute from 'require-absolute' import noExternalCjs from 'no-external-cjs' import importBuiltinCjs from 'import-builtin-cjs' +// This import will set a 'Hello World!" message in the nested-external non-entry dependency +import 'non-optimized-with-nested-external' + +// These two are optimized and get the message from nested-external, if the dependency is +// not properly externalized and ends up bundled, the message will be undefined +import optimizedWithNestedExternal from 'optimized-with-nested-external' +import optimizedCjsWithNestedExternal from 'optimized-cjs-with-nested-external' + export async function render(url, rootDir) { let html = '' @@ -53,5 +61,12 @@ export async function render(url, rootDir) { const importBuiltinCjsMessage = importBuiltinCjs.hello() html += `\n

message from import-builtin-cjs: ${importBuiltinCjsMessage}

` + const optimizedWithNestedExternalMessage = optimizedWithNestedExternal.hello() + html += `\n

message from optimized-with-nested-external: ${optimizedWithNestedExternalMessage}

` + + const optimizedCjsWithNestedExternalMessage = + optimizedCjsWithNestedExternal.hello() + html += `\n

message from optimized-cjs-with-nested-external: ${optimizedCjsWithNestedExternalMessage}

` + return html + '\n' } diff --git a/packages/vite/src/node/ssr/__tests__/fixtures/ssrModuleLoader-bad.js b/playground/ssr-vue/__tests__/fixtures/ssrModuleLoader-bad.js similarity index 100% rename from packages/vite/src/node/ssr/__tests__/fixtures/ssrModuleLoader-bad.js rename to playground/ssr-vue/__tests__/fixtures/ssrModuleLoader-bad.js diff --git a/playground/ssr-vue/__tests__/serve.ts b/playground/ssr-vue/__tests__/serve.ts index 99b02e10c94a19..e03810017bc04e 100644 --- a/playground/ssr-vue/__tests__/serve.ts +++ b/playground/ssr-vue/__tests__/serve.ts @@ -3,10 +3,13 @@ import path from 'node:path' import kill from 'kill-port' +import type { ViteDevServer } from 'vite' import { hmrPorts, isBuild, ports, rootDir } from '~utils' export const port = ports['ssr-vue'] +export let viteServer: ViteDevServer + export async function serve(): Promise<{ close(): Promise }> { if (isBuild) { // build first @@ -44,6 +47,7 @@ export async function serve(): Promise<{ close(): Promise }> { isBuild, hmrPorts['ssr-vue'] ) + viteServer = vite return new Promise((resolve, reject) => { try { diff --git a/playground/ssr-vue/__tests__/ssr-vue.spec.ts b/playground/ssr-vue/__tests__/ssr-vue.spec.ts index 7b61c2634f7c5b..7d4d1ec0f7ab87 100644 --- a/playground/ssr-vue/__tests__/ssr-vue.spec.ts +++ b/playground/ssr-vue/__tests__/ssr-vue.spec.ts @@ -1,4 +1,5 @@ import { resolve } from 'node:path' +import { fileURLToPath } from 'node:url' import fetch from 'node-fetch' import { port } from './serve' import { @@ -7,7 +8,8 @@ import { getColor, isBuild, page, - untilUpdated + untilUpdated, + viteServer } from '~utils' const url = `http://localhost:${port}/test/` @@ -202,3 +204,33 @@ test.runIf(isBuild)('dynamic css file should be preloaded', async () => { expect(homeHtml).toMatch(file) } }) + +test.runIf(!isBuild)( + 'always throw error when evaluating an wrong SSR module', + async () => { + const __filename = fileURLToPath(import.meta.url) + const badjs = resolve(__filename, '../fixtures/ssrModuleLoader-bad.js') + const THROW_MESSAGE = 'it is an expected error' + + const spy = vi.spyOn(console, 'error').mockImplementation(() => {}) + const expectedErrors = [] + for (const _ of [0, 1]) { + try { + console.log(viteServer) + await viteServer.ssrLoadModule(badjs, { fixStacktrace: true }) + } catch (e) { + expectedErrors.push(e) + } + } + expect(expectedErrors).toHaveLength(2) + expect(expectedErrors[0]).toBe(expectedErrors[1]) + expectedErrors.forEach((error) => { + expect(error?.message).toContain(THROW_MESSAGE) + }) + expect(spy).toBeCalledTimes(1) + const [firstParameter] = spy.mock.calls[0] + expect(firstParameter).toContain('Error when evaluating SSR module') + expect(firstParameter).toContain(THROW_MESSAGE) + spy.mockClear() + } +) diff --git a/playground/tailwind-sourcemap/__tests__/serve.spec.ts b/playground/tailwind-sourcemap/__tests__/serve.spec.ts deleted file mode 100644 index 62e46cc7781482..00000000000000 --- a/playground/tailwind-sourcemap/__tests__/serve.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { isBuild, serverLogs } from '~utils' - -test.runIf(isBuild)('should not output missing source file warning', () => { - serverLogs.forEach((log) => { - expect(log).not.toMatch(/Sourcemap for .+ points to missing source files/) - }) -}) diff --git a/playground/tailwind-sourcemap/__tests__/build.spec.ts b/playground/tailwind-sourcemap/__tests__/tailwind-sourcemap.spec.ts similarity index 53% rename from playground/tailwind-sourcemap/__tests__/build.spec.ts rename to playground/tailwind-sourcemap/__tests__/tailwind-sourcemap.spec.ts index b30284731a76d9..86238ab800f24e 100644 --- a/playground/tailwind-sourcemap/__tests__/build.spec.ts +++ b/playground/tailwind-sourcemap/__tests__/tailwind-sourcemap.spec.ts @@ -1,5 +1,11 @@ import { isBuild, serverLogs } from '~utils' +test.runIf(!isBuild)('should not output missing source file warning', () => { + serverLogs.forEach((log) => { + expect(log).not.toMatch(/Sourcemap for .+ points to missing source files/) + }) +}) + test.runIf(isBuild)('should not output sourcemap warning (#4939)', () => { serverLogs.forEach((log) => { expect(log).not.toMatch('Sourcemap is likely to be incorrect') diff --git a/playground/tailwind-sourcemap/postcss.config.js b/playground/tailwind-sourcemap/postcss.config.js index eab3760cbc7b42..ad6adc688915c1 100644 --- a/playground/tailwind-sourcemap/postcss.config.js +++ b/playground/tailwind-sourcemap/postcss.config.js @@ -1,3 +1,5 @@ +console.log(__dirname + '/tailwind.config.js') + module.exports = { plugins: { tailwindcss: { config: __dirname + '/tailwind.config.js' } diff --git a/playground/vitestSetup.ts b/playground/vitestSetup.ts index de0877302e5118..7b960811eb3f7e 100644 --- a/playground/vitestSetup.ts +++ b/playground/vitestSetup.ts @@ -35,6 +35,10 @@ export const viteBinPath = path.posix.join( let server: ViteDevServer | http.Server +/** + * Vite Dev Server when testing serve + */ +export let viteServer: ViteDevServer /** * Root of the Vite fixture */ @@ -146,6 +150,7 @@ beforeAll(async (s) => { } if (serve) { server = await serve() + viteServer = mod.viteServer return } } else { @@ -212,7 +217,7 @@ export async function startDefaultServe(): Promise { process.env.VITE_INLINE = 'inline-serve' const testConfig = mergeConfig(options, config || {}) viteConfig = testConfig - server = await (await createServer(testConfig)).listen() + viteServer = server = await (await createServer(testConfig)).listen() // use resolved port/base from server const devBase = server.config.base viteTestUrl = `http://localhost:${server.config.server.port}${ diff --git a/playground/vue-sourcemap/__tests__/__snapshots__/serve.spec.ts.snap b/playground/vue-sourcemap/__tests__/__snapshots__/vue-sourcemap.spec.ts.snap similarity index 85% rename from playground/vue-sourcemap/__tests__/__snapshots__/serve.spec.ts.snap rename to playground/vue-sourcemap/__tests__/__snapshots__/vue-sourcemap.spec.ts.snap index e91b6ce384c562..d2600ee6edccce 100644 --- a/playground/vue-sourcemap/__tests__/__snapshots__/serve.spec.ts.snap +++ b/playground/vue-sourcemap/__tests__/__snapshots__/vue-sourcemap.spec.ts.snap @@ -1,6 +1,6 @@ // Vitest Snapshot v1 -exports[`serve:vue-sourcemap > css 1`] = ` +exports[`serve:vue-sourcemap > css > serve-css 1`] = ` { "mappings": ";AAQA;EACE,UAAU;AACZ", "sources": [ @@ -47,7 +47,7 @@ exports[`serve:vue-sourcemap > css 1`] = ` } `; -exports[`serve:vue-sourcemap > css module 1`] = ` +exports[`serve:vue-sourcemap > css module > serve-css-module 1`] = ` { "mappings": ";AAcA;EACE,UAAU;AACZ", "sources": [ @@ -94,7 +94,7 @@ exports[`serve:vue-sourcemap > css module 1`] = ` } `; -exports[`serve:vue-sourcemap > css scoped 1`] = ` +exports[`serve:vue-sourcemap > css scoped > serve-css-scoped 1`] = ` { "mappings": ";AAoBA;EACE,UAAU;AACZ", "sources": [ @@ -141,7 +141,7 @@ exports[`serve:vue-sourcemap > css scoped 1`] = ` } `; -exports[`serve:vue-sourcemap > js 1`] = ` +exports[`serve:vue-sourcemap > js > serve-js 1`] = ` { "mappings": "AAKA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;;AAGP;AACd,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;;;;;;;wBARlB,oBAAiB,WAAd,MAAU", "sources": [ @@ -165,7 +165,7 @@ console.log('setup') } `; -exports[`serve:vue-sourcemap > less with additionalData 1`] = ` +exports[`serve:vue-sourcemap > less with additionalData > serve-less-with-additionalData 1`] = ` { "mappings": "AAKA;EACE", "sources": [ @@ -187,7 +187,7 @@ exports[`serve:vue-sourcemap > less with additionalData 1`] = ` } `; -exports[`serve:vue-sourcemap > no script 1`] = ` +exports[`serve:vue-sourcemap > no script > serve-no-script 1`] = ` { "mappings": ";;;wBACE,oBAAwB,WAArB,aAAiB", "sourceRoot": "", @@ -204,7 +204,7 @@ exports[`serve:vue-sourcemap > no script 1`] = ` } `; -exports[`serve:vue-sourcemap > no template 1`] = ` +exports[`serve:vue-sourcemap > no template > serve-no-template 1`] = ` { "mappings": "AACA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;;AAGP;AACd,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;;;", "sources": [ @@ -224,7 +224,7 @@ console.log('setup') } `; -exports[`serve:vue-sourcemap > sass 1`] = ` +exports[`serve:vue-sourcemap > sass > serve-sass 1`] = ` { "mappings": "AAKA;EACE", "sources": [ @@ -245,7 +245,7 @@ exports[`serve:vue-sourcemap > sass 1`] = ` } `; -exports[`serve:vue-sourcemap > sass with import 1`] = ` +exports[`serve:vue-sourcemap > sass with import > serve-sass-with-import 1`] = ` { "mappings": "AAAA;EACE;;ACOF;EACE", "sources": [ @@ -273,7 +273,7 @@ exports[`serve:vue-sourcemap > sass with import 1`] = ` } `; -exports[`serve:vue-sourcemap > src imported 1`] = ` +exports[`serve:vue-sourcemap > src imported > serve-src-imported 1`] = ` { "mappings": "AAAA;EACE,UAAU;AACZ", "sources": [ @@ -289,7 +289,7 @@ exports[`serve:vue-sourcemap > src imported 1`] = ` } `; -exports[`serve:vue-sourcemap > src imported sass 1`] = ` +exports[`serve:vue-sourcemap > src imported sass > serve-src-imported-sass 1`] = ` { "mappings": "AAAA;EACE;;ACCF;EACE", "sources": [ @@ -310,7 +310,7 @@ exports[`serve:vue-sourcemap > src imported sass 1`] = ` } `; -exports[`serve:vue-sourcemap > ts 1`] = ` +exports[`serve:vue-sourcemap > ts > serve-ts 1`] = ` { "mappings": ";AAKA,QAAQ,IAAI,WAAW;;;;;AAIvB,YAAQ,IAAI,UAAU;;;;;;;;uBARpB,oBAAiB,WAAd,MAAU", "sources": [ diff --git a/playground/vue-sourcemap/__tests__/build.spec.ts b/playground/vue-sourcemap/__tests__/build.spec.ts deleted file mode 100644 index b30284731a76d9..00000000000000 --- a/playground/vue-sourcemap/__tests__/build.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { isBuild, serverLogs } from '~utils' - -test.runIf(isBuild)('should not output sourcemap warning (#4939)', () => { - serverLogs.forEach((log) => { - expect(log).not.toMatch('Sourcemap is likely to be incorrect') - }) -}) diff --git a/playground/vue-sourcemap/__tests__/serve.spec.ts b/playground/vue-sourcemap/__tests__/vue-sourcemap.spec.ts similarity index 66% rename from playground/vue-sourcemap/__tests__/serve.spec.ts rename to playground/vue-sourcemap/__tests__/vue-sourcemap.spec.ts index 1ace0d7d1f4306..2241af413eee94 100644 --- a/playground/vue-sourcemap/__tests__/serve.spec.ts +++ b/playground/vue-sourcemap/__tests__/vue-sourcemap.spec.ts @@ -2,8 +2,10 @@ import { URL } from 'node:url' import { extractSourcemap, formatSourcemapForSnapshot, + isBuild, isServe, - page + page, + serverLogs } from '~utils' describe.runIf(isServe)('serve:vue-sourcemap', () => { @@ -22,62 +24,70 @@ describe.runIf(isServe)('serve:vue-sourcemap', () => { const res = await page.request.get(new URL('./Js.vue', page.url()).href) const js = await res.text() const map = extractSourcemap(js) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot('serve-js') }) test('ts', async () => { const res = await page.request.get(new URL('./Ts.vue', page.url()).href) const js = await res.text() const map = extractSourcemap(js) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot('serve-ts') }) test('css', async () => { const css = await getStyleTagContentIncluding('.css ') const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot('serve-css') }) test('css module', async () => { const css = await getStyleTagContentIncluding('._css-module_') const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot('serve-css-module') }) test('css scoped', async () => { const css = await getStyleTagContentIncluding('.css-scoped[data-v-') const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot('serve-css-scoped') }) test('sass', async () => { const css = await getStyleTagContentIncluding('.sass ') const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot('serve-sass') }) test('sass with import', async () => { const css = await getStyleTagContentIncluding('.sass-with-import ') const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot( + 'serve-sass-with-import' + ) }) test('less with additionalData', async () => { const css = await getStyleTagContentIncluding('.less ') const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot( + 'serve-less-with-additionalData' + ) }) test('src imported', async () => { const css = await getStyleTagContentIncluding('.src-import[data-v-') const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot( + 'serve-src-imported' + ) }) test('src imported sass', async () => { const css = await getStyleTagContentIncluding('.src-import-sass[data-v-') const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot( + 'serve-src-imported-sass' + ) }) test('no script', async () => { @@ -86,7 +96,7 @@ describe.runIf(isServe)('serve:vue-sourcemap', () => { ) const js = await res.text() const map = extractSourcemap(js) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot('serve-no-script') }) test('no template', async () => { @@ -95,6 +105,12 @@ describe.runIf(isServe)('serve:vue-sourcemap', () => { ) const js = await res.text() const map = extractSourcemap(js) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot() + expect(formatSourcemapForSnapshot(map)).toMatchSnapshot('serve-no-template') + }) +}) + +test.runIf(isBuild)('should not output sourcemap warning (#4939)', () => { + serverLogs.forEach((log) => { + expect(log).not.toMatch('Sourcemap is likely to be incorrect') }) }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d93a1cc430bcd3..d63fd7c1ce006c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -343,10 +343,12 @@ importers: playground/alias: specifiers: + '@vue/shared': ^3.2.37 aliased-module: file:./dir/module resolve-linked: workspace:* vue: ^3.2.37 dependencies: + '@vue/shared': 3.2.37 aliased-module: file:playground/alias/dir/module vue: 3.2.37 devDependencies: @@ -737,6 +739,8 @@ importers: playground/preload: specifiers: '@vitejs/plugin-vue': workspace:* + dep-a: file:./dep-a + dep-including-a: file:./dep-including-a terser: ^5.14.1 vue: ^3.2.37 vue-router: ^4.0.16 @@ -745,8 +749,19 @@ importers: vue-router: 4.0.16_vue@3.2.37 devDependencies: '@vitejs/plugin-vue': link:../../packages/plugin-vue + dep-a: file:playground/preload/dep-a + dep-including-a: file:playground/preload/dep-including-a terser: 5.14.1 + playground/preload/dep-a: + specifiers: {} + + playground/preload/dep-including-a: + specifiers: + dep-a: file:../dep-a + dependencies: + dep-a: file:playground/preload/dep-a + playground/preserve-symlinks: specifiers: '@symlinks/moduleA': link:./moduleA @@ -867,8 +882,11 @@ importers: import-builtin-cjs: file:./import-builtin-cjs no-external-cjs: file:./no-external-cjs no-external-css: file:./no-external-css + non-optimized-with-nested-external: file:./non-optimized-with-nested-external object-assigned-exports: file:./object-assigned-exports only-object-assigned-exports: file:./only-object-assigned-exports + optimized-cjs-with-nested-external: file:./optimized-with-nested-external + optimized-with-nested-external: file:./optimized-with-nested-external primitive-export: file:./primitive-export read-file-content: file:./read-file-content require-absolute: file:./require-absolute @@ -881,8 +899,11 @@ importers: import-builtin-cjs: file:playground/ssr-deps/import-builtin-cjs no-external-cjs: file:playground/ssr-deps/no-external-cjs no-external-css: file:playground/ssr-deps/no-external-css + non-optimized-with-nested-external: file:playground/ssr-deps/non-optimized-with-nested-external object-assigned-exports: file:playground/ssr-deps/object-assigned-exports only-object-assigned-exports: file:playground/ssr-deps/only-object-assigned-exports + optimized-cjs-with-nested-external: file:playground/ssr-deps/optimized-with-nested-external + optimized-with-nested-external: file:playground/ssr-deps/optimized-with-nested-external primitive-export: file:playground/ssr-deps/primitive-export read-file-content: file:playground/ssr-deps/read-file-content require-absolute: file:playground/ssr-deps/require-absolute @@ -906,18 +927,39 @@ importers: playground/ssr-deps/import-builtin-cjs: specifiers: {} + playground/ssr-deps/nested-external: + specifiers: {} + playground/ssr-deps/no-external-cjs: specifiers: {} playground/ssr-deps/no-external-css: specifiers: {} + playground/ssr-deps/non-optimized-with-nested-external: + specifiers: + nested-external: file:../nested-external + dependencies: + nested-external: file:playground/ssr-deps/nested-external + playground/ssr-deps/object-assigned-exports: specifiers: {} playground/ssr-deps/only-object-assigned-exports: specifiers: {} + playground/ssr-deps/optimized-cjs-with-nested-external: + specifiers: + nested-external: file:../nested-external + dependencies: + nested-external: file:playground/ssr-deps/nested-external + + playground/ssr-deps/optimized-with-nested-external: + specifiers: + nested-external: file:../nested-external + dependencies: + nested-external: file:playground/ssr-deps/nested-external + playground/ssr-deps/primitive-export: specifiers: {} @@ -8866,6 +8908,19 @@ packages: version: 0.0.0 dev: false + file:playground/preload/dep-a: + resolution: {directory: playground/preload/dep-a, type: directory} + name: dep-a + version: 0.0.0 + + file:playground/preload/dep-including-a: + resolution: {directory: playground/preload/dep-including-a, type: directory} + name: dep-including-a + version: 0.0.0 + dependencies: + dep-a: file:playground/preload/dep-a + dev: true + file:playground/react/jsx-entry: resolution: {directory: playground/react/jsx-entry, type: directory} name: jsx-entry @@ -8898,6 +8953,12 @@ packages: version: 0.0.0 dev: false + file:playground/ssr-deps/nested-external: + resolution: {directory: playground/ssr-deps/nested-external, type: directory} + name: nested-external + version: 0.0.0 + dev: false + file:playground/ssr-deps/no-external-cjs: resolution: {directory: playground/ssr-deps/no-external-cjs, type: directory} name: no-external-cjs @@ -8910,6 +8971,14 @@ packages: version: 0.0.0 dev: false + file:playground/ssr-deps/non-optimized-with-nested-external: + resolution: {directory: playground/ssr-deps/non-optimized-with-nested-external, type: directory} + name: non-optimized-with-nested-external + version: 0.0.0 + dependencies: + nested-external: file:playground/ssr-deps/nested-external + dev: false + file:playground/ssr-deps/object-assigned-exports: resolution: {directory: playground/ssr-deps/object-assigned-exports, type: directory} name: object-assigned-exports @@ -8922,6 +8991,14 @@ packages: version: 0.0.0 dev: false + file:playground/ssr-deps/optimized-with-nested-external: + resolution: {directory: playground/ssr-deps/optimized-with-nested-external, type: directory} + name: optimized-with-nested-external + version: 0.0.0 + dependencies: + nested-external: file:playground/ssr-deps/nested-external + dev: false + file:playground/ssr-deps/primitive-export: resolution: {directory: playground/ssr-deps/primitive-export, type: directory} name: primitive-export From 722f5148ea494cdc15379d3a98dca0751131ca22 Mon Sep 17 00:00:00 2001 From: patak Date: Mon, 4 Jul 2022 11:06:24 +0200 Subject: [PATCH 74/75] fix: ssrBuild is optional, avoid breaking VitePress (#8912) --- docs/config/index.md | 2 +- packages/vite/src/node/config.ts | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/config/index.md b/docs/config/index.md index cab69067574a3b..34675192fe6484 100644 --- a/docs/config/index.md +++ b/docs/config/index.md @@ -80,7 +80,7 @@ export default defineConfig(({ command, mode, ssrBuild }) => { It is important to note that in Vite's API the `command` value is `serve` during dev (in the cli `vite`, `vite dev`, and `vite serve` are aliases), and `build` when building for production (`vite build`). -Only `ssrBuild` is included instead of a more general `ssr` flag because, during dev, the config is shared by the single server handling SSR and non-SSR requests. +`ssrBuild` is experimental. It is only available during build instead of a more general `ssr` flag because, during dev, the config is shared by the single server handling SSR and non-SSR requests. The value could be `undefined` for tools that don't have separate commands for the browser and SSR build, so use explicit comparison against `true` and `false`. ## Async Config diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 403a15a0631742..3c49c3a3d413ef 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -66,7 +66,10 @@ export type { RenderBuiltAssetUrl } from './build' export interface ConfigEnv { command: 'build' | 'serve' mode: string - ssrBuild: boolean + /** + * @experimental + */ + ssrBuild?: boolean } /** From f280dd99856af68a47635dda609c402333805209 Mon Sep 17 00:00:00 2001 From: patak Date: Tue, 5 Jul 2022 09:09:35 +0200 Subject: [PATCH 75/75] feat: ssr.optimizeDeps (#8917) --- packages/vite/src/node/build.ts | 4 +- packages/vite/src/node/config.ts | 119 +++--------- packages/vite/src/node/index.ts | 2 + .../src/node/optimizer/esbuildDepPlugin.ts | 39 +++- packages/vite/src/node/optimizer/index.ts | 173 ++++++++++++------ packages/vite/src/node/optimizer/optimizer.ts | 44 ++--- packages/vite/src/node/optimizer/scan.ts | 2 + .../vite/src/node/plugins/importAnalysis.ts | 10 +- .../src/node/plugins/importAnalysisBuild.ts | 9 +- packages/vite/src/node/plugins/index.ts | 7 +- .../vite/src/node/plugins/optimizedDeps.ts | 19 +- packages/vite/src/node/plugins/preAlias.ts | 2 +- packages/vite/src/node/plugins/resolve.ts | 4 +- packages/vite/src/node/plugins/worker.ts | 2 +- .../src/node/plugins/workerImportMetaUrl.ts | 2 +- packages/vite/src/node/server/index.ts | 7 +- .../src/node/server/middlewares/transform.ts | 13 +- .../vite/src/node/server/transformRequest.ts | 2 +- packages/vite/src/node/ssr/index.ts | 48 ++++- packages/vite/src/node/utils.ts | 6 +- 20 files changed, 285 insertions(+), 229 deletions(-) diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index 294ff48654d301..f9bfb31a0365b9 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -398,7 +398,7 @@ async function doBuild( external = await cjsSsrResolveExternal(config, userExternal) } - if (isDepsOptimizerEnabled(config)) { + if (isDepsOptimizerEnabled(config, ssr)) { await initDepsOptimizer(config) } @@ -739,7 +739,7 @@ async function cjsSsrResolveExternal( } catch (e) {} if (!knownImports) { // no dev deps optimization data, do a fresh scan - knownImports = await findKnownImports(config) + knownImports = await findKnownImports(config, false) // needs to use non-ssr } const ssrExternals = cjsSsrResolveExternals(config, knownImports) diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 3c49c3a3d413ef..779a7cdeec9e7e 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -7,7 +7,6 @@ import colors from 'picocolors' import type { Alias, AliasOptions } from 'types/alias' import aliasPlugin from '@rollup/plugin-alias' import { build } from 'esbuild' -import type { Plugin as ESBuildPlugin } from 'esbuild' import type { RollupOptions } from 'rollup' import type { Plugin } from './plugin' import type { @@ -47,7 +46,7 @@ import type { InternalResolveOptions, ResolveOptions } from './plugins/resolve' import { resolvePlugin } from './plugins/resolve' import type { LogLevel, Logger } from './logger' import { createLogger } from './logger' -import type { DepOptimizationOptions } from './optimizer' +import type { DepOptimizationConfig, DepOptimizationOptions } from './optimizer' import type { JsonOptions } from './plugins/json' import type { PluginContainer } from './server/pluginContainer' import { createPluginContainer } from './server/pluginContainer' @@ -334,7 +333,7 @@ export type ResolvedConfig = Readonly< server: ResolvedServerOptions build: ResolvedBuildOptions preview: ResolvedPreviewOptions - ssr: ResolvedSSROptions | undefined + ssr: ResolvedSSROptions assetsInclude: (file: string) => boolean logger: Logger createResolver: (options?: Partial) => ResolveFn @@ -560,15 +559,14 @@ export async function resolveConfig( : '' const server = resolveServerOptions(resolvedRoot, config.server, logger) - let ssr = resolveSSROptions(config.ssr) - if (config.legacy?.buildSsrCjsExternalHeuristics) { - if (ssr) ssr.format = 'cjs' - else ssr = { target: 'node', format: 'cjs' } - } + const ssr = resolveSSROptions( + config.ssr, + config.legacy?.buildSsrCjsExternalHeuristics, + config.resolve?.preserveSymlinks + ) const middlewareMode = config?.server?.middlewareMode - config = mergeConfig(config, externalConfigCompat(config, configEnv)) const optimizeDeps = config.optimizeDeps || {} if (process.env.VITE_TEST_LEGACY_CJS_PLUGIN) { @@ -668,6 +666,12 @@ export async function resolveConfig( } else if (optimizerDisabled === 'dev') { resolved.optimizeDeps.disabled = true // Also disabled during build } + const ssrOptimizerDisabled = resolved.ssr.optimizeDeps.disabled + if (!ssrOptimizerDisabled) { + resolved.ssr.optimizeDeps.disabled = 'build' + } else if (ssrOptimizerDisabled === 'dev') { + resolved.ssr.optimizeDeps.disabled = true // Also disabled during build + } } // Some plugins that aren't intended to work in the bundling of workers (doing post-processing at build time for example). @@ -1004,92 +1008,21 @@ async function loadConfigFromBundledFile( return raw.__esModule ? raw.default : raw } -export function isDepsOptimizerEnabled(config: ResolvedConfig): boolean { - const { command, optimizeDeps } = config - const { disabled } = optimizeDeps +export function getDepOptimizationConfig( + config: ResolvedConfig, + ssr: boolean +): DepOptimizationConfig { + return ssr ? config.ssr.optimizeDeps : config.optimizeDeps +} +export function isDepsOptimizerEnabled( + config: ResolvedConfig, + ssr: boolean +): boolean { + const { command } = config + const { disabled } = getDepOptimizationConfig(config, ssr) return !( disabled === true || (command === 'build' && disabled === 'build') || - (command === 'serve' && optimizeDeps.disabled === 'dev') + (command === 'serve' && disabled === 'dev') ) } - -// esbuild doesn't transpile `require('foo')` into `import` statements if 'foo' is externalized -// https://github.com/evanw/esbuild/issues/566#issuecomment-735551834 -function esbuildCjsExternalPlugin(externals: string[]): ESBuildPlugin { - return { - name: 'cjs-external', - setup(build) { - const escape = (text: string) => - `^${text.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')}$` - const filter = new RegExp(externals.map(escape).join('|')) - - build.onResolve({ filter: /.*/, namespace: 'external' }, (args) => ({ - path: args.path, - external: true - })) - - build.onResolve({ filter }, (args) => ({ - path: args.path, - namespace: 'external' - })) - - build.onLoad({ filter: /.*/, namespace: 'external' }, (args) => ({ - contents: `export * from ${JSON.stringify(args.path)}` - })) - } - } -} - -// Support `rollupOptions.external` when `legacy.buildRollupPluginCommonjs` is disabled -function externalConfigCompat(config: UserConfig, { command }: ConfigEnv) { - // Only affects the build command - if (command !== 'build') { - return {} - } - - // Skip if using Rollup CommonJS plugin - if ( - config.legacy?.buildRollupPluginCommonjs || - config.optimizeDeps?.disabled === 'build' - ) { - return {} - } - - // Skip if no `external` configured - const external = config?.build?.rollupOptions?.external - if (!external) { - return {} - } - - let normalizedExternal = external - if (typeof external === 'string') { - normalizedExternal = [external] - } - - // TODO: decide whether to support RegExp and function options - // They're not supported yet because `optimizeDeps.exclude` currently only accepts strings - if ( - !Array.isArray(normalizedExternal) || - normalizedExternal.some((ext) => typeof ext !== 'string') - ) { - throw new Error( - `[vite] 'build.rollupOptions.external' can only be an array of strings or a string.\n` + - `You can turn on 'legacy.buildRollupPluginCommonjs' to support more advanced options.` - ) - } - - const additionalConfig: UserConfig = { - optimizeDeps: { - exclude: normalizedExternal as string[], - esbuildOptions: { - plugins: [ - // TODO: maybe it can be added globally/unconditionally? - esbuildCjsExternalPlugin(normalizedExternal as string[]) - ] - } - } - } - - return additionalConfig -} diff --git a/packages/vite/src/node/index.ts b/packages/vite/src/node/index.ts index e1a9de026ffc1e..bdac099dd214e6 100644 --- a/packages/vite/src/node/index.ts +++ b/packages/vite/src/node/index.ts @@ -35,6 +35,7 @@ export type { export type { DepOptimizationMetadata, DepOptimizationOptions, + DepOptimizationConfig, DepOptimizationResult, DepOptimizationProcessing, OptimizedDepInfo, @@ -43,6 +44,7 @@ export type { } from './optimizer' export type { ResolvedSSROptions, + SsrDepOptimizationOptions, SSROptions, SSRFormat, SSRTarget diff --git a/packages/vite/src/node/optimizer/esbuildDepPlugin.ts b/packages/vite/src/node/optimizer/esbuildDepPlugin.ts index d41caca22d2d4a..20b808b1dc7ec7 100644 --- a/packages/vite/src/node/optimizer/esbuildDepPlugin.ts +++ b/packages/vite/src/node/optimizer/esbuildDepPlugin.ts @@ -2,6 +2,7 @@ import path from 'node:path' import { promises as fs } from 'node:fs' import type { ImportKind, Plugin } from 'esbuild' import { KNOWN_ASSET_TYPES } from '../constants' +import { getDepOptimizationConfig } from '..' import type { ResolvedConfig } from '..' import { flattenId, @@ -43,14 +44,15 @@ const externalTypes = [ export function esbuildDepPlugin( qualified: Record, exportsData: Record, + external: string[], config: ResolvedConfig, ssr: boolean ): Plugin { + const { extensions } = getDepOptimizationConfig(config, ssr) + // remove optimizable extensions from `externalTypes` list - const allExternalTypes = config.optimizeDeps.extensions - ? externalTypes.filter( - (type) => !config.optimizeDeps.extensions?.includes('.' + type) - ) + const allExternalTypes = extensions + ? externalTypes.filter((type) => !extensions?.includes('.' + type)) : externalTypes // default resolver which prefers ESM @@ -163,7 +165,7 @@ export function esbuildDepPlugin( build.onResolve( { filter: /^[\w@][^:]/ }, async ({ path: id, importer, kind }) => { - if (moduleListContains(config.optimizeDeps?.exclude, id)) { + if (moduleListContains(external, id)) { return { path: id, external: true @@ -301,3 +303,30 @@ module.exports = Object.create(new Proxy({}, { } } } + +// esbuild doesn't transpile `require('foo')` into `import` statements if 'foo' is externalized +// https://github.com/evanw/esbuild/issues/566#issuecomment-735551834 +export function esbuildCjsExternalPlugin(externals: string[]): Plugin { + return { + name: 'cjs-external', + setup(build) { + const escape = (text: string) => + `^${text.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')}$` + const filter = new RegExp(externals.map(escape).join('|')) + + build.onResolve({ filter: /.*/, namespace: 'external' }, (args) => ({ + path: args.path, + external: true + })) + + build.onResolve({ filter }, (args) => ({ + path: args.path, + namespace: 'external' + })) + + build.onLoad({ filter: /.*/, namespace: 'external' }, (args) => ({ + contents: `export * from ${JSON.stringify(args.path)}` + })) + } + } +} diff --git a/packages/vite/src/node/optimizer/index.ts b/packages/vite/src/node/optimizer/index.ts index 142a9519bb4b59..d941b2fa6c7570 100644 --- a/packages/vite/src/node/optimizer/index.ts +++ b/packages/vite/src/node/optimizer/index.ts @@ -7,6 +7,7 @@ import type { BuildOptions as EsbuildBuildOptions } from 'esbuild' import { build } from 'esbuild' import { init, parse } from 'es-module-lexer' import { createFilter } from '@rollup/pluginutils' +import { getDepOptimizationConfig } from '../config' import type { ResolvedConfig } from '../config' import { arraify, @@ -24,7 +25,7 @@ import { } from '../utils' import { transformWithEsbuild } from '../plugins/esbuild' import { ESBUILD_MODULES_TARGET } from '../constants' -import { esbuildDepPlugin } from './esbuildDepPlugin' +import { esbuildCjsExternalPlugin, esbuildDepPlugin } from './esbuildDepPlugin' import { scanImports } from './scan' export { initDepsOptimizer, @@ -71,18 +72,7 @@ export interface DepsOptimizer { options: DepOptimizationOptions } -export interface DepOptimizationOptions { - /** - * By default, Vite will crawl your `index.html` to detect dependencies that - * need to be pre-bundled. If `build.rollupOptions.input` is specified, Vite - * will crawl those entry points instead. - * - * If neither of these fit your needs, you can specify custom entries using - * this option - the value should be a fast-glob pattern or array of patterns - * (https://github.com/mrmlnc/fast-glob#basic-syntax) that are relative from - * vite project root. This will overwrite default entries inference. - */ - entries?: string | string[] +export interface DepOptimizationConfig { /** * Force optimize listed dependencies (must be resolvable import paths, * cannot be globs). @@ -141,6 +131,20 @@ export interface DepOptimizationOptions { * @experimental */ disabled?: boolean | 'build' | 'dev' +} + +export type DepOptimizationOptions = DepOptimizationConfig & { + /** + * By default, Vite will crawl your `index.html` to detect dependencies that + * need to be pre-bundled. If `build.rollupOptions.input` is specified, Vite + * will crawl those entry points instead. + * + * If neither of these fit your needs, you can specify custom entries using + * this option - the value should be a fast-glob pattern or array of patterns + * (https://github.com/mrmlnc/fast-glob#basic-syntax) that are relative from + * vite project root. This will overwrite default entries inference. + */ + entries?: string | string[] /** * Force dep pre-optimization regardless of whether deps have changed. * @experimental @@ -223,22 +227,26 @@ export async function optimizeDeps( ): Promise { const log = asCommand ? config.logger.info : debug + const ssr = !!config.build.ssr + const cachedMetadata = loadCachedDepOptimizationMetadata( config, + ssr, force, asCommand ) if (cachedMetadata) { return cachedMetadata } + const deps = await discoverProjectDependencies(config) const depsString = depsLogString(Object.keys(deps)) log(colors.green(`Optimizing dependencies:\n ${depsString}`)) - await addManuallyIncludedOptimizeDeps(deps, config) + await addManuallyIncludedOptimizeDeps(deps, config, ssr) - const depsInfo = toDiscoveredDependencies(config, deps, !!config.build.ssr) + const depsInfo = toDiscoveredDependencies(config, deps, ssr) const result = await runOptimizeDeps(config, depsInfo) @@ -250,11 +258,12 @@ export async function optimizeDeps( export async function optimizeServerSsrDeps( config: ResolvedConfig ): Promise { + const ssr = true const cachedMetadata = loadCachedDepOptimizationMetadata( config, + ssr, config.optimizeDeps.force, - false, - true // ssr + false ) if (cachedMetadata) { return cachedMetadata @@ -263,6 +272,8 @@ export async function optimizeServerSsrDeps( let alsoInclude: string[] | undefined let noExternalFilter: ((id: unknown) => boolean) | undefined + const { exclude } = getDepOptimizationConfig(config, ssr) + const noExternal = config.ssr?.noExternal if (noExternal) { alsoInclude = arraify(noExternal).filter( @@ -271,7 +282,7 @@ export async function optimizeServerSsrDeps( noExternalFilter = noExternal === true ? (dep: unknown) => false - : createFilter(noExternal, config.optimizeDeps?.exclude, { + : createFilter(undefined, exclude, { resolve: false }) } @@ -281,6 +292,7 @@ export async function optimizeServerSsrDeps( await addManuallyIncludedOptimizeDeps( deps, config, + ssr, alsoInclude, noExternalFilter ) @@ -296,9 +308,10 @@ export async function optimizeServerSsrDeps( export function initDepsOptimizerMetadata( config: ResolvedConfig, + ssr: boolean, timestamp?: string ): DepOptimizationMetadata { - const hash = getDepHash(config) + const hash = getDepHash(config, ssr) return { hash, browserHash: getOptimizedBrowserHash(hash, {}, timestamp), @@ -325,9 +338,9 @@ export function addOptimizedDepInfo( */ export function loadCachedDepOptimizationMetadata( config: ResolvedConfig, + ssr: boolean, force = config.optimizeDeps.force, - asCommand = false, - ssr = !!config.build.ssr + asCommand = false ): DepOptimizationMetadata | undefined { const log = asCommand ? config.logger.info : debug @@ -349,7 +362,7 @@ export function loadCachedDepOptimizationMetadata( ) } catch (e) {} // hash is consistent, no need to re-bundle - if (cachedMetadata && cachedMetadata.hash === getDepHash(config)) { + if (cachedMetadata && cachedMetadata.hash === getDepHash(config, ssr)) { log('Hash is consistent. Skipping. Use --force to override.') // Nothing to commit or cancel as we are using the cache, we only // need to resolve the processing promise so requests can move on @@ -396,7 +409,7 @@ export function toDiscoveredDependencies( timestamp?: string ): Record { const browserHash = getOptimizedBrowserHash( - getDepHash(config), + getDepHash(config, ssr), deps, timestamp ) @@ -408,7 +421,7 @@ export function toDiscoveredDependencies( file: getOptimizedDepPath(id, config, ssr), src, browserHash: browserHash, - exportsData: extractExportsData(src, config) + exportsData: extractExportsData(src, config, ssr) } } return discovered @@ -463,7 +476,7 @@ export async function runOptimizeDeps( JSON.stringify({ type: 'module' }) ) - const metadata = initDepsOptimizerMetadata(config) + const metadata = initDepsOptimizerMetadata(config, ssr) metadata.browserHash = getOptimizedBrowserHash( metadata.hash, @@ -504,13 +517,15 @@ export async function runOptimizeDeps( const idToExports: Record = {} const flatIdToExports: Record = {} - const { plugins = [], ...esbuildOptions } = - config.optimizeDeps?.esbuildOptions ?? {} + const optimizeDeps = getDepOptimizationConfig(config, ssr) + + const { plugins: pluginsFromConfig = [], ...esbuildOptions } = + optimizeDeps?.esbuildOptions ?? {} for (const id in depsInfo) { const src = depsInfo[id].src! const exportsData = await (depsInfo[id].exportsData ?? - extractExportsData(src, config)) + extractExportsData(src, config, ssr)) if (exportsData.jsxLoader) { // Ensure that optimization won't fail by defaulting '.js' to the JSX parser. // This is useful for packages such as Gatsby. @@ -538,6 +553,37 @@ export async function runOptimizeDeps( const platform = ssr && config.ssr?.target !== 'webworker' ? 'node' : 'browser' + const external = [...(optimizeDeps?.exclude ?? [])] + + if (isBuild) { + let rollupOptionsExternal = config?.build?.rollupOptions?.external + if (rollupOptionsExternal) { + if (typeof rollupOptionsExternal === 'string') { + rollupOptionsExternal = [rollupOptionsExternal] + } + // TODO: decide whether to support RegExp and function options + // They're not supported yet because `optimizeDeps.exclude` currently only accepts strings + if ( + !Array.isArray(rollupOptionsExternal) || + rollupOptionsExternal.some((ext) => typeof ext !== 'string') + ) { + throw new Error( + `[vite] 'build.rollupOptions.external' can only be an array of strings or a string.\n` + + `You can turn on 'legacy.buildRollupPluginCommonjs' to support more advanced options.` + ) + } + external.push(...(rollupOptionsExternal as string[])) + } + } + + const plugins = [...pluginsFromConfig] + if (external.length) { + plugins.push(esbuildCjsExternalPlugin(external)) + } + plugins.push( + esbuildDepPlugin(flatIdDeps, flatIdToExports, external, config, ssr) + ) + const start = performance.now() const result = await build({ @@ -558,17 +604,14 @@ export async function runOptimizeDeps( } : undefined, target: isBuild ? config.build.target || undefined : ESBUILD_MODULES_TARGET, - external: config.optimizeDeps?.exclude, + external, logLevel: 'error', splitting: true, sourcemap: true, outdir: processingCacheDir, ignoreAnnotations: !isBuild, metafile: true, - plugins: [ - ...plugins, - esbuildDepPlugin(flatIdDeps, flatIdToExports, config, ssr) - ], + plugins, ...esbuildOptions, supported: { 'dynamic-import': true, @@ -599,7 +642,7 @@ export async function runOptimizeDeps( browserHash: metadata.browserHash, // After bundling we have more information and can warn the user about legacy packages // that require manual configuration - needsInterop: needsInterop(config, id, idToExports[id], output) + needsInterop: needsInterop(config, ssr, id, idToExports[id], output) }) } @@ -634,21 +677,34 @@ export async function runOptimizeDeps( } export async function findKnownImports( - config: ResolvedConfig + config: ResolvedConfig, + ssr: boolean ): Promise { const deps = (await scanImports(config)).deps - await addManuallyIncludedOptimizeDeps(deps, config) + await addManuallyIncludedOptimizeDeps(deps, config, ssr) return Object.keys(deps) } export async function addManuallyIncludedOptimizeDeps( deps: Record, config: ResolvedConfig, + ssr: boolean, extra: string[] = [], filter?: (id: string) => boolean ): Promise { - const optimizeDepsInclude = config.optimizeDeps?.include ?? [] + const { logger } = config + const optimizeDeps = getDepOptimizationConfig(config, ssr) + const optimizeDepsInclude = optimizeDeps?.include ?? [] if (optimizeDepsInclude.length || extra.length) { + const unableToOptimize = (id: string, msg: string) => { + if (optimizeDepsInclude.includes(id)) { + logger.warn( + `${msg}: ${colors.cyan(id)}, present in '${ + ssr ? 'ssr.' : '' + }optimizeDeps.include'` + ) + } + } const resolve = config.createResolver({ asSrc: false, scan: true }) for (const id of [...optimizeDepsInclude, ...extra]) { // normalize 'foo >bar` as 'foo > bar' to prevent same id being added @@ -657,17 +713,13 @@ export async function addManuallyIncludedOptimizeDeps( if (!deps[normalizedId] && filter?.(normalizedId) !== false) { const entry = await resolve(id) if (entry) { - if (isOptimizable(entry, config.optimizeDeps)) { + if (isOptimizable(entry, optimizeDeps)) { deps[normalizedId] = entry - } else if (optimizeDepsInclude.includes(id)) { - config.logger.warn( - `Cannot optimize included dependency: ${colors.cyan(id)}` - ) + } else { + unableToOptimize(entry, 'Cannot optimize dependency') } } else { - throw new Error( - `Failed to resolve force included dependency: ${colors.cyan(id)}` - ) + unableToOptimize(id, 'Failed to resolve dependency') } } } @@ -865,12 +917,15 @@ function esbuildOutputFromId( export async function extractExportsData( filePath: string, - config: ResolvedConfig + config: ResolvedConfig, + ssr: boolean ): Promise { await init - const esbuildOptions = config.optimizeDeps?.esbuildOptions ?? {} - if (config.optimizeDeps.extensions?.some((ext) => filePath.endsWith(ext))) { + const optimizeDeps = getDepOptimizationConfig(config, ssr) + + const esbuildOptions = optimizeDeps?.esbuildOptions ?? {} + if (optimizeDeps.extensions?.some((ext) => filePath.endsWith(ext))) { // For custom supported extensions, build the entry file to transform it into JS, // and then parse with es-module-lexer. Note that the `bundle` option is not `true`, // so only the entry file is being transformed. @@ -933,12 +988,13 @@ const KNOWN_INTEROP_IDS = new Set(['moment']) function needsInterop( config: ResolvedConfig, + ssr: boolean, id: string, exportsData: ExportsData, output?: { exports: string[] } ): boolean { if ( - config.optimizeDeps?.needsInterop?.includes(id) || + getDepOptimizationConfig(config, ssr)?.needsInterop?.includes(id) || KNOWN_INTEROP_IDS.has(id) ) { return true @@ -972,10 +1028,11 @@ function isSingleDefaultExport(exports: readonly string[]) { const lockfileFormats = ['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml'] -export function getDepHash(config: ResolvedConfig): string { +export function getDepHash(config: ResolvedConfig, ssr: boolean): string { let content = lookupFile(config.root, lockfileFormats) || '' // also take config into account // only a subset of config options that can affect dep optimization + const optimizeDeps = getDepOptimizationConfig(config, ssr) content += JSON.stringify( { mode: process.env.NODE_ENV || config.mode, @@ -985,13 +1042,11 @@ export function getDepHash(config: ResolvedConfig): string { assetsInclude: config.assetsInclude, plugins: config.plugins.map((p) => p.name), optimizeDeps: { - include: config.optimizeDeps?.include, - exclude: config.optimizeDeps?.exclude, + include: optimizeDeps?.include, + exclude: optimizeDeps?.exclude, esbuildOptions: { - ...config.optimizeDeps?.esbuildOptions, - plugins: config.optimizeDeps?.esbuildOptions?.plugins?.map( - (p) => p.name - ) + ...optimizeDeps?.esbuildOptions, + plugins: optimizeDeps?.esbuildOptions?.plugins?.map((p) => p.name) } } }, @@ -1044,13 +1099,15 @@ function findOptimizedDepInfoInRecord( export async function optimizedDepNeedsInterop( metadata: DepOptimizationMetadata, file: string, - config: ResolvedConfig + config: ResolvedConfig, + ssr: boolean ): Promise { const depInfo = optimizedDepInfoFromFile(metadata, file) if (depInfo?.src && depInfo.needsInterop === undefined) { - depInfo.exportsData ??= extractExportsData(depInfo.src, config) + depInfo.exportsData ??= extractExportsData(depInfo.src, config, ssr) depInfo.needsInterop = needsInterop( config, + ssr, depInfo.id, await depInfo.exportsData ) diff --git a/packages/vite/src/node/optimizer/optimizer.ts b/packages/vite/src/node/optimizer/optimizer.ts index 5432f9493a7348..4759edeb9d0b51 100644 --- a/packages/vite/src/node/optimizer/optimizer.ts +++ b/packages/vite/src/node/optimizer/optimizer.ts @@ -1,6 +1,7 @@ import colors from 'picocolors' import _debug from 'debug' import { getHash } from '../utils' +import { getDepOptimizationConfig } from '..' import type { ResolvedConfig, ViteDevServer } from '..' import { addManuallyIncludedOptimizeDeps, @@ -40,10 +41,10 @@ const devSsrDepsOptimizerMap = new WeakMap() export function getDepsOptimizer( config: ResolvedConfig, - type: { ssr?: boolean } + ssr?: boolean ): DepsOptimizer | undefined { // Workers compilation shares the DepsOptimizer from the main build - const isDevSsr = type.ssr && config.command !== 'build' + const isDevSsr = ssr && config.command !== 'build' return (isDevSsr ? devSsrDepsOptimizerMap : depsOptimizerMap).get( config.mainConfig || config ) @@ -53,7 +54,9 @@ export async function initDepsOptimizer( config: ResolvedConfig, server?: ViteDevServer ): Promise { - if (!getDepsOptimizer(config, { ssr: false })) { + // Non Dev SSR Optimizer + const ssr = !!config.build.ssr + if (!getDepsOptimizer(config, ssr)) { await createDepsOptimizer(config, server) } } @@ -63,7 +66,8 @@ export async function initDevSsrDepsOptimizer( config: ResolvedConfig, server: ViteDevServer ): Promise { - if (getDepsOptimizer(config, { ssr: true })) { + if (getDepsOptimizer(config, true)) { + // ssr return } if (creatingDevSsrOptimizer) { @@ -73,10 +77,11 @@ export async function initDevSsrDepsOptimizer( // Important: scanning needs to be done before starting the SSR dev optimizer // If ssrLoadModule is called before server.listen(), the main deps optimizer // will not be yet created - if (!getDepsOptimizer(config, { ssr: false })) { + const ssr = false + if (!getDepsOptimizer(config, ssr)) { await initDepsOptimizer(config, server) } - await getDepsOptimizer(config, { ssr: false })!.scanProcessing + await getDepsOptimizer(config, ssr)!.scanProcessing await createDevSsrDepsOptimizer(config) creatingDevSsrOptimizer = undefined @@ -90,15 +95,16 @@ async function createDepsOptimizer( ): Promise { const { logger } = config const isBuild = config.command === 'build' + const ssr = !!config.build.ssr // safe as Dev SSR don't use this optimizer const sessionTimestamp = Date.now().toString() - const cachedMetadata = loadCachedDepOptimizationMetadata(config) + const cachedMetadata = loadCachedDepOptimizationMetadata(config, ssr) let handle: NodeJS.Timeout | undefined let metadata = - cachedMetadata || initDepsOptimizerMetadata(config, sessionTimestamp) + cachedMetadata || initDepsOptimizerMetadata(config, ssr, sessionTimestamp) const depsOptimizer: DepsOptimizer = { metadata, @@ -112,7 +118,7 @@ async function createDepsOptimizer( delayDepsOptimizerUntil, resetRegisteredIds, ensureFirstRun, - options: config.optimizeDeps + options: getDepOptimizationConfig(config, ssr) } depsOptimizerMap.set(config, depsOptimizer) @@ -160,12 +166,12 @@ async function createDepsOptimizer( // Initialize discovered deps with manually added optimizeDeps.include info const deps: Record = {} - await addManuallyIncludedOptimizeDeps(deps, config) + await addManuallyIncludedOptimizeDeps(deps, config, ssr) const discovered = await toDiscoveredDependencies( config, deps, - !!config.build.ssr, + ssr, sessionTimestamp ) @@ -481,14 +487,8 @@ async function createDepsOptimizer( function registerMissingImport( id: string, - resolved: string, - ssr?: boolean + resolved: string ): OptimizedDepInfo { - if (!isBuild && ssr) { - config.logger.error( - 'Vite internal error: ssr dep registerd as a browser dep' - ) - } const optimized = metadata.optimized[id] if (optimized) { return optimized @@ -504,7 +504,7 @@ async function createDepsOptimizer( return missing } - missing = addMissingDep(id, resolved, ssr) + missing = addMissingDep(id, resolved) // Until the first optimize run is called, avoid triggering processing // We'll wait until the user codebase is eagerly processed by Vite so @@ -522,7 +522,7 @@ async function createDepsOptimizer( return missing } - function addMissingDep(id: string, resolved: string, ssr?: boolean) { + function addMissingDep(id: string, resolved: string) { newDepsDiscovered = true return addOptimizedDepInfo(metadata, 'discovered', { @@ -541,7 +541,7 @@ async function createDepsOptimizer( // loading of this pre-bundled dep needs to await for its processing // promise to be resolved processing: depOptimizationProcessing.promise, - exportsData: extractExportsData(resolved, config) + exportsData: extractExportsData(resolved, config, ssr) }) } @@ -748,7 +748,7 @@ async function createDevSsrDepsOptimizer( delayDepsOptimizerUntil: (id: string, done: () => Promise) => {}, resetRegisteredIds: () => {}, ensureFirstRun: () => {}, - options: config.optimizeDeps + options: config.ssr.optimizeDeps } devSsrDepsOptimizerMap.set(config, depsOptimizer) } diff --git a/packages/vite/src/node/optimizer/scan.ts b/packages/vite/src/node/optimizer/scan.ts index 5608472b4efe91..f4eae2bc2ed3e2 100644 --- a/packages/vite/src/node/optimizer/scan.ts +++ b/packages/vite/src/node/optimizer/scan.ts @@ -44,6 +44,8 @@ export async function scanImports(config: ResolvedConfig): Promise<{ deps: Record missing: Record }> { + // Only used to scan non-ssr code + const start = performance.now() let entries: string[] = [] diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index 5af046908ff0fa..3458b9f3d51d8e 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -9,6 +9,7 @@ import { parse as parseJS } from 'acorn' import type { Node } from 'estree' import { findStaticImports, parseStaticImport } from 'mlly' import { makeLegalIdentifier } from '@rollup/pluginutils' +import { getDepOptimizationConfig } from '..' import type { ViteDevServer } from '..' import { CLIENT_DIR, @@ -214,7 +215,7 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { ) } - const depsOptimizer = getDepsOptimizer(config, { ssr }) + const depsOptimizer = getDepsOptimizer(config, ssr) const { moduleGraph } = server // since we are already in the transform phase of the importer, it must @@ -267,7 +268,9 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { } let importerFile = importer - if (moduleListContains(config.optimizeDeps?.exclude, url)) { + + const optimizeDeps = getDepOptimizationConfig(config, ssr) + if (moduleListContains(optimizeDeps?.exclude, url)) { if (depsOptimizer) { await depsOptimizer.scanProcessing @@ -485,7 +488,8 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { const needsInterop = await optimizedDepNeedsInterop( depsOptimizer.metadata, file, - config + config, + ssr ) if (needsInterop === undefined) { diff --git a/packages/vite/src/node/plugins/importAnalysisBuild.ts b/packages/vite/src/node/plugins/importAnalysisBuild.ts index b83ae46451c8f7..18a33b6d61ce74 100644 --- a/packages/vite/src/node/plugins/importAnalysisBuild.ts +++ b/packages/vite/src/node/plugins/importAnalysisBuild.ts @@ -14,6 +14,7 @@ import { moduleListContains } from '../utils' import type { Plugin } from '../plugin' +import { getDepOptimizationConfig } from '../config' import type { ResolvedConfig } from '../config' import { genSourceMapUrl } from '../server/sourcemap' import { getDepsOptimizer, optimizedDepNeedsInterop } from '../optimizer' @@ -155,7 +156,7 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin { } const { root } = config - const depsOptimizer = getDepsOptimizer(config, { ssr }) + const depsOptimizer = getDepsOptimizer(config, ssr) const normalizeUrl = async ( url: string, @@ -163,7 +164,8 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin { ): Promise<[string, string]> => { let importerFile = importer - if (moduleListContains(config.optimizeDeps?.exclude, url)) { + const optimizeDeps = getDepOptimizationConfig(config, ssr) + if (moduleListContains(optimizeDeps?.exclude, url)) { if (depsOptimizer) { await depsOptimizer.scanProcessing @@ -260,7 +262,8 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin { const needsInterop = await optimizedDepNeedsInterop( depsOptimizer.metadata, file, - config + config, + ssr ) let rewriteDone = false diff --git a/packages/vite/src/node/plugins/index.ts b/packages/vite/src/node/plugins/index.ts index 0bab69f50eeb98..c58cf8f30a77e5 100644 --- a/packages/vite/src/node/plugins/index.ts +++ b/packages/vite/src/node/plugins/index.ts @@ -33,7 +33,6 @@ export async function resolvePlugins( ): Promise { const isBuild = config.command === 'build' const isWatch = isBuild && !!config.build.watch - const buildPlugins = isBuild ? (await import('../build')).resolveBuildPlugins(config) : { pre: [], post: [] } @@ -47,7 +46,8 @@ export async function resolvePlugins( config.build.polyfillModulePreload ? modulePreloadPolyfillPlugin(config) : null, - ...(isDepsOptimizerEnabled(config) + ...(isDepsOptimizerEnabled(config, false) || + isDepsOptimizerEnabled(config, true) ? [ isBuild ? optimizedDepsBuildPlugin(config) @@ -62,8 +62,7 @@ export async function resolvePlugins( packageCache: config.packageCache, ssrConfig: config.ssr, asSrc: true, - getDepsOptimizer: (type: { ssr?: boolean }) => - getDepsOptimizer(config, type), + getDepsOptimizer: (ssr: boolean) => getDepsOptimizer(config, ssr), shouldExternalize: isBuild && config.build.ssr && config.ssr?.format !== 'cjs' ? (id) => shouldExternalizeForSSR(id, config) diff --git a/packages/vite/src/node/plugins/optimizedDeps.ts b/packages/vite/src/node/plugins/optimizedDeps.ts index dff944c3d224e2..98139519b88a47 100644 --- a/packages/vite/src/node/plugins/optimizedDeps.ts +++ b/packages/vite/src/node/plugins/optimizedDeps.ts @@ -18,7 +18,7 @@ export function optimizedDepsPlugin(config: ResolvedConfig): Plugin { name: 'vite:optimized-deps', async resolveId(id, source, { ssr }) { - if (getDepsOptimizer(config, { ssr })?.isOptimizedDepFile(id)) { + if (getDepsOptimizer(config, ssr)?.isOptimizedDepFile(id)) { return id } }, @@ -29,7 +29,7 @@ export function optimizedDepsPlugin(config: ResolvedConfig): Plugin { async load(id, options) { const ssr = options?.ssr === true - const depsOptimizer = getDepsOptimizer(config, { ssr }) + const depsOptimizer = getDepsOptimizer(config, ssr) if (depsOptimizer?.isOptimizedDepFile(id)) { const metadata = depsOptimizer.metadata const file = cleanUrl(id) @@ -85,29 +85,26 @@ export function optimizedDepsBuildPlugin(config: ResolvedConfig): Plugin { if (!config.isWorker) { // This will be run for the current active optimizer, during build // it will be the SSR optimizer if config.build.ssr is defined - getDepsOptimizer(config, { ssr: undefined })?.resetRegisteredIds() + getDepsOptimizer(config)?.resetRegisteredIds() } }, async resolveId(id, importer, { ssr }) { - if (getDepsOptimizer(config, { ssr })?.isOptimizedDepFile(id)) { + if (getDepsOptimizer(config, ssr)?.isOptimizedDepFile(id)) { return id } }, transform(_code, id, options) { const ssr = options?.ssr === true - getDepsOptimizer(config, { ssr })?.delayDepsOptimizerUntil( - id, - async () => { - await this.load({ id }) - } - ) + getDepsOptimizer(config, ssr)?.delayDepsOptimizerUntil(id, async () => { + await this.load({ id }) + }) }, async load(id, options) { const ssr = options?.ssr === true - const depsOptimizer = getDepsOptimizer(config, { ssr }) + const depsOptimizer = getDepsOptimizer(config, ssr) if (!depsOptimizer?.isOptimizedDepFile(id)) { return } diff --git a/packages/vite/src/node/plugins/preAlias.ts b/packages/vite/src/node/plugins/preAlias.ts index 2623a9d4ec97bc..d9cd9cdfb888d6 100644 --- a/packages/vite/src/node/plugins/preAlias.ts +++ b/packages/vite/src/node/plugins/preAlias.ts @@ -13,7 +13,7 @@ export function preAliasPlugin(config: ResolvedConfig): Plugin { name: 'vite:pre-alias', async resolveId(id, importer, options) { const ssr = options?.ssr === true - const depsOptimizer = getDepsOptimizer(config, { ssr }) + const depsOptimizer = getDepsOptimizer(config, ssr) if ( importer && depsOptimizer && diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index a18a30d72ee073..cbad9fab449e0d 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -83,7 +83,7 @@ export interface InternalResolveOptions extends ResolveOptions { // True when resolving during the scan phase to discover dependencies scan?: boolean // Resolve using esbuild deps optimization - getDepsOptimizer?: (type: { ssr?: boolean }) => DepsOptimizer | undefined + getDepsOptimizer?: (ssr: boolean) => DepsOptimizer | undefined shouldExternalize?: (id: string) => boolean | undefined } @@ -106,7 +106,7 @@ export function resolvePlugin(resolveOptions: InternalResolveOptions): Plugin { // We need to delay depsOptimizer until here instead of passing it as an option // the resolvePlugin because the optimizer is created on server listen during dev - const depsOptimizer = resolveOptions.getDepsOptimizer?.({ ssr }) + const depsOptimizer = resolveOptions.getDepsOptimizer?.(ssr) if (id.startsWith(browserExternalId)) { return id diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts index cf62c91f0f24f9..29c05a880d998c 100644 --- a/packages/vite/src/node/plugins/worker.ts +++ b/packages/vite/src/node/plugins/worker.ts @@ -270,7 +270,7 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin { : 'module' const workerOptions = workerType === 'classic' ? '' : ',{type: "module"}' if (isBuild) { - getDepsOptimizer(config, { ssr })?.registerWorkersSource(id) + getDepsOptimizer(config, ssr)?.registerWorkersSource(id) if (query.inline != null) { const chunk = await bundleWorkerEntry(config, id, query) // inline as blob data url diff --git a/packages/vite/src/node/plugins/workerImportMetaUrl.ts b/packages/vite/src/node/plugins/workerImportMetaUrl.ts index 86b8e377a40c71..5fbd7d4883382f 100644 --- a/packages/vite/src/node/plugins/workerImportMetaUrl.ts +++ b/packages/vite/src/node/plugins/workerImportMetaUrl.ts @@ -118,7 +118,7 @@ export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin { let url: string if (isBuild) { - getDepsOptimizer(config, { ssr })?.registerWorkersSource(id) + getDepsOptimizer(config, ssr)?.registerWorkersSource(id) url = await workerFileToUrl(config, file, query) } else { url = await fileToUrl(cleanUrl(file), config, this) diff --git a/packages/vite/src/node/server/index.ts b/packages/vite/src/node/server/index.ts index 9c722ed667a4e7..d270c92bfd0e74 100644 --- a/packages/vite/src/node/server/index.ts +++ b/packages/vite/src/node/server/index.ts @@ -329,7 +329,7 @@ export async function createServer( }, transformIndexHtml: null!, // to be immediately set async ssrLoadModule(url, opts?: { fixStacktrace?: boolean }) { - if (isDepsOptimizerEnabled(config)) { + if (isDepsOptimizerEnabled(config, true)) { await initDevSsrDepsOptimizer(config, server) } await updateCjsSsrExternals(server) @@ -539,7 +539,8 @@ export async function createServer( } initingServer = (async function () { await container.buildStart({}) - if (isDepsOptimizerEnabled(config)) { + if (isDepsOptimizerEnabled(config, false)) { + // non-ssr await initDepsOptimizer(config, server) } initingServer = undefined @@ -776,7 +777,7 @@ async function updateCjsSsrExternals(server: ViteDevServer) { // This is part of the v2 externalization heuristics and it is kept // for backwards compatibility in case user needs to fallback to the // legacy scheme. It may be removed in a future v3 minor. - const depsOptimizer = getDepsOptimizer(server.config, { ssr: false }) + const depsOptimizer = getDepsOptimizer(server.config, false) // non-ssr if (depsOptimizer) { await depsOptimizer.scanProcessing diff --git a/packages/vite/src/node/server/middlewares/transform.ts b/packages/vite/src/node/server/middlewares/transform.ts index 15151b7a29e08a..8d240df9cda2f1 100644 --- a/packages/vite/src/node/server/middlewares/transform.ts +++ b/packages/vite/src/node/server/middlewares/transform.ts @@ -71,11 +71,8 @@ export function transformMiddleware( const isSourceMap = withoutQuery.endsWith('.map') // since we generate source map references, handle those requests here if (isSourceMap) { - if ( - getDepsOptimizer(server.config, { ssr: false })?.isOptimizedDepUrl( - url - ) - ) { + const depsOptimizer = getDepsOptimizer(server.config, false) // non-ssr + if (depsOptimizer?.isOptimizedDepUrl(url)) { // If the browser is requesting a source map for an optimized dep, it // means that the dependency has already been pre-bundled and loaded const mapFile = url.startsWith(FS_PREFIX) @@ -189,12 +186,10 @@ export function transformMiddleware( html: req.headers.accept?.includes('text/html') }) if (result) { + const depsOptimizer = getDepsOptimizer(server.config, false) // non-ssr const type = isDirectCSSRequest(url) ? 'css' : 'js' const isDep = - DEP_VERSION_RE.test(url) || - getDepsOptimizer(server.config, { ssr: false })?.isOptimizedDepUrl( - url - ) + DEP_VERSION_RE.test(url) || depsOptimizer?.isOptimizedDepUrl(url) return send(req, res, result.code, type, { etag: result.etag, // allow browser to cache npm deps! diff --git a/packages/vite/src/node/server/transformRequest.ts b/packages/vite/src/node/server/transformRequest.ts index 574e69b27524a5..7f74d5ee704544 100644 --- a/packages/vite/src/node/server/transformRequest.ts +++ b/packages/vite/src/node/server/transformRequest.ts @@ -145,7 +145,7 @@ async function doTransform( const result = loadAndTransform(id, url, server, options, timestamp) - getDepsOptimizer(config, { ssr })?.delayDepsOptimizerUntil(id, () => result) + getDepsOptimizer(config, ssr)?.delayDepsOptimizerUntil(id, () => result) return result } diff --git a/packages/vite/src/node/ssr/index.ts b/packages/vite/src/node/ssr/index.ts index 84f050ff8e41d4..0d70e53cccdb5e 100644 --- a/packages/vite/src/node/ssr/index.ts +++ b/packages/vite/src/node/ssr/index.ts @@ -1,9 +1,13 @@ +import type { DepOptimizationConfig } from '../optimizer' + export type SSRTarget = 'node' | 'webworker' export type SSRFormat = 'esm' | 'cjs' +export type SsrDepOptimizationOptions = DepOptimizationConfig + export interface SSROptions { - external?: string[] noExternal?: string | RegExp | (string | RegExp)[] | true + external?: string[] /** * Define the target for the ssr build. The browser field in package.json * is ignored for node but used if webworker is the target @@ -18,22 +22,50 @@ export interface SSROptions { * @experimental */ format?: SSRFormat + /** + * Control over which dependencies are optimized during SSR and esbuild options + * During build: + * no external CJS dependencies are optimized by default + * During dev: + * explicit no external CJS dependencies are optimized by default + * @experimental + */ + optimizeDeps?: SsrDepOptimizationOptions } export interface ResolvedSSROptions extends SSROptions { target: SSRTarget format: SSRFormat + optimizeDeps: SsrDepOptimizationOptions } export function resolveSSROptions( - ssr: SSROptions | undefined -): ResolvedSSROptions | undefined { - if (ssr === undefined) { - return undefined + ssr: SSROptions | undefined, + buildSsrCjsExternalHeuristics?: boolean, + preserveSymlinks?: boolean +): ResolvedSSROptions { + ssr ??= {} + const optimizeDeps = ssr.optimizeDeps ?? {} + let format: SSRFormat = 'esm' + let target: SSRTarget = 'node' + if (buildSsrCjsExternalHeuristics) { + if (ssr) { + format = 'cjs' + } else { + target = 'node' + format = 'cjs' + } } return { - format: 'esm', - target: 'node', - ...ssr + format, + target, + ...ssr, + optimizeDeps: { + ...optimizeDeps, + esbuildOptions: { + preserveSymlinks, + ...optimizeDeps.esbuildOptions + } + } } } diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index 6f7bef05752003..0b0c205d80b9e4 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -28,6 +28,7 @@ import { VALID_ID_PREFIX, wildcardHosts } from './constants' +import type { DepOptimizationConfig } from './optimizer' import type { ResolvedConfig } from '.' /** @@ -94,11 +95,12 @@ export function moduleListContains( export function isOptimizable( id: string, - optimizeDepsConfig: ResolvedConfig['optimizeDeps'] + optimizeDeps: DepOptimizationConfig ): boolean { + const { extensions } = optimizeDeps return ( OPTIMIZABLE_ENTRY_RE.test(id) || - (optimizeDepsConfig.extensions?.some((ext) => id.endsWith(ext)) ?? false) + (extensions?.some((ext) => id.endsWith(ext)) ?? false) ) }