@nlabs/lex 1.59.4 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/.storybook/main.ts +3 -47
  2. package/README.md +13 -19
  3. package/__mocks__/build.js +3 -3
  4. package/config.json +3 -1
  5. package/examples/lex.config.js +3 -7
  6. package/lib/LexConfig.d.ts +2 -6
  7. package/lib/LexConfig.js +2 -2
  8. package/lib/commands/ai/ai.js +3 -3
  9. package/lib/commands/build/build.d.ts +5 -3
  10. package/lib/commands/build/build.js +66 -156
  11. package/lib/commands/config/config.js +9 -7
  12. package/lib/commands/dev/dev.d.ts +0 -2
  13. package/lib/commands/dev/dev.js +24 -115
  14. package/lib/commands/init/init.js +4 -9
  15. package/lib/commands/migrate/migrate.js +2 -2
  16. package/lib/commands/serverless-dev/serverless-dev.js +2 -2
  17. package/lib/commands/versions/versions.d.ts +1 -1
  18. package/lib/commands/versions/versions.js +4 -4
  19. package/lib/lex.js +10 -11
  20. package/lib/types.d.ts +1 -1
  21. package/lib/types.js +1 -1
  22. package/lib/utils/app.d.ts +0 -2
  23. package/lib/utils/app.js +2 -29
  24. package/lib/utils/{webpack/LexSvgSpritemapPlugin.d.ts → assets/LexSvgSpritemap.d.ts} +6 -8
  25. package/lib/utils/assets/LexSvgSpritemap.js +219 -0
  26. package/lib/utils/file.d.ts +0 -4
  27. package/lib/utils/file.js +4 -100
  28. package/lib/utils/staticSite.d.ts +15 -0
  29. package/lib/utils/staticSite.js +80 -0
  30. package/lib/utils/vite/assets.d.ts +19 -0
  31. package/lib/utils/vite/assets.js +249 -0
  32. package/lib/utils/vite/config.d.ts +12 -0
  33. package/lib/utils/vite/config.js +279 -0
  34. package/package.json +27 -45
  35. package/postcss.config.js +1 -2
  36. package/tsconfig.lint.json +0 -1
  37. package/tsconfig.test.json +0 -1
  38. package/lib/utils/webpack/LexSvgSpritemapPlugin.js +0 -255
  39. package/scripts/test-webpack.js +0 -453
  40. package/webpack.config.d.ts +0 -2
  41. package/webpack.config.js +0 -960
@@ -0,0 +1,249 @@
1
+ /**
2
+ * Copyright (c) 2018-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */ import { gzipSync } from 'zlib';
5
+ import favicons from 'favicons';
6
+ import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from 'fs';
7
+ import { sync as globSync } from 'glob';
8
+ import { extname, join, relative, resolve } from 'path';
9
+ import sharp from 'sharp';
10
+ import { optimize } from 'svgo';
11
+ import { LexSvgSpritemap } from '../assets/LexSvgSpritemap.js';
12
+ const COMPRESSIBLE_FILE = /\.(css|html|js|json|svg|txt|xml)$/i;
13
+ const IMAGE_FILE = /\.(gif|jpe?g|png|svg|webp)$/i;
14
+ const MINIMUM_GZIP_SIZE = 8192;
15
+ const faviconCache = new Map();
16
+ const copyDirectory = (source, destination, exclude)=>{
17
+ if (!existsSync(source)) return;
18
+ for (const entry of readdirSync(source, {
19
+ withFileTypes: true
20
+ })){
21
+ const sourcePath = join(source, entry.name);
22
+ const destinationPath = join(destination, entry.name);
23
+ if (exclude?.test(sourcePath)) continue;
24
+ if (entry.isDirectory()) {
25
+ copyDirectory(sourcePath, destinationPath, exclude);
26
+ } else {
27
+ mkdirSync(resolve(destinationPath, '..'), {
28
+ recursive: true
29
+ });
30
+ writeFileSync(destinationPath, readFileSync(sourcePath));
31
+ }
32
+ }
33
+ };
34
+ const getAssetDirectories = (config)=>{
35
+ const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
36
+ const staticPath = config.vite?.staticPath || './src/static';
37
+ return [
38
+ {
39
+ destination: '',
40
+ source: resolve(process.cwd(), staticPath)
41
+ },
42
+ {
43
+ destination: 'images',
44
+ source: resolve(sourcePath, 'images')
45
+ },
46
+ {
47
+ destination: 'fonts',
48
+ source: resolve(sourcePath, 'fonts')
49
+ },
50
+ {
51
+ destination: 'docs',
52
+ source: resolve(sourcePath, 'docs')
53
+ },
54
+ {
55
+ destination: 'icons',
56
+ exclude: /\.svg$/i,
57
+ source: resolve(sourcePath, 'icons')
58
+ }
59
+ ];
60
+ };
61
+ export const generateLexFavicons = async (config)=>{
62
+ const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
63
+ const logoPath = resolve(sourcePath, 'images/logo.png');
64
+ if (!existsSync(logoPath)) return null;
65
+ const modifiedAt = statSync(logoPath).mtimeMs;
66
+ const cached = faviconCache.get(logoPath);
67
+ if (cached?.modifiedAt === modifiedAt) return cached.response;
68
+ const generated = await favicons(logoPath, {
69
+ icons: {
70
+ android: true,
71
+ appleIcon: true,
72
+ appleStartup: false,
73
+ favicons: true,
74
+ windows: false,
75
+ yandex: false
76
+ },
77
+ path: '/'
78
+ });
79
+ const [openGraphImage, twitterImage] = await Promise.all([
80
+ sharp(logoPath).resize(1200, 630, {
81
+ fit: 'contain'
82
+ }).png().toBuffer(),
83
+ sharp(logoPath).resize(1200, 675, {
84
+ fit: 'contain'
85
+ }).png().toBuffer()
86
+ ]);
87
+ const response = {
88
+ ...generated,
89
+ html: [
90
+ ...generated.html,
91
+ '<meta property="og:image" content="/open-graph.png">',
92
+ '<meta name="twitter:image" content="/twitter.png">'
93
+ ],
94
+ images: [
95
+ ...generated.images,
96
+ {
97
+ contents: openGraphImage,
98
+ name: 'open-graph.png'
99
+ },
100
+ {
101
+ contents: twitterImage,
102
+ name: 'twitter.png'
103
+ }
104
+ ]
105
+ };
106
+ faviconCache.set(logoPath, {
107
+ modifiedAt,
108
+ response
109
+ });
110
+ return response;
111
+ };
112
+ export const copyLexWebAssets = async (config)=>{
113
+ const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
114
+ for (const assetDirectory of getAssetDirectories(config)){
115
+ copyDirectory(assetDirectory.source, resolve(outputPath, assetDirectory.destination), assetDirectory.exclude);
116
+ }
117
+ const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
118
+ const spritemap = new LexSvgSpritemap(resolve(sourcePath, 'icons/**/*.svg'), {
119
+ filename: 'icons/icons.svg',
120
+ prefix: false
121
+ }).buildSpritemap();
122
+ for (const warning of spritemap.warnings)console.warn(warning.message);
123
+ if (spritemap.content) {
124
+ const spritePath = resolve(outputPath, 'icons/icons.svg');
125
+ mkdirSync(resolve(spritePath, '..'), {
126
+ recursive: true
127
+ });
128
+ writeFileSync(spritePath, spritemap.content);
129
+ }
130
+ const generatedFavicons = await generateLexFavicons(config);
131
+ if (generatedFavicons) {
132
+ for (const image of generatedFavicons.images){
133
+ const imagePath = resolve(outputPath, image.name);
134
+ mkdirSync(resolve(imagePath, '..'), {
135
+ recursive: true
136
+ });
137
+ writeFileSync(imagePath, image.contents);
138
+ }
139
+ for (const file of generatedFavicons.files){
140
+ const filePath = resolve(outputPath, file.name);
141
+ mkdirSync(resolve(filePath, '..'), {
142
+ recursive: true
143
+ });
144
+ writeFileSync(filePath, file.contents);
145
+ }
146
+ const indexPath = resolve(outputPath, 'index.html');
147
+ if (existsSync(indexPath)) {
148
+ const html = readFileSync(indexPath, 'utf8');
149
+ const faviconHtml = generatedFavicons.html.join('\n ');
150
+ writeFileSync(indexPath, html.replace('</head>', ` ${faviconHtml}\n </head>`));
151
+ }
152
+ }
153
+ };
154
+ const optimizeImage = async (filePath)=>{
155
+ const extension = extname(filePath).toLowerCase();
156
+ const source = readFileSync(filePath);
157
+ if (extension === '.svg') {
158
+ const isSpritemap = filePath.endsWith('/icons/icons.svg');
159
+ const result = optimize(source.toString(), {
160
+ multipass: true,
161
+ path: filePath,
162
+ plugins: isSpritemap ? [
163
+ {
164
+ name: 'preset-default',
165
+ params: {
166
+ overrides: {
167
+ cleanupIds: false,
168
+ removeHiddenElems: false
169
+ }
170
+ }
171
+ }
172
+ ] : [
173
+ 'preset-default'
174
+ ]
175
+ });
176
+ writeFileSync(filePath, result.data);
177
+ return;
178
+ }
179
+ let image = sharp(source);
180
+ if (extension === '.jpg' || extension === '.jpeg') image = image.jpeg({
181
+ progressive: true,
182
+ quality: 65
183
+ });
184
+ if (extension === '.png') image = image.png({
185
+ quality: 90
186
+ });
187
+ if (extension === '.webp') image = image.webp({
188
+ quality: 75
189
+ });
190
+ if (extension === '.gif') image = image.gif();
191
+ const optimized = await image.toBuffer();
192
+ if (optimized.length < source.length) writeFileSync(filePath, optimized);
193
+ };
194
+ export const optimizeLexWebAssets = async (config)=>{
195
+ const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
196
+ if (!existsSync(outputPath)) return;
197
+ const imageFiles = globSync('**/*.{gif,jpg,jpeg,png,svg,webp}', {
198
+ absolute: true,
199
+ cwd: outputPath,
200
+ nodir: true
201
+ });
202
+ await Promise.all(imageFiles.filter((filePath)=>IMAGE_FILE.test(filePath)).map(optimizeImage));
203
+ };
204
+ export const compressLexWebAssets = (config)=>{
205
+ const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
206
+ if (!existsSync(outputPath)) return;
207
+ const files = globSync('**/*', {
208
+ absolute: true,
209
+ cwd: outputPath,
210
+ nodir: true
211
+ });
212
+ for (const filePath of files){
213
+ if (!COMPRESSIBLE_FILE.test(filePath) || statSync(filePath).size < MINIMUM_GZIP_SIZE) continue;
214
+ writeFileSync(`${filePath}.gz`, gzipSync(readFileSync(filePath)));
215
+ }
216
+ };
217
+ export const getDevAsset = async (config, requestPath)=>{
218
+ const normalizedPath = requestPath.split('?')[0].replace(/^\/+/, '');
219
+ if (normalizedPath.includes('..')) return null;
220
+ if (normalizedPath === 'icons/icons.svg') {
221
+ const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
222
+ const spritemap = new LexSvgSpritemap(resolve(sourcePath, 'icons/**/*.svg'), {
223
+ prefix: false
224
+ }).buildSpritemap();
225
+ return spritemap.content ? Buffer.from(spritemap.content) : null;
226
+ }
227
+ const generatedFavicons = await generateLexFavicons(config);
228
+ const generatedImage = generatedFavicons?.images.find(({ name })=>name === normalizedPath);
229
+ if (generatedImage) return generatedImage.contents;
230
+ const generatedFile = generatedFavicons?.files.find(({ name })=>name === normalizedPath);
231
+ if (generatedFile) return Buffer.from(generatedFile.contents);
232
+ for (const assetDirectory of getAssetDirectories(config)){
233
+ const prefix = assetDirectory.destination ? `${assetDirectory.destination}/` : '';
234
+ if (!normalizedPath.startsWith(prefix)) continue;
235
+ const relativePath = normalizedPath.slice(prefix.length);
236
+ const filePath = resolve(assetDirectory.source, relativePath);
237
+ if (filePath.startsWith(resolve(assetDirectory.source)) && existsSync(filePath) && statSync(filePath).isFile()) {
238
+ if (assetDirectory.exclude?.test(filePath)) continue;
239
+ return readFileSync(filePath);
240
+ }
241
+ }
242
+ return null;
243
+ };
244
+ export const getAssetRelativePath = (config, filePath)=>{
245
+ const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
246
+ return relative(outputPath, filePath);
247
+ };
248
+
249
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy92aXRlL2Fzc2V0cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtnemlwU3luY30gZnJvbSAnemxpYic7XG5pbXBvcnQgZmF2aWNvbnMgZnJvbSAnZmF2aWNvbnMnO1xuaW1wb3J0IHtleGlzdHNTeW5jLCBta2RpclN5bmMsIHJlYWRGaWxlU3luYywgcmVhZGRpclN5bmMsIHN0YXRTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge3N5bmMgYXMgZ2xvYlN5bmN9IGZyb20gJ2dsb2InO1xuaW1wb3J0IHtleHRuYW1lLCBqb2luLCByZWxhdGl2ZSwgcmVzb2x2ZX0gZnJvbSAncGF0aCc7XG5pbXBvcnQgc2hhcnAgZnJvbSAnc2hhcnAnO1xuaW1wb3J0IHtvcHRpbWl6ZX0gZnJvbSAnc3Znbyc7XG5cbmltcG9ydCB0eXBlIHtMZXhDb25maWdUeXBlfSBmcm9tICcuLi8uLi9MZXhDb25maWcuanMnO1xuaW1wb3J0IHtMZXhTdmdTcHJpdGVtYXB9IGZyb20gJy4uL2Fzc2V0cy9MZXhTdmdTcHJpdGVtYXAuanMnO1xuXG5jb25zdCBDT01QUkVTU0lCTEVfRklMRSA9IC9cXC4oY3NzfGh0bWx8anN8anNvbnxzdmd8dHh0fHhtbCkkL2k7XG5jb25zdCBJTUFHRV9GSUxFID0gL1xcLihnaWZ8anBlP2d8cG5nfHN2Z3x3ZWJwKSQvaTtcbmNvbnN0IE1JTklNVU1fR1pJUF9TSVpFID0gODE5MjtcblxuaW50ZXJmYWNlIEdlbmVyYXRlZEZhdmljb25zIHtcbiAgcmVhZG9ubHkgZmlsZXM6IFJlYWRvbmx5QXJyYXk8e2NvbnRlbnRzOiBzdHJpbmc7IG5hbWU6IHN0cmluZ30+O1xuICByZWFkb25seSBodG1sOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgaW1hZ2VzOiBSZWFkb25seUFycmF5PHtjb250ZW50czogQnVmZmVyOyBuYW1lOiBzdHJpbmd9Pjtcbn1cblxuY29uc3QgZmF2aWNvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHttb2RpZmllZEF0OiBudW1iZXI7IHJlc3BvbnNlOiBHZW5lcmF0ZWRGYXZpY29uc30+KCk7XG5cbmNvbnN0IGNvcHlEaXJlY3RvcnkgPSAoc291cmNlOiBzdHJpbmcsIGRlc3RpbmF0aW9uOiBzdHJpbmcsIGV4Y2x1ZGU/OiBSZWdFeHApOiB2b2lkID0+IHtcbiAgaWYoIWV4aXN0c1N5bmMoc291cmNlKSkgcmV0dXJuO1xuXG4gIGZvcihjb25zdCBlbnRyeSBvZiByZWFkZGlyU3luYyhzb3VyY2UsIHt3aXRoRmlsZVR5cGVzOiB0cnVlfSkpIHtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gam9pbihzb3VyY2UsIGVudHJ5Lm5hbWUpO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uUGF0aCA9IGpvaW4oZGVzdGluYXRpb24sIGVudHJ5Lm5hbWUpO1xuXG4gICAgaWYoZXhjbHVkZT8udGVzdChzb3VyY2VQYXRoKSkgY29udGludWU7XG5cbiAgICBpZihlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb3B5RGlyZWN0b3J5KHNvdXJjZVBhdGgsIGRlc3RpbmF0aW9uUGF0aCwgZXhjbHVkZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1rZGlyU3luYyhyZXNvbHZlKGRlc3RpbmF0aW9uUGF0aCwgJy4uJyksIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoZGVzdGluYXRpb25QYXRoLCByZWFkRmlsZVN5bmMoc291cmNlUGF0aCkpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgZ2V0QXNzZXREaXJlY3RvcmllcyA9IChjb25maWc6IExleENvbmZpZ1R5cGUpOiBBcnJheTx7ZGVzdGluYXRpb246IHN0cmluZzsgZXhjbHVkZT86IFJlZ0V4cDsgc291cmNlOiBzdHJpbmd9PiA9PiB7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBjb25maWcuc291cmNlRnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcuc291cmNlUGF0aCB8fCAnLi9zcmMnKTtcbiAgY29uc3Qgc3RhdGljUGF0aCA9IGNvbmZpZy52aXRlPy5zdGF0aWNQYXRoIHx8ICcuL3NyYy9zdGF0aWMnO1xuXG4gIHJldHVybiBbXG4gICAge2Rlc3RpbmF0aW9uOiAnJywgc291cmNlOiByZXNvbHZlKHByb2Nlc3MuY3dkKCksIHN0YXRpY1BhdGgpfSxcbiAgICB7ZGVzdGluYXRpb246ICdpbWFnZXMnLCBzb3VyY2U6IHJlc29sdmUoc291cmNlUGF0aCwgJ2ltYWdlcycpfSxcbiAgICB7ZGVzdGluYXRpb246ICdmb250cycsIHNvdXJjZTogcmVzb2x2ZShzb3VyY2VQYXRoLCAnZm9udHMnKX0sXG4gICAge2Rlc3RpbmF0aW9uOiAnZG9jcycsIHNvdXJjZTogcmVzb2x2ZShzb3VyY2VQYXRoLCAnZG9jcycpfSxcbiAgICB7ZGVzdGluYXRpb246ICdpY29ucycsIGV4Y2x1ZGU6IC9cXC5zdmckL2ksIHNvdXJjZTogcmVzb2x2ZShzb3VyY2VQYXRoLCAnaWNvbnMnKX1cbiAgXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUxleEZhdmljb25zID0gYXN5bmMgKGNvbmZpZzogTGV4Q29uZmlnVHlwZSk6IFByb21pc2U8R2VuZXJhdGVkRmF2aWNvbnMgfCBudWxsPiA9PiB7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBjb25maWcuc291cmNlRnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcuc291cmNlUGF0aCB8fCAnLi9zcmMnKTtcbiAgY29uc3QgbG9nb1BhdGggPSByZXNvbHZlKHNvdXJjZVBhdGgsICdpbWFnZXMvbG9nby5wbmcnKTtcblxuICBpZighZXhpc3RzU3luYyhsb2dvUGF0aCkpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IG1vZGlmaWVkQXQgPSBzdGF0U3luYyhsb2dvUGF0aCkubXRpbWVNcztcbiAgY29uc3QgY2FjaGVkID0gZmF2aWNvbkNhY2hlLmdldChsb2dvUGF0aCk7XG4gIGlmKGNhY2hlZD8ubW9kaWZpZWRBdCA9PT0gbW9kaWZpZWRBdCkgcmV0dXJuIGNhY2hlZC5yZXNwb25zZTtcblxuICBjb25zdCBnZW5lcmF0ZWQgPSBhd2FpdCBmYXZpY29ucyhsb2dvUGF0aCwge1xuICAgIGljb25zOiB7XG4gICAgICBhbmRyb2lkOiB0cnVlLFxuICAgICAgYXBwbGVJY29uOiB0cnVlLFxuICAgICAgYXBwbGVTdGFydHVwOiBmYWxzZSxcbiAgICAgIGZhdmljb25zOiB0cnVlLFxuICAgICAgd2luZG93czogZmFsc2UsXG4gICAgICB5YW5kZXg6IGZhbHNlXG4gICAgfSxcbiAgICBwYXRoOiAnLydcbiAgfSk7XG4gIGNvbnN0IFtvcGVuR3JhcGhJbWFnZSwgdHdpdHRlckltYWdlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBzaGFycChsb2dvUGF0aCkucmVzaXplKDEyMDAsIDYzMCwge2ZpdDogJ2NvbnRhaW4nfSkucG5nKCkudG9CdWZmZXIoKSxcbiAgICBzaGFycChsb2dvUGF0aCkucmVzaXplKDEyMDAsIDY3NSwge2ZpdDogJ2NvbnRhaW4nfSkucG5nKCkudG9CdWZmZXIoKVxuICBdKTtcbiAgY29uc3QgcmVzcG9uc2U6IEdlbmVyYXRlZEZhdmljb25zID0ge1xuICAgIC4uLmdlbmVyYXRlZCxcbiAgICBodG1sOiBbXG4gICAgICAuLi5nZW5lcmF0ZWQuaHRtbCxcbiAgICAgICc8bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD1cIi9vcGVuLWdyYXBoLnBuZ1wiPicsXG4gICAgICAnPG1ldGEgbmFtZT1cInR3aXR0ZXI6aW1hZ2VcIiBjb250ZW50PVwiL3R3aXR0ZXIucG5nXCI+J1xuICAgIF0sXG4gICAgaW1hZ2VzOiBbXG4gICAgICAuLi5nZW5lcmF0ZWQuaW1hZ2VzLFxuICAgICAge2NvbnRlbnRzOiBvcGVuR3JhcGhJbWFnZSwgbmFtZTogJ29wZW4tZ3JhcGgucG5nJ30sXG4gICAgICB7Y29udGVudHM6IHR3aXR0ZXJJbWFnZSwgbmFtZTogJ3R3aXR0ZXIucG5nJ31cbiAgICBdXG4gIH07XG4gIGZhdmljb25DYWNoZS5zZXQobG9nb1BhdGgsIHttb2RpZmllZEF0LCByZXNwb25zZX0pO1xuICByZXR1cm4gcmVzcG9uc2U7XG59O1xuXG5leHBvcnQgY29uc3QgY29weUxleFdlYkFzc2V0cyA9IGFzeW5jIChjb25maWc6IExleENvbmZpZ1R5cGUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgb3V0cHV0UGF0aCA9IGNvbmZpZy5vdXRwdXRGdWxsUGF0aCB8fCByZXNvbHZlKHByb2Nlc3MuY3dkKCksIGNvbmZpZy5vdXRwdXRQYXRoIHx8ICcuL2xpYicpO1xuXG4gIGZvcihjb25zdCBhc3NldERpcmVjdG9yeSBvZiBnZXRBc3NldERpcmVjdG9yaWVzKGNvbmZpZykpIHtcbiAgICBjb3B5RGlyZWN0b3J5KGFzc2V0RGlyZWN0b3J5LnNvdXJjZSwgcmVzb2x2ZShvdXRwdXRQYXRoLCBhc3NldERpcmVjdG9yeS5kZXN0aW5hdGlvbiksIGFzc2V0RGlyZWN0b3J5LmV4Y2x1ZGUpO1xuICB9XG5cbiAgY29uc3Qgc291cmNlUGF0aCA9IGNvbmZpZy5zb3VyY2VGdWxsUGF0aCB8fCByZXNvbHZlKHByb2Nlc3MuY3dkKCksIGNvbmZpZy5zb3VyY2VQYXRoIHx8ICcuL3NyYycpO1xuICBjb25zdCBzcHJpdGVtYXAgPSBuZXcgTGV4U3ZnU3ByaXRlbWFwKHJlc29sdmUoc291cmNlUGF0aCwgJ2ljb25zLyoqLyouc3ZnJyksIHtcbiAgICBmaWxlbmFtZTogJ2ljb25zL2ljb25zLnN2ZycsXG4gICAgcHJlZml4OiBmYWxzZVxuICB9KS5idWlsZFNwcml0ZW1hcCgpO1xuXG4gIGZvcihjb25zdCB3YXJuaW5nIG9mIHNwcml0ZW1hcC53YXJuaW5ncykgY29uc29sZS53YXJuKHdhcm5pbmcubWVzc2FnZSk7XG5cbiAgaWYoc3ByaXRlbWFwLmNvbnRlbnQpIHtcbiAgICBjb25zdCBzcHJpdGVQYXRoID0gcmVzb2x2ZShvdXRwdXRQYXRoLCAnaWNvbnMvaWNvbnMuc3ZnJyk7XG4gICAgbWtkaXJTeW5jKHJlc29sdmUoc3ByaXRlUGF0aCwgJy4uJyksIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICB3cml0ZUZpbGVTeW5jKHNwcml0ZVBhdGgsIHNwcml0ZW1hcC5jb250ZW50KTtcbiAgfVxuXG4gIGNvbnN0IGdlbmVyYXRlZEZhdmljb25zID0gYXdhaXQgZ2VuZXJhdGVMZXhGYXZpY29ucyhjb25maWcpO1xuICBpZihnZW5lcmF0ZWRGYXZpY29ucykge1xuICAgIGZvcihjb25zdCBpbWFnZSBvZiBnZW5lcmF0ZWRGYXZpY29ucy5pbWFnZXMpIHtcbiAgICAgIGNvbnN0IGltYWdlUGF0aCA9IHJlc29sdmUob3V0cHV0UGF0aCwgaW1hZ2UubmFtZSk7XG4gICAgICBta2RpclN5bmMocmVzb2x2ZShpbWFnZVBhdGgsICcuLicpLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGltYWdlUGF0aCwgaW1hZ2UuY29udGVudHMpO1xuICAgIH1cbiAgICBmb3IoY29uc3QgZmlsZSBvZiBnZW5lcmF0ZWRGYXZpY29ucy5maWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKG91dHB1dFBhdGgsIGZpbGUubmFtZSk7XG4gICAgICBta2RpclN5bmMocmVzb2x2ZShmaWxlUGF0aCwgJy4uJyksIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGZpbGUuY29udGVudHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4UGF0aCA9IHJlc29sdmUob3V0cHV0UGF0aCwgJ2luZGV4Lmh0bWwnKTtcbiAgICBpZihleGlzdHNTeW5jKGluZGV4UGF0aCkpIHtcbiAgICAgIGNvbnN0IGh0bWwgPSByZWFkRmlsZVN5bmMoaW5kZXhQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgZmF2aWNvbkh0bWwgPSBnZW5lcmF0ZWRGYXZpY29ucy5odG1sLmpvaW4oJ1xcbiAgICAnKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoaW5kZXhQYXRoLCBodG1sLnJlcGxhY2UoJzwvaGVhZD4nLCBgICAgICR7ZmF2aWNvbkh0bWx9XFxuICA8L2hlYWQ+YCkpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3Qgb3B0aW1pemVJbWFnZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUoZmlsZVBhdGgpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHNvdXJjZSA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCk7XG5cbiAgaWYoZXh0ZW5zaW9uID09PSAnLnN2ZycpIHtcbiAgICBjb25zdCBpc1Nwcml0ZW1hcCA9IGZpbGVQYXRoLmVuZHNXaXRoKCcvaWNvbnMvaWNvbnMuc3ZnJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gb3B0aW1pemUoc291cmNlLnRvU3RyaW5nKCksIHtcbiAgICAgIG11bHRpcGFzczogdHJ1ZSxcbiAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgcGx1Z2luczogaXNTcHJpdGVtYXBcbiAgICAgICAgPyBbe25hbWU6ICdwcmVzZXQtZGVmYXVsdCcsIHBhcmFtczoge292ZXJyaWRlczoge2NsZWFudXBJZHM6IGZhbHNlLCByZW1vdmVIaWRkZW5FbGVtczogZmFsc2V9fX1dXG4gICAgICAgIDogWydwcmVzZXQtZGVmYXVsdCddXG4gICAgfSk7XG4gICAgd3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgcmVzdWx0LmRhdGEpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBpbWFnZSA9IHNoYXJwKHNvdXJjZSk7XG4gIGlmKGV4dGVuc2lvbiA9PT0gJy5qcGcnIHx8IGV4dGVuc2lvbiA9PT0gJy5qcGVnJykgaW1hZ2UgPSBpbWFnZS5qcGVnKHtwcm9ncmVzc2l2ZTogdHJ1ZSwgcXVhbGl0eTogNjV9KTtcbiAgaWYoZXh0ZW5zaW9uID09PSAnLnBuZycpIGltYWdlID0gaW1hZ2UucG5nKHtxdWFsaXR5OiA5MH0pO1xuICBpZihleHRlbnNpb24gPT09ICcud2VicCcpIGltYWdlID0gaW1hZ2Uud2VicCh7cXVhbGl0eTogNzV9KTtcbiAgaWYoZXh0ZW5zaW9uID09PSAnLmdpZicpIGltYWdlID0gaW1hZ2UuZ2lmKCk7XG5cbiAgY29uc3Qgb3B0aW1pemVkID0gYXdhaXQgaW1hZ2UudG9CdWZmZXIoKTtcbiAgaWYob3B0aW1pemVkLmxlbmd0aCA8IHNvdXJjZS5sZW5ndGgpIHdyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIG9wdGltaXplZCk7XG59O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVMZXhXZWJBc3NldHMgPSBhc3luYyAoY29uZmlnOiBMZXhDb25maWdUeXBlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IG91dHB1dFBhdGggPSBjb25maWcub3V0cHV0RnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcub3V0cHV0UGF0aCB8fCAnLi9saWInKTtcbiAgaWYoIWV4aXN0c1N5bmMob3V0cHV0UGF0aCkpIHJldHVybjtcblxuICBjb25zdCBpbWFnZUZpbGVzID0gZ2xvYlN5bmMoJyoqLyoue2dpZixqcGcsanBlZyxwbmcsc3ZnLHdlYnB9Jywge1xuICAgIGFic29sdXRlOiB0cnVlLFxuICAgIGN3ZDogb3V0cHV0UGF0aCxcbiAgICBub2RpcjogdHJ1ZVxuICB9KTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChpbWFnZUZpbGVzLmZpbHRlcigoZmlsZVBhdGgpID0+IElNQUdFX0ZJTEUudGVzdChmaWxlUGF0aCkpLm1hcChvcHRpbWl6ZUltYWdlKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY29tcHJlc3NMZXhXZWJBc3NldHMgPSAoY29uZmlnOiBMZXhDb25maWdUeXBlKTogdm9pZCA9PiB7XG4gIGNvbnN0IG91dHB1dFBhdGggPSBjb25maWcub3V0cHV0RnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcub3V0cHV0UGF0aCB8fCAnLi9saWInKTtcbiAgaWYoIWV4aXN0c1N5bmMob3V0cHV0UGF0aCkpIHJldHVybjtcblxuICBjb25zdCBmaWxlcyA9IGdsb2JTeW5jKCcqKi8qJywge2Fic29sdXRlOiB0cnVlLCBjd2Q6IG91dHB1dFBhdGgsIG5vZGlyOiB0cnVlfSk7XG4gIGZvcihjb25zdCBmaWxlUGF0aCBvZiBmaWxlcykge1xuICAgIGlmKCFDT01QUkVTU0lCTEVfRklMRS50ZXN0KGZpbGVQYXRoKSB8fCBzdGF0U3luYyhmaWxlUGF0aCkuc2l6ZSA8IE1JTklNVU1fR1pJUF9TSVpFKSBjb250aW51ZTtcbiAgICB3cml0ZUZpbGVTeW5jKGAke2ZpbGVQYXRofS5nemAsIGd6aXBTeW5jKHJlYWRGaWxlU3luYyhmaWxlUGF0aCkpKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldERldkFzc2V0ID0gYXN5bmMgKGNvbmZpZzogTGV4Q29uZmlnVHlwZSwgcmVxdWVzdFBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4gPT4ge1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHJlcXVlc3RQYXRoLnNwbGl0KCc/JylbMF0ucmVwbGFjZSgvXlxcLysvLCAnJyk7XG4gIGlmKG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCcuLicpKSByZXR1cm4gbnVsbDtcblxuICBpZihub3JtYWxpemVkUGF0aCA9PT0gJ2ljb25zL2ljb25zLnN2ZycpIHtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gY29uZmlnLnNvdXJjZUZ1bGxQYXRoIHx8IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLnNvdXJjZVBhdGggfHwgJy4vc3JjJyk7XG4gICAgY29uc3Qgc3ByaXRlbWFwID0gbmV3IExleFN2Z1Nwcml0ZW1hcChyZXNvbHZlKHNvdXJjZVBhdGgsICdpY29ucy8qKi8qLnN2ZycpLCB7cHJlZml4OiBmYWxzZX0pLmJ1aWxkU3ByaXRlbWFwKCk7XG4gICAgcmV0dXJuIHNwcml0ZW1hcC5jb250ZW50ID8gQnVmZmVyLmZyb20oc3ByaXRlbWFwLmNvbnRlbnQpIDogbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGdlbmVyYXRlZEZhdmljb25zID0gYXdhaXQgZ2VuZXJhdGVMZXhGYXZpY29ucyhjb25maWcpO1xuICBjb25zdCBnZW5lcmF0ZWRJbWFnZSA9IGdlbmVyYXRlZEZhdmljb25zPy5pbWFnZXMuZmluZCgoe25hbWV9KSA9PiBuYW1lID09PSBub3JtYWxpemVkUGF0aCk7XG4gIGlmKGdlbmVyYXRlZEltYWdlKSByZXR1cm4gZ2VuZXJhdGVkSW1hZ2UuY29udGVudHM7XG4gIGNvbnN0IGdlbmVyYXRlZEZpbGUgPSBnZW5lcmF0ZWRGYXZpY29ucz8uZmlsZXMuZmluZCgoe25hbWV9KSA9PiBuYW1lID09PSBub3JtYWxpemVkUGF0aCk7XG4gIGlmKGdlbmVyYXRlZEZpbGUpIHJldHVybiBCdWZmZXIuZnJvbShnZW5lcmF0ZWRGaWxlLmNvbnRlbnRzKTtcblxuICBmb3IoY29uc3QgYXNzZXREaXJlY3Rvcnkgb2YgZ2V0QXNzZXREaXJlY3Rvcmllcyhjb25maWcpKSB7XG4gICAgY29uc3QgcHJlZml4ID0gYXNzZXREaXJlY3RvcnkuZGVzdGluYXRpb24gPyBgJHthc3NldERpcmVjdG9yeS5kZXN0aW5hdGlvbn0vYCA6ICcnO1xuICAgIGlmKCFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gbm9ybWFsaXplZFBhdGguc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKGFzc2V0RGlyZWN0b3J5LnNvdXJjZSwgcmVsYXRpdmVQYXRoKTtcbiAgICBpZihmaWxlUGF0aC5zdGFydHNXaXRoKHJlc29sdmUoYXNzZXREaXJlY3Rvcnkuc291cmNlKSkgJiYgZXhpc3RzU3luYyhmaWxlUGF0aCkgJiYgc3RhdFN5bmMoZmlsZVBhdGgpLmlzRmlsZSgpKSB7XG4gICAgICBpZihhc3NldERpcmVjdG9yeS5leGNsdWRlPy50ZXN0KGZpbGVQYXRoKSkgY29udGludWU7XG4gICAgICByZXR1cm4gcmVhZEZpbGVTeW5jKGZpbGVQYXRoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBc3NldFJlbGF0aXZlUGF0aCA9IChjb25maWc6IExleENvbmZpZ1R5cGUsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBvdXRwdXRQYXRoID0gY29uZmlnLm91dHB1dEZ1bGxQYXRoIHx8IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLm91dHB1dFBhdGggfHwgJy4vbGliJyk7XG4gIHJldHVybiByZWxhdGl2ZShvdXRwdXRQYXRoLCBmaWxlUGF0aCk7XG59O1xuIl0sIm5hbWVzIjpbImd6aXBTeW5jIiwiZmF2aWNvbnMiLCJleGlzdHNTeW5jIiwibWtkaXJTeW5jIiwicmVhZEZpbGVTeW5jIiwicmVhZGRpclN5bmMiLCJzdGF0U3luYyIsIndyaXRlRmlsZVN5bmMiLCJzeW5jIiwiZ2xvYlN5bmMiLCJleHRuYW1lIiwiam9pbiIsInJlbGF0aXZlIiwicmVzb2x2ZSIsInNoYXJwIiwib3B0aW1pemUiLCJMZXhTdmdTcHJpdGVtYXAiLCJDT01QUkVTU0lCTEVfRklMRSIsIklNQUdFX0ZJTEUiLCJNSU5JTVVNX0daSVBfU0laRSIsImZhdmljb25DYWNoZSIsIk1hcCIsImNvcHlEaXJlY3RvcnkiLCJzb3VyY2UiLCJkZXN0aW5hdGlvbiIsImV4Y2x1ZGUiLCJlbnRyeSIsIndpdGhGaWxlVHlwZXMiLCJzb3VyY2VQYXRoIiwibmFtZSIsImRlc3RpbmF0aW9uUGF0aCIsInRlc3QiLCJpc0RpcmVjdG9yeSIsInJlY3Vyc2l2ZSIsImdldEFzc2V0RGlyZWN0b3JpZXMiLCJjb25maWciLCJzb3VyY2VGdWxsUGF0aCIsInByb2Nlc3MiLCJjd2QiLCJzdGF0aWNQYXRoIiwidml0ZSIsImdlbmVyYXRlTGV4RmF2aWNvbnMiLCJsb2dvUGF0aCIsIm1vZGlmaWVkQXQiLCJtdGltZU1zIiwiY2FjaGVkIiwiZ2V0IiwicmVzcG9uc2UiLCJnZW5lcmF0ZWQiLCJpY29ucyIsImFuZHJvaWQiLCJhcHBsZUljb24iLCJhcHBsZVN0YXJ0dXAiLCJ3aW5kb3dzIiwieWFuZGV4IiwicGF0aCIsIm9wZW5HcmFwaEltYWdlIiwidHdpdHRlckltYWdlIiwiUHJvbWlzZSIsImFsbCIsInJlc2l6ZSIsImZpdCIsInBuZyIsInRvQnVmZmVyIiwiaHRtbCIsImltYWdlcyIsImNvbnRlbnRzIiwic2V0IiwiY29weUxleFdlYkFzc2V0cyIsIm91dHB1dFBhdGgiLCJvdXRwdXRGdWxsUGF0aCIsImFzc2V0RGlyZWN0b3J5Iiwic3ByaXRlbWFwIiwiZmlsZW5hbWUiLCJwcmVmaXgiLCJidWlsZFNwcml0ZW1hcCIsIndhcm5pbmciLCJ3YXJuaW5ncyIsImNvbnNvbGUiLCJ3YXJuIiwibWVzc2FnZSIsImNvbnRlbnQiLCJzcHJpdGVQYXRoIiwiZ2VuZXJhdGVkRmF2aWNvbnMiLCJpbWFnZSIsImltYWdlUGF0aCIsImZpbGUiLCJmaWxlcyIsImZpbGVQYXRoIiwiaW5kZXhQYXRoIiwiZmF2aWNvbkh0bWwiLCJyZXBsYWNlIiwib3B0aW1pemVJbWFnZSIsImV4dGVuc2lvbiIsInRvTG93ZXJDYXNlIiwiaXNTcHJpdGVtYXAiLCJlbmRzV2l0aCIsInJlc3VsdCIsInRvU3RyaW5nIiwibXVsdGlwYXNzIiwicGx1Z2lucyIsInBhcmFtcyIsIm92ZXJyaWRlcyIsImNsZWFudXBJZHMiLCJyZW1vdmVIaWRkZW5FbGVtcyIsImRhdGEiLCJqcGVnIiwicHJvZ3Jlc3NpdmUiLCJxdWFsaXR5Iiwid2VicCIsImdpZiIsIm9wdGltaXplZCIsImxlbmd0aCIsIm9wdGltaXplTGV4V2ViQXNzZXRzIiwiaW1hZ2VGaWxlcyIsImFic29sdXRlIiwibm9kaXIiLCJmaWx0ZXIiLCJtYXAiLCJjb21wcmVzc0xleFdlYkFzc2V0cyIsInNpemUiLCJnZXREZXZBc3NldCIsInJlcXVlc3RQYXRoIiwibm9ybWFsaXplZFBhdGgiLCJzcGxpdCIsImluY2x1ZGVzIiwiQnVmZmVyIiwiZnJvbSIsImdlbmVyYXRlZEltYWdlIiwiZmluZCIsImdlbmVyYXRlZEZpbGUiLCJzdGFydHNXaXRoIiwicmVsYXRpdmVQYXRoIiwic2xpY2UiLCJpc0ZpbGUiLCJnZXRBc3NldFJlbGF0aXZlUGF0aCJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsUUFBUSxRQUFPLE9BQU87QUFDOUIsT0FBT0MsY0FBYyxXQUFXO0FBQ2hDLFNBQVFDLFVBQVUsRUFBRUMsU0FBUyxFQUFFQyxZQUFZLEVBQUVDLFdBQVcsRUFBRUMsUUFBUSxFQUFFQyxhQUFhLFFBQU8sS0FBSztBQUM3RixTQUFRQyxRQUFRQyxRQUFRLFFBQU8sT0FBTztBQUN0QyxTQUFRQyxPQUFPLEVBQUVDLElBQUksRUFBRUMsUUFBUSxFQUFFQyxPQUFPLFFBQU8sT0FBTztBQUN0RCxPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBUUMsUUFBUSxRQUFPLE9BQU87QUFHOUIsU0FBUUMsZUFBZSxRQUFPLCtCQUErQjtBQUU3RCxNQUFNQyxvQkFBb0I7QUFDMUIsTUFBTUMsYUFBYTtBQUNuQixNQUFNQyxvQkFBb0I7QUFRMUIsTUFBTUMsZUFBZSxJQUFJQztBQUV6QixNQUFNQyxnQkFBZ0IsQ0FBQ0MsUUFBZ0JDLGFBQXFCQztJQUMxRCxJQUFHLENBQUN2QixXQUFXcUIsU0FBUztJQUV4QixLQUFJLE1BQU1HLFNBQVNyQixZQUFZa0IsUUFBUTtRQUFDSSxlQUFlO0lBQUksR0FBSTtRQUM3RCxNQUFNQyxhQUFhakIsS0FBS1ksUUFBUUcsTUFBTUcsSUFBSTtRQUMxQyxNQUFNQyxrQkFBa0JuQixLQUFLYSxhQUFhRSxNQUFNRyxJQUFJO1FBRXBELElBQUdKLFNBQVNNLEtBQUtILGFBQWE7UUFFOUIsSUFBR0YsTUFBTU0sV0FBVyxJQUFJO1lBQ3RCVixjQUFjTSxZQUFZRSxpQkFB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
@@ -0,0 +1,12 @@
1
+ import type { InlineConfig } from 'vite';
2
+ export interface LexViteOptions {
3
+ readonly analyze?: boolean;
4
+ readonly command: 'build' | 'serve';
5
+ readonly entry?: string;
6
+ readonly mode?: string;
7
+ readonly open?: boolean;
8
+ readonly port?: number;
9
+ readonly quiet?: boolean;
10
+ readonly ssr?: boolean;
11
+ }
12
+ export declare const createLexViteConfig: (options: LexViteOptions) => InlineConfig;
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Copyright (c) 2018-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */ import { transform } from '@swc/core';
5
+ import inject from '@rollup/plugin-inject';
6
+ import { existsSync, readFileSync } from 'fs';
7
+ import { extname, resolve } from 'path';
8
+ import { mergeConfig } from 'vite';
9
+ import { nodePolyfills } from 'vite-plugin-node-polyfills';
10
+ import { LexConfig } from '../../LexConfig.js';
11
+ import { generateLexFavicons, getDevAsset } from './assets.js';
12
+ const createInjectPlugin = inject;
13
+ const contentTypes = {
14
+ '.css': 'text/css',
15
+ '.gif': 'image/gif',
16
+ '.html': 'text/html',
17
+ '.ico': 'image/x-icon',
18
+ '.jpeg': 'image/jpeg',
19
+ '.jpg': 'image/jpeg',
20
+ '.json': 'application/json',
21
+ '.png': 'image/png',
22
+ '.svg': 'image/svg+xml',
23
+ '.ttf': 'font/ttf',
24
+ '.txt': 'text/plain',
25
+ '.woff': 'font/woff',
26
+ '.woff2': 'font/woff2'
27
+ };
28
+ const emptyCryptoPlugin = ()=>({
29
+ load (id) {
30
+ return id === '\0lex-empty-crypto' ? 'export default {}; export const webcrypto = undefined;' : null;
31
+ },
32
+ name: 'lex-empty-crypto',
33
+ resolveId (id) {
34
+ return id === 'crypto' || id === 'node:crypto' ? '\0lex-empty-crypto' : null;
35
+ }
36
+ });
37
+ const graphqlPlugin = ()=>({
38
+ load (id) {
39
+ if (!/\.(gql|graphql)$/.test(id)) return null;
40
+ const source = JSON.stringify(readFileSync(id, 'utf8'));
41
+ return `import gql from 'graphql-tag'; export default gql(${source});`;
42
+ },
43
+ name: 'lex-graphql'
44
+ });
45
+ const swcPlugin = (sourcePath)=>({
46
+ enforce: 'pre',
47
+ async transform (source, id) {
48
+ const cleanId = id.split('?')[0];
49
+ if (!cleanId.startsWith(sourcePath) || !/\.[jt]sx?$/.test(cleanId) || /\.(test|spec|integration|e2e)\.[jt]sx?$/.test(cleanId)) return null;
50
+ const swcConfig = LexConfig.getSWCConfigWithReactCompiler();
51
+ const result = await transform(source, {
52
+ ...swcConfig,
53
+ filename: cleanId,
54
+ module: {
55
+ ...swcConfig?.module,
56
+ type: 'es6'
57
+ },
58
+ sourceMaps: true
59
+ });
60
+ const needsReact = /\bReact\s*\./.test(result.code) && !/from\s+['"]react['"]/.test(result.code);
61
+ return {
62
+ code: needsReact ? `import React from 'react';\n${result.code}` : result.code,
63
+ map: result.map || null
64
+ };
65
+ },
66
+ name: 'lex-swc'
67
+ });
68
+ const importMetaCompatibilityPlugin = (sourcePath)=>({
69
+ enforce: 'post',
70
+ name: 'lex-import-meta-compatibility',
71
+ transform (source, id) {
72
+ const cleanId = id.split('?')[0];
73
+ if (!cleanId.startsWith(sourcePath) || !source.includes('import.meta.url')) return null;
74
+ const replacement = '(typeof document !== "undefined" && document.currentScript && document.currentScript.src ? new URL(document.currentScript.src, window.location.href).href : (typeof window !== "undefined" ? new URL("", window.location.href).href : ""))';
75
+ return source.replaceAll('import.meta.url', replacement);
76
+ }
77
+ });
78
+ const assetsDevPlugin = ()=>{
79
+ let faviconHtml = [];
80
+ return {
81
+ async buildStart () {
82
+ const generatedFavicons = await generateLexFavicons(LexConfig.config);
83
+ faviconHtml = generatedFavicons?.html || [];
84
+ },
85
+ configureServer (server) {
86
+ server.middlewares.use(async (request, response, next)=>{
87
+ if (!request.url) return next();
88
+ const asset = await getDevAsset(LexConfig.config, request.url);
89
+ if (!asset) return next();
90
+ response.statusCode = 200;
91
+ response.setHeader('Content-Type', contentTypes[extname(request.url.split('?')[0])] || 'application/octet-stream');
92
+ response.end(asset);
93
+ });
94
+ },
95
+ name: 'lex-assets-dev',
96
+ transformIndexHtml (html) {
97
+ if (faviconHtml.length === 0) return html;
98
+ return html.replace('</head>', ` ${faviconHtml.join('\n ')}\n </head>`);
99
+ }
100
+ };
101
+ };
102
+ const analyzerPlugin = (enabled)=>({
103
+ generateBundle (_options, bundle) {
104
+ if (!enabled) return;
105
+ const report = Object.entries(bundle).map(([fileName, output])=>({
106
+ fileName,
107
+ size: output.type === 'asset' ? Buffer.byteLength(typeof output.source === 'string' ? output.source : output.source) : Buffer.byteLength(output.code),
108
+ type: output.type
109
+ }));
110
+ this.emitFile({
111
+ fileName: 'bundle-report.json',
112
+ source: JSON.stringify(report, null, 2),
113
+ type: 'asset'
114
+ });
115
+ },
116
+ name: 'lex-bundle-analyzer'
117
+ });
118
+ const getLibraryFormats = (libraryTarget)=>{
119
+ if (libraryTarget === 'commonjs' || libraryTarget === 'commonjs2') return [
120
+ 'cjs'
121
+ ];
122
+ if (libraryTarget === 'var' || libraryTarget === 'window') return [
123
+ 'iife'
124
+ ];
125
+ if (libraryTarget === 'umd') return [
126
+ 'umd'
127
+ ];
128
+ return [
129
+ 'es'
130
+ ];
131
+ };
132
+ const resolveProjectPackage = (packageName)=>{
133
+ const projectPackage = resolve(process.cwd(), 'node_modules', packageName);
134
+ return existsSync(projectPackage) ? projectPackage : resolve(LexConfig.getLexDir(), 'node_modules', packageName);
135
+ };
136
+ export const createLexViteConfig = (options)=>{
137
+ const config = LexConfig.config;
138
+ const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
139
+ const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
140
+ const entryPath = resolve(sourcePath, options.entry || config.entryJs || 'index.js');
141
+ const htmlPath = resolve(sourcePath, config.entryHTML || 'index.html');
142
+ const hasHtmlEntry = existsSync(htmlPath) && !options.ssr;
143
+ const outputHash = config.outputHash || options.mode === 'production';
144
+ const fileName = config.outputFile || (outputHash ? '[name].[hash].js' : '[name].js');
145
+ const viteConfig = {
146
+ appType: hasHtmlEntry ? 'spa' : 'custom',
147
+ base: '/',
148
+ build: {
149
+ cssCodeSplit: true,
150
+ emptyOutDir: false,
151
+ minify: options.mode === 'production',
152
+ outDir: outputPath,
153
+ rolldownOptions: {
154
+ input: hasHtmlEntry ? htmlPath : entryPath,
155
+ output: {
156
+ assetFileNames: outputHash ? 'assets/[name].[hash][extname]' : 'assets/[name][extname]',
157
+ chunkFileNames: outputHash ? '[name].[hash].chunk.js' : '[name].chunk.js',
158
+ entryFileNames: fileName,
159
+ manualChunks (id) {
160
+ return id.includes('/node_modules/') ? 'vendors' : undefined;
161
+ }
162
+ }
163
+ },
164
+ sourcemap: config.swc?.sourceMaps ? true : false,
165
+ ssr: options.ssr ? entryPath : false,
166
+ target: config.swc?.jsc?.target?.toString() || 'es2020'
167
+ },
168
+ clearScreen: false,
169
+ configFile: false,
170
+ css: {
171
+ postcss: resolve(LexConfig.getLexDir(), 'postcss.config.js')
172
+ },
173
+ define: {
174
+ 'process.env.NODE_ENV': JSON.stringify(options.mode || (options.command === 'build' ? 'production' : 'development'))
175
+ },
176
+ envDir: process.cwd(),
177
+ logLevel: options.quiet ? 'silent' : 'info',
178
+ mode: options.mode || (options.command === 'build' ? 'production' : 'development'),
179
+ plugins: [
180
+ ...options.ssr ? [] : [
181
+ emptyCryptoPlugin(),
182
+ nodePolyfills({
183
+ globals: {
184
+ Buffer: false,
185
+ global: false,
186
+ process: false
187
+ },
188
+ include: [
189
+ 'assert',
190
+ 'buffer',
191
+ 'http',
192
+ 'https',
193
+ 'os',
194
+ 'path',
195
+ 'process',
196
+ 'stream',
197
+ 'util',
198
+ 'vm'
199
+ ],
200
+ overrides: {
201
+ buffer: resolveProjectPackage('buffer'),
202
+ process: resolveProjectPackage('process/browser.js')
203
+ },
204
+ protocolImports: true
205
+ }),
206
+ createInjectPlugin({
207
+ Buffer: [
208
+ resolve(LexConfig.getLexDir(), 'node_modules/vite-plugin-node-polyfills/shims/buffer/dist/index.js'),
209
+ 'Buffer'
210
+ ],
211
+ global: [
212
+ resolve(LexConfig.getLexDir(), 'node_modules/vite-plugin-node-polyfills/shims/global/dist/index.js'),
213
+ 'default'
214
+ ],
215
+ process: [
216
+ resolve(LexConfig.getLexDir(), 'node_modules/vite-plugin-node-polyfills/shims/process/dist/index.js'),
217
+ 'default'
218
+ ]
219
+ })
220
+ ],
221
+ swcPlugin(sourcePath),
222
+ graphqlPlugin(),
223
+ ...options.ssr ? [] : [
224
+ importMetaCompatibilityPlugin(sourcePath),
225
+ assetsDevPlugin(),
226
+ analyzerPlugin(Boolean(options.analyze))
227
+ ]
228
+ ],
229
+ publicDir: false,
230
+ resolve: {
231
+ alias: {
232
+ Buffer: resolveProjectPackage('buffer'),
233
+ 'core-js': resolveProjectPackage('core-js'),
234
+ global: resolveProjectPackage('global'),
235
+ 'graphql-tag': resolveProjectPackage('graphql-tag'),
236
+ randombytes: resolve(LexConfig.getLexDir(), 'node_modules/randombytes'),
237
+ react: resolveProjectPackage('react'),
238
+ 'react-dom': resolveProjectPackage('react-dom'),
239
+ 'regenerator-runtime': resolveProjectPackage('regenerator-runtime'),
240
+ 'vite-plugin-node-polyfills/shims/buffer': resolve(LexConfig.getLexDir(), 'node_modules/vite-plugin-node-polyfills/shims/buffer/dist/index.js'),
241
+ 'vite-plugin-node-polyfills/shims/global': resolve(LexConfig.getLexDir(), 'node_modules/vite-plugin-node-polyfills/shims/global/dist/index.js'),
242
+ 'vite-plugin-node-polyfills/shims/process': resolve(LexConfig.getLexDir(), 'node_modules/vite-plugin-node-polyfills/shims/process/dist/index.js')
243
+ },
244
+ extensions: [
245
+ '.mjs',
246
+ '.js',
247
+ '.ts',
248
+ '.tsx',
249
+ '.jsx',
250
+ '.json',
251
+ '.gql',
252
+ '.graphql'
253
+ ],
254
+ preserveSymlinks: false,
255
+ tsconfigPaths: true
256
+ },
257
+ root: sourcePath,
258
+ server: {
259
+ hmr: false,
260
+ open: options.open,
261
+ port: options.port,
262
+ strictPort: true
263
+ }
264
+ };
265
+ if (!hasHtmlEntry && config.libraryName && !options.ssr) {
266
+ viteConfig.build = {
267
+ ...viteConfig.build,
268
+ lib: {
269
+ entry: entryPath,
270
+ fileName: ()=>config.outputFile || 'index.js',
271
+ formats: getLibraryFormats(config.libraryTarget),
272
+ name: config.libraryName
273
+ }
274
+ };
275
+ }
276
+ return mergeConfig(viteConfig, config.vite || {});
277
+ };
278
+
279
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy92aXRlL2NvbmZpZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHt0cmFuc2Zvcm19IGZyb20gJ0Bzd2MvY29yZSc7XG5pbXBvcnQgaW5qZWN0IGZyb20gJ0Byb2xsdXAvcGx1Z2luLWluamVjdCc7XG5pbXBvcnQge2V4aXN0c1N5bmMsIHJlYWRGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtleHRuYW1lLCByZXNvbHZlfSBmcm9tICdwYXRoJztcbmltcG9ydCB7bWVyZ2VDb25maWd9IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHtub2RlUG9seWZpbGxzfSBmcm9tICd2aXRlLXBsdWdpbi1ub2RlLXBvbHlmaWxscyc7XG5cbmltcG9ydCB7TGV4Q29uZmlnfSBmcm9tICcuLi8uLi9MZXhDb25maWcuanMnO1xuaW1wb3J0IHtnZW5lcmF0ZUxleEZhdmljb25zLCBnZXREZXZBc3NldH0gZnJvbSAnLi9hc3NldHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7SW5saW5lQ29uZmlnLCBQbHVnaW59IGZyb20gJ3ZpdGUnO1xuXG5jb25zdCBjcmVhdGVJbmplY3RQbHVnaW4gPSBpbmplY3QgYXMgdW5rbm93biBhcyAob3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IFBsdWdpbjtcblxuZXhwb3J0IGludGVyZmFjZSBMZXhWaXRlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGFuYWx5emU/OiBib29sZWFuO1xuICByZWFkb25seSBjb21tYW5kOiAnYnVpbGQnIHwgJ3NlcnZlJztcbiAgcmVhZG9ubHkgZW50cnk/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9wZW4/OiBib29sZWFuO1xuICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNzcj86IGJvb2xlYW47XG59XG5cbmNvbnN0IGNvbnRlbnRUeXBlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJy5jc3MnOiAndGV4dC9jc3MnLFxuICAnLmdpZic6ICdpbWFnZS9naWYnLFxuICAnLmh0bWwnOiAndGV4dC9odG1sJyxcbiAgJy5pY28nOiAnaW1hZ2UveC1pY29uJyxcbiAgJy5qcGVnJzogJ2ltYWdlL2pwZWcnLFxuICAnLmpwZyc6ICdpbWFnZS9qcGVnJyxcbiAgJy5qc29uJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAnLnBuZyc6ICdpbWFnZS9wbmcnLFxuICAnLnN2Zyc6ICdpbWFnZS9zdmcreG1sJyxcbiAgJy50dGYnOiAnZm9udC90dGYnLFxuICAnLnR4dCc6ICd0ZXh0L3BsYWluJyxcbiAgJy53b2ZmJzogJ2ZvbnQvd29mZicsXG4gICcud29mZjInOiAnZm9udC93b2ZmMidcbn07XG5cbmNvbnN0IGVtcHR5Q3J5cHRvUGx1Z2luID0gKCk6IFBsdWdpbiA9PiAoe1xuICBsb2FkKGlkKSB7XG4gICAgcmV0dXJuIGlkID09PSAnXFwwbGV4LWVtcHR5LWNyeXB0bycgPyAnZXhwb3J0IGRlZmF1bHQge307IGV4cG9ydCBjb25zdCB3ZWJjcnlwdG8gPSB1bmRlZmluZWQ7JyA6IG51bGw7XG4gIH0sXG4gIG5hbWU6ICdsZXgtZW1wdHktY3J5cHRvJyxcbiAgcmVzb2x2ZUlkKGlkKSB7XG4gICAgcmV0dXJuIGlkID09PSAnY3J5cHRvJyB8fCBpZCA9PT0gJ25vZGU6Y3J5cHRvJyA/ICdcXDBsZXgtZW1wdHktY3J5cHRvJyA6IG51bGw7XG4gIH1cbn0pO1xuXG5jb25zdCBncmFwaHFsUGx1Z2luID0gKCk6IFBsdWdpbiA9PiAoe1xuICBsb2FkKGlkKSB7XG4gICAgaWYoIS9cXC4oZ3FsfGdyYXBocWwpJC8udGVzdChpZCkpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHNvdXJjZSA9IEpTT04uc3RyaW5naWZ5KHJlYWRGaWxlU3luYyhpZCwgJ3V0ZjgnKSk7XG4gICAgcmV0dXJuIGBpbXBvcnQgZ3FsIGZyb20gJ2dyYXBocWwtdGFnJzsgZXhwb3J0IGRlZmF1bHQgZ3FsKCR7c291cmNlfSk7YDtcbiAgfSxcbiAgbmFtZTogJ2xleC1ncmFwaHFsJ1xufSk7XG5cbmNvbnN0IHN3Y1BsdWdpbiA9IChzb3VyY2VQYXRoOiBzdHJpbmcpOiBQbHVnaW4gPT4gKHtcbiAgZW5mb3JjZTogJ3ByZScsXG4gIGFzeW5jIHRyYW5zZm9ybShzb3VyY2UsIGlkKSB7XG4gICAgY29uc3QgY2xlYW5JZCA9IGlkLnNwbGl0KCc/JylbMF07XG4gICAgaWYoIWNsZWFuSWQuc3RhcnRzV2l0aChzb3VyY2VQYXRoKSB8fCAhL1xcLltqdF1zeD8kLy50ZXN0KGNsZWFuSWQpIHx8IC9cXC4odGVzdHxzcGVjfGludGVncmF0aW9ufGUyZSlcXC5banRdc3g/JC8udGVzdChjbGVhbklkKSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBzd2NDb25maWcgPSBMZXhDb25maWcuZ2V0U1dDQ29uZmlnV2l0aFJlYWN0Q29tcGlsZXIoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm0oc291cmNlLCB7XG4gICAgICAuLi5zd2NDb25maWcsXG4gICAgICBmaWxlbmFtZTogY2xlYW5JZCxcbiAgICAgIG1vZHVsZTogey4uLnN3Y0NvbmZpZz8ubW9kdWxlLCB0eXBlOiAnZXM2J30sXG4gICAgICBzb3VyY2VNYXBzOiB0cnVlXG4gICAgfSk7XG5cbiAgICBjb25zdCBuZWVkc1JlYWN0ID0gL1xcYlJlYWN0XFxzKlxcLi8udGVzdChyZXN1bHQuY29kZSkgJiYgIS9mcm9tXFxzK1snXCJdcmVhY3RbJ1wiXS8udGVzdChyZXN1bHQuY29kZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IG5lZWRzUmVhY3QgPyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcXG4ke3Jlc3VsdC5jb2RlfWAgOiByZXN1bHQuY29kZSxcbiAgICAgIG1hcDogcmVzdWx0Lm1hcCB8fCBudWxsXG4gICAgfTtcbiAgfSxcbiAgbmFtZTogJ2xleC1zd2MnXG59KTtcblxuY29uc3QgaW1wb3J0TWV0YUNvbXBhdGliaWxpdHlQbHVnaW4gPSAoc291cmNlUGF0aDogc3RyaW5nKTogUGx1Z2luID0+ICh7XG4gIGVuZm9yY2U6ICdwb3N0JyxcbiAgbmFtZTogJ2xleC1pbXBvcnQtbWV0YS1jb21wYXRpYmlsaXR5JyxcbiAgdHJhbnNmb3JtKHNvdXJjZSwgaWQpIHtcbiAgICBjb25zdCBjbGVhbklkID0gaWQuc3BsaXQoJz8nKVswXTtcbiAgICBpZighY2xlYW5JZC5zdGFydHNXaXRoKHNvdXJjZVBhdGgpIHx8ICFzb3VyY2UuaW5jbHVkZXMoJ2ltcG9ydC5tZXRhLnVybCcpKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gJyh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyA/IG5ldyBVUkwoZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5ocmVmIDogKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyBuZXcgVVJMKFwiXCIsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5ocmVmIDogXCJcIikpJztcbiAgICByZXR1cm4gc291cmNlLnJlcGxhY2VBbGwoJ2ltcG9ydC5tZXRhLnVybCcsIHJlcGxhY2VtZW50KTtcbiAgfVxufSk7XG5cbmNvbnN0IGFzc2V0c0RldlBsdWdpbiA9ICgpOiBQbHVnaW4gPT4ge1xuICBsZXQgZmF2aWNvbkh0bWw6IHN0cmluZ1tdID0gW107XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBidWlsZFN0YXJ0KCkge1xuICAgICAgY29uc3QgZ2VuZXJhdGVkRmF2aWNvbnMgPSBhd2FpdCBnZW5lcmF0ZUxleEZhdmljb25zKExleENvbmZpZy5jb25maWcpO1xuICAgICAgZmF2aWNvbkh0bWwgPSBnZW5lcmF0ZWRGYXZpY29ucz8uaHRtbCB8fCBbXTtcbiAgICB9LFxuICAgIGNvbmZpZ3VyZVNlcnZlcihzZXJ2ZXIpIHtcbiAgICAgIHNlcnZlci5taWRkbGV3YXJlcy51c2UoYXN5bmMgKHJlcXVlc3QsIHJlc3BvbnNlLCBuZXh0KSA9PiB7XG4gICAgICAgIGlmKCFyZXF1ZXN0LnVybCkgcmV0dXJuIG5leHQoKTtcbiAgICAgICAgY29uc3QgYXNzZXQgPSBhd2FpdCBnZXREZXZBc3NldChMZXhDb25maWcuY29uZmlnLCByZXF1ZXN0LnVybCk7XG4gICAgICAgIGlmKCFhc3NldCkgcmV0dXJuIG5leHQoKTtcblxuICAgICAgICByZXNwb25zZS5zdGF0dXNDb2RlID0gMjAwO1xuICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsIGNvbnRlbnRUeXBlc1tleHRuYW1lKHJlcXVlc3QudXJsLnNwbGl0KCc/JylbMF0pXSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyk7XG4gICAgICAgIHJlc3BvbnNlLmVuZChhc3NldCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIG5hbWU6ICdsZXgtYXNzZXRzLWRldicsXG4gICAgdHJhbnNmb3JtSW5kZXhIdG1sKGh0bWwpIHtcbiAgICAgIGlmKGZhdmljb25IdG1sLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGh0bWw7XG4gICAgICByZXR1cm4gaHRtbC5yZXBsYWNlKCc8L2hlYWQ+JywgYCAgICAke2Zhdmljb25IdG1sLmpvaW4oJ1xcbiAgICAnKX1cXG4gIDwvaGVhZD5gKTtcbiAgICB9XG4gIH07XG59O1xuXG5jb25zdCBhbmFseXplclBsdWdpbiA9IChlbmFibGVkOiBib29sZWFuKTogUGx1Z2luID0+ICh7XG4gIGdlbmVyYXRlQnVuZGxlKF9vcHRpb25zLCBidW5kbGUpIHtcbiAgICBpZighZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVwb3J0ID0gT2JqZWN0LmVudHJpZXMoYnVuZGxlKS5tYXAoKFtmaWxlTmFtZSwgb3V0cHV0XSkgPT4gKHtcbiAgICAgIGZpbGVOYW1lLFxuICAgICAgc2l6ZTogb3V0cHV0LnR5cGUgPT09ICdhc3NldCdcbiAgICAgICAgPyBCdWZmZXIuYnl0ZUxlbmd0aCh0eXBlb2Ygb3V0cHV0LnNvdXJjZSA9PT0gJ3N0cmluZycgPyBvdXRwdXQuc291cmNlIDogb3V0cHV0LnNvdXJjZSlcbiAgICAgICAgOiBCdWZmZXIuYnl0ZUxlbmd0aChvdXRwdXQuY29kZSksXG4gICAgICB0eXBlOiBvdXRwdXQudHlwZVxuICAgIH0pKTtcblxuICAgIHRoaXMuZW1pdEZpbGUoe2ZpbGVOYW1lOiAnYnVuZGxlLXJlcG9ydC5qc29uJywgc291cmNlOiBKU09OLnN0cmluZ2lmeShyZXBvcnQsIG51bGwsIDIpLCB0eXBlOiAnYXNzZXQnfSk7XG4gIH0sXG4gIG5hbWU6ICdsZXgtYnVuZGxlLWFuYWx5emVyJ1xufSk7XG5cbmNvbnN0IGdldExpYnJhcnlGb3JtYXRzID0gKGxpYnJhcnlUYXJnZXQ/OiBzdHJpbmcpOiBBcnJheTwnY2pzJyB8ICdlcycgfCAnaWlmZScgfCAndW1kJz4gPT4ge1xuICBpZihsaWJyYXJ5VGFyZ2V0ID09PSAnY29tbW9uanMnIHx8IGxpYnJhcnlUYXJnZXQgPT09ICdjb21tb25qczInKSByZXR1cm4gWydjanMnXTtcbiAgaWYobGlicmFyeVRhcmdldCA9PT0gJ3ZhcicgfHwgbGlicmFyeVRhcmdldCA9PT0gJ3dpbmRvdycpIHJldHVybiBbJ2lpZmUnXTtcbiAgaWYobGlicmFyeVRhcmdldCA9PT0gJ3VtZCcpIHJldHVybiBbJ3VtZCddO1xuICByZXR1cm4gWydlcyddO1xufTtcblxuY29uc3QgcmVzb2x2ZVByb2plY3RQYWNrYWdlID0gKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwcm9qZWN0UGFja2FnZSA9IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcycsIHBhY2thZ2VOYW1lKTtcbiAgcmV0dXJuIGV4aXN0c1N5bmMocHJvamVjdFBhY2thZ2UpID8gcHJvamVjdFBhY2thZ2UgOiByZXNvbHZlKExleENvbmZpZy5nZXRMZXhEaXIoKSwgJ25vZGVfbW9kdWxlcycsIHBhY2thZ2VOYW1lKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVMZXhWaXRlQ29uZmlnID0gKG9wdGlvbnM6IExleFZpdGVPcHRpb25zKTogSW5saW5lQ29uZmlnID0+IHtcbiAgY29uc3QgY29uZmlnID0gTGV4Q29uZmlnLmNvbmZpZztcbiAgY29uc3Qgc291cmNlUGF0aCA9IGNvbmZpZy5zb3VyY2VGdWxsUGF0aCB8fCByZXNvbHZlKHByb2Nlc3MuY3dkKCksIGNvbmZpZy5zb3VyY2VQYXRoIHx8ICcuL3NyYycpO1xuICBjb25zdCBvdXRwdXRQYXRoID0gY29uZmlnLm91dHB1dEZ1bGxQYXRoIHx8IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLm91dHB1dFBhdGggfHwgJy4vbGliJyk7XG4gIGNvbnN0IGVudHJ5UGF0aCA9IHJlc29sdmUoc291cmNlUGF0aCwgb3B0aW9ucy5lbnRyeSB8fCBjb25maWcuZW50cnlKcyB8fCAnaW5kZXguanMnKTtcbiAgY29uc3QgaHRtbFBhdGggPSByZXNvbHZlKHNvdXJjZVBhdGgsIGNvbmZpZy5lbnRyeUhUTUwgfHwgJ2luZGV4Lmh0bWwnKTtcbiAgY29uc3QgaGFzSHRtbEVudHJ5ID0gZXhpc3RzU3luYyhodG1sUGF0aCkgJiYgIW9wdGlvbnMuc3NyO1xuICBjb25zdCBvdXRwdXRIYXNoID0gY29uZmlnLm91dHB1dEhhc2ggfHwgb3B0aW9ucy5tb2RlID09PSAncHJvZHVjdGlvbic7XG4gIGNvbnN0IGZpbGVOYW1lID0gY29uZmlnLm91dHB1dEZpbGUgfHwgKG91dHB1dEhhc2ggPyAnW25hbWVdLltoYXNoXS5qcycgOiAnW25hbWVdLmpzJyk7XG5cbiAgY29uc3Qgdml0ZUNvbmZpZzogSW5saW5lQ29uZmlnID0ge1xuICAgIGFwcFR5cGU6IGhhc0h0bWxFbnRyeSA/ICdzcGEnIDogJ2N1c3RvbScsXG4gICAgYmFzZTogJy8nLFxuICAgIGJ1aWxkOiB7XG4gICAgICBjc3NDb2RlU3BsaXQ6IHRydWUsXG4gICAgICBlbXB0eU91dERpcjogZmFsc2UsXG4gICAgICBtaW5pZnk6IG9wdGlvbnMubW9kZSA9PT0gJ3Byb2R1Y3Rpb24nLFxuICAgICAgb3V0RGlyOiBvdXRwdXRQYXRoLFxuICAgICAgcm9sbGRvd25PcHRpb25zOiB7XG4gICAgICAgIGlucHV0OiBoYXNIdG1sRW50cnkgPyBodG1sUGF0aCA6IGVudHJ5UGF0aCxcbiAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgYXNzZXRGaWxlTmFtZXM6IG91dHB1dEhhc2ggPyAnYXNzZXRzL1tuYW1lXS5baGFzaF1bZXh0bmFtZV0nIDogJ2Fzc2V0cy9bbmFtZV1bZXh0bmFtZV0nLFxuICAgICAgICAgIGNodW5rRmlsZU5hbWVzOiBvdXRwdXRIYXNoID8gJ1tuYW1lXS5baGFzaF0uY2h1bmsuanMnIDogJ1tuYW1lXS5jaHVuay5qcycsXG4gICAgICAgICAgZW50cnlGaWxlTmFtZXM6IGZpbGVOYW1lLFxuICAgICAgICAgIG1hbnVhbENodW5rcyhpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpID8gJ3ZlbmRvcnMnIDogdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNvdXJjZW1hcDogY29uZmlnLnN3Yz8uc291cmNlTWFwcyA/IHRydWUgOiBmYWxzZSxcbiAgICAgIHNzcjogb3B0aW9ucy5zc3IgPyBlbnRyeVBhdGggOiBmYWxzZSxcbiAgICAgIHRhcmdldDogY29uZmlnLnN3Yz8uanNjPy50YXJnZXQ/LnRvU3RyaW5nKCkgfHwgJ2VzMjAyMCdcbiAgICB9LFxuICAgIGNsZWFyU2NyZWVuOiBmYWxzZSxcbiAgICBjb25maWdGaWxlOiBmYWxzZSxcbiAgICBjc3M6IHtcbiAgICAgIHBvc3Rjc3M6IHJlc29sdmUoTGV4Q29uZmlnLmdldExleERpcigpLCAncG9zdGNzcy5jb25maWcuanMnKVxuICAgIH0sXG4gICAgZGVmaW5lOiB7XG4gICAgICAncHJvY2Vzcy5lbnYuTk9ERV9FTlYnOiBKU09OLnN0cmluZ2lmeShvcHRpb25zLm1vZGUgfHwgKG9wdGlvbnMuY29tbWFuZCA9PT0gJ2J1aWxkJyA/ICdwcm9kdWN0aW9uJyA6ICdkZXZlbG9wbWVudCcpKVxuICAgIH0sXG4gICAgZW52RGlyOiBwcm9jZXNzLmN3ZCgpLFxuICAgIGxvZ0xldmVsOiBvcHRpb25zLnF1aWV0ID8gJ3NpbGVudCcgOiAnaW5mbycsXG4gICAgbW9kZTogb3B0aW9ucy5tb2RlIHx8IChvcHRpb25zLmNvbW1hbmQgPT09ICdidWlsZCcgPyAncHJvZHVjdGlvbicgOiAnZGV2ZWxvcG1lbnQnKSxcbiAgICBwbHVnaW5zOiBbXG4gICAgICAuLi4ob3B0aW9ucy5zc3IgPyBbXSA6IFtcbiAgICAgICAgZW1wdHlDcnlwdG9QbHVnaW4oKSxcbiAgICAgICAgbm9kZVBvbHlmaWxscyh7XG4gICAgICAgICAgZ2xvYmFsczoge0J1ZmZlcjogZmFsc2UsIGdsb2JhbDogZmFsc2UsIHByb2Nlc3M6IGZhbHNlfSxcbiAgICAgICAgICBpbmNsdWRlOiBbJ2Fzc2VydCcsICdidWZmZXInLCAnaHR0cCcsICdodHRwcycsICdvcycsICdwYXRoJywgJ3Byb2Nlc3MnLCAnc3RyZWFtJywgJ3V0aWwnLCAndm0nXSxcbiAgICAgICAgICBvdmVycmlkZXM6IHtcbiAgICAgICAgICAgIGJ1ZmZlcjogcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdidWZmZXInKSxcbiAgICAgICAgICAgIHByb2Nlc3M6IHJlc29sdmVQcm9qZWN0UGFja2FnZSgncHJvY2Vzcy9icm93c2VyLmpzJylcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3RvY29sSW1wb3J0czogdHJ1ZVxuICAgICAgICB9KSxcbiAgICAgICAgY3JlYXRlSW5qZWN0UGx1Z2luKHtcbiAgICAgICAgICBCdWZmZXI6IFtyZXNvbHZlKExleENvbmZpZy5nZXRMZXhEaXIoKSwgJ25vZGVfbW9kdWxlcy92aXRlLXBsdWdpbi1ub2RlLXBvbHlmaWxscy9zaGltcy9idWZmZXIvZGlzdC9pbmRleC5qcycpLCAnQnVmZmVyJ10sXG4gICAgICAgICAgZ2xvYmFsOiBbcmVzb2x2ZShMZXhDb25maWcuZ2V0TGV4RGlyKCksICdub2RlX21vZHVsZXMvdml0ZS1wbHVnaW4tbm9kZS1wb2x5ZmlsbHMvc2hpbXMvZ2xvYmFsL2Rpc3QvaW5kZXguanMnKSwgJ2RlZmF1bHQnXSxcbiAgICAgICAgICBwcm9jZXNzOiBbcmVzb2x2ZShMZXhDb25maWcuZ2V0TGV4RGlyKCksICdub2RlX21vZHVsZXMvdml0ZS1wbHVnaW4tbm9kZS1wb2x5ZmlsbHMvc2hpbXMvcHJvY2Vzcy9kaXN0L2luZGV4LmpzJyksICdkZWZhdWx0J11cbiAgICAgICAgfSlcbiAgICAgIF0pLFxuICAgICAgc3djUGx1Z2luKHNvdXJjZVBhdGgpLFxuICAgICAgZ3JhcGhxbFBsdWdpbigpLFxuICAgICAgLi4uKG9wdGlvbnMuc3NyID8gW10gOiBbaW1wb3J0TWV0YUNvbXBhdGliaWxpdHlQbHVnaW4oc291cmNlUGF0aCksIGFzc2V0c0RldlBsdWdpbigpLCBhbmFseXplclBsdWdpbihCb29sZWFuKG9wdGlvbnMuYW5hbHl6ZSkpXSlcbiAgICBdLFxuICAgIHB1YmxpY0RpcjogZmFsc2UsXG4gICAgcmVzb2x2ZToge1xuICAgICAgYWxpYXM6IHtcbiAgICAgICAgQnVmZmVyOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ2J1ZmZlcicpLFxuICAgICAgICAnY29yZS1qcyc6IHJlc29sdmVQcm9qZWN0UGFja2FnZSgnY29yZS1qcycpLFxuICAgICAgICBnbG9iYWw6IHJlc29sdmVQcm9qZWN0UGFja2FnZSgnZ2xvYmFsJyksXG4gICAgICAgICdncmFwaHFsLXRhZyc6IHJlc29sdmVQcm9qZWN0UGFja2FnZSgnZ3JhcGhxbC10YWcnKSxcbiAgICAgICAgcmFuZG9tYnl0ZXM6IHJlc29sdmUoTGV4Q29uZmlnLmdldExleERpcigpLCAnbm9kZV9tb2R1bGVzL3JhbmRvbWJ5dGVzJyksXG4gICAgICAgIHJlYWN0OiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ3JlYWN0JyksXG4gICAgICAgICdyZWFjdC1kb20nOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ3JlYWN0LWRvbScpLFxuICAgICAgICAncmVnZW5lcmF0b3ItcnVudGltZSc6IHJlc29sdmVQcm9qZWN0UGFja2FnZSgncmVnZW5lcmF0b3ItcnVudGltZScpLFxuICAgICAgICAndml0ZS1wbHVnaW4tbm9kZS1wb2x5ZmlsbHMvc2hpbXMvYnVmZmVyJzogcmVzb2x2ZShMZXhDb25maWcuZ2V0TGV4RGlyKCksICdub2RlX21vZHVsZXMvdml0ZS1wbHVnaW4tbm9kZS1wb2x5ZmlsbHMvc2hpbXMvYnVmZmVyL2Rpc3QvaW5kZXguanMnKSxcbiAgICAgICAgJ3ZpdGUtcGx1Z2luLW5vZGUtcG9seWZpbGxzL3NoaW1zL2dsb2JhbCc6IHJlc29sdmUoTGV4Q29uZmlnLmdldExleERpcigpLCAnbm9kZV9tb2R1bGVzL3ZpdGUtcGx1Z2luLW5vZGUtcG9seWZpbGxzL3NoaW1zL2dsb2JhbC9kaXN0L2luZGV4LmpzJyksXG4gICAgICAgICd2aXRlLXBsdWdpbi1ub2RlLXBvbHlmaWxscy9zaGltcy9wcm9jZXNzJzogcmVzb2x2ZShMZXhDb25maWcuZ2V0TGV4RGlyKCksICdub2RlX21vZHVsZXMvdml0ZS1wbHVnaW4tbm9kZS1wb2x5ZmlsbHMvc2hpbXMvcHJvY2Vzcy9kaXN0L2luZGV4LmpzJylcbiAgICAgIH0sXG4gICAgICBleHRlbnNpb25zOiBbJy5tanMnLCAnLmpzJywgJy50cycsICcudHN4JywgJy5qc3gnLCAnLmpzb24nLCAnLmdxbCcsICcuZ3JhcGhxbCddLFxuICAgICAgcHJlc2VydmVTeW1saW5rczogZmFsc2UsXG4gICAgICB0c2NvbmZpZ1BhdGhzOiB0cnVlXG4gICAgfSxcbiAgICByb290OiBzb3VyY2VQYXRoLFxuICAgIHNlcnZlcjoge1xuICAgICAgaG1yOiBmYWxzZSxcbiAgICAgIG9wZW46IG9wdGlvbnMub3BlbixcbiAgICAgIHBvcnQ6IG9wdGlvbnMucG9ydCxcbiAgICAgIHN0cmljdFBvcnQ6IHRydWVcbiAgICB9XG4gIH07XG5cbiAgaWYoIWhhc0h0bWxFbnRyeSAmJiBjb25maWcubGlicmFyeU5hbWUgJiYgIW9wdGlvbnMuc3NyKSB7XG4gICAgdml0ZUNvbmZpZy5idWlsZCA9IHtcbiAgICAgIC4uLnZpdGVDb25maWcuYnVpbGQsXG4gICAgICBsaWI6IHtcbiAgICAgICAgZW50cnk6IGVudHJ5UGF0aCxcbiAgICAgICAgZmlsZU5hbWU6ICgpID0+IGNvbmZpZy5vdXRwdXRGaWxlIHx8ICdpbmRleC5qcycsXG4gICAgICAgIGZvcm1hdHM6IGdldExpYnJhcnlGb3JtYXRzKGNvbmZpZy5saWJyYXJ5VGFyZ2V0KSxcbiAgICAgICAgbmFtZTogY29uZmlnLmxpYnJhcnlOYW1lXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBtZXJnZUNvbmZpZyh2aXRlQ29uZmlnLCBjb25maWcudml0ZSB8fCB7fSkgYXMgSW5saW5lQ29uZmlnO1xufTtcbiJdLCJuYW1lcyI6WyJ0cmFuc2Zvcm0iLCJpbmplY3QiLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwiZXh0bmFtZSIsInJlc29sdmUiLCJtZXJnZUNvbmZpZyIsIm5vZGVQb2x5ZmlsbHMiLCJMZXhDb25maWciLCJnZW5lcmF0ZUxleEZhdmljb25zIiwiZ2V0RGV2QXNzZXQiLCJjcmVhdGVJbmplY3RQbHVnaW4iLCJjb250ZW50VHlwZXMiLCJlbXB0eUNyeXB0b1BsdWdpbiIsImxvYWQiLCJpZCIsIm5hbWUiLCJyZXNvbHZlSWQiLCJncmFwaHFsUGx1Z2luIiwidGVzdCIsInNvdXJjZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJzd2NQbHVnaW4iLCJzb3VyY2VQYXRoIiwiZW5mb3JjZSIsImNsZWFuSWQiLCJzcGxpdCIsInN0YXJ0c1dpdGgiLCJzd2NDb25maWciLCJnZXRTV0NDb25maWdXaXRoUmVhY3RDb21waWxlciIsInJlc3VsdCIsImZpbGVuYW1lIiwibW9kdWxlIiwidHlwZSIsInNvdXJjZU1hcHMiLCJuZWVkc1JlYWN0IiwiY29kZSIsIm1hcCIsImltcG9ydE1ldGFDb21wYXRpYmlsaXR5UGx1Z2luIiwiaW5jbHVkZXMiLCJyZXBsYWNlbWVudCIsInJlcGxhY2VBbGwiLCJhc3NldHNEZXZQbHVnaW4iLCJmYXZpY29uSHRtbCIsImJ1aWxkU3RhcnQiLCJnZW5lcmF0ZWRGYXZpY29ucyIsImNvbmZpZyIsImh0bWwiLCJjb25maWd1cmVTZXJ2ZXIiLCJzZXJ2ZXIiLCJtaWRkbGV3YXJlcyIsInVzZSIsInJlcXVlc3QiLCJyZXNwb25zZSIsIm5leHQiLCJ1cmwiLCJhc3NldCIsInN0YXR1c0NvZGUiLCJzZXRIZWFkZXIiLCJlbmQiLCJ0cmFuc2Zvcm1JbmRleEh0bWwiLCJsZW5ndGgiLCJyZXBsYWNlIiwiam9pbiIsImFuYWx5emVyUGx1Z2luIiwiZW5hYmxlZCIsImdlbmVyYXRlQnVuZGxlIiwiX29wdGlvbnMiLCJidW5kbGUiLCJyZXBvcnQiLCJPYmplY3QiLCJlbnRyaWVzIiwiZmlsZU5hbWUiLCJvdXRwdXQiLCJzaXplIiwiQnVmZmVyIiwiYnl0ZUxlbmd0aCIsImVtaXRGaWxlIiwiZ2V0TGlicmFyeUZvcm1hdHMiLCJsaWJyYXJ5VGFyZ2V0IiwicmVzb2x2ZVByb2plY3RQYWNrYWdlIiwicGFja2FnZU5hbWUiLCJwcm9qZWN0UGFja2FnZSIsInByb2Nlc3MiLCJjd2QiLCJnZXRMZXhEaXIiLCJjcmVhdGVMZXhWaXRlQ29uZmlnIiwib3B0aW9ucyIsInNvdXJjZUZ1bGxQYXRoIiwib3V0cHV0UGF0aCIsIm91dHB1dEZ1bGxQYXRoIiwiZW50cnlQYXRoIiwiZW50cnkiLCJlbnRyeUpzIiwiaHRtbFBhdGgiLCJlbnRyeUhUTUwiLCJoYXNIdG1sRW50cnkiLCJzc3IiLCJvdXRwdXRIYXNoIiwibW9kZSIsIm91dHB1dEZpbGUiLCJ2aXRlQ29uZmlnIiwiYXBwVHlwZSIsImJhc2UiLCJidWlsZCIsImNzc0NvZGVTcGxpdCIsImVtcHR5T3V0RGlyIiwibWluaWZ5Iiwib3V0RGlyIiwicm9sbGRvd25PcHRpb25zIiwiaW5wdXQiLCJhc3NldEZpbGVOYW1lcyIsImNodW5rRmlsZU5hbWVzIiwiZW50cnlGaWxlTmFtZXMiLCJtYW51YWxDaHVua3MiLCJ1bmRlZmluZWQiLCJzb3VyY2VtYXAiLCJzd2MiLCJ0YXJnZXQiLCJqc2MiLCJ0b1N0cmluZyIsImNsZWFyU2NyZWVuIiwiY29uZmlnRmlsZSIsImNzcyIsInBvc3Rjc3MiLCJkZWZpbmUiLCJjb21tYW5kIiwiZW52RGlyIiwibG9nTGV2ZWwiLCJxdWlldCIsInBsdWdpbnMiLCJnbG9iYWxzIiwiZ2xvYmFsIiwiaW5jbHVkZSIsIm92ZXJyaWRlcyIsImJ1ZmZlciIsInByb3RvY29sSW1wb3J0cyIsIkJvb2xlYW4iLCJhbmFseXplIiwicHVibGljRGlyIiwiYWxpYXMiLCJyYW5kb21ieXRlcyIsInJlYWN0IiwiZXh0ZW5zaW9ucyIsInByZXNlcnZlU3ltbGlua3MiLCJ0c2NvbmZpZ1BhdGhzIiwicm9vdCIsImhtciIsIm9wZW4iLCJwb3J0Iiwic3RyaWN0UG9ydCIsImxpYnJhcnlOYW1lIiwibGliIiwiZm9ybWF0cyIsInZpdGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLFNBQVMsUUFBTyxZQUFZO0FBQ3BDLE9BQU9DLFlBQVksd0JBQXdCO0FBQzNDLFNBQVFDLFVBQVUsRUFBRUMsWUFBWSxRQUFPLEtBQUs7QUFDNUMsU0FBUUMsT0FBTyxFQUFFQyxPQUFPLFFBQU8sT0FBTztBQUN0QyxTQUFRQyxXQUFXLFFBQU8sT0FBTztBQUNqQyxTQUFRQyxhQUFhLFFBQU8sNkJBQTZCO0FBRXpELFNBQVFDLFNBQVMsUUFBTyxxQkFBcUI7QUFDN0MsU0FBUUMsbUJBQW1CLEVBQUVDLFdBQVcsUUFB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