From 7eef78b7628c61a01942a11b630f21f23941f33c Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Thu, 7 Mar 2019 18:19:35 -0800 Subject: [PATCH 01/13] devtools: import html generator code --- lighthouse-core/scripts/roll-to-devtools.sh | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lighthouse-core/scripts/roll-to-devtools.sh b/lighthouse-core/scripts/roll-to-devtools.sh index 78e879f964c4..f434d2ce0145 100755 --- a/lighthouse-core/scripts/roll-to-devtools.sh +++ b/lighthouse-core/scripts/roll-to-devtools.sh @@ -37,9 +37,22 @@ lh_bg_js="dist/lighthouse-dt-bundle.js" lh_worker_dir="$frontend_dir/audits2_worker/lighthouse" # copy report files -cp -pPR $report_dir/{report-styles.css,templates.html,renderer} "$fe_lh_dir" +cp -pPR $report_dir/renderer "$fe_lh_dir" echo -e "\033[32m ✓\033[39m Report renderer files copied." # copy lighthouse-dt-bundle (potentially stale) cp -pPR "$lh_bg_js" "$lh_worker_dir/lighthouse-dt-bundle.js" echo -e "\033[96m ✓\033[39m (Potentially stale) lighthouse-dt-bundle copied." + +# bundle html generator +node -e " + const htmlReportAssets = require('./lighthouse-core/report/html/html-report-assets.js'); + const reportGenerator = require('./lighthouse-core/report/report-generator.js'); + console.log('const htmlReportAssets =', JSON.stringify(htmlReportAssets, null, 2), ';'); + console.log('class ReportGenerator {'); + console.log(' static Assets = htmlReportAssets;'); + console.log(' static', reportGenerator.generateReportHtml.toString()); + console.log(' static', reportGenerator.replaceStrings.toString()); + console.log('}'); + console.log('self.ReportGenerator = ReportGenerator'); +" > "$fe_lh_dir"/report-html-generator.js From cb33112e9c42c0edee7f74817d3c6ff1578752a9 Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Fri, 8 Mar 2019 09:34:29 -0800 Subject: [PATCH 02/13] refactor --- .../report/html/html-report-assets.js | 8 +++--- lighthouse-core/report/report-generator.js | 27 ++++++++++++++----- lighthouse-core/scripts/roll-to-devtools.sh | 26 ++++++++---------- 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/lighthouse-core/report/html/html-report-assets.js b/lighthouse-core/report/html/html-report-assets.js index 0a2b56c0a430..00fa519eb4a7 100644 --- a/lighthouse-core/report/html/html-report-assets.js +++ b/lighthouse-core/report/html/html-report-assets.js @@ -29,8 +29,8 @@ const REPORT_CSS = fs.readFileSync(__dirname + '/report-styles.css', 'utf8'); const REPORT_TEMPLATES = fs.readFileSync(__dirname + '/templates.html', 'utf8'); module.exports = { - REPORT_TEMPLATE, - REPORT_TEMPLATES, - REPORT_JAVASCRIPT, - REPORT_CSS, + 'report-template.html': REPORT_TEMPLATE, + 'report-templates.html': REPORT_TEMPLATES, + 'report.js': REPORT_JAVASCRIPT, + 'report.css': REPORT_CSS, }; diff --git a/lighthouse-core/report/report-generator.js b/lighthouse-core/report/report-generator.js index 09d653a30106..56dc948d83d9 100644 --- a/lighthouse-core/report/report-generator.js +++ b/lighthouse-core/report/report-generator.js @@ -5,7 +5,17 @@ */ 'use strict'; -const htmlReportAssets = require('./html/html-report-assets'); +/** + * @param {keyof typeof import('./html/html-report-assets')} name + */ +function getAsset(name) { + if (typeof module !== 'undefined' && module.exports) { + return require('./html/html-report-assets')[name]; + } else { + // @ts-ignore - Devtools + return Runtime.cachedAssets['audits2/lighthouse/' + name]; + } +} class ReportGenerator { /** @@ -37,13 +47,13 @@ class ReportGenerator { .replace(/ "$fe_lh_dir"/report-html-generator.js From 62f67ac88498194feb5bc316c2a57473ac0542e4 Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Fri, 8 Mar 2019 09:41:12 -0800 Subject: [PATCH 03/13] oh cp... --- lighthouse-core/scripts/roll-to-devtools.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lighthouse-core/scripts/roll-to-devtools.sh b/lighthouse-core/scripts/roll-to-devtools.sh index 5e8e57e5ee4d..f273b1593607 100755 --- a/lighthouse-core/scripts/roll-to-devtools.sh +++ b/lighthouse-core/scripts/roll-to-devtools.sh @@ -38,7 +38,7 @@ lh_worker_dir="$frontend_dir/audits2_worker/lighthouse" # copy report files cp -pPR $report_dir/report-generator.js "$fe_lh_dir" -cp -pPR $report_dir/html/renderer "$fe_lh_dir"/renderer +cp -pPR $report_dir/html/renderer "$fe_lh_dir" # import report assets node -e " const fs = require('fs'); From 511278a1c5978a04e4f163bec3724fdf0dd77fc5 Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Fri, 8 Mar 2019 09:48:28 -0800 Subject: [PATCH 04/13] cachedResources --- lighthouse-core/report/report-generator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lighthouse-core/report/report-generator.js b/lighthouse-core/report/report-generator.js index 56dc948d83d9..caf62d3fbf91 100644 --- a/lighthouse-core/report/report-generator.js +++ b/lighthouse-core/report/report-generator.js @@ -13,7 +13,7 @@ function getAsset(name) { return require('./html/html-report-assets')[name]; } else { // @ts-ignore - Devtools - return Runtime.cachedAssets['audits2/lighthouse/' + name]; + return Runtime.cachedResources['audits2/lighthouse/' + name]; } } From 4b1df48bc8d79db7445324b8b0ec8d039ccd34f7 Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Fri, 8 Mar 2019 09:59:32 -0800 Subject: [PATCH 05/13] udpate other uses of report assets --- build/build-viewer.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build/build-viewer.js b/build/build-viewer.js index d40340030240..3cb0333000e6 100644 --- a/build/build-viewer.js +++ b/build/build-viewer.js @@ -88,7 +88,7 @@ async function copyAssets() { * @return {Promise} */ async function css() { - const reportCss = htmlReportAssets.REPORT_CSS; + const reportCss = htmlReportAssets['report.css']; const viewerCss = await readFileAsync(`${sourceDir}/app/styles/viewer.css`, {encoding: 'utf8'}); await safeWriteFileAsync(`${distDir}/styles/viewer.css`, [reportCss, viewerCss].join('\n')); } @@ -99,7 +99,7 @@ async function css() { */ async function html() { let htmlSrc = await readFileAsync(`${sourceDir}/app/index.html`, {encoding: 'utf8'}); - htmlSrc = htmlSrc.replace(/%%LIGHTHOUSE_TEMPLATES%%/, htmlReportAssets.REPORT_TEMPLATES); + htmlSrc = htmlSrc.replace(/%%LIGHTHOUSE_TEMPLATES%%/, htmlReportAssets['report-templates.html']); await safeWriteFileAsync(`${distDir}/index.html`, htmlSrc); } @@ -124,7 +124,7 @@ async function compileJs() { const generatorJs = await generatorJsPromise; // Report renderer scripts. - const rendererJs = htmlReportAssets.REPORT_JAVASCRIPT; + const rendererJs = htmlReportAssets['report.js']; // idb-keyval dependency. const idbKeyvalPath = require.resolve('idb-keyval/dist/idb-keyval-min.js'); From af95b3a01d69e3ac63167acd148b7b993037ee31 Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Fri, 8 Mar 2019 10:52:49 -0800 Subject: [PATCH 06/13] ensure asset files are ascii only so chrome will compile --- lighthouse-core/scripts/roll-to-devtools.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lighthouse-core/scripts/roll-to-devtools.sh b/lighthouse-core/scripts/roll-to-devtools.sh index f273b1593607..220fbb8a6e1f 100755 --- a/lighthouse-core/scripts/roll-to-devtools.sh +++ b/lighthouse-core/scripts/roll-to-devtools.sh @@ -44,7 +44,8 @@ node -e " const fs = require('fs'); const htmlReportAssets = require('./lighthouse-core/report/html/html-report-assets.js'); for (const [name, content] of Object.entries(htmlReportAssets)) { - fs.writeFileSync('$fe_lh_dir/' + name, content); + const unicodeEscaped = content.replace(/[^\x00-\x7F]/g, c => '\\\\u' + c.charCodeAt(0).toString(16)); + fs.writeFileSync('$fe_lh_dir/' + name, unicodeEscaped, 'ascii'); } " echo -e "\033[32m ✓\033[39m Report renderer files copied." From 6e63930be82d1ed4ab0950bba8f08f087d0ce10b Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Fri, 8 Mar 2019 12:34:12 -0800 Subject: [PATCH 07/13] lint --- lighthouse-core/report/report-generator.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lighthouse-core/report/report-generator.js b/lighthouse-core/report/report-generator.js index caf62d3fbf91..aa3bf3afbaa4 100644 --- a/lighthouse-core/report/report-generator.js +++ b/lighthouse-core/report/report-generator.js @@ -13,7 +13,7 @@ function getAsset(name) { return require('./html/html-report-assets')[name]; } else { // @ts-ignore - Devtools - return Runtime.cachedResources['audits2/lighthouse/' + name]; + return Runtime.cachedResources['audits2/lighthouse/' + name]; // eslint-disable-line } } @@ -129,5 +129,5 @@ if (typeof module !== 'undefined' && module.exports) { module.exports = ReportGenerator; } else { // @ts-ignore - Devtools - self.ReportGenerator = ReportGenerator; + self.ReportGenerator = ReportGenerator; // eslint-disable-line } From da909446f820066385e636971a9474057e5a9442 Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Fri, 8 Mar 2019 15:08:09 -0800 Subject: [PATCH 08/13] browserify --- build/build-viewer.js | 6 ++-- .../report/html/html-report-assets.js | 8 ++--- lighthouse-core/report/report-generator.js | 29 +++++-------------- lighthouse-core/scripts/roll-to-devtools.sh | 12 ++------ 4 files changed, 18 insertions(+), 37 deletions(-) diff --git a/build/build-viewer.js b/build/build-viewer.js index 3cb0333000e6..d40340030240 100644 --- a/build/build-viewer.js +++ b/build/build-viewer.js @@ -88,7 +88,7 @@ async function copyAssets() { * @return {Promise} */ async function css() { - const reportCss = htmlReportAssets['report.css']; + const reportCss = htmlReportAssets.REPORT_CSS; const viewerCss = await readFileAsync(`${sourceDir}/app/styles/viewer.css`, {encoding: 'utf8'}); await safeWriteFileAsync(`${distDir}/styles/viewer.css`, [reportCss, viewerCss].join('\n')); } @@ -99,7 +99,7 @@ async function css() { */ async function html() { let htmlSrc = await readFileAsync(`${sourceDir}/app/index.html`, {encoding: 'utf8'}); - htmlSrc = htmlSrc.replace(/%%LIGHTHOUSE_TEMPLATES%%/, htmlReportAssets['report-templates.html']); + htmlSrc = htmlSrc.replace(/%%LIGHTHOUSE_TEMPLATES%%/, htmlReportAssets.REPORT_TEMPLATES); await safeWriteFileAsync(`${distDir}/index.html`, htmlSrc); } @@ -124,7 +124,7 @@ async function compileJs() { const generatorJs = await generatorJsPromise; // Report renderer scripts. - const rendererJs = htmlReportAssets['report.js']; + const rendererJs = htmlReportAssets.REPORT_JAVASCRIPT; // idb-keyval dependency. const idbKeyvalPath = require.resolve('idb-keyval/dist/idb-keyval-min.js'); diff --git a/lighthouse-core/report/html/html-report-assets.js b/lighthouse-core/report/html/html-report-assets.js index 00fa519eb4a7..0a2b56c0a430 100644 --- a/lighthouse-core/report/html/html-report-assets.js +++ b/lighthouse-core/report/html/html-report-assets.js @@ -29,8 +29,8 @@ const REPORT_CSS = fs.readFileSync(__dirname + '/report-styles.css', 'utf8'); const REPORT_TEMPLATES = fs.readFileSync(__dirname + '/templates.html', 'utf8'); module.exports = { - 'report-template.html': REPORT_TEMPLATE, - 'report-templates.html': REPORT_TEMPLATES, - 'report.js': REPORT_JAVASCRIPT, - 'report.css': REPORT_CSS, + REPORT_TEMPLATE, + REPORT_TEMPLATES, + REPORT_JAVASCRIPT, + REPORT_CSS, }; diff --git a/lighthouse-core/report/report-generator.js b/lighthouse-core/report/report-generator.js index aa3bf3afbaa4..b75cd2c2c68b 100644 --- a/lighthouse-core/report/report-generator.js +++ b/lighthouse-core/report/report-generator.js @@ -5,19 +5,11 @@ */ 'use strict'; -/** - * @param {keyof typeof import('./html/html-report-assets')} name - */ -function getAsset(name) { - if (typeof module !== 'undefined' && module.exports) { - return require('./html/html-report-assets')[name]; - } else { - // @ts-ignore - Devtools - return Runtime.cachedResources['audits2/lighthouse/' + name]; // eslint-disable-line - } -} +const htmlReportAssets = require('./html/html-report-assets'); class ReportGenerator { + static get Assets() { return htmlReportAssets; } + /** * Replaces all the specified strings in source without serial replacements. * @param {string} source @@ -47,13 +39,13 @@ class ReportGenerator { .replace(/ '\\\\u' + c.charCodeAt(0).toString(16)); - fs.writeFileSync('$fe_lh_dir/' + name, unicodeEscaped, 'ascii'); - } -" echo -e "\033[32m ✓\033[39m Report renderer files copied." # copy lighthouse-dt-bundle (potentially stale) cp -pPR "$lh_bg_js" "$lh_worker_dir/lighthouse-dt-bundle.js" echo -e "\033[96m ✓\033[39m (Potentially stale) lighthouse-dt-bundle copied." + +# bundle report generator +yarn browserify lighthouse-core/report/report-generator.js -o $fe_lh_dir/report-generator.js -s ReportGenerator -t brfs From d511f4f2be788fbaa35dd5299f551846adf0c930 Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Fri, 8 Mar 2019 15:16:37 -0800 Subject: [PATCH 09/13] revert roll changes --- lighthouse-core/scripts/roll-to-devtools.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lighthouse-core/scripts/roll-to-devtools.sh b/lighthouse-core/scripts/roll-to-devtools.sh index a93d900a5de6..363538d06309 100755 --- a/lighthouse-core/scripts/roll-to-devtools.sh +++ b/lighthouse-core/scripts/roll-to-devtools.sh @@ -30,15 +30,14 @@ else echo -e "\033[96m ✓\033[39m Chromium folder in place." fi -report_dir="lighthouse-core/report" +report_dir="lighthouse-core/report/html" fe_lh_dir="$frontend_dir/audits2/lighthouse" lh_bg_js="dist/lighthouse-dt-bundle.js" lh_worker_dir="$frontend_dir/audits2_worker/lighthouse" # copy report files -cp -pPR $report_dir/report-generator.js "$fe_lh_dir" -cp -pPR $report_dir/html/renderer "$fe_lh_dir" +cp -pPR $report_dir/renderer "$fe_lh_dir" echo -e "\033[32m ✓\033[39m Report renderer files copied." # copy lighthouse-dt-bundle (potentially stale) From b766b4583fbf478f478ef7141f9145ed9d5e6fda Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Fri, 8 Mar 2019 16:06:09 -0800 Subject: [PATCH 10/13] lint --- lighthouse-core/report/report-generator.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lighthouse-core/report/report-generator.js b/lighthouse-core/report/report-generator.js index b75cd2c2c68b..01a0fade6748 100644 --- a/lighthouse-core/report/report-generator.js +++ b/lighthouse-core/report/report-generator.js @@ -8,7 +8,9 @@ const htmlReportAssets = require('./html/html-report-assets'); class ReportGenerator { - static get Assets() { return htmlReportAssets; } + static get Assets() { + return htmlReportAssets; + } /** * Replaces all the specified strings in source without serial replacements. From dcf83a780fa7cf022c4a4e5e4a8da9574a6625f3 Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Thu, 14 Mar 2019 09:29:24 -0700 Subject: [PATCH 11/13] getter -> method, move build code to build folder --- build/dt-report-generator-bundle.js | 12 ++++++++++++ default.profraw | Bin 0 -> 2056 bytes lighthouse-core/report/report-generator.js | 2 +- lighthouse-core/scripts/roll-to-devtools.sh | 4 ++-- package.json | 2 +- 5 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 build/dt-report-generator-bundle.js create mode 100644 default.profraw diff --git a/build/dt-report-generator-bundle.js b/build/dt-report-generator-bundle.js new file mode 100644 index 000000000000..f29c4ecba0fe --- /dev/null +++ b/build/dt-report-generator-bundle.js @@ -0,0 +1,12 @@ +const browserify = require('browserify'); +const fs = require('fs'); + +const distDir = __dirname + '/../dist'; +const outFile = `${distDir}/report-generator.js`; +const generatorFilename = `./lighthouse-core/report/report-generator.js`; +browserify(generatorFilename, {standalone: 'ReportGenerator'}) + .transform('brfs') + .bundle((err, src) => { + if (err) throw err; + fs.writeFileSync(outFile, src.toString()); + }); diff --git a/default.profraw b/default.profraw new file mode 100644 index 0000000000000000000000000000000000000000..c9f5b6b8f21af0a74b2fc2dad380de092f5575ba GIT binary patch literal 2056 zcmZoHO3N=Q$obF000E*xRnH7n|MuTb1&&)!zXht) za=8P=en8bTm|<7{z_mogaPI7R^DifWO%N!Bs4KvszV`Qlvx#cbhhXY8pz06cP=C{Y z#?e%phh`^|VwSldxf1LERWD$U>K<5l{*h06E2)~>3H1&`0!+Ons(M&>wtucK6)&1J zy=$Ll6g#KMk_@PN12pxp@a)+8i!n%J_5Z11IWZR%4LdeK)laZOHJ=^ofC~%u?5N~- zzS@+oakb*N$n_Uc^$s@J)vy11RP5}MSK>8oQyaXu-tAN!NqU@s(yhxs(P6Df&zCh`hF^K-Ww48sOgzg;{&LA z1`kyA!cYgu_#QrJaMe6e0?Mx_hp4;YjjA5z-|iVrU9HbMPs7wVK-GW1pJ4zHZ*h1T^T2eD8BF~QsQLgL>S6wXg+DqC zlP5%@>x1!O`e1w*%>-q@y;pf@SoHa(K6cAi z@r?B{r$4MZA--Xu(e@oD?3@p#?{1$b&Au$l@?6r7h;1ICd+u-x7&gB8-dZ8sYyYZa zkzvKr_sn+r9ohHyul=;Sxc>J$j)I>x>`yyI-`?mk~He@2}7uF_k@sa*#`=FfdH q``|GaDT(&gLQT7DQgR!#PAPS|X!W+bG}RZ_tPP)4$8hK3JT(AZ6Bbbb literal 0 HcmV?d00001 diff --git a/lighthouse-core/report/report-generator.js b/lighthouse-core/report/report-generator.js index 01a0fade6748..61561c6d27d3 100644 --- a/lighthouse-core/report/report-generator.js +++ b/lighthouse-core/report/report-generator.js @@ -8,7 +8,7 @@ const htmlReportAssets = require('./html/html-report-assets'); class ReportGenerator { - static get Assets() { + static getAssets() { return htmlReportAssets; } diff --git a/lighthouse-core/scripts/roll-to-devtools.sh b/lighthouse-core/scripts/roll-to-devtools.sh index 363538d06309..b33714397c80 100755 --- a/lighthouse-core/scripts/roll-to-devtools.sh +++ b/lighthouse-core/scripts/roll-to-devtools.sh @@ -44,5 +44,5 @@ echo -e "\033[32m ✓\033[39m Report renderer files copied." cp -pPR "$lh_bg_js" "$lh_worker_dir/lighthouse-dt-bundle.js" echo -e "\033[96m ✓\033[39m (Potentially stale) lighthouse-dt-bundle copied." -# bundle report generator -yarn browserify lighthouse-core/report/report-generator.js -o $fe_lh_dir/report-generator.js -s ReportGenerator -t brfs +# copy report generator +cp dist/report-generator.js $fe_lh_dir diff --git a/package.json b/package.json index dea855a45ac3..5cd686791183 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "build-all:task": "yarn build-extension & yarn build-devtools & yarn build-lr & yarn build-viewer & wait", "build-all:task:windows": "yarn build-extension && yarn build-devtools && yarn build-lr && yarn build-viewer", "build-extension": "node ./build/build-extension.js", - "build-devtools": "node ./build/build-bundle.js clients/devtools-entry.js dist/lighthouse-dt-bundle.js", + "build-devtools": "node ./build/build-bundle.js clients/devtools-entry.js dist/lighthouse-dt-bundle.js && node ./build/dt-report-generator-bundle.js", "build-lr": "node ./build/build-bundle.js clients/lightrider-entry.js dist/lighthouse-lr-bundle.js", "build-viewer": "node ./build/build-viewer.js", "clean": "rimraf dist proto/scripts/*.json proto/scripts/*_pb2.* proto/scripts/*_pb.* proto/scripts/__pycache__ proto/scripts/*.pyc *.report.html *.report.dom.html *.report.json *.devtoolslog.json *.trace.json || true", From cf51a1bd347019bf3ba40e87f33e614ded54201c Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Thu, 14 Mar 2019 10:06:31 -0700 Subject: [PATCH 12/13] license, use strict --- build/dt-report-generator-bundle.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/build/dt-report-generator-bundle.js b/build/dt-report-generator-bundle.js index f29c4ecba0fe..0dd028b4ff51 100644 --- a/build/dt-report-generator-bundle.js +++ b/build/dt-report-generator-bundle.js @@ -1,3 +1,10 @@ +/** + * @license Copyright 2019 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + */ +'use strict'; + const browserify = require('browserify'); const fs = require('fs'); From e44d50fdb0ac5d13135aff5437781e3cb8284960 Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Thu, 14 Mar 2019 10:07:09 -0700 Subject: [PATCH 13/13] go away --- default.profraw | Bin 2056 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 default.profraw diff --git a/default.profraw b/default.profraw deleted file mode 100644 index c9f5b6b8f21af0a74b2fc2dad380de092f5575ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2056 zcmZoHO3N=Q$obF000E*xRnH7n|MuTb1&&)!zXht) za=8P=en8bTm|<7{z_mogaPI7R^DifWO%N!Bs4KvszV`Qlvx#cbhhXY8pz06cP=C{Y z#?e%phh`^|VwSldxf1LERWD$U>K<5l{*h06E2)~>3H1&`0!+Ons(M&>wtucK6)&1J zy=$Ll6g#KMk_@PN12pxp@a)+8i!n%J_5Z11IWZR%4LdeK)laZOHJ=^ofC~%u?5N~- zzS@+oakb*N$n_Uc^$s@J)vy11RP5}MSK>8oQyaXu-tAN!NqU@s(yhxs(P6Df&zCh`hF^K-Ww48sOgzg;{&LA z1`kyA!cYgu_#QrJaMe6e0?Mx_hp4;YjjA5z-|iVrU9HbMPs7wVK-GW1pJ4zHZ*h1T^T2eD8BF~QsQLgL>S6wXg+DqC zlP5%@>x1!O`e1w*%>-q@y;pf@SoHa(K6cAi z@r?B{r$4MZA--Xu(e@oD?3@p#?{1$b&Au$l@?6r7h;1ICd+u-x7&gB8-dZ8sYyYZa zkzvKr_sn+r9ohHyul=;Sxc>J$j)I>x>`yyI-`?mk~He@2}7uF_k@sa*#`=FfdH q``|GaDT(&gLQT7DQgR!#PAPS|X!W+bG}RZ_tPP)4$8hK3JT(AZ6Bbbb