From df6c5bf4ad54aa1de333cc6ea54ca87bb251684a Mon Sep 17 00:00:00 2001 From: birdguo Date: Fri, 19 Jan 2024 17:58:40 +0800 Subject: [PATCH] feature(vue-next): hippy vue next ssr for 3.0 (#3539) * feat(vue-next): commit ssr init version * feat(vue-next): remove unused method & fix ts type issue * feat(vue-next): optimize build file types & update doc * feat(vue-next): ssr support commit for library & demo * fix(vue-next): fix eslint issue * fix(vue-next): compatible hippy 3.x node operate method & ui * fix(vue-next): remove unused code * fix(vue-next): fix ssr demo issue * fix(vue-next): fix div demo issue & native background android issue * docs(vue-next): add new vue-next ssr docs --- docs/api/hippy-vue/vue3.md | 108 +++- .../assets/img/hippy-vue-next-ssr-arch-cn.png | Bin 0 -> 125756 bytes driver/js/.eslintrc.js | 3 + .../hippy-vue-next-demo/src/main-native.ts | 1 + .../hippy-vue-next-ssr-demo/.gitignore | 21 + .../examples/hippy-vue-next-ssr-demo/.npmrc | 1 + .../hippy-vue-next-ssr-demo/README.md | 46 ++ .../examples/hippy-vue-next-ssr-demo/app.d.ts | 10 + .../hippy-vue-next-ssr-demo/package.json | 83 +++ .../scripts/env-polyfill.js | 61 ++ .../scripts/hippy-webpack.dev.js | 179 ++++++ .../scripts/hippy-webpack.web-renderer.dev.js | 165 +++++ .../scripts/hippy-webpack.web-renderer.js | 166 +++++ .../webpack-ssr-config/client.android.js | 3 + .../client.android.vendor.js | 108 ++++ .../scripts/webpack-ssr-config/client.base.js | 181 ++++++ .../scripts/webpack-ssr-config/client.dev.js | 195 ++++++ .../webpack-ssr-config/client.entry.js | 97 +++ .../scripts/webpack-ssr-config/client.ios.js | 3 + .../webpack-ssr-config/client.ios.vendor.js | 108 ++++ .../scripts/webpack-ssr-config/server.dev.js | 186 ++++++ .../webpack-ssr-config/server.entry.js | 177 ++++++ .../scripts/webpack.ssr.build.js | 109 ++++ .../scripts/webpack.ssr.dev.js | 39 ++ .../hippy-vue-next-ssr-demo/server.ts | 83 +++ .../hippy-vue-next-ssr-demo/src/app.vue | 223 +++++++ .../src/assets/defaultSource.jpg | Bin 0 -> 42281 bytes .../src/assets/hippyLogoWhite.png | Bin 0 -> 24639 bytes .../src/assets/logo.png | Bin 0 -> 6849 bytes .../hippy-vue-next-ssr-demo/src/back-icon.png | Bin 0 -> 2166 bytes .../src/components/demo/demo-button.vue | 130 ++++ .../src/components/demo/demo-div.vue | 324 ++++++++++ .../components/demo/demo-dynamicimport.vue | 101 +++ .../src/components/demo/demo-iframe.vue | 126 ++++ .../src/components/demo/demo-img.vue | 165 +++++ .../src/components/demo/demo-input.vue | 268 ++++++++ .../src/components/demo/demo-list.vue | 322 ++++++++++ .../src/components/demo/demo-p.vue | 554 +++++++++++++++++ .../src/components/demo/demo-ripple-div.vue | 99 +++ .../components/demo/demo-set-native-props.vue | 123 ++++ .../src/components/demo/demo-shadow.vue | 205 ++++++ .../src/components/demo/demo-textarea.vue | 129 ++++ .../src/components/demo/demo-turbo.vue | 130 ++++ .../src/components/demo/demo-websocket.vue | 202 ++++++ .../src/components/demo/demoTurbo.ts | 29 + .../dynamicImport/async-component-http.vue | 36 ++ .../dynamicImport/async-component-local.vue | 33 + .../src/components/demo/index.ts | 65 ++ .../src/components/list-items/index.ts | 5 + .../src/components/list-items/mock.ts | 43 ++ .../src/components/list-items/style1.vue | 38 ++ .../src/components/list-items/style2.vue | 38 ++ .../src/components/list-items/style5.vue | 36 ++ .../native-demo/animations/color-change.vue | 104 ++++ .../native-demo/animations/cubic-bezier.vue | 100 +++ .../native-demo/animations/down-vote-face.png | Bin 0 -> 341 bytes .../native-demo/animations/loop.vue | 135 ++++ .../native-demo/animations/up-vote-eye.png | Bin 0 -> 333 bytes .../native-demo/animations/up-vote-mouth.png | Bin 0 -> 598 bytes .../native-demo/animations/vote-down.vue | 197 ++++++ .../native-demo/animations/vote-up.vue | 196 ++++++ .../components/native-demo/demo-animation.vue | 196 ++++++ .../components/native-demo/demo-dialog.vue | 223 +++++++ .../native-demo/demo-nested-scroll.vue | 155 +++++ .../native-demo/demo-pull-header-footer.vue | 416 +++++++++++++ .../components/native-demo/demo-swiper.vue | 181 ++++++ .../native-demo/demo-vue-native.vue | 588 ++++++++++++++++++ .../components/native-demo/demo-waterfall.vue | 302 +++++++++ .../src/components/native-demo/index.ts | 45 ++ .../hippy-vue-next-ssr-demo/src/env.ts | 19 + .../hippy-vue-next-ssr-demo/src/extend.ts | 28 + .../src/main-native.ts | 114 ++++ .../src/main-server.ts | 56 ++ .../hippy-vue-next-ssr-demo/src/main-web.ts | 22 + .../hippy-vue-next-ssr-demo/src/main.ts | 149 +++++ .../src/pages/menu.vue | 141 +++++ .../src/pages/remote-debug.vue | 162 +++++ .../hippy-vue-next-ssr-demo/src/routes.ts | 38 ++ .../src/ssr-node-ops.ts | 533 ++++++++++++++++ .../hippy-vue-next-ssr-demo/src/store.ts | 24 + .../hippy-vue-next-ssr-demo/src/util.ts | 60 ++ .../src/webpack-plugin.ts | 30 + .../hippy-vue-next-ssr-demo/tsconfig.json | 35 ++ driver/js/package.json | 5 +- .../hippy-vue-next-compiler-ssr/README.md | 6 + .../__test__/component.test.ts | 132 ++++ .../__test__/element.test.ts | 245 ++++++++ .../__test__/native-component.test.ts | 26 + .../__test__/setup.ts | 19 + .../__test__/slot-out.test.ts | 56 ++ .../__test__/utils.ts | 38 ++ .../__test__/vue-built-in.test.ts | 58 ++ .../api-extractor.json | 38 ++ .../package-lock.json | 115 ++++ .../hippy-vue-next-compiler-ssr/package.json | 49 ++ .../hippy-vue-next-compiler-ssr/src/errors.ts | 54 ++ .../hippy-vue-next-compiler-ssr/src/index.ts | 122 ++++ .../src/runtimeHelpers.ts | 70 +++ .../src/ssrCodegenTransform.ts | 262 ++++++++ .../src/transforms/ssrInjectCssVars.ts | 91 +++ .../transforms/ssrInjectFallthroughAttrs.ts | 111 ++++ .../src/transforms/ssrTransformComponent.ts | 400 ++++++++++++ .../src/transforms/ssrTransformElement.ts | 417 +++++++++++++ .../src/transforms/ssrTransformSlotOutlet.ts | 113 ++++ .../src/transforms/ssrTransformSuspense.ts | 102 +++ .../src/transforms/ssrTransformTeleport.ts | 93 +++ .../transforms/ssrTransformTransitionGroup.ts | 128 ++++ .../src/transforms/ssrVFor.ts | 70 +++ .../src/transforms/ssrVIf.ts | 102 +++ .../src/transforms/ssrVModel.ts | 184 ++++++ .../src/transforms/ssrVShow.ts | 54 ++ .../hippy-vue-next-server-renderer/README.md | 6 + .../__test__/native.test.ts | 102 +++ .../__test__/render-attr.test.ts | 51 ++ .../__test__/render-vnode.test.ts | 528 ++++++++++++++++ .../__test__/renderer.test.ts | 148 +++++ .../__test__/setup.ts | 19 + .../__test__/util.test.ts | 33 + .../api-extractor.json | 38 ++ .../package-lock.json | 435 +++++++++++++ .../package.json | 54 ++ .../src/index.ts | 117 ++++ .../src/native.ts | 103 +++ .../src/render-attrs.ts | 102 +++ .../src/render-component.ts | 48 ++ .../src/render-vnode.ts | 502 +++++++++++++++ .../src/renderer.ts | 430 +++++++++++++ .../src/util.ts | 80 +++ .../__test__/setup.ts | 80 +++ .../__test__/style-match/css-append.test.ts | 128 ++++ .../__test__/style-match}/index.test.ts | 119 +++- .../__test__/style-match}/parser.test.ts | 12 +- .../style-parser/color-parser.test.ts | 68 ++ .../__test__/style-parser/css-parser.test.ts | 118 ++++ .../hippy-vue-next-style-parser/package.json | 25 +- .../hippy-vue-next-style-parser/src/index.ts | 6 + .../src/style-match/css-append.ts | 385 ++++++++++++ .../src/style-match/css-map.ts | 247 ++++++++ .../src/style-match}/css-selectors-match.ts | 40 +- .../src/style-match}/css-selectors.ts | 119 ++-- .../src/style-match/index.ts | 71 +++ .../src/style-match}/parser.ts | 5 +- .../__test__/built-in-component.test.ts | 8 +- .../__test__/native-component/index.test.ts | 45 ++ .../hippy-vue-next/__test__/node-ops.test.ts | 7 +- .../__test__/patch-prop.test.ts | 7 +- .../__test__/runtime/component/index.test.ts | 7 +- .../runtime/document/hippy-document.test.ts | 7 +- .../before-render-to-native-hook.test.ts | 3 + .../element/hippy-comment-element.test.ts | 3 + .../runtime/element/hippy-element.test.ts | 76 ++- .../element/hippy-input-element.test.ts | 19 +- .../element/hippy-list-element.test.ts | 3 + .../__test__/runtime/event/event-bus.test.ts | 7 +- .../event/hippy-event-dispatcher.test.ts | 9 +- .../runtime/event/hippy-event-target.test.ts | 13 +- .../runtime/event/hippy-event.test.ts | 7 +- .../__test__/runtime/native/index.test.ts | 7 +- .../__test__/runtime/node/hipyy-node.test.ts | 34 +- .../__test__/runtime/render/index.test.ts | 8 +- .../__test__/runtime/text/hippy-text.test.ts | 4 + .../__test__/util/event.test.ts | 6 +- .../hippy-vue-next/__test__/util/i18n.test.ts | 7 +- .../__test__/util/index.test.ts | 13 +- .../util/{node-cache.test.ts => node.test.ts} | 6 +- .../hippy-vue-next/__test__/util/rem.test.ts | 7 +- .../__test__/util/screen.test.ts | 7 +- .../js/packages/hippy-vue-next/package.json | 7 +- .../hippy-vue-next/src/config/index.ts | 6 + .../packages/hippy-vue-next/src/hydration.ts | 80 +++ .../js/packages/hippy-vue-next/src/index.ts | 121 ++-- .../src/native-component/animation.ts | 8 + .../src/native-component/index.ts | 27 + .../src/native-component/swiper.ts | 11 +- .../runtime/element/hippy-comment-element.ts | 9 +- .../src/runtime/element/hippy-element.ts | 126 +++- .../runtime/element/hippy-input-element.ts | 16 - .../src/runtime/native/index.ts | 36 +- .../src/runtime/node/hippy-node.ts | 47 +- .../src/runtime/style/css-map.ts | 71 --- .../hippy-vue-next/src/runtime/style/index.ts | 136 ---- .../src/runtime/text/hippy-text.ts | 8 +- .../src/runtime/websocket/websocket.ts | 2 +- .../hippy-vue-next/src/types/index.ts | 32 + .../packages/hippy-vue-next/src/util/index.ts | 25 +- driver/js/scripts/vue-next-configs.js | 136 ++-- driver/js/tsconfig.json | 2 + 187 files changed, 17828 insertions(+), 583 deletions(-) create mode 100644 docs/assets/img/hippy-vue-next-ssr-arch-cn.png create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/.gitignore create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/.npmrc create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/README.md create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/app.d.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/package.json create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/scripts/env-polyfill.js create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/scripts/hippy-webpack.dev.js create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/scripts/hippy-webpack.web-renderer.dev.js create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/scripts/hippy-webpack.web-renderer.js create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.android.js create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.android.vendor.js create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.base.js create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.dev.js create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.entry.js create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.ios.js create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.ios.vendor.js create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/server.dev.js create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/server.entry.js create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack.ssr.build.js create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack.ssr.dev.js create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/server.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/app.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/assets/defaultSource.jpg create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/assets/hippyLogoWhite.png create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/assets/logo.png create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/back-icon.png create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-button.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-div.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-dynamicimport.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-iframe.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-img.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-input.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-list.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-p.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-ripple-div.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-set-native-props.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-shadow.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-textarea.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-turbo.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-websocket.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demoTurbo.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/dynamicImport/async-component-http.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/dynamicImport/async-component-local.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/index.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/list-items/index.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/list-items/mock.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/list-items/style1.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/list-items/style2.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/list-items/style5.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/native-demo/animations/color-change.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/native-demo/animations/cubic-bezier.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/native-demo/animations/down-vote-face.png create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/native-demo/animations/loop.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/native-demo/animations/up-vote-eye.png create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/native-demo/animations/up-vote-mouth.png create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/native-demo/animations/vote-down.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/native-demo/animations/vote-up.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/native-demo/demo-animation.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/native-demo/demo-dialog.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/native-demo/demo-nested-scroll.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/native-demo/demo-pull-header-footer.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/native-demo/demo-swiper.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/native-demo/demo-vue-native.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/native-demo/demo-waterfall.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/components/native-demo/index.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/env.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/extend.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/main-native.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/main-server.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/main-web.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/main.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/pages/menu.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/pages/remote-debug.vue create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/routes.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/ssr-node-ops.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/store.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/util.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/src/webpack-plugin.ts create mode 100644 driver/js/examples/hippy-vue-next-ssr-demo/tsconfig.json create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/README.md create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/__test__/component.test.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/__test__/element.test.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/__test__/native-component.test.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/__test__/setup.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/__test__/slot-out.test.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/__test__/utils.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/__test__/vue-built-in.test.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/api-extractor.json create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/package-lock.json create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/package.json create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/src/errors.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/src/index.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/src/runtimeHelpers.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/src/ssrCodegenTransform.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/src/transforms/ssrInjectCssVars.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/src/transforms/ssrInjectFallthroughAttrs.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/src/transforms/ssrTransformComponent.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/src/transforms/ssrTransformElement.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/src/transforms/ssrTransformSlotOutlet.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/src/transforms/ssrTransformSuspense.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/src/transforms/ssrTransformTeleport.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/src/transforms/ssrTransformTransitionGroup.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/src/transforms/ssrVFor.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/src/transforms/ssrVIf.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/src/transforms/ssrVModel.ts create mode 100644 driver/js/packages/hippy-vue-next-compiler-ssr/src/transforms/ssrVShow.ts create mode 100644 driver/js/packages/hippy-vue-next-server-renderer/README.md create mode 100644 driver/js/packages/hippy-vue-next-server-renderer/__test__/native.test.ts create mode 100644 driver/js/packages/hippy-vue-next-server-renderer/__test__/render-attr.test.ts create mode 100644 driver/js/packages/hippy-vue-next-server-renderer/__test__/render-vnode.test.ts create mode 100644 driver/js/packages/hippy-vue-next-server-renderer/__test__/renderer.test.ts create mode 100644 driver/js/packages/hippy-vue-next-server-renderer/__test__/setup.ts create mode 100644 driver/js/packages/hippy-vue-next-server-renderer/__test__/util.test.ts create mode 100644 driver/js/packages/hippy-vue-next-server-renderer/api-extractor.json create mode 100644 driver/js/packages/hippy-vue-next-server-renderer/package-lock.json create mode 100644 driver/js/packages/hippy-vue-next-server-renderer/package.json create mode 100644 driver/js/packages/hippy-vue-next-server-renderer/src/index.ts create mode 100644 driver/js/packages/hippy-vue-next-server-renderer/src/native.ts create mode 100644 driver/js/packages/hippy-vue-next-server-renderer/src/render-attrs.ts create mode 100644 driver/js/packages/hippy-vue-next-server-renderer/src/render-component.ts create mode 100644 driver/js/packages/hippy-vue-next-server-renderer/src/render-vnode.ts create mode 100644 driver/js/packages/hippy-vue-next-server-renderer/src/renderer.ts create mode 100644 driver/js/packages/hippy-vue-next-server-renderer/src/util.ts create mode 100644 driver/js/packages/hippy-vue-next-style-parser/__test__/setup.ts create mode 100644 driver/js/packages/hippy-vue-next-style-parser/__test__/style-match/css-append.test.ts rename driver/js/packages/{hippy-vue-next/__test__/runtime/style => hippy-vue-next-style-parser/__test__/style-match}/index.test.ts (80%) rename driver/js/packages/{hippy-vue-next/__test__/runtime/style => hippy-vue-next-style-parser/__test__/style-match}/parser.test.ts (92%) create mode 100644 driver/js/packages/hippy-vue-next-style-parser/__test__/style-parser/color-parser.test.ts create mode 100644 driver/js/packages/hippy-vue-next-style-parser/__test__/style-parser/css-parser.test.ts create mode 100644 driver/js/packages/hippy-vue-next-style-parser/src/style-match/css-append.ts create mode 100644 driver/js/packages/hippy-vue-next-style-parser/src/style-match/css-map.ts rename driver/js/packages/{hippy-vue-next/src/runtime/style => hippy-vue-next-style-parser/src/style-match}/css-selectors-match.ts (84%) rename driver/js/packages/{hippy-vue-next/src/runtime/style => hippy-vue-next-style-parser/src/style-match}/css-selectors.ts (82%) create mode 100644 driver/js/packages/hippy-vue-next-style-parser/src/style-match/index.ts rename driver/js/packages/{hippy-vue-next/src/runtime/style => hippy-vue-next-style-parser/src/style-match}/parser.ts (98%) create mode 100644 driver/js/packages/hippy-vue-next/__test__/native-component/index.test.ts rename driver/js/packages/hippy-vue-next/__test__/util/{node-cache.test.ts => node.test.ts} (96%) create mode 100644 driver/js/packages/hippy-vue-next/src/hydration.ts delete mode 100644 driver/js/packages/hippy-vue-next/src/runtime/style/css-map.ts delete mode 100644 driver/js/packages/hippy-vue-next/src/runtime/style/index.ts diff --git a/docs/api/hippy-vue/vue3.md b/docs/api/hippy-vue/vue3.md index cc199bb8215..f16edd989bd 100644 --- a/docs/api/hippy-vue/vue3.md +++ b/docs/api/hippy-vue/vue3.md @@ -154,6 +154,106 @@ const router: Router = createRouter({ }); ``` +# 服务端渲染 + +@hippy/vue-next 现已支持服务端渲染,具体代码可以查看[示例项目](https://github.com/Tencent/Hippy/tree/main/examples/hippy-vue-next-ssr-demo)中的 SSR +部分,关于 Vue SSR 的实现及原理,可以参考[官方文档](https://cn.vuejs.org/guide/scaling-up/ssr.html)。 + +## 如何使用SSR + +请参考[示例项目](https://github.com/Tencent/Hippy/tree/main/examples/hippy-vue-next-ssr-demo)说明文档中的 How To Use SSR + +## 实现原理 + +### SSR 架构图 + +hippy-vue-next SSR 架构图 + +### 详细说明 + +@hippy/vue-next SSR 的实现涉及到了编译时,客户端运行时,以及服务端运行时三个运行环境。在 vue-next ssr的基础上,我们开发了 @hippy/vue-next-server-renderer +用于服务端运行时节点的渲染,开发了 @hippy/vue-next-compiler-ssr 用于编译时 vue 模版文件的编译。以及 @hippy/vue-next-style-parser 用于服务端渲染得到的 +Native Node List 的样式插入。下面我们通过一个模版的编译和运行时过程来说明 @hippy/vue-next SSR 做了哪些事情 + +我们有形如`
`的一段模版 + +- 编译时 + + 模版经过 @hippy/vue-next-compiler-ssr 的处理,得到了形如 + + ```javascript + _push(`{"id":${ssrGetUniqueId()},"index":0,"name":"View","tagName":"div","props":{"class":"test-class","id": "test",},"children":[]},`) + ``` + + 的 render function + +- 服务端运行时 + + 在服务端运行时,编译时得到的 render function 执行后得到了对应节点的 json object。注意 render function 中的 + ssrGetUniqueId 方法,是在 @hippy/vue-next-server-renderer 中提供的,在这里 server-renderer 还会对 + 节点的属性值等进行处理,最后得到 Native Node 的 json object + + ```javascript + { "id":1,"index":0,"name":"View","tagName":"div","props":{"class":"test-class","id": "test",},"children":[] } + ``` + + > 对于手写的非 sfc 模版的渲染函数,在 compiler 中无法处理,也是在 server-renderer 中执行的 + +- 客户端运行时 + + 在客户端运行时,通过 @hippy/vue-next-style-parser,给服务端返回的节点插入样式,并直接调用 hippy native 提供的 + native API,将返回的 Native Node 对象作为参数传入,并完成节点的渲染上屏。 完成节点上屏之后,再通过系统提供的 + global.dynamicLoad 异步加载客户端异步版 jsBundle,完成客户端 Hydrate 并执行后续流程。 + +## 初始化差异 + +SSR 版本的 Demo 初始化与异步版的初始化有一些差异部分,这里对其中的差异部分做一个详细的说明 + +- src/main-native.ts 变更 + +1. 使用 createSSRApp 替换之前的 createApp,createApp 仅支持 CSR 渲染,而 createSSRApp 同时支持 CSR 和 SSR +2. 在初始化时候新增了 ssrNodeList 参数,作为 Hydrate 的初始化节点列表。这里我们服务端返回的初始化节点列表保存在了 global.hippySSRNodes 中,并将其作为参数在createSSRApp时传入 +3. 将 app.mount 放到 router.isReady 完成后调用,因为如果不等待路由完成,会与服务端渲染的节点有所不同,导致 Hydrate 时报错 + +```javascript +- import { createApp } from '@hippy/vue-next'; ++ import { createSSRApp } from '@hippy/vue-next'; +- const app: HippyApp = createApp(App, { ++ const app: HippyApp = createSSRApp(App, { + // ssr rendered node list, use for hydration ++ ssrNodeList: global.hippySSRNodes, +}); ++ router.isReady().then(() => { ++ // mount app ++ app.mount('#root'); ++ }); +``` + +- src/main-server.ts 新增 + +main-server.ts 是在服务端运行的业务 jsBundle,因此不需要做代码分割。整体构建为一个 bundle 即可。其核心功能就是在服务端完成首屏渲染逻辑,并将得到的首屏 Hippy 节点进行处理,插入节点属性和 store(如果存在)后返回, +以及返回当前已生成节点的最大 uniqueId 供客户端后续使用。 + +>注意,服务端代码是同步执行的,如果有数据请求走了异步方式,可能会出现还没有拿到数据,请求就已经返回了的情况。对于这个问题,Vue SSR 提供了专用 API 来处理这个问题: +>[onServerPrefetch](https://cn.vuejs.org/api/composition-api-lifecycle.html#onserverprefetch)。 +>在 [Demo](https://github.com/Tencent/Hippy/blob/main/examples/hippy-vue-next-ssr-demo/src/app.vue) 的 app.vue 中也有 onServerPrefetch 的使用示例 + +- server.ts 新增 + +server.ts 是服务端执行的入口文件,其作用是提供 Web Server,接收客户端的 SSR CGI 请求,并将结果作为响应数据返回给客户端,包括了渲染节点列表,store,以及全局的样式列表。 + +- src/main-client.ts 新增 + +main-client.ts 是客户端执行的入口文件,与之前纯客户端渲染不同,SSR的客户端入口文件仅包含了获取首屏节点请求、插入首屏节点样式、以及将节点插入终端完成渲染的相关逻辑。 + +- src/ssr-node-ops.ts 新增 + +ssr-node-ops.ts 封装了不依赖 @hippy/vue-next 运行时的 SSR 节点的插入,更新,删除等操作逻辑 + +- src/webpack-plugin.ts 新增 + +webpack-plugin.ts 封装了 SSR 渲染所需 Hippy App 的初始化逻辑 + # 其他差异说明 目前 `@hippy/vue-next` 与 `@hippy/vue` 功能上基本对齐,不过在 API 方面与 @hippy/vue 有一些区别,以及还有一些问题还没有解决,这里做些说明: @@ -266,7 +366,7 @@ const router: Router = createRouter({ } ``` - 更多信息可以参考 demo 里的 [extend.ts](https://github.com/Tencent/Hippy/blob/master/examples/hippy-vue-next-demo/src/extend.ts). + 更多信息可以参考 demo 里的 [extend.ts](https://github.com/Tencent/Hippy/blob/main/examples/hippy-vue-next-demo/src/extend.ts). - whitespace 处理 @@ -305,6 +405,10 @@ const router: Router = createRouter({ `` 组件的第一个子元素不能设置 `{ position: absolute }` 样式,如果想将 `` 内容铺满全屏,可以给第一个子元素设置 `{ flex: 1 }` 样式或者显式设置 width 和 height 数值。这与 Hippy3.0 的逻辑保持一致。 +- 书写 SSR 友好的代码 + + 因 SSR 的渲染方式和生命周期等与客户端渲染方式有一些差异,因此需要在代码编写过程中注意,这里可以参考[Vue官方的SSR指引](https://cn.vuejs.org/guide/scaling-up/ssr.html#writing-ssr-friendly-code) + # 示例 -更多使用请参考 [示例项目](https://github.com/Tencent/Hippy/tree/master/examples/hippy-vue-next-demo). +更多使用请参考 [示例项目](https://github.com/Tencent/Hippy/tree/main/examples/hippy-vue-next-demo). diff --git a/docs/assets/img/hippy-vue-next-ssr-arch-cn.png b/docs/assets/img/hippy-vue-next-ssr-arch-cn.png new file mode 100644 index 0000000000000000000000000000000000000000..df95922560ea28ca27da9e9d024a30964e48eed4 GIT binary patch literal 125756 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 Because our server listening port 8080, so if you are using android device, you should run `adb reverse tcp:8080 tcp:8080` +> to forward mobile device port to pc port, iOS simulator doesn't need this step. + +ensure you were at `examples/hippy-vue-next-ssr-demo`. + +#### Development + +1. run `npm run ssr:dev-build` to build client entry & client bundle, then running hippy debug server +2. run `npm run ssr:dev-server` to build server bundle and start SSR web server to listen port **8080**. +3. debug your app with [reference](https://hippyjs.org/en-us/#/guide/debug) +> You can change server listen port 8080 in `server.ts` by your self, but you also need change request port 8080 in +> `src/main-client.ts` and modify the adb reverse port, ensure port is same at three place + +#### Production + +1. run `npm run ssr:prod-build` to build client entry, server bundle, client bundle +2. run `npm run ssr:prod-server` to start SSR web server to listen port **8080**. +3. test your app +> In production, you can use process manage tool to manage your NodeJs process, like pm2. +> +> And you should deploy you web server at real server with real domain, then you can request +> SSR cgi like https://xxx.com/getSsrFirstScreenData +> + +#### Tips +> Usage of non SSR is [here](https://hippyjs.org/en-us/#/guide/integration) diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/app.d.ts b/driver/js/examples/hippy-vue-next-ssr-demo/app.d.ts new file mode 100644 index 00000000000..d614236bf60 --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/app.d.ts @@ -0,0 +1,10 @@ +declare module '*.jpg'; +declare module '*.png'; +declare module '*.vue' { + import { defineComponent } from 'vue'; + const Component: ReturnType; + export default Component; +} + +type NeedToTyped = any; + diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/package.json b/driver/js/examples/hippy-vue-next-ssr-demo/package.json new file mode 100644 index 00000000000..367d4bffe81 --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/package.json @@ -0,0 +1,83 @@ +{ + "name": "hippy-vue-next-demo", + "version": "3.0.0", + "description": "A SSR Demo Example For Hippy-Vue-Next Library To Show.", + "private": true, + "webMain": "./src/main-web.ts", + "nativeMain": "./src/main-native.ts", + "serverMain": "./src/main-server.ts", + "serverEntry": "./server.ts", + "ssrMain": "./src/main.ts", + "repository": "https://github.com/Tencent/Hippy/tree/master/examples/hippy-vue-next-demo", + "license": "Apache-2.0", + "author": "OpenHippy Team", + "scripts": { + "hippy:dev": "node ./scripts/env-polyfill.js hippy-dev -c ./scripts/hippy-webpack.dev.js", + "web:dev": "npm run hippy:dev & node ./scripts/env-polyfill.js webpack serve --config ./scripts/hippy-webpack.web-renderer.dev.js", + "web:build": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.web-renderer.js", + "ssr:dev-client": "node ./scripts/env-polyfill.js hippy-dev -c ./scripts/webpack-ssr-config/client.dev.js", + "ssr:dev-server": "node ./scripts/env-polyfill.js && node ./scripts/webpack.ssr.dev.js", + "ssr:prod-build": "node ./scripts/webpack.ssr.build.js", + "ssr:prod-server": "node ./dist/server/index.js --mode production" + }, + "dependencies": { + "@hippy/vue-router-next-history": "latest", + "@hippy/web-renderer": "latest", + "@hippy/vue-next": "latest", + "@hippy/vue-next-server-renderer": "file:../../packages/hippy-vue-next-server-renderer", + "@hippy/vue-next-style-parser": "file:../../packages/hippy-vue-next-style-parser", + "@vue/runtime-core": "^3.2.46", + "@vue/shared": "^3.2.46", + "core-js": "^3.20.2", + "vue": "^3.2.46", + "vue-router": "^4.0.12", + "express": "^4.18.2", + "pinia": "2.0.30" + }, + "devDependencies": { + "@babel/core": "^7.12.0", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-decorators": "^7.10.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-proposal-optional-chaining": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-runtime": "^7.11.0", + "@babel/polyfill": "^7.12.0", + "@babel/preset-env": "^7.12.0", + "@babel/runtime": "^7.16.0", + "@hippy/debug-server-next": "latest", + "@hippy/hippy-dynamic-import-plugin": "^2.0.0", + "@hippy/hippy-hmr-plugin": "^0.1.0", + "@hippy/rejection-tracking-polyfill": "^1.0.0", + "@hippy/vue-css-loader": "^2.0.1", + "@vitejs/plugin-vue": "^1.9.4", + "@hippy/vue-next-compiler-ssr": "file:../../packages/hippy-vue-next-compiler-ssr", + "@types/shelljs": "^0.8.5", + "@vue/cli-service": "^4.5.19", + "@vue/compiler-sfc": "^3.2.46", + "babel-loader": "^8.1.0", + "case-sensitive-paths-webpack-plugin": "^2.2.0", + "chokidar": "^3.5.3", + "clean-webpack-plugin": "^4.0.0", + "webpack-manifest-plugin": "^4.1.1", + "cross-env": "^7.0.3", + "cross-env-os": "^7.1.1", + "esbuild": "^0.13.14", + "esbuild-loader": "^2.18.0", + "file-loader": "^4.3.0", + "less": "^4.1.2", + "less-loader": "^7.1.0", + "shelljs": "^0.8.5", + "terser": "^4.8.0", + "ts-loader": "^8.4.0", + "@types/express": "^4.17.17", + "url-loader": "^4.0.0", + "vue-loader": "^17.0.0", + "webpack": "^4.46.0", + "webpack-cli": "^4.7.2" + }, + "engines": { + "node": ">=15" + } +} diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/scripts/env-polyfill.js b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/env-polyfill.js new file mode 100644 index 00000000000..11a413eef85 --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/env-polyfill.js @@ -0,0 +1,61 @@ +const { exec } = require('shelljs'); + +const runScript = (scriptStr) => { + console.log(`Full command execute: "${scriptStr}"`); + const result = exec(scriptStr, { stdio: 'inherit' }); + if (result.code !== 0) { + console.error(`❌ Execute cmd - "${scriptStr}" error: ${result.stderr}`); + process.exit(1); + } +}; + +const toNum = (originalNum) => { + const num = `${originalNum}`; + const versionList = num.split('.'); + const currentSplitLength = versionList.length; + if (currentSplitLength !== 4) { + let index = currentSplitLength; + while (index < 4) { + versionList.push('0'); + index += 1; + } + } + const r = ['0000', '000', '00', '0', '']; + for (let i = 0; i < versionList.length; i += 1) { + let len = versionList[i].length; + if (len > 4) { + len = 4; + versionList[i] = versionList[i].slice(0, 4); + } + versionList[i] = r[len] + versionList[i]; + } + return versionList.join(''); +}; + +const versionCompare = (targetVer, currentVer) => { + if (!targetVer || !currentVer) return 1; + const numA = toNum(currentVer); + const numB = toNum(targetVer); + if (numA === numB) { + return 0; + } + return numA < numB ? -1 : 1; +}; + +const LEGACY_OPENSSL_VERSION = '3.0.0'; +const scriptString = process.argv.slice(2).join(' '); +let envPrefixStr = ''; + +console.log(`Start to execute cmd: "${scriptString}"`); +console.log(`Current openssl version: ${process.versions.openssl}`); + +const result = /^(\d+\.\d+\.\d+).*$/.exec(process.versions.openssl.toString().trim()); +if (result && result[1]) { + const currentVersion = result[1]; + const compareResult = versionCompare(LEGACY_OPENSSL_VERSION, currentVersion); + if (compareResult >= 0) { + envPrefixStr += 'NODE_OPTIONS=--openssl-legacy-provider'; + } +} + +runScript(`${envPrefixStr} ${scriptString}`); // start to execute cmd diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/scripts/hippy-webpack.dev.js b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/hippy-webpack.dev.js new file mode 100644 index 00000000000..1d5a65f07a7 --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/hippy-webpack.dev.js @@ -0,0 +1,179 @@ +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); +const HippyDynamicImportPlugin = require('@hippy/hippy-dynamic-import-plugin'); +const { CleanWebpackPlugin } = require('clean-webpack-plugin'); +const { VueLoaderPlugin } = require('vue-loader'); + +const pkg = require('../package.json'); +let cssLoader = '@hippy/vue-css-loader'; +const hippyVueCssLoaderPath = path.resolve(__dirname, '../../../packages/hippy-vue-css-loader/dist/css-loader.js'); +if (fs.existsSync(hippyVueCssLoaderPath)) { + console.warn(`* Using the @hippy/vue-css-loader in ${hippyVueCssLoaderPath}`); + cssLoader = hippyVueCssLoaderPath; +} else { + console.warn('* Using the @hippy/vue-css-loader defined in package.json'); +} + + +module.exports = { + mode: 'development', + devtool: 'eval-source-map', + watch: true, + watchOptions: { + aggregateTimeout: 1500, + }, + devServer: { + // remote debug server address + remote: { + protocol: 'http', + host: '127.0.0.1', + port: 38989, + }, + // support inspect vue components, store and router, by default is disabled + vueDevtools: false, + // support debug multiple project with only one debug server, by default is set false. + multiple: false, + // by default hot and liveReload option are true, you could set only liveReload to true + // to use live reload + hot: true, + liveReload: true, + client: { + overlay: false, + }, + devMiddleware: { + writeToDisk: true, + }, + }, + entry: { + index: ['@hippy/rejection-tracking-polyfill', path.resolve(pkg.nativeMain)], + }, + output: { + filename: 'index.bundle', + // chunkFilename: '[name].[chunkhash].js', + strictModuleExceptionHandling: true, + path: path.resolve('./dist/dev/'), + globalObject: '(0, eval)("this")', + }, + plugins: [ + new VueLoaderPlugin(), + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify('development'), + HOST: JSON.stringify(process.env.DEV_HOST || '127.0.0.1'), + PORT: JSON.stringify(process.env.DEV_PORT || 38989), + }, + __VUE_OPTIONS_API__: true, + __VUE_PROD_DEVTOOLS__: false, + __PLATFORM__: null, + }), + new HippyDynamicImportPlugin(), + // LimitChunkCountPlugin can control dynamic import ability + // Using 1 will prevent any additional chunks from being added + // new webpack.optimize.LimitChunkCountPlugin({ + // maxChunks: 1, + // }), + // use SourceMapDevToolPlugin can generate sourcemap file while setting devtool to false + // new webpack.SourceMapDevToolPlugin({ + // test: /\.(js|jsbundle|css|bundle)($|\?)/i, + // filename: '[file].map', + // }), + new CleanWebpackPlugin(), + ], + module: { + rules: [ + { + test: /\.vue$/, + use: [ + { + loader: 'vue-loader', + options: { + compilerOptions: { + // disable vue3 dom patch flag,because hippy do not support innerHTML + hoistStatic: false, + // whitespace handler, default is 'condense', it can be set 'preserve' + whitespace: 'condense', + }, + }, + }, + ], + }, + { + test: /\.(le|c)ss$/, + use: [cssLoader, 'less-loader'], + }, + { + test: /\.t|js$/, + use: [ + { + loader: 'esbuild-loader', + options: { + target: 'es2015', + }, + }, + ], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [{ + loader: 'url-loader', + options: { + limit: true, + // limit: 8192, + // fallback: 'file-loader', + // name: '[name].[ext]', + // outputPath: 'assets/', + }, + }], + }, + { + test: /\.(ts)$/, + use: [ + { + loader: 'ts-loader', + options: { + transpileOnly: true, + appendTsSuffixTo: [/\.vue$/], + }, + }, + ], + exclude: /node_modules/, + }, + { + test: /\.mjs$/, + include: /node_modules/, + type: 'javascript/auto', + }, + ], + }, + resolve: { + extensions: ['.js', '.vue', '.json', '.ts'], + alias: (() => { + const aliases = { + src: path.resolve('./src'), + }; + + // If @vue/runtime-core was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueRuntimeCorePath = path.resolve(__dirname, '../../../packages/hippy-vue-next/node_modules/@vue/runtime-core'); + if (fs.existsSync(path.resolve(hippyVueRuntimeCorePath, 'index.js'))) { + console.warn(`* Using the @vue/runtime-core in ${hippyVueRuntimeCorePath} as vue alias`); + aliases['@vue/runtime-core'] = hippyVueRuntimeCorePath; + } else { + console.warn('* Using the @vue/runtime-core defined in package.json'); + } + + // If @hippy/vue-next was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueNextPath = path.resolve(__dirname, '../../../packages/hippy-vue-next/dist'); + if (fs.existsSync(path.resolve(hippyVueNextPath, 'index.js'))) { + console.warn(`* Using the @hippy/vue-next in ${hippyVueNextPath} as @hippy/vue-next alias`); + aliases['@hippy/vue-next'] = hippyVueNextPath; + } else { + console.warn('* Using the @hippy/vue-next defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/scripts/hippy-webpack.web-renderer.dev.js b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/hippy-webpack.web-renderer.dev.js new file mode 100644 index 00000000000..7fc0ec81035 --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/hippy-webpack.web-renderer.dev.js @@ -0,0 +1,165 @@ +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +// const HippyDynamicImportPlugin = require('@hippy/hippy-dynamic-import-plugin'); +const { CleanWebpackPlugin } = require('clean-webpack-plugin'); +const { VueLoaderPlugin } = require('vue-loader'); + +const pkg = require('../package.json'); +let cssLoader = '@hippy/vue-css-loader'; +const hippyVueCssLoaderPath = path.resolve(__dirname, '../../../packages/hippy-vue-css-loader/dist/css-loader.js'); +if (fs.existsSync(hippyVueCssLoaderPath)) { + console.warn(`* Using the @hippy/vue-css-loader in ${hippyVueCssLoaderPath}`); + cssLoader = hippyVueCssLoaderPath; +} else { + console.warn('* Using the @hippy/vue-css-loader defined in package.json'); +} + +const platform = 'web'; +module.exports = { + mode: 'development', + bail: true, + devServer: { + port: 3000, + hot: true, + liveReload: true, + }, + devtool: 'source-map', + entry: { + index: ['regenerator-runtime', path.resolve(pkg.webMain)], + }, + output: { + // filename: `[name].${platform}.js`, + filename: 'index.bundle.js', + path: path.resolve(`./dist/${platform}/`), + strictModuleExceptionHandling: true, + globalObject: '(0, eval)("this")', + }, + plugins: [ + new VueLoaderPlugin(), + new HtmlWebpackPlugin({ + inject: true, + scriptLoading: 'blocking', + template: path.resolve('./public/web-renderer.html'), + }), + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify('development'), + HOST: JSON.stringify(process.env.DEV_HOST || '127.0.0.1'), + PORT: JSON.stringify(process.env.DEV_PORT || 38989), + }, + __VUE_OPTIONS_API__: true, + __VUE_PROD_DEVTOOLS__: false, + __PLATFORM__: platform, + }), + // new HippyDynamicImportPlugin(), + // LimitChunkCountPlugin can control dynamic import ability + // Using 1 will prevent any additional chunks from being added + // new webpack.optimize.LimitChunkCountPlugin({ + // maxChunks: 1, + // }), + // use SourceMapDevToolPlugin can generate sourcemap file while setting devtool to false + // new webpack.SourceMapDevToolPlugin({ + // test: /\.(js|jsbundle|css|bundle)($|\?)/i, + // filename: '[file].map', + // }), + new CleanWebpackPlugin(), + ], + module: { + rules: [ + { + test: /\.vue$/, + use: [ + { + loader: 'vue-loader', + options: { + compilerOptions: { + // disable vue3 dom patch flag,because hippy do not support innerHTML + hoistStatic: false, + // whitespace handler, default is 'condense', it can be set 'preserve' + whitespace: 'condense', + }, + }, + }, + ], + }, + { + test: /\.(le|c)ss$/, + use: [cssLoader, 'less-loader'], + }, + { + test: /\.t|js$/, + use: [ + { + loader: 'esbuild-loader', + options: { + target: 'es2015', + }, + }, + ], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [{ + loader: 'url-loader', + options: { + limit: true, + // limit: 8192, + // fallback: 'file-loader', + // name: '[name].[ext]', + // outputPath: 'assets/', + }, + }], + }, + { + test: /\.(ts)$/, + use: [ + { + loader: 'ts-loader', + options: { + transpileOnly: true, + appendTsSuffixTo: [/\.vue$/], + }, + }, + ], + exclude: /node_modules/, + }, + { + test: /\.mjs$/, + include: /node_modules/, + type: 'javascript/auto', + }, + ], + }, + resolve: { + extensions: ['.js', '.vue', '.json', '.ts'], + alias: (() => { + const aliases = { + src: path.resolve('./src'), + }; + + // If @vue/runtime-core was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueRuntimeCorePath = path.resolve(__dirname, '../../../packages/hippy-vue-next/node_modules/@vue/runtime-core'); + if (fs.existsSync(path.resolve(hippyVueRuntimeCorePath, 'index.js'))) { + console.warn(`* Using the @vue/runtime-core in ${hippyVueRuntimeCorePath} as vue alias`); + aliases['@vue/runtime-core'] = hippyVueRuntimeCorePath; + } else { + console.warn('* Using the @vue/runtime-core defined in package.json'); + } + + // If @hippy/vue-next was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueNextPath = path.resolve(__dirname, '../../../packages/hippy-vue-next/dist'); + if (fs.existsSync(path.resolve(hippyVueNextPath, 'index.js'))) { + console.warn(`* Using the @hippy/vue-next in ${hippyVueNextPath} as @hippy/vue-next alias`); + aliases['@hippy/vue-next'] = hippyVueNextPath; + } else { + console.warn('* Using the @hippy/vue-next defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/scripts/hippy-webpack.web-renderer.js b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/hippy-webpack.web-renderer.js new file mode 100644 index 00000000000..4e2636dfde5 --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/hippy-webpack.web-renderer.js @@ -0,0 +1,166 @@ +const path = require('path'); +const fs = require('fs'); +const { VueLoaderPlugin } = require('vue-loader'); +const webpack = require('webpack'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +// const HippyDynamicImportPlugin = require('@hippy/hippy-dynamic-import-plugin'); +const pkg = require('../package.json'); + +let cssLoader = '@hippy/vue-css-loader'; +const hippyVueCssLoaderPath = path.resolve(__dirname, '../../../packages/hippy-vue-css-loader/dist/css-loader.js'); +if (fs.existsSync(hippyVueCssLoaderPath)) { + console.warn(`* Using the @hippy/vue-css-loader in ${hippyVueCssLoaderPath}`); + cssLoader = hippyVueCssLoaderPath; +} else { + console.warn('* Using the @hippy/vue-css-loader defined in package.json'); +} + +const platform = 'web'; +module.exports = { + mode: 'production', + bail: true, + entry: { + index: ['regenerator-runtime', path.resolve(pkg.webMain)], + }, + output: { + filename: '[name].[contenthash:8].js', + path: path.resolve(`./dist/${platform}/`), + }, + plugins: [ + new VueLoaderPlugin(), + new HtmlWebpackPlugin({ + inject: true, + scriptLoading: 'blocking', + template: path.resolve('./public/web-renderer.html'), + }), + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify('production'), + }, + __PLATFORM__: null, + }), + // new HippyDynamicImportPlugin(), + // LimitChunkCountPlugin can control dynamic import ability + // Using 1 will prevent any additional chunks from being added + // new webpack.optimize.LimitChunkCountPlugin({ + // maxChunks: 1, + // }), + // use SourceMapDevToolPlugin can generate sourcemap file + // new webpack.SourceMapDevToolPlugin({ + // test: /\.(js|jsbundle|css|bundle)($|\?)/i, + // filename: '[file].map', + // }), + ], + module: { + rules: [ + { + test: /\.vue$/, + use: [ + { + loader: 'vue-loader', + options: { + compilerOptions: { + // disable vue3 dom patch flag,because hippy do not support innerHTML + hoistStatic: false, + // whitespace handler, default is 'condense', it can be set 'preserve' + whitespace: 'condense', + }, + }, + }, + ], + }, + { + test: /\.(le|c)ss$/, + use: [cssLoader, 'less-loader'], + }, + { + test: /\.t|js$/, + use: [ + { + loader: 'babel-loader', + options: { + sourceType: 'unambiguous', + presets: [ + [ + '@babel/preset-env', + { + targets: { + chrome: 57, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ['@babel/plugin-proposal-decorators', { legacy: true }], + ['@babel/plugin-transform-runtime', { regenerator: true }], + ], + }, + }, + ], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [{ + loader: 'url-loader', + options: { + limit: true, + // TODO local path not supported on defaultSource/backgroundImage + // limit: 8192, + // fallback: 'file-loader', + // name: '[name].[ext]', + // outputPath: 'assets/', + }, + }], + }, + { + test: /\.(ts)$/, + use: [ + { + loader: 'ts-loader', + options: { + transpileOnly: true, + appendTsSuffixTo: [/\.vue$/], + }, + }, + ], + exclude: /node_modules/, + }, + { + test: /\.mjs$/, + include: /node_modules/, + type: 'javascript/auto', + }, + ], + }, + resolve: { + extensions: ['.js', '.vue', '.json', '.ts'], + alias: (() => { + const aliases = { + src: path.resolve('./src'), + }; + + // If @vue/runtime-core was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueRuntimeCorePath = path.resolve(__dirname, '../../../packages/hippy-vue-next/node_modules/@vue/runtime-core'); + if (fs.existsSync(path.resolve(hippyVueRuntimeCorePath, 'index.js'))) { + console.warn(`* Using the @vue/runtime-core in ${hippyVueRuntimeCorePath} as vue alias`); + aliases['@vue/runtime-core'] = hippyVueRuntimeCorePath; + } else { + console.warn('* Using the @vue/runtime-core defined in package.json'); + } + + // If @hippy/vue-next was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueNextPath = path.resolve(__dirname, '../../../packages/hippy-vue-next/dist'); + if (fs.existsSync(path.resolve(hippyVueNextPath, 'index.js'))) { + console.warn(`* Using the @hippy/vue-next in ${hippyVueNextPath} as @hippy/vue-next alias`); + aliases['@hippy/vue-next'] = hippyVueNextPath; + } else { + console.warn('* Using the @hippy/vue-next defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.android.js b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.android.js new file mode 100644 index 00000000000..bfd96dce07b --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.android.js @@ -0,0 +1,3 @@ +const { getWebpackSsrBaseConfig } = require('./client.base'); + +module.exports = getWebpackSsrBaseConfig('android', 'production'); diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.android.vendor.js b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.android.vendor.js new file mode 100644 index 00000000000..85e8b860784 --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.android.vendor.js @@ -0,0 +1,108 @@ +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); +const { VueLoaderPlugin } = require('vue-loader'); +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); + +const platform = 'android'; + +module.exports = { + mode: 'production', + bail: true, + entry: { + vendor: [path.resolve(__dirname, '../vendor.js')], + }, + output: { + filename: `[name].${platform}.js`, + path: path.resolve(`./dist/${platform}/`), + globalObject: '(0, eval)("this")', + library: 'hippyVueBase', + }, + plugins: [ + new webpack.NamedModulesPlugin(), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('production'), + __PLATFORM__: JSON.stringify(platform), + }), + new CaseSensitivePathsPlugin(), + new VueLoaderPlugin(), + new webpack.DllPlugin({ + context: path.resolve(__dirname, '../..'), + path: path.resolve(__dirname, `../../dist/${platform}/[name]-manifest.json`), + name: 'hippyVueBase', + }), + ], + module: { + rules: [ + { + test: /\.vue$/, + use: [ + { + loader: 'vue-loader', + options: { + compilerOptions: { + // disable vue3 dom patch flag,because hippy do not support innerHTML + hoistStatic: false, + // whitespace handler, default is 'condense', it can be set 'preserve' + whitespace: 'condense', + }, + }, + }, + ], + }, + { + test: /\.(js)$/, + use: [ + { + loader: 'babel-loader', + options: { + presets: [ + [ + '@babel/preset-env', + { + targets: { + chrome: 57, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ], + }, + }, + ], + }, + ], + }, + resolve: { + extensions: ['.js', '.vue', '.json', '.ts'], + alias: (() => { + const aliases = { + src: path.resolve('./src'), + }; + + // If @vue/runtime-core was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueRuntimeCorePath = path.resolve(__dirname, '../../../../packages/hippy-vue-next/node_modules/@vue/runtime-core'); + if (fs.existsSync(path.resolve(hippyVueRuntimeCorePath, 'index.js'))) { + console.warn(`* Using the @vue/runtime-core in ${hippyVueRuntimeCorePath} as vue alias`); + aliases['@vue/runtime-core'] = hippyVueRuntimeCorePath; + } else { + console.warn('* Using the @vue/runtime-core defined in package.json'); + } + + // If @hippy/vue-next was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueNextPath = path.resolve(__dirname, '../../../../packages/hippy-vue-next/dist'); + if (fs.existsSync(path.resolve(hippyVueNextPath, 'index.js'))) { + console.warn(`* Using the @hippy/vue-next in ${hippyVueNextPath} as @hippy/vue-next alias`); + aliases['@hippy/vue-next'] = hippyVueNextPath; + } else { + console.warn('* Using the @hippy/vue-next defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.base.js b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.base.js new file mode 100644 index 00000000000..36b6537e19d --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.base.js @@ -0,0 +1,181 @@ +const path = require('path'); +const fs = require('fs'); +const HippyDynamicImportPlugin = require('@hippy/hippy-dynamic-import-plugin'); +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); +const { VueLoaderPlugin } = require('vue-loader'); +const { WebpackManifestPlugin } = require('webpack-manifest-plugin'); +const webpack = require('webpack'); + +const pkg = require('../../package.json'); + +let cssLoader = '@hippy/vue-css-loader'; +const hippyVueCssLoaderPath = path.resolve(__dirname, '../../../../packages/hippy-vue-css-loader/dist/css-loader.js'); +if (fs.existsSync(hippyVueCssLoaderPath)) { + console.warn(`* Using the @hippy/vue-css-loader in ${hippyVueCssLoaderPath}`); + cssLoader = hippyVueCssLoaderPath; +} else { + console.warn('* Using the @hippy/vue-css-loader defined in package.json'); +} + +/** + * get webpack ssr base config + * + * @param platform build platform + * @param env build environment + */ +exports.getWebpackSsrBaseConfig = function (platform, env) { + // do not generate vendor at development + const manifest = require(`../../dist/${platform}/vendor-manifest.json`); + return { + mode: env, + bail: true, + devtool: false, + entry: { + home: [path.resolve(pkg.nativeMain)], + }, + output: { + filename: `[name].${platform}.js`, + path: path.resolve(`./dist/${platform}/`), + globalObject: '(0, eval)("this")', + // CDN path can be configured to load children bundles from remote server + // publicPath: 'https://xxx/hippy/hippyVueNextDemo/', + }, + plugins: [ + new webpack.NamedModulesPlugin(), + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify(env), + }, + __VUE_OPTIONS_API__: true, + __VUE_PROD_DEVTOOLS__: false, + __PLATFORM__: JSON.stringify(platform), + }), + new CaseSensitivePathsPlugin(), + new VueLoaderPlugin(), + new HippyDynamicImportPlugin(), + new WebpackManifestPlugin({ + fileName: `manifest.${platform}.json`, + }), + new webpack.DllReferencePlugin({ + context: path.resolve(__dirname, '../..'), + manifest, + }), + ], + module: { + rules: [ + { + test: /\.vue$/, + use: [ + { + loader: 'vue-loader', + options: { + compilerOptions: { + // disable vue3 dom patch flag,because hippy do not support innerHTML + hoistStatic: false, + // whitespace handler, default is 'condense', it can be set 'preserve' + whitespace: 'condense', + // do not generate html comment node + comments: false, + }, + }, + }, + ], + }, + { + test: /\.(le|c)ss$/, + use: [cssLoader, 'less-loader'], + }, + { + test: /\.t|js$/, + use: [ + { + loader: 'babel-loader', + options: { + sourceType: 'unambiguous', + presets: [ + [ + '@babel/preset-env', + { + targets: platform === 'android' ? { + chrome: 57, + } : { + ios: 9, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ['@babel/plugin-proposal-decorators', { legacy: true }], + ['@babel/plugin-transform-runtime', { regenerator: true }], + ], + }, + }, + ], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [{ + loader: 'url-loader', + options: { + // if you would like to use base64 for picture, uncomment limit: true + // limit: true, + limit: 1024, + fallback: 'file-loader', + name: '[name].[ext]', + outputPath: 'assets/', + }, + }], + }, + { + test: /\.(ts)$/, + use: [ + { + loader: 'ts-loader', + options: { + transpileOnly: true, + appendTsSuffixTo: [/\.vue$/], + }, + }, + ], + exclude: /node_modules/, + }, + { + test: /\.mjs$/, + include: /node_modules/, + type: 'javascript/auto', + }, + ], + }, + resolve: { + extensions: ['.js', '.vue', '.json', '.ts'], + alias: (() => { + const aliases = { + src: path.resolve('./src'), + }; + + // If @vue/runtime-core was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueRuntimeCorePath = path.resolve(__dirname, '../../../../packages/hippy-vue-next/node_modules/@vue/runtime-core'); + if (fs.existsSync(path.resolve(hippyVueRuntimeCorePath, 'index.js'))) { + console.warn(`* Using the @vue/runtime-core in ${hippyVueRuntimeCorePath} as vue alias`); + aliases['@vue/runtime-core'] = hippyVueRuntimeCorePath; + } else { + console.warn('* Using the @vue/runtime-core defined in package.json'); + } + + // If @hippy/vue-next was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueNextPath = path.resolve(__dirname, '../../../../packages/hippy-vue-next/dist'); + if (fs.existsSync(path.resolve(hippyVueNextPath, 'index.js'))) { + console.warn(`* Using the @hippy/vue-next in ${hippyVueNextPath} as @hippy/vue-next alias`); + aliases['@hippy/vue-next'] = hippyVueNextPath; + } else { + console.warn('* Using the @hippy/vue-next defined in package.json'); + } + + return aliases; + })(), + }, + }; +}; diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.dev.js b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.dev.js new file mode 100644 index 00000000000..f465c4ff488 --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.dev.js @@ -0,0 +1,195 @@ +const path = require('path'); +const fs = require('fs'); +const HippyDynamicImportPlugin = require('@hippy/hippy-dynamic-import-plugin'); +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); +const { VueLoaderPlugin } = require('vue-loader'); +const webpack = require('webpack'); + +const pkg = require('../../package.json'); + +let cssLoader = '@hippy/vue-css-loader'; +const hippyVueCssLoaderPath = path.resolve(__dirname, '../../../../packages/hippy-vue-css-loader/dist/css-loader.js'); +if (fs.existsSync(hippyVueCssLoaderPath)) { + console.warn(`* Using the @hippy/vue-css-loader in ${hippyVueCssLoaderPath}`); + cssLoader = hippyVueCssLoaderPath; +} else { + console.warn('* Using the @hippy/vue-css-loader defined in package.json'); +} + +/** + * webpack ssr client dev config + */ +module.exports = { + mode: 'development', + bail: true, + devtool: 'eval-source-map', + watch: true, + watchOptions: { + // file changed, rebuild delay time + aggregateTimeout: 1000, + }, + devServer: { + remote: { + protocol: 'http', + host: '127.0.0.1', + port: 38989, + }, + // support vue dev tools,default is false + vueDevtools: false, + // not support one debug server debug multiple app + multiple: false, + // ssr do not support hot replacement now + hot: false, + // default is true + liveReload: false, + client: { + // hippy do not support error tips layer + overlay: false, + }, + devMiddleware: { + // write hot replacement file to disk + writeToDisk: true, + }, + }, + entry: { + // client async bundle + home: [path.resolve(pkg.nativeMain)], + // client ssr entry + index: [path.resolve(pkg.ssrMain)], + }, + output: { + filename: '[name].bundle', + path: path.resolve('./dist/dev/'), + globalObject: '(0, eval)("this")', + }, + plugins: [ + new webpack.NamedModulesPlugin(), + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify('development'), + HOST: JSON.stringify(process.env.DEV_HOST || '127.0.0.1'), + PORT: JSON.stringify(process.env.DEV_PORT || 38989), + }, + __VUE_OPTIONS_API__: true, + __VUE_PROD_DEVTOOLS__: false, + __PLATFORM__: null, + }), + new CaseSensitivePathsPlugin(), + new VueLoaderPlugin(), + new HippyDynamicImportPlugin(), + ], + module: { + rules: [ + { + test: /\.vue$/, + use: [ + { + loader: 'vue-loader', + options: { + compilerOptions: { + // disable vue3 dom patch flag,because hippy do not support innerHTML + hoistStatic: false, + // whitespace handler, default is 'condense', it can be set 'preserve' + whitespace: 'condense', + // do not generate html comment node + comments: false, + }, + }, + }, + ], + }, + { + test: /\.(le|c)ss$/, + use: [cssLoader, 'less-loader'], + }, + { + test: /\.t|js$/, + use: [ + { + loader: 'babel-loader', + options: { + sourceType: 'unambiguous', + presets: [ + [ + '@babel/preset-env', + { + targets: { + chrome: 57, + ios: 9, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ['@babel/plugin-proposal-decorators', { legacy: true }], + ['@babel/plugin-transform-runtime', { regenerator: true }], + ], + }, + }, + ], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [{ + loader: 'url-loader', + options: { + // if you would like to use base64 for picture, uncomment limit: true + // limit: true, + fallback: 'file-loader', + name: '[name].[ext]', + outputPath: 'assets/', + }, + }], + }, + { + test: /\.(ts)$/, + use: [ + { + loader: 'ts-loader', + options: { + transpileOnly: true, + appendTsSuffixTo: [/\.vue$/], + }, + }, + ], + exclude: /node_modules/, + }, + { + test: /\.mjs$/, + include: /node_modules/, + type: 'javascript/auto', + }, + ], + }, + resolve: { + extensions: ['.js', '.vue', '.json', '.ts'], + alias: (() => { + const aliases = { + src: path.resolve('./src'), + }; + + // If @vue/runtime-core was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueRuntimeCorePath = path.resolve(__dirname, '../../../../packages/hippy-vue-next/node_modules/@vue/runtime-core'); + if (fs.existsSync(path.resolve(hippyVueRuntimeCorePath, 'index.js'))) { + console.warn(`* Using the @vue/runtime-core in ${hippyVueRuntimeCorePath} as vue alias`); + aliases['@vue/runtime-core'] = hippyVueRuntimeCorePath; + } else { + console.warn('* Using the @vue/runtime-core defined in package.json'); + } + + // If @hippy/vue-next was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueNextPath = path.resolve(__dirname, '../../../../packages/hippy-vue-next/dist'); + if (fs.existsSync(path.resolve(hippyVueNextPath, 'index.js'))) { + console.warn(`* Using the @hippy/vue-next in ${hippyVueNextPath} as @hippy/vue-next alias`); + aliases['@hippy/vue-next'] = hippyVueNextPath; + } else { + console.warn('* Using the @hippy/vue-next defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.entry.js b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.entry.js new file mode 100644 index 00000000000..f710f743a1b --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.entry.js @@ -0,0 +1,97 @@ +const path = require('path'); +const webpack = require('webpack'); + +const pkg = require('../../package.json'); + +module.exports = { + mode: 'production', + devtool: false, + entry: { + index: path.resolve(pkg.ssrMain), + }, + output: { + filename: '[name].js', + strictModuleExceptionHandling: true, + path: path.resolve('./dist'), + globalObject: '(0, eval)("this")', + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify('production'), + }, + __VUE_OPTIONS_API__: true, + __VUE_PROD_DEVTOOLS__: false, + __PLATFORM__: null, + }), + ], + module: { + rules: [ + { + test: /\.t|js$/, + use: [{ + loader: 'babel-loader', + options: { + sourceType: 'unambiguous', + presets: [ + [ + '@babel/preset-env', + { + targets: { + chrome: 57, + ios: 9, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ['@babel/plugin-proposal-decorators', { legacy: true }], + ['@babel/plugin-transform-runtime', { regenerator: true }], + ], + }, + }, + ], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [{ + loader: 'url-loader', + options: { + // comment line when production environment + // entry file do not have image asset + limit: true, + // limit: 8192, + // fallback: 'file-loader', + // name: '[name].[ext]', + // outputPath: 'assets/', + }, + }], + }, + { + test: /\.(ts)$/, + use: [ + { + loader: 'ts-loader', + options: { + transpileOnly: true, + appendTsSuffixTo: [/\.vue$/], + }, + }, + ], + exclude: /node_modules/, + }, + { + test: /\.mjs$/, + include: /node_modules/, + type: 'javascript/auto', + }, + ], + }, + resolve: { + extensions: ['.js', '.json', '.ts'], + alias: (() => ({ + src: path.resolve('./src'), + }))(), + }, +}; diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.ios.js b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.ios.js new file mode 100644 index 00000000000..eec18701059 --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.ios.js @@ -0,0 +1,3 @@ +const { getWebpackSsrBaseConfig } = require('./client.base'); + +module.exports = getWebpackSsrBaseConfig('ios', 'production'); diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.ios.vendor.js b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.ios.vendor.js new file mode 100644 index 00000000000..6783d5a86ba --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/client.ios.vendor.js @@ -0,0 +1,108 @@ +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); +const { VueLoaderPlugin } = require('vue-loader'); +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); + +const platform = 'ios'; + +module.exports = { + mode: 'production', + bail: true, + entry: { + vendor: [path.resolve(__dirname, '../vendor.js')], + }, + output: { + filename: `[name].${platform}.js`, + path: path.resolve(`./dist/${platform}/`), + globalObject: '(0, eval)("this")', + library: 'hippyVueBase', + }, + plugins: [ + new webpack.NamedModulesPlugin(), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('production'), + __PLATFORM__: JSON.stringify(platform), + }), + new CaseSensitivePathsPlugin(), + new VueLoaderPlugin(), + new webpack.DllPlugin({ + context: path.resolve(__dirname, '../..'), + path: path.resolve(__dirname, `../../dist/${platform}/[name]-manifest.json`), + name: 'hippyVueBase', + }), + ], + module: { + rules: [ + { + test: /\.vue$/, + use: [ + { + loader: 'vue-loader', + options: { + compilerOptions: { + // disable vue3 dom patch flag,because hippy do not support innerHTML + hoistStatic: false, + // whitespace handler, default is 'condense', it can be set 'preserve' + whitespace: 'condense', + }, + }, + }, + ], + }, + { + test: /\.(js)$/, + use: [ + { + loader: 'babel-loader', + options: { + presets: [ + [ + '@babel/preset-env', + { + targets: { + ios: 9, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ], + }, + }, + ], + }, + ], + }, + resolve: { + extensions: ['.js', '.vue', '.json', '.ts'], + alias: (() => { + const aliases = { + src: path.resolve('./src'), + }; + + // If @vue/runtime-core was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueRuntimeCorePath = path.resolve(__dirname, '../../../../packages/hippy-vue-next/node_modules/@vue/runtime-core'); + if (fs.existsSync(path.resolve(hippyVueRuntimeCorePath, 'index.js'))) { + console.warn(`* Using the @vue/runtime-core in ${hippyVueRuntimeCorePath} as vue alias`); + aliases['@vue/runtime-core'] = hippyVueRuntimeCorePath; + } else { + console.warn('* Using the @vue/runtime-core defined in package.json'); + } + + // If @hippy/vue-next was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueNextPath = path.resolve(__dirname, '../../../../packages/hippy-vue-next/dist'); + if (fs.existsSync(path.resolve(hippyVueNextPath, 'index.js'))) { + console.warn(`* Using the @hippy/vue-next in ${hippyVueNextPath} as @hippy/vue-next alias`); + aliases['@hippy/vue-next'] = hippyVueNextPath; + } else { + console.warn('* Using the @hippy/vue-next defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/server.dev.js b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/server.dev.js new file mode 100644 index 00000000000..e82008654ed --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/server.dev.js @@ -0,0 +1,186 @@ +const path = require('path'); +const fs = require('fs'); +const webpack = require('webpack'); + +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); +const compilerSSR = require('@hippy/vue-next-compiler-ssr'); +const { VueLoaderPlugin } = require('vue-loader'); +const pkg = require('../../package.json'); + +let cssLoader = '@hippy/vue-css-loader'; +const hippyVueCssLoaderPath = path.resolve(__dirname, '../../../../packages/hippy-vue-css-loader/dist/css-loader.js'); +if (fs.existsSync(hippyVueCssLoaderPath)) { + console.warn(`* Using the @hippy/vue-css-loader in ${hippyVueCssLoaderPath}`); + cssLoader = hippyVueCssLoaderPath; +} else { + console.warn('* Using the @hippy/vue-css-loader defined in package.json'); +} + +let vueNext = '@hippy/vue-next'; +const hippyVueNextPath = path.resolve(__dirname, '../../../../packages/hippy-vue-next/dist/index.js'); +if (fs.existsSync(hippyVueNextPath)) { + console.warn(`* Using the @hippy/vue-next in ${hippyVueNextPath}`); + vueNext = hippyVueNextPath; +} else { + console.warn('* Using the @hippy/vue-next defined in package.json'); +} +const { isNativeTag } = require(vueNext); + + +module.exports = { + mode: 'development', + bail: true, + devtool: 'source-map', + target: 'node', + watch: true, + watchOptions: { + // file changed, rebuild delay time + aggregateTimeout: 1000, + }, + entry: { + index: path.resolve(pkg.serverEntry), + }, + output: { + filename: 'index.js', + strictModuleExceptionHandling: true, + path: path.resolve('dist/server'), + }, + plugins: [ + // only generate one chunk at server side + new webpack.optimize.LimitChunkCountPlugin({ + maxChunks: 1, + }), + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify('development'), + HIPPY_SSR: true, + }, + __VUE_OPTIONS_API__: true, + __VUE_PROD_DEVTOOLS__: false, + }), + new CaseSensitivePathsPlugin(), + new VueLoaderPlugin(), + ], + module: { + rules: [ + { + test: /\.vue$/, + use: [ + { + loader: 'vue-loader', + options: { + compilerOptions: { + // because hippy do not support innerHTML, so we should close this feature + hoistStatic: false, + // whitespace handler, default is 'condense', it can be set 'preserve' + whitespace: 'condense', + // Vue will recognize non-HTML tags as components, so for Hippy native tags, + // Vue needs to be informed to render them as custom elements + isCustomElement: tag => isNativeTag && isNativeTag(tag), + // real used ssr runtime package, render vue node at server side + ssrRuntimeModuleName: '@hippy/vue-next-server-renderer', + // do not generate html comment node + comments: false, + }, + // real used vue compiler + compiler: compilerSSR, + }, + }, + ], + }, + { + test: /\.(le|c)ss$/, + use: [cssLoader, 'less-loader'], + }, + { + test: /\.t|js$/, + use: [ + { + loader: 'babel-loader', + options: { + sourceType: 'unambiguous', + presets: [ + [ + '@babel/preset-env', + { + targets: { + node: '16.0', + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-nullish-coalescing-operator'], + ], + }, + }, + ], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [{ + loader: 'url-loader', + options: { + // if you would like to use base64 for picture, uncomment limit: true + // limit: true, + limit: true, + fallback: 'file-loader', + name: '[name].[ext]', + outputPath: 'assets/', + }, + }], + }, + { + test: /\.(ts)$/, + use: [ + { + loader: 'ts-loader', + options: { + transpileOnly: true, + appendTsSuffixTo: [/\.vue$/], + }, + }, + ], + exclude: /node_modules/, + }, + { + test: /\.mjs$/, + include: /node_modules/, + type: 'javascript/auto', + }, + ], + }, + resolve: { + extensions: ['.js', '.vue', '.json', '.ts'], + alias: (() => { + const aliases = { + src: path.resolve('./src'), + }; + + // If @vue/runtime-core was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueRuntimeCorePath = path.resolve(__dirname, '../../../../packages/hippy-vue-next/node_modules/@vue/runtime-core'); + if (fs.existsSync(path.resolve(hippyVueRuntimeCorePath, 'index.js'))) { + console.warn(`* Using the @vue/runtime-core in ${hippyVueRuntimeCorePath} as vue alias`); + aliases['@vue/runtime-core'] = hippyVueRuntimeCorePath; + } else { + console.warn('* Using the @vue/runtime-core defined in package.json'); + } + + // If @hippy/vue-next was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueNextPath = path.resolve(__dirname, '../../../../packages/hippy-vue-next/dist'); + if (fs.existsSync(path.resolve(hippyVueNextPath, 'index.js'))) { + console.warn(`* Using the @hippy/vue-next in ${hippyVueNextPath} as @hippy/vue-next alias`); + aliases['@hippy/vue-next'] = hippyVueNextPath; + } else { + console.warn('* Using the @hippy/vue-next defined in package.json'); + } + + return aliases; + })(), + }, + externals: { + express: 'commonjs express', // this line is just to use the express dependency in a commonjs way + }, +}; diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/server.entry.js b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/server.entry.js new file mode 100644 index 00000000000..3ecee4aea93 --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack-ssr-config/server.entry.js @@ -0,0 +1,177 @@ +const path = require('path'); +const fs = require('fs'); +const webpack = require('webpack'); + +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); +const compilerSSR = require('@hippy/vue-next-compiler-ssr'); +const { VueLoaderPlugin } = require('vue-loader'); +const pkg = require('../../package.json'); + +let cssLoader = '@hippy/vue-css-loader'; +const hippyVueCssLoaderPath = path.resolve(__dirname, '../../../../packages/hippy-vue-css-loader/dist/css-loader.js'); +if (fs.existsSync(hippyVueCssLoaderPath)) { + console.warn(`* Using the @hippy/vue-css-loader in ${hippyVueCssLoaderPath}`); + cssLoader = hippyVueCssLoaderPath; +} else { + console.warn('* Using the @hippy/vue-css-loader defined in package.json'); +} + +let vueNext = '@hippy/vue-next'; +const hippyVueNextPath = path.resolve(__dirname, '../../../../packages/hippy-vue-next/dist/index.js'); +if (fs.existsSync(hippyVueNextPath)) { + console.warn(`* Using the @hippy/vue-next in ${hippyVueNextPath}`); + vueNext = hippyVueNextPath; +} else { + console.warn('* Using the @hippy/vue-next defined in package.json'); +} +const { isNativeTag } = require(vueNext); + +module.exports = { + mode: 'production', + bail: true, + devtool: false, + target: 'node', + entry: { + index: path.resolve(pkg.serverEntry), + }, + output: { + filename: 'index.js', + strictModuleExceptionHandling: true, + path: path.resolve('dist/server'), + }, + plugins: [ + // only generate one chunk at server side + new webpack.optimize.LimitChunkCountPlugin({ + maxChunks: 1, + }), + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify('production'), + HIPPY_SSR: true, + }, + __VUE_OPTIONS_API__: true, + __VUE_PROD_DEVTOOLS__: false, + }), + new CaseSensitivePathsPlugin(), + new VueLoaderPlugin(), + ], + module: { + rules: [ + { + test: /\.vue$/, + use: [ + { + loader: 'vue-loader', + options: { + compilerOptions: { + // because hippy do not support innerHTML, so we should close this feature + hoistStatic: false, + // whitespace handler, default is 'condense', it can be set 'preserve' + whitespace: 'condense', + // Vue will recognize non-HTML tags as components, so for Hippy native tags, + // Vue needs to be informed to render them as custom elements + isCustomElement: tag => isNativeTag && isNativeTag(tag), + // real used ssr runtime package, render vue node at server side + ssrRuntimeModuleName: '@hippy/vue-next-server-renderer', + // do not generate html comment node + comments: false, + }, + // real used vue compiler + compiler: compilerSSR, + }, + }, + ], + }, + { + test: /\.(le|c)ss$/, + use: [cssLoader, 'less-loader'], + }, + { + test: /\.t|js$/, + use: [ + { + loader: 'babel-loader', + options: { + sourceType: 'unambiguous', + presets: [ + [ + '@babel/preset-env', + { + targets: { + node: '16.0', + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-nullish-coalescing-operator'], + ], + }, + }, + ], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [{ + loader: 'url-loader', + options: { + // if you would like to use base64 for picture, uncomment limit: true + // limit: true, + limit: 8192, + fallback: 'file-loader', + name: '[name].[ext]', + outputPath: 'assets/', + }, + }], + }, + { + test: /\.(ts)$/, + use: [ + { + loader: 'ts-loader', + options: { + transpileOnly: true, + appendTsSuffixTo: [/\.vue$/], + }, + }, + ], + exclude: /node_modules/, + }, + { + test: /\.mjs$/, + include: /node_modules/, + type: 'javascript/auto', + }, + ], + }, + resolve: { + extensions: ['.js', '.vue', '.json', '.ts'], + alias: (() => { + const aliases = { + src: path.resolve('./src'), + }; + + // If @vue/runtime-core was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueRuntimeCorePath = path.resolve(__dirname, '../../../../packages/hippy-vue-next/node_modules/@vue/runtime-core'); + if (fs.existsSync(path.resolve(hippyVueRuntimeCorePath, 'index.js'))) { + console.warn(`* Using the @vue/runtime-core in ${hippyVueRuntimeCorePath} as vue alias`); + aliases['@vue/runtime-core'] = hippyVueRuntimeCorePath; + } else { + console.warn('* Using the @vue/runtime-core defined in package.json'); + } + + // If @hippy/vue-next was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueNextPath = path.resolve(__dirname, '../../../../packages/hippy-vue-next/dist'); + if (fs.existsSync(path.resolve(hippyVueNextPath, 'index.js'))) { + console.warn(`* Using the @hippy/vue-next in ${hippyVueNextPath} as @hippy/vue-next alias`); + aliases['@hippy/vue-next'] = hippyVueNextPath; + } else { + console.warn('* Using the @hippy/vue-next defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack.ssr.build.js b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack.ssr.build.js new file mode 100644 index 00000000000..fe0210af821 --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack.ssr.build.js @@ -0,0 +1,109 @@ +/** + * build js script for ssr production + */ +const { arch } = require('os'); +const { exec, rm, cp } = require('shelljs'); + +let envPrefixStr = 'cross-env-os os="Windows_NT,Linux,Darwin" minVersion=17 NODE_OPTIONS=--openssl-legacy-provider'; +const isArmCpu = arch() + .toLowerCase() + .includes('arm'); +if (isArmCpu) { + envPrefixStr = ''; +} + +/** + * get executed script + * + * @param configFile - config file name + */ +function getScriptCommand(configFile) { + return `${envPrefixStr} webpack --config scripts/webpack-ssr-config/${configFile} --mode production`; +} + +/** + * execute script + * + * @param scriptStr - script content + * @param options - shelljs options + */ +function runScript(scriptStr, options = { silent: false }) { + const result = exec(scriptStr, options); + if (result.code !== 0) { + console.error(`❌ execute cmd - "${scriptStr}" error: ${result.stderr}`); + process.exit(1); + } +} + +/** + * build ssr client entry bundle + */ +function buildServerEntry() { + // build server entry + runScript(getScriptCommand('server.entry.js')); +} + +/** + * build ssr sever and client bundle + */ +function buildJsBundle() { + // build Android client bundle + runScript(getScriptCommand('client.android.js')); + // build iOS client bundle + runScript(getScriptCommand('client.ios.js')); + // 3. build client entry + runScript(getScriptCommand('client.entry.js')); +} + +/** + * build js vendor for production + */ +function buildJsVendor() { + // ios + runScript(getScriptCommand('client.ios.vendor.js')); + // android + runScript(getScriptCommand('client.android.vendor.js')); +} + +/** + * generate client entry js bundle for production + */ +function generateClientEntryForProduction() { + // copy js entry to every platform + // ios + cp('-f', './dist/index.js', './dist/ios/index.ios.js'); + // android + cp('-f', './dist/index.js', './dist/android/index.android.js'); +} + +/** + * copy generated files to native demo + */ +function copyFilesToNativeDemo() { + cp('-Rf', './dist/ios/*', '../ios-demo/res/'); // Update the ios demo project + cp('-Rf', './dist/android/*', '../android-demo/res/'); // # Update the android project +} + +/** + * build production bundle + */ +function buildProduction() { + // production, build all entry bundle, ssr server should execute by user + // first, remove dist directory + rm('-rf', './dist'); + // second, build js vendor + buildJsVendor(); + // third, build all js bundle + buildJsBundle(); + // fourth, build client entry + buildServerEntry(); + // fifth, build every platform's client entry + generateClientEntryForProduction(); + // last, copy all files to native demo + copyFilesToNativeDemo(); +} + +// build production bundle +buildProduction(); + + diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack.ssr.dev.js b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack.ssr.dev.js new file mode 100644 index 00000000000..4c225478b6f --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/scripts/webpack.ssr.dev.js @@ -0,0 +1,39 @@ +/** + * build script for ssr + */ + +const webpack = require('webpack'); +const { exec } = require('shelljs'); +const serverConfig = require('./webpack-ssr-config/server.dev'); + +const compiler = webpack(serverConfig); +let childProcess = null; + +/** + * execute script + * + * @param scriptStr - script content + * @param options - shelljs options + */ +function runScript(scriptStr, options) { + if (childProcess) { + // kill process first + childProcess.kill(); + } + childProcess = exec(scriptStr, options, (code, stdout, stderr) => { + if (code) { + console.error(`❌ execute cmd - "${scriptStr}" error: ${stderr}`); + process.exit(1); + } + }); +} + +compiler.hooks.done.tap('DonePlugin', () => { + // restart node process after build success + setTimeout(() => { + runScript('node ./dist/server/index.js', { async: true, silent: false }); + }, 0); +}); + +// watch server entry change +compiler.watch({}, () => {}); diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/server.ts b/driver/js/examples/hippy-vue-next-ssr-demo/server.ts new file mode 100644 index 00000000000..d92fd6ae8ca --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/server.ts @@ -0,0 +1,83 @@ +import express from 'express'; +import { render, HIPPY_GLOBAL_STYLE_NAME } from 'src/main-server'; + +interface MinifiedStyleDeclaration { + [key: number]: number | string; +} + +/** + * minify css content + */ +function minifyStyleContent(rawStyleContent): NeedToTyped[] | MinifiedStyleDeclaration[] { + if (rawStyleContent?.length && Array.isArray(rawStyleContent)) { + const minifiedStyle: MinifiedStyleDeclaration[] = []; + rawStyleContent.forEach((styleContent) => { + // minified style is array, 0 index is selectors, 1 index is declaration, no hash + minifiedStyle.push([ + styleContent.selectors, + // minify declarations + styleContent.declarations.map(declaration => [declaration.property, declaration.value]), + ]); + }); + return minifiedStyle; + } + + return rawStyleContent; +} + +/** + * get ssr style content + * + * @param globalStyleName - hippy global style name + */ +function getSsrStyleContent(globalStyleName): NeedToTyped[] { + if (global.ssrStyleContentList) { + return global.ssrStyleContentList; + } + // cache global style sheet, then non first request could return directly, unnecessary to + // serialize again + global.ssrStyleContentList = JSON.stringify(minifyStyleContent(global[globalStyleName])); + + return global.ssrStyleContentList; +} + +// server listen port +const serverPort = 8080; +// init http server +const server = express(); +// use json middleware +server.use(express.json()); + +// listen request +server.all('/getSsrFirstScreenData', (req, rsp) => { + // get hippy ssr node list and other const + render('/', { + appName: 'Demo', + iPhone: { + statusBar: { disabled: true }, + }, + }, req.body).then(({ + list, + store, + uniqueId, + }) => { + // send response + rsp.json({ + code: 0, + data: list, + store: store.state.value, + uniqueId, + styleContent: getSsrStyleContent(HIPPY_GLOBAL_STYLE_NAME), + }); + }) + .catch((error) => { + rsp.json({ + code: -1, + message: `get ssr data error: ${JSON.stringify(error)}`, + }); + }); +}); + +// start server +server.listen(serverPort); +console.log(`Server listen on:${serverPort}`); diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/src/app.vue b/driver/js/examples/hippy-vue-next-ssr-demo/src/app.vue new file mode 100644 index 00000000000..bb96e1b1097 --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/src/app.vue @@ -0,0 +1,223 @@ + + + diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/src/assets/defaultSource.jpg b/driver/js/examples/hippy-vue-next-ssr-demo/src/assets/defaultSource.jpg new file mode 100644 index 0000000000000000000000000000000000000000..833417ea2fb9732e462397b44094599e2b96a56d GIT binary patch literal 42281 zcmbTdV{~L;+b&pfI<{>a9dvBlHY+x|(=j`?IyNe{ZQC|G#^inHoNvvXwdT(}^{3X} zwd&css;;^(-1q15=QaREMnYNw00ssCfPFmxpKAb70L*{axBuVkvj>0*3uXsS00BS+ zfT04wQ30R*fXS~dAR)f?_@4z00SN^I00V~w1As&P=Mw&BK|p>ThJpqMd>#IOo%nhk zBos8t*I7t#C`dRY7-;CPHwA!$K>#38(V$47(aBiZ$c06eF)-Oxj7^-J13)ko9HK72 z{4;6<=5TrhzHH>nHBV-eqF}bu8`p1U{L?}reNR@ zsA!Prq^!bZZ0sT!qU6fPP%0))0l#ZMR{;nRUpIsbP6`kN+<6a#V;l=Uv_XGxHYb^N zn}dIu6mBcPHP@jV1JxI|Oem znAc3d{}Vu?t(VQ<08@)lWHHAS8m)fU)EDCl`9aLc5i&OcQL2#cNsjB!KDQq9ATl!& zWg>~h;{l1J9m*r{2_T6Pfbp4P0=?B0tmWp3K93?U%0GppAS~MBod|-HFnze9f|TMjvQwu{48Lr;xfA9FOJx@BX)JT5lKtVy;8_Z zi|t)?R-biP1FO4HJoT)NVg!tu#wSFVv%|(u>EwH~w|oNjLR+eIcbKDD_T-J+3<6CR zNJqRmR-S7JHizUTmQO$GyMGWBAmpB$0KnZ&fKnrxT3hJMzT|%Qd}GeD2OJpM@1*qj z8h^1pc0uf2 z#-pmOof?iszZA5P(M60;23yrPeN|f}Ybg2YV9B(nX^~-`$Gt9*(fmN)gw@@@$?t#$ zSw_#eIMyngGXrnd`c!i79s*Net?)yY|AS71K9YI@9y!%;gLtJCdH|*f+Va=r`sS2z zi^EZ8s6g1qP$oG%Ckj{FJF34}ge&o@e&8nnZ(WyYQal809>lzY$-?O#iDoo2om=H3 zzp!Bv*xGMfuT_ea$6C0728l}3n4q5LO}1R>s#;-=OnLZefqD{d0Wt#6jH131_ zQo?uVpQ#?1SGPm!=HKfU=1yMRPHrX=F77`jI2s9x?tJ^?RhKqRFvGQz0~xke%T3)0 z2y-Kv%J?}B8ioxHp?5bC1jT4aT?j1pE7pri&mIBuwVpEYwx0mPxV1CJ7+fX-dZo+ot&j}|Dco1Jg?2_-^uP7Z)}<@b?J+%m zo6wCWcD;=3+j`f+GL5L+7o26Fx3&0yb8SEp-+5a8wDZSLaN; z_s&Q7UDIp2|1>rMEz7HFuC9M&w60d{xewy|Bc@nte~sQulP)TwwrlT{Pt-Q9$Q(J_ zU@c$1oBqitlG99na3wq`BbE2oinnP-Ki_p_=sKE{HGZ#LkQyk&RlZ+>a|(rx98as} zK!sTwsWegEj4KX;3|b6vP{)CtkC9@8|MmBrQ4$$vo;UCAAxE?>-uQ9(eUpq6givxH z7rqyWE%oH|Rz4@P0ql^r!Ej8raW;Mbbcmoox}G3zWb+)7PUzSE+@+wU>;_l)i%NwPh~Mai`^ z(nmrzV)cPWV_uCPu5Qk4h=d@|>d=AfHWK1sj|?Qe_kK(3gnl{%FaP z{hlHb#y`Vh;jmll9p1&PNnDQ4DMEe+6MrZW_{aY2&c*DY58tjMvF(}AWRN1Nl_{G< z4F@!AVL|btzE}2q0-}K&L!en)v6>3=LbAYmtpvodg$--Wd{_54d0?$PO>m+-ZoW;6 z*tC^cUJvDKG6P+v!=JrO1k|2r6(vj;HOCpcPTm<3j}ta}yx|PF+PYo}N&+s}{tZ-m z{(-3NHnw@3LFSO%_#tEH#(h$V%gil2UR>s57nNW7+zA=B#F;*7hm}KINSidG_~qT- zsYb9e?xrfqUGzz2@P?!p=t(2S$9O6F23O1S7z^?uBHEI8_V_9rrR!WD3|^EA>~_$! zd>ra3zm=-2UU>>sAO}yp1y4mERoFjRSV#|oz~$mp5<{uhid9soNZ5Rp6C%y17sRqPBSB?_z=`k8rj(lOsXl|i!03WAb4; z1p?A2nGB@$U)P&+rDdrO%qv+1KgU)Avih4p0fVqSf13V$0w^HJ#;`Hdsp|72)O)Zq z>a<|4qOmGo3>PrN!Zh_``zQ9TyB+)2_oEp-Wd-m)0V&8Tm$uW{aC6b7Pb#>yRF!8+ z307Q4*t_c8g0toip@VNMOc-x64Ls2QbPnN_4y*PWc&MEp7u(X_mXFV!FWCkL^~PXa zr_)_(S3x~3ffHQ(BE)zzL2PX_EJMmZUI9OmpGdTHs<`vH4!;IbC&IM6)o#^~BQIRrspiY1-PE^%sphB&G)oKufN@&q`;=!oZg49<@Dh)i3C{VtzL=LEX6Q`gLdER(68G z+LkwpNw{VOdax(>dXf5?eHEW4OFJFT5ce~6my^^3^w7fJ*X{-7b z1&2teN;0&DhFkaQ+a*+T#MKOQ*%Xd&cXfBG$jVc=*<)^kH81zDT8C%XNrPKQk~^;S z(}L@KlNn{NKqd@)f-BJK?>KSstdcJvqQG%bziR)ta@qeei#R}(L1is9j!FeFsMYDi ziQ}%Tx_!aWrWT@rCLpCBNh%NAra}BxqW+}REm$!+{>-0e1N?UOJJTE@^;J~YrO>5K z;d?@yk34n!YwpjROc>&pMwMHUtTd+5F0HLfgtb-8fIU8i^Jx-nL;9M<#-=}Ap`_3GXZ{rt zveZ{%fR1*g%3inAU1Rf^1M85FfW{zQ%05CH{l$+hMv(c`MLf8Bb%!1K2ZaWzp`!4w+fH!Pt>0N zw6Hx7RO!>SmJmcFu5#EKKOK&2Fh`H`cG508gF?Rh4scuALJi7Mx=Ybq^}-N%lK z&5ByZam20*EtnL6SIxcC<@BsTQ_S|dNy)EXAZILq9}=5RO|{>TmF*QN;FiUq(v_7B z02kzWTToYt87#bqM8*1DwO6HUe~%r#Z#3(j{#^+OWJ3$Dc*pY{!M1U0(}>(GuszN0 z{2LO(&a{Y2TPZA{V)f7!*9WyTlElr;iwIr2gr;8=;q#hp`*Q)RV{X+iA|G9DM^jVH zs&Le+CR@<^@o9`Ve>r}CA&+-x$aVrq=p1Zu(_+o}!?2OKxqW$vQ$b1l`6TTzD4SEi zHkTUCvNe`)>>{+>l>?>bUU9wdcv(tWnBp1RNbd0^;qY2QbOO(d320oloz7Qg){r6X z=#B2!qgw5TjVh4`%^*ZOU43DI`eysn7nuEI-T```N&J4m6pWiXJwu7=AucPc!D4Au zE5Go?`P9QklF0^+sdQBG9KumXQn33G$@Xjgamra;D-T|G#cnOZVh+gz$WEcGuL>2j zYxvUhJ81g~Zy0`rWVextV4~?Y{^X;??0t(LZ&U*w&w;MsFH)P=6#j6==o(&sRB)%D z5iE?d8&|Q|4^B>!wEgA`W*ApRLo7H8nHH1dia4R>EPoKX^`W@Gg56;2E@1WL)ddNw zr5XLR;G^K{WN`7c`#E|(;*nmwk0yQx#>rYO8-ZA}&?<0H^@O{_HAAPY>enLtDp4aV z0dh>B3m2y}uv^dovrfydtPm5$vO5uDXqj!0isStj?SowJWy^e`SWC{GL{A81)MW;{ z=SQ3h7Mt3F3BD`toP@C=a~ZX0!i<;fR|mG6XkkB;2@bQia)8HJv+@$R;D}G|z{yQH zYOrPA)SqD*_u-y*8zs>k*?XBHbwimz36gf`WT4GiKJI5367u;OoP>5^-lS^V%yX0f zy(7Ar9-}vl+n`y(zHR+VCk?SGGL!mk*fc)ndrbHU+h(jx^IVCsB;8zl#*UKyMK#XH zwY#z0WCUXUKN(ec>p`gureP%T8wHqOOPXviayE4Hd)_n3O?t4uPt|GF70{oXL~Fgy zkJ1M_(3ab4c<2MaPtle`zr7p!icWxy=l0>NUlf6D9-K;eT9^sRm!r!yXCNW@iBH{Q zxDtfC;Cfnn-4pG$|Fu@I%hCRaiz1@S>q9w16ZI>GWEN z;vr%P5sMH!yT5}T6bTnth{l)@ zOc)q?FS!eO8ePWz3H4h>piK=M`=IJu-jik05UT`SIeE;zenid1P$v@?^U;J^63cq2 zHL|ef@n8E~Ay-A;(o*Ak1Rk&hM!zpZt*-o9)Cn%TR4UtfEh^sZEIPq;ir;v?GjjhI zT~3bcYsPZUu!+g2>x*$?Vru1sF+h~neK6JXYJXjW>5~;LDn&wZJyJR+uf@oB8D(kw z*gb^QU07&9=$s#HgJlg$E9Mp){B5V`fAp6_COwoU3+v>T!sYx#-c-JHCqbiZtJHbT zcX`Y}YnE0!+0iSXau>aYX|2{ejT*B>SgV*UeK?@`m*U@_tL@}Ziys5gd(U*buaxJg zdVe1=Fh!!q@m2Da12exZkh4QC<$DZ@dJHs_?;`57GDd5VnjU#@F?pnCr06F~n6=)u zp0oNlmKq=Ba>M6-FK6uiGfXxQayn|v@3B*qIQGw8OhJ7HWPgUP{`?P{bH2KXJO6s( z90eVMatDRoiFQw;!_Z;u6}ao4bkCbcLn&)Oe-GiSgCvCX3n4WWjy6H`%jl58{i33D zYJB;zcwj4FPK4d8MOax)M_DDJ92+qPRA2ArSCNB#9z{bduC4~QS=z9TgD;tiMzVdE z4JN3;GNRJQ@m7Ai$AoY0e2rOiO4d$KO#3_{LA568VzBXtyS5?6^=eOCYAW9aPoCnH ziEEpitFk3~nW(NKz=9yfo%+ONgv z8lQlP$Ekxp>4F=~AMWt|P|KBm(*$Jf=onKz=N(Q_x{S^a6|t$JcR>b@v&zL9=P@u_A7k=&|Uw-J@rPGnE$sm7~& zVW$TThn6CD3DIM+vd#Z!LQG9<8@dUUGq{pYT?&}cLCymX==LxCwUh5L`}oWCZ3wxz zwi~Fj+V)%%-J5Pp|Mz^5D#@nel zul7vExZlt!!6UPD@S6KlR@u-2?T!vY_9+8 z>Avo{{ufGTPshz!gTl&s`Bd(~QsX_l`uZ4)qzt-*>L$<{Bo5yLS_fb+4?M(()U(;N zKLH$nt+hfBY?t$|L(jTzaa0SRc6ZRwVlrD|GkPh-%Se{X)wG6?{Zf(*+H!Fwe+2I` z;DjSJkH8AeFi#S9YBE}(&&d-F__%O$u^sLqW$hX_Ox%mi51wvTHB@ofP&yt>#)*Cc z6jIamjgDreCeqtD_6V|j%^kA`ohN+%p22ipIwBG6F{=5#Udm_J#4#29JVTt6A+HvGHi_Fa=tqYv}>Jg_tJ>i*+8w*Qh8@aZTke25Pw)1GB=3Fg-_yp z%ahX`2mS@t5agW!8Z6PlfRWVKZ{kA%#bOiRCZ+p@ozJ@Xx%%FQxccm915Js0*#!(Zg^rJqcg-Z<6-uQJ&5GpG*sZP%r#_}f zMcxtmHEf9&n`hx$6BhBUhtlmmN(}7ivus3G(hM|b9)+9DoMS^&uKU9%<2Vtd)}fP0 z%*g_sgu`l$J3WV0y-lv!BkL^=E9`w74t~w3yK%>q#gwVp%g~`0_8TaaaI+F=Y7`by zSzaG@(@E5sX`(#^{4Bc*RGsV=DTDqT_sXleux%{&_={R1tP zBw+To!2mSY$l4FV51u+Jh?d`Bm$+5WS+`Sq3&S>{p--agJ~R>J5XVku(0K~;W=an^yUEpCpchj`>|i-w4caOFqwP`vWm)OU@}nSE`ijvzws!6*Egub? zcVPb?ll_0_qai2hj}Sql*bIiO;2A;c=$qV;lBYtvF#IqmJnZ-KUcqRGtLVA?Qit=D z>ioRj>l1ReCF@oaH?5-6vvk_ZqT^`SNZeceFiv1C1X=n88f{q{&P1OR;&JDyTAZi<0RV8|Zo2i7RumTuS+5!x*pGA-9*v!Wg zU!2n+lT~n_4#DfWX<-Yz(MRra5@K}C_xPCUl;61aSMgmi4EMq3V|V~bnCxS=X`Jfl z`%2f{{k2Q|0lz!(p7Tn_buDAm2CX66Or?){=``MVIeZ36!`2``JCXC2M$JZdj`(Gw zHmp*AOF>k}ir0%3lds3+FJh$eZ(-isdiI}@N3C!EQ8(r{q4+p8UPFL_OeYSJ!I@@F zOQ#j;P%Cd&xdrLYZ;!W;w&;DF5_n7Hx8Wct_-r zL#xM^=Sp{KDyC2$zp6>^Be%JKio?G}eU-_?y?zNF zv8^FaE2@+lw%6$`QJUDL>XI`MMLjRIVyt;SLlwFjV9UTxX!^HyOBZb1*H%($Qhx=p z7;lYFQcHx~ubnjpf1ND=N%;Y1e>^b$5@-*DEcsqL>+~$XM}5H$%f9W9jxlT??BWW|f{2Ug6NFNIG<~ud_?0Hx-1xs{`w{yQA`r!G@J}P)&{uGq z^!xDvvcriN7>aP+^ta3}+wA1|>)DM~t=u*{**XM0O7!xwvZqP_$e4msD@RDX97{Z@ z?Nhupk^MoQE=z}n{`TRZSesZ#0NSJ8venOuPFF!i(LBG zF`r>V5LbzI$fN^gd}Gtu;rE{@V7h<35DC)VXT3Q6c|HNjf(w{W&xjKxDbnlCvdHmR zVL=(P4pB>+{LloFhc&oHt8Ts7KPR_sa6sbM@A%wSE>K37b%l6EWLFqtveLu+zn97E z?kEQhsphebJ*qBH4TQHin-6*CmWRLXB#5XL6;6Smmy+wNq|^9myU7`?>-PekDT{Xx zX0L#OelkTSxF!EjTKKdfAd~zt;{8sZyL){}Ta^bbhBW7@oS$E?fq@?}&5eOC6>ZNw zplDpG^B$K#H?F4FG{a(g5pbz(PHU%Uy|+^B-O^?reRti z&y4aXFyf@L9iQhAA076kSp_rI!{Ei9H&MRQfL${-PICTgQ31C#*$>`>>*LETX_~D{ z*4Alzi_?5MxADo%=3N6C2Y7}%LroBTpg-`jxA#PifyU?3YlLL-rd7hBI!rA8mRir1 zK}pl!3Qd)HRbkxuA2Ya1jwty7ta6fm8Mf9UXoJ>+ItgyIS|=0AElVCH7eSu@>J^+} zn+MDw*uD*Xl5^aEG6yEtE0a_L9y)>3-x)m71q4tj6E8FKgWJ^Faq02cD6l?^ol02i z$380J1{KymoQbD&>sb?t zJk+FJ%Sb1mK6cl;;}k=PH#5Z;o-mbtTBz$j5x!pD??bwjZ-1ie4trY``&s550vqJ_ zQ{08Tivits5v_^@Iq~xPtA{S))}ygU^X<~eB;9)lE*<=bf+dj zcgG9IaC-yD6+5H$-ix3Xj{PFQPV;Kz9jX1MLpk<8%lwc2X7Z?@#J|nt4vk*z48o4+ zWEKwS@+yQqOj{R(g`a>i8{`gf&oRbb`<))|GRD`0Gytt z&N@%Ss9klweO&u?&BoBws6!-JX%>ZfieJITbFMA&7*3~px#Zt^)}c0ZEwxqqJUXx1 zDc49Racq{AKLIquUVjuib%{B7=57zfM-}E56bb{R6&KI`03q4EX z8Yl08@%4;CEo3*aAi}n6273f;W_pHh3`hSHfS?2_xc=$Vbd*yK(UL4c)wyIjDp1zH z1D}Y>@#-BOa`|^-0eSy{$9hB6+N_7OAYoqpvL=|n&A+10wF@)0sLU*kZ-{H?1_Ri_ z^oK6L1=&p7BT$`>*&0nJhNA(mN?mRD_oUUqxQuUDq*(WdFXeh)H)kFb4};h;?h~m$ z(y66aB$4@p#X7cUT?npHkCTJ~skPNszxoTgckvI(QaxU0`*^2T&nDMg>II^QR;`k4 zlqCPBkl@1nF>U2)Uby#fIKzcL-=;6}kkLL|e$_kuX4|r%W?RkAFvOyvYw@*3jiZ#v zCWEV{IHDm6;w!x|K4Q#O4B4Aq&RoxD0?GZTwyUxS+Lao#MR3~InGx((+HzzIKU6q% zj@GQ(dm?N1Ds{R+F0T?hTvt4}b?x(H%0bXEo;3ceh7YU6ob*s2e81;EqfXn-dFzqi6pDs&@fi%2t*q@@?F*pQKidG?}H&Hp;b|n8w2WkT&RAfxh#J- zO0b8t9QAt=6HIGY35_nG?@y@4Vdxf!On{k<%z<1hOqGMcg{3bS5Gd4qf)O=YoA&G6 zg|bOIt)c74*UH5w$Jh_u8gDj_q(0p#VIjk|b~>nz*NIU&`?OQaGDwmY)|g5>q&!p0 zOlVzbiQmE-Mp?Kdceoi@@Rhvz+Jw{?#VK0cV?lHOOFEbq7c;<+2P!DcPpj$fY9i;1 z=wIuX0*R!JXJ^rFkJ}3eEz|XzjDS+y3+U10bS#So4{=i?SMG}&2nCK60_q`$g!NIg zm#TMmJdsG;RC>v71<+7Iq&5)~o@}2wj?gOk>7gB~AB_zZkg7=hR4jjCgJg_Z!=Zo}d(g<&IEx-Ma zO&>WomyY7K?#6FH-#>#uX0w)HIA28NK>Fpu)?^vT^nxHxkLCXV4Jux#=+G~AXW|e> zx#|#xAC=Y|(44!j0 z0&`6<87d+psZrhf$1hV)XT7)lWRI;Eu>*E*#*`64RGoc#^KIe#597QmDX>UKnQug&*Z)~xJ# z)%dktIl4Je2KRSipNYoU2eF(O3=LjKMYgm})vZs0^_K@(7XTwwFx3p`%ne-iZhu{8 zp9mOvW&outF=XS;ZcOv`kWK0ArMC;9ee>l5j)oe(9l9ahxUXI$!2Ygc zWoY^uw?YLys@-|IZ0`kewPRzu+}>wg=J4XmbDsN$z6gUfW{P>Lj-*uC=Jgf+ZZ^>| zaQ69H9a1CY4L7op>wL)q+$r1|APpN08w0IAvvmsVA!kVtR!4lXx)H~-=DSrBF?6AO z7!Gh?_l+E}Md?m!7BUhzvS9C--qC*ssDOLaXpk~3@(W-9@?0^lH}(ozDj9E(KxYW0 zV6r#0bv0P_G$Gt6A2hq0m^eUr4Q&d#hSJ#X4*2OL#K(WDpi{4Nv|keN_!)}1O(CKn zBGG4u_A;k)0sqE&7=2E4#H&ZKpO|gqK{d|!iX}N_G{>$bSI`z-_AqwoC-Ju)oehVH zn2I|#JgYyY;g*qOe zkwJ*@Rbcd}anSIulGYw9QTrH=k*Bs}9t<;45DAb3{n+rK8uo*;tCL$XzOV~q&>gxi z-*3koM%ZumU?$NfHcB(yACWxfBxiCNffP?$S$1$7{v*gky}4Mb?I;5CJu+ka%tijs zRaE4gc%B5?vqRz*NQc?F;Df+V3K|n*yv|@PWrV&0_@6K8w8i^0{#0MF6+U>v1*QmbqSvJFRH;R;#S+tNv`280aa}YfqeQ7to#Q zTrMUt-_nj5uo8zj1#c0Ot1eT`FXIt1stAFxpy_WFJ|7p=aiHUl$qi6_(bD0$gn2vo zr^32PL4vRp6M^FyIcIAtj3PS-SMrX z5i7)XSC`L2+i%N<*^UWJgNY7*AcAT8C9teZ*XOI3(1?Sa_(Le*`eHbwpCZ*&kIxOL z*~$&leZ!}|sS0&?Q{}sTHE{ z?(fCIjybJPOqxN23XqM#GNQ4@X*~6Wl&J}4lO|i)w6V%#I|Cr&&2TJ=5T7*~v^m~P zA8K&<3D|K6p}eFQW}^RIDQm3CM22@dKSI0Pjlsj9MrBS}q`iWlL)gXH>@|v;Hl$^9 zk>`2I+{o;?Vus$_zur@btwtxsN9+slJ)b|XgG9Nksn=wq{Z9o&%P@?`H)zVQOc2CE zDLH8?you| ziozF$zg{aJsyBnzFC#7mBr#KR!?mSP$s^Ig=@RTsq<_UG4}`OU*il@HGJnM%ewA`O z@s$xz-fEqvAgxc7hTDQP4Yg1=`G_KiUqNgQLg3}2N=`YN3}qH`T6gx=4XhP7&zQtV zYSgfI{CS4cJ0AXQz2a5${4FG#;0eJv+cY!qBCG#^%l`1rL~k&)C19uRNsF%?*QJ2G z_bn!Biq%vha_YP25_EH}y|nF#R3UG1kH-9+>UnhBU;p`ES}*J%nHIFSTKicnXz&J8 zf%@tZoGuqhVJ#uK8V;8aebxhJb#g&Zux%UT($Iej8$F=QC2?Lo<#|VzP1mA=;K49# z(AugD3Q%xz-ewOsn?=Z5Jyb`;VANY^M?KFb5+-2F;a)HSk* zo$}DzZHe0f*L`GEKpo>a=RP{kmbT|sLZ`p3Qqis*Yw-*7$+~kHt}ah8m+P!E_JSK& zI6M9vxA8~!qO2>p=ZCe%%>i)`P7u}@co7I+rDcJ<$XPhdl#xx`YGIa+$|hWW6hdo> zp}*XEj#$jMzCAM&6p2Vmm{wA_MeE{Kv$@1|#O^XaI##pavri#vD^sRkLqjh$anMk4 zhQxXlcVg{=!r0i0^4i8vI&p1Wu++*htrETOfE}xH>TAVDl~7mF706R+-GiEjc;FJ8 zg5lufp3yuax6PK<&;}x0Jpm$FVYbmk+aje6i}Adc=L8wqW1i5RI<}zhHna(ZVuJaz5&wOl@)^l0FEBq0&+76qt+EvB9OKU)GoIl!>Qkmbv1u8;;s81Zkk{MboF6 zEi`l~9W)LK^c?7U>$pXcSq)1`EHSOF)(sNT8<&{m|M#08`+bTiYEZibOnw%3JlL&L|Efo1fFZ=}Ub zT11Lb|odo``xvlz+bg| z1966pRq)`1A8e<+GEGa~sLcLM{;!M4yIB{NY0A0Zbyw;-U+qN4ARhx0 z6WST@8-(-tdG=V_>#`x;JkB0?R#Ok#W6(bmPrT}k*>BIHT=NYVdL@;uDTwqf*x{s= zmhz~nL5C6YqjD#_{L2Yqb}bcX^r4=Py|y3u|4C^7!`g5W z#l9T5NH{)uOWgQDe5ZX%jK%X%w8c{RkA;Wwkq(kfUrxE1kW%?u@Vi2LMw7jBm zE`UNp)l65WV_TfSG=@!>tj|rE#0bXR7@wg+x^9ul!mC;v!;T8pLZ>@R8UCAvFgkA% z<7S7F&7ws@nG5e)nT66tA0^NrV|~eglAOt-$%IGPjH#;j;Ems)!YbIcKzW^4VODfS zr8RjYk*P*}{#}&$P4^>TY1Yb&0|IAEfsgYj%Kbt%m~EqjtgE)+3=xu5n^QKvHQDP< zKPc#8(_HH!w+mC`!gT_BGlKO2nd9U*et3OlT0*P;xLs*fhK#J@>+b(gFd;W*iP>7C z@P?B%7d6J=osxWsMG`0@%xPR`ZtG8-3DOW5eYZ0)m9vq5o8vpUu1P^h2t! zaY-I3mOj5J5|xiDAVMBfXn4N*AS|_<${T>K(ndUW3rPE|YNeNg=gtp|9QXJ2qXr+F zmHj6|H~5|^KFjmz$)fg4U^j%dyYOew2k4oVM~=_!+?eOs(2tP4$q^Te8M#;*P1^n= zlk_Uf)Yn5FdbFYYpky_jgD-5j^iiado3*vG;*j-4;kio9?lhJ6Kuh$lNFERq+cFKq zMnu!v%(l~DGK05=c(Rk$oS ztJ(F>$k3>ailww8&mQVpT))LxQgToGDL?nn77U8OMqytkf8>GbsWGSK?h{a`Q_EJ@ z2s5(Y=;6SNJzj}LMETo=K76?Z@mscTB+~#aj(E+N&Uz{R{11{WO{E&cn;=)5XTi}4cmB1je6_ICH0$qaSq4ANOsr?JMgFI)RcxL&3>V|eb0aa6 zC?OO~p}rBaL$^wr^e@!Xec**?2BK2{&JyS%t@Jo`B~AxB_t6@-2I4oONNrGIJo&+H zd#+qpXVLaECa`kTiq3bC>x#RbV$B$9nCM*5ZRem?lg<~(kk|vW7S%0ajHH?5THdS# z=aVkY60T&7K$9SH_m+=8FfKa*jPE4+ss5&kezPCOeu3aDOGJkAv&3MS%A}fA@5IT5 zpMcb_KyIER{+lLmo~2wlF2_))J$M>&cDDRY&PBDp6}#{qK^s zSM86kDH%2*``L971rPXCq2_Om1SmRo>4o%&s1gH&UsV^7FVfZEDS1=*e$(ok#P}Zn z0K*}$8n)G&9Vb~>lV~^hcgTjl#0(?)3#sb zxv~^-{rqM$UkQ26V}qK-3I&0j&!KR}k5ZtlWDMG5-YW-hpzPna2L)=)a&u`;5ejR! z4k;EnY5m@?)903*6c&@82ytnC(kt%c!6-qAXghgkCAE>Ix-j)~66Q`T-%OqQtPZsK z7;Z&y2$^~1cg9F|LTU+w^{@SkwxHo^0>yAqLd05>5H&8wIzv(7TidG`}w2Olh8RQ^2%^9NHU$CIIXYg5Tu z8g*#GbCsm{X!uYnNqo=uX3>k_I|lZFlz$;mH-16^jz{c%5Bm1~E&Q`9j2}2o!@p;g zP-c%nV`_%3q*+VhHXZ-rUjiI;9@K~w^Ac>e!vEo3Ur0a*!^K*_E-DI$2BRe*BX1yE z&)Cs^rkp7lchzM79?6+Y%ai=^Cl6NAlI3Pcq@lP`%GnTuT*ETXfGK?S**>EM`nJuN zs+n*BJ^J04*2jvQITD{tNB@@xd=lPVl5gEn*?6{39u|I{{-m#=V#B7=pjs2IGl|vriRl7E@3LB zW5Actw}dtkP1HIq_7L%gE>I?7iD7C46Fh-@sdyg1d5}fhryJj=FY5R&WTh3K*5r>* zzpm1Z+9SWN_Lty*~KW4X4~=Tz5+@*LK0glU!>Cu0{z8Sey*wz3~_AcX3882IHa z8$fj3N7$4NevjOd!FZ1e^d&{bMTQSPtFZWT6Nk)$V~lT?6EheEBJzTQ64k}U8&o>3 z1ZBYbB%0#Qvq<&itm@?c$~9g&IdSP>9DBuH%qmP+-zO7?by2f3`G#v(0%Q5L5yupy zP9z`%*N>p;-Vgg(j+Rrn2DYgKrd^C$b|It}CryNfg+gQb=O*rqiLm$UikU-GY7c$z ztOv`=#nsiBC_^mV(&X6mWHBn-QNFs9J47Fa(Ql%>C!p#KKSy+I(> z+H3oomg1>p*?Nw?jUA;Khm%gza~En*U<2C1(pc?@aWO|adliVoTNDUKa=)Vw%h)Ff;|R`{_EXXZ(u4{0Y0^5ye7KrsNSe-mu1i z+obD!Cf3~_zy38lK!i-y`n{;;Tnt&|49Jt+d(PK&!7r(V?J~;;IgBkVojG`CSk5^(g zo&2_^+6z5MwS;mMN8g}D^h13m7(@4~Or|D+7CDK|Q~Vt@|G@5nonYI-rI_WDzb?3Q zK4{<2kY_5bmeXq%t&9?$M29rNcKFM09_EMP%!=V2(LcNpWl0X&3S===Rs96I#Zku5 zGMeNfsRo6THuq$^wCq0$$Mk*6KFR5gbx$=(OE|m3l%eCksD80n{3pen43w+EvK>{&h4V#vW% zNIMd`6|8CoJf;vu&8@l;s zN+>thog|iug(mw&8fXQ`W>9T^ZK_W1Y2u80r28!B_vF_Zq1sugP947rUVg?k@BX)D&r)~Kh~FR#M5&%s^(_Th8zv7@vm9Ha;9wB->GY$>HEP;*g#k%C>>4 z2J>J&rI>R&1Y?1|jf)5eH0bdJiVf>7I~=T3U@}%wQ7d@BxG(C0o&Q=cj(lE?t{say zbNpr@`|)@7rWHS*S_~oRa2T|F)ueTV^%d~JTQ^13M|0xH#WX#*zu8FWpm+%?$$q7! zk6)DOH%gWI(R!MTgpOk$5?VBrGpYJmABLYn<5%VQz3}5CN1asm@q0e5YDynfh3qr> zazMkOKJ{Q$TCYVqE4(xaaz!?fA|&!aR=gn&0*eIWSo5Loe{9|+kU?+gy321w8K0#cxnl6U52FIh$Hk5Y^f zc~6k`L1gEO%Xe^tQAG_gpx08T*s6(5hu2)s=#IV@3enJl&eHH`Es}4sg=7DKFVlnb zO{EpKVztm5kqL2brRYu_MNg7$8~5LYVL)Z*az=~yS}t$RlA+HG9f@ZOXY@#zt8s4q zMj_I(*8Ln4O5f0PyoF6c8kademIj&FZi)NTkXFfeLRI)#a*<X@wkW=7{Hp$Y}2*cbsH=i^0QmX|mO0;Fnj?}u@ zrQy+xHI7tmbFj1f#*yN6|@v`*P zNGEUiC*W2zjNDZT&sKV&)>6%AWXpOTO2_eho%s7-gv(4>xdmpuotQ7J&F#T5%kULR zb7thROPrxt%}e|z7y!mWOm+@WHgD3D(d9`MC5cZ)$il6ypZtlzjDVO-vMS8B#hXqq zIMn9xrEDv`OfoD(1w}jYV&T)jefNvaDDH--r9xOzTN1e4ky`N(Q8p(+K-_Tp1b7j_ z3NA3dtAGYcLuB5_|D&#Hi^&vH3oCUS26sphM6hP-6&6P=XUgIk`&z+Ee%ukyJpcS} z`A`wBZ_fp8Va&jdk8ui#$QPilD8h-=5v5KGI$`%Toc1CG0NE85#}BS3age#KE80|+ zMSmeSS=U(h)rTf807Ge4C=pT4!|?TQ{wpC;|3^Z6%@<$@>;cL3#gb3*ONzMS@KH8+ zJ5aN9QA>@X#AOC8B;pM;Qk*qs0o8-ZiB*BpH#OpZ5 zv@XW;Ole=TBJw>d`$1B10nN+j`XvC}EmoVcJhuT9qOI|NQw!VG4N@od7AW8^r;dqq}y4`JqCCj5O@Gp|tegm04T z820$|&EhuMVLT?YAu3aI=%PTBQL1H!3EGrkl2+<@+5AFs5>-+bUx~(zZ7ry%OV@)9 z(facAHSsFtvSW%P7_p|gL}a=|j3xkY-%No>-1Rzn^Z1r)L{mB=P0Rj`)vk0_=zX#E1h!SBp3TFWqqc%NNZ*5BI-RE{`psvcb;dNEb?fpWL407bYx{= ztrL++U{>(y#fZ}g?|=TZj?Pv{pCIrfD^a^NqTw<&&h<0VU?chFKKs$cay2M&?RO4j zG~^@m=nft97qCQYHy)NY4wpz*fG!ygF>4sclr+QtG+k5P{Scaj3TTlpLNdd5KJ0(I z_VQVF0z5=zz383JsKzmVgo*MMqs?=OQRb=gRw)g^-{fahoF3vycUnc8{g+p{h2ez} zx`-icq42*J8^OecWt)zcEx9Rc#1{Le^V*(IL%wd0=s;xgheHQh>g&m8#O#ne7y3|I zr*QtownaWR42yT~RNcl8+Q4GLbe@Q<7e}|A2nbvZ%P^sW2qLWJ+I#VmiHTphV|juEx%- zo_`h-y5mep$F=hr`_cW7Hay{{2H9b5+Tu7u!HFQM5d~2*%cBla6$uujA_n3CK83IR zRfPWl7~F1!v)7Ei+rw}Y5UQ?enkvKf^*GKVHQ2;!aZGfX#Z1IDB=v#oPHdoaD#U78 zMy2*Z=1&#Sq7GZ4qIB*iKc`5G5@s8tt73z6-{gyGkj9slKZiIU-GrU!`WSwCc)74i1N4m0(jywtgA=5&Wgr^JN?iW{OkG*rdx7T1r5EUoU#~;f1r5Lsu{32@upaZ5>`2er1&mvoK$(A7 z+ku#LZs@0-9Va8HhnjWSD-Au^-`IZ|AyE27{i(x0i2ndG7FA z9nVZmvy0&2ea(|7N-8}=>p<|H;e^t~xyGhtvbx=4CE@*_57vf~Eu#-hOleNJhZM!e z9N8eW!!Y>2G@(4}QEML(!yGThhF1{MOo-O&5HcWSK*)ibY5>@OOVg;ul z1UYyiPrIRC%*;Gwy61?u!Fi0@e90-`uWH-=@*UI7f_+o_C774i;S&3WbKH@KfXVpkb>k6^9Z^I_-TTf8t=n#2FNMt5j!=@Zi zTWxctiH^^FQs zIHt*DNU06dGpLAdQYNi)%@)NIj4jg+7cxF*o)ylk8Lz#D_(5_(@P+HfG97G9FCf$d z2bN^)5uSNF5^1{};^Vhs9ms_g&X<99{&i@y)^%@yVvS;TUS~*bv_lo_Aev~}a7+cu zYiU7t7jy=m37IMW#d#E80}6*0`YLA_vwAH}Kg8!GCGc%S?lPq;cUWXK$-biXp-vy< zli$>+CTCuqH8+h+yXD^wr>9c`1g=D%BtfEarp?h&1X3+oQ4^kskZ7KSj*@33f=$k} zPBvgU@DXi54s7-xJi*Z0BpkC&9sO~2V#vVL+T-LH!h(k2CLieI?6-%^DH?34dayR5 z<#C)T*PJfPY;~6GJ;@YwYUMq7pmo_pY(%}b-q<2=(E7SDrXaEA1+6E;ty1?#e5LP@ zwsmMI#g)$7;ajZN{{WEh)r?>laP-RF?y;u_Y0hhg8$}N;>uzHhErgxT-%#ORC0rv+ zTmaT0Tq>D@Ylq8rDi{eidaJoJAn5+i?OZWbwCOtAV{r?_#K@6@Q51j(Qt<}`t3U{8Q#l@+XuC}|s_IyyvM>-iQ z>pDgt@ECFqaaXJ%JnGSNDvebIYelDC=xc@Rjn9>+X*NU*h#QC*%@8*bG9Y9?>L8Bq zKI!vX>|q1pK809Q_Bw0rR_@8I>2B(E^TAS*^Q>xcVg4uZglG&W{lP2n4X4nMoW`=W z%)}tlLQrUCC`(S1Z)rD6bEw#11!_=r<4PqHh8T#_y;F(m?o65OY_U4{vKq;bFXcrV z#GJ&i=J*BalCMo{52Dz}+bKOKb6bSU9jH8=_WB?`R`3vb%k+L%_{Y6Qp`QqOMF0_) z_-Pc=(33U{HH%duMNIc+6)_qJnVEXKKz+u42Gu@lLK$5HEL9h^^BMcuK!eWObb;Ep zt*5zqJ3d%`sJ#6U?L-a42a*bjI>ptdu`5mfh|RsS&kGhs)|JNYQf&oM3CdMbD+|^l zB^g>;HkgY~DKe=sDsH-~y_C^sZ@3Q-d{%(f323g_s6%&S;CM4}{RQi!nw zw2GF)p^V6Mu|dM-o```(V|hGio3-cn#E+4ZV}vRT0=v0W_0}<%)Ej9=KA1F&v!dF& zdx9TU7sKxv0jZ`k6KpvyLgQ{esclE4SZ^XrVa*-E@g_v3C0a8vO}k?_nu&Wv$FbG9 zX}4N#n=O(ff}36v;f4}cShunMBzW&^0%3SOGUmF@hXf;mbsW=9h1ZD=eI!_LpY-Y>#4ua=(SM1tOVXY$4_t$TZ!WQoh5JBwiE(Kg^VE{U6F1<*a{g>)^% zsf1gN3Y@B?>KU%@BIN<$kCZe$m=c@YaCIr-^nBRpIYSyitJ>TMZC(c88J8Ji1f8FN zje23~1Pg{XM{}&U>n>gbUnDr^@(t0oFVholtE+93uxr7=!wBbfQEis>hPW?c8C=6D zHB{aA#FnxkZmC`I191Z)21E`>g)&v-27{EWLvViwIO%mP+^T?LjxE zvc(^qdTR%8op4gwfKADkUI;GlLpJqtY@@hTppsN|vkRB<;9pbyk?ScnR>6_9ZsN8n zvuGD-04sP@m=SJf+OIm&1_BO;{5>tZ-LHC$!)T(!>>*UmQi_pMc&TNXdEyl%&g4YO zl+H0Tq)R(X)p`Ohb`em$?VOjNWg#1{;Ae@xA&1Os63Q}ayy&@eEDk-w&o*hC>l2t` z+Ol!ITSPo5Ymn+HIy81f4a5gBp6P4PNR05X7=7kiPzBhn_P7agKu}s*4!DfO%g($S zrW+Iy3Mh@x&H^nl-42kVZ;VOOOpTzG^1$X@6pbLQBQ121QVOI%+(x%pset2}AW>N7 zc0Y$W$LwM^2}Mu@UKDVb%2%vsCwn%cPh>E=36!-x_<6iTg)koKfv{9{q}{d^DrdzG zU$Sv8S4lgoVX!13+2YD3B<@6=cB{VH^+D1{Jga&6h0Wr{SjO`d>=gJD^wwp zqi0{1di_};W~!83$rTNmolbD1ODn%RCp-@#wbxFfW}rq`x-^$z?~hq3Zml*_2R`UD z_LM8wIzH>6s+MxgdL+^9k9~jnanN%bOJJ^D9ACD8v5%r4lZPa#mY^jjK4U9?^AYJdO<8_X>|J?+~wl z45ojg%I9z8En9o0S=-#D@y05BxC``?G@JAzbEIV0pX312G*B6BV+RInp^K` zt(W45+~=6&#FMgEOE);#i%q!DC?kSGtNTlbYvRCi_ELix;MUIIw%V%QgjuE5*#hCu zax*f)t8rT+4>Ydl_|V!REgMBmGjgj{)Sul5=UR(xYgLALUyU53Tst|Tq|Jzw*0lO# zegk(M5h}hI&yegE)vo^lOi2eIwX~=7wK~ZR}uNMf#Z7E$U z743Ab+v(Tf>wz!eCh~rum(4xa_o&n~=R^Z&L?d1$if*YRlnG;PD_gBy-WZ|f>P-Rn z8T=bwtaI{tbPO?Y0>h?m-KsyOAYta6FT;Xc3VP!@>P*LDXV%IcNk{X>jMPBfKzATk zPOw#_93E?;tj`M^Cj*OQ&x>e(KQW_VM73Nl(=rqI^$c#=jg} z5IRV|@kSZ&{{W5_SWAhDcHav$*&~>+i4{iR)H&7TMtFALxun(<22S#;#OBM*w=w?! zm~MuWLdZ%tD~(}=sb=@Z!qzmdcb~JnR||0p;u7g(qE2Dr7ZBR&9|1Yd;tkLa6-TaG)wB~L6h!hCLg-N;w- zSZyZhREyQEruuVIC_0D>wV3*10;v!-sSq1Fn_h^F@<5Uyzoi|fXJ#%dR7xYcs^pvD zFWWAejbU8P&Mo$XsY`RED_AmZII8v#nUQ;Iuf+(q3~?kb!Iatemihb;qNvq2+74Cr zTeqWi=L~H}sVVp6-of0}IN{Oo+P9_TLE()LBm!b;TLzXkEx%mw)P+1wxX$lFn|h(& zo}6-;=iJ&}0k0RMW(U6K=rG3V+L;@_W73Q_z)AG~0EeaX{`&s_sMI*;MT3Y23W-`G zEMrlj@y5&XHn;~7f zVzwWm3I;TGq6Xpvxdpaym8IKhmt0l7tQI`!G~TedOsy5^W#I8)O@(k1z^Q7DR8cm% z)-yHIdk(|R8pqnho)>!@93nv-rRcBXjnRw$00zWf#3i+kGpb7LP>`=4Wy&7KeeFy^ z8wI*C18Ef@l|7% z>+fNv4!n?jDf;nW?lR$bxi{qdp>7;x3*rv@QfxJ6#m7yaZyFuCYJ*DfTuAY$x5iz~ zQ;uw%unbE0P6mo#kKt{-Rc-xH-^z6S-ue!jyu@(vlhQ8NvU?iFgj_BzQ6P72;peh> z6D;8A)h^)W;6~w0A0?KzWkfHlmCtg~VeL94(?*q3ofCXPqHbNHc`Obk0#we4L`W{Z z5uTD^CxXmRfv6K>Vy4Ne^Z5jzHc*rJOzQ-fHmZoJnkp)9iW;me894#+527mP6E?e{ zb9h+#F0_z)&sALLo011U_!HJNC<4j6^~l|&WxGIK6!ET(i=5tWU6$RGAQctt#`(Ml z*A~$Bk%q5Iu+6e7raDXe#f7tb4?$)te{Ha=lFrHN+PhHfP93)>^udWedk$}NXl)_& zu7)*90@I-8FM?ZLmfq&K-p&`!rZJ`^?qc#UKY?HzDw$A3(`O;HDcm}fy@%Z3%yCpO ztQ5qGrUD0_7~KHOtp+pdotuK}hbd!wL$$#J;f;_vKcj8(j%rh%X{UC-!?M_IBMlT` ziESoE+b3=oT)bTY8*>iu$`Q`B7MuOj8sQxIh%7ddL|w_?iK|_rQ{;)LWI%AvLcUml ztuu%lhz*@w{Rt2otU&YkvLX>;6!4y2m4v@*tHQQPbLT`K&iE>Fl{FS{WTK(_Yw5Hj zUsCxOVstz@Ti^riNKMnxUpR`6Y=V-itvANm(LTd2c9`{~t=%#lBjAGl6Y`K2kg&!A zzW(>v+-K@O=IMsZ-q{f;D4pBlg{|sJ=|YcdrA0ScZ_yZ``~;mu{U4VeZp?esY8pif zro7!+j+3 z>$PXFR_yR)(TC`QpN+MV191WF9P-P~u;`*GHsF;Dhn^rzpJd`MnV_!G5$eLWrB(t{ zrsN(cT5nWfrlLDT(u^>Bf@u3M%&Q%d%2Y%|+ADRRJBOnam((xp3Q5d9LAD%Cq4AWV z%t1E<4(k!DyhnP)Fxkhhs&iK;kjbCulv`b-R)FE6*k3F|DBN**cRn1Te|95qf=y88 z@5k%LGJTA&G?O3gG>o&r-oEp*$+HUJ`5SO*X{@B%PD?9Jfy@$gR@AK_%O<=frDffg z3)%wNP3WCaJVr*pg5eK=3CpwdQW-!8i2EPlk7A2DB>Qd+r)Zj4urZ66&rCE(^omYY zf?!!GMqJ_*EAmdFgz$We-RH@SG0Zu~8!|#vDpeAdNOQt*G1$nKg-&{;O&hETq!o3| z`96wg1V}}KwAif8gKsPKV0SZ_?Zp^r&KO87=Cn%ICQh9cjcHBp+*icaM4Up;F(MjxawzC@L&{qM#3%b{Dg`q0fvy|1g{59(5kRs0Rvss1C;V zmcz~uBiG{i;}5xk+Cz70usz%(>p*g=L6#uC-N15QHvK?>@a8y~nrl?$*SGM4Z$E|^ zL>r^(pQdiwsoYEOLV1^>%zb%PhPXFAVld)mInpQ;h#d7q2TbOR<%kQUK*)gA?k_?_ z2J5~cQ95eBuLCZNzkDbA9Uy0=b>)3+q9E^23>1u?U>d>z8zd{HI{Z+L6iti9Ieyhk6VD3+t$&O8ahiKi ze*}(u3T-%_e5=fs4*s+ls~2sOT1KGe7brqDjhA^cfYnfw&JSoM^8WbusMIq(lS85H zCP_+Fa*Q`#hYUEbl5<*Ld{6DKR%inIO#Th8RU@C3VWud)(3r~ZOp#Nq6(CVPVofmf z&YR0MFND2oVYM!0nsAm}JuAHEeuyXt+gT7XVgu|ouy%QXGEfq5ZX`>h0pO!}Tc+fr zp7m|c4-5l&OkbUPVZ^J?I)JEKe|J5B4=1g^fTfk|TtuoojmLv5dXs)fIanf|d~}YA<$6sGQof>V+`;hPP!) zE`_gWqL+s^jSbwDdb&lz31-KOWjC(WRyJM10Vyi?%Bq>?2CbnTB+d4mp_RP?`yyP( z!Z9fWrFL09iuFQRK1K4p!=$9CJnB-J)pDZl${p~8&rp#X-||Fk38YN{)=R=MrYuJB zJRO4}BMsci(yR{PJ3BQf_4X*zt4#jLs&_GbEfGSy^U5nM#;RAaj24QJ2s+2np}!7% zX;dO4RIMvfPJU<=z0le1C?_yRb&dw6Xe_qvTC!v7!@XR@Wbkm6#O0mWd+2g*GGbSJ z&0W#9qNi}@n9_D$BWQrJ4Z>r8bmtx@UpKW%jIjwv9MXv=k+UHXLA?`YD%r&0{eu0~ z)*&F^O+UV*^Sna6`oYL|qQFUx${?+@R}!?Xb{9VkFQ4O68o<*BCYZy3+jNJP9_F@` z1BLQziqtfN7-Qeb&lS|xY{Td$bej{Hf01*Q=Vq z)wmlwJRK+>4%~)sX%-af8(Q=N-L@y!4JL%ZK|f1L&^FDtSvyDwd`_>$31(SiJgco* zqI|H|1n16Ao*P83Iz=_ySZb?Oifo**&lbaofr_<=4PN5(Lq4Kg(cxUHue!OBe6T{KNK|l~D5_Ll$5OK;Y|}_ihPH$^joVh;&u_+ss#!n8TV;n7<=btxj-XBJ5yDDS zcFY#c8t9%EhQ3mdw=jt?-AT!M-C8QHNz5_2R;*i~LMctj`0QR~X|5Q%0q~!S z1DEXDEt&j2TM(9Ixq!Sz(j5F)SBFyI>Af6~YFYQ&)?UeM4MyCl;$05iFqSWg;!NT* zPD{R*jaKW&3q8@0mTKb?tZwMw{KL)WZJJf z1ykgLcqW}u3o_+%>+6BcC{!kMO4ol}R5ClPJRNxy^gxazZD2=PdMdurch6t41P_^1 z?5T|Z0B7nXbSi-?NBf`gjYMc)N&rVnaJnKVE}Y5V^U@d1>@@{=h@j%QS?6)g*jq)x zsCFv>uGGdHH#@o0l!caO?x+@K)d!a&0kBU`6buKF9 zMc$mt31^+=hgxw*v!U4iUGbq_l-)toCg0WY-gdgaK*``kUDN?5QCO^x8{ZzkrIUQ+I#>}(k z7`=?%S4q{*!IkLj{m?3?8+AY7`F;NDchqVdMFgNqsh2bl$@~{>qp0(3Co=WKXPA1U z*!>f*k1u;`)r2y-Mfk%%tEOyH1=Sx9k^%iS<{cxKnjAW4hz^z=#p2O7?MFhWN~2iV zWI)_NeTFu!&&z^Rrr?fiZ`-;kE%|K^pP7@^16smTR?RODoI6}TY!8)UAYZ{|Fv;e{ z*1OR-J(Ld-eG! zkPCa^h1!>3rXRMW!N7L(eCX&T;&Fs+$vQY|?Z&bqQszFm(*xR0C;Cx_TzB&QN#DZR z)D+@MeYC>2S=njlcL#o~R}buE&YyYFCu+g(b325gfcUjo25Un*oqwqe*@N!&WqyocQC^B)v%1i<(2{7@{a4yHg(Zv*p#oA+S? z;hT`O+>1Jw2uaZXX~QXlFcUx0@@Z8FTV(881WTdCLAd@jC!KmMhx@9-yce=ux&6)| zl$%w}B1wv-=%C8P2P~M1Dy~UXP0;~;Xm#Zgj)ar0EE>PX7Sm;1;-qLY_sDJnvf@@VLe%Hi3wbhmSL#>#r6rGyXhOU>eh6X?NqCGII|l@n6lXq%FW%?a1s zuT(Nm$O0-6zUrkoM$e@nS`H9AXT-(+T6aZEo|mJ!RN8OP2zAhVA#To5RM#@m;*#+7$7+>-+^BQdPh^C$#{1DIo0EIYcwo)h+M@IT8(=4;!1B=AYl6aGd z*eEWmVycN;=@+K36qYcePq?d>DB|w$$1jPAnbIKr;6ATQZ0FCI{r+?(YRM1SonlP{ z+fgL~PA#Il!5J~~=^N8*I@^MzCSC!dC&q@k`)P&lJFL%w|A)F_d>y)0)2% zC@v3?YrNTu$V*7R<7}dcqUD@Cj^q)NUFk@JQ5GDEPqc`%Riam_H`)m@GM1A$MRf?S z)*b%$ji4Yd6O#0&)BdP1zJkyC?lv460P%g?WT^={b3YsB7 zN?xh7w{;-d#KMol?!)}W1*rcTqj7U=P?;ZW)XuOaC_d@Kaa&5V_1$c z+4@H=4zeO_PbdqwFAlT4xA8*R)S%9L5SH!!9V1=E$A} zy}(=kZ)8vF00dvC+UF+P}G;d5yb1bOS%er3LuI+L=xfDyojr z2=7Jfg>Wlya^jMDjZw4$?T9>3$K<#1{{X@V9X`#H!cy+$3Gr+sfaKy0$R12rvhYud z{{W05d@2VsLo=y!YzyMUX#p?=FVjbEr*SX36wJLAW6HY4hd4JjcL@z5>zyJPtWy~g zuJ?l1ts(}IGRZQodG3mt>!V|-+ZiJHV&Zx-&_ZE${RtWd#Tg0~6=6yD zx;y|@URj!<+(pewZh|IpI6#;{>VZO&9ennNa8IiRIEwp1TljE@Ra`)sA*oNaGTHv5|h|rzTa)!2)c&-KMh=*o32pbB&WMkcio`e_tr*QO>3L<85R> z+QbPQB5~OaN>*vAYZ!Q34>>CkEZO}nnZ?+)W|vfR4V!-s)GvI@+x`&^o1m*!Rcpa; zuRT_&Pb3d%Qt}w4B-X$=c|MmXHcW3WR%jgUQMI$YfljNgsO5{%-ftZaCJQ)_oW;fuw` zS*J1>m`}~P&ZLJ{ylcX+<{bF$1W4f4+UE~%=nSz*)RK{L+pR8&(&)x(?5h-{^vJwq zMB?!&Zd+rO`36AF+Op|lp%!W@O!unB_r=<5!Vt?Nu3VQ9CzO-H7_(h7GWJ_4J4iRu z1_lqaH!X!sJ+2#>u&lXDVAu0>8)Hy1^W`w>Hm4~|NgGZ+sv>lt7Q)1fDLW}NP6)i( z+`MV>r<)b*3r1TO*2%Rjbk@AdjYPa(S`WhC)_Z$YCY7>m;w}X_lb^vIN}>!Z-RVfZ z8xkdvJzI?xX~SP8QKl>*$8cuMk;eq~Iw{hu2*J6j*+9 ztfQLgS1o(q<^Yf8#@YV>gr>0R$$chi=NesKY=6v!zK0lMGS2>$$UUoFR;_L?8&Ywe z8Mjrl$meCu?2x9t-ir6|(GuD!pRZ*Ssy);H02#vB)S&ZC+$M0b+r4$dsc?@nFN>6O zoiz7Cqi$tMR;8UPne)IVW@YHjw20CU(aD`#7ZUP{B}(&LnN~KE)I3G*+F?x%HF}ij ziEY{6TXb}IN1dLbH#E9@TsGCV92<)3wVi$g7;Vqd-i=SQHKic-tXVQ)&1TZtydE(W zCz*OJH_SD=(>QN~?B>jjn8hTeM3mkQlC+1V1j)o=$M$Y67dB6+d1={sz(Zir^V;x5 z;mwaQ%ZB)U$rvgv)*#W+F2Q-p5H>59KKRYMwj0+YWnAgi8Vqq!#jk=cSU{38)eEN1 zw$?9kt)hzJD(}rzVO=${{s2WYBC4uLL|G+LB~ z5iaE4G$`nj4Y4polWUT6l?Ds39b96qJ{U^hXLcRNolsAye4ELuBZf=sokkE`e{1|W zuc@rXn!`~muXOY1f^P6^#zkuiLRW1eztiLp>r#5jI^u~ZV11RlQh=A6A6(g6MyQZCn*s6iy z(;20@qJbIbjW5FjUkY@|+7_hDM%Q2oH6dVGa5&o3 zToui8s#Q7QlZvR!%ubS+Zc1IF*4R4hQ3=aZxCHq%B!oya7$OKnBTDFe-g zqE=_w9j43`+SSIydNk{Tpfp@XgbT$yY=qKgeI>eiI6~Z-bxmN&%P*bL!8plI- zI}|fTOE?J9+I15GULJTyV1#My&`P?srxI-hZii`5T57^twA+fK-k)0dc4Jm=Q~61N zd<`2*!lH_ViLkZGiNvvqs|n&#gyY6K&0bqbN?cUjy-|4YF(A@LP2@Bigi$j`QBg^J z9u3i}Wz(}n4L3P)ma_czRmHZjwV2kDVz1!=CgiCrZXUC3Q>hUOo^&;Twburgu*W+@fYlkcp?_!>-u17wvX6Jmp-SfrPIl zo==O}ed%GT9n0 zeHV(&$yCmezby8X;l#oq`)bEB>7&b>OsS1AJ&aEaF(TTTu)NO4b}I+4U%H#cw2KyR z5t$I1a>0GeK(_j86L}NbGmASpj7Wom&DC?1)QF#R@1q%1po`fCa9WTC?QHo$=i5w{ z5vRG;ML^4fYfCAea#f1GU6{RTZEBjd(xRqAZe2={CH7Hh+{xlNFudij>g^4Uo*!D+ z=K7Fm>cxv8bag2=HlCu}GN+)k0Q1j9` znKR^ioQzcPFO||6skwxCT@lnZZrbtX>p?htw{qpg9mO#wre@rAs`ZjwrL?=%I-Mf)oq$&Djdgz71-z3jZH z7RLxmiIV4DeyGWb5}_{sez>-}Qt_fO)#++y*AP7Yr)-<}k$@${q<=!f%SyfM7m;a2 zT&t2+kVu%4YX`Fol(rBziu#7%n&SyL`VH!p$}ToC-@$XiZ0RaNP%Z*exK zWkDXo4(0yvJ~u`Q^e>W+g)p`SKW_IofFnOcLLFK=*t8F5*6f$^k%J0xTqY&NO1oD2VOnIrF!?LcA?$$mwn>t&6uQTu;c~qDsaRyK zL=D6RSni?cMPJ(5_Yg3&B=W~UBesisL?_(U6Lp}1CjS7T5(|Rt%TCJ;xsV{*TXNrB z{up<9T%TK#nY~a!diJ~t&j99kUzHR@9LvDxDrz;jQ9PTWYZ|*z7?jMh3WZrg6A~q@mes0XOzqwO0JIjlvAp7vlIMucD{YcC+`1O=*|wf{5k=P@I5x(( zCP|V@PURFOO9s@=sn-c#2F!+Xc)04{wpjK6_Plt%Ls3{pF^CJQf@E7;Db@b~tZ$ir z>>1C!V~!E35#3d)b=D1E?TAjvQdC7srD~~OXx7+T_8_ zlb3q85@aj%=9xsYX~V>2O~Y`9kBBY0upO3aI&yAQn&gJX5=^`ARySHS#i!=qF%dOH zttd;gUS&j$+Oho)DUW0XZTUPf+1k~%;JKGiVhh6i)VF0~&?q9+6&J#kj*&bzUwm6U zCgqwJ_6V)3WuKxpnY@k+^y(hig_Pn={{UJ9sTc5BrjK|kBJZq5c^KhIYev#8%W}4{h->+nce=Hwj!7+Cx zK?LhY8c8U0*>e$azwgCmVAB`GKjJ(tPMsou{{ZW`1L2RAO3zqx^EVRvq3&~Qxmrwe;lhupVYXkN~JQQg$Jvc}6!wx(`8T&JA| z$b~%?F>Ka|NIWS|EGTY&s!EE`7S**@>#Dh`uQEie>11Ox&Pjwalb3AP?)Rk(DO|l% zm@L7|OaZ!AT0&g^05&tfl&)E8F(MU+SQfx zc{#jLjkD~Pp7$KTz=SC2MkIu;R|0P9jgYL}tYJs1p!;Ax$Uo6PvvR~ohfCM?&wYUz z`n0+!RVan%7{hB~xMfwI~)s(h?P$rCp%FC79cp5PF=q_BRBR~)b|M`?Gve`QtzTUmX~#4Z-zTt zKoJ=Zy7lhP0nGKfHVzn=CKbEQ6jF$ago>hG6z^fmUUcg!MIs?6v*6f@jX6c=Ds!(q zZ+bU2nMHlV$V}*}ma1izUMdt-oLIMW5gm+#!aJLe*5`GGgR4NydR!v`b?i26xo4_m zsE8?@yh>g2_^^%d>X!~m(2EXEh2kgw01%8@h)ah$~cq0(czH>G2>z+%TJBsBp7F<(A zrBgLr=!xl#+OadM3K6-kK^*nu=Q+(wGE+?9=aESyWqyj-FprK=gendSxhW=w>(8LL6= zOLdgv*o)zp$?aA+i|X>;NQkRUlXg+lj>vdI8SQ#fEvfllkD9+^SP)=~U3ZbRPmv%q zEQU|>`C>Gt8nhhx;_`MqL=BkrrtY{|Wr?G+0NxWcw5=4^g>7Aw%CNp)cvkP?azgC;Qv1gBzuO;2K zpc$4AY1G~!C!`EG4mYh9hgWKFK=3mlc2TT0WOcK1Pqg`wYb+T>VzJhJ*x50GIW}3lRo+z zqn`dmv(iAz5_S-o_B(pPxjw9CD=~YFofB|d7E5b2QL5$X^g`8j^9TV_UujaPN}JO% ztX;Kn-zis|wSf^TnyhBD>gV07OgbvOq2?-_$=AI)qFSk1=Z#B-y~mWn2P<>wMK^Sv z%P}lS`>wh|iQI%z>)iD27@mixhWUAZl+2Xr$(p_-l>u8T0{8ali zUg1(Yo_%q=d9TiLEV(RIxr0`++6$@DT7DSq;o``CZ#EoXp9~uOLYqyA_FApWO7p7h z)2&u2*|ryy6Vlh-nUNOd)d`_4QNVFHyWS{Mi^}N3MQtNFHz6=4+s+R$2q#5XKNb?j zpJLXc8%t+9E@563UA0p0cdT^rUwfXwguc7i<%UzyFG5T#F4?TYu6}4lCzupY)3GJW zmnN(^_vH)K)8P}_mK&;eD}7r^zeF2ycA`NZEK?3K)im9%A#9Hw6V~yddANZ}HtUYa z$TYIlZ*1#PLf(nj3u5Bbz8;8^#c>UR)~_gAHrv+?Z%<-h9#c69Ti0t>bY#J&UHwSL z%6qBbRk&;FiaoKs#BxgbAa*c@NCkql%@lnW$0LdLy78xwLGch30V-X5bJsgzgJE^g zCBjrdPW!`H&hz*;(ns6vYwd$A+o)ZuQtzCR(&2MC^5ax7)^bZxL5mO^OLuns8ffa+7SIAv$vrfH-j0}ad5R#R-A<^g+zF)+4qA;E z>j?yf3yXbV#LHhvytz8TyxAJ-Z%>OFN{(7$dBk&Aim2j|Q-nYff2t`>sDo10Err8c z(Kpk<;=(q0xAzxfXvLkYhiQ3Az&9lAW}30WHB&T8EGOT9u~| zjdxZhLIz@J+;L9jy0r9lLp2+nw&H-I?}JwvQVdvDmAf}?^ydWIf9xMm3k@1xh&TM* zg-z+-LVmN#Jm;BeM9FJftaf8qh(;r# z0JASoRB9Wfr`ReWt!YF|`jVN%o}f#EV)#_1w_NINQ=tK28JtE*1 z>%JbXyC<{MB*0}+hX-66OgV5aQCr=0#ZT;4E?UXL2HSDFTqmluv2P_+O0M`{BEgL} zlnMM!Pz8&PRk0`NsE7(lRIhwdyfYCRIdbVUq(BB^4wz-<8`U_1CS$-|_nQnkk1%H) zk;PeeR_#SkAreAeh22qw^Xbc16l*alO)8lg@os1V#<;kWIqv~}_$ZLkgfU2rq){{SXSGUJr9Wazn5t})9S`ZHDv%GWjGMXqQ|)fF=_Z5&s; zYG{YGVwOUwz6_0$?VPcN)Dk*z)58ked0Z1&qKmxgM5Iyvr|PQTbVS@VPWd|EGW7Ut zld?LIH^^4e$W0TQB=A9LNYh#F;^OZ%$uN4tvMID&ty7iZSCq2=z8>AShn*hkERYRM=k*t}wn_voNVqk!QlU-4$ znKf~7+nVsj?)0@3xPgNz0xQ1V_L4yBfXHlJ9TwXYO{;6gb!(h;FuAT91Tr*1TB@xP z61l;om5H}Os$ovKg|;pd_e+#gmnKMw(u&-@a95&p5*9{Pw!y)xZ3w8>YjruGOJ204 zdjwAkm~}-^fe}?#de)yd2@|JRB+SoL?i`0K!i7@dJ}*Y-Pl>s)!Ti%&*+C1?R;sFs zm9LT$!P5H6qTOSv54D1%+NqYoT^*0BlgdjSph?U48z_wnxQp6ZeV^}c`mMuXR81Q@ z3|5@oa2u&q%PlzgU2ldtSu~@jnuu`eHFU!zwxfI{mh06!h)tTFs6oA4xUH&#WpdA? zP%78_oF9n1r-w~uz0A3?r&K$`eDqH@vQ^x6+zmwr*L*-;R8-~~6z}6V_F1*}3?!R< znS!_!vhe-ehsKU;(Znb0r52EoZ4??&2}xB~%1}A9#Px?n>m8lSIA&?EqjpJD`(QV< zS*)iegn{82Dre2*P0&xNGFbVf5}I++U7|ImHh2*!nslI;t-QEBTDDk`o8v-FNbI@4 zapk|C<3*{|*l5zaM1W-CqJ~T1rhL#OIYGsob6ERoAbh7@&PnvZFNMRC+;TG-_JGN> z-{u$|@n#3d| zHoynQ`{P+!Akwy*JUN0P7UmgwTRVC~ZysIrCsSEou!`%}^Zx*(7i=e?^!pEM5DhI6 zrF+z@Zikc$&P`fAJeL^WXP91tMMUn5O;QTty96+ACQWVbe2B&w#&@w!EO+ zww7LWMeE#F6U5V_ZB@Nuk=)^I{H4R<#%D^cXJY=bbHug!T$h<@)}8qw)NL2ZNf8kgRdd`v2$2yjw@A}d ziP_0!j5`*b9A-T`V@M+8!gaw%X;Hg|yW=@r*Eu%(A=1_cq=!AqH+myAw!#y6qhi|^ zBTd!c6~3lC15`G$TT|t#Yi{bN-2+1w9LU^d z`G92*8$+tC%Sx&uXGq;*CVIBi$yu0~1iOg6tf;MKYGuVr(yP14%@<@!jKVzIh!smw2)FIk7d1#G zI(lU{EIy-c7i*=T(1{A{ZF`xjdt}pU`l(mNhH9>a=MsdTR8OKh7<$f$S~M*pc7iHo zw<@QV7B`WQaf!O*(_m&wrL4Dp`l9cEZ88>C-pp;Y$!@2UKDgc4Rh-k37ACe|U9vk= z8-9|2<2{wL@@$*0>V*cbp31J|RotCX(Z}sc6qs=Y*rM8_)m5#2YzrfG>ae|#*heI= zp7|xq{J2wx_uWjs*i|bmY!1;0d8_`|=pnd)8dfd3rzHWmNfE`^u)fHQBPoKrH+`O@bX1(ftBiN2cl!nvTTucve=b9q|&D(16C zrnBgusSB%BV#a?$C~m4yLnQN4IJ+EUt+$WU8X2s3{Ms`z`#IGea5p6= zgtYpxc4aJYh~kd8vW+Nmb>#??gKRD6@fUj;Qq~XSVJ7QHdX(2th;5+S7kb6Tvl=C~ zqU760Hc=|JuZy`oXa-Z$M_7v_$O_RAE)f-~R;rtoIKDJiEiKXsY0^vu?NFj3rq@3; zBK9p?O(VG%9|K+MUbwxRQMLC=iT1T3CfXjU#7kAmT&jqdQiNMKD#h2iXS1mpvSGdJ zf7Og-#^$!El*L(mn!9MkR^+FX<$&@Fp+^KLrlj31*xKRoV+td|^|!;FBWCE8kR>aG zi)NeZu(nk?q#JAv+Jl8}7s<^V#P8v1nUo$)RJ-N*AkSW%iA{m8b40e4UUIAo&Tb|* zcu8T?O|ah5Czg?0Pr`EaJbjktTOt%qp zK&W1bS7-7m;3A28!O53&&%+&8DpM4rLBgHPeOR+0+#>BWAH=!-Ts7e@CPHO$0iYsZ z-9}n*F1?cf05ENJMjAYokx7PG%{|cAf4VvOT~+KjYe!j~Y3Y<(+XS_~^h7@qLP`QO z-dVX>M#ZGr)W=H(H$Fv04W!6{ix3=3cXs^f&QFfUr%MU|*F3Aby-~~B?2DzP4>a3R z^uTVVZX%GL3KK7Kmo2r5+_h|xSJqfinIW{7lp-68<>oIMH(HD6QhCsImY;FJ7TQDj z{p=8#LQ>O+^wC!LoHAQSpfR^Mr74KYvuKNc=*X8p0_8}m8!aP1x;bGI641ZXePeE2 z3t^Ll(U{wEIyRAXk}Z?j(Yhe}U^`c;*S;L!Rm6Hjrza7sx+XMC_^G-x$+qKbAKARi zhu%2JOH*&+N;}8}LKI|OuGavRd4&w~a3vF936EsN2>mEeY zvof-8xXs8qvRDNG6wX}VH4;=(CCPF{&wO;T&Xv+r)(ILGv@Y+X89?Jt7uvXA@a6a+ zEFU77J&LYvR>V&QcSlCOoY06qD6@!VdOm8!vr!%h8w6ENvK*mIms*(m3?0$cnQ2v) z9C5o;mSXLdOI1>o9JZ6C6t=*GpxJQuq^ZBDX$HuYA#o!^oGNcbx8&-DY%I659aHpr zYVIAsRuo==MjXK94NmE&bKo%>S3fo%r3udUrzIZ3C#Ged0ane2HWP<>F3d+ow&h06 zOAul%KUF6CA;TXxch!jJ`9w4j|t zB0&;ca?MjXF?Y_6lyzz~US#m1r(9^Yv1#{&rJK08OOqcKkTbIlU>_vf`^VD*%9W1; z3z&9r#eq{WO=8pbX}ppl>jzTJ0pG6YRn_OXx}X^ajF}3|D@mFSQncQ&c9`1|HqUgC zkhCL0L|SgHXtjm*?sZ|b9klWasUdMEU&{y|cz=FCCjxOn_K;ExxJ_cbaE z_AJfcvQiJ02;f6a0=lx+3Yi*!fcM7@(6$p|Iw3!TNu0#PuD3U;ZO{Sb8!cxddphIYRLm>iFo}LK7yqz~P&^jh9 z(=@2{#!X)9TLf(;<$;l)lk+nF05@Xqs~qgk&kKTOiD?`$;Tl`3+J#J`bjo5>=%&rx>>#CX>R(ni z(&8@-Erssr-wBWf6s-{zRWe0Np!L!!xYVvxgO3iSQ=>#r8_VZIJ6nFuwIwM!!t0%Q z8y*XIV@`ijtE(r5g|foyl})EQU)67$6|i$QpdG{}b+@q5f{Jw!5pzXtqIbQncZJBy z&bVEekF<5VqMI;J<0q{+QdkU~yt~6~$<5A-)dc=B`of))DJ_dD?c7X)S{dyxD;>++n)zDeAvYo<)tN+D4BDw+Zwtb^yd^+ z)VD;=_>^GB29+n~#MHs_z$7-X$Y3z}pwS(e;hP{{4tx1x}x>HLf1>=bpNt+uUe*Xf7p zK9uc>QaF1nF6cQ@8yxWUMJZP^bJGTd;|84KmNZ zx+Ph2d>2M1aT%eoOS*E7p9ubbbZO4?u8wHd8-huq0XAciH(l`tG}RsKgQNIX81%1e>e#qDLDBfICV(d8%HXjUf&z;K^qRVno0ECw zn?O#MeJ4Iu*InQMfZzqEneXF;h}n(=n+D+4EXo*6`sW>T4})SHl;uhln(dKjAeFn6@IC-WCcj8a;<8l zm#5*%4b5@%>T2W8lba-zttydqO4mp;F)|g_yUE+dPxXyj<*7q@UUU(nboi5*2C<%h zp-;C{~SxhbLa$tF0<3cRE_}?%vXfp;^stbE3 z(Hlc0O8C*L1_47qm^5)j2!tkP|ZQvDiFfL&g5+4=KCV zmMw^+#H*uiDl5;sD0dyKg@FqPDe)>O ztw3$9$&zsRQ6g)QbTo2k3|8J^UT%#eTUcUqD5b-72=&G7(P5{+eWYn1~F#l+i?*!4J*QZKR3-N-R^8g*o>2M zPqfQ4QPj46HSR{~Wb=E5$D!>=Xx!c-dxZTN)%3}#zYqM)uhbr-F6U^zdK_&c6U$m!sov$f4u8m<9qU#0(5=~5g)iswD%)&b zEY4_^CnjW>RRD1YiNGh-=EZMm%a}d7U(zYIsy<)>84-O1=p`*p22v3JW-wH zHO3~T@jNNeeFIwBAvW(wPyNxI;aNKH16q(CTRu?>Wpndm3h&T>O+E@cx4{|BOG-Yk zmaliB0ejh;`AN^==Pe{tEV|{wiN1rs$#iD9H?yB1F(cNaj;c6)^?%kIF67IO$v(mX zkX)(Y*~%jjYcOpztqO{b+*I0(ZBv*`9y_vgXDHKowoS;GUWEI zUWfHY)+U+{J8yL^`-A<_jf6^Je#ZppIoT89#?brC+}?Z;ZA&k)w1t~^!-w#4-~QMb z*wA|);7zJsIXqUXd%zF*u{O79^u7m%Fl3H1H1j&mSl)sqsOfaNTQDt+FW8zrhZ6P- zyR8}V>k1*l__i4;O&QCpZHtB%w_B=4er#`IxUcIl!|=82UM5Fv%!|(RVsg)yH>iZ} z5cAZr>3!YukKlq=8({qi?WWDyX}viAqu&%aYZ_tTy%56~f@sb=~zNoB27?T#tMysDOc}a#OCfF3Um&d`YFHc4#t#vlvPjd?mnN{F_(gpOz@61j| z{D>|cGk0=x=B#gf07Sf>~Qn4{{XR1nz=^7wz5OK>*k9A!YNm!XB@OW(3Whc07k(q zNieR-!|VVnivUjztYt_3inJ)ao8L)5{{R|+89Sn+>ZdAU=Y$iG3+Ud zMr9niZ|H~33u4NN!#$3km0HZrFz$OJLbfzbtxtO!yEDB|Y;O z`lIx0#e6ndUU`n(|%R_#BR_Bhez3jWTTFPRt|w87|xj++F_k4z9MCEHg0 zmd17tR2U9{=vaH(<^03`s4I4s9SP8n`UC#}8Sm?h-~Rw6?P_ZP(8(qV(89&TY*x|M z5q%0#TY+}4%@AlrlM9zko|>oLQ9t@&@P>@E32q%B^FlHi*_u8zF2uujJVx?~=xedW z@O=3UG*iWCnAZOQ`39F8!*dEr55#UL85S!gPj!HN8N}ve1YFV<8UFz4$GgQSu4pir z(u36(>u%^IJRj|f=K$1}BodR3I_%gw+lZRYj`N1!#Tn-+olPXd)R7R%lwOQq<)TS+ zs|_F8u4&D>EAqh?^tM!LjcWw@C71NX{KoAh=9fx_?XypGjZ zE26(A{4;BRq|$bxoVspB=I4p|VBEBe4kTY`rFZmxUKpR4Hj*rQNK&1LzlAdLtY790 zhU<<>68ngEMSgJDXn4CH^njNoM>0x%XrGyBZz@fT6Hoea8mC!x`O!Zz?ByCRB;u_# zXo#r1%aSKNPt3?UNQ_!-*D&dXP{^A+{G9MyJWcPAyA`~2SkzE%AWPs3B+fG;&3mN4 zeepqeE{w|(rr9r=5U(WLzrj|tQHrY7&z3dGDf?P4Bq^G?^P;%}clbI@9+Lg%&x+&* zj|!1#HUN*szAN$QKk$M|jIkubVfSiRS;jpNjT_{G%JbNg_F!RQ%I)nCe^gFDD%wtg z{{YJ6exz@b!-Jcg0RI4%%8!~U6P1tsp$k0bB{FS`a!u22;;zo<$0=Ru2?U>G4FK#w z)>*}ON;R^KO-s+t3qrxQvq8A4v;A8>Y*;!nK_5p{UfLIOA=&A6NjXui$-~9;K<&w9 z66gb)S+@Mc21V_vsbS#tqLAk<3@_xULiw7o2RWokev%Y)*DCWUpx3j1;}<*cojQiCj0vKPHVdoPS466kBxl)}wmC zX5zEbL$$LQ{Gp;zoh8E=U~_(=f*c8Q(LCs%mHq>z(%ByI!}JVi@j z0RkmP)xYC(d|1!rH~#<~ewMIke%DbX;Y*S)@|a?}V6`Mh6D3TDk|*U^ntz5KmTXAUnU+Nxv9TL=M&;T1z3)Z?eAgRn!_)jpRYe7~TNP`WB6xUWxwg>6 zi%sz}Y)LhBqV@B0#O7pcgwrfd8v{CR*PyXn+=HnV((G-@rRbLTqMSW>lxLffyIii6 z;_q6zH!jUq z?d#&jen87kQ-_{{=klx}U4*m#JJ>8rx9scxV8eJ#~qUGn6*MPvWaSG?* zY4l2_kxHGqsu+;3GTc1du8O}K%X#*pyvC5S1#glu`L6ySho-|UQ%T#y-etA~9wz|{ zhouGQS^SO&qhEuh=;`{aP~LvBr@tSL9G7i+b*ZuI;`5|nAGPB|-L zx`Jm;wYu7;jRgMy=m_K|Q0}qf3&?U>TTb_fzJzmcVsBExN~oCLwW3i_RTX@YtY0R& zHYQ-kc1@P$go7fY2GMN)09Vd~V#|HaMLUI?ZEIC{hT=x}elJupT;UemPdRYf;`rTO z4j4Z5HgrC6P{vRW$1h!-=sz2Wy^M1x-Gp0^dy?35iARYu`muY>%XT<>!7x;9ax_h% zTWwx{3}>4fjfFc>_hY(Z91dH*^RpGs8wnN~>tdH#zVXd@{4u_5S+vmG5p>m2GENb% zk$O>k$jNdRmTom?2527RD+>7}r59J%8Snx0*14mP2R0%B{ z`K!YK{JH*#%<4^y4K|ls&|YNBzos?$Y7lD#LYEFvZU-C~-{h-Wq}K!&CD{=oa?wIR z27U+^tcq2AAB--r?ZD#}grfn%HfCFfph1*D5zug1L#T#kd&H#$~I5Pa(S#-Iw z=Gobd{!nt}3f`d`CQ{)m>*9h03>xdQuA>*>~!S?qo%2lz}+;m*q8juoJKvR4MmLfG?q+IjeHT?tDpJ`}$$^Io_5?%<9|`apiDrL=?-f)`8}6j9NKoP)#x`6je=gUjo8A zuc@g9&%Z9!+i7;yg_g}y30veX@6Skj>RLy>xbH=uB@cIr4m8E@M&7XT=PM7Ak=f(b!u2md=>bSnhahfNTu2EzW3q0=2 zt7;nA{{R=yqj52Jux2@8aCK-!v(bilZt!s4CbHYvJFOdj*l%$yUZvY*1g^W9FMBo;NpjY%(*FRg zS24Q|5>S=1&3EM(=EHWhGTREPTG2V;b7T8%*ApnAWtHLk;t?e&I=bKkU7I@klbgnc z?}(=^gqz?<(1@MFoc#Og<3Q`H4dyU6SZ!XvSz>r@P2F%`$OO@ZeHtqGNq)?t_XNhG zM!K;LVGCn%acx(_3;zHk4_@pcmp}yoa5lDjR&jjT5Arn8r`!!;D}<#@V1{wO{0$3_ zO}>C?tz0{I@cDD;T@b=nhp|G()f{fcq48~R^lZXc@WV80hVx*rLLeam?^3nj26flB zbeJ=(Wp1F13!2wfw9;HgI|bvnn9f0YI%U_3v$lIce{52df5%j9hU^&q%Fz)+r<8#YTy+h=_tU1wpBF zzAOun)QcF42hv0(O^l&y;$yOL`@ktsE30bnuh>ycB<%CDL{$|`qge58F{GwAz&c9h z-P44U(HK4WbMqu@#wHAour0S{?OOhJf7Us?tGAkzOkP7RXBSJQ_Coxeif%k=ep$d9 z2yCwvcV`3Hkl*@`p3+P{S;cPdQs_V84yQ|sO1mg7f~I>^QQCp>Y;C|<`Ps&m!!{Iz z%HTSo5>s|j)4_`y*TKZ%tr2hHE>9~+`E3ep_ufK-*AB(0Y=7Nbm7i8`sgROY8|dZL z64>{;E0-7dR!(ECzbve{;)r+1U!9n`aIPLJm!MBr=+#>Vwzl52+lL-LOsV!5Wr-qm z-5qjJsoqu;_vB_imY!>jH^MxnpB!t;=~TbwXFieaN7nmk^vcgK3f*OvP_4@Ym2; zA~+z-rm>^hAwv=JrE;VLpRl~NMkR+Fj}xi!px85WTggBxt}QIv%(iNr-B9+*6J(w> zEdHwV$;#DPB(+g1y%&ZtYtvrE+bLN4(DBb@aHzRbz5Ja`Y#X6 zwr#w=;JE3y8jA85u>sVVx|#FiAX*bo1hdE`YEc0ZGNAY)muke`1-r>{n|-kZLtBo) zQu%U>Z0^K7)a1jii4jzU$WdvXw=PiDDpn$5Am@_FuV{6Or9vf2u2q3#^y{Nzq!*Pn z2k1MMdZ2kdj6a-J)L*!jDzwV59DQf0p$_YZsBHRB(VAe0%utsrlP^qFnPlR&7Ku|d zRPsWbrJD3eg%zdAGF-BNYt@^&u~2m-l5_KVV$Z53c8bvCnWEN-)eT~0k&-EV!d;$3 zl;-Dy-=t`iiIJdbrFchdU9?xLFIo}>4q@vXZtat0(k^vXT&k<+imhTakpT5^z}zlMF)T7}V_Kl5sv=`b z=SuHSHZ_)&+Nj;cr~-A8bJDTT`zm8Rs(>P!t6xg<#;DKj4?8sTa&J*nVMIo$RYXxr z!x-xp$r`0(Lmk1t-n3?A(ub}>62gGNDsOSbx+X@#DrLh5?M0#?DkqY#Y;hVEd$>2; z7Y2)wAtI+m6TuqW0WU96K~z=lYPQd^MWCwDR=-4UDP6sdI*^)lh>;ZscnYm5N|Z(4cZLaC#799BGL`I? ztO2_%(4!n;GcOAOsB2u)fh8=a<_SxOly6&aitTQ(}ZWD_Ug?rDUIEJ-tmzsEeL{ zh!)bNq={X5g)aLv+$%`NKYI?|#h;aN38rO)t}OLy&GF&>Sxe#go0yFAVKBt8-gYYL zmg{J%zWCAZ$0TK?^q7IMplV30=+@q=V{}{fqR$wcY4=+cX3%(mc@g1^q@7R6$K@6YG)d;I#txvu-VuIKf{zOkm)GQ7m1bDn3x%Cf z{I!64zbY7iTPnkho)%Z8u>3cZOz458mZJk${#!fZl{+6Un`h>?U9VzHxOoCKy-gw3 zi6@2QzQ!r@6^5>yrd4<}vK&N=r!}v>-tybXHj%c#uktFh* z7O4D>%6C~x-ryFGl3o1VwcI-1qznq9c}-rY1$$)d?w>Tmxw${nF+M% zW31Fxe-uIciw0nR)_N-1EHgyyCWZ0E>z^s(n9p+~j93PS-3{`jF@P>qtld~cgL;QX&+H@ zUbq5ip4#y}@vj@Q1EePv8;L?{=Xb)4m3{-J?Bdy|^pW6^$ke$LweWwUTyZ_=5E@Xe z2XH-+sD!Hj3xZ(KP*Zk=|6e4O=08X$scN*qS<)z!=@p}5804@c@dFr3IG^?i_rJh` zf4$DKXmU2lzp?rta`T>5wWz|9x{NTOVqEh~5K*FgjPDrcp3-+lYw~wSi*mmKW~HOm zPE?FZzg`-wHRwwvVdIIPnVqL&AP|yeSruWV`@L78gw7ZfEghX}-4?;&P zlXvmvM5A6$uAxEfr8A7*eRnYGB<`8APnH@Wc31DjIOB?|Wk87ia4wLSuGXu-CR;y) z>+^p1PBSZ6C0$5^>$4^qT?A2jAt48#ipa7gI8=kBl|G4Cs z{9}@D>CFT3vpvv=2LabnhN5DGs2D#Kpu0xDPFtFf5f0Zus1F@oQ%__OLxekiD1y1c>5wCwpvSgX>lO+3_jJQ3D9<@Z}Q zf!8-wiG+O;N;Wnl+={X3fe8CcQ*thT?DaB0G80I2G|rTQ(roSZ>J|@G8BZ?9etU?g zV!&Llgrt-w8wUy7_7Ig6%JeQPBboYE+2CShFWe;_D$oblk78s$oCG0!(XcG)yc?em zE*^4qhqajfJQHB8kT>n(p^FE+l##LTquDQJTtgaqp;$O58)PxZ!uQgFUCen;hUgt> zjF2|VkOPDraUNf9+eioEZY``7yeadwfM#Qj1l&;}GFd%tCJ#V^)bC z97K>7u%r6k#8LDjFySz2$&zg))fe5MYA9%yFSkNJPzTW+hZH!AaiRA)8r7o1o>xK$ z^dmV2627~~1^)|yq3HQt%Mqmp8~-0y$3Um=ORmhTgjgr$UcQ@DO%iJ=BoDOmu(WLS zk2W41??=b$)CCkYNz0tvKzYIRf9%ZK_-F!ZR;W{_p3)?Jq3G3Ya_9G|U^l zg1!G#97Nzi`*24ax0bDi=Iv(aPo9hkKJzatd7!*?^j`y-Zl{hql*kV~4{cmHoXMD1 z;uv`58S0K=psm8Bz=8q18@-umN4-9+e(9>-(o|7xrksp~ALY0eZi{i9r@ejCXaMFZaG zeLo5^N&EMrng3T~&m=9giSGE=#qj-ql|fVVT%rO0nsziNXq!lsycjuPI(@G0oEV1KLdZ=)1qNGu|Nf z&4y;n3UBv@4@xHJNf*ODp{QgIWuVqW`-#WDYMiD{EIqk{q4S={?O4+nAG76g91_&S z59Fi~e8&h8Eq^}>-1RUei{?n*?5xsJ!|onOV;tyv8FMGk2)yQ2noHK!9)0K;TH{1M zzgsGWJ9_c_#Hi%=hbh;WM4~Q-3wnP)6Wk__Mt4=;Z64=C$@&?nBR4Zl&$;igZS<`fAFmKOXdw4}G;!M#db?J2K@MsdT*} zBliV(i)p=Gi#a&yU$9xeVMq?MB374CxpLk5>=#N7eRF!j#WQ)Y=85bd$F$-T?9L*V zNZcFh0}}szmq zmjzH6H9FfZcatdAoh!^Zd3Rvr9bXC2ByLuqXkMOu_*vw8MZG*D*(#2|KR8#upIjee zDm?ys_IOSB=k~f6BVbCU!C5u@L&ov)+a2&wj2!-6|aL!Ber>bPlicecfi%2t4Muugeb=3i9E(kKm1aw5XBu?F#3Uo&#$STu3IUQ z!M9ofOI$&0p6PLCosYm5FFzse$s`3H{o$(0j(;~jOBCbuM3ga>IsOc}`x_5AR%j-7 z7G8E@3kt84(P)rsU9BD{B0bb^yvFy!E*m>?7x!{^rHp==lA?6U_;~W2E3x*soh`36 zPA$0_DUE4%8Wx3P=zLLnX^)IhdAD98A?UYn`5YunWPHRrx|~PMy=5#yPku7Bev#a# z(kwUjMwI+%poA0@yC%YyGepfL=3;B+H}`Oybm@eV6wT+r9#g#Lg%i^!>m2-%<&`UY zv*~{Mk3D%KvDBoMi$qU+G^48XWoiSj@8|vEgVbEFT$9K{^yDCCk10C1*}PWjV;5|4 z&l^`bKI#y|2;KSw5^;0~VqM~T5`5yx`vg{lOKB&TrRT*|J=0F*4X3Opt;7jeb&dq0 zgZ_+v+|{MS^D2xs4Q;i8XQ2xlranfq(8-(khF%cs@Mpx+Le*;XaZc}o^q(|7O8U=`N3;nsdIv2ZMme*3fI+F-YUjR;di8f zhaB?mTN2le4yQDVqTe7#>X>*4b=qOYckr*EWaeqQkgHzMt&Gs&SI+WcH-`P@2k^6Rw+&QOG^YzZc%zab2Y7jO&ZsM)labUR* zaqz`{@~miJGL?G=G$@Kb{Y}L#j|!fChJO9sN?W))a_HNBQYVAI$$HCMt072)Mw)+W zT~-RZieMe9{T#@2opYK=Ss4f`0DMht@Snf+!#OLBZLo4V)xpHoHSJsxfOpgiYVujC zEtYXWYvQE)PTP12Fk?behh) z5AfqO_{tttWcr6Q5|INc^%9F*)BI66y=lIg+)a!o@ReC6AoYA?@zP3{n_5ksi}w%@jbJiCJ!w0@2)e>`Q&F(b4n z;fOpRJNa;=2XY*&H4r*b;+l3q37LK~TTODgo%YKa5uVD85}#j3rW>iS9);yfUuiAq zDh3|Lq;gRP$WdxEII3p!_c>o7BF?vF2{51W zW29n)-Fy+lt8{1~yc}t!J3Uk8Zb2}@KVy?f@4?84Jyr&Ru&EreK1;*h`@_#O}fx6YD{ZCkGPSvzE^=d!OZ>IXIb3jb^8T3C=S$yY?4RK?bT5-SNm8@fzdyhw z)DK~B(oIAITxG5W5jK|u$|9r@*lEuioRoN%Voim0A_$cD4`J>AS#izkU7>w`_DjnH zRf@Ad8omVq#iKeQNxYQEb_AYsb19bCbJ4b0koc4gKH_T&Q3s`Yt6j^snrc+uztlYh zB+OqEfyaBll9iF&sMZiQ3di3e$MwLhw*#&td}@nU>dm9}IkG~FdkdoSR<8Z=lauE{af6nmqLF?B99&QQu-4Np< zC&KlULxK{c@a;VarWSKLKvL(7q`FIE^_e^{>&MU!_2=z5g^BNne!3n7(qH=@Hpu3K zsd0I#?t{Ox5@LLN2Ou{ZH)=rw8)ORstvav=j(;!$%XO2mYA=Li{(drjNY;=k1|y8i zo)ViU?Ziw$!})?o(qCV%HOLl$0iI>Th{sif^HDkNa#dURwzXq)hfQT5bUtSyM8-^y*^We^G6Yrcw)KaH~1$YDRTO!1J zfcd<$17cVueg9|>m=q%JLz?~A+q~VR;!urK{enS^&IO4wK(SvwEuk*4<`&_KoA)bt z^m23SS@s1sfSY%ny<+HlbzwYt6dD=tNvM0^hxIr{ECe?)xU#p5ovFW{jTniNKmoF~i6i(VuBZhvOdHH5t^Kf}=b&Bc1RD!>Z*^$Kasz;Zi_asy?osg^VSUyuIe@ zhTQqXg9=ig_ z#Cp|MGkM@>3>AT{-|GaprJp_8s<*!(kiB0Mz?&6i99afwZ{B}`WeYDq|4jyUTUQZi zTyn@xRgM8n%Do{0qi@Lv0^ud46hot92fBS@5KN)`p@M2N7-`rkjA)G*;}kg)J&Z!VZp zT&ckNW4^b{(dyAjqlZYUw+a~}b&t|O!qx-Lbl810MTO>AXiM@4>4(rWq5_*7tz>k@ zLBzrv$iufDK?BgY!{&|#M=Ld*ad+bj%f%BjJkW)lJ>-EadyTqYQk!WvKig`ibeo=$ zZLtF9gm*aD=@!F>CLNF*Z)H{&oO_Z#5PN^<_jfO@UMeO%7bIw$rV#-1Kdz!g3cTc% zs#4>4RLGVMmBUh1D0)XTE<7HFXqTP7$vh^^u)G1JBC)&44-@y*!M%B@Xzgu`*Ac5n z_|M%ru*sz(E{EZ${Yr?WzdPj+5+;xj65glmD+f6ZC9gqF{t>z`u>+1fz6W*SQ6eCk zzeu3(Ku9o*C3O#stEql{U^)Q1zc(~*fgiihY}+AW2WQWC&ChAai|!64m}OD6&Mtg* zy>P*Hpx5g3inhL+82ho)H=dtYkuNMmCl7_y(IESamN3iuZ#SATnWbt{0@aQI@FC_+U;$wE!Jv zJ5>StSbq-9!PvE$x1f)!<&k0y*vP;<+IHw;YZv$gZH@B@B6;lhZulZU&SAUa1zhg| zRCMR)ia$10u>`U&D4sTY_2x_N9}pr!tiNLRs79d{%$59nz-V9l)YFp2P7TvQZ>pr0 zrF;8HSRo}Fr1iB#hBrl#6m|dc2;>wq`S%q8=Ti!sR9$>tM8K`NaYO_21hv6lXu&3= z!C(4ohg^0v?7j;pIA?BejJ)m}lPUa|eB>%s_nmHVdCswWS-D`~BgWCd`lpo% zlJW?*cz_$pgYd$yoN%YmE>v9;{^o?cLxN4HU)DOFP<7R4KIlY=_cRuka>gwkE$7o(F#9Bl*X%lRt^VW&4LU(VwZE9A>2(+6LXuT>R;71+DzL&H~>pLlEJ;^dbK zY|?|TA1KQeQ6w8ga^BOu!^If9&B;0xCX2mK0y<=?gQ#AN%K+>xW2CvxoV#KSFpNjE`y-A0fM0bQ5bmZvb z1x*6ZEAA%|v7-@iV`ryCYq=tUQNU!x)J8pRAJuYVI6>xg)2o6CgapL)Y%IfQARZ1I_m}39W$1ecW?;gL&}$ zv_(Hucm5TvFm ztAP#JS{M#Mm_|%r^=-gX$9tfK7xgo>YY8Jv%yF*`(4x| zM#ZEU4m$P1VxRD?ohvbWJmZh`XMrcHLju3h zw>FtKc=NzPQQe7|r%jYTr{)d(`i7S(J<8nO{2|4}KrtQM8y5%c?eEIs@7X zE^-}QLF|FX#MQ&#`KEo`bsiK6xWrQj3Cxack}U%z(mQvUN7``7Z@JYp`4E`#xkN7T z>xEE99k^sU24;M8klNP)Cmp|&4?R308t7!=gjkZWK12IXB17xvkif~vIVS>Qc;Myd zkP{@VyzDW6Jb@YW8e~bJgabtN|J^wELmg zFGKg+X1GLLBHD!yFdHKR2%OA&y5tI4Gvz^2ADn?+PgjR&=rgWTu{{avCPZ|sD49fO zphv_MTq4m6joBHwX9HD~c|}=0C?XkjPO|MDQ=t)%^Qe1?s~e)?dJ*$aq+W&WBHL~> zi%}X4HWWx;1%yLLC3Ain5k&%U950>|NZV5a?oCb}`R`WRj& z;HGqo0XmZ^_q*Vuj)-z^9HW1N(S9{WR+Q)>qCOPs0r(1<$}5|IkAk)2iQf?~5_WAn zzM`agANOuyBGob*aHqe82MIWqJ!C&ByvP=gvgr7ZKvc{I6p#sIA0(W;(@7o50CsyyRIg}$S?SBilw74uQc1s?%x{VehfK)M`}6^1gMe+S(9VLlKtmGjyOd4B}` zAg!l3?Ks{U_%B%FKJM_+tB4^9n}s$piGb6d^fEylgh0qxXBLp4VtVZtZzBZUnK^2^ z35yoDcD)5YxGg~J%E)VqD3<~3aQOagzJSSx7kiX|^a;kG+4doLF9@0K|MzhD>lG^e znME5By+y8 zf_|50401)QM)%$RTD$`2w%=$2*oOTDJ(#ipxB9=9|3$O3XJT4pdVLK!M#3H+MbXe> zY5XI^fC?eK5JenCEJ8OmQ?67p-49 zhyaRA=uCnY2{`e8589m_Qvd0PQ>W`^_(m6kHs0YMFqbHJe@dVxm4FX|wbJ4J1YBdu zDH4Fuxd`7wxKwWUL;85?$|4E-z`fv6Kpt!z_<{?kgg&@N|2|-ftlj(^P2BhRI>VFb zqfJF7Y>BaZkJ_D?t$n!viKLnQ#{=D5&plMeLZoA!WB2VM?*bm@*=sfewzZJFQnC|H zO~J!W^&+B{@ZsF4$vjZk_}UCGOL7tSP^YKZeg5?7B7q=HiSh-GvPOBVb=6UX3IOg$ ziMwqs6+<(|(MVWIDumjVE17HpYCeLrs!w^~M}m_(dXYC2zwVnPb+Yf?&_-+~9MMVD zbbfd?8`K@nC(kA#I~jueUj+0XA%i(zbU(S!JUu%KW{l8Q;3DcdBbZB1!i_w8A-lNn zH3XtK;oj(L&x|D_)9JiEmdGb6hD?JCzoQ$<6%*3}>Rba*cg`EDXwA=KXdQd~SW0`( zB7yW^co|Eq1m{Zwk8qu)!sr&~V;bz?*$QygDA709i1^|0!5}Kkm~?$r7)!!hiFwIB zx=h6s^Sn6TD_YU{asQ7Fc$t&9Gg6(rNk>x_Rii1d55KMTONXy81|3so8ZJOn5-kuF z40>AlC^2;@aMNpa(^HZ>FW5xFj>x*;8^$f1k&!`b5Ms78=r^Ep9)U8=?wh`^Eken< z&+N@bQy*U7eI1mu)5>Jd)58UcROs$I6C~4;CM8Vc>PO4l9<2;P!t9Uk&iWvCizkOA zX>9MM;B~n}`GVp`T>E^Kaui;(GVN=&5ePq~er3Nl!f-m#>%-0iTiwgwb4A_eO3wwFiCsA>)!t4Bi>QHIF?%Lp;PgC3`kad% zf498>-*2P$u0WZ0C)?3mrF>6i#{=(SD6g7fgU6>e8fHv+3nDtuhr+-TZ5F=DUWmb* z0v;c1E#0BXO-Qp$MTc;YVb@_`FC&tJ>+u+X1_zesyXyOOAK?a8sgykE19FyZz)wb)H#-g)S=Q{ywE~ zp8rx|Q+^~2Ca*A^G@PGB0u8Y>r?{zMl)l?>Bsg^!{k;LX5lFQ@T}S3+?vK?nwqpAi$KQPjDPgEC0K&@7K^r@bX4R}k6v)H zPjNB3cKCqq2uY~y?x~>xmxgZ5uAMV!+|Qi`VZN701;QmwXM)1*A)x0YOh{hTl8RZK7n#in@ktJR*_C}H-3Tic z2BRPGDv{~X#I)Xt*Hi}3@G)h^RCmsRCr$mBHMKdvnqL7lb{d)Y6yGOd`xSoPOO(Pn zvyV|Ru(u)xje%p^}#`F>XW1lnC!P6Fu>i2 zc{AG5ZK#c0JPA6~>+*oA1nQ{dzJ%8f?~d1hXJSP~CoRg<{ksE6(&5WXaP%28G1N{l zz4=M92jWdr$__YPg0Agr&~>8RUvQHdiY%61q3^8dT*%?9O*2LIZXa-l z=3Q|*zcYJ}ai%S)5~>;&tPKdbZ*#rfO9^Z^bX7B_Ub!5&?Swyw@fNN6(%BWTF6B;AQQBhQZcV{Wo6nZ0imw_ zDdi<$2m5tt#B#i#h#~5Fqf3VAfQh$3jmgL_8O91SC=NzwR7vWJgynLm;{{y%m}E8l zPKp_v3zD*JDI`4_|JkaNxNt8yus6R$MZV8diMql%^qaM>`7EXBHKM21r9GL z`=3jQu0}3iclQgvrRmVr3ubQsG4|EdUPu8S`-_Fc%i$k`4=Db4V8%}mn@an`N6d}6 zr#n?3Uxod6#F)RMAap5*@*%%^_Bs&5epib*Qw3O^wkDn-i|C_ir=pmiPA_Ox``mJr z3`!3X5sxe|9nua_#D*)LV%$pYcJ4Ovtb&a$>e)>&5)ye zZ%-#x_b_qfd7vl49$)hVJHN-yy}Ct7GU56xFao{)h{T+niD$RTPL?e6u=MPb`U$TF z6{+mQv(RrC=7|X4_s0J=yV_XJlA~I2tc+s46x~+LP=%E`VszYCXrQMcFvA;RsIIxn z?`H4MiIL0IL8k^>ult6w*`y|2{ta!R8xT8aTT=}#saIjyW&|20Rvz86I{ehE3aefU zv?mk1$&ZP6tw580=isLK5WlOE7Kk@F&UOe^O!s>+*T1(akxy1oS~Z;b%eW|lv0>~5 zAKF&B!@ZAhv`%YKypf!%p1AdEh!u@*%l+VmSC-;SmxP_TWctSEGKXeie2({vbKqeU zh!d4dI5uC6VBWy=hFUUwOng=hoIhZ*;oWs6oXgNq)P(0I?MJyi^kx|oSoRoXsFuz3*u>t)IKdKnb zzx%_RlmyPEZ|a<>91rJMIV-mf4LIzape`5ww-Dm&XRh*xxZDiaN0|>JX%U|!0v@W z)jWo7>6A>~{iH;ve2zUEiM9Wa;u+ct*1laZ6V7G3{;Tn|<}4)6|D{&{Ns&(fwfz>A zhydp)=fe7Tj8zkmQ%R+mz!T%20oqN8(~r-f-C6rwcVyD^*&!uQ1XoqkA^KTN`nf`H zsc04U8bYB+>^^^)8zmS;G`h$zzK0lE9Yq;RndCXWdmqcp(=14;r4OCOd55g$?R}}^=4uw{iysYEh zbCxWjfBy1rI_7!Kltj~3ZOu`K{;M8%h0~Y;z5_~sXM4cwS!g)0Dhrv*E|(4_hAeR| z9+LM`xN=#WPMqXl>ByJcJNZ0g_JuXL`b&n$Zy+oG;jeyVnoc>IV7ghfFz?UrLA&P} z){LIGS@^PNT7Xv-(>E{txu0ypk&`{ONU#VE%DqY#t&-hj5D`0N!)KyLHkeZQABF64 zZIn3aU!RcJLrXfLX3c{>=%V%<6eax}~IURWF!lDey$oDKgdC_K_ zo1X0JGuavyr=vHb_=Lzj3@cru%}w?zzH%ljQo{Q2A>Q{7Z!6fhQ|fkw6Q(`BYF}I1 zBx|7OM>d-HE2jGb_81k2E6mS!H5C#*g9F&V$sVDrJ-`!5n1%jk1pIkv>e99U(>cvw z=NCK$BNqO!dE%S;YwMNLKFva_8$F=)^l4`7C;EzY_E53W2Ct(WeI-r()Egj(2_8$@ zTYM>4T9g)GvhBsN%W{Kv*(=uCH!q}Nq0_V{AOxBFTkgzB!)R1q(Y)6|hZV3VC!=|_ zryUrHr@YgiVc4E8iHyNLBgRL69PcqWXZ#g9e*32DabBMTgh5e@et+5++&JKxsj)zG z5wJHT?`O$#U?zIV^)Ql~*f$PQWKSxHvFEuVdKMq`AXwCPWo z<+=qNlzBSO{oaDuO2jhiV!+4ezl1dm+!2p4XgedooZM?fTj8a22FyIoWBk^pU36BC z9^rIha(>a~<*Fw>$nONb9;`?Q3^6Q!RI4@{voZD-hzVF_FQLw4mp;7U8*-uV4MhfZ z+3#ya-mk4*F61=O>Oc83&zeX~yM<>D?)%9?9<4UnMN8KBcI1Bi1e{+F*f;`)xPDcZ zh#rx-ETGi4rB+IvOt#-BzU+o0`U%jI-z+i{i*V+197)ErxvD0D2CH1MCjNOIcr8si zln$d1TIPnmgup@Gq!Sd`%yW+OrnbgE+$IwgB&1xP6~w5!i%9Xj}0XOf%fj&Xn^!slIEboqD_}?ieo;Z}t;)Z{SJX7iT0tY8vebz7Dd*tt4 z#k+;7Sx2V3Fb@+Mi4jM8waBbzXm0q6vhUDD5-Np8^aQm#L7SUwFAXNFs*bNmSy($8 z%}w-Z{|&!hx8pGfUwUzXWv~xN<1@|5Ez|=BLeCCUZC?mJ6L&w39loDt{zy-^^;!ng zVqkn7%GS~OIiSp2j6uV)pYNDGdSs|i%Lp#8^!2!l+tvSGr$|N3P|n@;DnaOi0HyOM zV|jf&IHRG|4bfK4x}|-I4!AL+=cF!9^gC*QRr;M%RozF@?cT-edBu?Jb$*XvWb2KK zE;*_}lb2@3g|px;U|O{uV1&9b{C!#7hHIZ3rsV?mdY_JOBK1JHh#|7 z2PiKibf4&Ln(O+bb8LfFHZ=rwn2nB~g9Z2b*AUeM;f&p=i~dUx_nDRH+xccbs>Ai( zADO?u&fT}6F>#h8hQXCqIX!UeVi4)8hUfjtsr^$|Yu~*%+y}RkV=19edSJO8D3$Kt z`rM!E!&up4Cf=3_Ebu5Jv}^1F<@$bsg-LBa(18eT>WVH+o0xf+O?DL?e|jHj-j%z= z`G|FQCU885@WLzNhr!?N{oIvXPs9~^pr8!(P&4FkH_NZ$+)LB(N)1K=koyW zv-%X0d=^BgG56&uMqTfLM4}R@e18NCpW4JclqPjrWOvWWtDbHO)l|;7!ut^ZbANQC zykTQ(3gT`47?~wb>dXiDl@yWmk?6A&b~AR5+qlnnzbFcjWb@*l;GCon<;s&f^|I^F z1U0Iibr%DQIlN);K_~HHxRq_{c$FY23a)g?8HOJ(_f$`#&(Bo8_SzSYt52AeDoc9A;uv(F>E%`1IH$U5J!SP-1*B2I7AnO)*vw8z zeA@#ZiP9+7adB2Yd$fKz6OcM>v(@oadC9hiT(K27iJ`Ev6X{mO)WA+cth46hK< z5_Ba&h~uRMGd}9HCw0sHBPI{SwhK%ShXkQtil=feg~C^y2H>cd^>?H!UII%2^wsSI zv;9U1s-U{;pWc?teAlvq25)JKI}L>DKcZmscHO^G0eqMGUV=MN66TD`we zZTa>Jyu4oF|N1gf5-tM|L6J>m>PRyj2j63vnvwRe=-icCA32goF%4^mZB9{bc6pp+ zjXbFUEB|2-FB$EH^@BQNXpo)zB4Jb{Lkr zofKDAGWx`352eh6rzkQK&@CIGTz}K})C-0#$cEzj9~1_5y6$=d;YBp=w(LaTup|u& zA-r$f8b^kJPSL_hUaW;=Gfb4edUwW-{mQNDuHWH*pdXi&plkm#H@W_G@RGis_S5np zKk`hS>BGM?*3ha>!2YF5!i+p9!B%+Fw_(Q;;))-}!H5BCm8niFE< zxFCVHG9DCl(Tvby^bs|t!!Vjj;2?rlXcCEfmA@>B9?2`P&TE1n;HX{MWhSQ8#t{Ik z)Cfr|oRonTX+8H8X3U0;H(bXzV9QJ%S99)Ie=FN$7+u+s=Y<(7x4yPjHbQXcTOjnh z3r&e;5J0v@D?*TmjH2OLrMKqUx%X4Hvko7h-YYSjI_M`m_k(qW3cp5wnxTb|Opp-+ zgampYc6ASuqDb}*y>K&|6E3bHG7CiQ>w^wII*6{*9{FAQ%!Nm(<0y6L^dTU2C&iRh z;(qpZs=Mq&7;0a)VNAW(9qIBCP~j3V+(F@^<^gK+)rMN|%S@{?xb)!gVYgHRG)9Z6 zJAE>NfS(NR`k%2S5#*Qf@L80EHKL33K%gIja3pXA;rd5T79asr#3maM(%^Yqj~^+j z)oHp1Zez602HIOWt?u0o`8o)?SW1P9!TX!&F%J~yqMFm0e3+-Ilb>o?`QjJ)^^SZH zT|QaO206r2q43=WJw%`Gzz)9Cy63HKYRo)YLib(sE24BmVA*FeFpp{%H+4w)#Zx#= zXU&#p37joPUzNdG8vC7eyWk(|~Ym%aL(Zp%!#>iCZsSx;X>C6CheK=JMQ5pX4 zP|IzzJO2)O2*vG4qV_C{rMk?dP zYP|KCRsYTxSIBy(vPP^{2En(8`F2YhO6aX=evSTUaIqe@LF&BQ3z;b@q130)C3{&< z6|RUuX1XSFIDhhu)n-f+<_!2{9t_7BA`2vRLyeWX5)C`y{*dO+Bc!NZgwhAdH0zP? z=4G15r(Ot5GCq?=PoHpRWgpxDE6XHb@C;gn|44Ex3W6Jdv=8*ajpGDd`;n?ZSVF^r zfTONFN6{|y&;GV;OWYALIK2G-8w-}vWDMr%~cUMZIv z(dcuhCZA3Vo);6!2SMdafq}cod)_0{FabCE>@r%5+Sy-*$l=Q<-Zq=s!s%@vVn6iO z2?<4$#bkm5RK8I-c=J>S`sU?8djtq`0j8>sq8{mw!nlJ4_!|m8l=Bel- zOuHu8821pj-6+zwbEEa{4f32Ungdzqv$i7Ir1u3F|2QI4hA?p*`7i|1$0uG8`+?x3 z{}um%d2y4!eBU5Xyb<{;6#Wv>n1$%g%EvWmmJ+hZS*7g#qlp}mMnTymZ~T6G^C3^< z44p3}IXFdbDTH{WkT}VEAiy(?I4LR@`Q2mTu(XVZE=$w$i7Ht+nX0HvipFeyD|-a7 zVGj}d(pa3rZ*Y(9U_OMo+0>|Cb?W)V1tog30UF*u4+rPe5r6Hr65vkSk@|tl%$X&Q zti9DOS;Z#$hFX`duUaKmuo+0XC8`*7e}}}*k+1O5n@=xB%n7e{QUfz*p$~_v^~j1{ z0b}2xzLVAU&pk0yjUD>!a~QwAgR%QgHJE-AS1&`@J=4^CL5Ih9jX|V=)>VSiEZp^{ z`)@F1z^mB6@vI@c8chxH#4%e>eue9ZrxciOAWKZMoVyZ0hy0sj672MoD1 ze-_n@iPJNYvE1Ix=4e-bZtfT2XS4ri5Wi!0hZ7r2o%K9%9@aNT<2vrA;0ix~xt*S) z>WRqxz3YacKhI%|tw3MN-p9ZD`iSqvS~2fDR@qfcH&>tA%5lkoK5K4~*hSeReS5iM zn9k&$*CzAKJ-G>+nCR7y{QlGjWdC0Fucxg&@HiyPHhxr|)&bFV-%7_4)2QIRV8XAz zos*yU#$xGV>F{4A| z?WTT!PP05@td+m^bo4H!v*W+)DXHjwQHh;av~A5_f5udlAT11C4r&h9=XLeT3HT%7 zf0kSyDXtoIWba-yUn=-p)w%1YLE^jh3oI=EB;cfDW*kOc{jP80|3kXI-rkGfpV9pX z+X-3+97VT$BiZ?B0}fQ+{-epFDA?AK^Vu`NZpF+$qW^lgP*L zUCLWg1~mSACSqp{XMh8I9kq4i4mhS3+t_tCRpj_AG-5`4WrCvkAfdbXI6s?*Hguw+ zDM_~-5wSmu&xm3wW0vEz;9lI(Q8qGLKA-U??InwE5en$#@>Xmi?o7Ge4>UnUCL;Ql z_JmS)Am_~3d;JS2!izgDZnql-IDXzBaxBR3SK-rN&D-X}n&fx1PUdF?wp|&(o3CRd zfiCG(w$5r@u^IcID4-be-8yzX;W*g7BEPh!v*P>W_3?2_bQS08-}aHqL>&k6;NRs1 z>+9vmZ*5!2FZz=4-);5oj94JH9L?6ZCGWX(tR0gz%eTI)vcb%2t{7SE)8i(1cSk4d1{dlimE5pC614xC?!So{AiKcHx`O8~S z1wu5V^!27J2F+@n5xo7{*_?Po2o%C|%4g7}+kZ5ZLiopt;mQYtd9=K5>$b#D;`g84 z2gH_T$XVmjF==mN!s#l>_&AM8m0l7x5wY3~w#|uIb8QAiCY77^!_jvx?Yb`dvExxGvD~S0ujc$Lxr>UVqw6f69Mab!KgJ6ENHi;ecYkpq-f3+wi75Mejd%&! zGw(-qZ}Zv{8Rg5}8k-zMpI&YB>4{-t+Z%s}Yo_?~G^4pxkaM+*FXi&C5?hd%_L^6- z0$hDQKWN~`X{-Xi4D&pH6sGt0*oxo~#HV!QkJPJ9?Y754G0xev$S;ls&;h9E0)m>g1ki99(aV9ca>Key8D z`>7iYN56S29`VFQ;4Ti%e5$?s{ii|O1ZDs`3!fKzOJUT>IKCA~%%%lqSsvKFmVLqO zyC82%K6L*GGU zw>f$Y{VlTw#wdsHbmghpF1w7&%s(6s+a@~xOlZ&Tlb{CMdi`9W8>lZYIGgc20-(-Wb)yFtj0)94Opon*69a-t6 zLJe4mB)eL}VfAf0jYI}vI2k9r8`6kPCdsbXaHI(Jz|+4tm8^Q;u_J}!7$a&j9S!08 zhW={B^C_NYmjlMZuVbNca4xyiEyN%I(RlS5O^pr@A0*26!M~3bQtFGh_Qh_&_mVz{ zQ28EYjAO(=`vY|KOkOn;44#n`AjOiUI0Mbrr;}|)T z?BCN3SlwNu`G*%Y8?m1V_!W1X+&4YjN?(=1DcYC;@-_xdng>Q((4;%4Est>>J5jIA zQk?MJwrpXz4YO^w)+;;SkKj-dM@qdu@*!rQ5X$eS1KyVqQ{t-OCmC-nX zx&8A@!gG*D34(#p4i**mI~{@R;3CPYr#E5$MmpC)Pc!Rw+`|=AOmgy{n03#*G}dx-6#Y*&M!lvZwO%u4 zFs(lL5cveR0og6yW_E~t@}MA*y!zIJqBZ&H^U%*5!9~2^hHPLdVh?5It%-X`b47qF zadW(cQZKSO3NPGDb7LNbKgeH+9h$4vSKfd3$?tgFAIx91KKeP9qIXNeD=InVOxUl+mVUh9d*bvZ&=z=wB zsH32mmsK`IbgBY)d>wr)ztonbZ%24`lWn22=HL^SQhUJ5JuigqzNC=OQ|)x5!b2qRK+udJNf$ zXZHOUk5|SriWfwg4Sv%TEcVe9W5q@sbXC5i!3>+%v1Y-J-B}C=$5#oh0Xc|Ynt#%p zRtc=zC=Q;7rvmW#U2wULpN7P}>?9eswgOD>b#ez(5^rf)(A?lQ_s^8Rw7li%O~voZ zi5&SZyvxL}(#;~S8Pwe__(X`~Tz|?~yxdoz1N$^l>>wQP*!Lh}iA`*Ay$KscB6t6p zdM1t(ZoU+g{-ryN@Q??63%r0zwNXary;}O-&T2!95SOGT+q~J$?)7A!vMdO9Cx75U z3rBUlJB(P~I3mTuMcoP?q~+#Gbzi1HvGMykor{9eFSB`w-SSM<>+6Kpfrw@H2bKj6 z+D&fwTL^BK&B>W%oDH^!qV;-K)2u&e{+%xm@twl4*U2^~kixSxn8#$xERNK3jpGs% zv1K;z<625rg3M405*OKSE!<4~p4x>xWznB82@%6R$iJQ~BnXGK+^oO%-_RKq(86H^ zr;z->Aszv#0*pg7Nsf)Hv7I>&Dh_If<)wwbt^k_xbZrKxEM#IJDqTV1xv22N4 ze>^F#nvSKG;A!<-gTFjxar)wRTbxO4R z^QV3w&tWKnWusrrkMdE)bdUy<*F*(_A==D3(5ky4%x)lQiu~q!waj$mO4CQh*dx2G zWtieXYT2c$0v*C7Rp_!-S?&o649VmJ)hd96M(2$PBwT6p)1)9K<>RR6K?7 zXwqiuY?pK5{pv|0tzyh3v~ZJqcF;AD@=q$|8CyD)(9R~cU27|%;IpDbEo1EAaH+l9 zSc@TV%wILCy{l1!xkRJM#R|%+0|?i}H)|`w8TL(3-x%=lWPLc@ z<%qX{Kc&Kw)g|&ods2eRC;R-+z0(Jxhe-Jzp1_=(;B`MrsKhPeN5eqMYq=Gg9DjZj z0TRa^vI=-nF?kAm*|uPq9-OfwARqKgIR_W>a`+LjnL-KCFycj@=J_zl{W&-_e`1pW zH5h@h5+bhqr2cbv*1ll$(D!Cjn>*^we~p<3*lWLAwU;nXQ?j%Na>F}WcE5AXC3^;H zT#nHDqQt27OkJvcp2)TK{x)pPqI8qhLYS|EYJ#V5^N zYifHT+U8kHv3v}RSiozCzjG1xudKvpVCyI=+xXMrHlIX!&(l-Cn7mmjSe;UIF5}Yr z6i(bz&Jn^}K38@wW7d+N3?rF=uTMFz1IJ&H5z;?$RK~PgkON#c-*Mv}FdN~RF(VP; zBy>B=&A$d~mNvz8Oj@(tqsGjwkeS1RE@iPQYD!!e>)tRsPZu@6W`4x`(kGVAE{mUB zE$jEjE@3ZEoFXeYmtBgNsC47zne4Kt6~5<+0kE8zoySKiR%sO`YvsIx_s5C}vH~sZ z%0ufj%8tiFC`WjQCxhwmLT0YBz{zLPi$oA;yF1a@Mr*p0W%N`r=#75iVUg(au@fJl zAK5Bn1>}4wOuXR^?(mG;TBl93sqY%W{}NWkqHjGI@in>ueT^tbYJ00@W8G}(sC8=! zitxYfd)V=lo*@v}Xt7O0@mU1wnTb=eUmcWgx)TfSzzNclw*^1>G?#wIIuLWx%ue#s z@&+EnPUaflaZq{!*h7XO7ArmjEB9l6B-~Mia zm@uiIn+juUxgsU2T;|?}<&;>s4ZnM{&eCd36l5>Zx`h~AEccTV!phGfo1eu|I6^%o zJrFawKh9rCS((R37XxSh+-LmCC>Uyt?#~trX{u!h7c<8=C-LwmRj;El&Ove0_n7NL z;Q3K0C7gxlaTgrPv`{VvEY|J0)knnCPnv2ilBSKPcF7 zwmmVpB!1yuB6*!fM~&}UJ+@kxs({uR{|JfLxMDqYmCJCV&jPd=f576(HAS&8LV@L{ zKx^@t33(jHnm{Gjy__8uY^;MK&;9#P2ZTw5G1_>?(pJqnJJHtxD4V$uCKdQqp9acj zUi2UwtoT`fUqUrI=u80nOF+jhV_u4(GBiKSq;QblMj!XGn^U=nOcl(NAK`R@)mj%Q zsaj40;6G2l5SF4NW>FVaEOYKx(BFJqXNfc*Y7RNFEhQNq)VccqWsu@#xWu)8;^YbW zR1=Zt?T#5CTtbof^%$pnBpG$TKDT;N7qs&C%A1EBmLp;z?7HdfezYqNrMLPovmgRWt1 zsoGgr#TA0>b|Am{b$Wo#&tkGLRC`%@EfTNN};PRA$!|nYl*NcP9#(EXssdtX|>#ixmGm@hY=)NRL!Y zq`|^wmTyWNwj+KK$$~pFH?QYCxx9N1wdSVtCFq3@U45!9VypQeCk{)wcJU%I3Wf+# z5hv1M$>92mYIEv?gDGXVheE%u>G*!*A%|Ca@~CT14TLrRvEhC?F@Tk}yGRts8Vo*3 zWfz<{p6IH0{KN5{C(igl693aufzr?KkxXTu6%xVRFdqtpNF0pUC>7zstV4yM(0He? zEase5q15}olc{Tz=OyMLhnS^|G|knXUptY62rKznwy7-0BD9v}K5GyjK+33$7udeD zb6OZxS$ky?QU$Y0+xf*&@|qG?9MWx<5}GTj#~f6n8i z&-E!7PppsNq|a8SFBK<7G_3ZIDGsCBtz+GKg!q@L9O)x8+<`bgW?iCg(ou+VyTyZri`}QeRQ}~fgwGV;HvL)J_xAJK_1x76| zm<6(iZpb1QYW8;zbXvl8XKo%7Z4gz~jn)gg7u8OgpjbQ>#RiG`-l&{HIqDt!W7;P= z-@;u8+W%t8Ke2r8FwzKrV*1?w5URB z)mQsepy?l`*oS?@ab3T5uRfIBO8ziGqpdj^%JD6=JpEIsX=J=w`OtJ*g&L)ITX{)W zEMh(HRiF9quGzvF0zZpB1B6$|iB3;qIGn4fa$~o=*#$=Vp%>H7wo#$L>DfIeJ=32M zPI@1k;&}2dZ=;tY*?Bdg%+z>r{_st|3vn%qsfUg#VkR?X-#d7>y?lUd!A#uoWW8Y{ zv!rGqRC&3s5wv|tJvVppIs!?`@=;Vm6mW?8G@XoZQOxWV7Q1Ux2(|uHdRF}c>`%gE ziApiz&^>C?+19a!&fUYHt#8hQ*R=H zld%zLCZa**tGrj{Tn+}eDD#%SwoFuudi)D>-UZ{cwuZb!zq@FI{Ln2IWm^{NOT5>M z6Pb5<9E%UT@>4AWH0sYOZQ3t)+<)ibtwc4mFp~JJGKak*`=yj|(%P`3>Xu_kPwYF} zZ)tu1ia(VyI#@GHacxwvr=p70J-06V=-|KGJ@gDv!H>+ne1~KIJ0N~{Yaa9{SB+kn z=tB0*s~7viYRh1TBEa1}RF3BOpZ%-M8x^KsbwoC8d=$D5ero+GRu0r@IG&l@)9}u; zADF-i!$WgL*uw;r4|JU~14n#vl7H)@!b$mlXNG(==FCj;kCXDRN}d!E`dDsEW*T+> zQ+;<#ov4)Dfv(rzWVn%a$G4F#!}O=Sw}aV{jlntR8`7unc8{SSyHm%EjJwk%X(rx! z{yN4RS+@cj2Nr4ktsfY6i`L>_vHY6IIVUdU8rc4kooXR8?Ww7>Df?qPjnGc|b0f{fH8*;2a;QySANhRp6O^yn7OM*ZA)bh8{87;Eix?wnN zRcXwXP;LH}OW7t$UfgXjEj_d}Lw_f8ekL^Rvu#Bx-LW}^iL(1 z6cCsVS=)ZMT&sGYi;A}iaZ!qF@;u;Ey9H_uK8C7=xB|In6nqGceJq3_sxF4vrl6uB z@PVa5^7~v&TuEu5QBwI%^C|234X2 zOYNuc82^KCi3;t%o4;)o{iogV^hL&TMWOkbW3~)*YfXI?_Dk6Gf!j8j8)( zYq>P>$uZ}GBPQw+NMly8U?vyq8m)S+QUi90IFg9uSP6_DF;sU&o?DqAt3KTG3t;** zr17w+t_R*sVwC6KUS}J?54sfvQ=F!n8IGfu1ty>%k9sD#ds@sR)DIu|kXI_khI5ec zCq3|A2bw{izRZg5b3PFVc1Lvrn;)G(XFa1VPYl8{)pqYk@3fqUkJBwG#)r$F@g}f# zhCXa+$YwN1ioP)WYt1IB_&h7#2?>nA9|&LweB0}OK;t76mX+yr^lhIcU{F_ zQmY8J9t6VJ!nLTaoQUQW+?IU!X)XWG-s5WVf!gg_?+KbFgLCI}f0?(j`Qs5=^Smzs z1=Br=lbH8ut*qL3#NK?`OY_zDACATc9aw4xy5192!+fX>V+A>}_I%MV-XrQXeLCGp z-!sOPXL=8DqmLfwxb0R_!|h7fr$YBSQ(V0z_WbB5p(`Y0VJcSI;jDZ2>9$dm^_ZW{dj7`t;olYdgxwo5yfW zDOJnP+lh{v7#kayHz(HT?p6U+BGyAKdTnOZ8?dYzjoRl1uvz_SlTBroO8qL&u{?50 ztiSI5gPe{W%SG45lq>UZzGd$EPxq>BLDfqpp<}3us?f2WGU!}Zblv1`^OwlxAxT01 zPzu0?Da}0mwW-^f68lyDzAVTnI3wuq_x{Fouilyc{3^#$B2QIwN4ZGY(&8uN^}I+!KsAZPYz-GW-}+TJ`z$$#5k2UXIWA{O0qVvhwuj*K6Nk)5Z=E8(Nxz z1bKkdy(tJ_uAT{!PA9{a6*D*+Q}kfy#uQVF`Q^K5lqPIxlMlJQg=$IhdOk4MJ5y7J zcPN5bPLi(3%4U*^p)*Q#nTPu4k_h}&9p>gm=K&QcJA*L$l@E=r(HYzNhxwiOu^&)! zN6}8!a$+A)FpmFIIEn^~$vjThKztPx{1EX82o=Swdk8{`8JmhCsJ#FMLW#zBeI@3INyl6&+J(cw|281qN{bRj;$+IX{uL)miygpdQ^sT z@rKN4;ZHeo1E?J_ecojbqU4k@IRhk+VSK~|Ld!K@q}(oD(vQdahFu6q2rWwx730-v z9pjlY9<Dx?8KWdQp(;u5_`+Q0CGx{bGO;T z#2>)j&0m@njQ3il5y%$y-uZqDH70rEz0RFrxB8^CFK$YDP-+QPtug4m&}=d`hoR+a zV7`p1cLb~+b;|)%tJu>nWs=mm0>F9{2fJ8)nmGZmqtYhS^+-#*QZWmFP*n*Ks!{{j ztoX3{KnWO9`;h(K%+(rRF}NXq2(*Q<6CW|AI;NiHwD*4d-?o5x6euuQK#E#3CRqtj z00gKsK!B=80u-;*aNz0GjsiQeh_Mr}tKx?0O~?U&p*3guHVU}0MEt8+Z*XNJ!ddjW z0TJ*bAOc1mH{jm<_g$cbzvU)APjo}14afzu_ifX@YLW>Ka9Pf~=#Xn=1 zOrTi*R%n%{+H-C`!a15Yl1+LciE)^G>zF4~0Ux&dHVPw472?2|lh*m?@&YKG5{VJ5 zV}eXnX)1~xcOSPO{#zk3R=-id6dcED-!s}}&J0CjQItFpkUaDy7q2Hh-y!@hToG?L5iMs$>g zkdje(cH%^~wdNW&?&_p`UCsp+I^#knZ6_wIEnwRuc24;wLlf>Wq^AnDUGs4h-$aQO zfHW#qKHEQbY@a;b3z)DE6b))%=?D-Hiz}TWoQ8^VBJGue2C%mXBIBY}BO#y1oK??M1^8!1OQKvu`TLKRa+Eo_o$Zr4vf8pUlM+@w(QgMjKJF9a^S3qLm z9PQ@`EkT)F7q#REQnzI{?bb-}juRQR?<82oWk5_i$y{I@!0S5nI81aPyqp;)rvN&F zQ}Uw1=9~tV#bUUQf-}lQWCDG4;uIz_?&?MhJdv4>F)x8XxjG$Vyqd<8V&BO4?=jKH znDfi3DAS8s=>e)}>}RQ7sUV~$I|{SC430yPp8O~b|H4mC-d{jLb}GiY`U9Y3{y(4D ZIcDMS&LgEgX}y2tW=580o*THu{XgQR4!HmT literal 0 HcmV?d00001 diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/src/assets/logo.png b/driver/js/examples/hippy-vue-next-ssr-demo/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43 GIT binary patch literal 6849 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 literal 0 HcmV?d00001 diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-button.vue b/driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-button.vue new file mode 100644 index 00000000000..00c06a74eb8 --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-button.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-div.vue b/driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-div.vue new file mode 100644 index 00000000000..f0a3aa4ea1e --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-div.vue @@ -0,0 +1,324 @@ + + + + + diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-dynamicimport.vue b/driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-dynamicimport.vue new file mode 100644 index 00000000000..1b231d3702e --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-dynamicimport.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-iframe.vue b/driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-iframe.vue new file mode 100644 index 00000000000..36a57aeeae0 --- /dev/null +++ b/driver/js/examples/hippy-vue-next-ssr-demo/src/components/demo/demo-iframe.vue @@ -0,0 +1,126 @@ +