1
0

vite.config.ts.timestamp-1678272846346.mjs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. // vite.config.ts
  2. import { defineConfig } from "file:///Users/alvarosabu/Projects/tres/node_modules/.pnpm/vite@4.1.4/node_modules/vite/dist/node/index.js";
  3. import vue from "file:///Users/alvarosabu/Projects/tres/node_modules/.pnpm/@vitejs+plugin-vue@4.0.0_vite@4.1.4/node_modules/@vitejs/plugin-vue/dist/index.mjs";
  4. import banner from "file:///Users/alvarosabu/Projects/tres/node_modules/.pnpm/vite-plugin-banner@0.7.0/node_modules/vite-plugin-banner/dist/index.mjs";
  5. import Inspect from "file:///Users/alvarosabu/Projects/tres/node_modules/.pnpm/vite-plugin-inspect@0.7.15_vite@4.1.4/node_modules/vite-plugin-inspect/dist/index.mjs";
  6. import dts from "file:///Users/alvarosabu/Projects/tres/node_modules/.pnpm/vite-plugin-dts@2.0.0-beta.1_vite@4.1.4/node_modules/vite-plugin-dts/dist/index.mjs";
  7. // plugins/vite-plugin-tres.ts
  8. import { createUnplugin } from "file:///Users/alvarosabu/Projects/tres/node_modules/.pnpm/unplugin@1.1.0/node_modules/unplugin/dist/index.mjs";
  9. import * as THREE from "file:///Users/alvarosabu/Projects/tres/node_modules/.pnpm/three@0.150.1/node_modules/three/build/three.module.js";
  10. import fs from "fs";
  11. import { join } from "file:///Users/alvarosabu/Projects/tres/node_modules/.pnpm/pathe@1.1.0/node_modules/pathe/dist/index.mjs";
  12. var unplugin = createUnplugin(() => {
  13. return {
  14. name: "unplugin-tres",
  15. buildStart() {
  16. console.log("\u2728 Magically generating components...");
  17. const outputDir = join(".tres", "components");
  18. if (!fs.existsSync(outputDir)) {
  19. fs.mkdirSync(outputDir, { recursive: true });
  20. }
  21. let indexTemplate = "";
  22. for (const key in THREE) {
  23. const value = THREE[key];
  24. if (key === "Scene")
  25. continue;
  26. if (typeof value === "function" && /^\s*class\s+/.test(value.toString())) {
  27. const outputFilePath = join(outputDir, `${key}.ts`);
  28. const template = `
  29. import { defineComponent } from 'vue';
  30. import { ${key}, Color, Vector3 } from 'three';
  31. export type SizeFlexibleParams =
  32. | number[]
  33. | {
  34. width: number
  35. height: number
  36. }
  37. export interface Vector2PropInterface {
  38. x?: number
  39. y?: number
  40. width?: number
  41. height?: number
  42. }
  43. export interface Vector3PropInterface extends Vector2PropInterface {
  44. z?: number
  45. }
  46. export type VectorFlexibleParams = THREE.Vector3 | number[] | Vector3PropInterface | number
  47. let ${key}Instance: ${key};
  48. let instanceProps: string[] = [];
  49. export function normalizeVectorFlexibleParam(value: VectorFlexibleParams): Array<number> {
  50. if (typeof value === 'number') {
  51. return [value, value, value]
  52. }
  53. if (value instanceof Vector3) {
  54. return [value.x, value.y, value.z]
  55. }
  56. return value as Array<number>
  57. }
  58. export function normalizeColor(value: Color | Array<number> | string | number) {
  59. if (value instanceof Color) {
  60. return value
  61. }
  62. if (Array.isArray(value)) {
  63. return new Color(...value)
  64. }
  65. return new Color(value)
  66. }
  67. /**
  68. * Tres${key}Props
  69. * @type {Partial<${key}> & {parentInstance?: ${key}}}
  70. * @memberof Tres${key}
  71. * @description This is a partial of the ${key} class, with the parentInstance property added.
  72. *
  73. **/
  74. export type Tres${key}Props = Partial<${key}> & {
  75. parentInstance?: ${key},
  76. /**
  77. *
  78. * Array of arguments to pass to the ${key} constructor
  79. *
  80. * @type {Array<any>}
  81. * @memberof Tres${key}Props
  82. * @see https://threejs.org/docs/?q=${key}
  83. *
  84. **/
  85. args?: Array<any>,
  86. /**
  87. *
  88. * Object's local position
  89. *
  90. * @type {VectorFlexibleParams}
  91. * @memberof Tres${key}Props
  92. **/
  93. position?: VectorFlexibleParams
  94. }
  95. try {
  96. ${key}Instance = new ${key}();
  97. instanceProps = [...Object.keys(${key}Instance)]
  98. } catch (e) {
  99. }
  100. export const Tres${key} = /* #__PURE__ */ defineComponent<Tres${key}Props>({
  101. name: 'Tres${key}',
  102. props: ['parentInstance', 'args', ...instanceProps] as unknown as undefined,
  103. setup(props, { slots, expose, ...rest }) {
  104. /* const cleanedProps = Object.keys(props).reduce((acc, key) => {
  105. if (props[key] !== undefined && key !== 'parentInstance') {
  106. if( ${key}Instance[key] instanceof Color) {
  107. acc[key] = normalizeColor(props[key])
  108. } else if ( ${key}Instance[key] instanceof Vector3) {
  109. acc[key] = normalizeVectorFlexibleParam(props[key])
  110. } else {
  111. acc[key] = props[key]
  112. }
  113. }
  114. return acc
  115. }, {}) */
  116. if(props.args) {
  117. ${key}Instance = new ${key}(...props.args);
  118. } else {
  119. ${key}Instance = new ${key}();
  120. }
  121. console.log('instance', {${key}Instance, props, slots: slots.default ? slots.default() : null, rest, type: ${key}.name})
  122. expose({${key}Instance})
  123. function append(parent, child) {
  124. const regex = /[A-Z][a-z]+/g
  125. const propName = child.type.match(regex).pop().toLowerCase()
  126. if (parent[propName]) {
  127. parent[propName] = child
  128. }
  129. }
  130. if (props.parentInstance) {
  131. append(props.parentInstance, ${key}Instance)
  132. }
  133. const preparedSlots = slots.default
  134. // eslint-disable-next-line max-len
  135. ? slots.default().map((slot) => { slot.props = {
  136. ...slot.props,
  137. parentInstance: ${key}Instance };
  138. return slot;
  139. })
  140. : null
  141. return () => {
  142. return preparedSlots;
  143. };
  144. },
  145. });
  146. export default Tres${key};
  147. `;
  148. indexTemplate += `export { default as Tres${key} } from './${key}'
  149. `;
  150. fs.writeFileSync(outputFilePath, template);
  151. }
  152. fs.writeFileSync(join(outputDir, `index.ts`), indexTemplate);
  153. }
  154. }
  155. };
  156. });
  157. var ViteTresPlugin = unplugin.vite;
  158. // vite.config.ts
  159. import { resolve } from "file:///Users/alvarosabu/Projects/tres/node_modules/.pnpm/pathe@1.1.0/node_modules/pathe/dist/index.mjs";
  160. import { lightGreen, yellow, gray, bold } from "file:///Users/alvarosabu/Projects/tres/node_modules/.pnpm/kolorist@1.7.0/node_modules/kolorist/dist/esm/index.mjs";
  161. // package.json
  162. var package_default = {
  163. name: "@tresjs/core",
  164. description: "Declarative ThreeJS using Vue Components",
  165. version: "1.8.1",
  166. type: "module",
  167. author: "Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)",
  168. files: [
  169. "dist"
  170. ],
  171. license: "MIT",
  172. main: "./dist/tres.umd.cjs",
  173. module: "./dist/tres.js",
  174. types: "./dist/index.d.ts",
  175. exports: {
  176. ".": {
  177. import: "./dist/tres.js",
  178. require: "./dist/tres.umd.cjs"
  179. },
  180. "./types": {
  181. require: "./dist/index.d.ts",
  182. import: "./dist/index.d.ts"
  183. },
  184. "./styles": "./dist/style.css",
  185. "./*": "./dist/tres.js"
  186. },
  187. publishConfig: {
  188. access: "public"
  189. },
  190. keywords: [
  191. "vue",
  192. "3d",
  193. "threejs",
  194. "three",
  195. "threejs-vue"
  196. ],
  197. scripts: {
  198. dev: "vite",
  199. build: "vite build",
  200. preview: "vite preview",
  201. test: "vitest",
  202. "test:ci": "vitest run",
  203. "test:ui": "vitest --ui",
  204. coverage: "vitest run --coverage",
  205. lint: "eslint . --ext .js,.jsx,.ts,.tsx,.vue",
  206. changelog: "conventional-changelog -p angular -i CHANGELOG.md -s"
  207. },
  208. peerDependencies: {
  209. three: "latest",
  210. vue: "^3.2.47"
  211. },
  212. dependencies: {
  213. "@alvarosabu/utils": "^2.3.0",
  214. "@vueuse/core": "^9.13.0"
  215. },
  216. devDependencies: {
  217. "@tresjs/cientos": "workspace:^1.8.0",
  218. "@types/three": "latest",
  219. "@vitejs/plugin-vue": "^4.0.0",
  220. "@vitest/coverage-c8": "^0.28.5",
  221. "@vitest/ui": "^0.28.5",
  222. "@vue/test-utils": "^2.3.0",
  223. "happy-dom": "^8.7.1",
  224. jsdom: "^21.1.0",
  225. kolorist: "^1.7.0",
  226. pathe: "^1.1.0",
  227. "rollup-plugin-analyzer": "^4.0.0",
  228. "rollup-plugin-visualizer": "^5.9.0",
  229. three: "latest",
  230. "unplugin-vue-components": "^0.24.1",
  231. vite: "^4.1.4",
  232. "vite-plugin-banner": "^0.7.0",
  233. "vite-plugin-dts": "2.0.0-beta.1",
  234. "vite-plugin-glsl": "^1.1.2",
  235. "vite-plugin-inspect": "^0.7.15",
  236. "vite-plugin-require-transform": "^1.0.9",
  237. vitest: "^0.28.5",
  238. "vue-demi": "^0.13.11"
  239. }
  240. };
  241. // vite.config.ts
  242. var __vite_injected_original_dirname = "/Users/alvarosabu/Projects/tres/packages/tres";
  243. console.log(`${lightGreen("\u25B2")} ${gray("\u25A0")} ${yellow("\u25CF")} ${bold("Tres")} v${package_default.version}`);
  244. var vite_config_default = defineConfig({
  245. server: {
  246. port: 5174
  247. },
  248. resolve: {
  249. alias: {
  250. "/@": resolve(__vite_injected_original_dirname, "./src")
  251. },
  252. dedupe: ["@tresjs/cientos"]
  253. },
  254. plugins: [
  255. vue({
  256. isProduction: false
  257. }),
  258. ViteTresPlugin(),
  259. dts({
  260. insertTypesEntry: true
  261. }),
  262. banner({
  263. content: `/**
  264. * name: ${package_default.name}
  265. * version: v${package_default.version}
  266. * (c) ${new Date().getFullYear()}
  267. * description: ${package_default.description}
  268. * author: ${package_default.author}
  269. */`
  270. }),
  271. Inspect()
  272. ],
  273. test: {
  274. environment: "jsdom",
  275. globals: true,
  276. threads: false,
  277. alias: {
  278. "/@": resolve(__vite_injected_original_dirname, "./src")
  279. }
  280. },
  281. build: {
  282. lib: {
  283. entry: resolve(__vite_injected_original_dirname, "src/index.ts"),
  284. name: "tres",
  285. fileName: "tres"
  286. },
  287. watch: {
  288. include: [resolve(__vite_injected_original_dirname, "src")]
  289. },
  290. copyPublicDir: false,
  291. rollupOptions: {
  292. plugins: [
  293. /* analyze(), */
  294. /* visualizer({
  295. open: true,
  296. gzipSize: true,
  297. brotliSize: true,
  298. }), */
  299. ],
  300. external: ["vue", "@vueuse/core", "three"],
  301. output: {
  302. exports: "named",
  303. // Provide global variables to use in the UMD build
  304. // for externalized deps
  305. globals: {
  306. vue: "Vue",
  307. "@vueuse/core": "VueUseCore",
  308. three: "Three"
  309. }
  310. }
  311. }
  312. },
  313. optimizeDeps: {
  314. exclude: ["vue", "three"]
  315. }
  316. });
  317. export {
  318. vite_config_default as default
  319. };
  320. //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiLCAicGx1Z2lucy92aXRlLXBsdWdpbi10cmVzLnRzIiwgInBhY2thZ2UuanNvbiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIi9Vc2Vycy9hbHZhcm9zYWJ1L1Byb2plY3RzL3RyZXMvcGFja2FnZXMvdHJlc1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiL1VzZXJzL2FsdmFyb3NhYnUvUHJvamVjdHMvdHJlcy9wYWNrYWdlcy90cmVzL3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9hbHZhcm9zYWJ1L1Byb2plY3RzL3RyZXMvcGFja2FnZXMvdHJlcy92aXRlLmNvbmZpZy50c1wiOy8vLyA8cmVmZXJlbmNlIHR5cGVzPVwidml0ZXN0XCIgLz5cblxuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZSdcblxuaW1wb3J0IHZ1ZSBmcm9tICdAdml0ZWpzL3BsdWdpbi12dWUnXG5pbXBvcnQgYmFubmVyIGZyb20gJ3ZpdGUtcGx1Z2luLWJhbm5lcidcbmltcG9ydCBJbnNwZWN0IGZyb20gJ3ZpdGUtcGx1Z2luLWluc3BlY3QnXG5cbmltcG9ydCBkdHMgZnJvbSAndml0ZS1wbHVnaW4tZHRzJ1xuaW1wb3J0IENvbXBvbmVudHMgZnJvbSAndW5wbHVnaW4tdnVlLWNvbXBvbmVudHMvdml0ZSdcblxuaW1wb3J0IHsgVml0ZVRyZXNQbHVnaW4gfSBmcm9tICcuL3BsdWdpbnMvdml0ZS1wbHVnaW4tdHJlcydcbmltcG9ydCBhbmFseXplIGZyb20gJ3JvbGx1cC1wbHVnaW4tYW5hbHl6ZXInXG4vKiBpbXBvcnQgeyB2aXN1YWxpemVyIH0gZnJvbSAncm9sbHVwLXBsdWdpbi12aXN1YWxpemVyJyAqL1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGhlJ1xuXG5pbXBvcnQgeyBsaWdodEdyZWVuLCB5ZWxsb3csIGdyYXksIGJvbGQgfSBmcm9tICdrb2xvcmlzdCdcblxuaW1wb3J0IHBrZyBmcm9tICcuL3BhY2thZ2UuanNvbidcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbmNvbnNvbGUubG9nKGAke2xpZ2h0R3JlZW4oJ1x1MjVCMicpfSAke2dyYXkoJ1x1MjVBMCcpfSAke3llbGxvdygnXHUyNUNGJyl9ICR7Ym9sZCgnVHJlcycpfSB2JHtwa2cudmVyc2lvbn1gKVxuLy8gaHR0cHM6Ly92aXRlanMuZGV2L2NvbmZpZy9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIHNlcnZlcjoge1xuICAgIHBvcnQ6IDUxNzQsXG4gIH0sXG4gIHJlc29sdmU6IHtcbiAgICBhbGlhczoge1xuICAgICAgJy9AJzogcmVzb2x2ZShfX2Rpcm5hbWUsICcuL3NyYycpLFxuICAgIH0sXG4gICAgZGVkdXBlOiBbJ0B0cmVzanMvY2llbnRvcyddLFxuICB9LFxuICBwbHVnaW5zOiBbXG4gICAgdnVlKHtcbiAgICAgIGlzUHJvZHVjdGlvbjogZmFsc2UsXG4gICAgfSksXG4gICAgVml0ZVRyZXNQbHVnaW4oKSxcbiAgICBkdHMoe1xuICAgICAgaW5zZXJ0VHlwZXNFbnRyeTogdHJ1ZSxcbiAgICB9KSxcbiAgICBiYW5uZXIoe1xuICAgICAgY29udGVudDogYC8qKlxcbiAqIG5hbWU6ICR7cGtnLm5hbWV9XFxuICogdmVyc2lvbjogdiR7XG4gICAgICAgIHBrZy52ZXJzaW9uXG4gICAgICB9XFxuICogKGMpICR7bmV3IERhdGUoKS5nZXRGdWxsWWVhcigpfVxcbiAqIGRlc2NyaXB0aW9uOiAke3BrZy5kZXNjcmlwdGlvbn1cXG4gKiBhdXRob3I6ICR7cGtnLmF1dGhvcn1cXG4gKi9gLFxuICAgIH0pLFxuICAgIEluc3BlY3QoKSxcbiAgXSxcbiAgdGVzdDoge1xuICAgIGVudmlyb25tZW50OiAnanNkb20nLFxuICAgIGdsb2JhbHM6IHRydWUsXG4gICAgdGhyZWFkczogZmFsc2UsXG4gICAgYWxpYXM6IHtcbiAgICAgICcvQCc6IHJlc29sdmUoX19kaXJuYW1lLCAnLi9zcmMnKSxcbiAgICB9LFxuICB9LFxuICBidWlsZDoge1xuICAgIGxpYjoge1xuICAgICAgZW50cnk6IHJlc29sdmUoX19kaXJuYW1lLCAnc3JjL2luZGV4LnRzJyksXG4gICAgICBuYW1lOiAndHJlcycsXG4gICAgICBmaWxlTmFtZTogJ3RyZXMnLFxuICAgIH0sXG4gICAgd2F0Y2g6IHtcbiAgICAgIGluY2x1ZGU6IFtyZXNvbHZlKF9fZGlybmFtZSwgJ3NyYycpXSxcbiAgICB9LFxuICAgIGNvcHlQdWJsaWNEaXI6IGZhbHNlLFxuICAgIHJvbGx1cE9wdGlvbnM6IHtcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgLyogYW5hbHl6ZSgpLCAqL1xuICAgICAgICAvKiAgICB2aXN1YWxpemVyKHtcbiAgICAgICAgICBvcGVuOiB0cnVlLFxuICAgICAgICAgIGd6aXBTaXplOiB0cnVlLFxuICAgICAgICAgIGJyb3RsaVNpemU6IHRydWUsXG4gICAgICAgIH0pLCAqL1xuICAgICAgXSxcblxuICAgICAgZXh0ZXJuYWw6IFsndnVlJywgJ0B2dWV1c2UvY29yZScsICd0aHJlZSddLFxuICAgICAgb3V0cHV0OiB7XG4gICAgICAgIGV4cG9ydHM6ICduYW1lZCcsXG4gICAgICAgIC8vIFByb3ZpZGUgZ2xvYmFsIHZhcmlhYmxlcyB0byB1c2UgaW4gdGhlIFVNRCBidWlsZFxuICAgICAgICAvLyBmb3IgZXh0ZXJuYWxpemVkIGRlcHNcbiAgICAgICAgZ2xvYmFsczoge1xuICAgICAgICAgIHZ1ZTogJ1Z1ZScsXG4gICAgICAgICAgJ0B2dWV1c2UvY29yZSc6ICdWdWVVc2VDb3JlJyxcbiAgICAgICAgICB0aHJlZTogJ1RocmVlJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgb3B0aW1pemVEZXBzOiB7XG4gICAgZXhjbHVkZTogWyd2dWUnLCAndGhyZWUnXSxcbiAgfSxcbn0pXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIi9Vc2Vycy9hbHZhcm9zYWJ1L1Byb2plY3RzL3RyZXMvcGFja2FnZXMvdHJlcy9wbHVnaW5zXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvVXNlcnMvYWx2YXJvc2FidS9Qcm9qZWN0cy90cmVzL3BhY2thZ2VzL3RyZXMvcGx1Z2lucy92aXRlLXBsdWdpbi10cmVzLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9hbHZhcm9zYWJ1L1Byb2plY3RzL3RyZXMvcGFja2FnZXMvdHJlcy9wbHVnaW5zL3ZpdGUtcGx1Z2luLXRyZXMudHNcIjtpbXBvcnQgeyBjcmVhdGVVbnBsdWdpbiB9IGZyb20gJ3VucGx1Z2luJ1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnXG5cbmltcG9ydCBmcyBmcm9tICdmcydcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoZSdcblxuZXhwb3J0IGNvbnN0IHVucGx1Z2luID0gY3JlYXRlVW5wbHVnaW4oKCkgPT4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd1bnBsdWdpbi10cmVzJyxcbiAgICBidWlsZFN0YXJ0KCkge1xuICAgICAgY29uc29sZS5sb2coJ1x1MjcyOCBNYWdpY2FsbHkgZ2VuZXJhdGluZyBjb21wb25lbnRzLi4uJylcbiAgICAgIGNvbnN0IG91dHB1dERpciA9IGpvaW4oJy50cmVzJywgJ2NvbXBvbmVudHMnKVxuXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMob3V0cHV0RGlyKSkge1xuICAgICAgICBmcy5ta2RpclN5bmMob3V0cHV0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgfVxuXG4gICAgICBsZXQgaW5kZXhUZW1wbGF0ZSA9ICcnXG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIFRIUkVFKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKFRIUkVFIGFzIGFueSlba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnU2NlbmUnKSBjb250aW51ZVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIC9eXFxzKmNsYXNzXFxzKy8udGVzdCh2YWx1ZS50b1N0cmluZygpKSkge1xuICAgICAgICAgIGNvbnN0IG91dHB1dEZpbGVQYXRoID0gam9pbihvdXRwdXREaXIsIGAke2tleX0udHNgKVxuXG4gICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBgXG4gICAgICBpbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgfSBmcm9tICd2dWUnO1xuICAgICAgaW1wb3J0IHsgJHtrZXl9LCBDb2xvciwgVmVjdG9yMyB9IGZyb20gJ3RocmVlJztcblxuICAgICAgZXhwb3J0IHR5cGUgU2l6ZUZsZXhpYmxlUGFyYW1zID1cbiAgICAgICAgfCBudW1iZXJbXVxuICAgICAgICB8IHtcbiAgICAgICAgICAgIHdpZHRoOiBudW1iZXJcbiAgICAgICAgICAgIGhlaWdodDogbnVtYmVyXG4gICAgICAgICAgfVxuXG4gICAgICBleHBvcnQgaW50ZXJmYWNlIFZlY3RvcjJQcm9wSW50ZXJmYWNlIHtcbiAgICAgICAgeD86IG51bWJlclxuICAgICAgICB5PzogbnVtYmVyXG4gICAgICAgIHdpZHRoPzogbnVtYmVyXG4gICAgICAgIGhlaWdodD86IG51bWJlclxuICAgICAgfVxuXG4gICAgICBleHBvcnQgaW50ZXJmYWNlIFZlY3RvcjNQcm9wSW50ZXJmYWNlIGV4dGVuZHMgVmVjdG9yMlByb3BJbnRlcmZhY2Uge1xuICAgICAgICB6PzogbnVtYmVyXG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCB0eXBlIFZlY3RvckZsZXhpYmxlUGFyYW1zID0gVEhSRUUuVmVjdG9yMyB8IG51bWJlcltdIHwgVmVjdG9yM1Byb3BJbnRlcmZhY2UgfCBudW1iZXJcblxuXG4gICAgICBsZXQgJHtrZXl9SW5zdGFuY2U6ICR7a2V5fTtcbiAgICAgIGxldCBpbnN0YW5jZVByb3BzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVmVjdG9yRmxleGlibGVQYXJhbSh2YWx1ZTogVmVjdG9yRmxleGlibGVQYXJhbXMpOiBBcnJheTxudW1iZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXR1cm4gW3ZhbHVlLCB2YWx1ZSwgdmFsdWVdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVmVjdG9yMykge1xuICAgICAgICAgIHJldHVybiBbdmFsdWUueCwgdmFsdWUueSwgdmFsdWUuel1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgYXMgQXJyYXk8bnVtYmVyPlxuICAgICAgfVxuICAgICAgXG4gICAgICBleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQ29sb3IodmFsdWU6IENvbG9yIHwgQXJyYXk8bnVtYmVyPiB8IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xvcikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgQ29sb3IoLi4udmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb2xvcih2YWx1ZSlcbiAgICAgIH1cbiAgICAgIFxuXG4gICAgICAvKipcbiAgICAgICAqIFRyZXMke2tleX1Qcm9wc1xuICAgICAgICogQHR5cGUge1BhcnRpYWw8JHtrZXl9PiAmIHtwYXJlbnRJbnN0YW5jZT86ICR7a2V5fX19XG4gICAgICAgKiBAbWVtYmVyb2YgVHJlcyR7a2V5fVxuICAgICAgICogQGRlc2NyaXB0aW9uIFRoaXMgaXMgYSBwYXJ0aWFsIG9mIHRoZSAke2tleX0gY2xhc3MsIHdpdGggdGhlIHBhcmVudEluc3RhbmNlIHByb3BlcnR5IGFkZGVkLlxuICAgICAgICogXG4gICAgICAgKiovXG4gICAgICBleHBvcnQgdHlwZSBUcmVzJHtrZXl9UHJvcHMgPSBQYXJ0aWFsPCR7a2V5fT4gJiB7XG4gICAgICAgIHBhcmVudEluc3RhbmNlPzogJHtrZXl9LFxuICAgICAgICAvKiogXG4gICAgICAgICAqIFxuICAgICAgICAgKiBBcnJheSBvZiBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgJHtrZXl9IGNvbnN0cnVjdG9yXG4gICAgICAgICAqICBcbiAgICAgICAgICogQHR5cGUge0FycmF5PGFueT59XG4gICAgICAgICAqIEBtZW1iZXJvZiBUcmVzJHtrZXl9UHJvcHNcbiAgICAgICAgICogQHNlZSBodHRwczovL3RocmVlanMub3JnL2RvY3MvP3E9JHtrZXl9XG4gICAgICAgICAqICBcbiAgICAgICAgICoqL1xuICAgICAgICBhcmdzPzogQXJyYXk8YW55PixcbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIE9iamVjdCdzIGxvY2FsIHBvc2l0aW9uXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAdHlwZSB7VmVjdG9yRmxleGlibGVQYXJhbXN9XG4gICAgICAgICAqIEBtZW1iZXJvZiBUcmVzJHtrZXl9UHJvcHNcbiAgICAgICAgKiovXG4gICAgICAgIHBvc2l0aW9uPzogVmVjdG9yRmxleGlibGVQYXJhbXNcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgJHtrZXl9SW5zdGFuY2UgPSBuZXcgJHtrZXl9KCk7XG4gICAgICAgIGluc3RhbmNlUHJvcHMgPSBbLi4uT2JqZWN0LmtleXMoJHtrZXl9SW5zdGFuY2UpXVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgY29uc3QgVHJlcyR7a2V5fSA9IC8qICNfX1BVUkVfXyAqLyBkZWZpbmVDb21wb25lbnQ8VHJlcyR7a2V5fVByb3BzPih7XG4gICAgICAgIG5hbWU6ICdUcmVzJHtrZXl9JyxcbiAgICAgICAgcHJvcHM6IFsncGFyZW50SW5zdGFuY2UnLCAnYXJncycsIC4uLmluc3RhbmNlUHJvcHNdIGFzIHVua25vd24gYXMgdW5kZWZpbmVkLFxuICAgICAgICBzZXR1cChwcm9wcywgeyBzbG90cywgZXhwb3NlLCAuLi5yZXN0IH0pIHtcbiAgICAgICAgIFxuICAgICAgICAvKiAgIGNvbnN0IGNsZWFuZWRQcm9wcyA9IE9iamVjdC5rZXlzKHByb3BzKS5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvcHNba2V5XSAhPT0gdW5kZWZpbmVkICYmIGtleSAhPT0gJ3BhcmVudEluc3RhbmNlJykge1xuICAgICAgICAgICAgICBpZiggJHtrZXl9SW5zdGFuY2Vba2V5XSBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgICAgICAgICAgYWNjW2tleV0gPSBub3JtYWxpemVDb2xvcihwcm9wc1trZXldKVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCAke2tleX1JbnN0YW5jZVtrZXldIGluc3RhbmNlb2YgVmVjdG9yMykge1xuICAgICAgICAgICAgICAgIGFjY1trZXldID0gbm9ybWFsaXplVmVjdG9yRmxleGlibGVQYXJhbShwcm9wc1trZXldKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFjY1trZXldID0gcHJvcHNba2V5XVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgICAgfSwge30pICovXG5cbiAgICAgICAgICBpZihwcm9wcy5hcmdzKSB7XG4gICAgICAgICAgICAke2tleX1JbnN0YW5jZSA9IG5ldyAke2tleX0oLi4ucHJvcHMuYXJncyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICR7a2V5fUluc3RhbmNlID0gbmV3ICR7a2V5fSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUubG9nKCdpbnN0YW5jZScsIHske2tleX1JbnN0YW5jZSwgcHJvcHMsIHNsb3RzOiBzbG90cy5kZWZhdWx0ID8gc2xvdHMuZGVmYXVsdCgpIDogbnVsbCwgcmVzdCwgdHlwZTogJHtrZXl9Lm5hbWV9KVxuICAgICAgICAgIGV4cG9zZSh7JHtrZXl9SW5zdGFuY2V9KVxuXG4gICAgICAgICAgZnVuY3Rpb24gYXBwZW5kKHBhcmVudCwgY2hpbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gL1tBLVpdW2Etel0rL2dcbiAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gY2hpbGQudHlwZS5tYXRjaChyZWdleCkucG9wKCkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgaWYgKHBhcmVudFtwcm9wTmFtZV0pIHtcbiAgICAgICAgICAgICAgcGFyZW50W3Byb3BOYW1lXSA9IGNoaWxkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgXG4gICAgICAgICAgaWYgKHByb3BzLnBhcmVudEluc3RhbmNlKSB7XG4gICAgICAgICAgICBhcHBlbmQocHJvcHMucGFyZW50SW5zdGFuY2UsICR7a2V5fUluc3RhbmNlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHByZXBhcmVkU2xvdHMgPSBzbG90cy5kZWZhdWx0IFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgID8gc2xvdHMuZGVmYXVsdCgpLm1hcCgoc2xvdCkgPT4geyBzbG90LnByb3BzID0geyBcbiAgICAgICAgICAgICAgLi4uc2xvdC5wcm9wcywgXG4gICAgICAgICAgICAgIHBhcmVudEluc3RhbmNlOiAke2tleX1JbnN0YW5jZSB9OyBcbiAgICAgICAgICAgICAgcmV0dXJuIHNsb3Q7IFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJlcGFyZWRTbG90cztcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cG9ydCBkZWZhdWx0IFRyZXMke2tleX07XG4gICAgYFxuICAgICAgICAgIGluZGV4VGVtcGxhdGUgKz0gYGV4cG9ydCB7IGRlZmF1bHQgYXMgVHJlcyR7a2V5fSB9IGZyb20gJy4vJHtrZXl9J1xcbmBcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG91dHB1dEZpbGVQYXRoLCB0ZW1wbGF0ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoam9pbihvdXRwdXREaXIsIGBpbmRleC50c2ApLCBpbmRleFRlbXBsYXRlKVxuICAgICAgfVxuICAgIH0sXG4gIH1cbn0pXG5cbmV4cG9ydCBjb25zdCBWaXRlVHJlc1BsdWdpbiA9IHVucGx1Z2luLnZpdGVcbiIsICJ7XG4gIFwibmFtZVwiOiBcIkB0cmVzanMvY29yZVwiLFxuICBcImRlc2NyaXB0aW9uXCI6IFwiRGVjbGFyYXRpdmUgVGhyZWVKUyB1c2luZyBWdWUgQ29tcG9uZW50c1wiLFxuICBcInZlcnNpb25cIjogXCIxLjguMVwiLFxuICBcInR5cGVcIjogXCJtb2R1bGVcIixcbiAgXCJhdXRob3JcIjogXCJBbHZhcm8gU2FidXJpZG8gPGhvbGFAYWx2YXJvc2FidXJpZG8uZGV2PiAoaHR0cHM6Ly9naXRodWIuY29tL2FsdmFyb3NhYnUvKVwiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImRpc3RcIlxuICBdLFxuICBcImxpY2Vuc2VcIjogXCJNSVRcIixcbiAgXCJtYWluXCI6IFwiLi9kaXN0L3RyZXMudW1kLmNqc1wiLFxuICBcIm1vZHVsZVwiOiBcIi4vZGlzdC90cmVzLmpzXCIsXG4gIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC90cmVzLmpzXCIsXG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3QvdHJlcy51bWQuY2pzXCJcbiAgICB9LFxuICAgIFwiLi90eXBlc1wiOiB7XG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiXG4gICAgfSxcbiAgICBcIi4vc3R5bGVzXCI6IFwiLi9kaXN0L3N0eWxlLmNzc1wiLFxuICAgIFwiLi8qXCI6IFwiLi9kaXN0L3RyZXMuanNcIlxuICB9LFxuICBcInB1Ymxpc2hDb25maWdcIjoge1xuICAgIFwiYWNjZXNzXCI6IFwicHVibGljXCJcbiAgfSxcbiAgXCJrZXl3b3Jkc1wiOiBbXG4gICAgXCJ2dWVcIixcbiAgICBcIjNkXCIsXG4gICAgXCJ0aHJlZWpzXCIsXG4gICAgXCJ0aHJlZVwiLFxuICAgIFwidGhyZWVqcy12dWVcIlxuICBdLFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwiZGV2XCI6IFwidml0ZVwiLFxuICAgIFwiYnVpbGRcIjogXCJ2aXRlIGJ1aWxkXCIsXG4gICAgXCJwcmV2aWV3XCI6IFwidml0ZSBwcmV2aWV3XCIsXG4gICAgXCJ0ZXN0XCI6IFwidml0ZXN0XCIsXG4gICAgXCJ0ZXN0OmNpXCI6IFwidml0ZXN0IHJ1blwiLFxuICAgIFwidGVzdDp1aVwiOiBcInZpdGVzdCAtLXVpXCIsXG4gICAgXCJjb3ZlcmFnZVwiOiBcInZpdGVzdCBydW4gLS1jb3ZlcmFnZVwiLFxuICAgIFwibGludFwiOiBcImVzbGludCAuIC0tZXh0IC5qcywuanN4LC50cywudHN4LC52dWVcIixcbiAgICBcImNoYW5nZWxvZ1wiOiBcImNvbnZlbnRpb25hbC1jaGFuZ2Vsb2cgLXAgYW5ndWxhciAtaSBDSEFOR0VMT0cubWQgLXNcIlxuICB9LFxuICBcInBlZXJEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwidGhyZWVcIjogXCJsYXRlc3RcIixcbiAgICBcInZ1ZVwiOiBcIl4zLjIuNDdcIlxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYWx2YXJvc2FidS91dGlsc1wiOiBcIl4yLjMuMFwiLFxuICAgIFwiQHZ1ZXVzZS9jb3JlXCI6IFwiXjkuMTMuMFwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkB0cmVzanMvY2llbnRvc1wiOiBcIndvcmtzcGFjZTpeMS44LjBcIixcbiAgICBcIkB0eXBlcy90aHJlZVwiOiBcImxhdGVzdFwiLFxuICAgIFwiQHZpdGVqcy9wbHVnaW4tdnVlXCI6IFwiXjQuMC4wXCIsXG4gICAgXCJAdml0ZXN0L2NvdmVyYWdlLWM4XCI6IFwiXjAuMjguNVwiLFxuICAgIFwiQHZpdGVzdC91aVwiOiBcIl4wLjI4LjVcIixcbiAgICBcIkB2dWUvdGVzdC11dGlsc1wiOiBcIl4yLjMuMFwiLFxuICAgIFwiaGFwcHktZG9tXCI6IFwiXjguNy4xXCIsXG4gICAgXCJqc2RvbVwiOiBcIl4yMS4xLjBcIixcbiAgICBcImtvbG9yaXN0XCI6IFwiXjEuNy4wXCIsXG4gICAgXCJwYXRoZVwiOiBcIl4xLjEuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1hbmFseXplclwiOiBcIl40LjAuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi12aXN1YWxpemVyXCI6IFwiXjUuOS4wXCIsXG4gICAgXCJ0aHJlZVwiOiBcImxhdGVzdFwiLFxuICAgIFwidW5wbHVnaW4tdnVlLWNvbXBvbmVudHNcIjogXCJeMC4yNC4xXCIsXG4gICAgXCJ2aXRlXCI6IFwiXjQuMS40XCIsXG4gICAgXCJ2aXRlLXBsdWdpbi1iYW5uZXJcIjogXCJeMC43LjBcIixcbiAgICBcInZpdGUtcGx1Z2luLWR0c1wiOiBcIjIuMC4wLWJldGEuMVwiLFxuICAgIFwidml0ZS1wbHVnaW4tZ2xzbFwiOiBcIl4xLjEuMlwiLFxuICAgIFwidml0ZS1wbHVnaW4taW5zcGVjdFwiOiBcIl4wLjcuMTVcIixcbiAgICBcInZpdGUtcGx1Z2luLXJlcXVpcmUtdHJhbnNmb3JtXCI6IFwiXjEuMC45XCIsXG4gICAgXCJ2aXRlc3RcIjogXCJeMC4yOC41XCIsXG4gICAgXCJ2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