From dd3f66f46f55b3f90287a639342114f8e1cbaa19 Mon Sep 17 00:00:00 2001 From: wuhaoyuan Date: Fri, 21 Jul 2023 10:33:15 +0800 Subject: [PATCH 1/2] =?UTF-8?q?build:=20=E6=94=AF=E6=8C=81=20wgsl=20?= =?UTF-8?q?=E6=89=93=E5=8C=85|=E6=96=B0=E5=A2=9E=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9|=E4=BF=AE=E6=94=B9=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=20node=20=E7=89=88=E6=9C=AC|=E5=A2=9E=E5=8A=A0=20vsco?= =?UTF-8?q?de=E5=BB=BA=E8=AE=AE=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 19 +- .npmrc | 2 + .nvmrc | 1 + .prettierrc | 1 + .vscode/extensions.json | 3 + README.md | 304 +- build/@rollup/plugin-wgsl/index.js | 22 + dist/index.js | 16723 --------------------------- package-lock.json | 10302 ++++++++--------- package.json | 194 +- rollup.config.js | 3 +- src/shader/Shaders.ts | 3 +- src/shader/material/colorFrag.wgsl | 9 + src/wgsl.d.ts | 4 + tests/README.md | 1 + tsconfig.json | 4 +- yarn.lock | 3082 +++++ 17 files changed, 8568 insertions(+), 22109 deletions(-) create mode 100644 .npmrc create mode 100644 .nvmrc create mode 100644 .vscode/extensions.json create mode 100644 build/@rollup/plugin-wgsl/index.js delete mode 100644 dist/index.js create mode 100644 src/shader/material/colorFrag.wgsl create mode 100644 src/wgsl.d.ts create mode 100644 tests/README.md create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index 226b822..2c87b15 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,24 @@ node_modules -npm-debug.log +dist + public/workers *.mp4 *.flv *.rar *.zip *.7z -.catch/** \ No newline at end of file +.catch/** + +.DS_Store + +# Log files +npm-debug.log* +pnpm-debug.log* + +# Editor directories and files +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..2b3b7b2 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +auto-install-peers=true +registry=https://registry.npmmirror.com diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..b1215e8 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v18.16.0 \ No newline at end of file diff --git a/.prettierrc b/.prettierrc index bf0361b..705970b 100644 --- a/.prettierrc +++ b/.prettierrc @@ -11,6 +11,7 @@ "quoteProps": "as-needed", "requirePragma": false, "semi": true, + "singleAttributePerLine": false, "singleQuote": false, "tabWidth": 4, "trailingComma": "none", diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..0555c66 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["PolyMeilex.wgsl", "ritwickdey.LiveServer", "esbenp.prettier-vscode", "dbaeumer.vscode-eslint"] +} diff --git a/README.md b/README.md index ef997e7..bf2a65b 100644 --- a/README.md +++ b/README.md @@ -1,117 +1,135 @@ -## Note: +# GEngine.js -- WebGPU Engine +WebGPU Engine ## install -- `npm i @gengine-js/gengine` +```shell +$ yarn add @gengine-js/gengine +``` -## build +## develop -- `npm install` +```shell +# install +$ yarn -- `npm run build` +# dev +$ yarn dev -## Usage +# build +$ yarn build +``` - + function onWindowResize() { + camera.aspect = window.innerWidth / window.innerHeight; + scene.resize(window.innerWidth, window.innerHeight); + } + function animate() { + control.update(); + requestAnimationFrame(animate); + scene.render(); + } + animate(); + }; + init(); + +``` ## Native - + vertexBuffers: [ + { + stepMode: "vertex", //optional + uid: "vertAttr", //must + attributes: { + position: { size: 4, value: positions }, + color: { size: 4, value: colors } + } + } + ], + uniformBuffers: [ + { + type: "uniform", + uid: "systemMatrix", + uniforms: { + modelViewProjectionMatrix: { + type: "mat4", + value: () => { + let viewMatrix = mat4.identity([]); + mat4.translate(viewMatrix, viewMatrix, vec3.fromValues(0, 0, -4)); + const now = Date.now() / 1000; + mat4.rotate( + viewMatrix, + viewMatrix, + 1, + vec3.fromValues(Math.sin(now), Math.cos(now), 0) + ); + mat4.multiply(modelViewProjectionMatrix, projectionMatrix, viewMatrix); + return modelViewProjectionMatrix; + } + } + } + } + ], + renderState: { + targets: [ + { + format: presentationFormat + } + ], + primitive: { + topology: "triangle-list", + cullMode: "back" + }, + depthStencil: { + depthWriteEnabled: true, + depthCompare: "less", + format: "depth24plus" + } + }, + count: 36, + instances: 1 + }); + + function animate() { + requestAnimationFrame(animate); + const passEncoder = canvasRenderTarget.beginRenderPass(context.device); + model.render({ device: context.device, passEncoder }); + canvasRenderTarget.endRenderPass(); + } + animate(); + }; + init(); + +``` ## feature diff --git a/build/@rollup/plugin-wgsl/index.js b/build/@rollup/plugin-wgsl/index.js new file mode 100644 index 0000000..f26af8e --- /dev/null +++ b/build/@rollup/plugin-wgsl/index.js @@ -0,0 +1,22 @@ +// https://github.com/c8n1ao/rollup-plugin-wgsl +import { readFile } from "node:fs/promises"; + +export default function wgsl(options) { + options = { + ...{ fileTypes: ["frag", "vert", "wgsl", "glsl"] }, + ...options + }; + + return { + name: "wgsl", + + async load(id) { + const isTargetSuffix = options.fileTypes.some((type) => id.endsWith(`.${type}`)); + + if (isTargetSuffix) { + const code = await readFile(id, "utf-8"); + return `export default ${JSON.stringify(code)};`; + } + } + }; +} diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index b54833b..0000000 --- a/dist/index.js +++ /dev/null @@ -1,16723 +0,0 @@ -/** @internal */ -var PredefinedColorSpace; -(function (PredefinedColorSpace) { - PredefinedColorSpace["SRGB"] = "srgb"; -})(PredefinedColorSpace || (PredefinedColorSpace = {})); -/** @internal */ -var PowerPreference; -(function (PowerPreference) { - PowerPreference["LowPower"] = "low-power"; - PowerPreference["HighPerformance"] = "high-performance"; -})(PowerPreference || (PowerPreference = {})); -/** @internal */ -var FeatureName; -(function (FeatureName) { - FeatureName["DepthClipControl"] = "depth-clip-control"; - FeatureName["Depth24UnormStencil8"] = "depth24unorm-stencil8"; - FeatureName["Depth32FloatStencil8"] = "depth32float-stencil8"; - FeatureName["TextureCompressionBC"] = "texture-compression-bc"; - FeatureName["TextureCompressionETC2"] = "texture-compression-etc2"; - FeatureName["TextureCompressionASTC"] = "texture-compression-astc"; - FeatureName["TimestampQuery"] = "timestamp-query"; - FeatureName["IndirectFirstInstance"] = "indirect-first-instance"; - FeatureName["ShaderF16"] = "shader-f16"; - FeatureName["BGRA8UnormStorage"] = "bgra8unorm-storage"; -})(FeatureName || (FeatureName = {})); -/** @internal */ -var BufferUsage; -(function (BufferUsage) { - BufferUsage[(BufferUsage["MapRead"] = 1)] = "MapRead"; - BufferUsage[(BufferUsage["MapWrite"] = 2)] = "MapWrite"; - BufferUsage[(BufferUsage["CopySrc"] = 4)] = "CopySrc"; - BufferUsage[(BufferUsage["CopyDst"] = 8)] = "CopyDst"; - BufferUsage[(BufferUsage["Index"] = 16)] = "Index"; - BufferUsage[(BufferUsage["Vertex"] = 32)] = "Vertex"; - BufferUsage[(BufferUsage["Uniform"] = 64)] = "Uniform"; - BufferUsage[(BufferUsage["Storage"] = 128)] = "Storage"; - BufferUsage[(BufferUsage["Indirect"] = 256)] = "Indirect"; - BufferUsage[(BufferUsage["QueryResolve"] = 512)] = "QueryResolve"; -})(BufferUsage || (BufferUsage = {})); -/** @internal */ -var MapMode; -(function (MapMode) { - MapMode[(MapMode["Read"] = 1)] = "Read"; - MapMode[(MapMode["Write"] = 2)] = "Write"; -})(MapMode || (MapMode = {})); -/** @internal */ -var TextureDimension; -(function (TextureDimension) { - TextureDimension["E1d"] = "1d"; - TextureDimension["E2d"] = "2d"; - TextureDimension["E3d"] = "3d"; -})(TextureDimension || (TextureDimension = {})); -/** @internal */ -var TextureUsage; -(function (TextureUsage) { - TextureUsage[(TextureUsage["CopySrc"] = 1)] = "CopySrc"; - TextureUsage[(TextureUsage["CopyDst"] = 2)] = "CopyDst"; - TextureUsage[(TextureUsage["TextureBinding"] = 4)] = "TextureBinding"; - TextureUsage[(TextureUsage["StorageBinding"] = 8)] = "StorageBinding"; - TextureUsage[(TextureUsage["RenderAttachment"] = 16)] = "RenderAttachment"; -})(TextureUsage || (TextureUsage = {})); -/** @internal */ -var TextureViewDimension; -(function (TextureViewDimension) { - TextureViewDimension["E1d"] = "1d"; - TextureViewDimension["E2d"] = "2d"; - TextureViewDimension["E2dArray"] = "2d-array"; - TextureViewDimension["Cube"] = "cube"; - TextureViewDimension["CubeArray"] = "cube-array"; - TextureViewDimension["E3d"] = "3d"; -})(TextureViewDimension || (TextureViewDimension = {})); -/** @internal */ -var TextureAspect; -(function (TextureAspect) { - TextureAspect["All"] = "all"; - TextureAspect["StencilOnly"] = "stencil-only"; - TextureAspect["DepthOnly"] = "depth-only"; -})(TextureAspect || (TextureAspect = {})); -/** - * Comments taken from https://github.com/gfx-rs/wgpu/blob/master/wgpu-types/src/lib.rs - * @internal - */ -var TextureFormat; -(function (TextureFormat) { - // 8-bit formats - TextureFormat["R8Unorm"] = "r8unorm"; - TextureFormat["R8Snorm"] = "r8snorm"; - TextureFormat["R8Uint"] = "r8uint"; - TextureFormat["R8Sint"] = "r8sint"; - // 16-bit formats - TextureFormat["R16Uint"] = "r16uint"; - TextureFormat["R16Sint"] = "r16sint"; - TextureFormat["R16Float"] = "r16float"; - TextureFormat["RG8Unorm"] = "rg8unorm"; - TextureFormat["RG8Snorm"] = "rg8snorm"; - TextureFormat["RG8Uint"] = "rg8uint"; - TextureFormat["RG8Sint"] = "rg8sint"; - // 32-bit formats - TextureFormat["R32Uint"] = "r32uint"; - TextureFormat["R32Sint"] = "r32sint"; - TextureFormat["R32Float"] = "r32float"; - TextureFormat["RG16Uint"] = "rg16uint"; - TextureFormat["RG16Sint"] = "rg16sint"; - TextureFormat["RG16Float"] = "rg16float"; - TextureFormat["RGBA8Unorm"] = "rgba8unorm"; - TextureFormat["RGBA8UnormSRGB"] = "rgba8unorm-srgb"; - TextureFormat["RGBA8Snorm"] = "rgba8snorm"; - TextureFormat["RGBA8Uint"] = "rgba8uint"; - TextureFormat["RGBA8Sint"] = "rgba8sint"; - TextureFormat["BGRA8Unorm"] = "bgra8unorm"; - TextureFormat["BGRA8UnormSRGB"] = "bgra8unorm-srgb"; - // Packed 32-bit formats - TextureFormat["RGB9E5UFloat"] = "rgb9e5ufloat"; - TextureFormat["RGB10A2Unorm"] = "rgb10a2unorm"; - TextureFormat["RG11B10UFloat"] = "rg11b10ufloat"; - // 64-bit formats - TextureFormat["RG32Uint"] = "rg32uint"; - TextureFormat["RG32Sint"] = "rg32sint"; - TextureFormat["RG32Float"] = "rg32float"; - TextureFormat["RGBA16Uint"] = "rgba16uint"; - TextureFormat["RGBA16Sint"] = "rgba16sint"; - TextureFormat["RGBA16Float"] = "rgba16float"; - // 128-bit formats - TextureFormat["RGBA32Uint"] = "rgba32uint"; - TextureFormat["RGBA32Sint"] = "rgba32sint"; - TextureFormat["RGBA32Float"] = "rgba32float"; - // Depth and stencil formats - TextureFormat["Stencil8"] = "stencil8"; - TextureFormat["Depth16Unorm"] = "depth16unorm"; - TextureFormat["Depth24Plus"] = "depth24plus"; - TextureFormat["Depth24PlusStencil8"] = "depth24plus-stencil8"; - TextureFormat["Depth32Float"] = "depth32float"; - // BC compressed formats usable if "texture-compression-bc" is both - // supported by the device/user agent and enabled in requestDevice. - TextureFormat["BC1RGBAUnorm"] = "bc1-rgba-unorm"; - TextureFormat["BC1RGBAUnormSRGB"] = "bc1-rgba-unorm-srgb"; - TextureFormat["BC2RGBAUnorm"] = "bc2-rgba-unorm"; - TextureFormat["BC2RGBAUnormSRGB"] = "bc2-rgba-unorm-srgb"; - TextureFormat["BC3RGBAUnorm"] = "bc3-rgba-unorm"; - TextureFormat["BC3RGBAUnormSRGB"] = "bc3-rgba-unorm-srgb"; - TextureFormat["BC4RUnorm"] = "bc4-r-unorm"; - TextureFormat["BC4RSnorm"] = "bc4-r-snorm"; - TextureFormat["BC5RGUnorm"] = "bc5-rg-unorm"; - TextureFormat["BC5RGSnorm"] = "bc5-rg-snorm"; - TextureFormat["BC6HRGBUFloat"] = "bc6h-rgb-ufloat"; - TextureFormat["BC6HRGBFloat"] = "bc6h-rgb-float"; - TextureFormat["BC7RGBAUnorm"] = "bc7-rgba-unorm"; - TextureFormat["BC7RGBAUnormSRGB"] = "bc7-rgba-unorm-srgb"; - // ETC2 compressed formats usable if "texture-compression-etc2" is both - // supported by the device/user agent and enabled in requestDevice. - TextureFormat["ETC2RGB8Unorm"] = "etc2-rgb8unorm"; - TextureFormat["ETC2RGB8UnormSRGB"] = "etc2-rgb8unorm-srgb"; - TextureFormat["ETC2RGB8A1Unorm"] = "etc2-rgb8a1unorm"; - TextureFormat["ETC2RGB8A1UnormSRGB"] = "etc2-rgb8a1unorm-srgb"; - TextureFormat["ETC2RGBA8Unorm"] = "etc2-rgba8unorm"; - TextureFormat["ETC2RGBA8UnormSRGB"] = "etc2-rgba8unorm-srgb"; - TextureFormat["EACR11Unorm"] = "eac-r11unorm"; - TextureFormat["EACR11Snorm"] = "eac-r11snorm"; - TextureFormat["EACRG11Unorm"] = "eac-rg11unorm"; - TextureFormat["EACRG11Snorm"] = "eac-rg11snorm"; - // ASTC compressed formats usable if "texture-compression-astc" is both - // supported by the device/user agent and enabled in requestDevice. - TextureFormat["ASTC4x4Unorm"] = "astc-4x4-unorm"; - TextureFormat["ASTC4x4UnormSRGB"] = "astc-4x4-unorm-srgb"; - TextureFormat["ASTC5x4Unorm"] = "astc-5x4-unorm"; - TextureFormat["ASTC5x4UnormSRGB"] = "astc-5x4-unorm-srgb"; - TextureFormat["ASTC5x5Unorm"] = "astc-5x5-unorm"; - TextureFormat["ASTC5x5UnormSRGB"] = "astc-5x5-unorm-srgb"; - TextureFormat["ASTC6x5Unorm"] = "astc-6x5-unorm"; - TextureFormat["ASTC6x5UnormSRGB"] = "astc-6x5-unorm-srgb"; - TextureFormat["ASTC6x6Unorm"] = "astc-6x6-unorm"; - TextureFormat["ASTC6x6UnormSRGB"] = "astc-6x6-unorm-srgb"; - TextureFormat["ASTC8x5Unorm"] = "astc-8x5-unorm"; - TextureFormat["ASTC8x5UnormSRGB"] = "astc-8x5-unorm-srgb"; - TextureFormat["ASTC8x6Unorm"] = "astc-8x6-unorm"; - TextureFormat["ASTC8x6UnormSRGB"] = "astc-8x6-unorm-srgb"; - TextureFormat["ASTC8x8Unorm"] = "astc-8x8-unorm"; - TextureFormat["ASTC8x8UnormSRGB"] = "astc-8x8-unorm-srgb"; - TextureFormat["ASTC10x5Unorm"] = "astc-10x5-unorm"; - TextureFormat["ASTC10x5UnormSRGB"] = "astc-10x5-unorm-srgb"; - TextureFormat["ASTC10x6Unorm"] = "astc-10x6-unorm"; - TextureFormat["ASTC10x6UnormSRGB"] = "astc-10x6-unorm-srgb"; - TextureFormat["ASTC10x8Unorm"] = "astc-10x8-unorm"; - TextureFormat["ASTC10x8UnormSRGB"] = "astc-10x8-unorm-srgb"; - TextureFormat["ASTC10x10Unorm"] = "astc-10x10-unorm"; - TextureFormat["ASTC10x10UnormSRGB"] = "astc-10x10-unorm-srgb"; - TextureFormat["ASTC12x10Unorm"] = "astc-12x10-unorm"; - TextureFormat["ASTC12x10UnormSRGB"] = "astc-12x10-unorm-srgb"; - TextureFormat["ASTC12x12Unorm"] = "astc-12x12-unorm"; - TextureFormat["ASTC12x12UnormSRGB"] = "astc-12x12-unorm-srgb"; - // "depth24unorm-stencil8" feature - TextureFormat["Depth24UnormStencil8"] = "depth24unorm-stencil8"; - // "depth32float-stencil8" feature - TextureFormat["Depth32FloatStencil8"] = "depth32float-stencil8"; -})(TextureFormat || (TextureFormat = {})); -/** @internal */ -var AddressMode; -(function (AddressMode) { - AddressMode["ClampToEdge"] = "clamp-to-edge"; - AddressMode["Repeat"] = "repeat"; - AddressMode["MirrorRepeat"] = "mirror-repeat"; -})(AddressMode || (AddressMode = {})); -/** @internal */ -var FilterMode; -(function (FilterMode) { - FilterMode["Nearest"] = "nearest"; - FilterMode["Linear"] = "linear"; -})(FilterMode || (FilterMode = {})); -/** @internal */ -var CompareFunction; -(function (CompareFunction) { - CompareFunction["Never"] = "never"; - CompareFunction["Less"] = "less"; - CompareFunction["Equal"] = "equal"; - CompareFunction["LessEqual"] = "less-equal"; - CompareFunction["Greater"] = "greater"; - CompareFunction["NotEqual"] = "not-equal"; - CompareFunction["GreaterEqual"] = "greater-equal"; - CompareFunction["Always"] = "always"; -})(CompareFunction || (CompareFunction = {})); -/** @internal */ -var ShaderStage; -(function (ShaderStage) { - ShaderStage[(ShaderStage["Vertex"] = 1)] = "Vertex"; - ShaderStage[(ShaderStage["Fragment"] = 2)] = "Fragment"; - ShaderStage[(ShaderStage["Compute"] = 4)] = "Compute"; -})(ShaderStage || (ShaderStage = {})); -/** @internal */ -var BufferBindingType; -(function (BufferBindingType) { - BufferBindingType["Uniform"] = "uniform"; - BufferBindingType["Storage"] = "storage"; - BufferBindingType["ReadOnlyStorage"] = "read-only-storage"; -})(BufferBindingType || (BufferBindingType = {})); -/** @internal */ -var SamplerBindingType; -(function (SamplerBindingType) { - SamplerBindingType["Filtering"] = "filtering"; - SamplerBindingType["NonFiltering"] = "non-filtering"; - SamplerBindingType["Comparison"] = "comparison"; -})(SamplerBindingType || (SamplerBindingType = {})); -/** @internal */ -var TextureSampleType; -(function (TextureSampleType) { - TextureSampleType["Float"] = "float"; - TextureSampleType["UnfilterableFloat"] = "unfilterable-float"; - TextureSampleType["Depth"] = "depth"; - TextureSampleType["Sint"] = "sint"; - TextureSampleType["Uint"] = "uint"; -})(TextureSampleType || (TextureSampleType = {})); -/** @internal */ -var StorageTextureAccess; -(function (StorageTextureAccess) { - StorageTextureAccess["WriteOnly"] = "write-only"; -})(StorageTextureAccess || (StorageTextureAccess = {})); -/** @internal */ -var CompilationMessageType; -(function (CompilationMessageType) { - CompilationMessageType["Error"] = "error"; - CompilationMessageType["Warning"] = "warning"; - CompilationMessageType["Info"] = "info"; -})(CompilationMessageType || (CompilationMessageType = {})); -/** @internal */ -var AutoLayoutMode; -(function (AutoLayoutMode) { - AutoLayoutMode["Auto"] = "auto"; -})(AutoLayoutMode || (AutoLayoutMode = {})); -/** @internal */ -var PrimitiveTopology; -(function (PrimitiveTopology) { - PrimitiveTopology["PointList"] = "point-list"; - PrimitiveTopology["LineList"] = "line-list"; - PrimitiveTopology["LineStrip"] = "line-strip"; - PrimitiveTopology["TriangleList"] = "triangle-list"; - PrimitiveTopology["TriangleStrip"] = "triangle-strip"; -})(PrimitiveTopology || (PrimitiveTopology = {})); -/** @internal */ -var FrontFace; -(function (FrontFace) { - FrontFace["CCW"] = "ccw"; - FrontFace["CW"] = "cw"; -})(FrontFace || (FrontFace = {})); -/** @internal */ -var CullMode; -(function (CullMode) { - CullMode["None"] = "none"; - CullMode["Front"] = "front"; - CullMode["Back"] = "back"; -})(CullMode || (CullMode = {})); -/** @internal */ -var ColorWriteFlags; -(function (ColorWriteFlags) { - ColorWriteFlags[(ColorWriteFlags["Red"] = 1)] = "Red"; - ColorWriteFlags[(ColorWriteFlags["Green"] = 2)] = "Green"; - ColorWriteFlags[(ColorWriteFlags["Blue"] = 4)] = "Blue"; - ColorWriteFlags[(ColorWriteFlags["Alpha"] = 8)] = "Alpha"; - ColorWriteFlags[(ColorWriteFlags["All"] = 15)] = "All"; -})(ColorWriteFlags || (ColorWriteFlags = {})); -/** @internal */ -var BlendFactor; -(function (BlendFactor) { - BlendFactor["Zero"] = "zero"; - BlendFactor["One"] = "one"; - BlendFactor["Src"] = "src"; - BlendFactor["OneMinusSrc"] = "one-minus-src"; - BlendFactor["SrcAlpha"] = "src-alpha"; - BlendFactor["OneMinusSrcAlpha"] = "one-minus-src-alpha"; - BlendFactor["Dst"] = "dst"; - BlendFactor["OneMinusDst"] = "one-minus-dst"; - BlendFactor["DstAlpha"] = "dst-alpha"; - BlendFactor["OneMinusDstAlpha"] = "one-minus-dst-alpha"; - BlendFactor["SrcAlphaSaturated"] = "src-alpha-saturated"; - BlendFactor["Constant"] = "constant"; - BlendFactor["OneMinusConstant"] = "one-minus-constant"; -})(BlendFactor || (BlendFactor = {})); -/** @internal */ -var BlendOperation; -(function (BlendOperation) { - BlendOperation["Add"] = "add"; - BlendOperation["Subtract"] = "subtract"; - BlendOperation["ReverseSubtract"] = "reverse-subtract"; - BlendOperation["Min"] = "min"; - BlendOperation["Max"] = "max"; -})(BlendOperation || (BlendOperation = {})); -/** @internal */ -var StencilOperation; -(function (StencilOperation) { - StencilOperation["Keep"] = "keep"; - StencilOperation["Zero"] = "zero"; - StencilOperation["Replace"] = "replace"; - StencilOperation["Invert"] = "invert"; - StencilOperation["IncrementClamp"] = "increment-clamp"; - StencilOperation["DecrementClamp"] = "decrement-clamp"; - StencilOperation["IncrementWrap"] = "increment-wrap"; - StencilOperation["DecrementWrap"] = "decrement-wrap"; -})(StencilOperation || (StencilOperation = {})); -/** @internal */ -var IndexFormat; -(function (IndexFormat) { - IndexFormat["Uint16"] = "uint16"; - IndexFormat["Uint32"] = "uint32"; -})(IndexFormat || (IndexFormat = {})); -/** @internal */ -var VertexFormat; -(function (VertexFormat) { - VertexFormat["Uint8x2"] = "uint8x2"; - VertexFormat["Uint8x4"] = "uint8x4"; - VertexFormat["Sint8x2"] = "sint8x2"; - VertexFormat["Sint8x4"] = "sint8x4"; - VertexFormat["Unorm8x2"] = "unorm8x2"; - VertexFormat["Unorm8x4"] = "unorm8x4"; - VertexFormat["Snorm8x2"] = "snorm8x2"; - VertexFormat["Snorm8x4"] = "snorm8x4"; - VertexFormat["Uint16x2"] = "uint16x2"; - VertexFormat["Uint16x4"] = "uint16x4"; - VertexFormat["Sint16x2"] = "sint16x2"; - VertexFormat["Sint16x4"] = "sint16x4"; - VertexFormat["Unorm16x2"] = "unorm16x2"; - VertexFormat["Unorm16x4"] = "unorm16x4"; - VertexFormat["Snorm16x2"] = "snorm16x2"; - VertexFormat["Snorm16x4"] = "snorm16x4"; - VertexFormat["Float16x2"] = "float16x2"; - VertexFormat["Float16x4"] = "float16x4"; - VertexFormat["Float32"] = "float32"; - VertexFormat["Float32x2"] = "float32x2"; - VertexFormat["Float32x3"] = "float32x3"; - VertexFormat["Float32x4"] = "float32x4"; - VertexFormat["Uint32"] = "uint32"; - VertexFormat["Uint32x2"] = "uint32x2"; - VertexFormat["Uint32x3"] = "uint32x3"; - VertexFormat["Uint32x4"] = "uint32x4"; - VertexFormat["Sint32"] = "sint32"; - VertexFormat["Sint32x2"] = "sint32x2"; - VertexFormat["Sint32x3"] = "sint32x3"; - VertexFormat["Sint32x4"] = "sint32x4"; -})(VertexFormat || (VertexFormat = {})); -/** @internal */ -var InputStepMode; -(function (InputStepMode) { - InputStepMode["Vertex"] = "vertex"; - InputStepMode["Instance"] = "instance"; -})(InputStepMode || (InputStepMode = {})); -/** @internal */ -var ComputePassTimestampLocation; -(function (ComputePassTimestampLocation) { - ComputePassTimestampLocation["Beginning"] = "beginning"; - ComputePassTimestampLocation["End"] = "end"; -})(ComputePassTimestampLocation || (ComputePassTimestampLocation = {})); -/** @internal */ -var RenderPassTimestampLocation; -(function (RenderPassTimestampLocation) { - RenderPassTimestampLocation["Beginning"] = "beginning"; - RenderPassTimestampLocation["End"] = "end"; -})(RenderPassTimestampLocation || (RenderPassTimestampLocation = {})); -/** @internal */ -var LoadOp; -(function (LoadOp) { - LoadOp["Load"] = "load"; - LoadOp["Clear"] = "clear"; -})(LoadOp || (LoadOp = {})); -/** @internal */ -var StoreOp; -(function (StoreOp) { - StoreOp["Store"] = "store"; - StoreOp["Discard"] = "discard"; -})(StoreOp || (StoreOp = {})); -/** @internal */ -var QueryType; -(function (QueryType) { - QueryType["Occlusion"] = "occlusion"; - QueryType["Timestamp"] = "timestamp"; -})(QueryType || (QueryType = {})); -/** @internal */ -var CanvasAlphaMode; -(function (CanvasAlphaMode) { - CanvasAlphaMode["Opaque"] = "opaque"; - CanvasAlphaMode["Premultiplied"] = "premultiplied"; -})(CanvasAlphaMode || (CanvasAlphaMode = {})); -/** @internal */ -var DeviceLostReason; -(function (DeviceLostReason) { - DeviceLostReason["Destroyed"] = "destroyed"; -})(DeviceLostReason || (DeviceLostReason = {})); -/** @internal */ -var ErrorFilter; -(function (ErrorFilter) { - ErrorFilter["OutOfMemory"] = "out-of-memory"; - ErrorFilter["Validation"] = "validation"; -})(ErrorFilter || (ErrorFilter = {})); -var GPUColorWrite; -(function (GPUColorWrite) { - GPUColorWrite[(GPUColorWrite["Red"] = 1)] = "Red"; - GPUColorWrite[(GPUColorWrite["Green"] = 2)] = "Green"; - GPUColorWrite[(GPUColorWrite["Blue"] = 4)] = "Blue"; - GPUColorWrite[(GPUColorWrite["Alpha"] = 8)] = "Alpha"; - GPUColorWrite[(GPUColorWrite["All"] = 15)] = "All"; -})(GPUColorWrite || (GPUColorWrite = {})); -var CommandSubType; -(function (CommandSubType) { - CommandSubType["Shadow"] = "shadow"; - CommandSubType["Pick"] = "pick"; -})(CommandSubType || (CommandSubType = {})); -var Intersect; -(function (Intersect) { - Intersect[(Intersect["OUTSIDE"] = -1)] = "OUTSIDE"; - Intersect[(Intersect["INTERSECTING"] = 0)] = "INTERSECTING"; - Intersect[(Intersect["INSIDE"] = 1)] = "INSIDE"; -})(Intersect || (Intersect = {})); - -class Buffer { - constructor(label, device, usage, data, size) { - this.device = device; - this.usage = usage; - this.data = data; - this.size = size != undefined ? (size + 3) & ~3 : (data.byteLength + 3) & ~3; // 4 bytes alignments (because of the upload which requires this) - this.gpuBuffer = device.createBuffer({ - label: label || "", - size: this.size, - usage - }); - if (data) this.setSubData(0, data, this.size); - } - static create(label, device, usage, data, size) { - return new Buffer(label, device, usage, data, size); - } - static createVertexBuffer(label, device, data) { - return new Buffer(label, device, BufferUsage.Vertex | BufferUsage.CopyDst, data, data.byteLength); - } - static createIndexBuffer(label, device, data) { - return new Buffer(label, device, BufferUsage.Index | BufferUsage.CopyDst, data); - } - static createUniformBuffer(label, device, size, usage) { - return new Buffer(label, device, usage, null, size); - } - static createStorageBuffer(label, device, size, usage = BufferUsage.Storage) { - return new Buffer(label, device, usage, null, size); - } - // https://github.com/gpuweb/gpuweb/blob/main/design/BufferOperations.md - setSubData(offset, data, size) { - const srcArrayBuffer = data.buffer; - const byteCount = size ?? srcArrayBuffer.byteLength; - const srcBuffer = this.device.createBuffer({ - mappedAtCreation: true, - size: byteCount, - usage: GPUBufferUsage.COPY_SRC - }); - const arrayBuffer = srcBuffer.getMappedRange(); - new Uint16Array(arrayBuffer).set(new Uint16Array(srcArrayBuffer)); // memcpy - srcBuffer.unmap(); - this.copyToBuffer(srcBuffer, offset, byteCount); - srcBuffer.destroy(); - } - copyToBuffer(srcBuffer, offset, byteCount) { - const commandEncoder = this.device.createCommandEncoder(); - commandEncoder.copyBufferToBuffer(srcBuffer, 0, this.gpuBuffer, offset, byteCount); - this.device.queue.submit([commandEncoder.finish()]); - } - copyToTexture(bytesPerRow, rowsPerImage, destination, extent) { - const commandEncoder = this.device.createCommandEncoder(); - commandEncoder.copyBufferToTexture( - { - buffer: this.gpuBuffer, - bytesPerRow, - rowsPerImage - }, - destination, - extent - ); - this.device.queue.submit([commandEncoder.finish()]); - } - destroy() { - this.gpuBuffer.destroy(); - } -} - -const pipelineLayoutCache = new Map(); -class PipelineLayout { - constructor(device, label, groupLayouts = [], index) { - this.groupLayouts = groupLayouts; - this.index = index || 0; - this.gpuPipelineLayout = device.createPipelineLayout({ - label: label, - bindGroupLayouts: groupLayouts.map((layout) => { - return layout.gpuBindGroupLayout; - }) - }); - } - static getPipelineLayoutFromCache(device, label, groupLayouts) { - if (pipelineLayoutCache.has(label)) { - return pipelineLayoutCache.get(label); - } else { - const bindGroupLayout = new PipelineLayout(device, label, groupLayouts); - pipelineLayoutCache.set(label, bindGroupLayout); - return bindGroupLayout; - } - } -} - -const renderPipelines = new Map(); -const computePipelines = new Map(); -class Pipeline { - constructor(type, device, descriptor) { - this.type = type; - this.descriptor = descriptor; - this.device = device; - this.createPipeline(); - } - createPipeline() { - if (this.type == "render") { - this.gpuPipeline = this.device.createRenderPipeline(this.descriptor); - } else { - this.gpuPipeline = this.device.createComputePipeline(this.descriptor); - } - } - bind(passEncoder) { - if (this.type == "render") { - passEncoder.setPipeline(this.gpuPipeline); - } else { - passEncoder.setPipeline(this.gpuPipeline); - } - } - static getRenderPipelineFromCache(device, drawComand, groupLayouts) { - const { renderState, shaderSource } = drawComand; - const rsStr = JSON.stringify(renderState); - const combineStr = shaderSource.uid.concat(rsStr); - const hashId = stringToHash(combineStr); - const combineLayouts = groupLayouts - ?.filter((layout) => layout != undefined) - ?.sort((layout1, layout2) => layout1.index - layout2.index); - let pipeline = renderPipelines.get(hashId); - if (!pipeline) { - const descriptor = Pipeline.getPipelineDescriptor( - device, - drawComand, - renderState, - combineLayouts, - hashId.toString() - ); - pipeline = new Pipeline("render", device, descriptor); - renderPipelines.set(hashId, pipeline); - } - return pipeline; - } - static getComputePipelineFromCache(device, computeCommad, groupLayouts) { - const { shaderSource } = computeCommad; - const hashId = stringToHash(shaderSource.uid); - let pipeline = computePipelines.get(hashId); - if (!pipeline) { - pipeline = new Pipeline("compute", device, { - layout: PipelineLayout.getPipelineLayoutFromCache(device, hashId.toString(), groupLayouts) - .gpuPipelineLayout, - compute: { - module: shaderSource.getShaderModule(device).compute, - entryPoint: shaderSource?.compute?.computeMain || "main" - } - }); - computePipelines.set(hashId, pipeline); - } - return pipeline; - } - static getPipelineDescriptor(device, drawComand, renderState, groupLayouts, hashId) { - const { vertexBuffers, shaderSource } = drawComand; - const { vert, frag } = shaderSource.getShaderModule(device); - const pipelineDec = { - layout: PipelineLayout.getPipelineLayoutFromCache(device, hashId, groupLayouts).gpuPipelineLayout - }; - if (vert) - pipelineDec.vertex = { - module: vert, - entryPoint: shaderSource?.render?.vertMain || "main", - buffers: vertexBuffers.map((vertexBuffer) => vertexBuffer.getBufferDes()) - }; - if (renderState.primitive) pipelineDec.primitive = renderState.primitive.getGPUPrimitiveDec(); - if (renderState.depthStencil) pipelineDec.depthStencil = renderState.depthStencil.getGPUDepthStencilDec(); - if (renderState.multisample) pipelineDec.multisample = renderState.multisample.getMultiSampleDec(); - if (frag) - pipelineDec.fragment = { - module: frag, - entryPoint: shaderSource?.render?.fragMain || "main", - targets: renderState.targets.map((target) => { - return target.getGPUTargetDec(); - }) - }; - return pipelineDec; - } -} -// Borrowed from https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/ -function stringToHash(str) { - let hash = 0; - if (str.length == 0) return hash; - for (let i = 0; i < str.length; i++) { - const char = str.charCodeAt(i); - hash = (hash << 5) - hash + char; - hash = hash & hash; // Convert to 32bit integer - } - return hash; -} - -class DrawCommand { - constructor(options) { - this.shaderData = options.shaderData; - this.renderTarget = options.renderTarget; - this.useLight = options.useLight; - this.vertexBuffers = options.vertexBuffers; - this.indexBuffer = options.indexBuffer; - this.renderState = options.renderState; - this.queryIndex = options.queryIndex; - this.count = options.count; - this.instances = options.instances; - this.shaderSource = options.shaderSource; - this.dirty = options.dirty; - this.lightShaderData = options.lightShaderData; - } - shallowClone(material) { - if (!material) return; - return new DrawCommand({ - vertexBuffers: this.vertexBuffers, - indexBuffer: this.indexBuffer, - shaderData: material.shaderData, - instances: this.instances, - count: this.count, - renderState: material.renderState, - shaderSource: material.shaderSource, - lightShaderData: material.light ? this.lightShaderData : undefined, - useLight: material.light - }); - } - render(params) { - const { device, passEncoder, camera, querySet, viewPort, scissorTest } = params || {}; - const { - shaderData, - renderState, - vertexBuffers, - indexBuffer, - lightShaderData, - shaderSource, - count, - instances, - renderTarget, - useLight, - indirectOffset, - indirectBuffer, - queryIndex - } = this; - const currentPassEncoder = renderTarget?.beginRenderPass?.(device) ?? passEncoder; - const defines = Object.assign({}, lightShaderData?.defines ?? {}, camera?.shaderData?.defines ?? {}); - shaderData?.bind?.(device, currentPassEncoder); - camera?.shaderData?.bind(device, currentPassEncoder); - useLight && lightShaderData?.bind?.(device, currentPassEncoder); - renderState?.bind?.({ - passEncoder: currentPassEncoder, - viewPort: viewPort, - scissorTest: scissorTest - }); - vertexBuffers?.forEach?.((vertexBuffer) => vertexBuffer?.bind?.(device, currentPassEncoder)); - indexBuffer?.bind?.(device, currentPassEncoder); - shaderSource?.setDefines?.(defines); - const pipeline = Pipeline.getRenderPipelineFromCache(device, this, [ - shaderData?.groupLayout, - lightShaderData?.groupLayout, - camera?.shaderData?.groupLayout - ]); - if (queryIndex != undefined) querySet?.beginQuery(currentPassEncoder, queryIndex); - pipeline.bind(currentPassEncoder); - if (indexBuffer) { - if (indirectBuffer) { - currentPassEncoder.drawIndexedIndirect(indirectBuffer.gpuBuffer, indirectOffset || 0); - } else { - currentPassEncoder.drawIndexed(count || 0, instances || 1, 0, 0, 0); - } - } else if (count) { - if (indirectBuffer) { - currentPassEncoder.drawIndirect(indirectBuffer.gpuBuffer, indirectOffset); - } else { - currentPassEncoder.draw(count, instances || 1, 0, 0); - } - } - if (queryIndex != undefined) querySet?.endQuery(currentPassEncoder); - renderTarget?.endRenderPass?.(); - } -} - -const GPUCanvasCompositingAlphaMode = { - Opaque: "opaque", - Premultiplied: "premultiplied" -}; -var RenderObjectType; -(function (RenderObjectType) { - RenderObjectType["Camera"] = "camera"; - RenderObjectType["Light"] = "light"; - RenderObjectType["Mesh"] = "mesh"; - RenderObjectType["SkinMesh"] = "skinMesh"; - RenderObjectType["Node"] = "node"; - RenderObjectType["Axes"] = "axes"; - RenderObjectType["Skybox"] = "skyBox"; - RenderObjectType["PostEffect"] = "postEffect"; - RenderObjectType["Debug"] = "debug"; -})(RenderObjectType || (RenderObjectType = {})); -var LightType; -(function (LightType) { - LightType["SpotLight"] = "spotLight"; - LightType["PointLight"] = "pointLight"; - LightType["AmbientLight"] = "ambientLight"; - LightType["DirectionalLight"] = "directionalLight"; -})(LightType || (LightType = {})); -var UniformEnum; -(function (UniformEnum) { - UniformEnum["Float"] = "f32"; - UniformEnum["FloatVec2"] = "vec2"; - UniformEnum["FloatVec3"] = "vec3"; - UniformEnum["FloatVec4"] = "vec4"; - UniformEnum["FloatArray"] = "array"; - UniformEnum["Mat2"] = "mat2x2"; - UniformEnum["Mat3"] = "mat3x3"; - UniformEnum["Mat4"] = "mat4x4"; - UniformEnum["Color"] = "color"; - UniformEnum["Mat4Array"] = "array>"; - UniformEnum["Vec2Array"] = "array>"; - UniformEnum["Vec3Array"] = "array>"; - UniformEnum["Vec4Array"] = "array>"; - UniformEnum["UniformUint"] = "u32"; - UniformEnum["PointLights"] = "pointLights"; - UniformEnum["PointLightShadows"] = "pointLightShadows"; - UniformEnum["SpotLights"] = "spotLights"; - UniformEnum["SpotLightShadows"] = "spotLightShadows"; - UniformEnum["DirtectLights"] = "dirtectLights"; - UniformEnum["DirtectLightShadows"] = "dirtectLightShadows"; - UniformEnum["UniformStructArray"] = "StructArray"; -})(UniformEnum || (UniformEnum = {})); -var ShaderLanguage; -(function (ShaderLanguage) { - ShaderLanguage["WGSL"] = "wgsl"; - ShaderLanguage["GLSL"] = "glsl"; -})(ShaderLanguage || (ShaderLanguage = {})); -var ShaderMainStage; -(function (ShaderMainStage) { - ShaderMainStage["VERT"] = "vertex"; - ShaderMainStage["FRAG"] = "fragment"; - ShaderMainStage["COMPUTE"] = "compute"; -})(ShaderMainStage || (ShaderMainStage = {})); - -// import Color from "../../math/Color"; -var colorFrag = ` - struct VertexOutput { - @builtin(position) position: vec4, - @location(0) color: vec4, - }; - @fragment - fn main(input:VertexOutput) -> @location(0) vec4 { - return input.color; - } - `; - -var colorVert = ` - struct VertexInput { - @location(positionLocation) position: vec3, - @location(colorLocation) color: vec4, - } - struct VertexOutput { - @builtin(position) position: vec4, - @location(0) color: vec4, - }; - struct SelfUniform { - modelMatrix: mat4x4, - } - struct SystemUniform { - projectionMatrix: mat4x4, - viewMatrix: mat4x4, - inverseViewMatrix: mat4x4, - cameraPosition: vec3, - }; - @binding(colorBinding) @group(0) var selfUniform : SelfUniform; - @binding(cameraBinding) @group(1) var systemUniform : SystemUniform; - @vertex - fn main(input: VertexInput) -> VertexOutput { - var output:VertexOutput; - output.color=input.color; - output.position = systemUniform.projectionMatrix * systemUniform.viewMatrix *selfUniform.modelMatrix*vec4(input.position,1.0); - return output; - } - `; - -var pbr_fs = ` - // reference: https://github.com/KhronosGroup/glTF-WebGL-PBR/blob/master/shaders/pbr-frag.glsl - #include - #include - #include - #include - #include - #include - struct PhysicalMaterial { - diffuseColor:vec3, - roughness:f32, - specularColor:vec3, - #if USE_CLEARCOAT - clearcoat:f32, - clearcoatRoughness:f32, - clearcoatF0:vec3, - clearcoatF90:f32, - #endif - - #if USE_IRIDESCENCE - iridescence:f32, - iridescenceIOR:f32, - iridescenceThickness:f32, - iridescenceFresnel:vec3, - iridescenceF0:vec3, - #endif - - #if USE_SHEEN - sheenColor:vec3, - sheenRoughness:f32, - #endif - - #if IOR - ior:f32, - #endif - - #if USE_TRANSMISSION - transmission:f32, - transmissionAlpha:f32, - thickness:f32, - attenuationDistance:f32, - attenuationColor:vec3, - #endif - }; - const M_PI:f32 = 3.141592653589793; - const c_MinRoughness:f32 = 0.04; - #include - #if USE_IBL - #include - #endif - @binding(pbrBinding) @group(0) var materialUniform : MaterialUniform; - @binding(cameraBinding) @group(1) var systemUniform : SystemUniform; - @fragment - fn main(input:FragInput) -> @location(0) vec4 - { - var perceptualRoughness:f32 = materialUniform.roughness; - var metallic:f32 = materialUniform.metallic; - - #if USE_METALNESSTEXTURE - let mrSample:vec4 = textureSample(metalnessRoughnessTexture,metalnessRoughnessSampler, input.uv); - perceptualRoughness = mrSample.g * perceptualRoughness; - metallic = mrSample.b * metallic; - #endif - perceptualRoughness = clamp(perceptualRoughness, c_MinRoughness, 1.0); - metallic = clamp(metallic, 0.0, 1.0); - let alphaRoughness:f32 = perceptualRoughness * perceptualRoughness; - - - // The albedo may be defined from a base texture or a flat color - #if USE_TEXTURE - let baseColor:vec4 = textureSample(baseColorTexture,baseColorSampler, input.uv) ; - #else - let baseColor:vec4 = vec4(materialUniform.color,1.0); - #endif - - #if USE_NORMALTEXTURE - let n:vec3 = getNormalByNormalTexture(input); - #else - let n:vec3 = getNormal(input); - #endif - var material:PhysicalMaterial; - material.diffuseColor=baseColor.rgb*( 1.0 - metallic ); - material.roughness=perceptualRoughness; - material.specularColor=mix( vec3( 0.04), baseColor.rgb, metallic ); - var geometry:Geometry; - geometry.normal=n; - geometry.viewDir=normalize(systemUniform.cameraPosition - input.worldPos); - geometry.position=input.worldPos; - geometry.dotNV = saturate(dot(geometry.normal, geometry.viewDir) ); - //light shading - var reflectedLight=parseLights(geometry,material); - var color=reflectedLight.directDiffuse+reflectedLight.directSpecular; - //ibl - #if USE_IBL&&HAS_UV - var reflectedLightDiffuse=indirectDiffuse_Physical(geometry,material); - var reflectedLightSpecular=indirectSpecular_Physical(geometry,material); - color+=reflectedLightDiffuse.indirectDiffuse; - color+=reflectedLightSpecular.indirectSpecular; - #endif - #if USE_AOTEXTURE - let ao:f32 = textureSample(aoTexture,aoSampler, input.uv).r; - color = mix(color, color * ao, materialUniform.occlusionStrength); - #endif - - #if USE_EMISSIVETEXTURE - let emissive:vec3 = textureSample(emissiveTexture, emissiveSampler,input.uv).rgb ; - color += emissive; - #endif - return vec4(color, baseColor.a); - } - `; - -var pbr_vs = ` - #include - #include - #include - #include - #include - #include - @binding(pbrBinding) @group(0) var materialUniform : MaterialUniform; - @binding(cameraBinding) @group(1) var systemUniform : SystemUniform; - @vertex - fn main(input: VertexInput)-> VertexOutput - { - var output: VertexOutput; - #if HAS_UV - output.uv = input.uv; - #endif - var modelMatrix:mat4x4; - var vNormalView:vec3; - vNormalView = normalize(materialUniform.normalMatrix * vec4(input.normal,0.0)).xyz; - modelMatrix=materialUniform.modelMatrix; - #include - #include - output.normal = vNormalView.xyz; - output.position = systemUniform.projectionMatrix * systemUniform.viewMatrix *modelMatrix* vec4(input.position, 1.0); - let modelPos=modelMatrix *vec4(input.position,1.0); - output.worldPos = modelPos.xyz/modelPos.w; - return output; - } - `; - -const preprocessorSymbols$1 = /#([^\s]*)(\s*)/gm; -// Template literal tag that handles simple preprocessor symbols for WGSL -// shaders. Supports #if/elif/else/endif statements. -function wgslParseDefines(strings, ...values) { - const stateStack = []; - let state = { frag: "", elseIsValid: false, expression: true }; - let depth = 1; - for (let i = 0; i < strings.length; ++i) { - const frag = strings[i]; - const matchedSymbols = frag.matchAll(preprocessorSymbols$1); - let lastIndex = 0; - let valueConsumed = false; - for (const match of matchedSymbols) { - state.frag += frag.substring(lastIndex, match.index); - switch (match[1]) { - case "if": - if (match.index + match[0].length != frag.length) { - throw new Error("#if must be immediately followed by a template expression (ie: ${value})"); - } - valueConsumed = true; - stateStack.push(state); - depth++; - state = { frag: "", elseIsValid: true, expression: !!values[i] }; - break; - case "elif": - if (match.index + match[0].length != frag.length) { - throw new Error("#elif must be immediately followed by a template expression (ie: ${value})"); - } else if (!state.elseIsValid) { - throw new Error("#elif not preceeded by an #if or #elif"); - } - valueConsumed = true; - if (state.expression && stateStack.length != depth) { - stateStack.push(state); - } - state = { frag: "", elseIsValid: true, expression: !!values[i] }; - break; - case "else": - if (!state.elseIsValid) { - throw new Error("#else not preceeded by an #if or #elif"); - } - if (state.expression && stateStack.length != depth) { - stateStack.push(state); - } - state = { frag: match[2], elseIsValid: false, expression: true }; - break; - case "endif": - if (!stateStack.length) { - throw new Error("#endif not preceeded by an #if"); - } - // eslint-disable-next-line no-case-declarations - const branchState = stateStack.length == depth ? stateStack.pop() : state; - state = stateStack.pop(); - depth--; - if (branchState.expression) { - state.frag += branchState.frag; - } - state.frag += match[2]; - break; - default: - // Unknown preprocessor symbol. Emit it back into the output frag unchanged. - state.frag += match[0]; - break; - } - lastIndex = match.index + match[0].length; - } - // If the frag didn't end on one of the preprocessor symbols append the rest of it here. - if (lastIndex != frag.length) { - state.frag += frag.substring(lastIndex, frag.length); - } - // If the next value wasn't consumed by the preprocessor symbol, append it here. - if (!valueConsumed && values.length > i) { - state.frag += values[i]; - } - } - if (stateStack.length) { - throw new Error("Mismatched #if/#endif count"); - } - return state.frag; -} - -function pbrFrag(defines) { - return wgslParseDefines` - #include - #include - #include - #include - #include - #include - #include - #include - struct SystemUniform { - projectionMatrix: mat4x4, - viewMatrix: mat4x4, - inverseViewMatrix: mat4x4, - cameraPosition: vec3, - }; - // uniform vec3 lightProbe[9], -//////////////////////////////////// -struct VertexOutput { - @builtin(position) position: vec4, - @builtin(front_facing) is_front: bool, - @location(0) vUv: vec2, - @location(1) vViewPosition: vec3, // Vector from vertex to camera. - @location(2) vWorldPosition: vec3, - @location(3) vNormal: vec3, - // 可选 - #if ${defines.USE_LIGHTTEXTURE || defines.USE_AOTEXTURE} - @location(${defines.vUv2OutLocation}) vUv2: vec2, - #endif - - #if ${defines.USE_COLOR_ALPHA} - @location(${defines.vColorOutLocation}) vColor: vec4, - #elif ${defines.USE_COLOR || defines.USE_INSTANCING_COLOR} - @location(${defines.vColorOutLocation}) vColor: vec3, - #endif - - #if ${defines.USE_TANGENT} - @location(${defines.vTangentOutLocation}) vTangent: vec3, - @location(${defines.vBitangentOutLocation}) vBitangent: vec3, - #endif -}; - struct PhysicalMaterial { - diffuseColor:vec3, - roughness:f32, - specularColor:vec3, - specularF90:f32, - #if ${defines.USE_CLEARCOAT} - clearcoat:f32, - clearcoatRoughness:f32, - clearcoatF0:vec3, - clearcoatF90:f32, - #endif - - #if ${defines.USE_IRIDESCENCE} - iridescence:f32, - iridescenceIOR:f32, - iridescenceThickness:f32, - iridescenceFresnel:vec3, - iridescenceF0:vec3, - #endif - - #if ${defines.USE_SHEEN} - sheenColor:vec3, - sheenRoughness:f32, - #endif - - #if ${defines.IOR} - ior:f32, - #endif - - #if ${defines.USE_TRANSMISSION} - transmission:f32, - transmissionAlpha:f32, - thickness:f32, - attenuationDistance:f32, - attenuationColor:vec3, - #endif - }; -@binding(0) @group(0) var materialUniform : MaterialUniform; -@binding(0) @group(1) var systemUniform : SystemUniform; -@fragment -fn main(input:VertexOutput)-> @location(0) vec4 { - var diffuseColor:vec4 = vec4(materialUniform.diffuse, materialUniform.opacity ); - // ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); - var reflectedLight:ReflectedLight; - var totalEmissiveRadiance:vec3 = materialUniform.emissive; - #if ${defines.USE_TEXTURE} - var sampledDiffuseColor:vec4 =textureSample(baseTexture, baseSampler, input.vUv); - #if ${defines.DECODE_VIDEO_TEXTURE} - sampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w ); - #endif - - diffuseColor *= sampledDiffuseColor; - #endif - - var roughnessFactor:f32 = materialUniform.roughness; - - #if ${defines.USE_ROUGHNESSTEXTURE} - let texelRoughness:vec4=textureSample(roughnessTexture, baseSampler, input.vUv); - roughnessFactor *= texelRoughness.g; - #endif - - var metalnessFactor:f32 = materialUniform.metalness; - - #if ${defines.USE_METALNESSTEXTURE} - let texelMetalness:vec4 =textureSample(metalnessTexture, baseSampler, input.vUv); - metalnessFactor *= texelMetalness.b; - #endif - - let faceDirection:f32 =select(-1.0,1.0,input.is_front); - #if ${defines.FLAT_SHADED} - let fdx:vec3 = dpdx( input.vViewPosition ); - let fdy:vec3 = dpdy( input.vViewPosition ); - let normal:vec3 = normalize( cross( fdy, fdx ) ); - #else - let normal:vec3 = normalize( input.vNormal ); - #if ${defines.DOUBLE_SIDED} - normal = normal * faceDirection; - #endif - #if ${defines.USE_TANGENT} - let tangent:vec3 = normalize( input.vTangent ); - let bitangent:vec3 = normalize( input.vBitangent ); - #if ${defines.DOUBLE_SIDED} - tangent = tangent * faceDirection; - bitangent = bitangent * faceDirection; - #endif - #if ${defines.TANGENTSPACE_NORMALTEXTURE || defines.USE_CLEARCOAT_NORMALTEXTURE} - let vTBN:mat3x3 = mat3x3( tangent, bitangent, normal ); - #endif - #endif - #endif - - let geometryNormal:vec3 = normal; - - #if ${defines.OBJECTSPACE_NORMALTEXTURE} - normal =textureSample(normalTexture, baseSampler, input.vUv).xyz * 2.0 - 1.0; - #if ${defines.FLIP_SIDED} - normal = - normal; - #endif - #if ${defines.DOUBLE_SIDED} - normal = normal * faceDirection; - #endif - - normal = normalize(materialUniform.normalMatrix * normal ); - - #elif ${defines.TANGENTSPACE_NORMALTEXTURE} - let tempMapN:vec3 =textureSample(normalTexture, baseSampler, input.vUv).xyz * 2.0 - 1.0; - let mapN:vec3 =tempMapN.xy *= materialUniform.normalScale; - #if ${defines.USE_TANGENT} - normal = normalize( vTBN * mapN ); - #else - normal = perturbNormal2Arb( - input.vViewPosition, normal, mapN, faceDirection ); - #endif - - #elif ${defines.USE_BUMPTEXTURE} - - normal = perturbNormalArb( - input.vViewPosition, normal, dHdxy_fwd(), faceDirection ); - #endif - - #if ${defines.USE_CLEARCOAT} - var clearcoatNormal:vec3 = geometryNormal; - #endif - #if ${defines.USE_CLEARCOAT_NORMALTEXTURE} - var clearcoatMapN:vec3 =textureSample(clearcoatNormalTexture, baseSampler, input.vUv).xyz * 2.0 - 1.0; - clearcoatMapN.xy *= materialUniform.clearcoatNormalScale; - #if ${defines.USE_TANGENT} - clearcoatNormal = normalize( vTBN * clearcoatMapN ); - #else - clearcoatNormal = perturbNormal2Arb( - input.vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection ); - #endif - #endif - #if ${defines.USE_EMISSIVETEXTURE} - let emissiveColor:vec4 =textureSample(emissiveTexture, baseSampler, input.vUv); - totalEmissiveRadiance *= emissiveColor.rgb; - #endif - - var material:PhysicalMaterial; - material.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor ); - let dxy:vec3 = max( abs( dpdx( geometryNormal ) ), abs( dpdy( geometryNormal ) ) ); - let geometryRoughness:f32 = max( max( dxy.x, dxy.y ), dxy.z ); - material.roughness = max( roughnessFactor, 0.0525 ); - material.roughness += geometryRoughness; - material.roughness = min( material.roughness, 1.0 ); - - #if ${defines.IOR} - material.ior = materialUniform.ior; - #if ${defines.SPECULAR} - let specularIntensityFactor:f32 = materialUniform.specularIntensity; - let specularColorFactor:vec3 = materialUniform.specularColor; - #if ${defines.USE_SPECULARINTENSITYTEXTURE} - specularIntensityFactor *=textureSample(specularIntensityTexture, baseSampler, input.vUv).a; - #endif - - #if ${defines.USE_SPECULARCOLORTEXTURE} - specularColorFactor *=textureSample(specularColorTexture, baseSampler, input.vUv).rgb; - #endif - - material.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor ); - #else - let specularIntensityFactor:f32 = 1.0; - let specularColorFactor:vec3 = vec3( 1.0 ); - material.specularF90 = 1.0; - #endif - material.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor ); - #else - material.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor ); - material.specularF90 = 1.0; - #endif - #if ${defines.USE_CLEARCOAT} - material.clearcoat = materialUniform.clearcoat; - material.clearcoatRoughness = materialUniform.clearcoatRoughness; - material.clearcoatF0 = vec3( 0.04 ); - material.clearcoatF90 = 1.0; - #if ${defines.USE_CLEARCOATTEXTURE} - material.clearcoat *=textureSample(clearcoatTexture, baseSampler, input.vUv).x; - #endif - #if ${defines.USE_CLEARCOAT_ROUGHNESSTEXTURE} - material.clearcoatRoughness *=textureSample(clearcoatRoughnessTexture, baseSampler, input.vUv).y; - #endif - material.clearcoat = saturate( material.clearcoat ); - material.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 ); - material.clearcoatRoughness += geometryRoughness; - material.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 ); - #endif - #if ${defines.USE_IRIDESCENCE} - material.iridescence = materialUniform.iridescence; - material.iridescenceIOR = materialUniform.iridescenceIOR; - #if ${defines.USE_IRIDESCENCETEXTURE} - material.iridescence *=textureSample(iridescenceTexture, baseSampler, input.vUv).r; - #endif - #if ${defines.USE_IRIDESCENCE_THICKNESSTEXTURE} - material.iridescenceThickness = (materialUniform.iridescenceThicknessMaximum - materialUniform.iridescenceThicknessMinimum) * textureSample(iridescenceThicknessTexture, baseSampler, input.vUv).g + materialUniform.iridescenceThicknessMinimum; - #else - material.iridescenceThickness = materialUniform.iridescenceThicknessMaximum; - #endif - #endif - #if ${defines.USE_SHEEN} - material.sheenColor = materialUniform.sheenColor; - #if ${defines.USE_SHEENCOLORTEXTURE} - material.sheenColor *=textureSample(sheenColorTexture, baseSampler, input.vUv).rgb; - #endif - material.sheenRoughness = clamp( materialUniform.sheenRoughness, 0.07, 1.0 ); - #if ${defines.USE_SHEENROUGHNESSTEXTURE} - material.sheenRoughness *=textureSample(sheenRoughnessTexture, baseSampler, input.vUv).a; - #endif - #endif - - var geometry:GeometricContext; - geometry.position = - input.vViewPosition; - geometry.normal = normal; - // geometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( input.vViewPosition ); - geometry.viewDir = normalize( input.vViewPosition); - - #if ${defines.USE_CLEARCOAT} - geometry.clearcoatNormal = clearcoatNormal; - #endif - - #if ${defines.USE_IRIDESCENCE} - let dotNVi:f32 = saturate( dot( normal, geometry.viewDir ) ); - if ( material.iridescenceThickness == 0.0 ) { - material.iridescence = 0.0; - } - else { - material.iridescence = saturate( material.iridescence ); - } - if ( material.iridescence > 0.0 ) { - material.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor ); - material.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi ); - } - #endif - - var iblIrradiance:vec3 = vec3( 0.0 ); - var irradiance:vec3 = getAmbientLightIrradiance(commonLightsParms.ambient); - //irradiance += getLightProbeIrradiance( lightProbe, geometry.normal,systemUniform.viewMatrix ); - - var radiance:vec3 = vec3( 0.0 ); - var clearcoatRadiance:vec3 = vec3( 0.0 ); - - #if ${defines.USE_LIGHTTEXTURE} - let lightMapTexel:vec4 =textureSample(lightTexture, baseSampler, input.vUv2); - let lightMapIrradiance:vec3 = lightMapTexel.rgb * materialUniform.lightTextureIntensity; - irradiance += lightMapIrradiance; - #endif - //&& defines.STANDARD&&defines.ENVTEXTURE_TYPE_CUBE_UV - #if ${defines.USE_ENVTEXTURE} - iblIrradiance += getIBLIrradiance( geometry.normal,baseSampler,systemUniform.viewMatrix ); - #endif - #if ${defines.USE_ENVTEXTURE} - radiance += getIBLRadiance( geometry.viewDir,baseSampler,systemUniform.viewMatrix, geometry.normal, materialUniform.roughness ); - #if ${defines.USE_CLEARCOAT} - clearcoatRadiance += getIBLRadiance( geometry.viewDir,baseSampler,systemUniform.viewMatrix, geometry.clearcoatNormal, material.clearcoatRoughness ); - #endif - #endif - //直接光照 - let dirReflectedLight:ReflectedLight= parseLights(geometry,material); - reflectedLight.directDiffuse +=dirReflectedLight.directDiffuse; - reflectedLight.directSpecular +=dirReflectedLight.directSpecular; - //间接漫反射 - let indirectDiffuseLight:ReflectedLight= RE_IndirectDiffuse_Physical( irradiance, geometry, material); - reflectedLight.directDiffuse +=indirectDiffuseLight.indirectDiffuse; - reflectedLight.directSpecular +=indirectDiffuseLight.indirectSpecular; - //间接高光 - let indirectSpecularLight:ReflectedLight=RE_IndirectSpecular_Physical( radiance, iblIrradiance, clearcoatRadiance, geometry, material); - reflectedLight.directDiffuse +=indirectSpecularLight.indirectDiffuse; - reflectedLight.directSpecular +=indirectSpecularLight.indirectSpecular; - //环境光遮蔽 - #if ${defines.USE_AOTEXTURE} - let ambientOcclusion:f32 = (textureSample(aoTexture, baseSampler, input.vUv2).r - 1.0 ) * materialUniform.aoTextureIntensity + 1.0; - - reflectedLight.indirectDiffuse *= ambientOcclusion; - //&&defines.STANDARD - #if ${defines.USE_ENVTEXTURE} - let dotNV:f32 = saturate( dot( geometry.normal, geometry.viewDir ) ); - reflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness ); - #endif - #endif - - var totalDiffuse:vec3 = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse; - var totalSpecular:vec3 = reflectedLight.directSpecular + reflectedLight.indirectSpecular; - //透射 - #if ${defines.USE_TRANSMISSION} - material.transmission = materialUniform.transmission; - material.transmissionAlpha = 1.0; - material.thickness = materialUniform.thickness; - material.attenuationDistance = materialUniform.attenuationDistance; - material.attenuationColor = materialUniform.attenuationColor; - #if ${defines.USE_TRANSMISSIONTEXTURE} - material.transmission *=textureSample(transmissionTexture, baseSampler, input.vUv).r; - #endif - #if ${defines.USE_THICKNESSTEXTURE} - material.thickness *=textureSample(thicknessTexture, baseSampler, input.vUv).g; - #endif - let pos:vec3 = vWorldPosition; - let v:vec3 = normalize( cameraPosition - pos ); - let n:vec3 = inverseTransformDirection( normal, systemUniform.viewMatrix ); - let transmission:vec4 = getIBLVolumeRefraction( - n, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, pos, modelMatrix, systemUniform.viewMatrix, systemUniform.projectionMatrix, material.ior, material.thickness, material.attenuationColor, material.attenuationDistance ); - material.transmissionAlpha = mix( material.transmissionAlpha, transmission.a, material.transmission ); - totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); - #endif - - let outgoingLight:vec3 = totalDiffuse + totalSpecular + totalEmissiveRadiance; - - #if ${defines.USE_SHEEN} - let sheenEnergyComp:f32 = 1.0 - 0.157 * max3( material.sheenColor ); - outgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular; - #endif - - #if ${defines.USE_CLEARCOAT} - let dotNVcc:f32 = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) ); - let Fcc:vec3 = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc ); - outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat; - #endif - - #if ${defines.USE_TRANSMISSION} - diffuseColor.a *= material.transmissionAlpha + 0.1; - #endif - - var finnalColor:vec4; - finnalColor = vec4( outgoingLight, diffuseColor.a ); - #if ${defines.TONE_MAPPING} - finnalColor.rgb = toneMapping( finnalColor.rgb,materialUniform.toneMappingExposure ); - #endif - - finnalColor = linearToOutputTexel( finnalColor); - - #if ${defines.PREMULTIPLIED_ALPHA} - finnalColor.rgb *= finnalColor.a; - #endif - #if ${defines.DITHERING} - finnalColor.rgb = dithering( finnalColor.rgb ); - #endif - return finnalColor; - }`; -} - -function pbrVert(defines) { - return wgslParseDefines` - #include - struct VertexOutput { - @builtin(position) position: vec4, - @location(0) vUv: vec2, - @location(1) vViewPosition: vec3, // Vector from vertex to camera. - @location(2) vWorldPosition: vec3, - @location(3) vNormal: vec3, - // 可选 - #if ${defines.USE_LIGHTTEXTURE || defines.USE_AOTEXTURE} - @location(${defines.vUv2OutLocation}) vUv2: vec2, - #endif - - #if ${defines.USE_COLOR_ALPHA} - @location(${defines.vColorOutLocation}) vColor: vec4, - #elif ${defines.USE_COLOR || defines.USE_INSTANCING_COLOR} - @location(${defines.vColorOutLocation}) vColor: vec3, - #endif - - #if ${defines.USE_TANGENT} - @location(${defines.vTangentOutLocation}) vTangent: vec3, - @location(${defines.vBitangentOutLocation}) vBitangent: vec3, - #endif - }; - struct GlobalUniform { - projectionMatrix: mat4x4, - viewMatrix: mat4x4, - inverseViewMatrix: mat4x4, - cameraPosition: vec3, - }; - - //texture and sampler - // @group(0) @binding(${defines.samplerBinding}) var baseSampler: sampler; - #if ${defines.USE_SKINNING} - //uniform highp sampler2D boneTexture; - @group(0) @binding(${defines.boneTextureBinding}) var boneTexture: texture_2d; - #endif - - #if ${defines.USE_DISPLACEMENTTEXTURE} - //uniform sampler2D displacementMap; - @group(0) @binding(${defines.displacementTextureBinding}) var displacementMap: texture_2d; - #endif - - #if ${defines.MORPHTARGETS_TEXTURE} - //uniform sampler2DArray morphTargetsTexture; - @group(0) @binding(${defines.morphTargetsTextureBinding}) var morphTargetsTexture: texture_2d_array; - #endif - - struct VertexInput { - @location(0) position: vec3, - - @location(1) normal: vec3, - - @location(2) uv: vec2, - #if ${defines.USE_LIGHTTEXTURE || defines.USE_AOTEXTURE} - @location(${defines.uv2Location}) uv2:vec2, - #endif - #if ${defines.USE_INSTANCING} - @location(${defines.instanceMatrixLocation}) instanceMatrix:mat4x4, - #endif - #if ${defines.USE_INSTANCING_COLOR} - @location(${defines.instanceColorLocation}) instanceColor:vec3, - #endif - - #if ${defines.USE_TANGENT} - @location(${defines.tangentLocation}) tangent:vec4, - #endif - #if ${defines.USE_COLOR_ALPHA} - @location(${defines.colorLocation}) color:vec4, - #elif ${defines.USE_COLOR} - @location(${defines.colorLocation}) color:vec3, - #endif - - #if ${defines.USE_MORPHTARGETS && !defines.MORPHTARGETS_TEXTURE} - @location(${defines.morphTarget0Location}) morphTarget0:vec3, - - @location(${defines.morphTarget1Location}) morphTarget1:vec3, - - @location(${defines.morphTarget2Location}) morphTarget2:vec3, - - @location(${defines.morphTarget3Location}) morphTarget3:vec3, - #if ${defines.USE_MORPHNORMALS} - @location(${defines.morphNormal0Location}) morphNormal0:vec3, - - @location(${defines.morphNormal1Location}) morphNormal1:vec3, - - @location(${defines.morphNormal2Location}) morphNormal2:vec3, - - @location(${defines.morphNormal3Location}) morphNormal3:vec3, - #else - @location(${defines.morphTarget4Location}) morphTarget4:vec3, - - @location(${defines.morphTarget5Location}) morphTarget5:vec3, - - @location(${defines.morphTarget6Location}) morphTarget6:vec3, - - @location(${defines.morphTarget7Location}) morphTarget7:vec3, - #endif - #endif - #if ${defines.USE_SKINNING} - @location(${defines.skinIndexLocation}) skinIndex:vec4, - @location(${defines.skinWeightLocation}) skinWeight:vec4, - #endif - } - - #if ${defines.MORPHTARGETS_TEXTURE} - fn getMorph( vertexIndex:u32, morphTargetIndex:u32,offset:u32 )->vec4 { - let texelIndex:u32 = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset; - let y:u32 = texelIndex / materialUniform.morphTargetsTextureSize.x; - let x:u32 = texelIndex - y * materialUniform.morphTargetsTextureSize.x; - let morphUV:vec3 = vec3( x, y, morphTargetIndex ); - //textureLoad - //return texelFetch( morphTargetsTexture, morphUV, 0 ); - return textureLoad( morphTargetsTexture, morphUV, 0 ); - } - #endif - #if ${defines.USE_SKINNING} - fn getBoneMatrix( i:f32 )->mat4x4 { - let j:f32 = i * 4.0; - let x:f32 = j%f32( materialUniform.boneTextureSize ); - let y:f32 = floor( j / f32( materialUniform.boneTextureSize ) ); - let dx:f32 = 1.0 / f32( materialUniform.boneTextureSize ); - let dy:f32 = 1.0 / f32( materialUniform.boneTextureSize ); - y = dy * ( y + 0.5 ); - - let v1:vec4 = textureSample(boneTexture, baseSampler, vec2( dx * ( x + 0.5 ), y ) ); - let v2:vec4 = textureSample(boneTexture, baseSampler, vec2( dx * ( x + 1.5 ), y ) ); - let v3:vec4 = textureSample(boneTexture, baseSampler, vec2( dx * ( x + 2.5 ), y ) ); - let v4:vec4 = textureSample(boneTexture, baseSampler, vec2( dx * ( x + 3.5 ), y ) ); - let bone:mat4x4 = mat4x4( v1, v2, v3, v4 ); - return bone; - } - #endif - - @binding(0) @group(0) var materialUniform : MaterialUniform; - @binding(0) @group(1) var globalUniform : GlobalUniform; - @vertex - fn main(input:VertexInput)->VertexOutput { - var vertexOutput:VertexOutput; - #if ${defines.USE_TEXTURE} - vertexOutput.vUv = input.uv; - #endif - #if ${defines.USE_LIGHTTEXTURE || defines.USE_AOTEXTURE} - vertexOutput.vUv2 input.uv2; - #endif - #if ${defines.USE_COLOR_ALPHA} - vertexOutput.vColor = vec4( 1.0 ); - #elif ${defines.USE_COLOR || defines.USE_INSTANCING_COLOR} - vertexOutput.vColor = vec3( 1.0 ); - #endif - #if ${defines.USE_COLOR} - vertexOutput.vColor *= input.color; - #endif - #if ${defines.USE_INSTANCING_COLOR} - vertexOutput.vColor.xyz *= input.instanceColor.xyz; - #endif - #if ${defines.USE_MORPHCOLORS && defines.MORPHTARGETS_TEXTURE} - vertexOutput.vColor *= materialUniform.morphTargetBaseInfluence; - for (let i : u32 = 0u; i < materialUniform.MORPHTARGETS_COUNT; i = i + 1u ) { - #if ${defines.USE_COLOR_ALPHA} - if ( materialUniform.morphTargetInfluences[ i ] ! = 0.0 ) vertexOutput.vColor += getMorph( gl_VertexID, i, 2 ) * materialUniform.morphTargetInfluences[ i ]; - #elif ${defines.USE_COLOR} - if ( materialUniform.morphTargetInfluences[ i ] ! = 0.0 ) vertexOutput.vColor += getMorph( gl_VertexID, i, 2 ).rgb * materialUniform.morphTargetInfluences[ i ]; - #endif - } - #endif - var objectNormal:vec3 = vec3(input.normal); - #if ${defines.USE_TANGENT} - let objectTangent:vec3 = vec3( input.tangent.xyz ); - #endif - #if ${defines.USE_MORPHNORMALS} - objectNormal *= materialUniform.morphTargetBaseInfluence; - #if ${defines.MORPHTARGETS_TEXTURE} - for ( let i : u32 = 0u; i < materialUniform.MORPHTARGETS_COUNT; i = i + 1u) { - if ( materialUniform.morphTargetInfluences[ i ] ! = 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * materialUniform.morphTargetInfluences[ i ]; - } - #else - objectNormal += morphNormal0 * materialUniform.morphTargetInfluences[ 0 ]; - objectNormal += morphNormal1 * materialUniform.morphTargetInfluences[ 1 ]; - objectNormal += morphNormal2 * materialUniform.morphTargetInfluences[ 2 ]; - objectNormal += morphNormal3 * materialUniform.morphTargetInfluences[ 3 ]; - #endif - #endif - #if ${defines.USE_SKINNING} - let boneMatX:mat4x4 = getBoneMatrix( input.skinIndex.x ); - let boneMatY:mat4x4 = getBoneMatrix( input.skinIndex.y ); - let boneMatZ:mat4x4 = getBoneMatrix( input.skinIndex.z ); - let boneMatW:mat4x4 = getBoneMatrix( input.skinIndex.w ); - #endif - #if ${defines.USE_SKINNING} - let skinMatrix:mat4x4 = mat4x4( 0.0 ); - skinMatrix += input.skinWeight.x * boneMatX; - skinMatrix += input.skinWeight.y * boneMatY; - skinMatrix += input.skinWeight.z * boneMatZ; - skinMatrix += input.skinWeight.w * boneMatW; - skinMatrix = materialUniform.bindMatrixInverse * skinMatrix * materialUniform.bindMatrix; - objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz; - #if ${defines.USE_TANGENT} - objectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz; - #endif - #endif - var transformedNormal:vec3 = objectNormal; - // transformedNormal+=vec3(0.0); - #if ${defines.USE_INSTANCING} - let m:mat3x3 = mat3x3( input.instanceMatrix ); - transformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) ); - transformedNormal = m * transformedNormal; - #endif - transformedNormal = materialUniform.normalMatrix * transformedNormal; - #if ${defines.FLIP_SIDED} - transformedNormal = - transformedNormal; - #endif - #if ${defines.USE_TANGENT} - let transformedTangent:vec3 = (globalUniform.viewMatrix*materialUniform.modelMatrix * vec4( objectTangent, 0.0 ) ).xyz; - #if ${defines.FLIP_SIDED} - transformedTangent = - transformedTangent; - #endif - #endif - vertexOutput.vNormal = normalize( transformedNormal ); - #if ${defines.FLAT_SHADED} - #if ${defines.USE_TANGENT} - vTangent = normalize( transformedTangent ); - vBitangent = normalize( cross( vNormal, vTangent ) * input.tangent.w ); - #endif - #endif - let transformed:vec3 = vec3( input.position ); - #if ${defines.USE_MORPHTARGETS} - transformed *= materialUniform.morphTargetBaseInfluence; - #if ${defines.MORPHTARGETS_TEXTURE} - for ( let i : u32 = 0u; i < materialUniform.MORPHTARGETS_COUNT; i = i + 1u ) { - if ( materialUniform.morphTargetInfluences[ i ] ! = 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ]; - } - #else - transformed += input.morphTarget0 * materialUniform.morphTargetInfluences[ 0 ]; - transformed += input.morphTarget1 * materialUniform.morphTargetInfluences[ 1 ]; - transformed += input.morphTarget2 * materialUniform.morphTargetInfluences[ 2 ]; - transformed += input.morphTarget3 * materialUniform.morphTargetInfluences[ 3 ]; - #if ${defines.USE_MORPHNORMALS} - transformed += input.morphTarget4 * materialUniform.morphTargetInfluences[ 4 ]; - transformed += input.morphTarget5 * materialUniform.morphTargetInfluences[ 5 ]; - transformed += input.morphTarget6 * materialUniform.morphTargetInfluences[ 6 ]; - transformed += input.morphTarget7 * materialUniform.morphTargetInfluences[ 7 ]; - #endif - #endif - #endif - #if ${defines.USE_SKINNING} - let skinVertex:vec4 = materialUniform.bindMatrix * vec4( transformed, 1.0 ); - let skinned:vec4 = vec4( 0.0 ); - skinned += boneMatX * skinVertex * input.skinWeight.x; - skinned += boneMatY * skinVertex * input.skinWeight.y; - skinned += boneMatZ * skinVertex * input.skinWeight.z; - skinned += boneMatW * skinVertex * input.skinWeight.w; - transformed = ( materialUniform.bindMatrixInverse * skinned ).xyz; - #endif - #if ${defines.USE_DISPLACEMENTTEXTURE} - transformed += normalize( objectNormal ) * (textureSample(displacementMap, baseSampler, vUv).x * materialUniform.displacementScale + materialUniform.displacementBias ); - #endif - var mvPosition:vec4 = vec4( transformed, 1.0 ); - #if ${defines.USE_INSTANCING} - mvPosition = input.instanceMatrix * mvPosition; - #endif - mvPosition = globalUniform.viewMatrix*materialUniform.modelMatrix * mvPosition; - vertexOutput.position = globalUniform.projectionMatrix * mvPosition; - vertexOutput.vViewPosition = - mvPosition.xyz/mvPosition.w; - #if ${defines.USE_ENVTEXTURE || defines.DISTANCE || defines.USE_TRANSMISSION} - var worldPosition:vec4 = vec4( transformed, 1.0 ); - #if ${defines.USE_INSTANCING} - worldPosition = input.instanceMatrix * worldPosition; - #endif - worldPosition = materialUniform.modelMatrix * worldPosition; - #endif - #if ${defines.USE_TRANSMISSION} - vertexOutput.vWorldPosition = worldPosition.xyz; - #endif - return vertexOutput; - } - `; -} - -var phongFrag = ` - struct MaterialUniform { - modelMatrix: mat4x4, - color: vec3, - opacity:f32, - normalMatrix: mat4x4, - emissive:vec3, - shininess:f32, - specular:vec3, - } - #include - #include - #include - #include - @binding(phongBinding) @group(0) var materialUniform : MaterialUniform; - @binding(cameraBinding) @group(1) var systemUniform : SystemUniform; - @fragment - fn main(input:FragInput) -> @location(0) vec4 { - var totalEmissiveRadiance:vec3 = materialUniform.emissive; - var color:vec4; - #if USE_COLORTEXTURE - color= vec4(textureSample(baseColorTexture, baseColorSampler, input.uv).rgb+materialUniform.color,materialUniform.opacity); - #else - color=vec4(materialUniform.color,materialUniform.opacity); - #endif - let v:vec3 = normalize( systemUniform.cameraPosition - input.worldPos); - #if USE_NORMALTEXTURE - let n:vec3 = getNormalByNormalTexture(input); - #else - let n:vec3 = getNormal(input); - #endif - var geometry:Geometry; - geometry.normal=n; - geometry.viewDir=v; - geometry.position=input.worldPos; - let lightColor:ReflectedLight=parseLights(geometry,materialUniform.shininess); - // var finnalColor:vec3=color.xyz + (lightColor.directDiffuse + lightColor.directSpecular + lightColor.ambient); - var finnalColor:vec3=color.xyz * (lightColor.directDiffuse + lightColor.directSpecular + lightColor.ambient); - - // finnalColor = lightColor.testColor.xyz; - - return vec4(finnalColor,color.a); - }`; - -var phongVert = ` - struct MaterialUniform { - modelMatrix: mat4x4, - color: vec3, - opacity:f32, - normalMatrix: mat4x4, - emissive:vec3, - specular:vec3, - shininess:f32, - } - #include - #include - #include - @binding(phongBinding) @group(0) var selfUniform : MaterialUniform; - @binding(cameraBinding) @group(1) var systemUniform : SystemUniform; - @vertex - fn main(input: VertexInput) -> VertexOutput { - var output: VertexOutput; - #if HAS_UV - output.uv = input.uv; - #endif - let modelPos=selfUniform.modelMatrix *vec4(input.position,1.0); - output.worldPos = modelPos.xyz/modelPos.w; - let vNormalView = selfUniform.normalMatrix * vec4(input.normal,0.0); - output.normal = vNormalView.xyz; - output.view = systemUniform.cameraPosition.xyz - modelPos.xyz; - let viewPosition=systemUniform.viewMatrix * modelPos; - output.viewPosition = -viewPosition.xyz; - output.position = systemUniform.projectionMatrix * systemUniform.viewMatrix * modelPos; - return output; - }`; - -const point_fs = ` - #include - struct SelfUniform { - modelMatrix: mat4x4, - color:vec3, - size:f32, - opacity:f32, - } - @binding(pointBinding) @group(0) var selfUniform : SelfUniform; - #if USE_COLORTEXTURE - @group(0) @binding(baseColorSamplerBinding) var baseColorSampler: sampler; - @group(0) @binding(baseColorTextureBinding) var baseColorTexture: texture_2d; - #endif - @fragment - fn main(input:PointFragInput) -> @location(0) vec4 { - var color:vec4=vec4(selfUniform.color,selfUniform.opacity); - #if USE_COLORTEXTURE - color=textureSample(baseColorTexture, baseColorSampler, input.uv); - #endif - #if HAS_COLOR - color=vec4(input.color,selfUniform.opacity); - #endif - return color; - } - `; - -const point_vs = ` - #include - #include - #include - struct SelfUniform { - modelMatrix: mat4x4, - color:vec3, - size:f32, - opacity:f32, - } - @binding(pointBinding) @group(0) var selfUniform : SelfUniform; - @binding(cameraBinding) @group(1) var systemUniform : SystemUniform; - @vertex - fn main(input: PointVertInput) -> PointVertOutput { - var output:PointVertOutput; - let mvPosition:vec4= ystemUniform.viewMatrix *selfUniform.modelMatrix*vec4(0.0,0.0,0.0, 1.0 ); - #if HAS_UV - output.uv=input.uv; - #endif - #if HAS_COLOR - output.color=input.color; - #endif - #if HAS_SIZE - output.size=input.size; - #endif - vec2 alignedPosition = input.position.xy* selfUniform.size; - mvPosition.xy += alignedPosition; - output.position = systemUniform.projectionMatrix * mvPosition; - return output; - } - `; - -var quadFrag = ` - @group(0) @binding(1) var baseSampler: sampler; - @group(0) @binding(0) var colorTexture: texture_2d; - struct VertexOutput { - @builtin(position) position: vec4, - @location(0) uv: vec2, - }; - @fragment - fn main(input:VertexOutput) -> @location(0) vec4 { - return textureSample(colorTexture, baseSampler, vec2(input.uv.x,1.0-input.uv.y)); - } - `; - -var quadVert = ` - struct VertexInput { - @location(positionLocation) position: vec2, - } - struct VertexOutput { - @builtin(position) position: vec4, - @location(0) uv: vec2, - }; - @vertex - fn main(input: VertexInput) -> VertexOutput { - var output:VertexOutput; - output.uv = input.position * 0.5 + 0.5; - output.position = vec4(input.position, 0.0, 1.0);; - return output; - } - `; - -var skyBoxFrag = ` - fn lessThanEqual(a:vec3,b:vec3)->vec3{ - let xValue:f32=select(b.x,a.x,a.x<=b.x); - let yValue:f32=select(b.y,a.y,a.y<=b.y); - let zValue:f32=select(b.z,a.z,a.z<=b.z); - return vec3(xValue,yValue,zValue); - } - fn LinearTosRGB( value:vec4 )->vec4 { - return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a ); - } - struct FragmentInput { - @location(0) texCoord : vec3 - }; - @group(0) @binding(2) var defaultSampler: sampler; - @group(0) @binding(1) var skyboxTexture: texture_cube; - @fragment - fn main(input : FragmentInput) -> @location(0) vec4 { - let color = textureSample(skyboxTexture, defaultSampler, input.texCoord); - return LinearTosRGB(color); - } -`; - -var skyBoxVert = ` - struct SystemUniform { - projectionMatrix: mat4x4, - viewMatrix: mat4x4, - inverseViewMatrix: mat4x4, - cameraPosition: vec3, - }; - struct MaterialUniform { - modelMatrix: mat4x4, - } - @binding(skyboxBinding) @group(0) var selfUniform : MaterialUniform; - @binding(cameraBinding) @group(1) var systemUniform : SystemUniform; - struct VertexInput { - @location(positionLocation) position : vec3, - }; - struct VertexOutput { - @builtin(position) position : vec4, - @location(0) texCoord : vec3, - }; - @vertex - fn main(input : VertexInput) -> VertexOutput { - var output : VertexOutput; - output.texCoord = input.position.xyz; - var modelView = systemUniform.viewMatrix; - // Drop the translation portion of the modelView matrix - modelView[3] = vec4(0.0, 0.0, 0.0, modelView[3].w); - output.position = systemUniform.projectionMatrix * modelView * vec4(input.position,1.0); - output.position = output.position.xyww; - return output; - } - `; - -const sprite_fs = ` - #include - struct SelfUniform { - modelMatrix: mat4x4, - color:vec3, - rotation:f32, - center:vec2, - opacity:f32, - } - @binding(spriteBinding) @group(0) var selfUniform : SelfUniform; - #if USE_COLORTEXTURE - @group(0) @binding(baseColorSamplerBinding) var baseColorSampler: sampler; - @group(0) @binding(baseColorTextureBinding) var baseColorTexture: texture_2d; - #endif - @fragment - fn main(input:VertexOutput) -> @location(0) vec4 { - #if USE_COLORTEXTURE - return textureSample(baseColorTexture, baseColorSampler, input.uv); - #else - return vec4(selfUniform.color,selfUniform.opacity); - #endif - } - `; - -const sprite_vs = ` - - #include - #include - #include - struct SelfUniform { - modelMatrix: mat4x4, - color:vec3, - rotation:f32, - center:vec2, - opacity:f32, - } - @binding(spriteBinding) @group(0) var selfUniform : SelfUniform; - @binding(cameraBinding) @group(1) var systemUniform : SystemUniform; - @vertex - fn main(input: VertexInput) -> VertexOutput { - var output:VertexOutput; - var mvPosition:vec4= systemUniform.viewMatrix *selfUniform.modelMatrix*vec4(0.0,0.0,0.0,1.0); - #if HAS_UV - output.uv=input.uv; - #endif - var scale:vec2; - scale.x = length(vec3(selfUniform.modelMatrix[0].x, selfUniform.modelMatrix[0].y, selfUniform.modelMatrix[0].z)); - scale.y = length(vec3(selfUniform.modelMatrix[1].x, selfUniform.modelMatrix[1].y, selfUniform.modelMatrix[1].z)); - // scale *= - mvPosition.z; - var alignedPosition:vec2 =(input.position.xy- (selfUniform.center - vec2(0.5,0.5))) * scale; - let rotatedPositionX = cos(selfUniform.rotation) * alignedPosition.x - sin( selfUniform.rotation ) * alignedPosition.y; - let rotatedPositionY = sin(selfUniform.rotation) * alignedPosition.x + cos( selfUniform.rotation ) * alignedPosition.y; - var rotatedPosition=vec2(rotatedPositionX,rotatedPositionY); - let newPoint =mvPosition.xy+ rotatedPosition; - output.position = systemUniform.projectionMatrix * vec4(newPoint.x,newPoint.y,mvPosition.z,mvPosition.w); - return output; - } - `; - -var blendFrag = ` - struct FragInput { - @location(0) uv: vec2, - }; - @group(0) @binding({{tDiffuseBinding}}) var tDiffuse: texture_2d; - @group(0) @binding({{baseColorTextureBinding}}) var baseColorTexture: texture_2d; - @group(0) @binding({{tSamplerBinding}}) var tSampler: sampler; - @fragment - fn main(input:FragInput) -> @location(0) vec4 { - let postColor:vec4 = textureSample(tDiffuse, tSampler, input.uv); - let baseColor:vec4 = textureSample(baseColorTexture, tSampler, input.uv); - return baseColor+postColor; - } - `; - -var Blur = ` - struct FragInput { - @location(0) uv: vec2, - } - struct BlurUniforms { - direction:vec2, - } - fn gaussianPdf(x:f32, sigma:f32)->f32 { - return 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma; - } - @group(0) @binding(0) var blurUniforms : BlurUniforms; - @group(0) @binding({{tDiffuseBinding}}) var tDiffuse: texture_2d; - @group(0) @binding({{tSamplerBinding}}) var tSampler: sampler; - @fragment - fn main(input:FragInput) -> @location(0) vec4 { - let invSize:vec2 = vec2(1.0,1.0) / vec2(textureDimensions(tDiffuse)); - let fSigma:f32 =f32(sigmaConst); - var weightSum:f32 = gaussianPdf(0.0, fSigma); - let baseColor=textureSample(tDiffuse, tSampler, input.uv); - var diffuseSum:vec3 = baseColor.rgb * weightSum; - let uvOffset:vec2 = blurUniforms.direction * invSize; - for( var i : u32 = 1; i < kernelRadius;i = i + 1 ) { - let x:f32 = f32(i); - let w:f32 = gaussianPdf(x, fSigma); - let sample1:vec3=textureSample(tDiffuse, tSampler, input.uv+ uvOffset*x).rgb; - let sample2:vec3=textureSample(tDiffuse, tSampler, input.uv- uvOffset*x).rgb; - diffuseSum =diffuseSum+ (sample2+sample2)* w; - weightSum += 2.0 * w; - } - diffuseSum/=weightSum; - return vec4(diffuseSum,baseColor.a); - } - `; - -var LuminosityHigh = ` - struct LuminosityUniforms{ - luminosityThreshold:f32, - smoothWidth:f32, - defaultColor:vec3, - defaultOpacity:f32, - } - struct FragInput { - @location(0) uv: vec2, - }; - @group(0) @binding(0) var luminosityUniforms : LuminosityUniforms; - @group(0) @binding({{tDiffuseBinding}}) var tDiffuse: texture_2d; - @group(0) @binding({{tSamplerBinding}}) var tSampler: sampler; - @fragment - fn main(input:FragInput)-> @location(0) vec4 { - - let texel:vec4 = textureSample(tDiffuse, tSampler, input.uv); - - let luma:vec3 = vec3( 0.299,0.587,0.114 ); - - let v:f32 = dot( texel.xyz, luma ); - - let outputColor:vec4 = vec4( luminosityUniforms.defaultColor.rgb, luminosityUniforms.defaultOpacity ); - - let alpha:f32 = smoothstep( luminosityUniforms.luminosityThreshold, luminosityUniforms.luminosityThreshold + luminosityUniforms.smoothWidth, v ); - - return mix( outputColor, texel, alpha ); - } - `; - -const FragInput = ` - struct FragInput { - @builtin(front_facing) frontFacing: bool, - @location(0) worldPos:vec3, - @location(1) normal:vec3, - @location(2) uv:vec2, - @location(3) view: vec3, // Vector from vertex to camera. - @location(4) color: vec4, - @location(5) viewPosition: vec3, - } - `; - -const PointFragInput = ` - struct PointFragInput{ - @location(0) uv:vec2, - @location(1) color: vec4, - @location(2) size: f32, - } - `; - -const PointVertInput = ` - struct PointVertInput { - @location(positionLocation) position: vec3, - @location(uvLocation) uv: vec2, - #if HAS_COLOR - @location(colorLocation) color: vec3, - #endif - #if HAS_SIZE - @location(sizeLocation) size: f32, - #endif - #if USE_INSTANCE - @builtin(instance_index) instanceIdx : u32 - #endif - } - `; - -const PointVertOutput = ` - struct PointVertOutput{ - @builtin(position) position:vec4, - @location(0) uv:vec2, - @location(1) color: vec4, - @location(2) size: f32, - } - `; - -const VertexInput = ` - struct VertexInput { - @location(positionLocation) position: vec3, - #if HAS_NORMAL - @location(normalLocation) normal: vec3, - #endif - #if HAS_COLOR - @location(colorLocation) color: vec3, - #endif - #if HAS_UV - @location(uvLocation) uv: vec2, - #endif - #if HAS_SKIN - @location(joint0Location) joint0:vec4, - @location(weight0Location) weight0:vec4, - #endif - #if USE_INSTANCE - @builtin(instance_index) instanceIdx : u32 - #endif - } - `; - -const VertexOutput = ` - struct VertexOutput { - @builtin(position) position:vec4, - @location(0) worldPos:vec3, - @location(1) normal:vec3, - @location(2) uv:vec2, - @location(3) view: vec3, // Vector from vertex to camera. - @location(4) color: vec4, - @location(5) viewPosition: vec3, - } - `; - -const SystemUniform = ` - struct SystemUniform { - projectionMatrix: mat4x4, - viewMatrix: mat4x4, - inverseViewMatrix: mat4x4, - cameraPosition: vec3, - }; - `; - -const TextureAndSamplerDefine = ` - #if USE_IBL - @group(0) @binding(specularEnvTextureBinding) var specularEnvTexture: texture_cube; - @group(0) @binding(specularEnvSamplerBinding) var specularEnvSampler: sampler; - #endif - #if USE_TEXTURE - @group(0) @binding(baseColorTextureBinding) var baseColorTexture: texture_2d; - @group(0) @binding(baseColorSamplerBinding) var baseColorSampler: sampler; - #endif - // normal map - #if USE_NORMALTEXTURE - @group(0) @binding(normalTextureBinding) var normalTexture: texture_2d; - @group(0) @binding(normalSamplerBinding) var normalSampler: sampler; - #endif - // emmisve map - #if USE_EMISSIVETEXTURE - @group(0) @binding(emissiveTextureBinding) var emissiveTexture: texture_2d; - @group(0) @binding(emissiveSamplerBinding) var emissiveSampler: sampler; - #endif - - // metal roughness - #if USE_METALNESSTEXTURE - @group(0) @binding(metalnessRoughnessTextureBinding) var metalnessRoughnessTexture: texture_2d; - @group(0) @binding(metalnessRoughnessSamplerBinding) var metalnessRoughnessSampler: sampler; - #endif - // occlusion texture - #if USE_AOTEXTURE - @group(0) @binding(aoTextureBinding) var aoTexture: texture_2d; - @group(0) @binding(aoSamplerBinding) var aoSampler: sampler; - #endif - #if USE_NORMALTEXTURE - #include - #include - #else - #include - #endif - `; - -function environment(defines) { - return wgslParseDefines` - #if ${defines.ENVTEXTURE_TYPE_CUBE_UV} - const cubeUV_minMipLevel:f32= 4.0; - const cubeUV_minTileSize:f32= 16.0; - const CUBEUV_MAX_MIP:f32=6.0; - const CUBEUV_TEXEL_WIDTH:f32=1.0/256.0; - const CUBEUV_TEXEL_HEIGHT:f32=1.0/256.0; - fn getFace(direction:vec3 )->f32 { - let absDirection:vec3 = abs( direction ); - var face:f32 = - 1.0; - if ( absDirection.x > absDirection.z ) { - if ( absDirection.x > absDirection.y ){ - face =select(3.0,0.0,direction.x > 0.0); - }else{ - face =select(4.0,1.0,direction.y > 0.0); - } - - } - else { - if ( absDirection.z > absDirection.y ){ - face =select(5.0,2.0,direction.z > 0.0); - }else{ - face =select(4.0,1.0,direction.y > 0.0); - } - } - return face; - } - fn getUV( direction:vec3, face:f32 )->vec2 { - var uv:vec2; - if ( face == 0.0 ) { - uv = vec2( direction.z, direction.y ) / abs( direction.x ); - } - else if ( face == 1.0 ) { - uv = vec2( - direction.x, - direction.z ) / abs( direction.y ); - } - else if ( face == 2.0 ) { - uv = vec2( - direction.x, direction.y ) / abs( direction.z ); - } - else if ( face == 3.0 ) { - uv = vec2( - direction.z, direction.y ) / abs( direction.x ); - } - else if ( face == 4.0 ) { - uv = vec2( - direction.x, direction.z ) / abs( direction.y ); - } - else { - uv = vec2( direction.x, direction.y ) / abs( direction.z ); - } - return 0.5 * ( uv + 1.0 ); - } - fn bilinearCubeUV(envTexture:texture_cube,baseSampler:sampler,direction:vec3, mipInt:f32 )->vec3 { - var face:f32 = getFace( direction ); - let filterInt:f32 = max( cubeUV_minMipLevel - mipInt, 0.0 ); - let tempMipInt = max( mipInt, cubeUV_minMipLevel ); - let faceSize:f32 = exp2( tempMipInt ); - var uv:vec2 = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0; - if ( face > 2.0 ) { - uv.y += faceSize; - face -= 3.0; - } - uv.x += face * faceSize; - uv.x += filterInt * 3.0 * cubeUV_minTileSize; - uv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize ); - uv.x *= CUBEUV_TEXEL_WIDTH; - uv.y *= CUBEUV_TEXEL_HEIGHT; - return textureSample(envTexture,baseSampler,direction).rgb; - } - const cubeUV_r0:f32= 1.0; - const cubeUV_v0:f32= 0.339; - const cubeUV_m0:f32= - 2.0; - const cubeUV_r1:f32= 0.8; - const cubeUV_v1:f32= 0.276; - const cubeUV_m1:f32= - 1.0; - const cubeUV_r4:f32= 0.4; - const cubeUV_v4:f32= 0.046; - const cubeUV_m4:f32= 2.0; - const cubeUV_r5:f32= 0.305; - const cubeUV_v5:f32= 0.016; - const cubeUV_m5:f32= 3.0; - const cubeUV_r6:f32= 0.21; - const cubeUV_v6:f32= 0.0038; - const cubeUV_m6:f32= 4.0; - fn roughnessToMip( roughness:f32)->f32 { - var mip:f32 = 0.0; - if ( roughness >= cubeUV_r1 ) { - mip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0; - } - else if ( roughness >= cubeUV_r4 ) { - mip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1; - } - else if ( roughness >= cubeUV_r5 ) { - mip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4; - } - else if ( roughness >= cubeUV_r6 ) { - mip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5; - } - else { - mip = - 2.0 * log2( 1.16 * roughness ); - } - return mip; - } - fn textureCubeUV(envTexture:texture_cube, baseSampler:sampler,sampleDir:vec3,roughness:f32 )->vec4 { - let mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP ); - let mipF = fract( mip ); - let mipInt = floor( mip ); - let color0:vec3 = bilinearCubeUV( envTexture,baseSampler,sampleDir, mipInt ); - if ( mipF == 0.0 ) { - return vec4(color0, 1.0 ); - } - else { - let color1:vec3 = bilinearCubeUV( envTexture,baseSampler, sampleDir, mipInt + 1.0 ); - return vec4(mix( color0, color1, mipF ), 1.0 ); - } - - } - #endif - #if ${defines.USE_ENVTEXTURE} - fn getIBLIrradiance( normal:vec3,baseSampler:sampler,viewMatrix:mat4x4)->vec3 { - #if ${defines.ENVTEXTURE_TYPE_CUBE_UV} - let worldNormal:vec3 = inverseTransformDirection( normal, viewMatrix ); - let envTextureColor:vec4 = textureCubeUV( envTexture,baseSampler, worldNormal, 1.0 ); - return PI * envTextureColor.rgb * materialUniform.envTextureIntensity; - #else - return vec3( 0.0 ); - #endif - } - fn getIBLRadiance( viewDir:vec3,baseSampler:sampler,viewMatrix:mat4x4,normal:vec3, roughness:f32 )->vec3 { - #if ${defines.ENVTEXTURE_TYPE_CUBE_UV} - var reflectVec:vec3 = reflect( - viewDir, normal ); - reflectVec = normalize( mix( reflectVec, normal, roughness * roughness) ); - reflectVec = inverseTransformDirection( reflectVec, viewMatrix ); - let envTextureColor:vec4 = textureCubeUV( envTexture,baseSampler, reflectVec, roughness ); - return envTextureColor.rgb * materialUniform.envTextureIntensity; - #else - return vec3( 0.0 ); - #endif - } - #endif - `; -} - -const instanceVertHeader = ` - #if USE_INSTANCE - struct InstancesUniform { - instanceMatrixs: array, instanceCount>, - }; - @group(0) @binding(instanceMatrixsBufferBinding) var instancesUniform: InstancesUniform; - #endif - `; -const instanceVertMain = ` - #if USE_INSTANCE - modelMatrix=instancesUniform.instanceMatrixs[input.instanceIdx]; - #endif - `; - -var light = ` - struct ReflectedLight { - ambient: vec3, - directDiffuse:vec3, - directSpecular:vec3, - indirectDiffuse:vec3, - indirectSpecular:vec3, - testColor: vec3, - }; - struct IncidentLight { - color: vec3, - direction: vec3, - visible: bool, - }; - struct Geometry { - position: vec3, - normal: vec3, - viewDir: vec3, - dotNV:f32, - #if USE_CLEARCOAT - vec3 clearcoatNormal; - #endif - }; - - #if USE_SPOTLIGHT - struct SpotLight { - position: vec3, - distance: f32, - direction: vec3, - coneCos: f32, - color: vec3, - penumbraCos: f32, - decay: f32, - }; - fn getSpotLightInfo(spotLight:SpotLight,worldPos:vec3,shininess:f32,n:vec3,v:vec3)->ReflectedLight{ - var direction:vec3 = spotLight.position - worldPos; - var lightColor:ReflectedLight; - let lightDistance:f32 = length(direction); - direction = normalize(direction); - let angleCos:f32 = dot( direction, spotLight.direction ); - let decay:f32 = clamp(1.0 - pow(lightDistance/spotLight.distance, spotLight.decay), 0.0, 1.0); - let spotEffect:f32 = smoothstep( spotLight.penumbraCos, spotLight.coneCos, angleCos ); - let decayTotal:f32 = decay * spotEffect; - let d:f32 = max( dot( n, direction ), 0.0 ) * decayTotal; - lightColor.directDiffuse= spotLight.color * d; - let halfDir:vec3 = normalize( v + direction ); - let s:f32 = pow( clamp( dot( n, halfDir ), 0.0, 1.0 ), shininess ) * decayTotal; - lightColor.directSpecular= spotLight.color * s; - return lightColor; - } - fn getSpotLightIncidentLight(spotLight:SpotLight, geometry:Geometry)->IncidentLight { - var incidentLight:IncidentLight; - let lVector:vec3 = spotLight.position - geometry.position; - incidentLight.direction = normalize( lVector ); - - let lightDistance:f32 = length( lVector ); - let angleCos:f32 = dot( incidentLight.direction, spotLight.direction ); - - let spotEffect:f32 = smoothstep( spotLight.penumbraCos, spotLight.coneCos, angleCos ); - let decayEffect:f32 = clamp(1.0 - pow(lightDistance/spotLight.distance, 4.0), 0.0, 1.0); - - incidentLight.color=spotLight.color*spotEffect * decayEffect; - return incidentLight; - } - - #endif - - #if USE_POINTLIGHT - struct PointLight { - position: vec3, - distance: f32, - color: vec3, - decay: f32, - }; - fn getPointLightInfo(pointLight:PointLight,worldPos:vec3,shininess:f32,n:vec3,v:vec3)->ReflectedLight{ - var lightColor:ReflectedLight; - var direction:vec3 = worldPos - pointLight.position; - let dist:f32 = length( direction ); - direction = normalize(direction); - let decay = clamp(1.0 - pow(dist / pointLight.distance, pointLight.decay), 0.0, 1.0); - - let d = max( dot( n, -direction ), 0.0 ) * decay; - lightColor.directDiffuse = pointLight.color * d; - - let halfDir:vec3 = normalize( v - direction ); - let s:f32 = pow( clamp( dot( n, halfDir ), 0.0, 1.0 ), shininess ) * decay; - lightColor.directSpecular = pointLight.color * s; - return lightColor; - } - fn getPointLightIncidentLight(pointLight:PointLight, geometry:Geometry)->IncidentLight { - var incidentLight:IncidentLight; - let lVector:vec3 = pointLight.position-geometry.position; - incidentLight.direction= normalize( lVector ); - let lightDistance:f32 = length( lVector ); - // let weight:f32=1.0 - pow(lightDistance/pointLight.distance, 4.0); - incidentLight.color=pointLight.color*clamp(1.0 - pow(lightDistance/pointLight.distance, 4.0), 0.0, 1.0); - return incidentLight; - } - #endif - #if USE_DIRTECTLIGHT - struct DirectionalLight { - direction: vec3, - color: vec3, - }; - fn getDirectLightInfo(directionalLight:DirectionalLight,shininess:f32,n:vec3,v:vec3)->ReflectedLight{ - var lightColor:ReflectedLight; - let d:f32 = max(dot(n, -directionalLight.direction), 0.0); - lightColor.directDiffuse += directionalLight.color * d; - - let halfDir:vec3 = normalize( v - directionalLight.direction ); - let s:f32 = pow( clamp( dot( n, halfDir ), 0.0, 1.0 ), shininess ); - lightColor.directSpecular += directionalLight.color * s; - return lightColor; - } - fn getDirectionalDirectLightIncidentLight(directionalLight:DirectionalLight,geometry:Geometry)->IncidentLight { - var incidentLight:IncidentLight; - incidentLight.color = directionalLight.color; - incidentLight.direction = normalize(directionalLight.direction); - return incidentLight; - } - #endif - - #if OPEN_SHADOW - struct LightInfo { - direction: vec3, - viewport: vec4, - }; - - fn linearizeDepth(depth: f32, near: f32, far: f32)->f32 { - return 2 * (near * far) / (far + near - depth * (far - near)); - } - - fn getCubeFace(v : vec3) -> i32{ - let vAbs = abs(v); - - if (vAbs.z >= vAbs.x && vAbs.z >= vAbs.y) { - if (v.z < 0.0) { - return 3; - } - return 2; - } - - if (vAbs.y >= vAbs.x) { - if (v.y < 0.0) { - return 5; - } - return 4; - } - - if (v.x < 0.0) { - return 1; - } - return 0; - } - - fn getShadowValue(shadowMapArray:texture_depth_2d_array, shadowSampler:sampler_comparison, lightPos:vec4, geometry:Geometry, lightInfo:LightInfo, index:u32, isPointLight: bool, near: f32, far: f32)->f32 { - var visibility = 0.0; - var projectPos: vec3 = lightPos.xyz / lightPos.w; - var shadowPos: vec3 = vec3(projectPos.xy * vec2(0.5, -0.5) + vec2(0.5), projectPos.z); - var d:f32 = dot(geometry.normal, -lightInfo.direction); - var bias = max(0.012 * (1.0 - d), 0.001) / lightPos.w; - let oneOverShadowDepthTextureSize = 1.0 / 1024.0; - // var depth = select(shadowPos.z, (linearizeDepth(shadowPos.z, near, far) - near) / (far- near), isPerspectiveCamera); - var depth = shadowPos.z; - - if (isPointLight) { - shadowPos.x = shadowPos.x * lightInfo.viewport.z; - shadowPos.y = shadowPos.y * lightInfo.viewport.w; - var viewportX = lightInfo.viewport.x * lightInfo.viewport.z; - var viewportY = lightInfo.viewport.y * lightInfo.viewport.w; - var uvOffset = 1.5 / 1024.0; - shadowPos.x = clamp(shadowPos.x + viewportX, viewportX + uvOffset, viewportX + lightInfo.viewport.z - uvOffset); - shadowPos.y = clamp(shadowPos.y + viewportY, viewportY + uvOffset, viewportY + lightInfo.viewport.w - uvOffset); - } - - for (var y = -1; y <= 1; y++) { - for (var x = -1; x <= 1; x++) { - let offset = vec2(vec2(x, y)) * oneOverShadowDepthTextureSize; - - visibility += textureSampleCompare( - shadowMapArray, shadowSampler, - shadowPos.xy + offset, index, depth - bias); - } - } - visibility /= 9.0; - var inFrustum = shadowPos.x >= 0.0 && shadowPos.x <= 1.0 && shadowPos.y >= 0.0 && shadowPos.y <= 1.0; - if (!inFrustum || depth > 1.0) { - visibility = 1.0; - } - return visibility; - } - #endif - - #if USE_AMBIENTLIGHT||USE_SPOTLIGHT||USE_POINTLIGHT||USE_DIRTECTLIGHT - struct LightUniforms{ - #if USE_AMBIENTLIGHT - ambient:vec4, - #endif - #if USE_SPOTLIGHT - spotLights:array, - #endif - #if USE_POINTLIGHT - pointLights:array, - #endif - #if USE_DIRTECTLIGHT - dirtectLights:array, - #endif - } - @group(2) @binding(lightBinding) var lightUniforms: LightUniforms; - - #if OPEN_SHADOW - #if USE_SPOTLIGHT_SHADOWMAP - struct SpotLightShadow { - shadowCameraVPMatrix: mat4x4, - shadowCameraNear: f32, - shadowCameraFar: f32 - } - #endif - #if USE_POINTLIGHT_SHADOWMAP - struct PointLightShadow { - shadowCameraVPMatrixArray: array, 6>, - shadowCameraViewportArray: array, 6>, - shadowCameraNear: f32, - shadowCameraFar: f32, - // shadowCameraVPMatrix: mat4x4, - // shadowCameraVPMatrixArray: array, 6>, - // shadowCameraViewportArray: array, 6>, - } - #endif - #if USE_DIRECTLIGHT_SHADOWMAP - struct DirectLightShadow { - shadowCameraVPMatrix: mat4x4, - } - #endif - struct ShadowUniforms{ - #if USE_SPOTLIGHT_SHADOWMAP - spotLightShadows:array, - #endif - #if USE_POINTLIGHT_SHADOWMAP - pointLightShadows:array, - #endif - #if USE_DIRECTLIGHT_SHADOWMAP - directLightShadows:array, - #endif - } - @group(2) @binding(shadowBinding) var shadowUniforms: ShadowUniforms; - - #if SPOTLIGHT_SHADOWMAP_TEXTUREARRAY - @group(2) @binding(spotLightShadowMapTextureArrayBinding) var spotLightShadowMapTextureArray: texture_depth_2d_array; - #endif - #if POINTLIGHT_SHADOWMAP_TEXTUREARRAY - @group(2) @binding(pointLightShadowMapTextureArrayBinding) var pointLightShadowMapTextureArray: texture_depth_2d_array; - #endif - #if DIRECTLIGHT_SHADOWMAP_TEXTUREARRAY - @group(2) @binding(directLightShadowMapTextureArrayBinding) var directLightShadowMapTextureArray: texture_depth_2d_array; - #endif - @group(2) @binding(shadowSamplerBinding) var shadowSampler: sampler_comparison; - #endif - - #endif - #if MATERIAL_PHONG - fn parseLights(geometry:Geometry,shininess:f32)->ReflectedLight { - #elif MATERIAL_PBR - fn parseLights(geometry:Geometry,material:PhysicalMaterial)->ReflectedLight{ - #endif - var reflectedLight:ReflectedLight; - var shadowValue:f32 = 1.0; - #if USE_AMBIENTLIGHT - //处理环境光 - var ambientColor:vec3 = lightUniforms.ambient.xyz * lightUniforms.ambient.w; - reflectedLight.ambient += ambientColor; - #endif - - #if USE_SPOTLIGHT - //处理聚光灯 - var spotLight:SpotLight; - for (var k = 0u; k < spotLightsCount; k = k + 1u) { - spotLight= lightUniforms.spotLights[k]; - #if MATERIAL_PHONG&&OPEN_SHADOW&&USE_SPOTLIGHT_SHADOWMAP - if k < textureNumLayers(spotLightShadowMapTextureArray) { - var spotLightShadow:SpotLightShadow = shadowUniforms.spotLightShadows[k]; - var lightPos: vec4 = spotLightShadow.shadowCameraVPMatrix * vec4(geometry.position,1.0); - var lightInfo:LightInfo; - lightInfo.direction = normalize(geometry.position - spotLight.position); - - shadowValue = getShadowValue(spotLightShadowMapTextureArray, shadowSampler, lightPos, geometry, lightInfo, k, false, - spotLightShadow.shadowCameraNear, spotLightShadow.shadowCameraFar); - } - spotLight.color *= shadowValue; - #endif - #if MATERIAL_PHONG - let spReflectedLight=getSpotLightInfo(spotLight,geometry.position,shininess,geometry.normal,geometry.viewDir); - #elif MATERIAL_PBR - let incidentLight=getSpotLightIncidentLight(spotLight,geometry); - let spReflectedLight=direct_Physical(incidentLight, geometry, material); - #endif - - reflectedLight.directDiffuse+=spReflectedLight.directDiffuse; - reflectedLight.directSpecular+=spReflectedLight.directSpecular; - } - #endif - #if USE_POINTLIGHT - //处理点光源 - var pointLight:PointLight; - for (var j = 0u; j < pointLightsCount;j = j + 1u) { - pointLight = lightUniforms.pointLights[j]; - #if MATERIAL_PHONG&&OPEN_SHADOW&&USE_POINTLIGHT_SHADOWMAP - if j < textureNumLayers(pointLightShadowMapTextureArray) { - var pointLightShadow:PointLightShadow = shadowUniforms.pointLightShadows[j]; - var lightInfo:LightInfo; - lightInfo.direction = normalize(geometry.position - pointLight.position); - var cubeFace = getCubeFace(lightInfo.direction); - var lightPos: vec4 = pointLightShadow.shadowCameraVPMatrixArray[cubeFace] * vec4(geometry.position,1.0); - lightInfo.viewport = pointLightShadow.shadowCameraViewportArray[cubeFace]; - - // var lightPos: vec4 = pointLightShadow.shadowCameraVPMatrix * vec4(geometry.position,1.0); - - shadowValue = getShadowValue(pointLightShadowMapTextureArray, shadowSampler, lightPos, geometry, lightInfo, j, true, - pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar); - - // reflectedLight.testColor = vec3(pointLightShadow.shadowCameraFar / 1000, - // pointLightShadow.shadowCameraVPMatrixArray[5][3][2] / 255, pointLightShadow.shadowCameraVPMatrixArray[5][3][3] / 255); - // reflectedLight.testColor = vec3(pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraNear); - } - pointLight.color *= shadowValue; - #endif - #if MATERIAL_PHONG - let poiReflectedLight=getPointLightInfo(pointLight,geometry.position,shininess,geometry.normal,geometry.viewDir); - #elif MATERIAL_PBR - let incidentLight=getPointLightIncidentLight(pointLight,geometry); - let poiReflectedLight=direct_Physical(incidentLight, geometry, material); - #endif - - reflectedLight.directDiffuse+=poiReflectedLight.directDiffuse; - reflectedLight.directSpecular+=poiReflectedLight.directSpecular; - } - #endif - #if USE_DIRTECTLIGHT - //处理方向光 - var directionalLight:DirectionalLight; - for (var i= 0u; i = directLightShadow.shadowCameraVPMatrix * vec4(geometry.position,1.0); - var lightInfo:LightInfo; - lightInfo.direction = directionalLight.direction; - - shadowValue = getShadowValue(directLightShadowMapTextureArray, shadowSampler, lightPos, geometry, lightInfo, i, false, 0, 0); - } - directionalLight.color *= shadowValue; - #endif - - #if MATERIAL_PHONG - let dirReflectedLight=getDirectLightInfo(directionalLight,shininess,geometry.normal,geometry.viewDir); - #elif MATERIAL_PBR - let incidentLight=getDirectionalDirectLightIncidentLight(directionalLight,geometry); - let dirReflectedLight=direct_Physical(incidentLight, geometry, material); - #endif - - reflectedLight.directDiffuse+=dirReflectedLight.directDiffuse; - reflectedLight.directSpecular+=dirReflectedLight.directSpecular; - } - #endif - return reflectedLight; - }`; - -var lightCommon = ` - struct ReflectedLight { - directDiffuse:vec3, - directSpecular:vec3, - indirectDiffuse:vec3, - indirectSpecular:vec3, - }; - struct Geometry { - position: vec3, - normal: vec3, - viewDir: vec3, - #if USE_CLEARCOAT - vec3 clearcoatNormal; - #endif - }; - fn getAmbientLightIrradiance(ambientLightColor: vec3) -> vec3 { - let irradiance = ambientLightColor; - return irradiance; - } - fn getDistanceAttenuation(lightDistance: f32, cutoffDistance: f32, decayExponent: f32) -> f32 { - if (cutoffDistance > 0.0 && decayExponent > 0.0) { - let x:f32 = saturate(- lightDistance / cutoffDistance + 1.0); - return pow(x, decayExponent); - } - return 1.0; - } - fn getSpotAttenuation(coneCosine: f32, penumbraCosine: f32, angleCosine: f32) -> f32 { - return smoothstep(coneCosine, penumbraCosine, angleCosine); - } - fn shGetIrradianceAt( normal:vec3, shCoefficients:array,9>)->vec3 { - let x:f32 = normal.x; - let y:f32 = normal.y; - let z:f32 = normal.z; - var result:vec3 = shCoefficients[ 0 ] * 0.886227; - result += shCoefficients[ 1 ] * 2.0 * 0.511664 * y; - result += shCoefficients[ 2 ] * 2.0 * 0.511664 * z; - result += shCoefficients[ 3 ] * 2.0 * 0.511664 * x; - result += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y; - result += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z; - result += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 ); - result += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z; - result += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y ); - return result; - } - fn inverseTransformDirection( dir:vec3, matrix:mat4x4 )->vec3 { - return normalize( ( vec4( dir, 0.0 ) * matrix ).xyz ); - } - `; - -const getNormal = ` - fn getNormal(input:FragInput)->vec3{ - var normal:vec3; - #if HAS_NORMAL - normal= input.normal; - #else - let pos_dx = dpdx(input.worldPos); - let pos_dy = dpdy(input.worldPos); - normal = normalize( cross(pos_dy, pos_dx) ); - #endif - return normal*(f32(input.frontFacing) * 2.0 - 1.0); - } - `; -const getNormalByNormalTexture = ` - fn getNormalByNormalTexture(input:FragInput)->vec3{ - var n:vec3 = textureSample(normalTexture,normalSampler, input.uv).rgb; - let tbn:mat3x3 =getTBN(input); - n = normalize(tbn * (2.0 * n - vec3(1.0))); - n=n*(f32(input.frontFacing) * 2.0 - 1.0); - return n; - } - `; -const getTBN = ` - fn getTBN(input:FragInput)->mat3x3{ - #if HAS_TANGENT - let tbn:mat3x3 = input.tbn; - #else - let normal:vec3 =normalize(input.normal); - let uv:vec2 = select(-input.uv,input.uv,input.frontFacing); - // ref: http://www.thetenthplanet.de/archives/1180 - // get edge vectors of the pixel triangle - let dp1:vec3 = vec3(dpdx(input.worldPos.x), dpdx(input.worldPos.y), dpdx(input.worldPos.z)); - let dp2:vec3 = vec3(dpdy(input.worldPos.x), dpdy(input.worldPos.y), dpdy(input.worldPos.z)); - let duv1:vec2 = dpdx(uv); - let duv2:vec2 = dpdy(uv); - - // solve the linear system - let dp2perp:vec3 = cross(dp2, normal); - let dp1perp:vec3 = cross(normal, dp1); - let tangent:vec3 = dp2perp * duv1.x + dp1perp * duv2.x; - let binormal:vec3 = dp2perp * duv1.y + dp1perp * duv2.y; - // construct a scale-invariant frame - let result:f32=max(dot(tangent, tangent), dot(binormal, binormal)); - let invmax:f32 = 1.0/sqrt(result); - let tbn:mat3x3 = mat3x3(tangent * invmax, binormal * invmax, normal); - #endif - return tbn; - } - `; - -var brdf = ` - #if USE_SHEEN - fn D_Charlie( roughness:f32,dotNH:f32 )->f32 { - let alpha:f32 = pow2( roughness ); - let invAlpha:f32 = 1.0 / alpha; - let cos2h:f32 = dotNH * dotNH; - let sin2h:f32 = max( 1.0 - cos2h, 0.0078125 ); - return ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * pi ); - } - fn V_Neubelt( dotNV:f32, dotNL:f32 )->f32 { - return saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) ); - } - fn BRDF_Sheen(lightDir:vec3, viewDir:vec3, normal:vec3,sheenColor:vec3,sheenRoughness:f32 )->vec3 { - let halfDir:vec3 = normalize( lightDir + viewDir ); - let dotNL:f32 = saturate( dot( normal, lightDir ) ); - let dotNV:f32 = saturate( dot( normal, viewDir ) ); - let dotNH:f32 = saturate( dot( normal, halfDir ) ); - let D:f32 = D_Charlie( sheenRoughness, dotNH ); - let V:f32 = V_Neubelt( dotNV, dotNL ); - return sheenColor * ( D * V ); - } - #endif - fn BRDF_Lambert(diffuseColor:vec3)->vec3 { - - return reciprocal_pi * diffuseColor; - - } // validated - - fn F_Schlick( f0:vec3, dotVH:f32 )->vec3 { - - // Original approximation by Christophe Schlick '94 - // float fresnel = pow( 1.0 - dotVH, 5.0 ); - - // Optimized variant (presented by Epic at SIGGRAPH '13) - // https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf - let fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH ); - return ( 1.0 - f0 ) * fresnel + f0; - - } // validated - - fn Schlick_to_F0(f:vec3, f90:f32, dotVH:f32 )->vec3 { - let x:f32 = clamp( 1.0 - dotVH, 0.0, 1.0 ); - let x2:f32 = x * x; - let x5:f32 = clamp( x * x2 * x2, 0.0, 0.9999 ); - - return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 ); - } - fn V_GGX_SmithCorrelated( alpha:f32, dotNL:f32,dotNV:f32 )->f32 { - - let a2 :f32= pow2( alpha ); - - let gv:f32 = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) ); - let gl:f32 = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) ); - - return 0.5 / max((gv + gl), 0.000000001 ); - - } - fn D_ggx( alpha:f32, dotNH:f32 )->f32 { - - let a2:f32 = pow2( alpha ); - - let denom:f32 = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0; // avoid alpha = 0 with dotNH = 1 - - return reciprocal_pi * a2 / pow2( denom ); - - } - fn BRDF_ggx( lightDir:vec3, viewDir:vec3, normal:vec3, f0:vec3, roughness:f32 )->vec3 { - - let alpha:f32 = pow2( roughness ); // UE4's roughness - - let halfDir = normalize( lightDir + viewDir ); - - let dotNL:f32 = saturate( dot( normal, lightDir ) ); - let dotNV:f32 = saturate( dot( normal, viewDir ) ); - let dotNH:f32 = saturate( dot( normal, halfDir ) ); - let dotVH:f32 = saturate( dot( lightDir, halfDir ) ); - - let f = F_Schlick( f0, dotVH ); - - let v = V_GGX_SmithCorrelated( alpha, dotNL, dotNV ); - - let d = D_ggx( alpha, dotNH ); - - return f * ( v * d ); - - } - fn direct_Physical( directLight:IncidentLight, geometry:Geometry,material:PhysicalMaterial)->ReflectedLight { - var reflectedLight:ReflectedLight; - let dotNL:f32 = saturate(dot( geometry.normal,geometry.viewDir)); - let irradiance:vec3 = dotNL * directLight.color*3.1415926; - reflectedLight.directSpecular = irradiance * BRDF_ggx( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.roughness ); - reflectedLight.directDiffuse = irradiance * BRDF_Lambert( material.diffuseColor ); - return reflectedLight; - } - `; - -var ibl = ` - fn getLightProbeRadiance( viewDir:vec3,normal:vec3, roughness:f32 )->vec3{ - var reflectVec:vec3 = reflect( -viewDir, normal ); - reflectVec.x = -reflectVec.x; // TextureCube is left-hand,so x need inverse - let mipCount:f32 = 10.0; // resolution of 256x256 - let lod:f32 = roughness * mipCount; - let specularLight:vec3 = textureSampleLevel(specularEnvTexture,specularEnvSampler, reflectVec, lod).rgb; - return specularLight; - } - fn getLightProbeIrradiance( lightProbe:array,9>, normal:vec3)->vec3 { - var worldNormal:vec3 = normal; - worldNormal.x = -normal.x; - var irradiance:vec3 = lightProbe[0]; - irradiance+=lightProbe[1] * (normal.y); - irradiance+=lightProbe[2] * (normal.z) ; - irradiance+=lightProbe[3] * (normal.x) ; - - irradiance+=lightProbe[4] * (normal.y * normal.x) ; - irradiance+=lightProbe[5] * (normal.y * normal.z) ; - irradiance+=lightProbe[6] * (3.0 * normal.z * normal.z - 1.0); - irradiance+=lightProbe[7] * (normal.z * normal.x) ; - irradiance+=lightProbe[8] * (normal.x * normal.x - normal.y * normal.y); - - return max(irradiance, vec3(0.0,0.0,0.0)); - } - fn DFGApprox( specularColor:vec3, roughness:f32,dotNV:f32 )->vec3 { - const c0:vec4 = vec4( - 1, - 0.0275, - 0.572, 0.022 ); - let c1:vec4 = vec4( 1, 0.0425, 1.04, - 0.04 ); - let r:vec4 = roughness * c0 + c1; - let a004:f32 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y; - let fab:vec2 = vec2( - 1.04, 1.04 ) * a004 + r.zw; - return specularColor * fab.x + fab.y; - } - //间接光照 - fn indirectDiffuse_Physical(geometry:Geometry, material:PhysicalMaterial )->ReflectedLight { - var reflectedLight:ReflectedLight; - var irradiance:vec3 = lightUniforms.ambient.xyz*lightUniforms.ambient.w; - irradiance *= pi; - reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); - return reflectedLight; - } - //间接高光 - fn indirectSpecular_Physical(geometry:Geometry, material:PhysicalMaterial)->ReflectedLight { - var reflectedLight:ReflectedLight; - // IBL specular - let radiance:vec3 = getLightProbeRadiance(geometry.viewDir, geometry.normal, material.roughness); - let radianceAttenuation:f32 = 1.0; - reflectedLight.indirectSpecular += radianceAttenuation * radiance * DFGApprox(material.specularColor, material.roughness, geometry.dotNV ); - return reflectedLight; - } - `; - -function pbrFunction(defines) { - return wgslParseDefines` - - #if ${defines.DITHERING} - fn dithering(color:vec3 )->vec3 { - let grid_position:f32 = rand( gl_FragCoord.xy ); - let dither_shift_RGB:vec3 = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 ); - dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position ); - return color + dither_shift_RGB; - } - #endif - - #if ${defines.USE_IRIDESCENCE} - fn BRDF_GGX_Iridescence( lightDir:vec3, viewDir:vec3,normal:vec3, f0:vec3, f90:f32,iridescence:f32, iridescenceFresnel:vec3,roughness:f32 )->vec3 { - let alpha:f32 = pow2( roughness ); - let halfDir:vec3 = normalize( lightDir + viewDir ); - let dotNL:f32 = saturate( dot( normal, lightDir ) ); - let dotNV:f32 = saturate( dot( normal, viewDir ) ); - let dotNH:f32 = saturate( dot( normal, halfDir ) ); - let dotVH:f32 = saturate( dot( viewDir, halfDir ) ); - let f:vec3 = mix( F_Schlick( f0, f90, dotVH ), iridescenceFresnel, iridescence ); - let v:f32 = V_GGX_SmithCorrelated( alpha, dotNL, dotNV ); - let d:f32 = D_ggx(alpha, dotNH ); - return f * ( v * d ); - } - #endif - - #if ${defines.USE_SHEEN} - fn D_Charlie( roughness:f32,dotNH:f32 )->f32 { - let alpha:f32 = pow2( roughness ); - let invAlpha:f32 = 1.0 / alpha; - let cos2h:f32 = dotNH * dotNH; - let sin2h:f32 = max( 1.0 - cos2h, 0.0078125 ); - return ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * pi ); - } - fn V_Neubelt( dotNV:f32, dotNL:f32 )->f32 { - return saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) ); - } - fn BRDF_Sheen(lightDir:vec3, viewDir:vec3, normal:vec3,sheenColor:vec3,sheenRoughness:f32 )->vec3 { - let halfDir:vec3 = normalize( lightDir + viewDir ); - let dotNL:f32 = saturate( dot( normal, lightDir ) ); - let dotNV:f32 = saturate( dot( normal, viewDir ) ); - let dotNH:f32 = saturate( dot( normal, halfDir ) ); - let d:f32 = D_Charlie( sheenRoughness, dotNH ); - let v:f32 = V_Neubelt( dotNV, dotNL ); - return sheenColor * ( d * v ); - } - #endif - - #if ${defines.USE_IRIDESCENCE} - let XYZ_TO_REC709: mat3x3 = mat3x3( - 3.2404542, -0.9692660, 0.0556434, -1.5371385, 1.8760108, -0.2040259, -0.4985314, 0.0415560, 1.0572252 - ); - fn Fresnel0ToIor( fresnel0:vec3 )->vec3 { - let sqrtF0:vec3 = sqrt( fresnel0 ); - return ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 ); - } - fn IorToFresnel0(transmittedIor:vec3,incidentIor:f32 )->vec3 { - return pow2Vector( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) ); - } - fn IorToFresnel0(transmittedIor:f32, incidentIor:f32 )->f32 { - return pow2Vector( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor )); - } - fn evalSensitivity(opd:f32,shift:vec3 )->vec3 { - let phase:f32 = 2.0 * pi * opd * 1.0e-9; - let val:vec3 = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 ); - let pos:vec3 = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 ); - let vart:vec3 = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 ); - let xyz:vec3 = val * sqrt( 2.0 * pi * vart ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * vart ); - xyz.x += 9.7470e-14 * sqrt( 2.0 * pi * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) ); - xyz /= 1.0685e-7; - let rgb:vec3 = XYZ_TO_REC709 * xyz; - return rgb; - } - fn evalIridescence(outsideIOR:f32, eta2:f32,cosTheta1:f32,thinFilmThickness:f32,baseF0:vec3 )->vec3 { - var I:vec3; - let iridescenceIOR:f32 = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) ); - let sinTheta2Sq:f32 = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) ); - let cosTheta2Sq:f32 = 1.0 - sinTheta2Sq; - if ( cosTheta2Sq < 0.0 ) { - return vec3( 1.0 ); - } - let cosTheta2:f32 = sqrt( cosTheta2Sq ); - let R0:f32 = IorToFresnel0( iridescenceIOR, outsideIOR ); - let R12:f32 = F_Schlick( R0, 1.0, cosTheta1 ); - let R21:f32 = R12; - let T121:f32 = 1.0 - R12; - let phi12:f32 = 0.0; - if ( iridescenceIOR < outsideIOR ) phi12 = pi; - let phi21:f32 = pi - phi12; - let baseIOR:vec3 = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) ); - let R1:vec3 = IorToFresnel0( baseIOR, iridescenceIOR ); - let R23:vec3 = F_Schlick( R1, 1.0, cosTheta2 ); - let phi23:vec3 = vec3( 0.0 ); - if ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = pi; - if ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = pi; - if ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = pi; - let OPD:f32 = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2; - let phi:vec3 = vec3( phi21 ) + phi23; - let R123:vec3 = clamp( R12 * R23, 1e-5, 0.9999 ); - let r123:vec3 = sqrt( R123 ); - let Rs:vec3 = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 ); - let C0:vec3 = R12 + Rs; - I = C0; - let Cm:vec3 = Rs - T121; - for ( let m : u32 = 1;m <= 2; ++ m ) { - Cm *= r123; - Sm:vec3 = 2.0 * evalSensitivity( f32( m ) * OPD, f32( m ) * phi ); - I += Cm * Sm; - } - return max( I, vec3( 0.0 ) ); - } - #endif - const clearcoatSpecular:vec3 = vec3( 0.0 ); - const sheenSpecular:vec3 = vec3( 0.0 ); - - fn IBLSheenBRDF( normal:vec3, viewDir:vec3, roughness:f32 )->f32 { - let dotNV:f32 = saturate( dot( normal, viewDir ) ); - let r2:f32 = roughness * roughness; - let a:f32 =select(-8.48 * r2 + 14.3 * roughness - 9.95,-339.2 * r2 + 161.4 * roughness - 25.9,roughness < 0.25); - //let a:f32 = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95; - let b:f32=select(1.97 * r2 - 3.27 * roughness + 0.72,44.0 * r2 - 23.7 * roughness + 3.26, roughness < 0.25); - //let b:f32 = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72; - //let DG:f32 = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) ); - let dg:f32 = exp( a * dotNV + b ) + select(0.1 * ( roughness - 0.25 ),0.0,roughness < 0.25); - return saturate( dg * reciprocal_pi ); - } - fn DFGApprox( specularColor:vec3, roughness:f32,dotNV:f32 )->vec3 { - const c0:vec4 = vec4( - 1, - 0.0275, - 0.572, 0.022 ); - let c1:vec4 = vec4( 1, 0.0425, 1.04, - 0.04 ); - let r:vec4 = roughness * c0 + c1; - let a004:f32 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y; - let fab:vec2 = vec2( - 1.04, 1.04 ) * a004 + r.zw; - return specularColor * fab.x + fab.y; - } - fn EnvironmentBRDF( normal:vec3,viewDir:vec3,specularColor:vec3, specularF90:f32,roughness:f32 )->vec3 { - let fab:vec2 = DFGApprox( normal, viewDir, roughness ); - return specularColor * fab.x + specularF90 * fab.y; - } - - - fn computeSpecularOcclusion( dotNV:f32, ambientOcclusion:f32, roughness:f32 )->f32 { - return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion ); - } - #if ${defines.USE_TRANSMISSION} - - fn getVolumeTransmissionRay( n:vec3, v:vec3, thickness:f32, ior:f32, modelMatrix:mat4x4:f32)->vec3 { - var refractionVector:vec3 = refract( - v, normalize( n ), 1.0 / ior ); - var modelScale:vec3; - modelScale.x = length( vec3( modelMatrix[0].xyz ) ); - modelScale.y = length( vec3( modelMatrix[1].xyz ) ); - modelScale.z = length( vec3( modelMatrix[2].xyz ) ); - return normalize( refractionVector ) * thickness * modelScale; - } - fn applyIorToRoughness(roughness:f32, ior:f32 )->f32 { - return roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 ); - } - fn getTransmissionSample( fragCoord:vec2, roughness:f32,ior:f32 )->vec4 { - let framebufferLod:f32 = log2( materialUniform.transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior ); - return textureSampleLevel(transmissionSamplerTexture,baseSampler,fragCoord.xy, framebufferLod); - - } - fn applyVolumeAttenuation( radiance:vec3, transmissionDistance:f32,attenuationColor:vec3,attenuationDistance:f32 )->vec3 { - if ( isinf( attenuationDistance ) ) { - return radiance; - } - else { - let attenuationCoefficient:vec3 = -log( attenuationColor ) / attenuationDistance; - let transmittance:vec3 = exp( - attenuationCoefficient * transmissionDistance ); - return transmittance * radiance; - } - - } - fn getIBLVolumeRefraction( n:vec3,v:vec3, roughness:f32, diffuseColor:vec3,specularColor:vec3, specularF90:f32,position:vec3, modelMatrix:mat4x4, viewMatrix:mat4x4,projMatrix:mat4x4,ior:f32, thickness:f32,attenuationColor:vec3,attenuationDistance:f32 )->vec4 { - let transmissionRay:vec3 = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix ); - let refractedRayExit:vec3 = position + transmissionRay; - let ndcPos:vec4 = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 ); - let refractionCoords:vec2 = ndcPos.xy / ndcPos.w; - refractionCoords += 1.0; - refractionCoords /= 2.0; - let transmittedLight:vec4 = getTransmissionSample( refractionCoords, roughness, ior ); - let attenuatedColor:vec3 = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance ); - let F:vec3 = EnvironmentBRDF( n, v, specularColor, specularF90, roughness ); - return vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a ); - } - #endif - - #if ${defines.USE_BUMPTEXTURE} - fn dHdxy_fwd()->vec2 { - let dSTdx:vec2 = dpdx( vUv ); - let dSTdy:vec2 = dpdy( vUv ); - - let Hll:f32 = materialUniform.bumpScale * textureSample(bumpTexture, baseSampler, vUv).x; - let dBx:f32 = materialUniform.bumpScale * textureSample(bumpTexture, baseSampler, vUv + dSTdx).x - Hll; - let dBy:f32 = materialUniform.bumpScale * textureSample(bumpTexture, baseSampler, vUv + dSTdy).x - Hll; - return vec2( dBx, dBy ); - } - fn perturbNormalArb( surf_pos:vec3, surf_norm:vec3, dHdxy:vec2, faceDirection:f32 )->vec3 { - let vSigmaX:vec3 = dpdx( surf_pos.xyz ); - let vSigmaY:vec3 = dpdy( surf_pos.xyz ); - let vN:vec3 = surf_norm; - let R1:vec3 = cross( vSigmaY, vN ); - let R2:vec3 = cross( vN, vSigmaX ); - let fDet:f32 = dot( vSigmaX, R1 ) * faceDirection; - let vGrad:vec3 = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 ); - return normalize( abs( fDet ) * surf_norm - vGrad ); - } - #endif - - //! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALTEXTURE ) || defined ( USE_CLEARCOAT_NORMALTEXTURE ) ) - #if ${(!defines.USE_TANGENT && defines.TANGENTSPACE_NORMALTEXTURE) || defines.USE_CLEARCOAT_NORMALTEXTURE} - fn perturbNormal2Arb( eye_pos:vec3, surf_norm:vec3, textureN:vec3, faceDirection:f32 )->vec3 { - let q0:vec3 = dpdx( eye_pos.xyz ); - let q1:vec3 = dpdy( eye_pos.xyz ); - let st0:vec2 = dpdx( vUv.st ); - let st1:vec2 = dpdy( vUv.st ); - let N:vec3 = surf_norm; - let q1perp:vec3 = cross( q1, N ); - let q0perp:vec3 = cross( N, q0 ); - let T:vec3 = q1perp * st0.x + q0perp * st1.x; - let B:vec3 = q1perp * st0.y + q0perp * st1.y; - let det:f32 = max( dot( T, T ), dot( B, B ) ); - let scale:f32 = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det ); - return normalize( T * ( textureN.x * scale ) + B * ( textureN.y * scale ) + N * textureN.z ); - } - #endif - struct MultiAndSingleScatter{ - multiScatter:vec3, - singleScatter:vec3 - } - #if ${defines.USE_IRIDESCENCE} - ////////inout vec3 singleScatter, inout vec3 multiScatter - fn computeMultiscatteringIridescence( normal:vec3, viewDir:vec3, specularColor:vec3, specularF90:f32, iridescence:f32,iridescenceF0:vec3, roughness:f32 )->MultiAndSingleScatter { - #else - ////////inout vec3 singleScatter, inout vec3 multiScatter - fn computeMultiscattering( normal:vec3,viewDir:vec3, specularColor:vec3, specularF90:f32, roughness:f32)->MultiAndSingleScatter { - #endif - let fab:vec2 = DFGApprox( normal, viewDir, roughness ); - - var multiAndSingleScatter:MultiAndSingleScatter; - - #if ${defines.USE_IRIDESCENCE} - let Fr:vec3 = mix( specularColor, iridescenceF0, iridescence ); - #else - let Fr:vec3 = specularColor; - #endif - let FssEss:vec3 = Fr * fab.x + specularF90 * fab.y; - let Ess:f32 = fab.x + fab.y; - let Ems:f32 = 1.0 - Ess; - let Favg:vec3 = Fr + ( 1.0 - Fr ) * 0.047619; - let Fms:vec3 = FssEss * Favg / ( 1.0 - Ems * Favg ); - // singleScatter += FssEss; - // multiScatter += Fms * Ems; - multiAndSingleScatter.multiScatter=Fms * Ems; - multiAndSingleScatter.singleScatter=FssEss; - return multiAndSingleScatter; - } - //直接光照 - fn RE_Direct_Physical( directLight:IncidentLight, geometry:GeometricContext, material:PhysicalMaterial)->ReflectedLight { - var reflectedLight:ReflectedLight; - let dotNL:f32 = saturate(dot( geometry.normal, directLight.direction)); - let irradiance:vec3 = dotNL * directLight.color; - #if ${defines.USE_CLEARCOAT} - let dotNLcc:f32 = saturate( dot( geometry.clearcoatNormal, directLight.direction ) ); - let ccIrradiance:vec3 = dotNLcc * directLight.color; - clearcoatSpecular += ccIrradiance * BRDF_ggx( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness ); - #endif - - #if ${defines.USE_SHEEN} - sheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness ); - #endif - - #if ${defines.USE_IRIDESCENCE} - reflectedLight.directSpecular = irradiance * BRDF_GGX_Iridescence( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness ); - #else - reflectedLight.directSpecular = irradiance * BRDF_ggx( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness ); - #endif - reflectedLight.directDiffuse = irradiance * BRDF_Lambert( material.diffuseColor ); - return reflectedLight; - } - //间接光照 - fn RE_IndirectDiffuse_Physical( irradiance:vec3, geometry:GeometricContext, material:PhysicalMaterial )->ReflectedLight { - var reflectedLight:ReflectedLight; - reflectedLight.indirectDiffuse = irradiance * BRDF_Lambert( material.diffuseColor ); - return reflectedLight; - } - //间接高光 - fn RE_IndirectSpecular_Physical( radiance:vec3, irradiance:vec3, clearcoatRadiance:vec3, geometry:GeometricContext, material:PhysicalMaterial)->ReflectedLight { - var reflectedLight:ReflectedLight; - #if ${defines.USE_CLEARCOAT} - clearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness ); - #endif - #if ${defines.USE_SHEEN} - sheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness ); - #endif - var singleScattering:vec3; - var multiScattering:vec3; - let cosineWeightedIrradiance:vec3 = irradiance * reciprocal_pi; - var tempMultiAndSingleScatter:MultiAndSingleScatter; - #if ${defines.USE_IRIDESCENCE} - tempMultiAndSingleScatter=computeMultiscatteringIridescence( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness ); - #else - tempMultiAndSingleScatter= computeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness ); - #endif - singleScattering=tempMultiAndSingleScatter.singleScatter; - multiScattering=tempMultiAndSingleScatter.multiScatter; - let totalScattering:vec3 = singleScattering + multiScattering; - let diffuse:vec3 = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) ); - reflectedLight.indirectSpecular = radiance * singleScattering; - reflectedLight.indirectSpecular = multiScattering * cosineWeightedIrradiance; - reflectedLight.indirectDiffuse = diffuse * cosineWeightedIrradiance; - return reflectedLight; - } - `; -} - -var pbrStruct = ` - struct MaterialUniform{ - - modelMatrix: mat4x4, - - diffuse:vec3, - - opacity:f32, - - normalMatrix: mat3x3, - - emissive:vec3, - - roughness:f32, - - metalness:f32, - - #if TONE_MAPPING - toneMappingExposure:f32, - #endif - - #if SPECULAR - - specularColor:vec3, - - specularIntensity:f32, - #endif - - #if USE_SHEEN - - sheenColor:vec3, - - sheenRoughness:f32, - #endif - - #if USE_TRANSMISSION - - attenuationColor:vec3, - - transmission:f32, - - transmissionSamplerSize:vec2, - - thickness:f32, - - attenuationDistance:f32, - - #endif - - #if USE_SKINNING - - bindMatrix:mat4x4, - - bindMatrixInverse:mat4x4, - - boneTextureSize:u32, - #endif - - #if USE_NORMALTEXTURE - normalScale:vec2, - #endif - - #if IOR - ior:f32, - #endif - - #if USE_CLEARCOAT - - #if USE_CLEARCOAT_NORMALTEXTURE - clearcoatNormalScale:vec2, - #endif - - clearcoat:f32, - - clearcoatRoughness:f32, - #endif - - #if USE_IRIDESCENCE - iridescence:f32, - - iridescenceIOR:f32, - - iridescenceThicknessMinimum:f32, - - iridescenceThicknessMaximum:f32, - - #endif - - #if USE_AOTEXTURE - aoTextureIntensity:f32, - #endif - - #if USE_LIGHTTEXTURE - lightTextureIntensity:f32, - #endif - - #if USE_ENVTEXTURE - envTextureIntensity:f32, - - flipEnvTexture:f32, - #endif - - #if USE_BUMPTEXTURE - bumpScale:f32; - #endif - - #if USE_DISPLACEMENTTEXTURE - - displacementScale:f32, - - displacementBias:f32, - #endif - - #if USE_MORPHTARGETS - - morphTargetBaseInfluence:f32, - - #if MORPHTARGETS_TEXTURE - - morphTargetsTextureSize:vec2, - - MORPHTARGETS_COUNT:u32, - - #endif - - morphTargetInfluences:array, - - #endif - } - - `; - -var pbrTexture = ` - #if USE_BUMPTEXTURE - @group(0) @binding(bumpTextureBinding) var bumpTexture: texture_2d; - #endif - #if USE_TRANSMISSION - #if USE_TRANSMISSIONTEXTURE - @group(0) @binding(transmissionTextureBinding) var transmissionTexture: texture_2d; - #endif - #if USE_THICKNESSTEXTURE - @group(0) @binding(thicknessTextureBinding) var thicknessTexture: texture_2d; - #endif - @group(0) @binding(transmissionSamplerTextureBinding) var transmissionSamplerTexture: texture_2d; - #endif - #if USE_ENVTEXTURE - @group(0) @binding(envTextureBinding) var envTexture: texture_cube; - #endif - #if USE_NORMALTEXTURE - @group(0) @binding(normalTextureBinding) var normalTexture: texture_2d; - #endif - - #if USE_CLEARCOATTEXTURE - @group(0) @binding(clearcoatTextureBinding) var clearcoatTexture: texture_2d; - #endif - - #if USE_CLEARCOAT_ROUGHNESSTEXTURE - @group(0) @binding(clearcoatRclearcoatRoughnessTextureBinding) var clearcoatRoughnessTexture: texture_2d; - #endif - - #if USE_CLEARCOAT_NORMALTEXTURE - @group(0) @binding(clearcoatNormalTextureBinding) var clearcoatNormalTexture: texture_2d; - #endif - - #if USE_IRIDESCENCETEXTURE - @group(0) @binding(iridescenceTextureBinding) var iridescenceTexture: texture_2d; - #endif - - #if USE_IRIDESCENCE_THICKNESSTEXTURE - @group(0) @binding(iridescenceThicknessTextureBinding) var iridescenceThicknessTexture: texture_2d; - #endif - - #if USE_ROUGHNESSTEXTURE - @group(0) @binding(roughnessTextureBinding) var roughnessTexture: texture_2d; - #endif - - #if USE_METALNESSTEXTURE - @group(0) @binding(metalnessTextureBinding) var metalnessTexture: texture_2d; - #endif - - #if SPECULAR - #if USE_SPECULARINTENSITYTEXTURE - @group(0) @binding(specularIntensityTextureBinding) var specularIntensityTexture: texture_2d; - #endif - - #if USE_SPECULARCOLORTEXTURE - @group(0) @binding(specularColorTextureBinding) var specularColorTexture: texture_2d; - #endif - #endif - - #if USE_SHEEN - #if USE_SHEENCOLORTEXTURE - @group(0) @binding(sheenColorTextureBinding) var sheenColorTexture: texture_2d; - #endif - #if USE_SHEENROUGHNESSTEXTURE - @group(0) @binding(sheenRoughnessTextureBinding) var sheenRoughnessTexture: texture_2d; - #endif - #endif - - #if USE_TEXTURE - @group(0) @binding(baseSamplerBinding) var baseSampler: sampler; - @group(0) @binding(baseTextureBinding) var baseTexture: texture_2d; - #endif - - #if USE_ALPHATEXTURE - @group(0) @binding(alphaTextureBinding) var alphaTexture: texture_2d; - #endif - - #if USE_AOTEXTURE - @group(0) @binding(aoTextureBinding) var aoTexture: texture_2d; - - #endif - #if USE_LIGHTTEXTURE - @group(0) @binding(lightTextureBinding) var lightTexture: texture_2d; - #endif - - #if USE_EMISSIVETEXTURE - @group(0) @binding(emissiveTextureBinding) var emissiveTexture: texture_2d; - #endif - `; - -var pbrUtils = ` - const pi:f32= 3.141592653589793; - - const reciprocal_pi:f32= 0.3183098861837907; - fn pow2(x:f32 )->f32 { - return x*x; - } - fn pow2Vector(x:vec3 )->vec3 { - return x*x; - } - fn pow3( x:f32 )->f32 { - return x*x*x; - } - fn pow4( x:f32 )->f32 { - let x2:f32 = x*x; - return x2*x2; - } - fn max3( v:vec3 )->f32 { - return max( max( v.x, v.y ), v.z ); - } - fn average(v:vec3 )->f32 { - return dot( v, vec3( 0.3333333 ) ); - } - fn rand( uv:vec2 )->f32 { - let a:f32 = 12.9898; - let b:f32 = 78.233; - let c:f32 = 43758.5453; - let dt:f32 = dot( uv.xy, vec2( a, b ) ); - let sn:f32 = dt % pi; - return fract( sin( sn ) * c ); - } - fn transformDirection( dir:vec3, matrix:mat4x4 )->vec3 { - return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); - } - - fn transposeMat3( m:mat3x3 )->mat3x3 { - var tmp:mat3x3; - tmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x ); - tmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y ); - tmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z ); - return tmp; - } - fn luminance( rgb:vec3 )->f32 { - let weights:vec3 = vec3(0.2126729, 0.7151522, 0.0721750 ); - return dot( weights, rgb ); - } - fn LinearToneMapping( color:vec3,toneMappingExposure:f32 )->vec3 { - return toneMappingExposure * color; - } - - fn ReinhardToneMapping( color:vec3,toneMappingExposure:f32 )->vec3 { - var tempColor:vec3; - tempColor=color; - tempColor *= toneMappingExposure; - return saturate( tempColor / ( vec3( 1.0 ) + tempColor ) ); - } - fn CustomToneMapping( color:vec3 )->vec3 { - return color; - } - fn toneMapping( color:vec3,toneMappingExposure:f32 )->vec3 { - return ReinhardToneMapping( color,toneMappingExposure ); - } - - fn LinearToLinear( value:vec4 )->vec4 { - return value; - } - fn lessThanEqual(a:vec3,b:vec3)->vec3{ - let xValue:f32=select(b.x,a.x,a.x<=b.x); - let yValue:f32=select(b.y,a.y,a.y<=b.y); - let zValue:f32=select(b.z,a.z,a.z<=b.z); - return vec3(xValue,yValue,zValue); - } - fn LinearTosRGB( value:vec4 )->vec4 { - return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a ); - } - fn linearToOutputTexel(value:vec4 )->vec4 { - return LinearTosRGB( value ); - } - `; - -var blinn_phong = ` - fn getPointLightInfo(pointLight:PointLight,worldPos:vec3,shininess:f32,N:vec3,V:vec3)->vec3{ - var color=vec3(0.0,0.0,0.0); - var direction:vec3 = worldPos - pointLight.position; - let dist:f32 = length( direction ); - direction = normalize(direction); - let decay = clamp(1.0 - pow(dist / pointLight.distance, 4.0), 0.0, 1.0); - - let d = max( dot( N, -direction ), 0.0 ) * decay; - color += pointLight.color * d; - - let halfDir:vec3 = normalize( V - direction ); - let s:f32 = pow( clamp( dot( N, halfDir ), 0.0, 1.0 ), shininess ) * decay; - color += pointLight.color * s; - return color; - } - fn getSpotLightInfo(spotLight:SpotLight,worldPos:vec3,shininess:f32,N:vec3,V:vec3)->vec3{ - var color=vec3(0.0,0.0,0.0); - var direction:vec3 = spotLight.position - worldPos; - let lightDistance:f32 = length(direction); - direction = normalize(direction); - let angleCos:f32 = dot( direction, -spotLight.direction ); - let decay:f32 = clamp(1.0 - pow(lightDistance/spotLight.distance, 4.0), 0.0, 1.0); - let spotEffect:f32 = smoothstep( spotLight.penumbraCos, spotLight.coneCos, angleCos ); - let decayTotal:f32 = decay * spotEffect; - let d:f32 = max( dot( N, direction ), 0.0 ) * decayTotal; - color += spotLight.color * d; - let halfDir:vec3 = normalize( V + direction ); - let s:f32 = pow( clamp( dot( N, halfDir ), 0.0, 1.0 ), shininess ) * decayTotal; - color += spotLight.color * s; - return color; - } - struct DirectionalLight { - direction: vec3, - color: vec3, - }; - fn getDirectLightInfo(directionalLight:DirectionalLight,shininess:f32,N:vec3,V:vec3)->vec3{ - var color=vec3(0.0,0.0,0.0); - let d:f32 = max(dot(N, -directionalLight.direction), 0.0); - color += directionalLight.color * d; - - let halfDir:vec3 = normalize( V - directionalLight.direction ); - let s:f32 = pow( clamp( dot( N, halfDir ), 0.0, 1.0 ), shininess ); - color += directionalLight.color * s; - return color; - } - `; - -var phongFunction = ` - fn G_BlinnPhong_Implicit( )->f32 { - - // geometry term is (n dot l)(n dot v) / 4(n dot l)(n dot v) - return 0.25; - - } - fn D_BlinnPhong( shininess:f32, dotNH:f32 )->f32 { - - return reciprocal_pi * ( shininess * 0.5 + 1.0 ) * pow(dotNH, shininess); - - } - fn BRDF_BlinnPhong( lightDir:vec3, viewDir:vec3, normal:vec3, specularColor:vec3, shininess:f32 )->vec3 { - - let halfDir = normalize( lightDir + viewDir ); - - let dotNH:f32 = saturate( dot( normal, halfDir ) ); - let dotVH:f32 = saturate( dot( viewDir, halfDir ) ); - - let F = F_Schlick( specularColor, 1.0, dotVH ); - - let G:f32 = G_BlinnPhong_Implicit( ); - - let D = D_BlinnPhong( shininess, dotNH ); - - return F * ( G * D ); - - } - fn RE_Direct_BlinnPhong( directLight:IncidentLight,geometry:GeometricContext, material:BlinnPhongMaterial )->ReflectedLight{ - var reflectedLight:ReflectedLight; - let dotNL:f32 = saturate(dot(geometry.normal, directLight.direction)); - let irradiance:vec3 = dotNL*directLight.color; - - reflectedLight.directDiffuse= irradiance * BRDF_Lambert( material.diffuseColor ); - - reflectedLight.directSpecular= irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength; - return reflectedLight; - } - fn RE_IndirectDiffuse_BlinnPhong( irradiance:vec3, geometry:GeometricContext, material:BlinnPhongMaterial)->ReflectedLight { - var reflectedLight:ReflectedLight; - reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); - return reflectedLight; - } - `; - -var phongUtils = ` - struct BlinnPhongMaterial { - diffuseColor:vec3, - specularColor:vec3, - specularShininess:f32, - specularStrength:f32, - }; - const reciprocal_pi:f32= 0.3183098861837907; - fn pow2( x:f32 )->f32 { return x*x; } - fn pow3( x:f32 )->f32 { return x*x*x; } - fn pow4(x:f32 )->f32 { let x2 = x*x; return x2*x2; } - fn max3( v:vec3 )->f32 { return max( max( v.x, v.y ), v.z ); } - fn average(v:vec3 )->f32 { - let result=vec3( 0.3333333, 0.3333333, 0.3333333); - return dot( v,result ); - } - `; - -const skinVertHeader = ` - #if HAS_SKIN - struct JointsUniform{ - matrixs:array, - } - struct InverseBindMatricesUniform{ - matrixs:array, - } - @binding(skinJointsBufferBinding) @group(0) var jointsUniform : JointsUniform; - @binding(invsBufferBinding) @group(0) var inverseBindMatricesUniform : InverseBindMatricesUniform; - fn getSkinMatrix(joints: vec4f, weights: vec4f) -> mat4x4 { - let joint0 = jointsUniform.matrixs[u32(joints.x)] * inverseBindMatricesUniform.matrixs[u32(joints.x)]; - let joint1 = jointsUniform.matrixs[u32(joints.y)] * inverseBindMatricesUniform.matrixs[u32(joints.y)]; - let joint2 = jointsUniform.matrixs[u32(joints.z)] * inverseBindMatricesUniform.matrixs[u32(joints.z)]; - let joint3 = jointsUniform.matrixs[u32(joints.w)] * inverseBindMatricesUniform.matrixs[u32(joints.w)]; - - let skinMatrix = joint0 * weights.x + - joint1 * weights.y + - joint2 * weights.z + - joint3 * weights.w; - return skinMatrix; - } - #endif - `; -const skinVertMain = ` - #if HAS_SKIN - modelMatrix =getSkinMatrix(input.joint0,input.weight0); - vNormalView = normalize((materialUniform.normalMatrix * modelMatrix * vec4(input.normal, 0.0)).xyz); - #endif - `; - -const PbrMaterialStruct = ` - struct MaterialUniform { - modelMatrix: mat4x4, - color: vec3, - opacity:f32, - normalMatrix: mat4x4, - emissive:vec3, - metallic:f32, - roughness:f32, - #if USE_NORMALTEXTURE - normalTextureScale:vec2, - #endif - #if USE_AOTEXTURE - occlusionStrength:f32, - #endif - } - `; - -const ShaderChunk = { - light, - brdf, - phongFunction, - phongUtils, - lightCommon, - pbrStruct, - pbrFunction, - pbrTexture, - pbrUtils, - environment, - blinn_phong, - getNormal, - getTBN, - getNormalByNormalTexture, - ibl, - skinVertMain, - skinVertHeader, - FragInput, - VertexInput, - VertexOutput, - PbrMaterialStruct, - SystemUniform, - instanceVertMain, - instanceVertHeader, - TextureAndSamplerDefine, - PointVertInput, - PointVertOutput, - PointFragInput -}; - -var shadowMapDebuggerFrag = ` - @group(0) @binding(1) var shadowSampler: sampler; - @group(0) @binding(0) var shadowMap: texture_depth_2d; - - // @group(0) @binding(0) var shadowMap: texture_depth_2d_array; - // @group(0) @binding(0) var shadowMap: texture_2d; - - struct VertexOutput { - @builtin(position) position: vec4, - @location(0) uv: vec2, - }; - - fn linearizeDepth(depth: f32, near: f32, far: f32)->f32 { - return 2 * (near * far) / (far + near - depth * (far - near)); - } - - @fragment - fn main(input:VertexOutput) -> @location(0) vec4 { - let color: vec4 = textureGather(shadowMap, shadowSampler, vec2(input.uv.x,1.0-input.uv.y)); - let depth = (linearizeDepth(color.r, 0.1, 500) - 0.1) / (500 - 0.1); - return vec4(vec3(depth), 1.0); // PerspectiveCamera - // return color; - - // return textureSample(shadowMap, shadowSampler, vec2(input.uv.x,1.0-input.uv.y)); - - } - `; - -var shadowMapDebuggerVert = ` - struct VertexInput { - @location(positionLocation) position: vec2, - } - struct VertexOutput { - @builtin(position) position: vec4, - @location(0) uv: vec2, - }; - @vertex - fn main(input: VertexInput) -> VertexOutput { - var output:VertexOutput; - output.uv = input.position * 0.5 + 0.5; - output.position = vec4(input.position, 0.0, 1.0);; - return output; - } - `; - -// import Color from "../../math/Color"; -var shadowMapFrag = ` - struct VertexOutput { - @builtin(position) position: vec4, - @location(0) color: vec4, - }; - @fragment - fn main(input:VertexOutput) -> @location(0) vec4 { - return input.color; - } - `; - -var shadowMapVert = ` - struct VertexInput { - @location(positionLocation) position: vec3, - }; - struct VertexOutput { - @builtin(position) position: vec4, - }; - struct SelfUniform { - modelMatrix: mat4x4, - }; - struct SystemUniform { - projectionMatrix: mat4x4, - viewMatrix: mat4x4, - inverseViewMatrix: mat4x4, - cameraPosition: vec3, - }; - - #if IS_POINTLIGHT_SHADOWMAP - struct PointLightUniform { - vpMatrix: mat4x4, - // vpMatrixArray: array, 6>, - }; - @group(1) @binding(pointLightShadowCameraBinding) var pointLightUniform: PointLightUniform; - #endif - - @group(0) @binding(selfBinding) var selfUniform : SelfUniform; - @group(1) @binding(cameraBinding) var systemUniform : SystemUniform; - - @vertex - fn main(input: VertexInput) -> VertexOutput { - var output:VertexOutput; - #if IS_POINTLIGHT_SHADOWMAP - output.position = pointLightUniform.vpMatrix * selfUniform.modelMatrix * vec4(input.position,1.0); - #else - output.position = systemUniform.projectionMatrix * systemUniform.viewMatrix * selfUniform.modelMatrix * vec4(input.position,1.0); - #endif - return output; - } - `; - -const preprocessorSymbols = /#([^\s]*)(\s*)/gm; -const defineRexg = /\b[0-9A-Z_&&||]+\b/g; -const isNumeric = (n) => !isNaN(n); -function WGSLParseDefines(shader, defines) { - if (!shader) return undefined; - // parse shader inner const define - const notDefineConstShader = ParseDefinesConst(shader, defines); - // filter "&&","||",number - const rexgDefines = notDefineConstShader - .match(defineRexg) - ?.filter((define) => !["&&", "||", "_"].includes(define) && !isNumeric(define) && define != ""); - // normallize defines - const normalizeDefines = getNormalizeDefines(rexgDefines, defines); - // split Shader - const shaderStrs = splitShaderStrsByDefine(notDefineConstShader, rexgDefines); - // parse conditional macro definition - return shaderStrs.length > 0 ? ParseDefines(shaderStrs, normalizeDefines) : notDefineConstShader; -} -function ParseDefines(strings, values) { - const stateStack = []; - let state = { frag: "", elseIsValid: false, expression: true }; - let depth = 1; - for (let i = 0; i < strings.length; ++i) { - const frag = strings[i]; - const matchedSymbols = frag.matchAll(preprocessorSymbols); - let lastIndex = 0; - let valueConsumed = false; - for (const match of matchedSymbols) { - state.frag += frag.substring(lastIndex, match.index); - switch (match[1]) { - case "if": - if (match.index + match[0].length != frag.length) { - throw new Error("#if must be immediately followed by a template expression (ie: ${value})"); - } - valueConsumed = true; - stateStack.push(state); - depth++; - state = { frag: "", elseIsValid: true, expression: !!values[i] }; - break; - case "elif": - if (match.index + match[0].length != frag.length) { - throw new Error("#elif must be immediately followed by a template expression (ie: ${value})"); - } else if (!state.elseIsValid) { - throw new Error("#elif not preceeded by an #if or #elif"); - } - valueConsumed = true; - if (state.expression && stateStack.length != depth) { - stateStack.push(state); - } - state = { frag: "", elseIsValid: true, expression: !!values[i] }; - break; - case "else": - if (!state.elseIsValid) { - throw new Error("#else not preceeded by an #if or #elif"); - } - if (state.expression && stateStack.length != depth) { - stateStack.push(state); - } - state = { frag: match[2], elseIsValid: false, expression: true }; - break; - case "endif": - if (!stateStack.length) { - throw new Error("#endif not preceeded by an #if"); - } - // eslint-disable-next-line no-case-declarations - const branchState = stateStack.length == depth ? stateStack.pop() : state; - state = stateStack.pop(); - depth--; - if (branchState.expression) { - state.frag += branchState.frag; - } - state.frag += match[2]; - break; - default: - // Unknown preprocessor symbol. Emit it back into the output frag unchanged. - state.frag += match[0]; - break; - } - lastIndex = match.index + match[0].length; - } - // If the frag didn't end on one of the preprocessor symbols append the rest of it here. - if (lastIndex != frag.length) { - state.frag += frag.substring(lastIndex, frag.length); - } - // If the next value wasn't consumed by the preprocessor symbol, append it here. - if (!valueConsumed && values.length > i) { - state.frag += values[i]; - } - } - if (stateStack.length) { - throw new Error("Mismatched #if/#endif count"); - } - return state.frag; -} -function ParseDefinesConst(sourceShader, defines) { - if (!defines) return sourceShader; - let result = sourceShader; - const constDefineKeys = Object.keys(defines)?.filter?.((key) => key != key.toUpperCase()); - constDefineKeys?.forEach?.((key) => { - result = result.replaceAll(key, defines[key]); - }); - return result; -} -function getNormalizeDefines(rexgDefines, defines) { - return rexgDefines?.map?.((define) => { - if (define?.includes("&&") || define?.includes("||")) { - if (define.includes("&&")) { - const splitDefines = define.split("&&"); - return getAndDefineValue(splitDefines, defines); - } - const splitDefines = define.split("||"); - return !getOrDefineValue(splitDefines, defines); - } - return defines[define]; - }); -} -function getAndDefineValue(splitDefines, defines) { - let total = 0; - splitDefines?.forEach?.((defineKey) => (total += Number(defines[defineKey]) > 1 ? 1 : Number(defines[defineKey]))); - return total === splitDefines.length; -} -function getOrDefineValue(splitDefines, defines) { - let total = 0; - splitDefines?.forEach?.((defineKey) => (total += Number(defines[defineKey]) > 1 ? 1 : Number(defines[defineKey]))); - return total === 0; -} -function splitShaderStrsByDefine(shader, defines) { - let currentShaderStr = shader; - const shaderStrs = - defines?.map((define) => { - const length = currentShaderStr.indexOf(define); - const sliceStr = currentShaderStr.slice(0, length); - currentShaderStr = currentShaderStr.slice(length + 1 + define.length); - return sliceStr; - }) || []; - if (shaderStrs?.length) shaderStrs.push(currentShaderStr); - return shaderStrs; -} - -function reduceComma(shader) { - // 对所有的include处理 - return shader != undefined ? resolveIncludes(shader) : undefined; -} -const includePattern = /^[ \t]*#include +<([\w\d./]+)>/gm; -let currentDefines = {}; -const shaders = { - phong: { - frag: phongFrag, - vert: phongVert - }, - color: { - frag: colorFrag, - vert: colorVert - }, - pbr: { - frag: pbrFrag, - vert: pbrVert - }, - skybox: { - frag: skyBoxFrag, - vert: skyBoxVert - }, - resolve: { - frag: quadFrag, - vert: quadVert - }, - pbr_mat: { - frag: pbr_fs, - vert: pbr_vs - }, - blur: { - frag: Blur, - vert: quadVert - }, - luminosityHigh: { - frag: LuminosityHigh, - vert: quadVert - }, - blend: { - frag: blendFrag, - vert: quadVert - }, - shadowMapDebugger: { - frag: shadowMapDebuggerFrag, - vert: shadowMapDebuggerVert - }, - shadowMap: { - vert: shadowMapVert, - frag: shadowMapFrag - }, - sprite: { - vert: sprite_vs, - frag: sprite_fs - }, - point: { - vert: point_vs, - frag: point_fs - } -}; -function resolveIncludes(string) { - return string.replace(includePattern, includeReplacer); -} -function includeReplacer(match, include) { - const partShader = ShaderChunk[include]; - if (partShader === undefined) { - throw new Error(`Can not resolve #include <${include}>`); - } - const result = WGSLParseDefines(partShader, currentDefines); - return resolveIncludes(result); -} -function getVertFrag(type, defines = {}) { - const shader = shaders[type]; - currentDefines = defines; - return { - vert: shader?.vert ? reduceComma(WGSLParseDefines(shader.vert, currentDefines)) : undefined, - frag: shader?.frag ? reduceComma(WGSLParseDefines(shader.frag, currentDefines)) : undefined - }; -} - -class ShaderSource { - constructor(options) { - this.shaderId = options.shaderId; - this.defines = options.defines || {}; - this.render = options.render; - this.compute = options.compute; - this._shaderLanguage = options.language; - this.dirty = true; - } - get uid() { - this._uid = this.shaderId.concat(JSON.stringify(this.defines)); - return this._uid; - } - setDefines(defines) { - if (!defines) return; - this.dirty = true; - this.defines = Object.assign(this.defines, defines); - } - getShaderModule(device) { - if (this.dirty) { - const { vert, frag, compute } = this.getShaderStr() || {}; - const isGLSL = this._shaderLanguage == ShaderLanguage.GLSL; - const vertGPUModule = vert - ? device.createShaderModule({ - code: isGLSL ? ShaderSource?.glslang.compileGLSL(vert, ShaderMainStage.VERT) : vert - }) - : undefined; - const fragGPUModule = frag - ? device.createShaderModule({ - code: isGLSL ? ShaderSource?.glslang.compileGLSL(frag, ShaderMainStage.FRAG) : frag - }) - : undefined; - const computeGPUModule = compute - ? device.createShaderModule({ - code: isGLSL ? ShaderSource?.glslang.compileGLSL(compute, ShaderMainStage.COMPUTE) : compute - }) - : undefined; - this._shaderModule = { - vert: vertGPUModule, - frag: fragGPUModule, - compute: computeGPUModule - }; - this.dirty = false; - } - return this._shaderModule; - } - destroy() { - this.render = null; - this.compute = null; - this._shaderModule = null; - this.defines = null; - } - getShaderStr() { - const { fragShader, vertShader } = this.render || {}; - const { computeShader } = this.compute || {}; - const source = getVertFrag(this.shaderId, this.defines); - const vert = - source?.vert ?? WGSLParseDefines(vertShader instanceof Function ? vertShader() : vertShader, this.defines); - const frag = - source?.frag ?? WGSLParseDefines(fragShader instanceof Function ? fragShader() : fragShader, this.defines); - const compute = WGSLParseDefines( - computeShader instanceof Function ? computeShader() : computeShader, - this.defines - ); - return { - vert, - frag, - compute - }; - } - static replaceMain(source, renamedMain) { - renamedMain = `void ${renamedMain}()`; - return source.replace(/void\s+main\s*\(\s*(?:void)?\s*\)/g, renamedMain); - } -} - -async function loadGlslangModule() { - // @ts-ignore - const glslangModule = await import("https://unpkg.com/@webgpu/glslang@0.0.15/dist/web-devel/glslang.js"); - const glslang = await glslangModule.default(); - return glslang; -} - -class MipmapGenerator { - constructor(device) { - this.device = device; - this.sampler = device.createSampler({ minFilter: "linear" }); - // We'll need a new pipeline for every texture format used. - this.pipelines = {}; - } - getMipmapPipeline(format) { - let pipeline = this.pipelines[format]; - if (!pipeline) { - // Shader modules is shared between all pipelines, so only create once. - if (!this.mipmapShaderModule) { - this.mipmapShaderModule = this.device.createShaderModule({ - code: ` - var pos : array, 3> = array, 3>( - vec2(-1.0, -1.0), vec2(-1.0, 3.0), vec2(3.0, -1.0)); - struct VertexOutput { - @builtin(position) position : vec4, - @location(0) texCoord : vec2, - }; - @vertex - fn vertexMain(@builtin(vertex_index) vertexIndex : u32) -> VertexOutput { - var output : VertexOutput; - output.texCoord = pos[vertexIndex] * vec2(0.5, -0.5) + vec2(0.5); - output.position = vec4(pos[vertexIndex], 0.0, 1.0); - return output; - } - @group(0) @binding(0) var imgSampler : sampler; - @group(0) @binding(1) var img : texture_2d; - @fragment - fn fragmentMain(@location(0) texCoord : vec2) -> @location(0) vec4 { - return textureSample(img, imgSampler, texCoord); - } - ` - }); - } - pipeline = this.device.createRenderPipeline({ - layout: "auto", - vertex: { - module: this.mipmapShaderModule, - entryPoint: "vertexMain" - }, - fragment: { - module: this.mipmapShaderModule, - entryPoint: "fragmentMain", - targets: [{ format }] - } - }); - this.pipelines[format] = pipeline; - } - return pipeline; - } - /** - * Generates mipmaps for the given GPUTexture from the data in level 0. - * - * @param {module:External.GPUTexture} texture - Texture to generate mipmaps for. - * @param {object} textureDescriptor - GPUTextureDescriptor the texture was created with. - * @returns {module:External.GPUTexture} - The originally passed texture - */ - generateMipmap(sourceTexture) { - const texture = sourceTexture.gpuTexture; - const textureDescriptor = sourceTexture.textureProp; - // TODO: Does this need to handle sRGB formats differently? - const pipeline = this.getMipmapPipeline(textureDescriptor.format); - if (textureDescriptor.dimension == "3d" || textureDescriptor.dimension == "1d") { - throw new Error("Generating mipmaps for non-2d textures is currently unsupported!"); - } - let mipTexture = texture; - const arrayLayerCount = textureDescriptor.size.depth || 1; // Only valid for 2D textures. - // If the texture was created with RENDER_ATTACHMENT usage we can render directly between mip levels. - const renderToSource = textureDescriptor.usage & GPUTextureUsage.RENDER_ATTACHMENT; - if (!renderToSource) { - // Otherwise we have to use a separate texture to render into. It can be one mip level smaller than the source - // texture, since we already have the top level. - const mipTextureDescriptor = { - size: { - width: Math.ceil(textureDescriptor.size.width / 2), - height: Math.ceil(textureDescriptor.size.height / 2), - depthOrArrayLayers: arrayLayerCount - }, - format: textureDescriptor.format, - usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT, - mipLevelCount: textureDescriptor.mipLevelCount - 1 - }; - mipTexture = this.device.createTexture(mipTextureDescriptor); - } - const commandEncoder = this.device.createCommandEncoder({}); - // TODO: Consider making this static. - const bindGroupLayout = pipeline.getBindGroupLayout(0); - for (let arrayLayer = 0; arrayLayer < arrayLayerCount; ++arrayLayer) { - let srcView = texture.createView({ - baseMipLevel: 0, - mipLevelCount: 1, - dimension: "2d", - baseArrayLayer: arrayLayer, - arrayLayerCount: 1 - }); - let dstMipLevel = renderToSource ? 1 : 0; - for (let i = 1; i < textureDescriptor.mipLevelCount; ++i) { - const dstView = mipTexture.createView({ - baseMipLevel: dstMipLevel++, - mipLevelCount: 1, - dimension: "2d", - baseArrayLayer: arrayLayer, - arrayLayerCount: 1 - }); - const passEncoder = commandEncoder.beginRenderPass({ - colorAttachments: [ - { - view: dstView, - loadOp: "clear", - storeOp: "store" - } - ] - }); - const bindGroup = this.device.createBindGroup({ - layout: bindGroupLayout, - entries: [ - { - binding: 0, - resource: this.sampler - }, - { - binding: 1, - resource: srcView - } - ] - }); - passEncoder.setPipeline(pipeline); - passEncoder.setBindGroup(0, bindGroup); - passEncoder.draw(3, 1, 0, 0); - passEncoder.end(); - srcView = dstView; - } - } - // If we didn't render to the source texture, finish by copying the mip results from the temporary mipmap texture - // to the source. - if (!renderToSource) { - const mipLevelSize = { - width: Math.ceil(textureDescriptor.size.width / 2), - height: Math.ceil(textureDescriptor.size.height / 2), - depthOrArrayLayers: arrayLayerCount - }; - for (let i = 1; i < textureDescriptor.mipLevelCount; ++i) { - commandEncoder.copyTextureToTexture( - { - texture: mipTexture, - mipLevel: i - 1 - }, - { - texture: texture, - mipLevel: i - }, - mipLevelSize - ); - mipLevelSize.width = Math.ceil(mipLevelSize.width / 2); - mipLevelSize.height = Math.ceil(mipLevelSize.height / 2); - } - } - this.device.queue.submit([commandEncoder.finish()]); - if (!renderToSource) { - mipTexture.destroy(); - } - return texture; - } -} - -function defaultValue(a, b) { - if (a !== undefined && a !== null) { - return a; - } - return b; -} -/** - * A frozen empty object that can be used as the default value for options passed as - * an object literal. - * @type {Object} - * @memberof defaultValue - */ -defaultValue.EMPTY_OBJECT = Object.freeze({}); - -class RenderState { - constructor(params) { - this.scissorTest = params?.scissorTest; - this.viewport = params?.viewport; - this.depthStencil = params?.depthStencil; - this.blendConstant = params?.blendConstant; - this.stencilReference = params?.stencilReference; - this.multisample = params?.multisample; - this.primitive = params?.primitive; - this.stencilEnabled = false; - this.scissorTestEnabled = false; - this.targets = params?.targets; - } - bind(params) { - const { passEncoder, viewPort, scissorTest } = params; - const finalViewport = this.viewport ?? viewPort; - const finalScissorTest = this.scissorTest ?? scissorTest; - if (this.stencilReference) passEncoder.setStencilReference(this.stencilReference); - if (finalViewport?.equalsAndUpdateCache(cacheViewPort)) { - const { x, y, width, height, minDepth, maxDepth } = finalViewport; - passEncoder.setViewport(x, y, width, height, minDepth, maxDepth); - } - if (this.blendConstant) passEncoder.setBlendConstant(this.blendConstant); - if (finalScissorTest?.equalsAndUpdateCache(cacheScissorTest)) { - const { x, y, width, height } = finalScissorTest; - passEncoder.setScissorRect(x, y, width, height); - } - } - destroy() { - this.scissorTest = undefined; - this.viewport = undefined; - this.depthStencil = undefined; - this.blendConstant = undefined; - this.stencilReference = -1; - this.multisample = undefined; - this.primitive = undefined; - this.stencilEnabled = false; - this.scissorTestEnabled = false; - } -} -class BlendConstant { - constructor(r, g, b, a) { - this.r = r; - this.g = g; - this.b = b; - this.a = a; - } -} -class MultiSample { - constructor(count = 1, mask = 0xffffffff, alphaToCoverageEnabled = false) { - this.count = count; - this.mask = mask; - this.alphaToCoverageEnabled = alphaToCoverageEnabled; - } - getMultiSampleDec() { - return { - count: this.count, - mask: this.mask, - alphaToCoverageEnabled: this.alphaToCoverageEnabled - }; - } -} -class ScissorTest { - constructor(x = 0, y = 0, width = 0, height = 0, variable = true) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - this.variable = variable; - } - set(x, y, width, height) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - } - equalsAndUpdateCache(scissorTest) { - const { x, y, width, height } = scissorTest; - if (this.x != x || this.y != y || this.width != width || this.height != height) { - scissorTest.set(this.x, this.y, this.width, this.height); - return true; - } - return false; - } -} -class ViewPort { - constructor(x = 0, y = 0, width = 0, height = 0, minDepth = 0, maxDepth = 1, variable = true) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - this.minDepth = minDepth; - this.maxDepth = maxDepth; - this.variable = variable; - } - set(x, y, width, height, minDepth = 0, maxDepth = 1) { - if (!this.variable) return; - this.x = x; - this.y = y; - this.width = width; - this.height = height; - this.minDepth = minDepth; - this.maxDepth = maxDepth; - } - equalsAndUpdateCache(viewPort) { - const { x, y, width, height, minDepth, maxDepth } = viewPort; - if ( - this.x != x || - this.y != y || - this.width != width || - this.height != height || - this.minDepth != minDepth || - this.maxDepth != maxDepth - ) { - viewPort.set(this.x, this.y, this.width, this.height, this.minDepth, this.maxDepth); - return true; - } - return false; - } -} -class Primitive { - constructor(topology, cullMode, frontFace, unclippedDepth) { - this.frontFace = defaultValue(frontFace, FrontFace.CCW); - this.cullMode = defaultValue(cullMode, CullMode.None); - this.unclippedDepth = defaultValue(unclippedDepth, false); - this.topology = defaultValue(topology, PrimitiveTopology.TriangleList); - } - getGPUPrimitiveDec() { - return { - frontFace: this.frontFace, - cullMode: this.cullMode, - unclippedDepth: this.unclippedDepth, - topology: this.topology - }; - } -} -class DepthStencil { - constructor(options) { - this.format = defaultValue(options?.format, TextureFormat.Depth24Plus); - this.depthWriteEnabled = defaultValue(options?.depthWriteEnabled, true); - this.depthCompare = defaultValue(options?.depthCompare, CompareFunction.Less); - this.stencilReadMask = defaultValue(options?.stencilReadMask, 0xffffffff); - this.stencilWriteMask = defaultValue(options?.stencilWriteMask, 0xffffffff); - this.stencilFrontCompare = defaultValue(options?.stencilFrontCompare, CompareFunction.Always); - this.stencilFrontFailOp = defaultValue(options?.stencilFrontFailOp, StencilOperation.Keep); - this.stencilFrontDepthFailOp = defaultValue(options?.stencilFrontDepthFailOp, StencilOperation.Keep); - this.stencilFrontPassOp = defaultValue(options?.stencilFrontPassOp, StencilOperation.Keep); - this.stencilBackCompare = defaultValue(options?.stencilBackCompare, CompareFunction.Always); - this.stencilBackFailOp = defaultValue(options?.stencilBackFailOp, StencilOperation.Keep); - this.stencilBackDepthFailOp = defaultValue(options?.stencilBackDepthFailOp, StencilOperation.Keep); - this.stencilBackPassOp = defaultValue(options?.stencilBackPassOp, StencilOperation.Keep); - this.depthBias = defaultValue(options?.depthBias, 0); - this.depthBiasSlopeScale = defaultValue(options?.depthBiasSlopeScale, 0); - this.depthBiasClamp = defaultValue(options?.depthBiasClamp, 0); - } - getGPUDepthStencilDec() { - return { - format: this.format, - depthWriteEnabled: this.depthWriteEnabled, - depthCompare: this.depthCompare, - stencilReadMask: this.stencilReadMask, - stencilWriteMask: this.stencilWriteMask, - stencilFront: { - compare: this.stencilFrontCompare, - failOp: this.stencilFrontFailOp, - depthFailOp: this.stencilFrontDepthFailOp, - passOp: this.stencilFrontPassOp - }, - stencilBack: { - compare: this.stencilBackCompare, - failOp: this.stencilBackFailOp, - depthFailOp: this.stencilBackDepthFailOp, - passOp: this.stencilBackPassOp - }, - depthBias: this.depthBias, - depthBiasSlopeScale: this.depthBiasSlopeScale, - depthBiasClamp: this.depthBiasClamp - }; - } -} -class Target { - constructor(options) { - this.format = defaultValue(options?.format, TextureFormat.BGRA8Unorm); - this.blendColorOperation = defaultValue(options?.blendColorOperation, BlendOperation.Add); - this.blendColorSrcFactor = defaultValue(options?.blendColorSrcFactor, BlendFactor?.SrcAlpha); - this.blendColorDstFactor = defaultValue(options?.blendColorDstFactor, BlendFactor.OneMinusSrcAlpha); - this.blendAlphaOperation = defaultValue(options?.blendAlphaOperation, BlendOperation.Add); - this.blendAlphaSrcFactor = defaultValue(options?.blendAlphaSrcFactor, BlendFactor.One); - this.blendAlphaDstFactor = defaultValue(options?.blendAlphaDstFactor, BlendFactor.One); - this.writeMask = defaultValue(options?.writeMask, GPUColorWrite.All); - } - getGPUTargetDec() { - return { - format: this.format, - blend: { - color: { - operation: this.blendColorOperation, - srcFactor: this.blendColorSrcFactor, - dstFactor: this.blendColorDstFactor - }, - alpha: { - operation: this.blendAlphaOperation, - srcFactor: this.blendAlphaSrcFactor, - dstFactor: this.blendAlphaDstFactor - } - }, - writeMask: this.writeMask - }; - } -} -const cacheViewPort = new ViewPort(); -const cacheScissorTest = new ScissorTest(); - -class Context { - get viewPort() { - return this._viewPort; - } - get scissorTest() { - return this._scissorTest; - } - constructor({ canvas, container, context, pixelRatio, useGLSL = false }) { - if (!container.clientWidth || !container.clientHeight) throw new Error("container width or height illegality"); - this.canvas = canvas || document.createElement("canvas"); - // this.canvas.style.display = "block"; - this.pixelRatio = pixelRatio || window.devicePixelRatio || 1; - const width = container.clientWidth * this.pixelRatio; - const height = container.clientHeight * this.pixelRatio; - this.canvas.width = width; - this.canvas.height = height; - this.canvas.style.width = container.clientWidth + "px"; - this.canvas.style.height = container.clientHeight + "px"; - container.appendChild(this.canvas); - this.context = context || this.canvas.getContext("webgpu"); - this._useGLSL = useGLSL; - this.device = undefined; - } - async init(requestAdapter = {}, deviceDescriptor = {}, presentationContextDescriptor = {}) { - try { - if (!this.context) { - throw new Error(`Failed to instantiate "webgpu" context.`); - } - if (!navigator.gpu) { - throw new Error(`Missing "navigator.gpu".`); - } - this.adapter = await navigator.gpu.requestAdapter(); - this.device = await this.adapter.requestDevice(); - this.presentationSize = { - width: this.canvas.clientWidth * this.pixelRatio, - height: this.canvas.clientHeight * this.pixelRatio, - depth: 1 - }; - this.presentationFormat = navigator.gpu.getPreferredCanvasFormat(); - this.device.addEventListener("uncapturederror", (error) => { - console.error(error); - // State.error = true; - }); - if (this._useGLSL) ShaderSource.glslang = await loadGlslangModule(); - this.mipmapTools = new MipmapGenerator(this.device); - this.context.configure({ - device: this.device, - format: this.presentationFormat, - usage: TextureUsage.RenderAttachment, - alphaMode: "premultiplied", - ...presentationContextDescriptor - }); - this._viewPort = new ViewPort( - 0, - 0, - this.canvas.clientWidth * this.pixelRatio, - this.canvas.clientHeight * this.pixelRatio - ); - this._scissorTest = new ScissorTest( - 0, - 0, - this.canvas.clientWidth * this.pixelRatio, - this.canvas.clientHeight * this.pixelRatio - ); - } catch (error) { - console.error(error); - return false; - } - return true; - } - setViewPort(x, y, width, height) { - this._viewPort.set(x, y, width, height); - } - resetViewPortToFullCanvas() { - this._viewPort.set(0, 0, this.canvas.clientWidth * this.pixelRatio, this.canvas.clientHeight * this.pixelRatio); - } - setScissorTest(x, y, width, height) { - this._scissorTest.set(x, y, width, height); - } - resize(width, height, presentationContextDescriptor = {}) { - const w = width * this.pixelRatio; - const h = height * this.pixelRatio; - this.canvas.style.width = w + "px"; - this.canvas.style.height = h + "px"; - this.canvas.width = w; - this.canvas.height = h; - this.presentationSize = { - width: w, - height: h, - depth: 1 - }; - this.context.configure({ - device: this.device, - format: navigator.gpu.getPreferredCanvasFormat(), - usage: TextureUsage.RenderAttachment, - alphaMode: GPUCanvasCompositingAlphaMode.Premultiplied, - ...presentationContextDescriptor - }); - } -} - -class Texture { - constructor(textureProp) { - this.textureProp = Object.assign( - { - format: TextureFormat.RGBA8Unorm, - usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, - dataIsTexture: false - }, - textureProp - ); - this.dirty = true; - this.fixedSize = textureProp.fixedSize || false; - } - get layoutType() { - const { viewFormats, sampleType, sampleCount } = this.textureProp; - // const - return { - sampleType: defaultValue(sampleType, "float"), - viewDimension: defaultValue(viewFormats, "2d"), - multisampled: sampleCount && sampleCount > 1 ? true : false - }; - } - get storageTextureLayoutType() { - const { access = StorageTextureAccess.WriteOnly, viewFormats, format } = this.textureProp; - return { - viewDimension: defaultValue(viewFormats, "2d"), - access, - format - }; - } - get textureView() { - if (!this._textureView) - this._textureView = this.gpuTexture.createView({ - dimension: defaultValue(this.textureProp.viewFormats, "2d") - }); - return this._textureView; - } - update(device) { - if (!this.device) this.device = device; - if (this.dirty) { - this.checkNeedCreateTexture(); - this.dirty = false; - if (this.textureProp.data) { - if (Array.isArray(this.textureProp.data)) { - this.textureProp.data.forEach((imageData) => { - this.setData(imageData); - }); - } else { - this.setData(this.textureProp.data); - } - } - if (this.textureProp.needMipMap) { - if (!Texture.mipmapTools) Texture.mipmapTools = new MipmapGenerator(this.device); - this.gpuTexture = Texture.mipmapTools.generateMipmap(this); - } - } - } - setData(options) { - const { - source, - width = options.source.width, - height = options.source.height, - depth = 1, - sourceX = 0, - sourceY = 0, - mipLevel = 0, - x = 0, - y = 0, - z = 0, - aspect = "all", - colorSpace = "srgb", - premultipliedAlpha = false - } = options; - if (source instanceof Texture) { - let commandEncoder = this.device.createCommandEncoder(); - commandEncoder.copyTextureToTexture( - { - texture: source.gpuTexture, - origin: [sourceX, sourceY] - // aspect - }, - { - texture: this.gpuTexture, - origin: { x: 0, y: 0, z }, - mipLevel - // aspect - }, - { - width, - height, - depthOrArrayLayers: 1 - } - ); - this.device.queue.submit([commandEncoder.finish()]); - commandEncoder = null; - } else { - this.device.queue.copyExternalImageToTexture( - { - source, - origin: [sourceX, sourceY] - }, - { - texture: this.gpuTexture, - origin: [x, y, z], - mipLevel, - aspect, - colorSpace, - premultipliedAlpha - }, - [width, height, depth] - ); - } - } - setSize(width, height, depth) { - if (this.fixedSize) return; - this.textureProp.size.width = width; - this.textureProp.size.height = height; - if (depth) this.textureProp.size.depth = depth; - this.dirty = true; - } - destroy() { - this.gpuTexture.destroy(); - } - createGPUTexture() { - if (typeof this.textureProp.format === "number") { - throw new Error("number format"); - } - const { width, height, depth } = this.textureProp.size; - return this.device.createTexture({ - label: this.textureProp?.label || "undefined", - size: [width, height, depth], - dimension: this.textureProp.dimension || "2d", - format: this.textureProp.format, - usage: this.textureProp.usage, - mipLevelCount: this.textureProp.mipLevelCount || 1, - sampleCount: this.textureProp.sampleCount || 1 - }); - } - checkNeedCreateTexture() { - const { width, height, depth } = this.textureProp.size; - if (this.gpuTexture) { - if (width != this.gpuTexture.width || height != this.gpuTexture.height) { - this._textureView = undefined; - this.gpuTexture.destroy(); - this.gpuTexture = this.createGPUTexture(); - } - } else { - this.gpuTexture = this.createGPUTexture(); - } - } -} - -class Sampler { - constructor( - descriptor, - layoutType = { - type: "filtering" - } - ) { - this.descriptor = descriptor; - this.descriptor = {}; - Object.assign( - this.descriptor, - { - magFilter: "linear", - minFilter: "linear", - // mipmapFilter: "linear", - addressModeU: "clamp-to-edge", - addressModeV: "clamp-to-edge" - // addressModeW: "clamp-to-edge", - }, - descriptor - ); - this.layoutType = layoutType; - } - update(device) { - if (!this.gpuSampler) this.gpuSampler = device.createSampler(this.descriptor); - } -} -Sampler.baseSampler = new Sampler({ - magFilter: "linear", - minFilter: "linear" -}); - -class Attachment { - constructor(value, options) { - this.value = value; - this.op = "clear"; - this.storeOp = "store"; - Object.assign(this, options); - } -} - -function defined(value) { - return value !== undefined && value !== null; -} - -/* - https://github.com/banksean wrapped Makoto Matsumoto and Takuji Nishimura's code in a namespace - so it's better encapsulated. Now you can have multiple random number generators - and they won't stomp all over eachother's state. - - If you want to use this as a substitute for Math.random(), use the random() - method like so: - - var m = new MersenneTwister(); - var randomNumber = m.random(); - - You can also call the other genrand_{foo}() methods on the instance. - - If you want to use a specific seed in order to get a repeatable random - sequence, pass an integer into the constructor: - - var m = new MersenneTwister(123); - - and that will always produce the same random sequence. - - Sean McCullough (banksean@gmail.com) -*/ - -/* - A C-program for MT19937, with initialization improved 2002/1/26. - Coded by Takuji Nishimura and Makoto Matsumoto. - - Before using, initialize the state by using init_seed(seed) - or init_by_array(init_key, key_length). - - Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. The names of its contributors may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - Any feedback is very welcome. - http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html - email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) -*/ - -var MersenneTwister = function (seed) { - if (seed == undefined) { - seed = new Date().getTime(); - } - - /* Period parameters */ - this.N = 624; - this.M = 397; - this.MATRIX_A = 0x9908b0df; /* constant vector a */ - this.UPPER_MASK = 0x80000000; /* most significant w-r bits */ - this.LOWER_MASK = 0x7fffffff; /* least significant r bits */ - - this.mt = new Array(this.N); /* the array for the state vector */ - this.mti = this.N + 1; /* mti==N+1 means mt[N] is not initialized */ - - if (seed.constructor == Array) { - this.init_by_array(seed, seed.length); - } else { - this.init_seed(seed); - } -}; - -/* initializes mt[N] with a seed */ -/* origin name init_genrand */ -MersenneTwister.prototype.init_seed = function (s) { - this.mt[0] = s >>> 0; - for (this.mti = 1; this.mti < this.N; this.mti++) { - var s = this.mt[this.mti - 1] ^ (this.mt[this.mti - 1] >>> 30); - this.mt[this.mti] = ((((s & 0xffff0000) >>> 16) * 1812433253) << 16) + (s & 0x0000ffff) * 1812433253 + this.mti; - /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ - /* In the previous versions, MSBs of the seed affect */ - /* only MSBs of the array mt[]. */ - /* 2002/01/09 modified by Makoto Matsumoto */ - this.mt[this.mti] >>>= 0; - /* for >32 bit machines */ - } -}; - -/* initialize by an array with array-length */ -/* init_key is the array for initializing keys */ -/* key_length is its length */ -/* slight change for C++, 2004/2/26 */ -MersenneTwister.prototype.init_by_array = function (init_key, key_length) { - var i, j, k; - this.init_seed(19650218); - i = 1; - j = 0; - k = this.N > key_length ? this.N : key_length; - for (; k; k--) { - var s = this.mt[i - 1] ^ (this.mt[i - 1] >>> 30); - this.mt[i] = - (this.mt[i] ^ (((((s & 0xffff0000) >>> 16) * 1664525) << 16) + (s & 0x0000ffff) * 1664525)) + - init_key[j] + - j; /* non linear */ - this.mt[i] >>>= 0; /* for WORDSIZE > 32 machines */ - i++; - j++; - if (i >= this.N) { - this.mt[0] = this.mt[this.N - 1]; - i = 1; - } - if (j >= key_length) j = 0; - } - for (k = this.N - 1; k; k--) { - var s = this.mt[i - 1] ^ (this.mt[i - 1] >>> 30); - this.mt[i] = - (this.mt[i] ^ (((((s & 0xffff0000) >>> 16) * 1566083941) << 16) + (s & 0x0000ffff) * 1566083941)) - - i; /* non linear */ - this.mt[i] >>>= 0; /* for WORDSIZE > 32 machines */ - i++; - if (i >= this.N) { - this.mt[0] = this.mt[this.N - 1]; - i = 1; - } - } - - this.mt[0] = 0x80000000; /* MSB is 1; assuring non-zero initial array */ -}; - -/* generates a random number on [0,0xffffffff]-interval */ -/* origin name genrand_int32 */ -MersenneTwister.prototype.random_int = function () { - var y; - var mag01 = new Array(0x0, this.MATRIX_A); - /* mag01[x] = x * MATRIX_A for x=0,1 */ - - if (this.mti >= this.N) { - /* generate N words at one time */ - var kk; - - if (this.mti == this.N + 1) - /* if init_seed() has not been called, */ - this.init_seed(5489); /* a default initial seed is used */ - - for (kk = 0; kk < this.N - this.M; kk++) { - y = (this.mt[kk] & this.UPPER_MASK) | (this.mt[kk + 1] & this.LOWER_MASK); - this.mt[kk] = this.mt[kk + this.M] ^ (y >>> 1) ^ mag01[y & 0x1]; - } - for (; kk < this.N - 1; kk++) { - y = (this.mt[kk] & this.UPPER_MASK) | (this.mt[kk + 1] & this.LOWER_MASK); - this.mt[kk] = this.mt[kk + (this.M - this.N)] ^ (y >>> 1) ^ mag01[y & 0x1]; - } - y = (this.mt[this.N - 1] & this.UPPER_MASK) | (this.mt[0] & this.LOWER_MASK); - this.mt[this.N - 1] = this.mt[this.M - 1] ^ (y >>> 1) ^ mag01[y & 0x1]; - - this.mti = 0; - } - - y = this.mt[this.mti++]; - - /* Tempering */ - y ^= y >>> 11; - y ^= (y << 7) & 0x9d2c5680; - y ^= (y << 15) & 0xefc60000; - y ^= y >>> 18; - - return y >>> 0; -}; - -/* generates a random number on [0,0x7fffffff]-interval */ -/* origin name genrand_int31 */ -MersenneTwister.prototype.random_int31 = function () { - return this.random_int() >>> 1; -}; - -/* generates a random number on [0,1]-real-interval */ -/* origin name genrand_real1 */ -MersenneTwister.prototype.random_incl = function () { - return this.random_int() * (1.0 / 4294967295.0); - /* divided by 2^32-1 */ -}; - -/* generates a random number on [0,1)-real-interval */ -MersenneTwister.prototype.random = function () { - return this.random_int() * (1.0 / 4294967296.0); - /* divided by 2^32 */ -}; - -/* generates a random number on (0,1)-real-interval */ -/* origin name genrand_real3 */ -MersenneTwister.prototype.random_excl = function () { - return (this.random_int() + 0.5) * (1.0 / 4294967296.0); - /* divided by 2^32 */ -}; - -/* generates a random number on [0,1) with 53-bit resolution*/ -/* origin name genrand_res53 */ -MersenneTwister.prototype.random_long = function () { - var a = this.random_int() >>> 5, - b = this.random_int() >>> 6; - return (a * 67108864.0 + b) * (1.0 / 9007199254740992.0); -}; - -/* These real versions are due to Isaku Wada, 2002/01/09 added */ - -var mersenneTwister = MersenneTwister; - -class GMath { - static signNotZero(value) { - return value < 0.0 ? -1.0 : 1.0; - } - static toSNorm(value, rangeMaximum) { - rangeMaximum = defaultValue(rangeMaximum, 255); - return Math.round((GMath.clamp(value, -1.0, 1.0) * 0.5 + 0.5) * rangeMaximum); - } - static fromSNorm(value, rangeMaximum) { - rangeMaximum = defaultValue(rangeMaximum, 255); - return (GMath.clamp(value, 0.0, rangeMaximum) / rangeMaximum) * 2.0 - 1.0; - } - static normalize(value, rangeMinimum, rangeMaximum) { - rangeMaximum = Math.max(rangeMaximum - rangeMinimum, 0.0); - return rangeMaximum === 0.0 ? 0.0 : GMath.clamp((value - rangeMinimum) / rangeMaximum, 0.0, 1.0); - } - static lerp(p, q, time) { - return (1.0 - time) * p + time * q; - } - static toRadians(degrees) { - if (!defined(degrees)) { - throw new Error("degrees is required."); - } - return degrees * GMath.RADIANS_PER_DEGREE; - } - static toDegrees(radians) { - if (!defined(radians)) { - throw new Error("radians is required."); - } - return radians * GMath.DEGREES_PER_RADIAN; - } - static negativePiToPi(angle) { - if (!defined(angle)) { - throw new Error("angle is required."); - } - if (angle >= -GMath.PI && angle <= GMath.PI) { - // Early exit if the input is already inside the range. This avoids - // unnecessary math which could introduce floating point error. - return angle; - } - return GMath.zeroToTwoPi(angle + GMath.PI) - GMath.PI; - } - static zeroToTwoPi(angle) { - if (!defined(angle)) { - throw new Error("angle is required."); - } - if (angle >= 0 && angle <= GMath.TWO_PI) { - // Early exit if the input is already inside the range. This avoids - // unnecessary math which could introduce floating point error. - return angle; - } - const mod = GMath.mod(angle, GMath.TWO_PI); - if (Math.abs(mod) < GMath.EPSILON14 && Math.abs(angle) > GMath.EPSILON14) { - return GMath.TWO_PI; - } - return mod; - } - static mod(m, n) { - if (!defined(m)) { - throw new Error("m is required."); - } - if (!defined(n)) { - throw new Error("n is required."); - } - if (n === 0.0) { - throw new Error("divisor cannot be 0."); - } - if (GMath.sign(m) === GMath.sign(n) && Math.abs(m) < Math.abs(n)) { - // Early exit if the input does not need to be modded. This avoids - // unnecessary math which could introduce floating point error. - return m; - } - return ((m % n) + n) % n; - } - static equalsEpsilon(left, right, relativeEpsilon, absoluteEpsilon = relativeEpsilon) { - if (!defined(left)) { - throw new Error("left is required."); - } - if (!defined(right)) { - throw new Error("right is required."); - } - relativeEpsilon = defaultValue(relativeEpsilon, 0.0); - absoluteEpsilon = defaultValue(absoluteEpsilon, relativeEpsilon); - const absDiff = Math.abs(left - right); - return absDiff <= absoluteEpsilon || absDiff <= relativeEpsilon * Math.max(Math.abs(left), Math.abs(right)); - } - static lessThan(left, right, absoluteEpsilon = 0) { - if (!defined(left)) { - throw new Error("first is required."); - } - if (!defined(right)) { - throw new Error("second is required."); - } - if (!defined(absoluteEpsilon)) { - throw new Error("absoluteEpsilon is required."); - } - return left - right < -absoluteEpsilon; - } - static lessThanOrEquals(left, right, absoluteEpsilon = 0) { - if (!defined(left)) { - throw new Error("first is required."); - } - if (!defined(right)) { - throw new Error("second is required."); - } - if (!defined(absoluteEpsilon)) { - throw new Error("absoluteEpsilon is required."); - } - return left - right < absoluteEpsilon; - } - static greaterThan(left, right, absoluteEpsilon = 0) { - if (!defined(left)) { - throw new Error("first is required."); - } - if (!defined(right)) { - throw new Error("second is required."); - } - if (!defined(absoluteEpsilon)) { - throw new Error("absoluteEpsilon is required."); - } - return left - right > absoluteEpsilon; - } - static greaterThanOrEquals(left, right, absoluteEpsilon = 0) { - if (!defined(left)) { - throw new Error("first is required."); - } - if (!defined(right)) { - throw new Error("second is required."); - } - if (!defined(absoluteEpsilon)) { - throw new Error("absoluteEpsilon is required."); - } - return left - right > -absoluteEpsilon; - } - static isPowerOfTwo(n) { - // >>includeStart('debug', pragmas.debug); - if (typeof n !== "number" || n < 0 || n > 4294967295) { - throw new Error("A number between 0 and (2^32)-1 is required."); - } - // >>includeEnd('debug'); - return n !== 0 && (n & (n - 1)) === 0; - } - static nextPowerOfTwo(n) { - if (typeof n !== "number" || n < 0 || n > 2147483648) { - throw new Error("A number between 0 and 2^31 is required."); - } - // From http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 - --n; - n |= n >> 1; - n |= n >> 2; - n |= n >> 4; - n |= n >> 8; - n |= n >> 16; - ++n; - return n; - } - static previousPowerOfTwo(n) { - if (typeof n !== "number" || n < 0 || n > 4294967295) { - throw new Error("A number between 0 and (2^32)-1 is required."); - } - n |= n >> 1; - n |= n >> 2; - n |= n >> 4; - n |= n >> 8; - n |= n >> 16; - n |= n >> 32; - // The previous bitwise operations implicitly convert to signed 32-bit. Use `>>>` to convert to unsigned - n = (n >>> 0) - (n >>> 1); - return n; - } - static clamp(value, min, max) { - return value < min ? min : value > max ? max : value; - } - /** - * @private - */ - static fog(distanceToCamera, density) { - const scalar = distanceToCamera * density; - return 1.0 - Math.exp(-(scalar * scalar)); - } -} -GMath.EPSILON1 = 0.1; -GMath.EPSILON2 = 0.01; -GMath.EPSILON3 = 0.001; -GMath.EPSILON4 = 0.0001; -GMath.EPSILON5 = 0.00001; -GMath.EPSILON6 = 0.000001; -GMath.EPSILON7 = 0.0000001; -GMath.EPSILON8 = 0.00000001; -GMath.EPSILON9 = 0.000000001; -GMath.EPSILON10 = 0.0000000001; -GMath.EPSILON11 = 0.00000000001; -GMath.EPSILON12 = 0.000000000001; -GMath.EPSILON13 = 0.0000000000001; -GMath.EPSILON14 = 0.00000000000001; -GMath.EPSILON15 = 0.000000000000001; -GMath.EPSILON16 = 0.0000000000000001; -GMath.EPSILON17 = 0.00000000000000001; -GMath.EPSILON18 = 0.000000000000000001; -GMath.EPSILON19 = 0.0000000000000000001; -GMath.EPSILON20 = 0.00000000000000000001; -GMath.EPSILON21 = 0.000000000000000000001; -GMath.GRAVITATIONALPARAMETER = 3.986004418e14; -GMath.SIXTY_FOUR_KILOBYTES = 64 * 1024; -GMath.FOUR_GIGABYTES = 4 * 1024 * 1024 * 1024; -GMath.sign = defaultValue(Math.sign, function sign(value) { - value = +value; // coerce to number - if (value === 0 || value !== value) { - // zero or NaN - return value; - } - return value > 0 ? 1 : -1; -}); -GMath.sinh = defaultValue(Math.sinh, function sinh(value) { - return (Math.exp(value) - Math.exp(-value)) / 2.0; -}); -GMath.cosh = defaultValue(Math.cosh, function cosh(value) { - return (Math.exp(value) + Math.exp(-value)) / 2.0; -}); -GMath.PI = Math.PI; -GMath.ONE_OVER_PI = 1.0 / Math.PI; -GMath.PI_OVER_TWO = Math.PI / 2.0; -GMath.PI_OVER_THREE = Math.PI / 3.0; -GMath.PI_OVER_FOUR = Math.PI / 4.0; -GMath.PI_OVER_SIX = Math.PI / 6.0; -GMath.THREE_PI_OVER_TWO = (3.0 * Math.PI) / 2.0; -GMath.TWO_PI = 2.0 * Math.PI; -GMath.ONE_OVER_TWO_PI = 1.0 / (2.0 * Math.PI); -GMath.RADIANS_PER_DEGREE = Math.PI / 180.0; -GMath.DEGREES_PER_RADIAN = 180.0 / Math.PI; -GMath.RADIANS_PER_ARCSECOND = GMath.RADIANS_PER_DEGREE / 3600.0; -GMath.nextRandomNumber = function () { - return randomNumberGenerator.random(); -}; -GMath.randomBetween = function (min, max) { - return GMath.nextRandomNumber() * (max - min) + min; -}; -GMath.acosClamped = function (value) { - if (!defined(value)) { - throw new Error("value is required."); - } - return Math.acos(GMath.clamp(value, -1.0, 1.0)); -}; -GMath.asinClamped = function (value) { - if (!defined(value)) { - throw new Error("value is required."); - } - return Math.asin(GMath.clamp(value, -1.0, 1.0)); -}; -GMath.chordLength = function (angle, radius) { - if (!defined(angle)) { - throw new Error("angle is required."); - } - if (!defined(radius)) { - throw new Error("radius is required."); - } - return 2.0 * radius * Math.sin(angle * 0.5); -}; -GMath.logBase = function (number, base) { - if (!defined(number)) { - throw new Error("number is required."); - } - if (!defined(base)) { - throw new Error("base is required."); - } - return Math.log(number) / Math.log(base); -}; -GMath.cbrt = defaultValue(Math.cbrt, function cbrt(number) { - const result = Math.pow(Math.abs(number), 1.0 / 3.0); - return number < 0.0 ? -result : result; -}); -GMath.log2 = defaultValue(Math.log2, function log2(number) { - return Math.log(number) * Math.LOG2E; -}); -const randomNumberGenerator = new mersenneTwister(); - -/** - * A 2D Cartesian point. - * @alias Vector2 - * @constructor - * - * @param {Number} [x=0.0] The X component. - * @param {Number} [y=0.0] The Y component. - * - */ -class Vector2 { - constructor(x = 0.0, y = 0.0) { - this.x = x; - this.y = y; - this.x = x; - this.y = y; - } - set(x, y) { - this.x = x; - this.y = y; - return this; - } - toArray() { - return [this.x, this.y]; - } - clone(result) { - return Vector2.clone(this, result); - } - equals(right) { - return Vector2.equals(this, right); - } - equalsEpsilon(right, relativeEpsilon = 0, absoluteEpsilon = 0) { - return Vector2.equalsEpsilon(this, right, relativeEpsilon, absoluteEpsilon); - } - toString() { - return `(${this.x}, ${this.y})`; - } - fromBufferAttribute(attribute, index) { - this.x = attribute.getX(index); - this.y = attribute.getY(index); - return this; - } - applyMatrix3(matrix3) { - const x = this.x, - y = this.y; - this.x = matrix3[0] * x + matrix3[3] * y + matrix3[6]; - this.y = matrix3[1] * x + matrix3[4] * y + matrix3[7]; - return this; - } - static fromElements(x, y, result) { - if (!defined(result)) { - return new Vector2(x, y); - } - result.x = x; - result.y = y; - return result; - } - static clone(cartesian, result) { - if (!defined(cartesian)) { - return undefined; - } - if (!defined(result)) { - return new Vector2(cartesian.x, cartesian.y); - } - result.x = cartesian.x; - result.y = cartesian.y; - return result; - } - static maximumComponent(cartesian) { - return Math.max(cartesian.x, cartesian.y); - } - static minimumComponent(cartesian) { - return Math.min(cartesian.x, cartesian.y); - } - static minimumByComponent(first, second, result) { - result.x = Math.min(first.x, second.x); - result.y = Math.min(first.y, second.y); - return result; - } - static maximumByComponent(first, second, result) { - result.x = Math.max(first.x, second.x); - result.y = Math.max(first.y, second.y); - return result; - } - static clamp(value, min, max, result) { - const x = GMath.clamp(value.x, min.x, max.x); - const y = GMath.clamp(value.y, min.y, max.y); - result.x = x; - result.y = y; - return result; - } - static magnitudeSquared(cartesian) { - return cartesian.x * cartesian.x + cartesian.y * cartesian.y; - } - static magnitude(cartesian) { - return Math.sqrt(Vector2.magnitudeSquared(cartesian)); - } - static distance(left, right) { - Vector2.subtract(left, right, distanceScratch$2); - return Vector2.magnitude(distanceScratch$2); - } - static distanceSquared(left, right) { - Vector2.subtract(left, right, distanceScratch$2); - return Vector2.magnitudeSquared(distanceScratch$2); - } - static normalize(cartesian, result) { - const magnitude = Vector2.magnitude(cartesian); - result.x = cartesian.x / magnitude; - result.y = cartesian.y / magnitude; - // >>includeStart('debug', pragmas.debug); - if (isNaN(result.x) || isNaN(result.y)) { - throw new Error("normalized result is not a number"); - } - // >>includeEnd('debug'); - return result; - } - static dot(left, right) { - return left.x * right.x + left.y * right.y; - } - static cross(left, right) { - return left.x * right.y - left.y * right.x; - } - static multiplyComponents(left, right, result) { - result.x = left.x * right.x; - result.y = left.y * right.y; - return result; - } - static divideComponents(left, right, result) { - result.x = left.x / right.x; - result.y = left.y / right.y; - return result; - } - static add(left, right, result) { - result.x = left.x + right.x; - result.y = left.y + right.y; - return result; - } - static subtract(left, right, result) { - result.x = left.x - right.x; - result.y = left.y - right.y; - return result; - } - static multiplyByScalar(cartesian, scalar, result) { - result.x = cartesian.x * scalar; - result.y = cartesian.y * scalar; - return result; - } - static divideByScalar(cartesian, scalar, result) { - result.x = cartesian.x / scalar; - result.y = cartesian.y / scalar; - return result; - } - static negate(cartesian, result) { - result.x = -cartesian.x; - result.y = -cartesian.y; - return result; - } - static abs(cartesian, result) { - result.x = Math.abs(cartesian.x); - result.y = Math.abs(cartesian.y); - return result; - } - static lerp(start, end, t, result) { - Vector2.multiplyByScalar(end, t, lerpScratch$3); - result = Vector2.multiplyByScalar(start, 1.0 - t, result); - return Vector2.add(lerpScratch$3, result, result); - } - static angleBetween(left, right) { - Vector2.normalize(left, angleBetweenScratch$1); - Vector2.normalize(right, angleBetweenScratch2$1); - return GMath.acosClamped(Vector2.dot(angleBetweenScratch$1, angleBetweenScratch2$1)); - } - static mostOrthogonalAxis(cartesian, result) { - const f = Vector2.normalize(cartesian, mostOrthogonalAxisScratch$1); - Vector2.abs(f, f); - if (f.x <= f.y) { - result = Vector2.clone(Vector2.UNIT_X, result); - } else { - result = Vector2.clone(Vector2.UNIT_Y, result); - } - return result; - } - static equals(left, right) { - return left === right || (defined(left) && defined(right) && left.x === right.x && left.y === right.y); - } - /** - * @private - */ - static equalsArray(cartesian, array, offset) { - return cartesian.x === array[offset] && cartesian.y === array[offset + 1]; - } - static equalsEpsilon(left, right, relativeEpsilon = 0, absoluteEpsilon = 0) { - return ( - left === right || - (defined(left) && - defined(right) && - GMath.equalsEpsilon(left.x, right.x, relativeEpsilon, absoluteEpsilon) && - GMath.equalsEpsilon(left.y, right.y, relativeEpsilon, absoluteEpsilon)) - ); - } -} -Vector2.ZERO = Object.freeze(new Vector2(0.0, 0.0)); -Vector2.ONE = Object.freeze(new Vector2(1.0, 1.0)); -Vector2.UNIT_X = Object.freeze(new Vector2(1.0, 0.0)); -Vector2.UNIT_Y = Object.freeze(new Vector2(0.0, 1.0)); -const distanceScratch$2 = new Vector2(); -const lerpScratch$3 = new Vector2(); -const angleBetweenScratch$1 = new Vector2(); -const angleBetweenScratch2$1 = new Vector2(); -const mostOrthogonalAxisScratch$1 = new Vector2(); - -class Vector3 { - constructor(x = 0, y = 0, z = 0) { - this.x = x; - this.y = y; - this.z = z; - } - set(x, y, z) { - this.x = x; - this.y = y; - this.z = z; - return this; - } - toArray() { - return [this.x, this.y, this.z]; - } - copy(v) { - this.x = v.x; - this.y = v.y; - this.z = v.z; - return this; - } - lerp(end, t) { - Vector3.lerp(this, end, t, this); - return this; - } - add(v) { - Vector3.add(this, v, this); - return this; - } - addScaledVector(v, s) { - this.x += v.x * s; - this.y += v.y * s; - this.z += v.z * s; - return this; - } - subtract(v) { - Vector3.subtract(this, v, this); - return this; - } - applyQuaternion(q) { - const x = this.x, - y = this.y, - z = this.z; - const qx = q.x, - qy = q.y, - qz = q.z, - qw = q.w; - // calculate quat * vector - const ix = qw * x + qy * z - qz * y; - const iy = qw * y + qz * x - qx * z; - const iz = qw * z + qx * y - qy * x; - const iw = -qx * x - qy * y - qz * z; - // calculate result * inverse quat - this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy; - this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz; - this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx; - return this; - } - setFromMatrixColumn(m, index) { - return this.fromArray(m, index * 4); - } - fromArray(array, offset = 0) { - this.x = array[offset]; - this.y = array[offset + 1]; - this.z = array[offset + 2]; - return this; - } - multiplyByScalar(scale) { - Vector3.multiplyByScalar(this, scale, this); - return this; - } - clone() { - return Vector3.clone(this, new Vector3()); - } - length() { - return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); - } - applyMatrix4(matrix) { - const x = this.x, - y = this.y, - z = this.z; - const e = matrix; - const w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]); - this.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w; - this.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w; - this.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w; - return this; - } - applyMatrix3(matrix) { - const x = this.x, - y = this.y, - z = this.z; - this.x = x * matrix[0] + y * matrix[3] + z * matrix[6]; - this.y = x * matrix[1] + y * matrix[4] + z * matrix[7]; - this.z = x * matrix[2] + y * matrix[5] + z * matrix[8]; - return this; - } - transformDirection(matrix) { - const x = this.x, - y = this.y, - z = this.z; - const e = matrix; - this.x = e[0] * x + e[4] * y + e[8] * z; - this.y = e[1] * x + e[5] * y + e[9] * z; - this.z = e[2] * x + e[6] * y + e[10] * z; - return this.normalize(); - } - setFromMatrixPosition(matrix) { - const e = matrix; - this.x = e[12]; - this.y = e[13]; - this.z = e[14]; - return this; - } - normalize() { - Vector3.normalize(this, this); - return this; - } - equals(right) { - return Vector3.equals(this, right); - } - equalsEpsilon(right, relativeEpsilon = 0, absoluteEpsilon = 0) { - return Vector3.equalsEpsilon(this, right, relativeEpsilon, absoluteEpsilon); - } - toString() { - return `(${this.x}, ${this.y}, ${this.z})`; - } - fromBufferAttribute(attribute, index) { - this.x = attribute.getX(index); - this.y = attribute.getY(index); - this.z = attribute.getZ(index); - return this; - } - static fromVector4(vec4, result) { - result.x = vec4.x; - result.y = vec4.y; - result.z = vec4.z; - return result; - } - static fromSpherical(spherical, result) { - if (!defined(result)) { - result = new Vector3(); - } - const { phi, radius, theta } = spherical; - const sinPhiRadius = Math.sin(phi) * radius; - result.x = sinPhiRadius * Math.sin(theta); - result.y = Math.cos(phi) * radius; - result.z = sinPhiRadius * Math.cos(theta); - return result; - } - static fromElements(x, y, z, result) { - if (!defined(result)) { - return new Vector3(x, y, z); - } - result.x = x; - result.y = y; - result.z = z; - return result; - } - static clone(cartesian, result = new Vector3()) { - if (!defined(cartesian)) { - return undefined; - } - if (!defined(result)) { - return new Vector3(cartesian.x, cartesian.y, cartesian.z); - } - result.x = cartesian.x; - result.y = cartesian.y; - result.z = cartesian.z; - return result; - } - static maximumComponent(cartesian) { - return Math.max(cartesian.x, cartesian.y, cartesian.z); - } - static minimumComponent(cartesian) { - return Math.min(cartesian.x, cartesian.y, cartesian.z); - } - static minimumByComponent(first, second, result) { - result.x = Math.min(first.x, second.x); - result.y = Math.min(first.y, second.y); - result.z = Math.min(first.z, second.z); - return result; - } - static maximumByComponent(first, second, result) { - result.x = Math.max(first.x, second.x); - result.y = Math.max(first.y, second.y); - result.z = Math.max(first.z, second.z); - return result; - } - static clamp(value, min, max, result) { - const x = GMath.clamp(value.x, min.x, max.x); - const y = GMath.clamp(value.y, min.y, max.y); - const z = GMath.clamp(value.z, min.z, max.z); - result.x = x; - result.y = y; - result.z = z; - return result; - } - static magnitudeSquared(cartesian) { - return cartesian.x * cartesian.x + cartesian.y * cartesian.y + cartesian.z * cartesian.z; - } - static magnitude(cartesian) { - return Math.sqrt(Vector3.magnitudeSquared(cartesian)); - } - static distance(left, right) { - Vector3.subtract(left, right, distanceScratch$1); - return Vector3.magnitude(distanceScratch$1); - } - static distanceSquared(left, right) { - Vector3.subtract(left, right, distanceScratch$1); - return Vector3.magnitudeSquared(distanceScratch$1); - } - static normalize(cartesian, result) { - const magnitude = Vector3.magnitude(cartesian); - result.x = cartesian.x / magnitude; - result.y = cartesian.y / magnitude; - result.z = cartesian.z / magnitude; - if (isNaN(result.x) || isNaN(result.y) || isNaN(result.z)) { - throw new Error("normalized result is not a number"); - } - return result; - } - static dot(left, right) { - return left.x * right.x + left.y * right.y + left.z * right.z; - } - static multiplyComponents(left, right, result) { - result.x = left.x * right.x; - result.y = left.y * right.y; - result.z = left.z * right.z; - return result; - } - static divideComponents(left, right, result) { - result.x = left.x / right.x; - result.y = left.y / right.y; - result.z = left.z / right.z; - return result; - } - static add(left, right, result) { - result.x = left.x + right.x; - result.y = left.y + right.y; - result.z = left.z + right.z; - return result; - } - static subtract(left, right, result) { - result.x = left.x - right.x; - result.y = left.y - right.y; - result.z = left.z - right.z; - return result; - } - static multiplyByScalar(cartesian, scalar, result) { - result.x = cartesian.x * scalar; - result.y = cartesian.y * scalar; - result.z = cartesian.z * scalar; - return result; - } - static divideByScalar(cartesian, scalar, result) { - result.x = cartesian.x / scalar; - result.y = cartesian.y / scalar; - result.z = cartesian.z / scalar; - return result; - } - static negate(cartesian, result) { - result.x = -cartesian.x; - result.y = -cartesian.y; - result.z = -cartesian.z; - return result; - } - static abs(cartesian, result) { - result.x = Math.abs(cartesian.x); - result.y = Math.abs(cartesian.y); - result.z = Math.abs(cartesian.z); - return result; - } - static lerp(start, end, t, result) { - Vector3.multiplyByScalar(end, t, lerpScratch$2); - result = Vector3.multiplyByScalar(start, 1.0 - t, result); - return Vector3.add(lerpScratch$2, result, result); - } - static angleBetween(left, right) { - Vector3.normalize(left, angleBetweenScratch); - Vector3.normalize(right, angleBetweenScratch2); - const cosine = Vector3.dot(angleBetweenScratch, angleBetweenScratch2); - const sine = Vector3.magnitude(Vector3.cross(angleBetweenScratch, angleBetweenScratch2, angleBetweenScratch)); - return Math.atan2(sine, cosine); - } - static mostOrthogonalAxis(cartesian, result) { - const f = Vector3.normalize(cartesian, mostOrthogonalAxisScratch); - Vector3.abs(f, f); - if (f.x <= f.y) { - if (f.x <= f.z) { - result = Vector3.clone(Vector3.UNIT_X, result); - } else { - result = Vector3.clone(Vector3.UNIT_Z, result); - } - } else if (f.y <= f.z) { - result = Vector3.clone(Vector3.UNIT_Y, result); - } else { - result = Vector3.clone(Vector3.UNIT_Z, result); - } - return result; - } - static projectVector(a, b, result) { - const scalar = Vector3.dot(a, b) / Vector3.dot(b, b); - return Vector3.multiplyByScalar(b, scalar, result); - } - static equals(left, right) { - return ( - left === right || - (defined(left) && defined(right) && left.x === right.x && left.y === right.y && left.z === right.z) - ); - } - /** - * @private - */ - static equalsArray(cartesian, array, offset) { - return cartesian.x === array[offset] && cartesian.y === array[offset + 1] && cartesian.z === array[offset + 2]; - } - static equalsEpsilon(left, right, relativeEpsilon = 0, absoluteEpsilon = 0) { - return ( - left === right || - (defined(left) && - defined(right) && - GMath.equalsEpsilon(left.x, right.x, relativeEpsilon, absoluteEpsilon) && - GMath.equalsEpsilon(left.y, right.y, relativeEpsilon, absoluteEpsilon) && - GMath.equalsEpsilon(left.z, right.z, relativeEpsilon, absoluteEpsilon)) - ); - } - static cross(left, right, result) { - const leftX = left.x; - const leftY = left.y; - const leftZ = left.z; - const rightX = right.x; - const rightY = right.y; - const rightZ = right.z; - const x = leftY * rightZ - leftZ * rightY; - const y = leftZ * rightX - leftX * rightZ; - const z = leftX * rightY - leftY * rightX; - result.x = x; - result.y = y; - result.z = z; - return result; - } -} -Vector3.ZERO = Object.freeze(new Vector3(0.0, 0.0, 0.0)); -Vector3.ONE = Object.freeze(new Vector3(1.0, 1.0, 1.0)); -Vector3.UNIT_X = Object.freeze(new Vector3(1.0, 0.0, 0.0)); -Vector3.UNIT_Y = Object.freeze(new Vector3(0.0, 1.0, 0.0)); -Vector3.UNIT_Z = Object.freeze(new Vector3(0.0, 0.0, 1.0)); -Vector3.midpoint = function (left, right, result) { - result.x = (left.x + right.x) * 0.5; - result.y = (left.y + right.y) * 0.5; - result.z = (left.z + right.z) * 0.5; - return result; -}; -const distanceScratch$1 = new Vector3(); -const lerpScratch$2 = new Vector3(); -const angleBetweenScratch = new Vector3(); -const angleBetweenScratch2 = new Vector3(); -const mostOrthogonalAxisScratch = new Vector3(); - -class Attribute { - constructor(name, value, itemSize) { - this.name = name; - this.value = value; - this.itemSize = itemSize; - this.name = name; - this.offset = 0; - this.shaderLocation = 0; - this.attributeType = AttributeType.attribute; - this.dirty = true; - } - getGPUAttribute() { - return [ - { - shaderLocation: this.shaderLocation, - format: this.format, - offset: this.offset - } - ]; - } - destroy() { - this.value = []; - } - applyMatrix3(matrix3) { - if (this.itemSize === 2) { - for (let i = 0, l = this.value.length / this.itemSize; i < l; i++) { - Attribute.v2.fromBufferAttribute(this, i); - Attribute.v2.applyMatrix3(matrix3); - this.setXY(i, Attribute.v2.x, Attribute.v2.y); - } - } else if (this.itemSize === 3) { - for (let i = 0, l = this.value.length / this.itemSize; i < l; i++) { - Attribute.v3.fromBufferAttribute(this, i); - Attribute.v3.applyMatrix3(matrix3); - this.setXYZ(i, Attribute.v3.x, Attribute.v3.y, Attribute.v3.z); - } - } - return this; - } - applyMatrix4(matrix4) { - for (let i = 0, l = this.value.length / this.itemSize; i < l; i++) { - Attribute.v3.fromBufferAttribute(this, i); - Attribute.v3.applyMatrix4(matrix4); - this.setXYZ(i, Attribute.v3.x, Attribute.v3.y, Attribute.v3.z); - } - return this; - } - setX(index, x) { - this.value[index * this.itemSize] = x; - return this; - } - getX(index) { - const x = this.value[index * this.itemSize]; - return x; - } - setY(index, y) { - this.value[index * this.itemSize + 1] = y; - return this; - } - getY(index) { - const y = this.value[index * this.itemSize + 1]; - return y; - } - setZ(index, z) { - this.value[index * this.itemSize + 2] = z; - return this; - } - getZ(index) { - const z = this.value[index * this.itemSize + 2]; - return z; - } - getW(index) { - const w = this.value[index * this.itemSize + 3]; - return w; - } - setXY(index, x, y) { - index *= this.itemSize; - this.value[index + 0] = x; - this.value[index + 1] = y; - return this; - } - setXYZ(index, x, y, z) { - index *= this.itemSize; - this.value[index + 0] = x; - this.value[index + 1] = y; - this.value[index + 2] = z; - return this; - } - setXYZW(index, x, y, z, w) { - index *= this.itemSize; - this.value[index + 0] = x; - this.value[index + 1] = y; - this.value[index + 2] = z; - this.value[index + 3] = w; - return this; - } -} -Attribute.v3 = new Vector3(); -Attribute.v2 = new Vector2(); -class InterleavedAttribute { - constructor(names, value, itemSizes) { - this.names = names; - this.itemSizes = itemSizes; - this.value = value; - this.attributeType = AttributeType.interleavedAttribute; - this.dirty = true; - } - getGPUAttribute() { - const result = []; - this.itemSizes.reduce((total, current, index) => { - result.push({ - shaderLocation: index, - format: current == 1 ? `${this.format}` : `${this.format}x${current}`, - offset: total * this.byteSize - }); - return (total += current); - }, 0); - return result; - } - destroy() { - this.value = null; - this.names = null; - this.itemSizes = null; - } -} -class Float32Attribute extends Attribute { - constructor(name, value, itemSize) { - super(name, value, itemSize); - const { format, totalByteSize } = getAttributeFormat(VertexFormat.Float32, itemSize); - this.format = format; - this.attributeByteSize = totalByteSize; - } -} -class InterleavedFloat32Attribute extends InterleavedAttribute { - constructor(names, value, itemSizes) { - super(names, value, itemSizes); - this.format = VertexFormat.Float32; - this.byteSize = Float32Array.BYTES_PER_ELEMENT; - } -} -class BufferFloat32Attribute extends InterleavedFloat32Attribute { - constructor(names, buffer, itemSizes) { - super(names, undefined, itemSizes); - this.buffer = buffer; - } -} -var AttributeType; -(function (AttributeType) { - AttributeType[(AttributeType["interleavedAttribute"] = 0)] = "interleavedAttribute"; - AttributeType[(AttributeType["attribute"] = 1)] = "attribute"; -})(AttributeType || (AttributeType = {})); -function getAttributeFormat(type, itemSize) { - const key = `${type}x${itemSize}`; - return { - [VertexFormat.Float32]: { - format: "float32", - totalByteSize: Float32Array.BYTES_PER_ELEMENT * itemSize, - byteSize: Float32Array.BYTES_PER_ELEMENT - }, - [VertexFormat.Float32x2]: { - format: "float32x2", - totalByteSize: Float32Array.BYTES_PER_ELEMENT * itemSize, - byteSize: Float32Array.BYTES_PER_ELEMENT - }, - [VertexFormat.Float32x3]: { - format: "float32x3", - totalByteSize: Float32Array.BYTES_PER_ELEMENT * itemSize, - byteSize: Float32Array.BYTES_PER_ELEMENT - }, - [VertexFormat.Float32x4]: { - format: "float32x4", - totalByteSize: Float32Array.BYTES_PER_ELEMENT * itemSize, - byteSize: Float32Array.BYTES_PER_ELEMENT - } - }[key]; -} - -const bindGroupCache = new Map(); -class BindGroup { - constructor(options) { - this.index = options.index || 0; - this.offset = options.offset ?? 0; - this.alignedSize = options.alignedSize ?? 0; - this.maxOffset = options.maxOffset ?? 0; - this.dynamic = options.dynamic ?? false; - this.gpuBindGroup = options.device.createBindGroup({ - label: options.label, - layout: options.layout.gpuBindGroupLayout, - entries: options.entires.map((entity) => ({ - binding: entity.binding, - resource: entity.resource - })) - }); - } - bind(passEncoder) { - // dynamic uniforms must bind multiple times - if (this.dynamic) { - const dynamicOffsets = [0]; - dynamicOffsets[0] = this.offset * this.alignedSize; - this.offset = ++this.offset < this.maxOffset ? this.offset : 0; - passEncoder.setBindGroup(this.index, this.gpuBindGroup, dynamicOffsets); - } else { - passEncoder.setBindGroup(this.index, this.gpuBindGroup); - } - } - destroy() { - this.gpuBindGroup = undefined; - this.device = undefined; - } - static getBindGroupFromCache(options) { - if (bindGroupCache.has(options.label)) { - return bindGroupCache.get(options.label); - } else { - const bindGroup = new BindGroup(options); - bindGroupCache.set(options.label, bindGroup); - return bindGroup; - } - } - static removeBindGroupFromCache(bindGroup) { - bindGroupCache.delete(bindGroup); - } -} - -class BindGroupEntity { - constructor(options) { - this.binding = options.binding; - this.resource = options.resource; - } - getGPUGroupEntity() { - return { - binding: this.binding, - resource: this.resource - }; - } -} - -class RenderTarget { - constructor(type, colorAttachments, depthAttachment, stencilAttachment, querySet, fixedSize) { - this.type = type; - this.colorAttachments = colorAttachments; - this.depthAttachment = depthAttachment; - this.stencilAttachment = stencilAttachment; - this.querySet = querySet; - this.fixedSize = fixedSize; - this.renderEncoder = undefined; - this.computeEncoder = undefined; - this._renderPassDescriptor = undefined; - this.commandEncoder = undefined; - this.device = undefined; - this.fixedSize = false; - } - get renderPassDescriptor() { - this._renderPassDescriptor = this.getRenderPassDescriptor(); - return this._renderPassDescriptor; - } - getColorTexture(index = 0) { - const colAtt = this.colorAttachments[index]; - if (colAtt) { - return colAtt.texture; - } else { - return null; - } - } - getDepthTexture() { - if (this.depthAttachment) { - return this.depthAttachment.texture; - } - } - getRenderPassDescriptor() { - this.depthAttachment?.texture?.update(this.device); - this?.querySet?.update(this.device); - return { - ...(this.colorAttachments && { - colorAttachments: this.colorAttachments.map((colorAttachment) => { - colorAttachment?.texture?.update && colorAttachment?.texture?.update(this.device); - return { - view: - // 暂时这么写 - colorAttachment?.textureView?.() ?? colorAttachment.texture.textureView, - resolveTarget: - colorAttachment.resolveTarget != undefined - ? colorAttachment.resolveTarget.textureView - : undefined, - clearValue: colorAttachment.value, - loadOp: colorAttachment.op, - storeOp: colorAttachment.storeOp - }; - }) - }), - ...((this.depthAttachment || this.stencilAttachment) && { - depthStencilAttachment: { - view: this.depthAttachment?.texture?.textureView || undefined, - depthLoadOp: this.depthAttachment?.op || "clear", - depthClearValue: this.depthAttachment?.value || 1.0, - depthStoreOp: this.depthAttachment?.storeOp || "store", - depthReadOnly: this.depthAttachment?.readOnly || false - // stencilLoadOp: this.stencilAttachment?.op || "clear", - // stencilClearValue: this.stencilAttachment?.value || 0, - // stencilStoreOp: this.stencilAttachment?.storeOp || "store", - } - }), - ...(this.querySet && { occlusionQuerySet: this.querySet.gpuQuerySet }) - }; - } - beginRenderPass(device) { - if (!this.device) this.device = device; - this.commandEncoder = this.device.createCommandEncoder(); - this.renderEncoder = this.commandEncoder.beginRenderPass(this.renderPassDescriptor); - return this.renderEncoder; - } - endRenderPass() { - this.renderEncoder?.end(); - this.device.queue.submit([this.commandEncoder.finish()]); - this.commandEncoder = null; - this.renderEncoder = null; - } - beginComputePassEncoder(device) { - if (!this.device) this.device = device; - this.commandEncoder = this.device.createCommandEncoder(); - this.computeEncoder = this.commandEncoder.beginComputePass(); - return this.computeEncoder; - } - endComputePassEncoder() { - this.computeEncoder?.end(); - this.device.queue.submit([this.commandEncoder.finish()]); - this.commandEncoder = null; - this.renderEncoder = null; - } - setSize(width, height, depth = 1) { - if (this.fixedSize) return; - this?.depthAttachment?.texture?.setSize?.(width, height, depth); - this?.colorAttachments?.forEach?.((colorAttachment) => - colorAttachment?.texture?.setSize?.(width, height, depth) - ); - } - destroy() { - if (this.colorAttachments) { - this.colorAttachments.forEach((colorAttachment) => { - if (colorAttachment.texture) { - colorAttachment.texture.destroy(); - } - }); - } - if (this.depthAttachment.texture) this.depthAttachment.texture.destroy(); - } -} - -/** - * A 3x3 matrix, indexable as a column-major order array. - * @param {Number} [column0Row0=0.0] The value for column 0, row 0. - * @param {Number} [column1Row0=0.0] The value for column 1, row 0. - * @param {Number} [column2Row0=0.0] The value for column 2, row 0. - * @param {Number} [column0Row1=0.0] The value for column 0, row 1. - * @param {Number} [column1Row1=0.0] The value for column 1, row 1. - * @param {Number} [column2Row1=0.0] The value for column 2, row 1. - * @param {Number} [column0Row2=0.0] The value for column 0, row 2. - * @param {Number} [column1Row2=0.0] The value for column 1, row 2. - * @param {Number} [column2Row2=0.0] The value for column 2, row 2. - */ -class Matrix3 { - constructor( - column0Row0 = 0, - column1Row0 = 0, - column2Row0 = 0, - column0Row1 = 0, - column1Row1 = 0, - column2Row1 = 0, - column0Row2 = 0, - column1Row2 = 0, - column2Row2 = 0 - ) { - this[0] = column0Row0; - this[1] = column0Row1; - this[2] = column0Row2; - this[3] = column1Row0; - this[4] = column1Row1; - this[5] = column1Row2; - this[6] = column2Row0; - this[7] = column2Row1; - this[8] = column2Row2; - } - setFromMatrix4(matrix) { - this[0] = matrix[0]; - this[1] = matrix[1]; - this[2] = matrix[2]; - this[3] = matrix[4]; - this[4] = matrix[5]; - this[5] = matrix[2]; - this[6] = matrix[8]; - this[7] = matrix[9]; - this[8] = matrix[10]; - return this; - } - getNormalMatrix(matrix4) { - this.setFromMatrix4(matrix4); - Matrix3.inverse(this, this); - Matrix3.transpose(this, this); - return this; - } - static clone(matrix, result) { - if (!defined(matrix)) { - return undefined; - } - if (!defined(result)) { - return new Matrix3( - matrix[0], - matrix[3], - matrix[6], - matrix[1], - matrix[4], - matrix[7], - matrix[2], - matrix[5], - matrix[8] - ); - } - result[0] = matrix[0]; - result[1] = matrix[1]; - result[2] = matrix[2]; - result[3] = matrix[3]; - result[4] = matrix[4]; - result[5] = matrix[5]; - result[6] = matrix[6]; - result[7] = matrix[7]; - result[8] = matrix[8]; - return result; - } - static fromColumnMajorArray(values, result) { - if (!defined(result)) { - result = new Matrix3(); - } - return Matrix3.clone(values, result); - } - static fromRowMajorArray(values, result) { - if (!defined(result)) { - return new Matrix3( - values[0], - values[1], - values[2], - values[3], - values[4], - values[5], - values[6], - values[7], - values[8] - ); - } - result[0] = values[0]; - result[1] = values[3]; - result[2] = values[6]; - result[3] = values[1]; - result[4] = values[4]; - result[5] = values[7]; - result[6] = values[2]; - result[7] = values[5]; - result[8] = values[8]; - return result; - } - static fromQuaternion(quaternion, result) { - const x2 = quaternion.x * quaternion.x; - const xy = quaternion.x * quaternion.y; - const xz = quaternion.x * quaternion.z; - const xw = quaternion.x * quaternion.w; - const y2 = quaternion.y * quaternion.y; - const yz = quaternion.y * quaternion.z; - const yw = quaternion.y * quaternion.w; - const z2 = quaternion.z * quaternion.z; - const zw = quaternion.z * quaternion.w; - const w2 = quaternion.w * quaternion.w; - const m00 = x2 - y2 - z2 + w2; - const m01 = 2.0 * (xy - zw); - const m02 = 2.0 * (xz + yw); - const m10 = 2.0 * (xy + zw); - const m11 = -x2 + y2 - z2 + w2; - const m12 = 2.0 * (yz - xw); - const m20 = 2.0 * (xz - yw); - const m21 = 2.0 * (yz + xw); - const m22 = -x2 - y2 + z2 + w2; - if (!defined(result)) { - return new Matrix3(m00, m01, m02, m10, m11, m12, m20, m21, m22); - } - result[0] = m00; - result[1] = m10; - result[2] = m20; - result[3] = m01; - result[4] = m11; - result[5] = m21; - result[6] = m02; - result[7] = m12; - result[8] = m22; - return result; - } - static fromScale(scale, result) { - if (!defined(result)) { - return new Matrix3(scale.x, 0.0, 0.0, 0.0, scale.y, 0.0, 0.0, 0.0, scale.z); - } - result[0] = scale.x; - result[1] = 0.0; - result[2] = 0.0; - result[3] = 0.0; - result[4] = scale.y; - result[5] = 0.0; - result[6] = 0.0; - result[7] = 0.0; - result[8] = scale.z; - return result; - } - static fromRotationX(angle, result) { - const cosAngle = Math.cos(angle); - const sinAngle = Math.sin(angle); - if (!defined(result)) { - return new Matrix3(1.0, 0.0, 0.0, 0.0, cosAngle, -sinAngle, 0.0, sinAngle, cosAngle); - } - result[0] = 1.0; - result[1] = 0.0; - result[2] = 0.0; - result[3] = 0.0; - result[4] = cosAngle; - result[5] = sinAngle; - result[6] = 0.0; - result[7] = -sinAngle; - result[8] = cosAngle; - return result; - } - static fromRotationY(angle, result) { - const cosAngle = Math.cos(angle); - const sinAngle = Math.sin(angle); - if (!defined(result)) { - return new Matrix3(cosAngle, 0.0, sinAngle, 0.0, 1.0, 0.0, -sinAngle, 0.0, cosAngle); - } - result[0] = cosAngle; - result[1] = 0.0; - result[2] = -sinAngle; - result[3] = 0.0; - result[4] = 1.0; - result[5] = 0.0; - result[6] = sinAngle; - result[7] = 0.0; - result[8] = cosAngle; - return result; - } - static fromRotationZstatic(angle, result) { - const cosAngle = Math.cos(angle); - const sinAngle = Math.sin(angle); - if (!defined(result)) { - return new Matrix3(cosAngle, -sinAngle, 0.0, sinAngle, cosAngle, 0.0, 0.0, 0.0, 1.0); - } - result[0] = cosAngle; - result[1] = sinAngle; - result[2] = 0.0; - result[3] = -sinAngle; - result[4] = cosAngle; - result[5] = 0.0; - result[6] = 0.0; - result[7] = 0.0; - result[8] = 1.0; - return result; - } - toArray() { - const result = []; - Matrix3.toArray(this, result); - return result; - } - static toArray(matrix, result) { - if (!defined(result)) { - return [matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5], matrix[6], matrix[7], matrix[8]]; - } - result[0] = matrix[0]; - result[1] = matrix[1]; - result[2] = matrix[2]; - result[3] = matrix[3]; - result[4] = matrix[4]; - result[5] = matrix[5]; - result[6] = matrix[6]; - result[7] = matrix[7]; - result[8] = matrix[8]; - return result; - } - static getElementIndex(column, row) { - return column * 3 + row; - } - static getColumn(matrix, index, result) { - const startIndex = index * 3; - const x = matrix[startIndex]; - const y = matrix[startIndex + 1]; - const z = matrix[startIndex + 2]; - result.x = x; - result.y = y; - result.z = z; - return result; - } - static setColumn(matrix, index, cartesian, result) { - result = Matrix3.clone(matrix, result); - const startIndex = index * 3; - result[startIndex] = cartesian.x; - result[startIndex + 1] = cartesian.y; - result[startIndex + 2] = cartesian.z; - return result; - } - static getRow(matrix, index, result) { - const x = matrix[index]; - const y = matrix[index + 3]; - const z = matrix[index + 6]; - result.x = x; - result.y = y; - result.z = z; - return result; - } - static setRow(matrix, index, cartesian, result) { - result = Matrix3.clone(matrix, result); - result[index] = cartesian.x; - result[index + 3] = cartesian.y; - result[index + 6] = cartesian.z; - return result; - } - static setScale(matrix, scale, result) { - const existingScale = Matrix3.getScale(matrix, scaleScratch1$2); - const scaleRatioX = scale.x / existingScale.x; - const scaleRatioY = scale.y / existingScale.y; - const scaleRatioZ = scale.z / existingScale.z; - result[0] = matrix[0] * scaleRatioX; - result[1] = matrix[1] * scaleRatioX; - result[2] = matrix[2] * scaleRatioX; - result[3] = matrix[3] * scaleRatioY; - result[4] = matrix[4] * scaleRatioY; - result[5] = matrix[5] * scaleRatioY; - result[6] = matrix[6] * scaleRatioZ; - result[7] = matrix[7] * scaleRatioZ; - result[8] = matrix[8] * scaleRatioZ; - return result; - } - static getScale(matrix, result) { - result.x = Vector3.magnitude(Vector3.fromElements(matrix[0], matrix[1], matrix[2], scratchColumn$2)); - result.y = Vector3.magnitude(Vector3.fromElements(matrix[3], matrix[4], matrix[5], scratchColumn$2)); - result.z = Vector3.magnitude(Vector3.fromElements(matrix[6], matrix[7], matrix[8], scratchColumn$2)); - return result; - } - static getMaximumScale(matrix) { - Matrix3.getScale(matrix, scaleScratch3$2); - return Vector3.maximumComponent(scaleScratch3$2); - } - static setRotation(matrix, rotation, result) { - const scale = Matrix3.getScale(matrix, scaleScratch4$2); - result[0] = rotation[0] * scale.x; - result[1] = rotation[1] * scale.x; - result[2] = rotation[2] * scale.x; - result[3] = rotation[3] * scale.y; - result[4] = rotation[4] * scale.y; - result[5] = rotation[5] * scale.y; - result[6] = rotation[6] * scale.z; - result[7] = rotation[7] * scale.z; - result[8] = rotation[8] * scale.z; - return result; - } - static getRotation(matrix, result) { - const scale = Matrix3.getScale(matrix, scaleScratch5$2); - result[0] = matrix[0] / scale.x; - result[1] = matrix[1] / scale.x; - result[2] = matrix[2] / scale.x; - result[3] = matrix[3] / scale.y; - result[4] = matrix[4] / scale.y; - result[5] = matrix[5] / scale.y; - result[6] = matrix[6] / scale.z; - result[7] = matrix[7] / scale.z; - result[8] = matrix[8] / scale.z; - return result; - } - static multiply(left, right, result) { - const column0Row0 = left[0] * right[0] + left[3] * right[1] + left[6] * right[2]; - const column0Row1 = left[1] * right[0] + left[4] * right[1] + left[7] * right[2]; - const column0Row2 = left[2] * right[0] + left[5] * right[1] + left[8] * right[2]; - const column1Row0 = left[0] * right[3] + left[3] * right[4] + left[6] * right[5]; - const column1Row1 = left[1] * right[3] + left[4] * right[4] + left[7] * right[5]; - const column1Row2 = left[2] * right[3] + left[5] * right[4] + left[8] * right[5]; - const column2Row0 = left[0] * right[6] + left[3] * right[7] + left[6] * right[8]; - const column2Row1 = left[1] * right[6] + left[4] * right[7] + left[7] * right[8]; - const column2Row2 = left[2] * right[6] + left[5] * right[7] + left[8] * right[8]; - result[0] = column0Row0; - result[1] = column0Row1; - result[2] = column0Row2; - result[3] = column1Row0; - result[4] = column1Row1; - result[5] = column1Row2; - result[6] = column2Row0; - result[7] = column2Row1; - result[8] = column2Row2; - return result; - } - static add(left, right, result) { - result[0] = left[0] + right[0]; - result[1] = left[1] + right[1]; - result[2] = left[2] + right[2]; - result[3] = left[3] + right[3]; - result[4] = left[4] + right[4]; - result[5] = left[5] + right[5]; - result[6] = left[6] + right[6]; - result[7] = left[7] + right[7]; - result[8] = left[8] + right[8]; - return result; - } - static subtract(left, right, result) { - result[0] = left[0] - right[0]; - result[1] = left[1] - right[1]; - result[2] = left[2] - right[2]; - result[3] = left[3] - right[3]; - result[4] = left[4] - right[4]; - result[5] = left[5] - right[5]; - result[6] = left[6] - right[6]; - result[7] = left[7] - right[7]; - result[8] = left[8] - right[8]; - return result; - } - static multiplyByVector(matrix, cartesian, result) { - const vX = cartesian.x; - const vY = cartesian.y; - const vZ = cartesian.z; - const x = matrix[0] * vX + matrix[3] * vY + matrix[6] * vZ; - const y = matrix[1] * vX + matrix[4] * vY + matrix[7] * vZ; - const z = matrix[2] * vX + matrix[5] * vY + matrix[8] * vZ; - result.x = x; - result.y = y; - result.z = z; - return result; - } - static multiplyByScalar(matrix, scalar, result) { - result[0] = matrix[0] * scalar; - result[1] = matrix[1] * scalar; - result[2] = matrix[2] * scalar; - result[3] = matrix[3] * scalar; - result[4] = matrix[4] * scalar; - result[5] = matrix[5] * scalar; - result[6] = matrix[6] * scalar; - result[7] = matrix[7] * scalar; - result[8] = matrix[8] * scalar; - return result; - } - static multiplyByScale(matrix, scale, result) { - result[0] = matrix[0] * scale.x; - result[1] = matrix[1] * scale.x; - result[2] = matrix[2] * scale.x; - result[3] = matrix[3] * scale.y; - result[4] = matrix[4] * scale.y; - result[5] = matrix[5] * scale.y; - result[6] = matrix[6] * scale.z; - result[7] = matrix[7] * scale.z; - result[8] = matrix[8] * scale.z; - return result; - } - static negate(matrix, result) { - result[0] = -matrix[0]; - result[1] = -matrix[1]; - result[2] = -matrix[2]; - result[3] = -matrix[3]; - result[4] = -matrix[4]; - result[5] = -matrix[5]; - result[6] = -matrix[6]; - result[7] = -matrix[7]; - result[8] = -matrix[8]; - return result; - } - static transpose(matrix, result) { - const column0Row0 = matrix[0]; - const column0Row1 = matrix[3]; - const column0Row2 = matrix[6]; - const column1Row0 = matrix[1]; - const column1Row1 = matrix[4]; - const column1Row2 = matrix[7]; - const column2Row0 = matrix[2]; - const column2Row1 = matrix[5]; - const column2Row2 = matrix[8]; - result[0] = column0Row0; - result[1] = column0Row1; - result[2] = column0Row2; - result[3] = column1Row0; - result[4] = column1Row1; - result[5] = column1Row2; - result[6] = column2Row0; - result[7] = column2Row1; - result[8] = column2Row2; - return result; - } - static abs(matrix, result) { - result[0] = Math.abs(matrix[0]); - result[1] = Math.abs(matrix[1]); - result[2] = Math.abs(matrix[2]); - result[3] = Math.abs(matrix[3]); - result[4] = Math.abs(matrix[4]); - result[5] = Math.abs(matrix[5]); - result[6] = Math.abs(matrix[6]); - result[7] = Math.abs(matrix[7]); - result[8] = Math.abs(matrix[8]); - return result; - } - static determinant(matrix) { - const m11 = matrix[0]; - const m21 = matrix[3]; - const m31 = matrix[6]; - const m12 = matrix[1]; - const m22 = matrix[4]; - const m32 = matrix[7]; - const m13 = matrix[2]; - const m23 = matrix[5]; - const m33 = matrix[8]; - return m11 * (m22 * m33 - m23 * m32) + m12 * (m23 * m31 - m21 * m33) + m13 * (m21 * m32 - m22 * m31); - } - static inverse(matrix, result) { - const m11 = matrix[0]; - const m21 = matrix[1]; - const m31 = matrix[2]; - const m12 = matrix[3]; - const m22 = matrix[4]; - const m32 = matrix[5]; - const m13 = matrix[6]; - const m23 = matrix[7]; - const m33 = matrix[8]; - const determinant = Matrix3.determinant(matrix); - // >>includeStart('debug', pragmas.debug); - if (Math.abs(determinant) <= GMath.EPSILON15) { - throw new Error("matrix is not invertible"); - } - // >>includeEnd('debug'); - result[0] = m22 * m33 - m23 * m32; - result[1] = m23 * m31 - m21 * m33; - result[2] = m21 * m32 - m22 * m31; - result[3] = m13 * m32 - m12 * m33; - result[4] = m11 * m33 - m13 * m31; - result[5] = m12 * m31 - m11 * m32; - result[6] = m12 * m23 - m13 * m22; - result[7] = m13 * m21 - m11 * m23; - result[8] = m11 * m22 - m12 * m21; - const scale = 1.0 / determinant; - return Matrix3.multiplyByScalar(result, scale, result); - } - static inverseTranspose(matrix, result) { - return Matrix3.inverse(Matrix3.transpose(matrix, scratchTransposeMatrix$1), result); - } - static equals(left, right) { - return ( - left === right || - (defined(left) && - defined(right) && - left[0] === right[0] && - left[1] === right[1] && - left[2] === right[2] && - left[3] === right[3] && - left[4] === right[4] && - left[5] === right[5] && - left[6] === right[6] && - left[7] === right[7] && - left[8] === right[8]) - ); - } - static equalsEpsilon(left, right, epsilon = 0) { - epsilon = defaultValue(epsilon, 0); - return ( - left === right || - (defined(left) && - defined(right) && - Math.abs(left[0] - right[0]) <= epsilon && - Math.abs(left[1] - right[1]) <= epsilon && - Math.abs(left[2] - right[2]) <= epsilon && - Math.abs(left[3] - right[3]) <= epsilon && - Math.abs(left[4] - right[4]) <= epsilon && - Math.abs(left[5] - right[5]) <= epsilon && - Math.abs(left[6] - right[6]) <= epsilon && - Math.abs(left[7] - right[7]) <= epsilon && - Math.abs(left[8] - right[8]) <= epsilon) - ); - } - clone(result) { - return Matrix3.clone(this, result); - } - equals(right) { - return Matrix3.equals(this, right); - } - /** - * @private - */ - equalsArray(matrix, array, offset) { - return ( - matrix[0] === array[offset] && - matrix[1] === array[offset + 1] && - matrix[2] === array[offset + 2] && - matrix[3] === array[offset + 3] && - matrix[4] === array[offset + 4] && - matrix[5] === array[offset + 5] && - matrix[6] === array[offset + 6] && - matrix[7] === array[offset + 7] && - matrix[8] === array[offset + 8] - ); - } - /** - * Compares this matrix to the provided matrix componentwise and returns - * true if they are within the provided epsilon, - * false otherwise. - * - * @param {Matrix3} [right] The right hand side matrix. - * @param {Number} [epsilon=0] The epsilon to use for equality testing. - * @returns {Boolean} true if they are within the provided epsilon, false otherwise. - */ - equalsEpsilon(right, epsilon) { - return Matrix3.equalsEpsilon(this, right, epsilon); - } - toString() { - return ( - `(${this[0]}, ${this[3]}, ${this[6]})\n` + - `(${this[1]}, ${this[4]}, ${this[7]})\n` + - `(${this[2]}, ${this[5]}, ${this[8]})` - ); - } -} -Matrix3.IDENTITY = Object.freeze(new Matrix3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0)); -Matrix3.ZERO = Object.freeze(new Matrix3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); -const scaleScratch1$2 = new Vector3(); -new Vector3(); -const scratchColumn$2 = new Vector3(); -const scaleScratch3$2 = new Vector3(); -const scaleScratch4$2 = new Vector3(); -const scaleScratch5$2 = new Vector3(); -const scratchTransposeMatrix$1 = new Matrix3(); - -class Vector4 { - constructor(x = 0, y = 0, z = 0, w = 0) { - this.x = x; - this.y = y; - this.z = z; - this.w = w; - } - set(x, y, z, w) { - this.x = x; - this.y = y; - this.z = z; - this.w = w; - } - toArray() { - return [this.x, this.y, this.z, this.w]; - } - clone(result) { - return Vector4.clone(this, result); - } - equals(right) { - return Vector4.equals(this, right); - } - equalsEpsilon(right, relativeEpsilon = 0, absoluteEpsilon = 0) { - return Vector4.equalsEpsilon(this, right, relativeEpsilon, absoluteEpsilon); - } - toString() { - return `(${this.x}, ${this.y}, ${this.z}, ${this.w})`; - } - fromBufferAttribute(attribute, index) { - this.x = attribute.getX(index); - this.y = attribute.getY(index); - this.z = attribute.getZ(index); - this.w = attribute.getW(index); - return this; - } - static fromElements(x, y, z, w, result) { - if (!defined(result)) { - return new Vector4(x, y, z, w); - } - result.x = x; - result.y = y; - result.z = z; - result.w = w; - return result; - } - static clone(cartesian, result) { - if (!defined(cartesian)) { - return undefined; - } - if (!defined(result)) { - return new Vector4(cartesian.x, cartesian.y, cartesian.z, cartesian.w); - } - result.x = cartesian.x; - result.y = cartesian.y; - result.z = cartesian.z; - result.w = cartesian.w; - return result; - } - static maximumComponent(cartesian) { - return Math.max(cartesian.x, cartesian.y, cartesian.z, cartesian.w); - } - static minimumComponent(cartesian) { - return Math.min(cartesian.x, cartesian.y, cartesian.z, cartesian.w); - } - static minimumByComponent(first, second, result) { - result.x = Math.min(first.x, second.x); - result.y = Math.min(first.y, second.y); - result.z = Math.min(first.z, second.z); - result.w = Math.min(first.w, second.w); - return result; - } - static maximumByComponent(first, second, result) { - result.x = Math.max(first.x, second.x); - result.y = Math.max(first.y, second.y); - result.z = Math.max(first.z, second.z); - result.w = Math.max(first.w, second.w); - return result; - } - static clamp(value, min, max, result) { - const x = GMath.clamp(value.x, min.x, max.x); - const y = GMath.clamp(value.y, min.y, max.y); - const z = GMath.clamp(value.z, min.z, max.z); - const w = GMath.clamp(value.w, min.w, max.w); - result.x = x; - result.y = y; - result.z = z; - result.w = w; - return result; - } - static magnitudeSquared(cartesian) { - return ( - cartesian.x * cartesian.x + - cartesian.y * cartesian.y + - cartesian.z * cartesian.z + - cartesian.w * cartesian.w - ); - } - static magnitude(cartesian) { - return Math.sqrt(Vector4.magnitudeSquared(cartesian)); - } - static distance(left, right) { - Vector4.subtract(left, right, distanceScratch); - return Vector4.magnitude(distanceScratch); - } - static distanceSquared(left, right) { - Vector4.subtract(left, right, distanceScratch); - return Vector4.magnitudeSquared(distanceScratch); - } - static normalize(cartesian, result) { - const magnitude = Vector4.magnitude(cartesian); - result.x = cartesian.x / magnitude; - result.y = cartesian.y / magnitude; - result.z = cartesian.z / magnitude; - result.w = cartesian.w / magnitude; - // >>includeStart('debug', pragmas.debug); - if (isNaN(result.x) || isNaN(result.y) || isNaN(result.z) || isNaN(result.w)) { - throw new Error("normalized result is not a number"); - } - // >>includeEnd('debug'); - return result; - } - static dot(left, right) { - return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; - } - static multiplyComponents(left, right, result) { - result.x = left.x * right.x; - result.y = left.y * right.y; - result.z = left.z * right.z; - result.w = left.w * right.w; - return result; - } - static divideComponents(left, right, result) { - result.x = left.x / right.x; - result.y = left.y / right.y; - result.z = left.z / right.z; - result.w = left.w / right.w; - return result; - } - static add(left, right, result) { - result.x = left.x + right.x; - result.y = left.y + right.y; - result.z = left.z + right.z; - result.w = left.w + right.w; - return result; - } - static subtract(left, right, result) { - result.x = left.x - right.x; - result.y = left.y - right.y; - result.z = left.z - right.z; - result.w = left.w - right.w; - return result; - } - static multiplyByScalar(cartesian, scalar, result) { - result.x = cartesian.x * scalar; - result.y = cartesian.y * scalar; - result.z = cartesian.z * scalar; - result.w = cartesian.w * scalar; - return result; - } - static divideByScalar(cartesian, scalar, result) { - result.x = cartesian.x / scalar; - result.y = cartesian.y / scalar; - result.z = cartesian.z / scalar; - result.w = cartesian.w / scalar; - return result; - } - static negate(cartesian, result) { - result.x = -cartesian.x; - result.y = -cartesian.y; - result.z = -cartesian.z; - result.w = -cartesian.w; - return result; - } - static abs(cartesian, result) { - result.x = Math.abs(cartesian.x); - result.y = Math.abs(cartesian.y); - result.z = Math.abs(cartesian.z); - result.w = Math.abs(cartesian.w); - return result; - } - static lerp(start, end, t, result) { - Vector4.multiplyByScalar(end, t, lerpScratch$1); - result = Vector4.multiplyByScalar(start, 1.0 - t, result); - return Vector4.add(lerpScratch$1, result, result); - } - static equals(left, right) { - return ( - left === right || - (defined(left) && - defined(right) && - left.x === right.x && - left.y === right.y && - left.z === right.z && - left.w === right.w) - ); - } - static equalsArray(cartesian, array, offset) { - return ( - cartesian.x === array[offset] && - cartesian.y === array[offset + 1] && - cartesian.z === array[offset + 2] && - cartesian.w === array[offset + 3] - ); - } - static equalsEpsilon(left, right, relativeEpsilon = 0, absoluteEpsilon = 0) { - return ( - left === right || - (defined(left) && - defined(right) && - GMath.equalsEpsilon(left.x, right.x, relativeEpsilon, absoluteEpsilon) && - GMath.equalsEpsilon(left.y, right.y, relativeEpsilon, absoluteEpsilon) && - GMath.equalsEpsilon(left.z, right.z, relativeEpsilon, absoluteEpsilon) && - GMath.equalsEpsilon(left.w, right.w, relativeEpsilon, absoluteEpsilon)) - ); - } -} -Vector4.ZERO = Object.freeze(new Vector4(0.0, 0.0, 0.0, 0.0)); -Vector4.ONE = Object.freeze(new Vector4(1.0, 1.0, 1.0, 1.0)); -Vector4.UNIT_X = Object.freeze(new Vector4(1.0, 0.0, 0.0, 0.0)); -Vector4.UNIT_Y = Object.freeze(new Vector4(0.0, 1.0, 0.0, 0.0)); -Vector4.UNIT_Z = Object.freeze(new Vector4(0.0, 0.0, 1.0, 0.0)); -Vector4.UNIT_W = Object.freeze(new Vector4(0.0, 0.0, 0.0, 1.0)); -// scratchU8Array and scratchF32Array are views into the same buffer -const scratchF32Array = new Float32Array(1); -new Uint8Array(scratchF32Array.buffer); -const testU32 = new Uint32Array([0x11223344]); -const testU8 = new Uint8Array(testU32.buffer); -testU8[0] === 0x44; -const distanceScratch = new Vector4(); -const lerpScratch$1 = new Vector4(); -new Vector4(); - -class Matrix4 { - /** - * A 4x4 matrix, indexable as a column-major order array. - * @param {Number} [column0Row0=0.0] The value for column 0, row 0. - * @param {Number} [column1Row0=0.0] The value for column 1, row 0. - * @param {Number} [column2Row0=0.0] The value for column 2, row 0. - * @param {Number} [column3Row0=0.0] The value for column 3, row 0. - * @param {Number} [column0Row1=0.0] The value for column 0, row 1. - * @param {Number} [column1Row1=0.0] The value for column 1, row 1. - * @param {Number} [column2Row1=0.0] The value for column 2, row 1. - * @param {Number} [column3Row1=0.0] The value for column 3, row 1. - * @param {Number} [column0Row2=0.0] The value for column 0, row 2. - * @param {Number} [column1Row2=0.0] The value for column 1, row 2. - * @param {Number} [column2Row2=0.0] The value for column 2, row 2. - * @param {Number} [column3Row2=0.0] The value for column 3, row 2. - * @param {Number} [column0Row3=0.0] The value for column 0, row 3. - * @param {Number} [column1Row3=0.0] The value for column 1, row 3. - * @param {Number} [column2Row3=0.0] The value for column 2, row 3. - * @param {Number} [column3Row3=0.0] The value for column 3, row 3. - */ - constructor( - column0Row0 = 0, - column1Row0 = 0, - column2Row0 = 0, - column3Row0 = 0, - column0Row1 = 0, - column1Row1 = 0, - column2Row1 = 0, - column3Row1 = 0, - column0Row2 = 0, - column1Row2 = 0, - column2Row2 = 0, - column3Row2 = 0, - column0Row3 = 0, - column1Row3 = 0, - column2Row3 = 0, - column3Row3 = 0 - ) { - this[0] = column0Row0; - this[1] = column0Row1; - this[2] = column0Row2; - this[3] = column0Row3; - this[4] = column1Row0; - this[5] = column1Row1; - this[6] = column1Row2; - this[7] = column1Row3; - this[8] = column2Row0; - this[9] = column2Row1; - this[10] = column2Row2; - this[11] = column2Row3; - this[12] = column3Row0; - this[13] = column3Row1; - this[14] = column3Row2; - this[15] = column3Row3; - } - // ???? - clone(result = new Matrix4()) { - return Matrix4.clone(this, result); - } - set(mat4) { - Matrix4.clone(mat4, this); - return this; - } - equals(right) { - return Matrix4.equals(this, right); - } - compose(position, quaternion, scale) { - const te = this; - const x = quaternion.x, - y = quaternion.y, - z = quaternion.z, - w = quaternion.w; - const x2 = x + x, - y2 = y + y, - z2 = z + z; - const xx = x * x2, - xy = x * y2, - xz = x * z2; - const yy = y * y2, - yz = y * z2, - zz = z * z2; - const wx = w * x2, - wy = w * y2, - wz = w * z2; - const sx = scale.x, - sy = scale.y, - sz = scale.z; - te[0] = (1 - (yy + zz)) * sx; - te[1] = (xy + wz) * sx; - te[2] = (xz - wy) * sx; - te[3] = 0; - te[4] = (xy - wz) * sy; - te[5] = (1 - (xx + zz)) * sy; - te[6] = (yz + wx) * sy; - te[7] = 0; - te[8] = (xz + wy) * sz; - te[9] = (yz - wx) * sz; - te[10] = (1 - (xx + yy)) * sz; - te[11] = 0; - te[12] = position.x; - te[13] = position.y; - te[14] = position.z; - te[15] = 1; - return this; - } - equalsEpsilon(right, epsilon = 0) { - return Matrix4.equalsEpsilon(this, right, epsilon); - } - lookAt(eye, target, up) { - const matrix = this; - Vector3.subtract(eye, target, z); - if (z.length() === 0) { - // eye and target are in the same position - z.z = 1; - } - z.normalize(); - Vector3.cross(up, z, x); - if (x.length() === 0) { - // up and z are parallel - if (Math.abs(up.z) === 1) { - z.x += 0.0001; - } else { - z.z += 0.0001; - } - z.normalize(); - Vector3.cross(up, z, x); - } - x.normalize(); - Vector3.cross(z, x, y); - matrix[0] = x.x; - matrix[4] = y.x; - matrix[8] = z.x; - matrix[1] = x.y; - matrix[5] = y.y; - matrix[9] = z.y; - matrix[2] = x.z; - matrix[6] = y.z; - matrix[10] = z.z; - return this; - } - toString() { - return ( - `(${this[0]}, ${this[4]}, ${this[8]}, ${this[12]})\n` + - `(${this[1]}, ${this[5]}, ${this[9]}, ${this[13]})\n` + - `(${this[2]}, ${this[6]}, ${this[10]}, ${this[14]})\n` + - `(${this[3]}, ${this[7]}, ${this[11]}, ${this[15]})` - ); - } - static clone(matrix, result) { - if (!defined(matrix)) { - return undefined; - } - if (!defined(result)) { - return new Matrix4( - matrix[0], - matrix[4], - matrix[8], - matrix[12], - matrix[1], - matrix[5], - matrix[9], - matrix[13], - matrix[2], - matrix[6], - matrix[10], - matrix[14], - matrix[3], - matrix[7], - matrix[11], - matrix[15] - ); - } - result[0] = matrix[0]; - result[1] = matrix[1]; - result[2] = matrix[2]; - result[3] = matrix[3]; - result[4] = matrix[4]; - result[5] = matrix[5]; - result[6] = matrix[6]; - result[7] = matrix[7]; - result[8] = matrix[8]; - result[9] = matrix[9]; - result[10] = matrix[10]; - result[11] = matrix[11]; - result[12] = matrix[12]; - result[13] = matrix[13]; - result[14] = matrix[14]; - result[15] = matrix[15]; - return result; - } - static fromColumnMajorArray(values, result) { - return Matrix4.clone(values, result); - } - static fromRowMajorArray(values, result) { - if (!defined(result)) { - return new Matrix4( - values[0], - values[1], - values[2], - values[3], - values[4], - values[5], - values[6], - values[7], - values[8], - values[9], - values[10], - values[11], - values[12], - values[13], - values[14], - values[15] - ); - } - result[0] = values[0]; - result[1] = values[4]; - result[2] = values[8]; - result[3] = values[12]; - result[4] = values[1]; - result[5] = values[5]; - result[6] = values[9]; - result[7] = values[13]; - result[8] = values[2]; - result[9] = values[6]; - result[10] = values[10]; - result[11] = values[14]; - result[12] = values[3]; - result[13] = values[7]; - result[14] = values[11]; - result[15] = values[15]; - return result; - } - static fromRotationTranslation(rotation, translation, result) { - translation = defaultValue(translation, Vector3.ZERO); - if (!defined(result)) { - return new Matrix4( - rotation[0], - rotation[3], - rotation[6], - translation.x, - rotation[1], - rotation[4], - rotation[7], - translation.y, - rotation[2], - rotation[5], - rotation[8], - translation.z, - 0.0, - 0.0, - 0.0, - 1.0 - ); - } - result[0] = rotation[0]; - result[1] = rotation[1]; - result[2] = rotation[2]; - result[3] = 0.0; - result[4] = rotation[3]; - result[5] = rotation[4]; - result[6] = rotation[5]; - result[7] = 0.0; - result[8] = rotation[6]; - result[9] = rotation[7]; - result[10] = rotation[8]; - result[11] = 0.0; - result[12] = translation.x; - result[13] = translation.y; - result[14] = translation.z; - result[15] = 1.0; - return result; - } - static fromTranslationQuaternionRotationScale(translation, rotation, scale, result) { - if (!defined(result)) { - result = new Matrix4(); - } - const scaleX = scale.x; - const scaleY = scale.y; - const scaleZ = scale.z; - const x2 = rotation.x * rotation.x; - const xy = rotation.x * rotation.y; - const xz = rotation.x * rotation.z; - const xw = rotation.x * rotation.w; - const y2 = rotation.y * rotation.y; - const yz = rotation.y * rotation.z; - const yw = rotation.y * rotation.w; - const z2 = rotation.z * rotation.z; - const zw = rotation.z * rotation.w; - const w2 = rotation.w * rotation.w; - const m00 = x2 - y2 - z2 + w2; - const m01 = 2.0 * (xy - zw); - const m02 = 2.0 * (xz + yw); - const m10 = 2.0 * (xy + zw); - const m11 = -x2 + y2 - z2 + w2; - const m12 = 2.0 * (yz - xw); - const m20 = 2.0 * (xz - yw); - const m21 = 2.0 * (yz + xw); - const m22 = -x2 - y2 + z2 + w2; - result[0] = m00 * scaleX; - result[1] = m10 * scaleX; - result[2] = m20 * scaleX; - result[3] = 0.0; - result[4] = m01 * scaleY; - result[5] = m11 * scaleY; - result[6] = m21 * scaleY; - result[7] = 0.0; - result[8] = m02 * scaleZ; - result[9] = m12 * scaleZ; - result[10] = m22 * scaleZ; - result[11] = 0.0; - result[12] = translation.x; - result[13] = translation.y; - result[14] = translation.z; - result[15] = 1.0; - return result; - } - static fromTranslationRotationScale(translationRotationScale, result) { - return Matrix4.fromTranslationQuaternionRotationScale( - translationRotationScale.translation, - translationRotationScale.rotation, - translationRotationScale.scale, - result - ); - } - static fromTranslation(translation, result) { - return Matrix4.fromRotationTranslation(Matrix3.IDENTITY, translation, result); - } - static fromScale(scale, result) { - if (!defined(result)) { - return new Matrix4( - scale.x, - 0.0, - 0.0, - 0.0, - 0.0, - scale.y, - 0.0, - 0.0, - 0.0, - 0.0, - scale.z, - 0.0, - 0.0, - 0.0, - 0.0, - 1.0 - ); - } - result[0] = scale.x; - result[1] = 0.0; - result[2] = 0.0; - result[3] = 0.0; - result[4] = 0.0; - result[5] = scale.y; - result[6] = 0.0; - result[7] = 0.0; - result[8] = 0.0; - result[9] = 0.0; - result[10] = scale.z; - result[11] = 0.0; - result[12] = 0.0; - result[13] = 0.0; - result[14] = 0.0; - result[15] = 1.0; - return result; - } - static fromRotation(rotation, result) { - if (!defined(result)) { - result = new Matrix4(); - } - result[0] = rotation[0]; - result[1] = rotation[1]; - result[2] = rotation[2]; - result[3] = 0.0; - result[4] = rotation[3]; - result[5] = rotation[4]; - result[6] = rotation[5]; - result[7] = 0.0; - result[8] = rotation[6]; - result[9] = rotation[7]; - result[10] = rotation[8]; - result[11] = 0.0; - result[12] = 0.0; - result[13] = 0.0; - result[14] = 0.0; - result[15] = 1.0; - return result; - } - static makePerspective(left, right, top, bottom, near, far) { - // from three.js - const matrix = new Matrix4(); - const x = (2 * near) / (right - left); - const y = (2 * near) / (top - bottom); - const a = (right + left) / (right - left); - const b = (top + bottom) / (top - bottom); - const c = -far / (far - near); - const d = (-far * near) / (far - near); - matrix[0] = x; - matrix[4] = 0; - matrix[8] = a; - matrix[12] = 0; - matrix[1] = 0; - matrix[5] = y; - matrix[9] = b; - matrix[13] = 0; - matrix[2] = 0; - matrix[6] = 0; - matrix[10] = c; - matrix[14] = d; - matrix[3] = 0; - matrix[7] = 0; - matrix[11] = -1; - matrix[15] = 0; - return matrix; - } - static makeOrthographic(left, right, top, bottom, near, far) { - const matrix = new Matrix4(); - const w = 1.0 / (right - left); - const h = 1.0 / (top - bottom); - const p = 1.0 / (far - near); - const x = (right + left) * w; - const y = (top + bottom) * h; - const z = near * p; - matrix[0] = 2 * w; - matrix[4] = 0; - matrix[8] = 0; - matrix[12] = -x; - matrix[1] = 0; - matrix[5] = 2 * h; - matrix[9] = 0; - matrix[13] = -y; - matrix[2] = 0; - matrix[6] = 0; - matrix[10] = -1 * p; - matrix[14] = -z; - matrix[3] = 0; - matrix[7] = 0; - matrix[11] = 0; - matrix[15] = 1; - return matrix; - } - toArray() { - const result = []; - Matrix4.toArray(this, result); - return result; - } - /** - * Computes an Array from the provided Matrix4 instance. - * The array will be in column-major order. - * @example - * //create an array from an instance of Matrix4 - * // m = [10.0, 14.0, 18.0, 22.0] - * // [11.0, 15.0, 19.0, 23.0] - * // [12.0, 16.0, 20.0, 24.0] - * // [13.0, 17.0, 21.0, 25.0] - * const a = Matrix4.toArray(m); - * - * // m remains the same - * //creates a = [10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0] - */ - static toArray(matrix, result) { - if (!defined(result)) { - return [ - matrix[0], - matrix[1], - matrix[2], - matrix[3], - matrix[4], - matrix[5], - matrix[6], - matrix[7], - matrix[8], - matrix[9], - matrix[10], - matrix[11], - matrix[12], - matrix[13], - matrix[14], - matrix[15] - ]; - } - result[0] = matrix[0]; - result[1] = matrix[1]; - result[2] = matrix[2]; - result[3] = matrix[3]; - result[4] = matrix[4]; - result[5] = matrix[5]; - result[6] = matrix[6]; - result[7] = matrix[7]; - result[8] = matrix[8]; - result[9] = matrix[9]; - result[10] = matrix[10]; - result[11] = matrix[11]; - result[12] = matrix[12]; - result[13] = matrix[13]; - result[14] = matrix[14]; - result[15] = matrix[15]; - return result; - } - static getElementIndex(column, row) { - return column * 4 + row; - } - static getColumn(matrix, index, result) { - const startIndex = index * 4; - const x = matrix[startIndex]; - const y = matrix[startIndex + 1]; - const z = matrix[startIndex + 2]; - const w = matrix[startIndex + 3]; - result.x = x; - result.y = y; - result.z = z; - result.w = w; - return result; - } - static setColumn(matrix, index, cartesian, result) { - result = Matrix4.clone(matrix, result); - const startIndex = index * 4; - result[startIndex] = cartesian.x; - result[startIndex + 1] = cartesian.y; - result[startIndex + 2] = cartesian.z; - result[startIndex + 3] = cartesian.w; - return result; - } - static getRow(matrix, index, result) { - const x = matrix[index]; - const y = matrix[index + 4]; - const z = matrix[index + 8]; - const w = matrix[index + 12]; - result.x = x; - result.y = y; - result.z = z; - result.w = w; - return result; - } - static setRow(matrix, index, cartesian, result) { - result = Matrix4.clone(matrix, result); - result[index] = cartesian.x; - result[index + 4] = cartesian.y; - result[index + 8] = cartesian.z; - result[index + 12] = cartesian.w; - return result; - } - static setTranslation(matrix, translation, result) { - result[0] = matrix[0]; - result[1] = matrix[1]; - result[2] = matrix[2]; - result[3] = matrix[3]; - result[4] = matrix[4]; - result[5] = matrix[5]; - result[6] = matrix[6]; - result[7] = matrix[7]; - result[8] = matrix[8]; - result[9] = matrix[9]; - result[10] = matrix[10]; - result[11] = matrix[11]; - result[12] = translation.x; - result[13] = translation.y; - result[14] = translation.z; - result[15] = matrix[15]; - return result; - } - static setScale(matrix, scale, result) { - const existingScale = Matrix4.getScale(matrix, scaleScratch1$1); - const scaleRatioX = scale.x / existingScale.x; - const scaleRatioY = scale.y / existingScale.y; - const scaleRatioZ = scale.z / existingScale.z; - result[0] = matrix[0] * scaleRatioX; - result[1] = matrix[1] * scaleRatioX; - result[2] = matrix[2] * scaleRatioX; - result[3] = matrix[3]; - result[4] = matrix[4] * scaleRatioY; - result[5] = matrix[5] * scaleRatioY; - result[6] = matrix[6] * scaleRatioY; - result[7] = matrix[7]; - result[8] = matrix[8] * scaleRatioZ; - result[9] = matrix[9] * scaleRatioZ; - result[10] = matrix[10] * scaleRatioZ; - result[11] = matrix[11]; - result[12] = matrix[12]; - result[13] = matrix[13]; - result[14] = matrix[14]; - result[15] = matrix[15]; - return result; - } - static getScale(matrix, result) { - result.x = Vector3.magnitude(Vector3.fromElements(matrix[0], matrix[1], matrix[2], scratchColumn$1)); - result.y = Vector3.magnitude(Vector3.fromElements(matrix[4], matrix[5], matrix[6], scratchColumn$1)); - result.z = Vector3.magnitude(Vector3.fromElements(matrix[8], matrix[9], matrix[10], scratchColumn$1)); - return result; - } - static getMaximumScale(matrix) { - Matrix4.getScale(matrix, scaleScratch3$1); - return Vector3.maximumComponent(scaleScratch3$1); - } - static setRotation(matrix, rotation, result) { - const scale = Matrix4.getScale(matrix, scaleScratch4$1); - result[0] = rotation[0] * scale.x; - result[1] = rotation[1] * scale.x; - result[2] = rotation[2] * scale.x; - result[3] = matrix[3]; - result[4] = rotation[3] * scale.y; - result[5] = rotation[4] * scale.y; - result[6] = rotation[5] * scale.y; - result[7] = matrix[7]; - result[8] = rotation[6] * scale.z; - result[9] = rotation[7] * scale.z; - result[10] = rotation[8] * scale.z; - result[11] = matrix[11]; - result[12] = matrix[12]; - result[13] = matrix[13]; - result[14] = matrix[14]; - result[15] = matrix[15]; - return result; - } - static getRotation(matrix, result) { - const scale = Matrix4.getScale(matrix, scaleScratch5$1); - const is1 = 1 / scale.x; - const is2 = 1 / scale.y; - const is3 = 1 / scale.z; - const sm11 = matrix[0] * is1; - const sm12 = matrix[1] * is2; - const sm13 = matrix[2] * is3; - const sm21 = matrix[4] * is1; - const sm22 = matrix[5] * is2; - const sm23 = matrix[6] * is3; - const sm31 = matrix[8] * is1; - const sm32 = matrix[9] * is2; - const sm33 = matrix[10] * is3; - const trace = sm11 + sm22 + sm33; - let S = 0; - if (trace > 0) { - S = Math.sqrt(trace + 1.0) * 2; - result.w = 0.25 * S; - result.x = (sm23 - sm32) / S; - result.y = (sm31 - sm13) / S; - result.z = (sm12 - sm21) / S; - } else if (sm11 > sm22 && sm11 > sm33) { - S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2; - result.w = (sm23 - sm32) / S; - result.x = 0.25 * S; - result.y = (sm12 + sm21) / S; - result.z = (sm31 + sm13) / S; - } else if (sm22 > sm33) { - S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2; - result.w = (sm31 - sm13) / S; - result.x = (sm12 + sm21) / S; - result.y = 0.25 * S; - result.z = (sm23 + sm32) / S; - } else { - S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2; - result.w = (sm12 - sm21) / S; - result.x = (sm31 + sm13) / S; - result.y = (sm23 + sm32) / S; - result.z = 0.25 * S; - } - return result; - } - static multiply(left, right, result) { - const left0 = left[0]; - const left1 = left[1]; - const left2 = left[2]; - const left3 = left[3]; - const left4 = left[4]; - const left5 = left[5]; - const left6 = left[6]; - const left7 = left[7]; - const left8 = left[8]; - const left9 = left[9]; - const left10 = left[10]; - const left11 = left[11]; - const left12 = left[12]; - const left13 = left[13]; - const left14 = left[14]; - const left15 = left[15]; - const right0 = right[0]; - const right1 = right[1]; - const right2 = right[2]; - const right3 = right[3]; - const right4 = right[4]; - const right5 = right[5]; - const right6 = right[6]; - const right7 = right[7]; - const right8 = right[8]; - const right9 = right[9]; - const right10 = right[10]; - const right11 = right[11]; - const right12 = right[12]; - const right13 = right[13]; - const right14 = right[14]; - const right15 = right[15]; - const column0Row0 = left0 * right0 + left4 * right1 + left8 * right2 + left12 * right3; - const column0Row1 = left1 * right0 + left5 * right1 + left9 * right2 + left13 * right3; - const column0Row2 = left2 * right0 + left6 * right1 + left10 * right2 + left14 * right3; - const column0Row3 = left3 * right0 + left7 * right1 + left11 * right2 + left15 * right3; - const column1Row0 = left0 * right4 + left4 * right5 + left8 * right6 + left12 * right7; - const column1Row1 = left1 * right4 + left5 * right5 + left9 * right6 + left13 * right7; - const column1Row2 = left2 * right4 + left6 * right5 + left10 * right6 + left14 * right7; - const column1Row3 = left3 * right4 + left7 * right5 + left11 * right6 + left15 * right7; - const column2Row0 = left0 * right8 + left4 * right9 + left8 * right10 + left12 * right11; - const column2Row1 = left1 * right8 + left5 * right9 + left9 * right10 + left13 * right11; - const column2Row2 = left2 * right8 + left6 * right9 + left10 * right10 + left14 * right11; - const column2Row3 = left3 * right8 + left7 * right9 + left11 * right10 + left15 * right11; - const column3Row0 = left0 * right12 + left4 * right13 + left8 * right14 + left12 * right15; - const column3Row1 = left1 * right12 + left5 * right13 + left9 * right14 + left13 * right15; - const column3Row2 = left2 * right12 + left6 * right13 + left10 * right14 + left14 * right15; - const column3Row3 = left3 * right12 + left7 * right13 + left11 * right14 + left15 * right15; - result[0] = column0Row0; - result[1] = column0Row1; - result[2] = column0Row2; - result[3] = column0Row3; - result[4] = column1Row0; - result[5] = column1Row1; - result[6] = column1Row2; - result[7] = column1Row3; - result[8] = column2Row0; - result[9] = column2Row1; - result[10] = column2Row2; - result[11] = column2Row3; - result[12] = column3Row0; - result[13] = column3Row1; - result[14] = column3Row2; - result[15] = column3Row3; - return result; - } - static add(left, right, result) { - result[0] = left[0] + right[0]; - result[1] = left[1] + right[1]; - result[2] = left[2] + right[2]; - result[3] = left[3] + right[3]; - result[4] = left[4] + right[4]; - result[5] = left[5] + right[5]; - result[6] = left[6] + right[6]; - result[7] = left[7] + right[7]; - result[8] = left[8] + right[8]; - result[9] = left[9] + right[9]; - result[10] = left[10] + right[10]; - result[11] = left[11] + right[11]; - result[12] = left[12] + right[12]; - result[13] = left[13] + right[13]; - result[14] = left[14] + right[14]; - result[15] = left[15] + right[15]; - return result; - } - static subtract(left, right, result) { - result[0] = left[0] - right[0]; - result[1] = left[1] - right[1]; - result[2] = left[2] - right[2]; - result[3] = left[3] - right[3]; - result[4] = left[4] - right[4]; - result[5] = left[5] - right[5]; - result[6] = left[6] - right[6]; - result[7] = left[7] - right[7]; - result[8] = left[8] - right[8]; - result[9] = left[9] - right[9]; - result[10] = left[10] - right[10]; - result[11] = left[11] - right[11]; - result[12] = left[12] - right[12]; - result[13] = left[13] - right[13]; - result[14] = left[14] - right[14]; - result[15] = left[15] - right[15]; - return result; - } - static multiplyTransformation(left, right, result) { - const left0 = left[0]; - const left1 = left[1]; - const left2 = left[2]; - const left4 = left[4]; - const left5 = left[5]; - const left6 = left[6]; - const left8 = left[8]; - const left9 = left[9]; - const left10 = left[10]; - const left12 = left[12]; - const left13 = left[13]; - const left14 = left[14]; - const right0 = right[0]; - const right1 = right[1]; - const right2 = right[2]; - const right4 = right[4]; - const right5 = right[5]; - const right6 = right[6]; - const right8 = right[8]; - const right9 = right[9]; - const right10 = right[10]; - const right12 = right[12]; - const right13 = right[13]; - const right14 = right[14]; - const column0Row0 = left0 * right0 + left4 * right1 + left8 * right2; - const column0Row1 = left1 * right0 + left5 * right1 + left9 * right2; - const column0Row2 = left2 * right0 + left6 * right1 + left10 * right2; - const column1Row0 = left0 * right4 + left4 * right5 + left8 * right6; - const column1Row1 = left1 * right4 + left5 * right5 + left9 * right6; - const column1Row2 = left2 * right4 + left6 * right5 + left10 * right6; - const column2Row0 = left0 * right8 + left4 * right9 + left8 * right10; - const column2Row1 = left1 * right8 + left5 * right9 + left9 * right10; - const column2Row2 = left2 * right8 + left6 * right9 + left10 * right10; - const column3Row0 = left0 * right12 + left4 * right13 + left8 * right14 + left12; - const column3Row1 = left1 * right12 + left5 * right13 + left9 * right14 + left13; - const column3Row2 = left2 * right12 + left6 * right13 + left10 * right14 + left14; - result[0] = column0Row0; - result[1] = column0Row1; - result[2] = column0Row2; - result[3] = 0.0; - result[4] = column1Row0; - result[5] = column1Row1; - result[6] = column1Row2; - result[7] = 0.0; - result[8] = column2Row0; - result[9] = column2Row1; - result[10] = column2Row2; - result[11] = 0.0; - result[12] = column3Row0; - result[13] = column3Row1; - result[14] = column3Row2; - result[15] = 1.0; - return result; - } - static multiplyByMatrix3(matrix, rotation, result) { - const left0 = matrix[0]; - const left1 = matrix[1]; - const left2 = matrix[2]; - const left4 = matrix[4]; - const left5 = matrix[5]; - const left6 = matrix[6]; - const left8 = matrix[8]; - const left9 = matrix[9]; - const left10 = matrix[10]; - const right0 = rotation[0]; - const right1 = rotation[1]; - const right2 = rotation[2]; - const right4 = rotation[3]; - const right5 = rotation[4]; - const right6 = rotation[5]; - const right8 = rotation[6]; - const right9 = rotation[7]; - const right10 = rotation[8]; - const column0Row0 = left0 * right0 + left4 * right1 + left8 * right2; - const column0Row1 = left1 * right0 + left5 * right1 + left9 * right2; - const column0Row2 = left2 * right0 + left6 * right1 + left10 * right2; - const column1Row0 = left0 * right4 + left4 * right5 + left8 * right6; - const column1Row1 = left1 * right4 + left5 * right5 + left9 * right6; - const column1Row2 = left2 * right4 + left6 * right5 + left10 * right6; - const column2Row0 = left0 * right8 + left4 * right9 + left8 * right10; - const column2Row1 = left1 * right8 + left5 * right9 + left9 * right10; - const column2Row2 = left2 * right8 + left6 * right9 + left10 * right10; - result[0] = column0Row0; - result[1] = column0Row1; - result[2] = column0Row2; - result[3] = 0.0; - result[4] = column1Row0; - result[5] = column1Row1; - result[6] = column1Row2; - result[7] = 0.0; - result[8] = column2Row0; - result[9] = column2Row1; - result[10] = column2Row2; - result[11] = 0.0; - result[12] = matrix[12]; - result[13] = matrix[13]; - result[14] = matrix[14]; - result[15] = matrix[15]; - return result; - } - static multiplyByTranslation(matrix, translation, result) { - const x = translation.x; - const y = translation.y; - const z = translation.z; - const tx = x * matrix[0] + y * matrix[4] + z * matrix[8] + matrix[12]; - const ty = x * matrix[1] + y * matrix[5] + z * matrix[9] + matrix[13]; - const tz = x * matrix[2] + y * matrix[6] + z * matrix[10] + matrix[14]; - result[0] = matrix[0]; - result[1] = matrix[1]; - result[2] = matrix[2]; - result[3] = matrix[3]; - result[4] = matrix[4]; - result[5] = matrix[5]; - result[6] = matrix[6]; - result[7] = matrix[7]; - result[8] = matrix[8]; - result[9] = matrix[9]; - result[10] = matrix[10]; - result[11] = matrix[11]; - result[12] = tx; - result[13] = ty; - result[14] = tz; - result[15] = matrix[15]; - return result; - } - static multiplyByScale(matrix, scale, result) { - const scaleX = scale.x; - const scaleY = scale.y; - const scaleZ = scale.z; - // Faster than Vector3.equals - if (scaleX === 1.0 && scaleY === 1.0 && scaleZ === 1.0) { - return Matrix4.clone(matrix, result); - } - result[0] = scaleX * matrix[0]; - result[1] = scaleX * matrix[1]; - result[2] = scaleX * matrix[2]; - result[3] = matrix[3]; - result[4] = scaleY * matrix[4]; - result[5] = scaleY * matrix[5]; - result[6] = scaleY * matrix[6]; - result[7] = matrix[7]; - result[8] = scaleZ * matrix[8]; - result[9] = scaleZ * matrix[9]; - result[10] = scaleZ * matrix[10]; - result[11] = matrix[11]; - result[12] = matrix[12]; - result[13] = matrix[13]; - result[14] = matrix[14]; - result[15] = matrix[15]; - return result; - } - static multiplyByUniformScale(matrix, scale, result) { - result[0] = matrix[0] * scale; - result[1] = matrix[1] * scale; - result[2] = matrix[2] * scale; - result[3] = matrix[3]; - result[4] = matrix[4] * scale; - result[5] = matrix[5] * scale; - result[6] = matrix[6] * scale; - result[7] = matrix[7]; - result[8] = matrix[8] * scale; - result[9] = matrix[9] * scale; - result[10] = matrix[10] * scale; - result[11] = matrix[11]; - result[12] = matrix[12]; - result[13] = matrix[13]; - result[14] = matrix[14]; - result[15] = matrix[15]; - return result; - } - static multiplyByVector(matrix, cartesian, result) { - const vX = cartesian.x; - const vY = cartesian.y; - const vZ = cartesian.z; - const vW = cartesian.w; - const x = matrix[0] * vX + matrix[4] * vY + matrix[8] * vZ + matrix[12] * vW; - const y = matrix[1] * vX + matrix[5] * vY + matrix[9] * vZ + matrix[13] * vW; - const z = matrix[2] * vX + matrix[6] * vY + matrix[10] * vZ + matrix[14] * vW; - const w = matrix[3] * vX + matrix[7] * vY + matrix[11] * vZ + matrix[15] * vW; - result.x = x; - result.y = y; - result.z = z; - result.w = w; - return result; - } - static multiplyByPointAsVector(matrix, cartesian, result) { - const vX = cartesian.x; - const vY = cartesian.y; - const vZ = cartesian.z; - const x = matrix[0] * vX + matrix[4] * vY + matrix[8] * vZ; - const y = matrix[1] * vX + matrix[5] * vY + matrix[9] * vZ; - const z = matrix[2] * vX + matrix[6] * vY + matrix[10] * vZ; - result.x = x; - result.y = y; - result.z = z; - return result; - } - static multiplyByPoint(matrix, cartesian, result) { - const vX = cartesian.x; - const vY = cartesian.y; - const vZ = cartesian.z; - const x = matrix[0] * vX + matrix[4] * vY + matrix[8] * vZ + matrix[12]; - const y = matrix[1] * vX + matrix[5] * vY + matrix[9] * vZ + matrix[13]; - const z = matrix[2] * vX + matrix[6] * vY + matrix[10] * vZ + matrix[14]; - result.x = x; - result.y = y; - result.z = z; - return result; - } - static multiplyByScalar(matrix, scalar, result) { - result[0] = matrix[0] * scalar; - result[1] = matrix[1] * scalar; - result[2] = matrix[2] * scalar; - result[3] = matrix[3] * scalar; - result[4] = matrix[4] * scalar; - result[5] = matrix[5] * scalar; - result[6] = matrix[6] * scalar; - result[7] = matrix[7] * scalar; - result[8] = matrix[8] * scalar; - result[9] = matrix[9] * scalar; - result[10] = matrix[10] * scalar; - result[11] = matrix[11] * scalar; - result[12] = matrix[12] * scalar; - result[13] = matrix[13] * scalar; - result[14] = matrix[14] * scalar; - result[15] = matrix[15] * scalar; - return result; - } - static negate(matrix, result) { - result[0] = -matrix[0]; - result[1] = -matrix[1]; - result[2] = -matrix[2]; - result[3] = -matrix[3]; - result[4] = -matrix[4]; - result[5] = -matrix[5]; - result[6] = -matrix[6]; - result[7] = -matrix[7]; - result[8] = -matrix[8]; - result[9] = -matrix[9]; - result[10] = -matrix[10]; - result[11] = -matrix[11]; - result[12] = -matrix[12]; - result[13] = -matrix[13]; - result[14] = -matrix[14]; - result[15] = -matrix[15]; - return result; - } - static transpose(matrix, result) { - const matrix1 = matrix[1]; - const matrix2 = matrix[2]; - const matrix3 = matrix[3]; - const matrix6 = matrix[6]; - const matrix7 = matrix[7]; - const matrix11 = matrix[11]; - result[0] = matrix[0]; - result[1] = matrix[4]; - result[2] = matrix[8]; - result[3] = matrix[12]; - result[4] = matrix1; - result[5] = matrix[5]; - result[6] = matrix[9]; - result[7] = matrix[13]; - result[8] = matrix2; - result[9] = matrix6; - result[10] = matrix[10]; - result[11] = matrix[14]; - result[12] = matrix3; - result[13] = matrix7; - result[14] = matrix11; - result[15] = matrix[15]; - return result; - } - static abs(matrix, result) { - result[0] = Math.abs(matrix[0]); - result[1] = Math.abs(matrix[1]); - result[2] = Math.abs(matrix[2]); - result[3] = Math.abs(matrix[3]); - result[4] = Math.abs(matrix[4]); - result[5] = Math.abs(matrix[5]); - result[6] = Math.abs(matrix[6]); - result[7] = Math.abs(matrix[7]); - result[8] = Math.abs(matrix[8]); - result[9] = Math.abs(matrix[9]); - result[10] = Math.abs(matrix[10]); - result[11] = Math.abs(matrix[11]); - result[12] = Math.abs(matrix[12]); - result[13] = Math.abs(matrix[13]); - result[14] = Math.abs(matrix[14]); - result[15] = Math.abs(matrix[15]); - return result; - } - static equals(left, right) { - // Given that most matrices will be transformation matrices, the elements - // are tested in order such that the test is likely to fail as early - // as possible. I _think_ this is just as friendly to the L1 cache - // as testing in index order. It is certainty faster in practice. - return ( - left === right || - (defined(left) && - defined(right) && - // Translation - left[12] === right[12] && - left[13] === right[13] && - left[14] === right[14] && - // Rotation/scale - left[0] === right[0] && - left[1] === right[1] && - left[2] === right[2] && - left[4] === right[4] && - left[5] === right[5] && - left[6] === right[6] && - left[8] === right[8] && - left[9] === right[9] && - left[10] === right[10] && - // Bottom row - left[3] === right[3] && - left[7] === right[7] && - left[11] === right[11] && - left[15] === right[15]) - ); - } - static equalsEpsilon(left, right, epsilon) { - epsilon = defaultValue(epsilon, 0); - return ( - left === right || - (defined(left) && - defined(right) && - Math.abs(left[0] - right[0]) <= epsilon && - Math.abs(left[1] - right[1]) <= epsilon && - Math.abs(left[2] - right[2]) <= epsilon && - Math.abs(left[3] - right[3]) <= epsilon && - Math.abs(left[4] - right[4]) <= epsilon && - Math.abs(left[5] - right[5]) <= epsilon && - Math.abs(left[6] - right[6]) <= epsilon && - Math.abs(left[7] - right[7]) <= epsilon && - Math.abs(left[8] - right[8]) <= epsilon && - Math.abs(left[9] - right[9]) <= epsilon && - Math.abs(left[10] - right[10]) <= epsilon && - Math.abs(left[11] - right[11]) <= epsilon && - Math.abs(left[12] - right[12]) <= epsilon && - Math.abs(left[13] - right[13]) <= epsilon && - Math.abs(left[14] - right[14]) <= epsilon && - Math.abs(left[15] - right[15]) <= epsilon) - ); - } - static getTranslation(matrix, result) { - result.x = matrix[12]; - result.y = matrix[13]; - result.z = matrix[14]; - return result; - } - static getMatrix3(matrix, result) { - result[0] = matrix[0]; - result[1] = matrix[1]; - result[2] = matrix[2]; - result[3] = matrix[4]; - result[4] = matrix[5]; - result[5] = matrix[6]; - result[6] = matrix[8]; - result[7] = matrix[9]; - result[8] = matrix[10]; - return result; - } - static inverse(matrix, result) { - // - // Ported from: - // ftp://download.intel.com/design/PentiumIII/sml/24504301.pdf - // - const src0 = matrix[0]; - const src1 = matrix[4]; - const src2 = matrix[8]; - const src3 = matrix[12]; - const src4 = matrix[1]; - const src5 = matrix[5]; - const src6 = matrix[9]; - const src7 = matrix[13]; - const src8 = matrix[2]; - const src9 = matrix[6]; - const src10 = matrix[10]; - const src11 = matrix[14]; - const src12 = matrix[3]; - const src13 = matrix[7]; - const src14 = matrix[11]; - const src15 = matrix[15]; - // calculate pairs for first 8 elements (cofactors) - let tmp0 = src10 * src15; - let tmp1 = src11 * src14; - let tmp2 = src9 * src15; - let tmp3 = src11 * src13; - let tmp4 = src9 * src14; - let tmp5 = src10 * src13; - let tmp6 = src8 * src15; - let tmp7 = src11 * src12; - let tmp8 = src8 * src14; - let tmp9 = src10 * src12; - let tmp10 = src8 * src13; - let tmp11 = src9 * src12; - // calculate first 8 elements (cofactors) - const dst0 = tmp0 * src5 + tmp3 * src6 + tmp4 * src7 - (tmp1 * src5 + tmp2 * src6 + tmp5 * src7); - const dst1 = tmp1 * src4 + tmp6 * src6 + tmp9 * src7 - (tmp0 * src4 + tmp7 * src6 + tmp8 * src7); - const dst2 = tmp2 * src4 + tmp7 * src5 + tmp10 * src7 - (tmp3 * src4 + tmp6 * src5 + tmp11 * src7); - const dst3 = tmp5 * src4 + tmp8 * src5 + tmp11 * src6 - (tmp4 * src4 + tmp9 * src5 + tmp10 * src6); - const dst4 = tmp1 * src1 + tmp2 * src2 + tmp5 * src3 - (tmp0 * src1 + tmp3 * src2 + tmp4 * src3); - const dst5 = tmp0 * src0 + tmp7 * src2 + tmp8 * src3 - (tmp1 * src0 + tmp6 * src2 + tmp9 * src3); - const dst6 = tmp3 * src0 + tmp6 * src1 + tmp11 * src3 - (tmp2 * src0 + tmp7 * src1 + tmp10 * src3); - const dst7 = tmp4 * src0 + tmp9 * src1 + tmp10 * src2 - (tmp5 * src0 + tmp8 * src1 + tmp11 * src2); - // calculate pairs for second 8 elements (cofactors) - tmp0 = src2 * src7; - tmp1 = src3 * src6; - tmp2 = src1 * src7; - tmp3 = src3 * src5; - tmp4 = src1 * src6; - tmp5 = src2 * src5; - tmp6 = src0 * src7; - tmp7 = src3 * src4; - tmp8 = src0 * src6; - tmp9 = src2 * src4; - tmp10 = src0 * src5; - tmp11 = src1 * src4; - // calculate second 8 elements (cofactors) - const dst8 = tmp0 * src13 + tmp3 * src14 + tmp4 * src15 - (tmp1 * src13 + tmp2 * src14 + tmp5 * src15); - const dst9 = tmp1 * src12 + tmp6 * src14 + tmp9 * src15 - (tmp0 * src12 + tmp7 * src14 + tmp8 * src15); - const dst10 = tmp2 * src12 + tmp7 * src13 + tmp10 * src15 - (tmp3 * src12 + tmp6 * src13 + tmp11 * src15); - const dst11 = tmp5 * src12 + tmp8 * src13 + tmp11 * src14 - (tmp4 * src12 + tmp9 * src13 + tmp10 * src14); - const dst12 = tmp2 * src10 + tmp5 * src11 + tmp1 * src9 - (tmp4 * src11 + tmp0 * src9 + tmp3 * src10); - const dst13 = tmp8 * src11 + tmp0 * src8 + tmp7 * src10 - (tmp6 * src10 + tmp9 * src11 + tmp1 * src8); - const dst14 = tmp6 * src9 + tmp11 * src11 + tmp3 * src8 - (tmp10 * src11 + tmp2 * src8 + tmp7 * src9); - const dst15 = tmp10 * src10 + tmp4 * src8 + tmp9 * src9 - (tmp8 * src9 + tmp11 * src10 + tmp5 * src8); - // calculate determinant - let det = src0 * dst0 + src1 * dst1 + src2 * dst2 + src3 * dst3; - if (Math.abs(det) < GMath.EPSILON21) { - // Special case for a zero scale matrix that can occur, for example, - // when a model's node has a [0, 0, 0] scale. - if ( - Matrix3.equalsEpsilon( - Matrix4.getMatrix3(matrix, scratchInverseRotation), - scratchMatrix3Zero, - GMath.EPSILON7 - ) && - Vector4.equals(Matrix4.getRow(matrix, 3, scratchBottomRow), scratchExpectedBottomRow) - ) { - result[0] = 0.0; - result[1] = 0.0; - result[2] = 0.0; - result[3] = 0.0; - result[4] = 0.0; - result[5] = 0.0; - result[6] = 0.0; - result[7] = 0.0; - result[8] = 0.0; - result[9] = 0.0; - result[10] = 0.0; - result[11] = 0.0; - result[12] = -matrix[12]; - result[13] = -matrix[13]; - result[14] = -matrix[14]; - result[15] = 1.0; - return result; - } - throw new Error("matrix is not invertible because its determinate is zero."); - } - // calculate matrix inverse - det = 1.0 / det; - result[0] = dst0 * det; - result[1] = dst1 * det; - result[2] = dst2 * det; - result[3] = dst3 * det; - result[4] = dst4 * det; - result[5] = dst5 * det; - result[6] = dst6 * det; - result[7] = dst7 * det; - result[8] = dst8 * det; - result[9] = dst9 * det; - result[10] = dst10 * det; - result[11] = dst11 * det; - result[12] = dst12 * det; - result[13] = dst13 * det; - result[14] = dst14 * det; - result[15] = dst15 * det; - return result; - } - static inverseTransformation(matrix, result) { - // This function is an optimized version of the below 4 lines. - // const rT = Matrix3.transpose(Matrix4.getMatrix3(matrix)); - // const rTN = Matrix3.negate(rT); - // const rTT = Matrix3.multiplyByVector(rTN, Matrix4.getTranslation(matrix)); - // return Matrix4.fromRotationTranslation(rT, rTT, result); - const matrix0 = matrix[0]; - const matrix1 = matrix[1]; - const matrix2 = matrix[2]; - const matrix4 = matrix[4]; - const matrix5 = matrix[5]; - const matrix6 = matrix[6]; - const matrix8 = matrix[8]; - const matrix9 = matrix[9]; - const matrix10 = matrix[10]; - const vX = matrix[12]; - const vY = matrix[13]; - const vZ = matrix[14]; - const x = -matrix0 * vX - matrix1 * vY - matrix2 * vZ; - const y = -matrix4 * vX - matrix5 * vY - matrix6 * vZ; - const z = -matrix8 * vX - matrix9 * vY - matrix10 * vZ; - result[0] = matrix0; - result[1] = matrix4; - result[2] = matrix8; - result[3] = 0.0; - result[4] = matrix1; - result[5] = matrix5; - result[6] = matrix9; - result[7] = 0.0; - result[8] = matrix2; - result[9] = matrix6; - result[10] = matrix10; - result[11] = 0.0; - result[12] = x; - result[13] = y; - result[14] = z; - result[15] = 1.0; - return result; - } - static inverseTranspose(matrix, result) { - return Matrix4.inverse(Matrix4.transpose(matrix, scratchTransposeMatrix), result); - } - /** - * @private - */ - static equalsArray(matrix, array, offset) { - return ( - matrix[0] === array[offset] && - matrix[1] === array[offset + 1] && - matrix[2] === array[offset + 2] && - matrix[3] === array[offset + 3] && - matrix[4] === array[offset + 4] && - matrix[5] === array[offset + 5] && - matrix[6] === array[offset + 6] && - matrix[7] === array[offset + 7] && - matrix[8] === array[offset + 8] && - matrix[9] === array[offset + 9] && - matrix[10] === array[offset + 10] && - matrix[11] === array[offset + 11] && - matrix[12] === array[offset + 12] && - matrix[13] === array[offset + 13] && - matrix[14] === array[offset + 14] && - matrix[15] === array[offset + 15] - ); - } -} -Matrix4.IDENTITY = Object.freeze( - new Matrix4(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0) -); -Matrix4.ZERO = Object.freeze( - new Matrix4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) -); -const scratchTransposeMatrix = new Matrix4(); -new Vector3(); -new Vector3(); -new Vector3(); -const scaleScratch1$1 = new Vector3(); -new Vector3(); -const scratchColumn$1 = new Vector3(); -const scaleScratch3$1 = new Vector3(); -const scaleScratch4$1 = new Vector3(); -const scaleScratch5$1 = new Vector3(); -const scratchInverseRotation = new Matrix3(); -const scratchMatrix3Zero = new Matrix3(); -const scratchBottomRow = new Vector4(); -const scratchExpectedBottomRow = new Vector4(0.0, 0.0, 0.0, 1.0); -const x = new Vector3(); -const y = new Vector3(); -const z = new Vector3(); - -class BoundingSphere { - constructor(center = new Vector3(0, 0, 0), radius = 0) { - this.center = center; - this.radius = radius; - this.originCenter = this.center.clone(); - this.originRadius = radius; - } - /** - * @param {Vector3[]} [positions] An array of points that the bounding sphere will enclose. Each point must have x, y, and z properties. - * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if one was not provided. - */ - static fromPoints(positions) { - const result = new BoundingSphere(); - if (!defined(positions) || positions.length === 0) { - result.center = Vector3.clone(Vector3.ZERO, result.center); - result.radius = 0.0; - return result; - } - const currentPos = Vector3.clone(positions[0], fromPointsCurrentPos); - const xMin = Vector3.clone(currentPos, fromPointsXMin); - const yMin = Vector3.clone(currentPos, fromPointsYMin); - const zMin = Vector3.clone(currentPos, fromPointsZMin); - const xMax = Vector3.clone(currentPos, fromPointsXMax); - const yMax = Vector3.clone(currentPos, fromPointsYMax); - const zMax = Vector3.clone(currentPos, fromPointsZMax); - const numPositions = positions.length; - let i; - for (i = 1; i < numPositions; i++) { - Vector3.clone(positions[i], currentPos); - const x = currentPos.x; - const y = currentPos.y; - const z = currentPos.z; - // Store points containing the the smallest and largest components - if (x < xMin.x) { - Vector3.clone(currentPos, xMin); - } - if (x > xMax.x) { - Vector3.clone(currentPos, xMax); - } - if (y < yMin.y) { - Vector3.clone(currentPos, yMin); - } - if (y > yMax.y) { - Vector3.clone(currentPos, yMax); - } - if (z < zMin.z) { - Vector3.clone(currentPos, zMin); - } - if (z > zMax.z) { - Vector3.clone(currentPos, zMax); - } - } - // Compute x-, y-, and z-spans (Squared distances b/n each component's min. and max.). - const xSpan = Vector3.magnitudeSquared(Vector3.subtract(xMax, xMin, fromPointsScratch)); - const ySpan = Vector3.magnitudeSquared(Vector3.subtract(yMax, yMin, fromPointsScratch)); - const zSpan = Vector3.magnitudeSquared(Vector3.subtract(zMax, zMin, fromPointsScratch)); - // Set the diameter endpoints to the largest span. - let diameter1 = xMin; - let diameter2 = xMax; - let maxSpan = xSpan; - if (ySpan > maxSpan) { - maxSpan = ySpan; - diameter1 = yMin; - diameter2 = yMax; - } - if (zSpan > maxSpan) { - maxSpan = zSpan; - diameter1 = zMin; - diameter2 = zMax; - } - // Calculate the center of the initial sphere found by Ritter's algorithm - const ritterCenter = fromPointsRitterCenter; - ritterCenter.x = (diameter1.x + diameter2.x) * 0.5; - ritterCenter.y = (diameter1.y + diameter2.y) * 0.5; - ritterCenter.z = (diameter1.z + diameter2.z) * 0.5; - // Calculate the radius of the initial sphere found by Ritter's algorithm - let radiusSquared = Vector3.magnitudeSquared(Vector3.subtract(diameter2, ritterCenter, fromPointsScratch)); - let ritterRadius = Math.sqrt(radiusSquared); - // Find the center of the sphere found using the Naive method. - const minBoxPt = fromPointsMinBoxPt; - minBoxPt.x = xMin.x; - minBoxPt.y = yMin.y; - minBoxPt.z = zMin.z; - const maxBoxPt = fromPointsMaxBoxPt; - maxBoxPt.x = xMax.x; - maxBoxPt.y = yMax.y; - maxBoxPt.z = zMax.z; - const naiveCenter = Vector3.midpoint(minBoxPt, maxBoxPt, fromPointsNaiveCenterScratch); - // Begin 2nd pass to find naive radius and modify the ritter sphere. - let naiveRadius = 0; - for (i = 0; i < numPositions; i++) { - Vector3.clone(positions[i], currentPos); - // Find the furthest point from the naive center to calculate the naive radius. - const r = Vector3.magnitude(Vector3.subtract(currentPos, naiveCenter, fromPointsScratch)); - if (r > naiveRadius) { - naiveRadius = r; - } - // Make adjustments to the Ritter Sphere to include all points. - const oldCenterToPointSquared = Vector3.magnitudeSquared( - Vector3.subtract(currentPos, ritterCenter, fromPointsScratch) - ); - if (oldCenterToPointSquared > radiusSquared) { - const oldCenterToPoint = Math.sqrt(oldCenterToPointSquared); - // Calculate new radius to include the point that lies outside - ritterRadius = (ritterRadius + oldCenterToPoint) * 0.5; - radiusSquared = ritterRadius * ritterRadius; - // Calculate center of new Ritter sphere - const oldToNew = oldCenterToPoint - ritterRadius; - ritterCenter.x = (ritterRadius * ritterCenter.x + oldToNew * currentPos.x) / oldCenterToPoint; - ritterCenter.y = (ritterRadius * ritterCenter.y + oldToNew * currentPos.y) / oldCenterToPoint; - ritterCenter.z = (ritterRadius * ritterCenter.z + oldToNew * currentPos.z) / oldCenterToPoint; - } - } - if (ritterRadius < naiveRadius) { - Vector3.clone(ritterCenter, result.center); - result.radius = ritterRadius; - } else { - Vector3.clone(naiveCenter, result.center); - result.radius = naiveRadius; - } - return result; - } - /** - * Computes a tight-fitting bounding sphere enclosing a list of 3D points, where the points are - * stored in a flat array in X, Y, Z, order. The bounding sphere is computed by running two - * algorithms, a naive algorithm and Ritter's algorithm. The smaller of the two spheres is used to - * ensure a tight fit. - * - * @param {Number[]} [positions] An array of points that the bounding sphere will enclose. Each point - * is formed from three elements in the array in the order X, Y, Z. - * @param {Vector3} [center=Vector3.ZERO] The position to which the positions are relative, which need not be the - * origin of the coordinate system. This is useful when the positions are to be used for - * relative-to-center (RTC) rendering. - * @param {Number} [stride=3] The number of array elements per vertex. It must be at least 3, but it may - * be higher. Regardless of the value of this parameter, the X coordinate of the first position - * is at array index 0, the Y coordinate is at array index 1, and the Z coordinate is at array index - * 2. When stride is 3, the X coordinate of the next position then begins at array index 3. If - * the stride is 5, however, two array elements are skipped and the next position begins at array - * index 5. - * @param {BoundingSphere} [result] The object onto which to store the result. - * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if one was not provided. - * - * @example - * // Compute the bounding sphere from 3 positions, each specified relative to a center. - * // In addition to the X, Y, and Z coordinates, the points array contains two additional - * // elements per point which are ignored for the purpose of computing the bounding sphere. - * const center = new Vector3(1.0, 2.0, 3.0); - * const points = [1.0, 2.0, 3.0, 0.1, 0.2, - * 4.0, 5.0, 6.0, 0.1, 0.2, - * 7.0, 8.0, 9.0, 0.1, 0.2]; - * const sphere = BoundingSphere.fromVertices(points, center, 5); - * - */ - static fromVertices(positions, center = Vector3.ZERO, stride = 3) { - const result = new BoundingSphere(); - if (!defined(positions) || positions.length === 0) { - result.center = Vector3.clone(Vector3.ZERO, result.center); - result.radius = 0.0; - return result; - } - center = defaultValue(center, Vector3.ZERO); - stride = defaultValue(stride, 3); - const currentPos = fromPointsCurrentPos; - currentPos.x = positions[0] + center.x; - currentPos.y = positions[1] + center.y; - currentPos.z = positions[2] + center.z; - const xMin = Vector3.clone(currentPos, fromPointsXMin); - const yMin = Vector3.clone(currentPos, fromPointsYMin); - const zMin = Vector3.clone(currentPos, fromPointsZMin); - const xMax = Vector3.clone(currentPos, fromPointsXMax); - const yMax = Vector3.clone(currentPos, fromPointsYMax); - const zMax = Vector3.clone(currentPos, fromPointsZMax); - const numElements = positions.length; - let i; - for (i = 0; i < numElements; i += stride) { - const x = positions[i] + center.x; - const y = positions[i + 1] + center.y; - const z = positions[i + 2] + center.z; - currentPos.x = x; - currentPos.y = y; - currentPos.z = z; - // Store points containing the the smallest and largest components - if (x < xMin.x) { - Vector3.clone(currentPos, xMin); - } - if (x > xMax.x) { - Vector3.clone(currentPos, xMax); - } - if (y < yMin.y) { - Vector3.clone(currentPos, yMin); - } - if (y > yMax.y) { - Vector3.clone(currentPos, yMax); - } - if (z < zMin.z) { - Vector3.clone(currentPos, zMin); - } - if (z > zMax.z) { - Vector3.clone(currentPos, zMax); - } - } - // Compute x-, y-, and z-spans (Squared distances b/n each component's min. and max.). - const xSpan = Vector3.magnitudeSquared(Vector3.subtract(xMax, xMin, fromPointsScratch)); - const ySpan = Vector3.magnitudeSquared(Vector3.subtract(yMax, yMin, fromPointsScratch)); - const zSpan = Vector3.magnitudeSquared(Vector3.subtract(zMax, zMin, fromPointsScratch)); - // Set the diameter endpoints to the largest span. - let diameter1 = xMin; - let diameter2 = xMax; - let maxSpan = xSpan; - if (ySpan > maxSpan) { - maxSpan = ySpan; - diameter1 = yMin; - diameter2 = yMax; - } - if (zSpan > maxSpan) { - maxSpan = zSpan; - diameter1 = zMin; - diameter2 = zMax; - } - // Calculate the center of the initial sphere found by Ritter's algorithm - const ritterCenter = fromPointsRitterCenter; - ritterCenter.x = (diameter1.x + diameter2.x) * 0.5; - ritterCenter.y = (diameter1.y + diameter2.y) * 0.5; - ritterCenter.z = (diameter1.z + diameter2.z) * 0.5; - // Calculate the radius of the initial sphere found by Ritter's algorithm - let radiusSquared = Vector3.magnitudeSquared(Vector3.subtract(diameter2, ritterCenter, fromPointsScratch)); - let ritterRadius = Math.sqrt(radiusSquared); - // Find the center of the sphere found using the Naive method. - const minBoxPt = fromPointsMinBoxPt; - minBoxPt.x = xMin.x; - minBoxPt.y = yMin.y; - minBoxPt.z = zMin.z; - const maxBoxPt = fromPointsMaxBoxPt; - maxBoxPt.x = xMax.x; - maxBoxPt.y = yMax.y; - maxBoxPt.z = zMax.z; - const naiveCenter = Vector3.midpoint(minBoxPt, maxBoxPt, fromPointsNaiveCenterScratch); - // Begin 2nd pass to find naive radius and modify the ritter sphere. - let naiveRadius = 0; - for (i = 0; i < numElements; i += stride) { - currentPos.x = positions[i] + center.x; - currentPos.y = positions[i + 1] + center.y; - currentPos.z = positions[i + 2] + center.z; - // Find the furthest point from the naive center to calculate the naive radius. - const r = Vector3.magnitude(Vector3.subtract(currentPos, naiveCenter, fromPointsScratch)); - if (r > naiveRadius) { - naiveRadius = r; - } - // Make adjustments to the Ritter Sphere to include all points. - const oldCenterToPointSquared = Vector3.magnitudeSquared( - Vector3.subtract(currentPos, ritterCenter, fromPointsScratch) - ); - if (oldCenterToPointSquared > radiusSquared) { - const oldCenterToPoint = Math.sqrt(oldCenterToPointSquared); - // Calculate new radius to include the point that lies outside - ritterRadius = (ritterRadius + oldCenterToPoint) * 0.5; - radiusSquared = ritterRadius * ritterRadius; - // Calculate center of new Ritter sphere - const oldToNew = oldCenterToPoint - ritterRadius; - ritterCenter.x = (ritterRadius * ritterCenter.x + oldToNew * currentPos.x) / oldCenterToPoint; - ritterCenter.y = (ritterRadius * ritterCenter.y + oldToNew * currentPos.y) / oldCenterToPoint; - ritterCenter.z = (ritterRadius * ritterCenter.z + oldToNew * currentPos.z) / oldCenterToPoint; - } - } - if (ritterRadius < naiveRadius) { - Vector3.clone(ritterCenter, result.center); - result.radius = ritterRadius; - } else { - Vector3.clone(naiveCenter, result.center); - result.radius = naiveRadius; - } - return result; - } - intersectPlane(plane) { - const center = this.center; - const radius = this.radius; - const normal = plane.normal; - const distanceToPlane = Vector3.dot(normal, center) + plane.distance; - if (distanceToPlane < -radius) { - // The center point is negative side of the plane normal - return Intersect.OUTSIDE; - } else if (distanceToPlane < radius) { - // The center point is positive side of the plane, but radius extends beyond it; partial overlap - return Intersect.INTERSECTING; - } - return Intersect.INSIDE; - } - update(transform) { - Matrix4.multiplyByPoint(transform, this.originCenter, this.center); - this.radius = Matrix4.getMaximumScale(transform) * this.originRadius; - } - distanceToCamera(camera) { - return Math.max(0.0, Vector3.distance(this.center, camera.position) - this.radius); - } -} -const fromPointsXMin = new Vector3(); -const fromPointsYMin = new Vector3(); -const fromPointsZMin = new Vector3(); -const fromPointsXMax = new Vector3(); -const fromPointsYMax = new Vector3(); -const fromPointsZMax = new Vector3(); -const fromPointsCurrentPos = new Vector3(); -const fromPointsScratch = new Vector3(); -const fromPointsRitterCenter = new Vector3(); -const fromPointsMinBoxPt = new Vector3(); -const fromPointsMaxBoxPt = new Vector3(); -const fromPointsNaiveCenterScratch = new Vector3(); - -class IndexBuffer { - constructor(label, indices) { - this.label = label; - this.indices = indices; - this.indexFormat = indices instanceof Uint32Array ? IndexFormat.Uint32 : IndexFormat.Uint16; - this.dirty = true; - } - setIndices(indices) { - this.indices = indices; - this.indexFormat = indices instanceof Uint32Array ? IndexFormat.Uint32 : IndexFormat.Uint16; - this.dirty = true; - } - bind(device, passEncoder) { - if (this.dirty) { - this.dirty = false; - this.buffer = Buffer.createIndexBuffer( - this.label, - device, - this.indices instanceof Array - ? IndexFormat.Uint16 - ? new Uint16Array(this.indices) - : new Uint32Array(this.indices) - : this.indices - ); - } - passEncoder.setIndexBuffer(this.buffer.gpuBuffer, this.indexFormat); - } - destroy() { - this.buffer.destroy(); - } -} - -class Attributes { - constructor(shaderLocation = 0) { - this._attributes = new Map(); - this.shaderLocation = shaderLocation; - this.offset = 0; - this.interleave = false; - } - get dirty() { - let result = false; - this._attributes.forEach((attribute) => (!result ? (result = attribute.dirty) : false)); - return result; - } - set dirty(value) { - this._attributes.forEach((attribute) => (attribute.dirty = value)); - } - get values() { - return this._attributes; - } - getAttribute(name) { - return this._attributes.get(name); - } - setAttribute(attribute) { - if (attribute.attributeType === AttributeType.attribute) { - this.setNotInterleavedAttribute(attribute); - } else { - this.setInterleavedAttribute(attribute); - } - } - setNotInterleavedAttribute(attribute) { - if (this._attributes.has(attribute.name)) return; - attribute.shaderLocation = this.shaderLocation; - this.shaderLocation += 1; - attribute.offset = this.offset; - this.offset += attribute.attributeByteSize; - this._attributes.set(attribute.name, attribute); - } - setInterleavedAttribute(attribute) { - if (this._attributes.has(attribute.names.toString())) return; - this._attributes.set(attribute.names.toString(), attribute); - } - getGPUAttributesDes() { - const result = []; - this._attributes.forEach((attribute) => { - result.push(...attribute.getGPUAttribute()); - }); - return result; - } - getAtrributeValues() { - const arrayStrides = []; - let arrayStride = 0; - let buffer = undefined; - let values = null; - const arrays = []; - this._attributes.forEach((attribute) => { - if (attribute.attributeType === AttributeType.attribute) { - arrayStrides.push(attribute.itemSize); - arrays.push(attribute.value); - arrayStride += attribute.itemSize; - } else { - if (!this.interleave) this.interleave = true; - values = values ?? attribute.value; - buffer = attribute?.buffer; - arrayStride = attribute.itemSizes.reduce((total, current) => (total += current), 0); - } - }); - const typeArray = this.interleave - ? new Float32Array(values) - : this.interleaveTypedArray(Float32Array, arrayStrides, ...arrays); - return { - arrayStride: arrayStride * typeArray.BYTES_PER_ELEMENT, - typeArray, - buffer - }; - } - destroy() { - this._attributes.forEach((attribute) => { - attribute.destroy(); - }); - } - /** - * Interleave n typed arrays - * @alias module:interleaveTypedArray - * @param {TypedArray} ResultConstructor Returned typed array constructor - * @param {Array} elements Number of elements to group for each typed array - * @param {...TypedArray} arrays Arrays to interleave - * @returns {TypedArray} - */ - interleaveTypedArray(ResultConstructor, elements, ...arrays) { - const totalLength = arrays.reduce((total, arr) => total + arr.length, 0); - const result = new ResultConstructor(totalLength); - const stride = elements.reduce((a, b) => a + b); - for (let i = 0; i < totalLength; i++) { - let offset = 0; - for (let j = 0; j < elements.length; j++) { - for (let k = 0; k < elements[j]; k++) { - result[i * stride + offset] = arrays[j][elements[j] * i + k]; - offset++; - } - } - } - return result; - } -} - -class VertexBuffer { - // - constructor(params) { - const { label, index, locationIndex = 0, stepMode = InputStepMode.Vertex, arrayStride } = params; - this.index = index || 0; - this.attributes = new Attributes(locationIndex); - this.stepMode = stepMode; - this.dirty = true; - this.label = label?.concat(`_${index}_VertexBuffer`); - this.arrayStride = arrayStride; - this.defines = {}; - this.locationIndex = locationIndex; - } - getBufferDes() { - const result = { - arrayStride: this.arrayStride, - stepMode: this.stepMode, - attributes: this.attributes.getGPUAttributesDes() - }; - return result; - } - setAttribute(attribute) { - if (attribute.attributeType === AttributeType.attribute) { - this.setLocationIndex(attribute.name); - } else { - attribute?.names.forEach((name) => this.setLocationIndex(name)); - } - this.attributes.setAttribute(attribute); - this.dirty = true; - } - getAttribute(name) { - return this.attributes.getAttribute(name); - } - containAttribute(name) { - return this.defines[name?.concat("Location")] != undefined ? true : false; - } - bind(device, passEncoder) { - if (this.attributes.dirty) { - this.attributes.dirty = false; - const { arrayStride, typeArray, buffer } = this.attributes.getAtrributeValues(); - if (this.arrayStride === undefined) this.arrayStride = arrayStride; - if (!this.buffer) { - this.buffer = buffer ?? Buffer.createVertexBuffer(this.label, device, typeArray); - } else { - // update Buffer - if (typeArray) this.buffer.setSubData(0, typeArray); - } - } - passEncoder.setVertexBuffer(this.index, this.buffer.gpuBuffer); - } - setLocationIndex(name) { - if (this.defines[name?.concat("Location")] || !name) return; - this.defines[name?.concat("Location")] = this.locationIndex; - this.locationIndex += 1; - } - destroy() { - this.buffer.destroy(); - this.attributes.destroy(); - } -} - -/** - * Merges two objects, copying their properties onto a new combined object. When two objects have the same - * property, the value of the property on the first object is used. If either object is undefined, - * it will be treated as an empty object. - * - * @example - * const object1 = { - * propOne : 1, - * propTwo : { - * value1 : 10 - * } - * } - * const object2 = { - * propTwo : 2 - * } - * const final = combine(object1, object2); - * - * // final === { - * // propOne : 1, - * // propTwo : { - * // value1 : 10 - * // } - * // } - * - * @param {Object} [object1] The first object to merge. - * @param {Object} [object2] The second object to merge. - * @param {Boolean} [deep=false] Perform a recursive merge. - * @returns {Object} The combined object containing all properties from both objects. - * - * @function - */ -function combine(object1, object2, deep) { - deep = defaultValue(deep, false); - const result = {}; - const object1Defined = defined(object1); - const object2Defined = defined(object2); - let property; - let object1Value; - let object2Value; - if (object1Defined) { - for (property in object1) { - if (object1.hasOwnProperty(property)) { - object1Value = object1[property]; - if (object2Defined && deep && typeof object1Value === "object" && object2.hasOwnProperty(property)) { - object2Value = object2[property]; - if (typeof object2Value === "object") { - result[property] = combine(object1Value, object2Value, deep); - } else { - result[property] = object1Value; - } - } else { - result[property] = object1Value; - } - } - } - } - if (object2Defined) { - for (property in object2) { - if (object2.hasOwnProperty(property) && !result.hasOwnProperty(property)) { - object2Value = object2[property]; - result[property] = object2Value; - } - } - } - return result; -} - -class Geometry { - get defines() { - return Object.assign({}, this._defines, ...this.vertexBuffers.map((vertexBuffer) => vertexBuffer.defines)); - } - set defines(value) { - this.definesDirty = true; - this._defines = combine(value, this._defines, false); - } - get currentLocationIndex() { - return this?.vertexBuffers?.reduce( - (max, current) => (current.locationIndex > max ? (max = current.locationIndex) : max), - 0 - ); - } - get vertexBufferCount() { - return this.vertexBuffers.length; - } - constructor(options) { - this.type = options.type || undefined; - this.boundingSphere = undefined; - this.dirty = false; - this.definesDirty = true; - this.defaultVertexBuffer = new VertexBuffer({ - label: this.type, - index: 0 - }); - this.vertexBuffers = [this.defaultVertexBuffer]; - this._defines = {}; - this.normals = []; - this.uvs = []; - this.positions = []; - this.indices = []; - this.tangents = []; - } - getAttribute(name) { - return this.defaultVertexBuffer.getAttribute(name); - } - setAttribute(attribute) { - this.defaultVertexBuffer.setAttribute(attribute); - } - setIndice(indices) { - this.indices = indices; - if (!this.indexBuffer) this.indexBuffer = new IndexBuffer(this.type + "IndexBuffer"); - this.indexBuffer.setIndices(indices); - } - update(frameState) { - // todo - } - computeBoundingSphere(positions, stride = 3) { - this.boundingSphere = BoundingSphere.fromVertices(positions, new Vector3(0, 0, 0), stride); - } - /** - * Calculate mesh tangent. - * @remark need to set positions(with or not with indices), normals, uv before calculation. - * @remark based on http://foundationsofgameenginedev.com/FGED2-sample.pdf - */ - calculateTangents() { - if (!this.normals || !this.uvs) { - throw "Set normal and uv before calculation."; - } - const { indices, positions, normals, uvs } = this; - const tempPos0 = new Vector3(), - tempPos1 = new Vector3(), - tempPos2 = new Vector3(), - tempUV0 = new Vector2(), - tempUV1 = new Vector2(), - tempUV2 = new Vector2(); - const e1 = new Vector3(), - e2 = new Vector3(), - t = new Vector3(), - b = new Vector3(), - temp = new Vector3(); - const vertexCount = this.indices.length; - const triangleCount = indices ? indices.length / 3 : positions.length / 3; - const tangents = new Array(vertexCount); - const biTangents = new Array(vertexCount); - this.tangents = []; - for (let i = 0; i < vertexCount; i++) { - tangents[i] = new Vector4(); - biTangents[i] = new Vector3(); - } - // Calculate tangent and bi-tangent for each triangle and add to all three vertices. - for (let k = 0; k < triangleCount; k++) { - let i0 = 3 * k; - let i1 = 3 * k + 1; - let i2 = 3 * k + 2; - if (indices) { - i0 = indices[i0]; - i1 = indices[i1]; - i2 = indices[i2]; - } - const p0 = tempPos0.set(positions[i0], positions[i0 + 1], positions[i0 + 2]); - const p1 = tempPos1.set(positions[i1], positions[i1 + 1], positions[i1 + 2]); - const p2 = tempPos2.set(positions[i2], positions[i2 + 1], positions[i2 + 2]); - const w0 = tempUV0.set(uvs[i0], uvs[i0 + 1]); - const w1 = tempUV1.set(uvs[i1], uvs[i1 + 1]); - const w2 = tempUV2.set(uvs[i2], uvs[i2 + 1]); - Vector3.subtract(p1, p0, e1); - Vector3.subtract(p2, p0, e2); - const x1 = w1.x - w0.x; - const x2 = w2.x - w0.x; - const y1 = w1.y - w0.y; - const y2 = w2.y - w0.y; - const r = 1.0 / (x1 * y2 - x2 * y1); - Vector3.multiplyByScalar(e1, y2 * r, t); - Vector3.multiplyByScalar(e2, y1 * r, temp); - Vector3.subtract(t, temp, t); - Vector3.multiplyByScalar(e2, x1 * r, b); - Vector3.multiplyByScalar(e1, x2 * r, temp); - Vector3.subtract(b, temp, b); - let tangent = tangents[i0]; - tangent.set(tangent.x + t.x, tangent.y + t.y, tangent.z + t.z, 1.0); - tangent = tangents[i1]; - tangent.set(tangent.x + t.x, tangent.y + t.y, tangent.z + t.z, 1.0); - tangent = tangents[i2]; - tangent.set(tangent.x + t.x, tangent.y + t.y, tangent.z + t.z, 1.0); - biTangents[i0].add(b); - biTangents[i1].add(b); - biTangents[i2].add(b); - } - // Orthonormalize each tangent and calculate the handedness. - for (let i = 0; i < vertexCount; i++) { - const n = new Vector3(normals[3 * i], normals[3 * i + 1], normals[3 * i + 2]); - const b = biTangents[i]; - const tangent = tangents[i]; - t.set(tangent.x, tangent.y, tangent.z); - Vector3.cross(t, b, temp); - const w = Vector3.dot(temp, n) > 0.0 ? 1 : -1; - Vector3.multiplyByScalar(n, Vector3.dot(t, n), temp); - Vector3.subtract(t, temp, t); - Vector3.normalize(t, t); - // t.normalize(); - tangent.set(t.x, t.y, t.z, w); - this.tangents.push(t.x, t.y, t.z, w); - } - // this.setTangents(tangents); - } - destroy() { - this?.indexBuffer.destroy(); - this.defaultVertexBuffer.destroy(); - this.normals = null; - this.uvs = null; - this.positions = null; - this.indices = null; - this.tangents = null; - this.boundingSphere = undefined; - } -} - -class PlaneGeometry extends Geometry { - constructor(width = 10, height = 10) { - super({ - type: "planeGeometry" - }); - this.width = width; - this.height = height; - this.defines = { - HAS_NORMAL: true - }; - this.init(); - } - init() { - // generate pos uv normal so on - const { indices, normals, uvs, vertices } = this.createGrid(this.width, this.height); - this.computeBoundingSphere(vertices); - this.setAttribute(new Float32Attribute("position", vertices, 3)); - this.setAttribute(new Float32Attribute("normal", normals, 3)); - this.setAttribute(new Float32Attribute("uv", uvs, 2)); - this.setIndice(indices); - this.count = indices.length; - } - createGrid(width = 1, height = 1, widthSegments = 1, heightSegments = 1) { - const width_half = width / 2; - const height_half = height / 2; - const gridX = Math.floor(widthSegments); - const gridY = Math.floor(heightSegments); - const gridX1 = gridX + 1; - const gridY1 = gridY + 1; - const segment_width = width / gridX; - const segment_height = height / gridY; - // - const indices = []; - const vertices = []; - const normals = []; - const uvs = []; - for (let iy = 0; iy < gridY1; iy++) { - const y = iy * segment_height - height_half; - for (let ix = 0; ix < gridX1; ix++) { - const x = ix * segment_width - width_half; - vertices.push(x, -y, 0); - normals.push(0, 0, 1); - uvs.push(ix / gridX); - uvs.push(1 - iy / gridY); - } - } - for (let iy = 0; iy < gridY; iy++) { - for (let ix = 0; ix < gridX; ix++) { - const a = ix + gridX1 * iy; - const b = ix + gridX1 * (iy + 1); - const c = ix + 1 + gridX1 * (iy + 1); - const d = ix + 1 + gridX1 * iy; - indices.push(a, b, d); - indices.push(b, c, d); - } - } - return { indices, normals, uvs, vertices }; - } -} - -/** - * A set of 4-dimensional coordinates used to represent rotation in 3-dimensional space. - * @alias Quaternion - * @constructor - * - * @param {Number} [x=0.0] The X component. - * @param {Number} [y=0.0] The Y component. - * @param {Number} [z=0.0] The Z component. - * @param {Number} [w=0.0] The W component. - * - * @see PackableForInterpolation - */ -class Quaternion { - constructor(x = 0, y = 0, z = 0, w = 1) { - this.x = x; - this.y = y; - this.z = z; - this.w = w; - } - set(x, y, z, w) { - this.x = x; - this.y = y; - this.z = z; - this.w = w; - } - normalize() { - const inverseMagnitude = 1.0 / Quaternion.magnitude(this); - const x = this.x * inverseMagnitude; - const y = this.y * inverseMagnitude; - const z = this.z * inverseMagnitude; - const w = this.w * inverseMagnitude; - this.x = x; - this.y = y; - this.z = z; - this.w = w; - return this; - } - invert() { - this.x *= -1; - this.y *= -1; - this.z *= -1; - return this; - } - dot(v) { - return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; - } - setFromUnitVectors(vFrom, vTo) { - // assumes direction vectors vFrom and vTo are normalized - let r = Vector3.dot(vFrom, vTo) + 1; - if (r < Number.EPSILON) { - // vFrom and vTo point in opposite directions - r = 0; - if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) { - this.x = -vFrom.y; - this.y = vFrom.x; - this.z = 0; - this.w = r; - } else { - this.x = 0; - this.y = -vFrom.z; - this.z = vFrom.y; - this.w = r; - } - } else { - // crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3 - this.x = vFrom.y * vTo.z - vFrom.z * vTo.y; - this.y = vFrom.z * vTo.x - vFrom.x * vTo.z; - this.z = vFrom.x * vTo.y - vFrom.y * vTo.x; - this.w = r; - } - return this.normalize(); - } - setFromRotationMatrix(matrix) { - const te = matrix, - m11 = te[0], - m12 = te[4], - m13 = te[8], - m21 = te[1], - m22 = te[5], - m23 = te[9], - m31 = te[2], - m32 = te[6], - m33 = te[10], - trace = m11 + m22 + m33; - if (trace > 0) { - const s = 0.5 / Math.sqrt(trace + 1.0); - this.w = 0.25 / s; - this.x = (m32 - m23) * s; - this.y = (m13 - m31) * s; - this.z = (m21 - m12) * s; - } else if (m11 > m22 && m11 > m33) { - const s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33); - this.w = (m32 - m23) / s; - this.x = 0.25 * s; - this.y = (m12 + m21) / s; - this.z = (m13 + m31) / s; - } else if (m22 > m33) { - const s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33); - this.w = (m13 - m31) / s; - this.x = (m12 + m21) / s; - this.y = 0.25 * s; - this.z = (m23 + m32) / s; - } else { - const s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22); - this.w = (m21 - m12) / s; - this.x = (m13 + m31) / s; - this.y = (m23 + m32) / s; - this.z = 0.25 * s; - } - return this; - } - clone() { - return Quaternion.clone(this, this); - } - equals(right) { - return Quaternion.equals(this, right); - } - equalsEpsilon(right, epsilon = 0) { - return Quaternion.equalsEpsilon(this, right, epsilon); - } - toArray() { - const { x, y, z, w } = this; - return [x, y, z, w]; - } - static fromAxisAngle(axis, angle) { - const halfAngle = angle / 2.0; - const s = Math.sin(halfAngle); - fromAxisAngleScratch = Vector3.normalize(axis, fromAxisAngleScratch); - const x = fromAxisAngleScratch.x * s; - const y = fromAxisAngleScratch.y * s; - const z = fromAxisAngleScratch.z * s; - const w = Math.cos(halfAngle); - // if (!defined(result)) { - // return - // } - const result = new Quaternion(x, y, z, w); - result.x = x; - result.y = y; - result.z = z; - result.w = w; - return result; - } - // static fromRotationMatrix(matrix: Matrix3, result: Quaternion): Quaternion { - // let root; - // let x; - // let y; - // let z; - // let w; - // const m00 = matrix[Matrix3.COLUMN0ROW0]; - // const m11 = matrix[Matrix3.COLUMN1ROW1]; - // const m22 = matrix[Matrix3.COLUMN2ROW2]; - // const trace = m00 + m11 + m22; - // if (trace > 0.0) { - // // |w| > 1/2, may as well choose w > 1/2 - // root = Math.sqrt(trace + 1.0); // 2w - // w = 0.5 * root; - // root = 0.5 / root; // 1/(4w) - // x = (matrix[Matrix3.COLUMN1ROW2] - matrix[Matrix3.COLUMN2ROW1]) * root; - // y = (matrix[Matrix3.COLUMN2ROW0] - matrix[Matrix3.COLUMN0ROW2]) * root; - // z = (matrix[Matrix3.COLUMN0ROW1] - matrix[Matrix3.COLUMN1ROW0]) * root; - // } else { - // // |w| <= 1/2 - // const next = fromRotationMatrixNext; - // let i = 0; - // if (m11 > m00) { - // i = 1; - // } - // if (m22 > m00 && m22 > m11) { - // i = 2; - // } - // const j = next[i]; - // const k = next[j]; - // root = Math.sqrt( - // matrix[Matrix3.getElementIndex(i, i)] - - // matrix[Matrix3.getElementIndex(j, j)] - - // matrix[Matrix3.getElementIndex(k, k)] + - // 1.0 - // ); - // const quat = fromRotationMatrixQuat; - // quat[i] = 0.5 * root; - // root = 0.5 / root; - // w = (matrix[Matrix3.getElementIndex(k, j)] - matrix[Matrix3.getElementIndex(j, k)]) * root; - // quat[j] = (matrix[Matrix3.getElementIndex(j, i)] + matrix[Matrix3.getElementIndex(i, j)]) * root; - // quat[k] = (matrix[Matrix3.getElementIndex(k, i)] + matrix[Matrix3.getElementIndex(i, k)]) * root; - // x = -quat[0]; - // y = -quat[1]; - // z = -quat[2]; - // } - // if (!defined(result)) { - // return new Quaternion(x, y, z, w); - // } - // result.x = x; - // result.y = y; - // result.z = z; - // result.w = w; - // return result; - // } - static clone(quaternion, result) { - if (!defined(quaternion)) { - return undefined; - } - if (!defined(result)) { - return new Quaternion(quaternion.x, quaternion.y, quaternion.z, quaternion.w); - } - result.x = quaternion.x; - result.y = quaternion.y; - result.z = quaternion.z; - result.w = quaternion.w; - return result; - } - static conjugate(quaternion, result) { - result.x = -quaternion.x; - result.y = -quaternion.y; - result.z = -quaternion.z; - result.w = quaternion.w; - return result; - } - static magnitudeSquared(quaternion) { - return ( - quaternion.x * quaternion.x + - quaternion.y * quaternion.y + - quaternion.z * quaternion.z + - quaternion.w * quaternion.w - ); - } - static magnitude(quaternion) { - return Math.sqrt(Quaternion.magnitudeSquared(quaternion)); - } - static normalize(quaternion, result) { - const inverseMagnitude = 1.0 / Quaternion.magnitude(quaternion); - const x = quaternion.x * inverseMagnitude; - const y = quaternion.y * inverseMagnitude; - const z = quaternion.z * inverseMagnitude; - const w = quaternion.w * inverseMagnitude; - result.x = x; - result.y = y; - result.z = z; - result.w = w; - return result; - } - static inverse(quaternion, result) { - const magnitudeSquared = Quaternion.magnitudeSquared(quaternion); - result = Quaternion.conjugate(quaternion, result); - return Quaternion.multiplyByScalar(result, 1.0 / magnitudeSquared, result); - } - static add(left, right, result) { - result.x = left.x + right.x; - result.y = left.y + right.y; - result.z = left.z + right.z; - result.w = left.w + right.w; - return result; - } - static subtract(left, right, result) { - result.x = left.x - right.x; - result.y = left.y - right.y; - result.z = left.z - right.z; - result.w = left.w - right.w; - return result; - } - static negate(quaternion, result) { - result.x = -quaternion.x; - result.y = -quaternion.y; - result.z = -quaternion.z; - result.w = -quaternion.w; - return result; - } - static dot(left, right) { - return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; - } - static multiply(left, right, result) { - const leftX = left.x; - const leftY = left.y; - const leftZ = left.z; - const leftW = left.w; - const rightX = right.x; - const rightY = right.y; - const rightZ = right.z; - const rightW = right.w; - const x = leftW * rightX + leftX * rightW + leftY * rightZ - leftZ * rightY; - const y = leftW * rightY - leftX * rightZ + leftY * rightW + leftZ * rightX; - const z = leftW * rightZ + leftX * rightY - leftY * rightX + leftZ * rightW; - const w = leftW * rightW - leftX * rightX - leftY * rightY - leftZ * rightZ; - result.x = x; - result.y = y; - result.z = z; - result.w = w; - return result; - } - static multiplyByScalar(quaternion, scalar, result) { - result.x = quaternion.x * scalar; - result.y = quaternion.y * scalar; - result.z = quaternion.z * scalar; - result.w = quaternion.w * scalar; - return result; - } - static divideByScalar(quaternion, scalar, result) { - result.x = quaternion.x / scalar; - result.y = quaternion.y / scalar; - result.z = quaternion.z / scalar; - result.w = quaternion.w / scalar; - return result; - } - static computeAxis(quaternion, result) { - const w = quaternion.w; - if (Math.abs(w - 1.0) < GMath.EPSILON6) { - result.x = result.y = result.z = 0; - return result; - } - const scalar = 1.0 / Math.sqrt(1.0 - w * w); - result.x = quaternion.x * scalar; - result.y = quaternion.y * scalar; - result.z = quaternion.z * scalar; - return result; - } - static computeAngle(quaternion) { - if (Math.abs(quaternion.w - 1.0) < GMath.EPSILON6) { - return 0.0; - } - return 2.0 * Math.acos(quaternion.w); - } - static lerp(start, end, t, result) { - lerpScratch = Quaternion.multiplyByScalar(end, t, lerpScratch); - result = Quaternion.multiplyByScalar(start, 1.0 - t, result); - return Quaternion.add(lerpScratch, result, result); - } - static slerp(start, end, t, result) { - let dot = Quaternion.dot(start, end); - // The angle between start must be acute. Since q and -q represent - // the same rotation, negate q to get the acute angle. - let r = end; - if (dot < 0.0) { - dot = -dot; - r = slerpEndNegated = Quaternion.negate(end, slerpEndNegated); - } - // dot > 0, as the dot product approaches 1, the angle between the - // quaternions vanishes. use linear interpolation. - if (1.0 - dot < GMath.EPSILON6) { - return Quaternion.lerp(start, r, t, result); - } - const theta = Math.acos(dot); - slerpScaledP = Quaternion.multiplyByScalar(start, Math.sin((1 - t) * theta), slerpScaledP); - slerpScaledR = Quaternion.multiplyByScalar(r, Math.sin(t * theta), slerpScaledR); - result = Quaternion.add(slerpScaledP, slerpScaledR, result); - return Quaternion.multiplyByScalar(result, 1.0 / Math.sin(theta), result); - } - static squad(q0, q1, s0, s1, t, result) { - const slerp0 = Quaternion.slerp(q0, q1, t, squadScratchQuaternion0); - const slerp1 = Quaternion.slerp(s0, s1, t, squadScratchQuaternion1); - return Quaternion.slerp(slerp0, slerp1, 2.0 * t * (1.0 - t), result); - } - static equals(left, right) { - return ( - left === right || - (defined(left) && - defined(right) && - left.x === right.x && - left.y === right.y && - left.z === right.z && - left.w === right.w) - ); - } - static equalsEpsilon(left, right, epsilon = 0) { - epsilon = defaultValue(epsilon, 0); - return ( - left === right || - (defined(left) && - defined(right) && - Math.abs(left.x - right.x) <= epsilon && - Math.abs(left.y - right.y) <= epsilon && - Math.abs(left.z - right.z) <= epsilon && - Math.abs(left.w - right.w) <= epsilon) - ); - } - static exp(cartesian, result) { - const theta = Vector3.magnitude(cartesian); - let sinThetaOverTheta = 0.0; - if (theta !== 0.0) { - sinThetaOverTheta = Math.sin(theta) / theta; - } - result.x = cartesian.x * sinThetaOverTheta; - result.y = cartesian.y * sinThetaOverTheta; - result.z = cartesian.z * sinThetaOverTheta; - result.w = Math.cos(theta); - return result; - } -} -Quaternion.ZERO = Object.freeze(new Quaternion(0.0, 0.0, 0.0, 0.0)); -Quaternion.IDENTITY = Object.freeze(new Quaternion(0.0, 0.0, 0.0, 1.0)); -let fromAxisAngleScratch = new Vector3(); -new Array(3); -let lerpScratch = new Quaternion(); -let slerpEndNegated = new Quaternion(); -let slerpScaledP = new Quaternion(); -let slerpScaledR = new Quaternion(); -new Vector3(); -new Vector3(); -const squadScratchQuaternion0 = new Quaternion(); -const squadScratchQuaternion1 = new Quaternion(); - -class RenderObject { - constructor() { - this._position = new Vector3(); - this._scale = new Vector3(1, 1, 1); - this._quaternion = new Quaternion(); - this.modelMatrix = Matrix4.clone(Matrix4.IDENTITY, new Matrix4()); - this._normalMatrix = Matrix4.clone(Matrix4.IDENTITY, new Matrix4()); - this.up = new Vector3(0, 1, 0); - this._target = new Vector3(0, 0, 0); - } - get normalMatrix() { - return this._normalMatrix; - } - get position() { - return this._position; - } - get scale() { - return this._scale; - } - get quaternion() { - return this._quaternion; - } - updateNormalMatrix() { - Matrix4.inverse(this.modelMatrix, this._normalMatrix); - Matrix4.transpose(this._normalMatrix, this._normalMatrix); - } - updateMatrix(matrix) { - this.modelMatrix.compose(this.position, this.quaternion, this.scale); - if (matrix) Matrix4.multiply(matrix, this.modelMatrix, this.modelMatrix); - this.updateNormalMatrix(); - } - lookAt(x, y, z) { - this._target.set(x, y, z); - if (this.type == RenderObjectType.Camera || this.type == RenderObjectType.Light) { - _m1.lookAt(this.position, this._target, this.up); - } else { - _m1.lookAt(this._target, this.position, this.up); - } - this.quaternion.setFromRotationMatrix(_m1); - } - rotateOnAxis(axis, angle) { - const quat = Quaternion.fromAxisAngle(axis, angle); - Quaternion.multiply(this.quaternion, quat, this.quaternion); - } - rotateX(angle) { - return this.rotateOnAxis(_xAxis, angle); - } - rotateY(angle) { - return this.rotateOnAxis(_yAxis, angle); - } - rotateZ(angle) { - return this.rotateOnAxis(_zAxis, angle); - } -} -const _xAxis = new Vector3(1, 0, 0); -const _yAxis = new Vector3(0, 1, 0); -const _zAxis = new Vector3(0, 0, 1); -const _m1 = new Matrix4(); - -class Light extends RenderObject { - constructor(color, intensity) { - super(); - this.type = RenderObjectType.Light; - this._color = Vector3.multiplyByScalar(color, intensity, new Vector3()); - this._intensity = intensity; - this._position = new Vector3(0, 1, 0); - this._target = new Vector3(); - this.positionDirty = true; - this.targetDirty = true; - this.colorDirty = true; - this.shadowDirty = true; - this.intensityDirty = true; - this._shadow = null; - } - get position() { - return this._position; - } - set position(value) { - this.positionDirty = true; - this._position = value; - } - get target() { - return this._target; - } - set target(value) { - this.targetDirty = true; - this._target = value; - } - get color() { - return this._color; - } - set color(value) { - this.colorDirty = true; - this._color = value; - } - set intensity(value) { - this.color = Vector3.multiplyByScalar(this.color, value, new Vector3()); - this.intensityDirty = true; - this._intensity = value; - } - get intensity() { - return this._intensity; - } - get shadow() { - return this._shadow; - } - set shadow(value) { - this.shadowDirty = true; - this._shadow = value; - } -} - -// #rgba -const rgbaMatcher = /^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i; -// #rrggbbaa -const rrggbbaaMatcher = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i; -// rgb(), rgba(), or rgb%() -const rgbParenthesesMatcher = /^rgba?\(\s*([0-9.]+%?)\s*,\s*([0-9.]+%?)\s*,\s*([0-9.]+%?)(?:\s*,\s*([0-9.]+))?\s*\)$/i; -// hsl() or hsla() -const hslParenthesesMatcher = /^hsla?\(\s*([0-9.]+)\s*,\s*([0-9.]+%)\s*,\s*([0-9.]+%)(?:\s*,\s*([0-9.]+))?\s*\)$/i; -function hue2rgb(m1, m2, h) { - if (h < 0) { - h += 1; - } - if (h > 1) { - h -= 1; - } - if (h * 6 < 1) { - return m1 + (m2 - m1) * 6 * h; - } - if (h * 2 < 1) { - return m2; - } - if (h * 3 < 2) { - return m1 + (m2 - m1) * (2 / 3 - h) * 6; - } - return m1; -} -class Color { - constructor(red = 1.0, green = 1.0, blue = 1.0) { - /** - * The red component. - * @type {Number} - * @default 1.0 - */ - this.red = red; - /** - * The green component. - * @type {Number} - * @default 1.0 - */ - this.green = green; - /** - * The blue component. - * @type {Number} - * @default 1.0 - */ - this.blue = blue; - } - set(value) { - if (typeof value === "string") { - Color.fromCssColorString(value, this); - } - return this; - } - toArray() { - return [this.red, this.green, this.blue]; - } - clone(result) { - return Color.clone(this, result); - } - equals(other) { - return Color.equals(this, other); - } - toCssHexString() { - let r = Color.floatToByte(this.red).toString(16); - if (r.length < 2) { - r = `0${r}`; - } - let g = Color.floatToByte(this.green).toString(16); - if (g.length < 2) { - g = `0${g}`; - } - let b = Color.floatToByte(this.blue).toString(16); - if (b.length < 2) { - b = `0${b}`; - } - return `#${r}${g}${b}`; - } - toBytes(result) { - const red = Color.floatToByte(this.red); - const green = Color.floatToByte(this.green); - const blue = Color.floatToByte(this.blue); - if (!defined(result)) { - return [red, green, blue]; - } - result[0] = red; - result[1] = green; - result[2] = blue; - return result; - } - static fromBytes(red, green, blue, result) { - red = Color.byteToFloat(defaultValue(red, 255.0)); - green = Color.byteToFloat(defaultValue(green, 255.0)); - blue = Color.byteToFloat(defaultValue(blue, 255.0)); - if (!defined(result)) { - return new Color(red, green, blue); - } - result.red = red; - result.green = green; - result.blue = blue; - return result; - } - static fromHsl(hue, saturation, lightness, result) { - hue = defaultValue(hue, 0.0) % 1.0; - saturation = defaultValue(saturation, 0.0); - lightness = defaultValue(lightness, 0.0); - let red = lightness; - let green = lightness; - let blue = lightness; - if (saturation !== 0) { - let m2; - if (lightness < 0.5) { - m2 = lightness * (1 + saturation); - } else { - m2 = lightness + saturation - lightness * saturation; - } - const m1 = 2.0 * lightness - m2; - red = hue2rgb(m1, m2, hue + 1 / 3); - green = hue2rgb(m1, m2, hue); - blue = hue2rgb(m1, m2, hue - 1 / 3); - } - if (!defined(result)) { - return new Color(red, green, blue); - } - result.red = red; - result.green = green; - result.blue = blue; - return result; - } - /** - * Creates a random color using the provided options. For reproducible random colors, you should - * call {@link GMath#setRandomNumberSeed} once at the beginning of your application. - * - * @param {Object} [options] Object with the following properties: - * @param {Number} [options.red] If specified, the red component to use instead of a randomized value. - * @param {Number} [options.minimumRed=0.0] The maximum red value to generate if none was specified. - * @param {Number} [options.maximumRed=1.0] The minimum red value to generate if none was specified. - * @param {Number} [options.green] If specified, the green component to use instead of a randomized value. - * @param {Number} [options.minimumGreen=0.0] The maximum green value to generate if none was specified. - * @param {Number} [options.maximumGreen=1.0] The minimum green value to generate if none was specified. - * @param {Number} [options.blue] If specified, the blue component to use instead of a randomized value. - * @param {Number} [options.minimumBlue=0.0] The maximum blue value to generate if none was specified. - * @param {Number} [options.maximumBlue=1.0] The minimum blue value to generate if none was specified. - * @param {Color} [result] The object to store the result in, if undefined a new instance will be created. - * @returns {Color} The modified result parameter or a new instance if result was undefined. - * - * @example - * //Create a completely random color - * const color = Color.fromRandom(); - * - * //Create a random shade of yellow. - * const color1 = Color.fromRandom({ - * red : 1.0, - * green : 1.0, - * }); - * - * //Create a random bright color. - * const color2 = Color.fromRandom({ - * minimumRed : 0.75, - * minimumGreen : 0.75, - * minimumBlue : 0.75, - * }); - */ - static fromRandom(options, result) { - options = defaultValue(options, defaultValue.EMPTY_OBJECT); - let red = options.red; - if (!defined(red)) { - const minimumRed = defaultValue(options.minimumRed, 0); - const maximumRed = defaultValue(options.maximumRed, 1.0); - red = minimumRed + GMath.nextRandomNumber() * (maximumRed - minimumRed); - } - let green = options.green; - if (!defined(green)) { - const minimumGreen = defaultValue(options.minimumGreen, 0); - const maximumGreen = defaultValue(options.maximumGreen, 1.0); - green = minimumGreen + GMath.nextRandomNumber() * (maximumGreen - minimumGreen); - } - let blue = options.blue; - if (!defined(blue)) { - const minimumBlue = defaultValue(options.minimumBlue, 0); - const maximumBlue = defaultValue(options.maximumBlue, 1.0); - blue = minimumBlue + GMath.nextRandomNumber() * (maximumBlue - minimumBlue); - } - if (!defined(result)) { - return new Color(red, green, blue); - } - result.red = red; - result.green = green; - result.blue = blue; - return result; - } - static fromCssColorString(color, result = new Color()) { - // Remove all whitespaces from the color string - color = color.replace(/\s/g, ""); - const namedColor = Color[color.toUpperCase()]; - if (defined(namedColor)) { - Color.clone(namedColor, result); - return result; - } - let matches = rgbaMatcher.exec(color); - if (matches !== null) { - result.red = parseInt(matches[1], 16) / 15; - result.green = parseInt(matches[2], 16) / 15.0; - result.blue = parseInt(matches[3], 16) / 15.0; - return result; - } - matches = rrggbbaaMatcher.exec(color); - if (matches !== null) { - result.red = parseInt(matches[1], 16) / 255.0; - result.green = parseInt(matches[2], 16) / 255.0; - result.blue = parseInt(matches[3], 16) / 255.0; - return result; - } - matches = rgbParenthesesMatcher.exec(color); - if (matches !== null) { - result.red = parseFloat(matches[1]) / ("%" === matches[1].substr(-1) ? 100.0 : 255.0); - result.green = parseFloat(matches[2]) / ("%" === matches[2].substr(-1) ? 100.0 : 255.0); - result.blue = parseFloat(matches[3]) / ("%" === matches[3].substr(-1) ? 100.0 : 255.0); - return result; - } - matches = hslParenthesesMatcher.exec(color); - if (matches !== null) { - return Color.fromHsl( - parseFloat(matches[1]) / 360.0, - parseFloat(matches[2]) / 100.0, - parseFloat(matches[3]) / 100.0, - result - ); - } - result = undefined; - return result; - } - static byteToFloat(value) { - return value / 255.0; - } - static floatToByte(value) { - return value === 1.0 ? 255.0 : (value * 256.0) | 0; - } - static clone(color, result) { - if (!defined(color)) { - return undefined; - } - if (!defined(result)) { - return new Color(color.red, color.green, color.blue); - } - result.red = color.red; - result.green = color.green; - result.blue = color.blue; - return result; - } - static equals(left, right) { - return ( - left === right || // - (defined(left) && // - defined(right) && // - left.red === right.red && // - left.green === right.green && // - left.blue === right.blue) - ); - } - /** - * @private - */ - static equalsArray(color, array, offset) { - return color.red === array[offset] && color.green === array[offset + 1] && color.blue === array[offset + 2]; - } -} - -/** - * A 2x2 matrix, indexable as a column-major order array. - * @param {Number} [column0Row0=0.0] The value for column 0, row 0. - * @param {Number} [column1Row0=0.0] The value for column 1, row 0. - * @param {Number} [column0Row1=0.0] The value for column 0, row 1. - * @param {Number} [column1Row1=0.0] The value for column 1, row 1. - */ -class Matrix2 { - constructor(column0Row0 = 0, column1Row0 = 0, column0Row1 = 0, column1Row1 = 0) { - this[0] = column0Row0; - this[1] = column0Row1; - this[2] = column1Row0; - this[3] = column1Row1; - } - static clone(matrix, result) { - if (!defined(matrix)) { - return undefined; - } - if (!defined(result)) { - return new Matrix2(matrix[0], matrix[2], matrix[1], matrix[3]); - } - result[0] = matrix[0]; - result[1] = matrix[1]; - result[2] = matrix[2]; - result[3] = matrix[3]; - return result; - } - static fromColumnMajorArray(values, result) { - return Matrix2.clone(values, result); - } - static fromRowMajorArray(values, result) { - if (!defined(result)) { - return new Matrix2(values[0], values[1], values[2], values[3]); - } - result[0] = values[0]; - result[1] = values[2]; - result[2] = values[1]; - result[3] = values[3]; - return result; - } - static fromScale(scale, result) { - if (!defined(result)) { - return new Matrix2(scale.x, 0.0, 0.0, scale.y); - } - result[0] = scale.x; - result[1] = 0.0; - result[2] = 0.0; - result[3] = scale.y; - return result; - } - static fromRotation(angle, result) { - const cosAngle = Math.cos(angle); - const sinAngle = Math.sin(angle); - if (!defined(result)) { - return new Matrix2(cosAngle, -sinAngle, sinAngle, cosAngle); - } - result[0] = cosAngle; - result[1] = sinAngle; - result[2] = -sinAngle; - result[3] = cosAngle; - return result; - } - toArray() { - const result = []; - Matrix2.toArray(this, result); - return result; - } - static toArray(matrix, result) { - if (!defined(result)) { - return [matrix[0], matrix[1], matrix[2], matrix[3]]; - } - result[0] = matrix[0]; - result[1] = matrix[1]; - result[2] = matrix[2]; - result[3] = matrix[3]; - return result; - } - static getElementIndex(column, row) { - return column * 2 + row; - } - static getColumn(matrix, index, result) { - const startIndex = index * 2; - const x = matrix[startIndex]; - const y = matrix[startIndex + 1]; - result.x = x; - result.y = y; - return result; - } - static setColumn(matrix, index, cartesian, result) { - result = Matrix2.clone(matrix, result); - const startIndex = index * 2; - result[startIndex] = cartesian.x; - result[startIndex + 1] = cartesian.y; - return result; - } - static getRow(matrix, index, result) { - const x = matrix[index]; - const y = matrix[index + 2]; - result.x = x; - result.y = y; - return result; - } - static setRow(matrix, index, cartesian, result) { - result = Matrix2.clone(matrix, result); - result[index] = cartesian.x; - result[index + 2] = cartesian.y; - return result; - } - static setScale(matrix, scale, result) { - const existingScale = Matrix2.getScale(matrix, scaleScratch1); - const scaleRatioX = scale.x / existingScale.x; - const scaleRatioY = scale.y / existingScale.y; - result[0] = matrix[0] * scaleRatioX; - result[1] = matrix[1] * scaleRatioX; - result[2] = matrix[2] * scaleRatioY; - result[3] = matrix[3] * scaleRatioY; - return result; - } - static getScale(matrix, result) { - result.x = Vector2.magnitude(Vector2.fromElements(matrix[0], matrix[1], scratchColumn)); - result.y = Vector2.magnitude(Vector2.fromElements(matrix[2], matrix[3], scratchColumn)); - return result; - } - static getMaximumScale(matrix) { - Matrix2.getScale(matrix, scaleScratch3); - return Vector2.maximumComponent(scaleScratch3); - } - static setRotation(matrix, rotation, result) { - const scale = Matrix2.getScale(matrix, scaleScratch4); - result[0] = rotation[0] * scale.x; - result[1] = rotation[1] * scale.x; - result[2] = rotation[2] * scale.y; - result[3] = rotation[3] * scale.y; - return result; - } - static getRotation(matrix, result) { - const scale = Matrix2.getScale(matrix, scaleScratch5); - result[0] = matrix[0] / scale.x; - result[1] = matrix[1] / scale.x; - result[2] = matrix[2] / scale.y; - result[3] = matrix[3] / scale.y; - return result; - } - static multiply(left, right, result) { - const column0Row0 = left[0] * right[0] + left[2] * right[1]; - const column1Row0 = left[0] * right[2] + left[2] * right[3]; - const column0Row1 = left[1] * right[0] + left[3] * right[1]; - const column1Row1 = left[1] * right[2] + left[3] * right[3]; - result[0] = column0Row0; - result[1] = column0Row1; - result[2] = column1Row0; - result[3] = column1Row1; - return result; - } - static add(left, right, result) { - result[0] = left[0] + right[0]; - result[1] = left[1] + right[1]; - result[2] = left[2] + right[2]; - result[3] = left[3] + right[3]; - return result; - } - static subtract(left, right, result) { - result[0] = left[0] - right[0]; - result[1] = left[1] - right[1]; - result[2] = left[2] - right[2]; - result[3] = left[3] - right[3]; - return result; - } - static multiplyByVector(matrix, cartesian, result) { - const x = matrix[0] * cartesian.x + matrix[2] * cartesian.y; - const y = matrix[1] * cartesian.x + matrix[3] * cartesian.y; - result.x = x; - result.y = y; - return result; - } - static multiplyByScalar(matrix, scalar, result) { - result[0] = matrix[0] * scalar; - result[1] = matrix[1] * scalar; - result[2] = matrix[2] * scalar; - result[3] = matrix[3] * scalar; - return result; - } - static multiplyByScale(matrix, scale, result) { - result[0] = matrix[0] * scale.x; - result[1] = matrix[1] * scale.x; - result[2] = matrix[2] * scale.y; - result[3] = matrix[3] * scale.y; - return result; - } - static negate(matrix, result) { - result[0] = -matrix[0]; - result[1] = -matrix[1]; - result[2] = -matrix[2]; - result[3] = -matrix[3]; - return result; - } - static transpose(matrix, result) { - const column0Row0 = matrix[0]; - const column0Row1 = matrix[2]; - const column1Row0 = matrix[1]; - const column1Row1 = matrix[3]; - result[0] = column0Row0; - result[1] = column0Row1; - result[2] = column1Row0; - result[3] = column1Row1; - return result; - } - static abs(matrix, result) { - result[0] = Math.abs(matrix[0]); - result[1] = Math.abs(matrix[1]); - result[2] = Math.abs(matrix[2]); - result[3] = Math.abs(matrix[3]); - return result; - } - static equals(left, right) { - return ( - left === right || - (defined(left) && - defined(right) && - left[0] === right[0] && - left[1] === right[1] && - left[2] === right[2] && - left[3] === right[3]) - ); - } - /** - * @private - */ - static equalsArray(matrix, array, offset) { - return ( - matrix[0] === array[offset] && - matrix[1] === array[offset + 1] && - matrix[2] === array[offset + 2] && - matrix[3] === array[offset + 3] - ); - } - static equalsEpsilon(left, right, epsilon = 0) { - epsilon = defaultValue(epsilon, 0); - return ( - left === right || - (defined(left) && - defined(right) && - Math.abs(left[0] - right[0]) <= epsilon && - Math.abs(left[1] - right[1]) <= epsilon && - Math.abs(left[2] - right[2]) <= epsilon && - Math.abs(left[3] - right[3]) <= epsilon) - ); - } - clone(result) { - return Matrix2.clone(this, result); - } - equals(right) { - return Matrix2.equals(this, right); - } - equalsEpsilon(right, epsilon = 0) { - return Matrix2.equalsEpsilon(this, right, epsilon); - } - toString() { - return `(${this[0]}, ${this[2]})\n` + `(${this[1]}, ${this[3]})`; - } -} -Matrix2.IDENTITY = Object.freeze(new Matrix2(1.0, 0.0, 0.0, 1.0)); -Matrix2.ZERO = Object.freeze(new Matrix2(0.0, 0.0, 0.0, 0.0)); -const scaleScratch1 = new Vector2(); -new Vector2(); -const scaleScratch3 = new Vector2(); -const scaleScratch4 = new Vector2(); -const scratchColumn = new Vector2(); -const scaleScratch5 = new Vector2(); - -class Uniform { - constructor(uniformName, cb, offset) { - this.name = uniformName; - this.cb = cb; - this.offset = defaultValue(offset, 0); - this.type = "number"; - } - setBuffer(array, offset = 0) { - for (let i = 0; i < array.length; i++) { - this.buffer[i + offset] = array[i]; - } - } - set() { - return undefined; - } - getValue() { - let result; - const cbType = typeof this.cb; - switch (cbType) { - case "object": - result = this.cb[this.name] || this.cb; - break; - case "function": - // @ts-ignore - result = this.cb(); - break; - case "number": - result = this.cb; - break; - default: - throw new Error("type is error"); - } - return result; - } - // compare array - equals(v) { - if (this._value.length !== v.length) return false; - for (let i = 0; i < v.length; i++) { - if (v[i] !== this._value[i]) { - return false; - } - } - return true; - } -} -class UniformUint extends Uniform { - constructor(uniformName, buffer, byteOffset, cb, offset) { - super(uniformName, cb, offset); - this.value = undefined; - this._value = 0; - this.byteSize = 4; - this.buffer = new Uint32Array(buffer.buffer, byteOffset, 1); - this.type = "uint"; - } - set() { - if (this.cb != undefined) this.value = this.getValue(); - if (this.value !== this._value) { - this._value = this.value; - this.buffer[0] = this.value; - return true; - } - return false; - } -} -UniformUint.align = 4; -class UniformFloat extends Uniform { - constructor(uniformName, buffer, byteOffset, cb, offset) { - super(uniformName, cb, offset); - this.value = undefined; - this._value = 0; - this.byteSize = 4; - this.buffer = new Float32Array(buffer.buffer, byteOffset, 1); - this.type = "vec1"; - } - set() { - if (this.cb != undefined) this.value = this.getValue(); - if (this.value !== this._value) { - this._value = this.value; - this.buffer[0] = this.value; - return true; - } - return false; - } -} -UniformFloat.align = 4; -class UniformFloatVec2 extends Uniform { - constructor(uniformName, buffer, byteOffset, cb, offset) { - super(uniformName, cb, offset); - this.value = undefined; - this._value = new Vector2(); - this.buffer = new Float32Array(buffer.buffer, byteOffset, 2); - this.byteSize = 8; - this.type = "vec2"; - } - set() { - if (this.cb != undefined) this.value = this.getValue(); - const v = this.value; - if (v instanceof Vector2) { - if (Vector2.equals(v, this._value)) return false; - Vector2.clone(v, this._value); - this.setBuffer(this._value.toArray()); - return true; - } else { - if (this.equals(v)) return false; - this._value = v; - this.setBuffer(v); - return true; - } - } -} -UniformFloatVec2.align = 8; -class UniformFloatVec3 extends Uniform { - constructor(uniformName, buffer, byteOffset, cb, offset) { - super(uniformName, cb, offset); - this.value = undefined; - this._value = new Vector3(); - this.buffer = new Float32Array(buffer.buffer, byteOffset, 3); - this.byteSize = 12; - this.type = "vec3"; - } - set() { - if (this.cb != undefined) this.value = this.getValue(); - const v = this.value; - if (v instanceof Vector3) { - if (Vector3.equals(v, this._value)) return false; - Vector3.clone(v, this._value); - this.setBuffer(this._value.toArray()); - return true; - } else { - if (this.equals(v)) return false; - this._value = v; - this.setBuffer(v); - return true; - } - } -} -UniformFloatVec3.align = 16; -class UniformFloatVec4 extends Uniform { - constructor(uniformName, buffer, byteOffset, cb, offset) { - super(uniformName, cb, offset); - this.value = undefined; - this._value = new Vector4(); - this.buffer = new Float32Array(buffer.buffer, byteOffset, 4); - this.byteSize = 16; - this.type = "vec4"; - } - set() { - if (this.cb != undefined) this.value = this.getValue(); - const v = this.value; - if (v instanceof Vector4) { - if (Vector4.equals(v, this._value)) return false; - Vector4.clone(v, this._value); - this.setBuffer(this._value.toArray()); - return true; - } else { - if (this.equals(v)) return false; - this._value = v; - this.setBuffer(v); - return true; - } - } -} -UniformFloatVec4.align = 16; -class UniformColor extends Uniform { - constructor(uniformName, buffer, byteOffset, cb, offset) { - super(uniformName, cb, offset); - this.value = undefined; - this._value = new Color(); - this.buffer = new Float32Array(buffer.buffer, byteOffset, 3); - this.byteSize = 12; - this.type = "vec3"; - } - set() { - if (this.cb != undefined) this.value = this.getValue(); - const v = this.value; - if (v instanceof Color) { - if (Color.equals(v, this._value)) return false; - Color.clone(v, this._value); - this.setBuffer(this._value.toArray()); - return true; - } else { - if (this.equals(v)) return false; - this._value = v; - this.setBuffer(v); - return true; - } - } -} -UniformColor.align = 16; -class UniformMat2 extends Uniform { - constructor(uniformName, buffer, byteOffset, cb, offset) { - super(uniformName, cb, offset); - this.value = undefined; - this._value = new Matrix2(); - this.buffer = new Float32Array(buffer.buffer, byteOffset, 4); - this.byteSize = 16; - this.type = "mat2"; - } - set() { - if (this.cb != undefined) this.value = this.getValue(); - const v = this.value; - if (v instanceof Matrix2) { - if (Matrix2.equals(v, this._value)) return false; - Matrix2.clone(v, this._value); - this.setBuffer(this._value.toArray()); - return true; - } else { - if (this.equals(v)) return false; - this._value = v; - this.setBuffer(v); - return true; - } - } -} -UniformMat2.align = 8; -class UniformMat3 extends Uniform { - constructor(uniformName, buffer, byteOffset, cb, offset) { - super(uniformName, cb, offset); - this.value = undefined; - this._value = new Matrix3(); - this.buffer = new Float32Array(buffer.buffer, byteOffset, 9); - this.byteSize = 48; - this.type = "mat3"; - } - set() { - if (this.cb != undefined) this.value = this.getValue(); - const v = this.value; - if (v instanceof Matrix3) { - if (Matrix3.equals(v, this._value)) return false; - Matrix3.clone(v, this._value); - this.setBuffer(this._value.toArray()); - return true; - } else { - if (this.equals(v)) return false; - this._value = v; - this.setBuffer(v); - return true; - } - } -} -UniformMat3.align = 16; -class UniformMat4 extends Uniform { - constructor(uniformName, buffer, byteOffset, cb, offset) { - super(uniformName, cb, offset); - this.value = undefined; - this._value = new Matrix4(); - this.buffer = new Float32Array(buffer.buffer, byteOffset, 16); - this.byteSize = 64; - this.type = "mat4"; - } - set() { - if (this.cb != undefined) this.value = this.getValue(); - const v = this.value; - if (v instanceof Matrix4) { - if (Matrix4.equals(v, this._value)) return false; - Matrix4.clone(v, this._value); - this.setBuffer(this._value.toArray()); - return true; - } else { - // if(this.equals(v)) return false; - this._value = v; - this.setBuffer(v); - return true; - } - } -} -UniformMat4.align = 16; -class UniformMatrix4Array extends Uniform { - constructor(uniformName, buffer, byteOffset, cb, count) { - super(uniformName, cb, 0); - this.byteSize = count * 64; - this.buffer = new Float32Array(buffer.buffer, byteOffset, this.byteSize / 4); - this.type = "mat4-array"; - } - set() { - this.value = this.getValue(); - if (!this.value) return false; - for (let i = 0; i < this.value.length; i++) { - this.setBuffer(this.value[i].toArray(), i * 16); - } - return true; - } -} -UniformMatrix4Array.align = 16; -class UniformFloatArray extends Uniform { - // cb: Function; - constructor(uniformName, buffer, byteOffset, cb, count) { - super(uniformName, cb, 0); - this.buffer = new Float32Array(buffer.buffer, byteOffset, count); - this.byteSize = 4 * count; - this.type = "float-array"; - } - set() { - this.value = this.getValue(); - for (let i = 0; i < this.value.length; i++) { - this.buffer[i] = this.value[i]; - } - return true; - } -} -UniformFloatArray.align = 4; -class UniformVec2Array extends Uniform { - constructor(uniformName, buffer, byteOffset, cb, count) { - super(uniformName, cb, 0); - this.byteSize = count * 8; - this.buffer = new Float32Array(buffer.buffer, byteOffset, this.byteSize / 4); - this.type = "vec2-array"; - } - set() { - // this.value = this.cb(); - this.value = this.getValue(); - let j = 0; - for (let i = 0; i < this.value.length; i++) { - this.buffer[j] = this.value[i].x; - this.buffer[j + 1] = this.value[i].y; - j += 2; - } - return true; - } -} -UniformVec2Array.align = 8; -class UniformVec3Array extends Uniform { - // cb: Function; - constructor(uniformName, buffer, byteOffset, cb, count) { - super(uniformName, cb, 0); - this.byteSize = count * 16; - this.buffer = new Float32Array(buffer.buffer, byteOffset, this.byteSize / 4); - this.type = "vec3-array"; - } - set() { - // this.value = this.cb(); - this.value = this.getValue(); - let j = 0; - for (let i = 0; i < this.value.length; i++) { - this.buffer[j] = this.value[i].x; - this.buffer[j + 1] = this.value[i].y; - this.buffer[j + 2] = this.value[i].z; - this.buffer[j + 3] = 0; - j += 4; - } - return true; - } -} -UniformVec3Array.align = 16; -class UniformVec4Array extends Uniform { - // cb: Function; - constructor(uniformName, buffer, byteOffset, cb, count) { - super(uniformName, cb, 0); - this.byteSize = count * 16; - this.buffer = new Float32Array(buffer.buffer, byteOffset, this.byteSize / 4); - this.type = "vec4-array"; - } - set() { - this.value = this.getValue(); - let j = 0; - for (let i = 0; i < this.value.length; i++) { - this.buffer[j] = this.value[i].x; - this.buffer[j + 1] = this.value[i].y; - this.buffer[j + 2] = this.value[i].z; - this.buffer[j + 3] = this.value[i].w; - j += 4; - } - return true; - } -} -UniformVec4Array.align = 16; -class UniformTexture extends Uniform { - constructor(uniformName, binding, texture, type, visibility, textureView) { - super(uniformName, undefined, 0); - this.binding = binding; - this.visibility = defaultValue(visibility, ShaderStage.Vertex | ShaderStage.Fragment); - this.textureView = textureView; - this.type = type ?? "texture"; - this.isTexture = true; - this._texture = texture; - } - get layoutType() { - return this.texture?.layoutType || "not yet bind"; - } - get storageTextureLayoutType() { - return this.texture?.storageTextureLayoutType || "not yet bind"; - } - bind(device) { - if (!this._texture) return; - this.texture = this._texture instanceof Function ? this._texture() : this._texture; - this.texture.update(device); - } -} -class UniformSampler extends Uniform { - constructor(uniformName, binding, sampler, visibility) { - super(uniformName, undefined, 0); - this.visibility = defaultValue(visibility, ShaderStage.Vertex | ShaderStage.Fragment); - this.name = uniformName; - this.binding = binding; - this.type = "sampler"; - this.isSampler = true; - this._sampler = sampler; - } - get layoutType() { - return this.sampler?.layoutType || "not yet bind"; - } - bind(device) { - this.sampler = this._sampler instanceof Function ? this._sampler() : this._sampler; - this.sampler.update(device); - } -} -class UniformStructArray extends Uniform { - constructor(uniformName, buffer, byteOffset, cb, offset) { - super(uniformName, cb, offset); - this.cb = cb; - this.type = "struct-array"; - this.dirty = false; - this.byteOffset = byteOffset; - this.sourceBuffer = buffer; - } - set() { - // - this.structArray = this.getValue(); - this.byteSize = this.getStructSize(); - this.buffer = new Float32Array(this.sourceBuffer.buffer, this.byteOffset, this.byteSize / 4); - this.setSubData(); - return true; - } - setSubData() { - this.structArray.forEach((struct) => { - const keys = Object.keys(struct); - keys.forEach((key) => { - const data = Array.isArray(struct[key]?.value) ? struct[key]?.value : (struct[key]?.value).toArray(); - setDataToTypeArray(this.buffer, data, struct[key].offset); - }); - }); - } - getStructSize() { - let byteOffset = 0; - this.structArray.forEach((struct) => { - const keys = Object.keys(struct); - keys.forEach((key) => { - byteOffset += UniformBuffer.checkUniformOffset(byteOffset, UniformStructArray.aligns[struct[key].type]); - struct[key].offset = byteOffset; - this.byteOffset += UniformStructArray.byteSizes[struct[key].type]; - }); - }); - return byteOffset; - } -} -UniformStructArray.align = 16; -UniformStructArray.aligns = { - [UniformEnum.UniformUint]: 4, - [UniformEnum.Float]: 4, - [UniformEnum.FloatVec2]: 8, - [UniformEnum.FloatVec3]: 16, - [UniformEnum.FloatVec4]: 16, - [UniformEnum.Mat2]: 8, - [UniformEnum.Mat3]: 16, - [UniformEnum.Mat4]: 16, - [UniformEnum.Color]: 16 -}; -UniformStructArray.byteSizes = { - [UniformEnum.UniformUint]: 4, - [UniformEnum.Float]: 4, - [UniformEnum.FloatVec2]: 8, - [UniformEnum.FloatVec3]: 12, - [UniformEnum.FloatVec4]: 16, - [UniformEnum.Mat2]: 16, - [UniformEnum.Mat3]: 48, - [UniformEnum.Mat4]: 64, - [UniformEnum.Color]: 12 -}; -class UniformSpotLights extends Uniform { - // cb: Function; - constructor(uniformName, buffer, byteOffset, cb, count) { - super(uniformName, cb, 0); - this.cb = cb; - this.byteSize = count * 64; - this.buffer = new Float32Array(buffer.buffer, byteOffset, this.byteSize / 4); - this.type = "spotsLight"; - this.dirty = false; - } - set() { - this.lights = this.getValue(); - this.lights.forEach((spotLight, index) => { - this.setSubData(spotLight, index); - }); - return this.dirty; - } - setSubData(spotLight, index) { - const offset = index * 16; - if (spotLight.positionDirty) { - this.dirty = setDataToTypeArray(this.buffer, spotLight.position.toArray(), offset + 0); // byteOffset=0; - } - if (spotLight.distanceDirty) { - this.dirty = setDataToTypeArray(this.buffer, spotLight.distance, offset + 3); // byteOffset=12; - } - if (spotLight.dirtectDirty) { - this.dirty = setDataToTypeArray(this.buffer, spotLight.directional.toArray(), offset + 4); // byteOffset=16; - } - if (spotLight.coneCosDirty) { - this.dirty = setDataToTypeArray(this.buffer, spotLight.coneCos, offset + 7); // byteOffset=28; - } - if (spotLight.colorDirty) { - this.dirty = setDataToTypeArray(this.buffer, spotLight.color.toArray(), offset + 8); // byteOffset=32; - } - if (spotLight.penumbraCosDirty) { - this.dirty = setDataToTypeArray(this.buffer, spotLight.penumbraCos, offset + 11); // byteOffset=44; - } - if (spotLight.decayDirty) { - this.dirty = setDataToTypeArray(this.buffer, spotLight.decay, offset + 12); // byteOffset=48; - } - spotLight.positionDirty = false; - spotLight.distanceDirty = false; - spotLight.dirtectDirty = false; - spotLight.coneCosDirty = false; - spotLight.colorDirty = false; - spotLight.penumbraCosDirty = false; - spotLight.decayDirty = false; - } -} -UniformSpotLights.align = 16; -class UniformSpotLightShadows extends Uniform { - constructor(uniformName, buffer, byteOffset, cb, count) { - super(uniformName, cb, 0); - const bytesPerElement = Float32Array.BYTES_PER_ELEMENT; - this._subDataSize = UniformSpotLightShadows.uniformSize; - this.byteSize = count * this._subDataSize * bytesPerElement; - this.buffer = new Float32Array(buffer.buffer, byteOffset, this.byteSize / 4); - this.type = "spotLightShadows"; - this._nearValue = null; - this._farValue = null; - } - set() { - this.lights = this.getValue(); - this.lights.forEach((spotLight, index) => { - this.setSubData(spotLight, index); - }); - return this.dirty; - } - setSubData(spotLight, index) { - const offset = index * this._subDataSize; - if (spotLight.shadow.vpMatrixDirty) { - spotLight.shadow.vpMatrixDirty = false; - this.dirty = setDataToTypeArray(this.buffer, spotLight.shadow.camera.vpMatrix.toArray(), offset + 0); // byteOffset=0; - } - const nearValue = spotLight.shadow.camera.near; - if (nearValue != this._nearValue) { - this._nearValue = nearValue; - this.dirty = setDataToTypeArray(this.buffer, this._nearValue, offset + 16); // byteOffset=0; - } - const farValue = spotLight.shadow.camera.far; - if (farValue != this._farValue) { - this._farValue = farValue; - this.dirty = setDataToTypeArray(this.buffer, this._farValue, offset + 17); // byteOffset=0; - } - } -} -UniformSpotLightShadows.align = 16; -UniformSpotLightShadows.uniformSize = 18; -class UniformPointLights extends Uniform { - // cb: Function; - constructor(uniformName, buffer, byteOffset, cb, count) { - super(uniformName, cb, 0); - this.byteSize = count * 32; - this.buffer = new Float32Array(buffer.buffer, byteOffset, this.byteSize / 4); - this.type = "pointsLight"; - } - set() { - this.lights = this.getValue(); - this.lights.forEach((pointLight, index) => { - this.setSubData(pointLight, index); - }); - return this.dirty; - } - setSubData(pointLight, index) { - const offset = index * 8; - if (pointLight.positionDirty) { - pointLight.positionDirty = false; - this.dirty = setDataToTypeArray(this.buffer, pointLight.position.toArray(), offset + 0); // byteOffset=0; - } - if (pointLight.distanceDirty) { - pointLight.distanceDirty = false; - this.dirty = setDataToTypeArray(this.buffer, pointLight.distance, offset + 3); // byteOffset=12; - } - if (pointLight.colorDirty) { - pointLight.colorDirty = false; - this.dirty = setDataToTypeArray(this.buffer, pointLight.color.toArray(), offset + 4); // byteOffset=32; - } - if (pointLight.decayDirty) { - pointLight.decayDirty = false; - this.dirty = setDataToTypeArray(this.buffer, pointLight.decay, offset + 7); // byteOffset=12; - } - } -} -UniformPointLights.align = 16; -class UniformPointLightShadows extends Uniform { - constructor(uniformName, buffer, byteOffset, cb, count) { - super(uniformName, cb, 0); - const bytesPerElement = Float32Array.BYTES_PER_ELEMENT; - this._subDataSize = UniformPointLightShadows.uniformSize; - this.byteSize = count * bytesPerElement * this._subDataSize; - this.buffer = new Float32Array(buffer.buffer, byteOffset, this.byteSize / 4); - this.type = "pointLightShadows"; - this._nearValue = null; - this._farValue = null; - } - set() { - this.lights = this.getValue(); - this.lights.forEach((pointLight, index) => { - this.setSubData(pointLight, index); - }); - return this.dirty; - } - setSubData(pointLight, index) { - const offset = index * this._subDataSize; - if (pointLight.shadow.vpMatrixArrayDirty) { - pointLight.shadow.vpMatrixArrayDirty = false; - const vpMatrixArray = pointLight.shadow.camera.vpMatrixArray; - for (let i = 0; i < vpMatrixArray.length; i++) { - const vpMatrix = vpMatrixArray[i]; - this.dirty = setDataToTypeArray(this.buffer, vpMatrix.toArray(), offset + 0 + 16 * i); // byteOffset=98 * 4; - } - } - if (pointLight.shadow.viewPortDirty) { - pointLight.shadow.viewPortDirty = false; - for (let i = 0; i < 6; i++) { - this.dirty = setDataToTypeArray( - this.buffer, - pointLight.shadow.viewports[i].toArray(), - offset + 96 + 4 * i - ); // byteOffset=0; - } - } - const nearValue = pointLight.shadow.camera.near; - if (nearValue != this._nearValue) { - this._nearValue = nearValue; - this.dirty = setDataToTypeArray(this.buffer, this._nearValue, offset + 120); // byteOffset=0; - } - const farValue = pointLight.shadow.camera.far; - if (farValue != this._farValue) { - this._farValue = farValue; - this.dirty = setDataToTypeArray(this.buffer, this._farValue, offset + 121); // byteOffset=1; - } - } -} -UniformPointLightShadows.align = 16; -UniformPointLightShadows.uniformSize = 122; -class UniformDirtectLights extends Uniform { - constructor(uniformName, buffer, byteOffset, cb, count) { - super(uniformName, cb, 0); - this.cb = cb; - this.byteSize = count * 32; - this.buffer = new Float32Array(buffer.buffer, byteOffset, this.byteSize / 4); - this.type = "dirtectLights"; - } - set() { - this.lights = this.getValue(); - this.lights.forEach((directionalLight, index) => { - this.setSubData(directionalLight, index); - }); - return this.dirty; - } - setSubData(directionalLight, index) { - const offset = index * 8; - if (directionalLight.dirtectDirty) { - directionalLight.dirtectDirty = false; - this.dirty = setDataToTypeArray(this.buffer, directionalLight.directional.toArray(), offset + 0); // byteOffset=16; - } - if (directionalLight.colorDirty) { - directionalLight.colorDirty = false; - this.dirty = setDataToTypeArray(this.buffer, directionalLight.color.toArray(), offset + 4); // byteOffset=32; - } - } -} -UniformDirtectLights.align = 16; -class UniformDirtectLightShadows extends Uniform { - constructor(uniformName, buffer, byteOffset, cb, count) { - super(uniformName, cb, 0); - const bytesPerElement = Float32Array.BYTES_PER_ELEMENT; - this._subDataSize = UniformDirtectLightShadows.uniformSize; - this.byteSize = count * bytesPerElement * this._subDataSize; - this.buffer = new Float32Array(buffer.buffer, byteOffset, this.byteSize / 4); - this.type = "dirtectLightShadows"; - } - set() { - this.lights = this.getValue(); - this.lights.forEach((directionalLight, index) => { - this.setSubData(directionalLight, index); - }); - return this.dirty; - } - setSubData(directionalLight, index) { - const offset = index * this._subDataSize; - if (directionalLight.shadow.vpMatrixDirty) { - directionalLight.shadow.vpMatrixDirty = false; - this.dirty = setDataToTypeArray(this.buffer, directionalLight.shadow.camera.vpMatrix.toArray(), offset + 0); // byteOffset=16; - } - } -} -UniformDirtectLightShadows.align = 16; -UniformDirtectLightShadows.uniformSize = 16; -function setDataToTypeArray(buffer, data, offset) { - if (Array.isArray(data)) { - data.forEach((value, index) => { - buffer[index + offset] = value; - }); - } else { - buffer[offset] = data; - } - return true; -} - -class UniformBuffer { - constructor(options) { - this.type = defaultValue(options.type, "uniform"); - this.label = defaultValue(options.label, ""); - this.name = defaultValue(options.label, ""); - this.hasDynamicOffset = options.hasDynamicOffset ?? false; - this.minBindingSize = options.minBindingSize ?? 0; - this.binding = options.binding ?? 0; - this.visibility = defaultValue(options.visibility, ShaderStage.Fragment | ShaderStage.Vertex); - this.usage = defaultValue(options.usage, BufferUsage.Uniform | BufferUsage.CopyDst); - this._uniformStruct = new Map(); - this.uniformDirty = true; - this._bufferSize = options.size; - this.buffer = options.buffer; - this.offset = 0; - this.dataBuffer = defaultValue(options.dataBuffer, new Float32Array(defaultValue(this._bufferSize, 400))); - this.byteOffset = 0; - this.isUniformBuffer = true; - this.maxOffset = options.maxOffset ?? 0; - } - get layoutType() { - return { - type: this.type, - hasDynamicOffset: this.hasDynamicOffset, - minBindingSize: this.minBindingSize - }; - } - get bufferSize() { - return this._bufferSize ?? this.uniformsSize * 4; - } - get uniformsSize() { - // https://gpuweb.github.io/gpuweb/wgsl/#address-space-layout-constraints - return this._bufferSize != undefined ? this._bufferSize / 4 : Math.ceil(this.byteOffset / 16) * 16; - } - bind(device) { - this._uniformStruct.forEach((uniform) => { - const result = uniform.set(); - if (uniform?.dirty != undefined) uniform.dirty = false; - if (result != undefined && this.uniformDirty == false) this.uniformDirty = result; - }); - if (this.uniformDirty) { - this.uniformDirty = false; - if (!this.buffer) this.buffer = Buffer.createUniformBuffer(this.label, device, this.bufferSize, this.usage); - if (this.type != BufferBindingType.Storage) - this.buffer.setSubData( - 0, - this.dataBuffer.slice(0, defaultValue(this?.bufferSize / 4, this.uniformsSize)) - ); - } - } - getUniformBufferStruct() { - let uniformStruct = `struct MaterialUniform {\n `; - this._uniformStruct.forEach((uniform) => { - uniformStruct += this.createUniformString(uniform); - }); - uniformStruct += `}\n`; - return uniformStruct; - } - createUniformString(uniform) { - let result = ``; - switch (uniform.type) { - case "vec1": - result = `${uniform.name} :f32,\n`; - break; - case "vec2": - result = `${uniform.name} :vec2,\n`; - break; - case "vec3": - result = `${uniform.name} :vec3,\n`; - break; - case "vec4": - result = `${uniform.name} :vec4,\n`; - break; - case "mat2": - result = `${uniform.name} :mat2x2,\n`; - break; - case "mat3": - result = `${uniform.name} :mat3x3,\n`; - break; - case "mat4": - result = `${uniform.name} :mat4x4,\n`; - break; - } - return result; - } - contains(name) { - return this._uniformStruct.get(name); - } - replaceUniformValue(name, value) { - const uniform = this._uniformStruct.get(name); - if (!uniform) return; - uniform.cb = value; - } - getUniformByName(name) { - return this._uniformStruct.get(name); - } - // uniformBuffer.setVec3Array('test',()=>{return [new Vector3(1,0,0),new Vector3(1,0.8,0.5)]},2); - // uniformBuffer.setFloatArray('test1',()=>{return [0.5,0.5,1.0]},3); - // uniformBuffer.setVec4Array('test4',()=>{return [new Vector4(0.5,0.6,0.2,1.0),new Vector4(0.5,0.8,0.8,1.0)]},2); - // uniformBuffer.setVec2Array('test2',()=>{return [new Vector2(0.5,0.6),new Vector2(0.5,0.8,)]},2); - setUniform(name, value, uniformType, count) { - if (this._uniformStruct.get(name)) return; - const TypeUniform = UniformBuffer.UniformType[uniformType]; - this.byteOffset += UniformBuffer.checkUniformOffset(this.byteOffset, TypeUniform.align); - const uniform = - count != undefined - ? new TypeUniform(name, this.dataBuffer, this.byteOffset, value, count) - : new TypeUniform(name, this.dataBuffer, this.byteOffset, value); - this._uniformStruct.set(name, uniform); - this.byteOffset += uniform.byteSize; - } - setUniformsFromUniformBuffer(uniformBuffer) { - this._uniformStruct.forEach((value, key) => { - const uniform = uniformBuffer.getUniformByName(key); - if (uniform) this._uniformStruct.set(key, uniform); - }); - } - static checkUniformOffset(byteSize, Align) { - // from https://gpuweb.github.io/gpuweb/wgsl/#address-space-layout-constraints - // return this.hasDynamicOffset - // ? Math.ceil(byteSize / 256) * 256 - byteSize - // : Math.ceil(byteSize / Align) * Align - byteSize; - return Math.ceil(byteSize / Align) * Align - byteSize; - } - destroy() { - this?.buffer?.destroy(); - } -} -UniformBuffer.UniformType = { - [UniformEnum.UniformUint]: UniformUint, - [UniformEnum.Float]: UniformFloat, - [UniformEnum.FloatVec2]: UniformFloatVec2, - [UniformEnum.FloatVec3]: UniformFloatVec3, - [UniformEnum.FloatVec4]: UniformFloatVec4, - [UniformEnum.Mat2]: UniformMat2, - [UniformEnum.Mat3]: UniformMat3, - [UniformEnum.Mat4]: UniformMat4, - [UniformEnum.Color]: UniformColor, - [UniformEnum.FloatArray]: UniformFloatArray, - [UniformEnum.Vec2Array]: UniformVec2Array, - [UniformEnum.Vec3Array]: UniformVec3Array, - [UniformEnum.Vec4Array]: UniformVec4Array, - [UniformEnum.Mat4Array]: UniformMatrix4Array, - [UniformEnum.PointLights]: UniformPointLights, - [UniformEnum.SpotLights]: UniformSpotLights, - [UniformEnum.DirtectLights]: UniformDirtectLights, - [UniformEnum.PointLightShadows]: UniformPointLightShadows, - [UniformEnum.SpotLightShadows]: UniformSpotLightShadows, - [UniformEnum.DirtectLightShadows]: UniformDirtectLightShadows, - [UniformEnum.UniformStructArray]: UniformStructArray -}; - -function addUniformToShaderData(name, uniform, shaderData, mesh, uniformBuffer) { - const valueIsFunc = uniform?.value instanceof Function; - switch (uniform.type) { - case "f32": - uniformBuffer.setUniform( - name, - valueIsFunc - ? uniform.value - : () => { - return uniform.value; - }, - UniformEnum.Float - ); - break; - case "vec2": - uniformBuffer.setUniform( - name, - valueIsFunc - ? uniform.value - : () => { - return uniform.value; - }, - UniformEnum.FloatVec2 - ); - break; - case "vec3": - uniformBuffer.setUniform( - name, - valueIsFunc - ? uniform.value - : () => { - return uniform.value; - }, - UniformEnum.FloatVec3 - ); - break; - case "color": - uniformBuffer.setUniform( - name, - valueIsFunc - ? uniform.value - : () => { - return uniform.value; - }, - UniformEnum.Color - ); - break; - case "vec4": - uniformBuffer.setUniform( - name, - valueIsFunc - ? uniform.value - : () => { - return uniform.value; - }, - UniformEnum.FloatVec4 - ); - break; - case "mat2x2": - uniformBuffer.setUniform( - name, - valueIsFunc - ? uniform.value - : () => { - return uniform.value; - }, - UniformEnum.Mat2 - ); - break; - case "mat3x3": - uniformBuffer.setUniform( - name, - valueIsFunc - ? uniform.value - : () => { - return uniform.value; - }, - UniformEnum.Mat3 - ); - break; - case "mat4x4": - uniformBuffer.setUniform( - name, - valueIsFunc - ? uniform.value - : () => - name == "modelMatrix" - ? mesh?.modelMatrix - : name === "normalMatrix" - ? mesh?.normalMatrix - : uniform.value, - UniformEnum.Mat4 - ); - break; - case "array": - uniformBuffer.setUniform( - name, - valueIsFunc - ? uniform.value - : () => { - return uniform.value; - }, - UniformEnum.FloatArray, - uniform.value.length - ); - break; - case "array>": - uniformBuffer.setUniform( - name, - valueIsFunc - ? uniform.value - : () => { - return uniform.value; - }, - UniformEnum.Vec2Array, - uniform.value.length - ); - break; - case "array>": - uniformBuffer.setUniform( - name, - valueIsFunc - ? uniform.value - : () => { - return uniform.value; - }, - UniformEnum.Vec3Array, - uniform.value.length - ); - break; - case "array>": - uniformBuffer.setUniform( - name, - valueIsFunc - ? uniform.value - : () => { - return uniform.value; - }, - UniformEnum.Vec4Array, - uniform.value.length - ); - break; - case "texture": - case "storageTexture": - shaderData.setTexture( - name, - valueIsFunc - ? uniform.value - : () => { - return uniform.value; - }, - uniform?.binding, - uniform?.type, - uniform?.visibility, - uniform?.textureView - ); - break; - case "sampler": - shaderData.setSampler( - name, - valueIsFunc - ? uniform.value - : () => { - return uniform.value; - }, - uniform?.binding, - uniform?.visibility - ); - break; - default: - throw new Error("not match unifrom type"); - } -} - -const layoutCache = new Map(); -class BindGroupLayout { - constructor(device, label, entries = [], index = 0) { - this.entries = entries; - this.index = index || 0; - this.gpuBindGroupLayout = device.createBindGroupLayout({ - label: label, - entries: entries.map(({ visibility, buffer, sampler, texture, storageTexture, binding }) => ({ - binding, - visibility, - buffer, - sampler, - texture, - storageTexture - })) - }); - } - static getBindGroupLayoutFromCache(device, label, entires, index) { - if (layoutCache.has(label)) { - return layoutCache.get(label); - } else { - const bindGroupLayout = new BindGroupLayout(device, label, entires, index); - layoutCache.set(label, bindGroupLayout); - return bindGroupLayout; - } - } - static removeBindGroupLayoutFromCache(bindGroupLayout) { - layoutCache.delete(bindGroupLayout); - } -} - -class BindGroupLayoutEntry { - constructor(options) { - this.binding = options.binding; - this.visibility = options.visibility; - this.buffer = options.buffer; - this.sampler = options.sampler; - this.texture = options.texture; - this.storageTexture = options.storageTexture; - this.externalTexture = options.externalTexture; - } - getGPULayoutEntity() { - return { - binding: this.binding, - visibility: this.visibility, - buffer: this.buffer, - sampler: this.sampler, - texture: this.texture, - externalTexture: this.externalTexture, - storageTexture: this.storageTexture - }; - } -} - -class ShaderData { - constructor(label, size, layoutIndex, groupIndex) { - this.label = label; - this.currentBinding = 0; - this.defineDirty = true; - this.defines = {}; - this._uniforms = new Map(); - this.groupIndex = defaultValue(groupIndex, 0); - this.layoutIndex = defaultValue(layoutIndex, 0); - } - getUniformBuffer(name) { - return this._uniforms.get(name); - } - getTexture(name) { - return this._uniforms.get(name); - } - getSampler(name) { - return this._uniforms.get(name); - } - setUniformBuffer(name, uniformBuffer, binding) { - if (this._uniforms.get(name)) return; - uniformBuffer.binding = this.currentBinding; - this.setDefine(name.concat("Binding"), binding ?? this.currentBinding); - this.currentBinding += 1; - this._uniforms.set(name, uniformBuffer); - } - setTexture(name, value, binding, type, visibility, textureView) { - if (this._uniforms.get(name)) return; - const uniform = new UniformTexture(name, binding ?? this.currentBinding, value, type, visibility, textureView); - this.setDefine(name.concat("Binding"), binding ?? this.currentBinding); - this.currentBinding += 1; - this._uniforms.set(name, uniform); - } - setSampler(name, value, binding, visibility) { - if (this._uniforms.get(name)) return; - const uniform = new UniformSampler(name, binding ?? this.currentBinding, value, visibility); - this.setDefine(name.concat("Binding"), binding ?? this.currentBinding); - this.currentBinding += 1; - this._uniforms.set(name, uniform); - } - setDefine(name, value) { - if (this.defines[name] === undefined) { - this.defineDirty = true; - this.defines[name] = value; - } else { - if (this.defines[name] === value) { - return; - } else { - this.defineDirty = true; - this.defines[name] = value; - } - } - } - setUniformBufferValue(uniformBuffer) { - const distUbo = this._uniforms.get(uniformBuffer.name); - distUbo.setUniformsFromUniformBuffer(uniformBuffer); - } - bind(device, passEncoder) { - this.uploadUniform(device); - if (!this.groupLayout) this.groupLayout = this.createBindGroupLayout(device, this.label, this.layoutIndex); - if (!this.bindGroup) this.bindGroup = this.createBindGroup(device, this.label, this.groupIndex); - this.bindGroup.bind(passEncoder); - } - destroy() { - this._uniforms.forEach((uniform) => { - if (uniform.destroy) uniform?.destroy(); - }); - this.label = undefined; - this.currentBinding = 1; - this.defineDirty = true; - this.defines = undefined; - this._uniforms.clear(); - BindGroupLayout.removeBindGroupLayoutFromCache(this.groupLayout); - this.bindGroup = undefined; - } - createBindGroup(device, label, groupIndex) { - const { entities, dynamic, alignedSize, maxOffset } = this.createBindGroupEntity(); - const bindGroup = new BindGroup({ - label: label, - entires: entities, - device: device, - layout: this.groupLayout, - index: groupIndex || 0, - dynamic, - alignedSize, - maxOffset - }); - return bindGroup; - } - createBindGroupLayout(device, label, layoutIndex) { - const result = this.createBindGroupLayoutEntry(); - const groupLayout = BindGroupLayout.getBindGroupLayoutFromCache( - device, - label + "-" + result.uid, - result.layouts, - layoutIndex || 0 - ); - return groupLayout; - } - uploadUniform(device) { - this._uniforms.forEach((uniform) => { - uniform.bind(device); - }); - } - createBindGroupLayoutEntry() { - let uid = ""; - const result = new Map(); - this._uniforms.forEach((uniform) => { - if (!result.has(uniform.name)) { - uid = uid === "" ? uid.concat(uniform.name) : uid.concat(", ").concat(uniform.name); - result.set(uniform.name, this.createOneLayoutEntry(uniform)); - } - }); - uid = `uniforms[${uid}]`; - return { uid, layouts: [...result.values()] }; - } - createBindGroupEntity() { - const result = new Map(); - let dynamic = false, - alignedSize = 0, - maxOffset = 0; - this._uniforms.forEach((uniform) => { - if (!result.has(uniform.name)) { - if (uniform?.hasDynamicOffset) { - dynamic = true; - maxOffset = uniform.maxOffset; - alignedSize = Math.ceil(uniform.uniformsSize / (4 * 256)) * 256; - } - result.set(uniform.name, this.creayeOneGroupEntity(uniform)); - } - }); - return { - entities: [...result.values()], - dynamic, - alignedSize, - maxOffset - }; - } - createOneLayoutEntry(uniform) { - let layoutEntity; - if (uniform.isUniformBuffer) { - layoutEntity = new BindGroupLayoutEntry({ - binding: uniform.binding, - buffer: uniform.layoutType, - visibility: uniform.visibility - }); - } else if (uniform.isTexture) { - layoutEntity = new BindGroupLayoutEntry({ - binding: uniform.binding, - visibility: uniform.visibility, - texture: uniform.type == "texture" ? uniform.layoutType : undefined, - storageTexture: uniform.type == "storageTexture" ? uniform.storageTextureLayoutType : undefined - }); - } else if (uniform.isSampler) { - layoutEntity = new BindGroupLayoutEntry({ - binding: uniform.binding, - visibility: uniform.visibility, - sampler: uniform.layoutType - }); - } - return layoutEntity; - } - creayeOneGroupEntity(uniform) { - let groupEntity; - if (uniform.isUniformBuffer) { - groupEntity = new BindGroupEntity({ - binding: uniform.binding, - resource: { - buffer: uniform.buffer.gpuBuffer, - offset: uniform.offset, - size: uniform.bufferSize - } - }); - } else if (uniform.isTexture) { - groupEntity = new BindGroupEntity({ - binding: uniform.binding, - resource: uniform?.textureView ?? uniform.texture.textureView - }); - } else if (uniform.isSampler) { - groupEntity = new BindGroupEntity({ - binding: uniform.binding, - resource: uniform.sampler.gpuSampler - }); - } - return groupEntity; - } -} - -class Material { - constructor() { - this.label = undefined; - this.type = undefined; - this.baseTexture = undefined; - this.baseSampler = undefined; - this._diffuse = new Color(0.0, 0.0, 0.0); - this._opacity = 1.0; - // Buffer - this.shaderData = undefined; - this.shaderSource = undefined; - this.dirty = true; - this._emissive = new Color(0.0, 0.0, 0); - this._emissiveIntensity = 1.0; - this._doubleSided = true; - this.light = false; - this.ready = false; - this.init(); - } - set wireframe(value) { - this.renderState.primitive.topology = value ? PrimitiveTopology.LineList : PrimitiveTopology.TriangleList; - } - set topology(value) { - this.renderState.primitive.topology = value; - } - get doubleSided() { - return this._doubleSided; - } - set doubleSided(value) { - this._renderState.primitive.cullMode = value ? CullMode.None : CullMode.Back; - this._doubleSided = value; - } - get renderState() { - return this._renderState; - } - set renderState(value) { - this._renderState = value; - } - get diffuse() { - return this._diffuse; - } - set diffuse(v) { - this._diffuse = v; - } - get emissive() { - return this._emissive; - } - set emissive(v) { - this._emissive = v; - } - get emissiveIntensity() { - return this._emissiveIntensity; - } - set emissiveIntensity(v) { - this._emissiveIntensity = v; - } - get opacity() { - return this._opacity; - } - set opacity(v) { - this._opacity = v; - } - onBeforeRender() { - // callback - } - onBeforeCompile() { - // callback - } - clone() { - return null; - } - update(frameState, mesh) { - // update material - } - createShaderData() { - if (this.shaderData) this.shaderData.destroy(); - this.shaderData = new ShaderData(this.type, 0); - this.ready = true; - } - init() { - // 默认渲染状态 - const primitive = new Primitive(); - const target = new Target(); - const depthStencil = new DepthStencil(); - this._renderState = new RenderState(); - this._renderState.primitive = primitive; - this._renderState.targets = [target]; - this._renderState.depthStencil = depthStencil; - } - destroy() { - this.label = undefined; - this.type = undefined; - this.baseTexture = undefined; - this.baseSampler = undefined; - this.color = undefined; - } -} - -class ShaderMaterial extends Material { - constructor(options) { - super(); - const { type, frag, vert, defines, light, shaderId } = options; - this.type = shaderId ?? type; - this.shaderMaterialParms = options; - this.shaderSource = new ShaderSource({ - shaderId: shaderId ?? type, - render: { - fragShader: frag, - vertShader: vert - }, - defines: defaultValue(defines, {}) - }); - this.uniforms = options.uniforms; - this.light = light || false; - } - update(frameState, mesh) { - if (!this.shaderData || this.dirty) this.createShaderData(mesh); - } - clone() { - return new ShaderMaterial(this.shaderMaterialParms); - } - createShaderData(mesh) { - const { uniformBuffers, uniformTextureAndSampler } = this.shaderMaterialParms; - super.createShaderData(); - const shaderData = this.shaderData; - // fill uniformBuffer - uniformBuffers?.forEach?.((uniformBuffer) => this.createUniformBuffer(uniformBuffer, mesh)); - // fill texture and sampler - if (uniformTextureAndSampler) this.addUniformToShaderData(uniformTextureAndSampler); - return shaderData; - } - createUniformBuffer(uniformBufferParams, mesh) { - const { - type = "uniform", - usage = BufferUsage.Uniform | BufferUsage.CopyDst, - uniforms, - uid, - binding, - buffer, - bufferSize, - visibility - } = uniformBufferParams; - const uniformBuffer = new UniformBuffer({ - label: uid, - type: type, - usage: usage, - binding, - buffer, - visibility, - size: buffer?.size ?? bufferSize - }); - this.shaderData.setUniformBuffer(uid, uniformBuffer); - if (!buffer) this.addUniformToShaderData(uniforms, uniformBuffer, mesh); - } - addUniformToShaderData(uniforms, uniformBuffer, mesh) { - if (!uniforms) return; - const uniformsNames = Object.getOwnPropertyNames(uniforms); - uniformsNames.map((uniformsName) => { - addUniformToShaderData(uniformsName, uniforms[uniformsName], this.shaderData, mesh, uniformBuffer); - }); - } -} - -function createGuid() { - // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript - return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { - const r = (Math.random() * 16) | 0; - const v = c === "x" ? r : (r & 0x3) | 0x8; - return v.toString(16); - }); -} - -class Mesh extends RenderObject { - constructor(geometry, material) { - super(); - this.geometry = geometry; - this.material = material; - this.type = RenderObjectType.Mesh; - this.frustumCull = true; - this.uid = createGuid(); - this.subCommands = {}; - } - get ready() { - return this.material.ready; - } - update(frameState, camera) { - // update matrix - this.updateMatrix(this?.parent?.modelMatrix); - // create - this.geometry.update(frameState); - this.material.update(frameState, this); - // update boundingSphere - this.geometry.boundingSphere.update(this.modelMatrix); - this.material.shaderSource.setDefines(frameState.defines); - if (this.type == RenderObjectType.Debug) { - frameState.renderQueue.debugQueue.push(this); - return; - } - this.distanceToCamera = this.geometry.boundingSphere.distanceToCamera(camera); - const visibility = frameState.cullingVolume.computeVisibility(this.geometry.boundingSphere); - // 视锥剔除 - if (visibility === Intersect.OUTSIDE || !this.frustumCull) return; - if (this.material.transparent) { - frameState.renderQueue.transparent.push(this); - } else { - frameState.renderQueue.opaque.push(this); - } - } - beforeRender() { - // before render - } - afterRender() { - // after render - } - getDrawCommand(overrideMaterial, commandSubType, lightManger) { - if (!this.drawCommand || this.material.dirty) { - this.material.shaderSource.setDefines( - Object.assign({}, this.material.shaderData.defines, this.geometry.defines) - ); - if (this.material.dirty) this.material.dirty = false; - this.drawCommand = new DrawCommand({ - vertexBuffers: this.geometry.vertexBuffers, - indexBuffer: this.geometry.indexBuffer, - shaderData: this.material.shaderData, - instances: this.instanceCount, - count: this.geometry.count, - renderState: this.material.renderState, - shaderSource: this.material.shaderSource, - lightShaderData: this.material.light ? lightManger?.lightShaderData : undefined, - useLight: this.material.light - }); - } - if (overrideMaterial) { - if (!this.subCommands[commandSubType]) { - const copyMat = overrideMaterial.clone(); - copyMat.update(undefined, this); - if (copyMat.dirty) copyMat.dirty = false; - this.subCommands[commandSubType] = this.drawCommand.shallowClone(copyMat); - } - return this.subCommands[commandSubType]; - } - return this.drawCommand; - } - destroy() { - this.geometry.destroy(); - this.material.destroy(); - } -} - -class ShadowMapDebugger { - constructor(light, scene) { - if (!light || !(light instanceof Light)) throw new Error("The parameter must be Light instance"); - this.light = light; - this.scene = scene; - this.debuggerSize = { - width: 256, - height: 256 - }; - this.mesh = this._createShadowMapMesh(); - const shadowMap = this.light.shadow.getShadowMapTexture(); - this.material.shaderMaterialParms.uniformTextureAndSampler.texture.value = shadowMap; - this.mesh.type = RenderObjectType.Debug; - this.scene.add(this.mesh); - } - _createShadowMapMesh() { - const shader = getVertFrag("shadowMapDebugger", { - positionLocation: 0 - }); - this.geometry = new PlaneGeometry(2, 2); - this.material = new ShaderMaterial({ - shaderId: "shadowMapDebugger", - frag: shader.frag, - vert: shader.vert, - uniformTextureAndSampler: { - texture: { - type: "texture", - value: undefined - }, - sampler: { - type: "sampler", - value: new Sampler({ - magFilter: "linear", - minFilter: "linear" - }) - } - } - }); - this.material.renderState.viewport = new ViewPort(0, 0, this.debuggerSize.width, this.debuggerSize.height); - return new Mesh(this.geometry, this.material); - } - setSize(width, height) { - if (!width || !height) return; - this.debuggerSize.width = width; - this.debuggerSize.height = height; - this.update(); - } - update() { - this.material.renderState.viewport = new ViewPort(0, 0, this.debuggerSize.width, this.debuggerSize.height); - } -} - -class ColorMaterial extends Material { - constructor() { - super(); - this.type = "color"; - this.shaderSource = new ShaderSource({ - shaderId: this.type, - defines: {} - }); - } - update(frameState, mesh) { - if (!this.shaderData || this.dirty) this.createShaderData(); - const uniformBuffer = new UniformBuffer({ label: "color" }); - uniformBuffer.setUniform( - "modelMatrix", - () => { - return mesh.modelMatrix; - }, - UniformEnum.Mat4 - ); - this.shaderData.setUniformBuffer("color", uniformBuffer); - } -} - -class Axes extends Mesh { - constructor() { - super(); - this.type = RenderObjectType.Axes; - this.distanceToCamera = 10; - this.material = new ColorMaterial(); - this.material.wireframe = true; - this.init(); - } - update(frameState) { - this.updateMatrix(); - this.material.update(frameState, this); - frameState.renderQueue.opaque.push(this); - } - init() { - const position = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1]; - const colors = [1, 0, 0, 1, 1, 0.5, 0.5, 1, 0, 1, 0, 1, 0.5, 1, 0.5, 1, 0, 0, 1, 1, 0.5, 0.5, 1, 1]; - const indices = [0, 1, 2, 3, 4, 5]; - this.geometry = new Geometry({}); - this.geometry.setAttribute(new Float32Attribute("position", position, 3)); - this.geometry.setAttribute(new Float32Attribute("color", colors, 4)); - this.geometry.setIndice(indices); - this.geometry.count = indices.length; - } -} - -class SkyBoxGeometry extends Geometry { - constructor() { - super({ - type: "skyBoxGeometry" - }); - this.init(); - } - init() { - const positions = [ - 1.0, - 1.0, - 1.0, - -1.0, - 1.0, - 1.0, - 1.0, - -1.0, - 1.0, - -1.0, - -1.0, - 1.0, - 1.0, - 1.0, - -1.0, - -1.0, - 1.0, - -1.0, - 1.0, - -1.0, - -1.0, - -1.0, - -1.0, - -1.0 // 7 - ]; - const indices = [ - // PosX (Right) - 0, 2, 4, 6, 4, 2, - // NegX (Left) - 5, 3, 1, 3, 5, 7, - // PosY (Top) - 4, 1, 0, 1, 4, 5, - // NegY (Bottom) - 2, 3, 6, 7, 6, 3, - // PosZ (Front) - 0, 1, 2, 3, 2, 1, - // NegZ (Back) - 6, 5, 4, 5, 6, 7 - ]; - this.setAttribute(new Float32Attribute("position", positions, 3)); - this.setIndice(indices); - this.count = indices.length; - } -} - -function returnTrue() { - return true; -} -function destroyObject(object) { - // message =message||"This object was destroyed, i.e., destroy() was called."; - function throwOnDestroyed() { - throw new Error("This object was destroyed, i.e., destroy() was called."); - } - for (const key in object) { - if (typeof object[key] === "function") { - object[key] = throwOnDestroyed; - } - } - object.isDestroyed = returnTrue; - return undefined; -} - -class TextureCache { - constructor() { - this._numberOfTextures = 0; - this._textures = new Map(); - this._numberOfTextures = 0; - this._texturesToRelease = new Map(); - this.defaultSampler = new Sampler({ - magFilter: "linear", - minFilter: "linear", - addressModeU: "repeat", - addressModeV: "repeat" - }); - } - get numberOfTextures() { - return this._numberOfTextures; - } - getTexture(keyword) { - const cachedTexture = this._textures.get(keyword); - if (!defined(cachedTexture)) { - return undefined; - } - // No longer want to release this if it was previously released. - delete this._texturesToRelease[keyword]; - ++cachedTexture.count; - return cachedTexture.texture; - } - addTexture(keyword, texture) { - const cachedTexture = { - texture: texture, - count: 1 - }; - texture.finalDestroy = texture.destroy; - // const that = this; - texture.destroy = () => { - if (--cachedTexture.count === 0) { - this._texturesToRelease.set(keyword, cachedTexture); - } - }; - this._textures.set(keyword, cachedTexture); - ++this._numberOfTextures; - } - releasedTextures() { - this._texturesToRelease.forEach((cacheTexture) => { - cacheTexture.texture?.finalDestroy(); - --this._numberOfTextures; - }); - this._texturesToRelease.clear(); - } - destroy() { - this._textures.forEach((cachedTexture) => { - cachedTexture.texture?.finalDestroy(); - }); - return destroyObject(this); - } -} -const textureCache = new TextureCache(); - -async function CubeTextureLoader(urls) { - const promises = urls.map((src) => { - const img = document.createElement("img"); - img.src = src; - return img.decode().then(() => createImageBitmap(img)); - }); - const images = await Promise.all(promises); - await Promise.all(images); - const baseSampler = new Sampler({ - magFilter: "linear", - minFilter: "linear" - }); - const data = images.map((image, i) => { - return { - source: image, - width: image.width, - height: image.height, - depth: 1, - x: 0, - y: 0, - z: i - }; - }); - const baseTexture = new Texture({ - size: { - width: images[0].width, - height: images[0].height, - depth: 6 - }, - format: "rgba8unorm", - usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, - data, - viewFormats: "cube", - mipLevelCount: 6, - needMipMap: true - }); - return { - texture: baseTexture, - sampler: baseSampler - }; -} - -class SkyBoxMaterial extends Material { - constructor() { - super(); - this.type = "skybox"; - this.shaderSource = new ShaderSource({ - shaderId: this.type, - defines: {} - }); - this.loadFish = false; - this.renderState.depthStencil.depthWriteEnabled = false; - this.renderState.depthStencil.depthCompare = CompareFunction.LessEqual; - } - async loadTexture(urls) { - const result = await CubeTextureLoader(urls); - this.loadFish = true; - textureCache.addTexture("specular", result.texture); - this.baseTexture = result.texture; - this.baseSampler = result.sampler; - } - update(frameState, mesh) { - if (!this.loadFish) return; - if (!this.shaderData) { - this.createShaderData(mesh); - } - } - createShaderData(mesh) { - super.createShaderData(); - const uniformBuffer = new UniformBuffer({ label: "skybox" }); - uniformBuffer.setUniform( - "modelMatrix", - () => { - return mesh.modelMatrix; - }, - UniformEnum.Mat4 - ); - this.shaderData.setUniformBuffer("skybox", uniformBuffer); - this.shaderData.setTexture("baseTexture", this.baseTexture); - this.shaderData.setSampler("baseSampler", this.baseSampler); - } -} - -class SkyBox extends Mesh { - constructor(urls) { - super(); - this.type = RenderObjectType.Skybox; - this.visibility = true; - this.material = new SkyBoxMaterial(); - if (urls) this.material.loadTexture(urls); - this.geometry = new SkyBoxGeometry(); - this.isSkyBox = true; - } - update(frameState) { - this.updateMatrix(); - this.geometry.update(frameState); - this.material.update(frameState, this); - if (this.visibility) frameState.renderQueue.pre.push(this); - } -} - -class Instance extends RenderObject { - constructor() { - super(); - this._notUpdateMatrix = false; - this.visiblity = false; - this.id = createGuid(); - } - setMatrix4(mat4) { - this.modelMatrix.set(mat4); - this._notUpdateMatrix = true; - } - updateMatrix(matrix) { - if (this._notUpdateMatrix) return; - super.updateMatrix(matrix); - } -} - -class InstanceMesh extends Mesh { - constructor(geo, mat) { - super(geo, mat); - this.instances = new Map(); - this.renderInstances = []; - this.hasAddInstances = false; - } - update(frameState, camera) { - // update instances visiblity - this.checkInstancesVisiblity({ frameState, camera }); - this.geometry.update(frameState); - this.material.update(frameState, this); - if (!this.hasAddInstances) this.addUniformsToMaterial(); - this.instanceCount = this.renderInstances.length; - if (this.renderInstances.length < 1) return; - if (this.material.transparent) { - frameState.renderQueue.transparent.push(this); - } else { - frameState.renderQueue.opaque.push(this); - } - } - addInstance(instance) { - if (this.instances.get(instance.id)) return; - this.instances.set(instance.id, instance); - } - removeInstance(key) { - return this.instances.delete(key); - } - getInstance(key) { - return this.instances.get(key); - } - checkInstancesVisiblity(options) { - const { frameState, camera } = options; - const preFrameInstanceCount = this.renderInstances.length; - this.renderInstances = []; - this.instances.forEach((instance) => { - instance.updateMatrix(this?.parent?.modelMatrix); - instance.visiblity = this.getInstanceVisiblity({ instance, frameState, camera }); - if (instance.visiblity) this.renderInstances.push(instance); - }); - this.material.dirty = this.renderInstances.length === preFrameInstanceCount; - // rebuild instanceMatrixsBuffer - if (this.material.dirty) this.hasAddInstances = false; - } - getInstanceVisiblity(options) { - const { instance, frameState, camera } = options; - this.geometry.boundingSphere.update(instance.modelMatrix); - this.distanceToCamera = this.geometry.boundingSphere.distanceToCamera(camera); - const visibility = frameState.cullingVolume.computeVisibility(this.geometry.boundingSphere); - return visibility === Intersect.INTERSECTING || visibility === Intersect.INSIDE; - } - addUniformsToMaterial() { - if (!this.material.shaderData) return; - this.hasAddInstances = true; - const instanceMatrixsBuffer = new UniformBuffer({ - label: "instanceMatrixsBuffer", - type: BufferBindingType.ReadOnlyStorage, - usage: BufferUsage.Storage | BufferUsage.CopyDst, - size: this.instances.size * 64 - }); - instanceMatrixsBuffer.setUniform( - "instanceMatrixs", - () => { - return this?.renderInstances?.map((renderInstance) => renderInstance.modelMatrix); - }, - UniformEnum.Mat4Array, - this?.renderInstances?.length - ); - this.material.shaderData.setUniformBuffer("instanceMatrixsBuffer", instanceMatrixsBuffer); - this.material.shaderData.setDefine("USE_INSTANCE", true); - this.material.shaderData.setDefine("instanceCount", this?.renderInstances?.length); - } -} - -class ComputeCommand { - constructor(options) { - this.dispatch = options.dispatch; - this.shaderData = options.shaderData; - this.shaderSource = options.shaderSource; - } - render(params) { - const { device, passEncoder } = params; - this.shaderData?.bind?.(device, passEncoder); - const pipeline = Pipeline.getComputePipelineFromCache(device, this, [this.shaderData.groupLayout]); - pipeline.bind(passEncoder); - const { x, y, z } = this.dispatch; - passEncoder.dispatchWorkgroups(x, y, z); - } -} - -class Model { - constructor(params) { - this.modelParams = params; - this.renderType = this.modelParams.compute != undefined ? "compute" : "render"; - this.vertexBuffers = new Map(); - } - render(params) { - const { device, passEncoder } = params; - if (!this.command) this.command = this.createDrawCommand(); - this.command.render({ - device, - passEncoder: passEncoder - }); - } - compute(params) { - const { device, passEncoder } = params; - if (!this.command) this.command = this.createComputeCommand(); - this.command.render({ - device, - passEncoder: passEncoder - }); - } - getVertexBufferByUid(uid) { - return this.vertexBuffers.get(uid); - } - getUniformBufferByUid(uid) { - return this.shaderData.getUniformBuffer(uid); - } - getTextureByName(name) { - return this.shaderData.getTexture(name); - } - getSamplerByName(name) { - return this.shaderData.getSampler(name); - } - destroy() { - this?.vertexBuffers.clear(); - this?.shaderData.destroy(); - this.command = null; - this.modelParams = null; - } - createDrawCommand() { - const { count, instances } = this.modelParams; - const vertexBuffers = this.createVertexBuffer(); - this.shaderData = this.createShaderData(); - const indexBuffer = this.createIndexBuffer(); - const shaderSource = this.createShaderSource(); - const renderState = this.createRenderState(); - return new DrawCommand({ - vertexBuffers, - shaderData: this.shaderData, - indexBuffer, - shaderSource, - renderState, - count, - instances - }); - } - createComputeCommand() { - const { dispatch } = this.modelParams; - const shaderData = this.createShaderData(); - const shaderSource = this.createShaderSource(); - return new ComputeCommand({ - dispatch, - shaderData, - shaderSource - }); - } - createVertexBuffer() { - const { vertexBuffers, shaderId } = this.modelParams; - let locationIndex = 0; - return ( - vertexBuffers?.map((vertexBufferObject, index) => { - const { attributes, stepMode, uid, arrayStride } = vertexBufferObject; - const vertexBuffer = new VertexBuffer({ - label: shaderId, - index, - locationIndex, - stepMode: stepMode, - arrayStride - }); - const attributeKeys = Object.keys(attributes); - attributeKeys.forEach((key) => { - const { size, value, names, itemSizes, buffer } = attributes[key]; - vertexBuffer.setAttribute( - names?.length > 0 - ? buffer - ? new BufferFloat32Attribute(names, buffer, itemSizes) - : new InterleavedFloat32Attribute(names, value, itemSizes) - : new Float32Attribute(key, value, size) - ); - const count = names?.length > 0 ? names?.length : 1; - locationIndex += count; - }); - this.vertexBuffers.set(uid, vertexBuffer); - return vertexBuffer; - }) || [] - ); - } - createShaderSource() { - const { vert, frag, compute, shaderId } = this.modelParams; - return new ShaderSource({ - shaderId, - render: { - vertShader: vert, - fragShader: frag - }, - compute: { - computeShader: compute - } - }); - } - createShaderData() { - const { shaderId, uniformBuffers, uniformTextureAndSampler } = this.modelParams; - const shaderData = new ShaderData(shaderId); - // fill uniformBuffer - uniformBuffers.forEach((uniformBuffer) => this.createUniformBuffer(uniformBuffer, shaderData, shaderId)); - // fill texture and sampler - this.addUniformToShaderData(uniformTextureAndSampler, shaderData, undefined); - return shaderData; - } - createRenderState() { - const { - blendConstant, - depthStencil, - viewPort, - scissorTest, - targets, - multiSample, - primitive, - stencilReference - } = this.modelParams.renderState; - return new RenderState({ - scissorTest: scissorTest - ? new ScissorTest(scissorTest.x, scissorTest.y, scissorTest.width, scissorTest.height) - : undefined, - viewport: viewPort ? new ViewPort(viewPort.x, viewPort.y, viewPort.width, viewPort.height) : undefined, - targets: targets?.map((target) => { - return new Target(target); - }), - depthStencil: depthStencil ? new DepthStencil(depthStencil) : undefined, - blendConstant: blendConstant - ? new BlendConstant(blendConstant.r, blendConstant.g, blendConstant.b, blendConstant.a) - : undefined, - stencilReference: stencilReference || 0, - multisample: multiSample - ? new MultiSample(multiSample.count, multiSample.mask, multiSample.alphaToCoverageEnabled) - : undefined, - primitive: primitive - ? new Primitive(primitive.topology, primitive.cullMode, primitive.frontFace, primitive.unclippedDepth) - : undefined, - stencilEnabled: false, - scissorTestEnabled: false - }); - } - createIndexBuffer() { - const { indices, shaderId } = this.modelParams; - let indexBuffer = undefined; - if (indices) { - indexBuffer = new IndexBuffer(shaderId + "IndexBuffer"); - indexBuffer.setIndices(indices); - } - return indexBuffer; - } - createUniformBuffer(uniformBufferParams, shaderData, shaderId) { - const { - type = "uniform", - usage = BufferUsage.Uniform | BufferUsage.CopyDst, - uniforms, - uid, - binding, - buffer, - bufferSize, - visibility - } = uniformBufferParams; - const uniformBuffer = new UniformBuffer({ - label: uid + "_UniformBuffer", - type: type, - usage: usage, - binding, - buffer, - visibility, - size: buffer?.size ?? bufferSize - }); - shaderData.setUniformBuffer(uid, uniformBuffer); - if (!buffer) this.addUniformToShaderData(uniforms, shaderData, uniformBuffer); - } - addUniformToShaderData(uniforms, shaderData, uniformBuffer) { - if (!uniforms) return; - const uniformsNames = Object.getOwnPropertyNames(uniforms); - uniformsNames.map((uniformsName) => { - addUniformToShaderData(uniformsName, uniforms[uniformsName], shaderData, undefined, uniformBuffer); - }); - } -} - -class SpriteGeometry extends Geometry { - constructor() { - super({ - type: "spriteGeometry" - }); - this.init(); - } - init() { - // xyz、uv - const vertices = [-0.5, -0.5, 0, 0, 0, 0.5, -0.5, 0, 1, 0, 0.5, 0.5, 0, 1, 1, -0.5, 0.5, 0, 0, 1]; - const indices = [0, 1, 2, 0, 2, 3]; - this.computeBoundingSphere(vertices, 5); - this.setAttribute(new InterleavedFloat32Attribute(["position", "uv"], vertices, [3, 2])); - this.setIndice(indices); - this.count = indices.length; - } -} - -class SpriteMaterial extends Material { - constructor() { - super(); - this.type = "sprite"; - this.shaderSource = new ShaderSource({ - shaderId: this.type, - defines: { - HAS_UV: true - } - }); - } - update(frameState, mesh) { - if (!this.shaderData || this.dirty) this.createShaderData(mesh); - } - createShaderData(mesh) { - super.createShaderData(); - const uniformBuffer = new UniformBuffer({ label: "sprite" }); - uniformBuffer.setUniform( - "modelMatrix", - () => { - return mesh.modelMatrix; - }, - UniformEnum.Mat4 - ); - uniformBuffer.setUniform("color", mesh, UniformEnum.Color); - uniformBuffer.setUniform("rotation", mesh, UniformEnum.Float); - uniformBuffer.setUniform("center", mesh, UniformEnum.FloatVec2); - uniformBuffer.setUniform("opacity", mesh, UniformEnum.Float); - this.shaderData.setUniformBuffer("sprite", uniformBuffer); - if (this.baseTexture) { - this.shaderData.setDefine("USE_COLORTEXTURE", true); - this.shaderData.setTexture("baseColorTexture", this.baseTexture); - this.shaderData.setSampler("baseColorSampler", this.baseSampler || textureCache.defaultSampler); - } - } - destroy() { - this?.baseTexture?.destroy(); - super.destroy(); - } -} - -class Sprite extends Mesh { - constructor() { - super(); - this.material = new SpriteMaterial(); - this.geometry = new SpriteGeometry(); - this.rotation = Math.PI; - this.opacity = 1; - this.center = new Vector2(0, 0); - this.color = new Color(1, 0, 0); - } - setTexture(texture) { - this.material.baseTexture = texture; - } - setSampler(sampler) { - this.material.baseSampler = sampler; - } -} - -/** - * Ensure first argument passed to the primitive functions is an object - * @param {...*} args - */ -function createBox(options) { - options = options || {}; - const dimensions = options.dimensions || [1, 1, 1]; - const position = options.position || [-dimensions[0] / 2, -dimensions[1] / 2, -dimensions[2] / 2]; - const x = position[0]; - const y = position[1]; - const z = position[2]; - const width = dimensions[0]; - const height = dimensions[1]; - const depth = dimensions[2]; - const fbl = { x: x, y: y, z: z + depth }; - const fbr = { x: x + width, y: y, z: z + depth }; - const ftl = { x: x, y: y + height, z: z + depth }; - const ftr = { x: x + width, y: y + height, z: z + depth }; - const bbl = { x: x, y: y, z: z }; - const bbr = { x: x + width, y: y, z: z }; - const btl = { x: x, y: y + height, z: z }; - const btr = { x: x + width, y: y + height, z: z }; - const positions = [ - // front - fbl.x, - fbl.y, - fbl.z, - fbr.x, - fbr.y, - fbr.z, - ftl.x, - ftl.y, - ftl.z, - ftl.x, - ftl.y, - ftl.z, - fbr.x, - fbr.y, - fbr.z, - ftr.x, - ftr.y, - ftr.z, - // right - fbr.x, - fbr.y, - fbr.z, - bbr.x, - bbr.y, - bbr.z, - ftr.x, - ftr.y, - ftr.z, - ftr.x, - ftr.y, - ftr.z, - bbr.x, - bbr.y, - bbr.z, - btr.x, - btr.y, - btr.z, - // back - fbr.x, - bbr.y, - bbr.z, - bbl.x, - bbl.y, - bbl.z, - btr.x, - btr.y, - btr.z, - btr.x, - btr.y, - btr.z, - bbl.x, - bbl.y, - bbl.z, - btl.x, - btl.y, - btl.z, - // left - bbl.x, - bbl.y, - bbl.z, - fbl.x, - fbl.y, - fbl.z, - btl.x, - btl.y, - btl.z, - btl.x, - btl.y, - btl.z, - fbl.x, - fbl.y, - fbl.z, - ftl.x, - ftl.y, - ftl.z, - // top - ftl.x, - ftl.y, - ftl.z, - ftr.x, - ftr.y, - ftr.z, - btl.x, - btl.y, - btl.z, - btl.x, - btl.y, - btl.z, - ftr.x, - ftr.y, - ftr.z, - btr.x, - btr.y, - btr.z, - // bottom - bbl.x, - bbl.y, - bbl.z, - bbr.x, - bbr.y, - bbr.z, - fbl.x, - fbl.y, - fbl.z, - fbl.x, - fbl.y, - fbl.z, - bbr.x, - bbr.y, - bbr.z, - fbr.x, - fbr.y, - fbr.z - ]; - const uvs = [ - // front - 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, - // right - 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, - // back - 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, - // left - 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, - // top - 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, - // bottom - 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1 - ]; - const normals = [ - // front - 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, - // right - 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, - // back - 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, - // left - -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, - // top - 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, - // bottom - 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0 - ]; - return { - positions: positions, - normals: normals, - uvs: uvs - }; -} -function createSphere(options) { - options = options || {}; - const longBands = options.longBands || 32; - const latBands = options.latBands || 32; - const radius = options.radius || 1; - const lat_step = Math.PI / latBands; - const long_step = (2 * Math.PI) / longBands; - const num_positions = longBands * latBands * 4; - const num_indices = longBands * latBands * 6; - let lat_angle, long_angle; - const positions = new Array(num_positions * 3); - const normals = new Array(num_positions * 3); - const uvs = new Array(num_positions * 2); - const indices = new Array(num_indices); - let x1, x2, x3, x4, y1, y2, z1, z2, z3, z4, u1, u2, v1, v2; - let i, j; - let k = 0, - l = 0; - let vi, ti; - for (i = 0; i < latBands; i++) { - lat_angle = i * lat_step; - y1 = Math.cos(lat_angle); - y2 = Math.cos(lat_angle + lat_step); - for (j = 0; j < longBands; j++) { - long_angle = j * long_step; - x1 = Math.sin(lat_angle) * Math.cos(long_angle); - x2 = Math.sin(lat_angle) * Math.cos(long_angle + long_step); - x3 = Math.sin(lat_angle + lat_step) * Math.cos(long_angle); - x4 = Math.sin(lat_angle + lat_step) * Math.cos(long_angle + long_step); - z1 = Math.sin(lat_angle) * Math.sin(long_angle); - z2 = Math.sin(lat_angle) * Math.sin(long_angle + long_step); - z3 = Math.sin(lat_angle + lat_step) * Math.sin(long_angle); - z4 = Math.sin(lat_angle + lat_step) * Math.sin(long_angle + long_step); - u1 = 1 - j / longBands; - u2 = 1 - (j + 1) / longBands; - v1 = 1 - i / latBands; - v2 = 1 - (i + 1) / latBands; - vi = k * 3; - ti = k * 2; - positions[vi] = x1 * radius; - positions[vi + 1] = y1 * radius; - positions[vi + 2] = z1 * radius; // v0 - positions[vi + 3] = x2 * radius; - positions[vi + 4] = y1 * radius; - positions[vi + 5] = z2 * radius; // v1 - positions[vi + 6] = x3 * radius; - positions[vi + 7] = y2 * radius; - positions[vi + 8] = z3 * radius; // v2 - positions[vi + 9] = x4 * radius; - positions[vi + 10] = y2 * radius; - positions[vi + 11] = z4 * radius; // v3 - normals[vi] = x1; - normals[vi + 1] = y1; - normals[vi + 2] = z1; - normals[vi + 3] = x2; - normals[vi + 4] = y1; - normals[vi + 5] = z2; - normals[vi + 6] = x3; - normals[vi + 7] = y2; - normals[vi + 8] = z3; - normals[vi + 9] = x4; - normals[vi + 10] = y2; - normals[vi + 11] = z4; - uvs[ti] = u1; - uvs[ti + 1] = v1; - uvs[ti + 2] = u2; - uvs[ti + 3] = v1; - uvs[ti + 4] = u1; - uvs[ti + 5] = v2; - uvs[ti + 6] = u2; - uvs[ti + 7] = v2; - indices[l] = k; - indices[l + 1] = k + 1; - indices[l + 2] = k + 2; - indices[l + 3] = k + 2; - indices[l + 4] = k + 1; - indices[l + 5] = k + 3; - k += 4; - l += 6; - } - } - return { - positions: positions, - normals: normals, - uvs: uvs, - indices: indices - }; -} - -class SphereGeometry extends Geometry { - constructor(radius) { - super({ - type: "sphereGeometry" - }); - this.defines = { - HAS_NORMAL: true - }; - this.radius = radius; - this.init(); - } - init() { - const { positions, normals, uvs, indices } = createSphere({ radius: this.radius }); - // this.positions = positions; - // this.normals = normals; - // this.uvs = uvs; - // this.indices = indices; - this.computeBoundingSphere(positions); - this.setAttribute(new Float32Attribute("position", positions, 3)); - this.setAttribute(new Float32Attribute("normal", normals, 3)); - this.setAttribute(new Float32Attribute("uv", uvs, 2)); - this.setIndice(indices); - this.count = indices.length; - } -} - -class BoxGeometry extends Geometry { - constructor(width = 10, height = 10, depth = 10) { - super({ - type: "boxGeometry" - }); - this.width = width; - this.height = height; - this.depth = depth; - this.defines = { - HAS_NORMAL: true - }; - this.init(); - } - init() { - // generate pos uv normal so on - const { positions, normals, uvs } = createBox({ - dimensions: [this.depth, this.width, this.height] - }); - this.computeBoundingSphere(positions); - this.setAttribute(new Float32Attribute("position", positions, 3)); - this.setAttribute(new Float32Attribute("normal", normals, 3)); - this.setAttribute(new Float32Attribute("uv", uvs, 2)); - this.count = 36; - } -} - -class TorusKnotGeometry extends Geometry { - constructor(radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3) { - super({ - type: "torusKnotGeometry" - }); - this.defines = { - HAS_NORMAL: true - }; - this.radius = radius; - this.tube = tube; - this.tubularSegments = tubularSegments; - this.radialSegments = radialSegments; - this.p = p; - this.q = q; - this.init(); - } - init() { - const { normals, uvs, positions, indices } = this.createGeometry(); - this.computeBoundingSphere(positions); - this.setAttribute(new Float32Attribute("position", positions, 3)); - this.setAttribute(new Float32Attribute("normal", normals, 3)); - this.setAttribute(new Float32Attribute("uv", uvs, 2)); - this.setIndice(indices); - this.count = indices.length; - } - createGeometry() { - const positions = [], - normals = [], - uvs = [], - indices = []; - const tubularSegments = Math.floor(this.tubularSegments); - const radialSegments = Math.floor(this.radialSegments); - // helper variables - const vertex = new Vector3(); - const normal = new Vector3(); - const P1 = new Vector3(); - const P2 = new Vector3(); - const B = new Vector3(); - const T = new Vector3(); - const N = new Vector3(); - // generate vertices, normals and uvs - for (let i = 0; i <= tubularSegments; ++i) { - // the radian "u" is used to calculate the position on the torus curve of the current tubular segment - const u = (i / tubularSegments) * this.p * Math.PI * 2; - // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. - // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions - calculatePositionOnCurve(u, this.p, this.q, this.radius, P1); - calculatePositionOnCurve(u + 0.01, this.p, this.q, this.radius, P2); - // calculate orthonormal basis - Vector3.subtract(P2, P1, T); - // T.subVectors( P2, P1 ); - Vector3.add(P2, P1, N); - // N.addVectors( P2, P1 ); - Vector3.cross(T, N, B); - // B.crossVectors( T, N ); - Vector3.cross(B, T, N); - // N.crossVectors( B, T ); - // normalize B, N. T can be ignored, we don't use it - B.normalize(); - N.normalize(); - for (let j = 0; j <= radialSegments; ++j) { - // now calculate the vertices. they are nothing more than an extrusion of the torus curve. - // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. - const v = (j / radialSegments) * Math.PI * 2; - const cx = -this.tube * Math.cos(v); - const cy = this.tube * Math.sin(v); - // now calculate the final vertex position. - // first we orient the extrusion with our basis vectors, then we add it to the current position on the curve - vertex.x = P1.x + (cx * N.x + cy * B.x); - vertex.y = P1.y + (cx * N.y + cy * B.y); - vertex.z = P1.z + (cx * N.z + cy * B.z); - positions.push(vertex.x, vertex.y, vertex.z); - // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) - Vector3.subtract(vertex, P1, normal); - normal.normalize(); - normals.push(normal.x, normal.y, normal.z); - // uv - uvs.push(i / tubularSegments); - uvs.push(j / radialSegments); - } - } - // generate indices - for (let j = 1; j <= tubularSegments; j++) { - for (let i = 1; i <= radialSegments; i++) { - // indices - const a = (radialSegments + 1) * (j - 1) + (i - 1); - const b = (radialSegments + 1) * j + (i - 1); - const c = (radialSegments + 1) * j + i; - const d = (radialSegments + 1) * (j - 1) + i; - // faces - indices.push(a, b, d); - indices.push(b, c, d); - } - } - return { - normals, - uvs, - positions, - indices - }; - } -} -function calculatePositionOnCurve(u, p, q, radius, position) { - const cu = Math.cos(u); - const su = Math.sin(u); - const quOverP = (q / p) * u; - const cs = Math.cos(quOverP); - position.x = radius * (2 + cs) * 0.5 * cu; - position.y = radius * (2 + cs) * su * 0.5; - position.z = radius * Math.sin(quOverP) * 0.5; -} - -class BlinnPhongMaterial extends Material { - constructor() { - super(); - this.type = "phong"; - this.color = new Color(1.0, 0.0, 0.0); - this.shaderSource = new ShaderSource({ - shaderId: this.type, - defines: { - materialPhong: true, - MATERIAL_PHONG: true - } - }); - this.light = true; - this.specular = new Color(1.0, 1.0, 1.0); - this.shininess = 30.0; - this.baseTexture = undefined; - this.baseSampler = undefined; - } - update(frameState, mesh) { - if (!this.shaderData || this.dirty) this.createShaderData(mesh); - } - createShaderData(mesh) { - super.createShaderData(); - const uniformBuffer = new UniformBuffer({ label: "phong" }); - uniformBuffer.setUniform( - "modelMatrix", - () => { - return mesh.modelMatrix; - }, - UniformEnum.Mat4 - ); - uniformBuffer.setUniform("color", this, UniformEnum.Color); - uniformBuffer.setUniform("opacity", this, UniformEnum.Float); - uniformBuffer.setUniform( - "normalMtrix", - () => { - return mesh.normalMatrix; - }, - UniformEnum.Mat4 - ); - uniformBuffer.setUniform("emissive", this, UniformEnum.Color); - uniformBuffer.setUniform("shininess", this, UniformEnum.Float); - uniformBuffer.setUniform("specular", this, UniformEnum.Color); - this.shaderData.setUniformBuffer("phong", uniformBuffer); - if (this.baseTexture) { - this.shaderData.setDefine("USE_COLORTEXTURE", true); - this.shaderData.setTexture("baseColorTexture", this.baseTexture); - this.shaderData.setSampler("baseColorSampler", this.baseSampler || textureCache.defaultSampler); - } - if (this.normalTexture) { - this.shaderData.setDefine("USE_NORMALTEXTURE", true); - this.shaderData.setTexture("normalTexture", this.normalTexture); - this.shaderData.setSampler("normalSampler", this.normalSampler || textureCache.defaultSampler); - } - } - destroy() { - this?.baseTexture?.destroy(); - super.destroy(); - } -} - -class PbrMaterial extends Material { - get roughness() { - return this._roughness; - } - set roughness(value) { - this._roughness = value; - } - get metalness() { - return this._metalness; - } - set metalness(v) { - this._metalness = v; - } - get aoTextureIntensity() { - return this._aoTextureIntensity; - } - set aoTextureIntensity(v) { - this._aoTextureIntensity = v; - } - get normalScale() { - if (this.renderState && this.renderState.primitive) { - if (this.renderState.primitive.cullMode == CullMode.Back) { - return Vector2.negate(this._normalScale, new Vector2()); - } - } - return this._normalScale; - } - set normalScale(v) { - this._normalScale = v; - } - set IBLRender(value) { - this._IBLRender = value; - this.shaderSource.setDefines({ - USE_IBL: this._IBLRender - }); - this.dirty = true; - } - constructor() { - super(); - this.type = "pbr_mat"; - this._roughness = 0.1; - this._metalness = 0.1; - this._aoTextureIntensity = 1.0; - this.light = true; - this._normalScale = new Vector2(1, 1); - this._IBLRender = true; - this.shaderSource = new ShaderSource({ - shaderId: this.type, - defines: { - materialPbr: true, - USE_IBL: this._IBLRender, - MATERIAL_PBR: true - } - }); - } - update(frameState, mesh) { - if (!textureCache.getTexture("specular")) return; - if (!this.shaderData || this.dirty) { - this.createShaderData(mesh); - } - } - createShaderData(mesh) { - super.createShaderData(); - const uniformBuffer = new UniformBuffer({ label: "pbr" }); - uniformBuffer.setUniform( - "modelMatrix", - () => { - return mesh.modelMatrix; - }, - UniformEnum.Mat4 - ); - uniformBuffer.setUniform("color", this, UniformEnum.Color); - uniformBuffer.setUniform("opacity", this, UniformEnum.Float); - uniformBuffer.setUniform( - "normalMtrix", - () => { - return mesh.normalMatrix; - }, - UniformEnum.Mat4 - ); - uniformBuffer.setUniform("emissive", this, UniformEnum.Color); - uniformBuffer.setUniform("metalness", this, UniformEnum.Float); - uniformBuffer.setUniform("roughness", this, UniformEnum.Float); - this.shaderData.setUniformBuffer("pbr", uniformBuffer); - this.specularEnvTexture = textureCache.getTexture("specular"); - if (this.baseTexture) { - this.shaderData.setDefine("USE_TEXTURE", true); - this.shaderData.setTexture("baseColorTexture", this.baseTexture); - this.shaderData.setSampler("baseColorSampler", this.baseSampler || textureCache.defaultSampler); - } - if (this.metalnessRoughnessTexture) { - this.shaderData.setDefine("USE_METALNESSTEXTURE", true); - this.shaderData.setTexture("metalnessRoughnessTexture", this.metalnessRoughnessTexture); - this.shaderData.setSampler( - "metalnessRoughnessSampler", - this.metalnessRoughnessSampler || textureCache.defaultSampler - ); - } - if (this.normalTexture) { - uniformBuffer.setUniform("normalScale", this, UniformEnum.FloatVec2); - this.shaderData.setDefine("USE_NORMALTEXTURE", true); - this.shaderData.setTexture("normalTexture", this.normalTexture); - this.shaderData.setSampler("normalSampler", this.normalSampler || textureCache.defaultSampler); - } - if (this.aoTexture) { - this.shaderData.setDefine("USE_AOTEXTURE", true); - this.shaderData.setTexture("aoTexture", this.aoTexture); - this.shaderData.setSampler("aoSampler", this.aoSampler || textureCache.defaultSampler); - uniformBuffer.setUniform("aoTextureIntensity", this, UniformEnum.Float); - } - if (this.emissiveTexture) { - this.shaderData.setDefine("USE_EMISSIVETEXTURE", true); - this.shaderData.setTexture("emissiveTexture", this.emissiveTexture); - this.shaderData.setSampler("emissiveSampler", this.emissiveSampler || textureCache.defaultSampler); - } - if (this.specularEnvTexture && this._IBLRender) { - this.shaderData.setTexture("specularEnvTexture", this.specularEnvTexture); - this.shaderData.setSampler("specularEnvSampler", this.specularEnvSampler || textureCache.defaultSampler); - } - } - destroy() { - this?.aoTexture?.destroy(); - this?.baseTexture?.destroy(); - this?.emissiveTexture?.destroy(); - this?.normalTexture?.destroy(); - this.specularEnvTexture = undefined; - } -} - -class EventDispatcher { - constructor() { - this._listeners = {}; - } - addEventListener(type, listener) { - if (this._listeners === undefined) this._listeners = {}; - const listeners = this._listeners; - if (listeners[type] === undefined) { - listeners[type] = []; - } - if (listeners[type].indexOf(listener) === -1) { - listeners[type].push(listener); - } - } - hasEventListener(type, listener) { - if (this._listeners === undefined) return false; - const listeners = this._listeners; - return listeners[type] !== undefined && listeners[type].indexOf(listener) !== -1; - } - removeEventListener(type, listener) { - if (this._listeners === undefined) return; - const listeners = this._listeners; - const listenerArray = listeners[type]; - if (listenerArray !== undefined) { - const index = listenerArray.indexOf(listener); - if (index !== -1) { - listenerArray.splice(index, 1); - } - } - } - dispatchEvent(event) { - if (this._listeners === undefined) return; - const listeners = this._listeners; - const listenerArray = listeners[event.type]; - if (listenerArray !== undefined) { - event.target = this; - const array = listenerArray.slice(0); - for (let i = 0, l = array.length; i < l; i++) { - array[i].call(this, event); - } - event.target = null; - } - } -} - -class RenderQueue { - constructor() { - this.pre = []; - this.opaque = []; - this.transparent = []; - this.computes = []; - this.debugQueue = []; - } - sort() { - RenderQueue.sort(this.opaque, 0, this.opaque.length, RenderQueue._compareFromNearToFar); - RenderQueue.sort(this.transparent, 0, this.transparent.length, RenderQueue._compareFromFarToNear); - } - opaqueRender(camera, context, passEncoder, replaceMaterial, commandSubType, lightManger) { - this.opaque.map((mesh) => { - if (!mesh.ready) return; - mesh.beforeRender(); - RenderQueue.excuteCommand( - mesh.getDrawCommand(replaceMaterial, commandSubType, lightManger), - context, - passEncoder, - camera - ); - mesh.afterRender(); - }); - } - transparentRender(camera, context, passEncoder, replaceMaterial, commandSubType, lightManger) { - this.transparent.map((mesh) => { - if (!mesh.ready) return; - mesh.beforeRender(); - RenderQueue.excuteCommand( - mesh.getDrawCommand(replaceMaterial, commandSubType, lightManger), - context, - passEncoder, - camera - ); - mesh.afterRender(); - }); - } - computeRender(context, passEncoder) { - this.computes.map((compute) => { - RenderQueue.excuteCompute(compute.getCommand(), context, passEncoder); - }); - } - debugQueueRender(camera, context, passEncoder, replaceMaterial, commandSubType) { - this.debugQueue.map((mesh) => { - if (!mesh.ready) return; - mesh.beforeRender(); - RenderQueue.excuteCommand( - mesh.getDrawCommand(replaceMaterial, commandSubType), - context, - passEncoder, - camera - ); - mesh.afterRender(); - }); - } - preRender(camera, context, passEncoder, replaceMaterial) { - this.pre.map((mesh) => { - if (!mesh.ready) return; - mesh.beforeRender(); - RenderQueue.excuteCommand(mesh.getDrawCommand(), context, passEncoder, camera); - mesh.afterRender(); - }); - } - static excuteCommand(command, context, passEncoder, camera) { - command.render({ - device: context.device, - passEncoder, - camera, - viewPort: context?.viewPort, - scissorTest: context?.scissorTest - }); - } - static excuteCompute(command, context, passEncoder) { - command.render({ device: context.device, passEncoder }); - } - reset() { - this.pre = []; - this.opaque = []; - this.transparent = []; - this.computes = []; - this.debugQueue = []; - } - static _compareFromNearToFar(a, b) { - return a.priority - b.priority || a.distanceToCamera - b.distanceToCamera; - } - static _compareFromFarToNear(a, b) { - return a.priority - b.priority || b.distanceToCamera - a.distanceToCamera; - } - // according to camera distance - static sort(insatnce, from, to, compareFunc) { - RenderQueue._quickSort(insatnce, from, to, compareFunc); - } - // from https://github.com/oasis-engine/engine/blob/main/packages/core/src/RenderPipeline/RenderQueue.ts - static _quickSort(a, from, to, compareFunc) { - while (true) { - // Insertion sort is faster for short arrays. - if (to - from <= 10) { - RenderQueue._insertionSort(a, from, to, compareFunc); - return; - } - const third_index = (from + to) >> 1; - // Find a pivot as the median of first, last and middle element. - let v0 = a[from]; - let v1 = a[to - 1]; - let v2 = a[third_index]; - const c01 = compareFunc(v0, v1); - if (c01 > 0) { - // v1 < v0, so swap them. - const tmp = v0; - v0 = v1; - v1 = tmp; - } // v0 <= v1. - const c02 = compareFunc(v0, v2); - if (c02 >= 0) { - // v2 <= v0 <= v1. - const tmp = v0; - v0 = v2; - v2 = v1; - v1 = tmp; - } else { - // v0 <= v1 && v0 < v2 - const c12 = compareFunc(v1, v2); - if (c12 > 0) { - // v0 <= v2 < v1 - const tmp = v1; - v1 = v2; - v2 = tmp; - } - } - // v0 <= v1 <= v2 - a[from] = v0; - a[to - 1] = v2; - const pivot = v1; - let low_end = from + 1; // Upper bound of elements lower than pivot. - let high_start = to - 1; // Lower bound of elements greater than pivot. - a[third_index] = a[low_end]; - a[low_end] = pivot; - // From low_end to i are elements equal to pivot. - // From i to high_start are elements that haven't been compared yet. - partition: for (let i = low_end + 1; i < high_start; i++) { - let element = a[i]; - let order = compareFunc(element, pivot); - if (order < 0) { - a[i] = a[low_end]; - a[low_end] = element; - low_end++; - } else if (order > 0) { - do { - high_start--; - if (high_start == i) break partition; - const top_elem = a[high_start]; - order = compareFunc(top_elem, pivot); - } while (order > 0); - a[i] = a[high_start]; - a[high_start] = element; - if (order < 0) { - element = a[i]; - a[i] = a[low_end]; - a[low_end] = element; - low_end++; - } - } - } - if (to - high_start < low_end - from) { - this._quickSort(a, high_start, to, compareFunc); - to = low_end; - } else { - this._quickSort(a, from, low_end, compareFunc); - from = high_start; - } - } - } - static _insertionSort(a, from, to, compareFunc) { - for (let i = from + 1; i < to; i++) { - let j; - const element = a[i]; - for (j = i - 1; j >= from; j--) { - const tmp = a[j]; - const order = compareFunc(tmp, element); - if (order > 0) { - a[j + 1] = tmp; - } else { - break; - } - } - a[j + 1] = element; - } - } -} - -class FrameState { - constructor(context, lightManger, options = {}) { - this.context = context; - this.lightManger = lightManger; - this.background = options.background; - this.renderQueue = new RenderQueue(); - this.geometryMemory = 0; - this.textureMemory = 0; - this.frameNumber = 0; - this._defines = {}; - this.definesDirty = true; - } - get defines() { - return this._defines; - } - set defines(value) { - this.definesDirty = true; - this._defines = combine(value, this._defines, false); - } - update(camera, options = {}) { - this.background = options.background; - this.renderQueue.reset(); - this?.lightManger?.update?.(this, camera); - this.cullingVolume = camera.getCullingVolume(); - this.frameNumber += 1; - } - resetCullingVolume(camera) { - this.cullingVolume = camera.getCullingVolume(); - } - static getFrameStateOptionsByScene(sceneInstance) { - return { - background: sceneInstance.background - }; - } -} - -class AmbientLight extends Light { - constructor(color, intensity) { - super(color, intensity); - this.lightType = LightType.AmbientLight; - this._colorAndIntensity = new Vector4(color.x, color.y, color.z, intensity); - } - get ColorAndIntensity() { - this._colorAndIntensity.set(this.color.x, this.color.y, this.color.z, this.intensity); - return this._colorAndIntensity; - } -} -// light.color ).multiplyScalar( light.intensity * scaleFactor ); - -class LightManger { - constructor(options) { - this.spotLights = []; - this.pointLights = []; - this.directLights = []; - this.ambientLight = new AmbientLight(new Vector3(1.0, 1.0, 1.0), 0.2); - this.lightCountDirty = true; - this.openShadow = options.openShadow; - } - update(frameState, camera) { - this.checkLightShadowState(); - this.updateLight(camera); - } - add(light) { - this.lightCountDirty = true; - if (light.lightType == LightType.AmbientLight) { - this.ambientLight = light; - } else if (light.lightType == LightType.DirectionalLight) { - this.directLights.push(light); - } else if (light.lightType == LightType.PointLight) { - this.pointLights.push(light); - } else if (light.lightType == LightType.SpotLight) { - this.spotLights.push(light); - } - } - remove(light) { - this.lightCountDirty = true; - if (light.lightType == LightType.AmbientLight) { - this.ambientLight = new AmbientLight(new Vector3(1.0, 1.0, 1.0), 1.0); - } else if (light.lightType == LightType.DirectionalLight) { - this.directLights.splice(this.directLights.indexOf(light), 1); - } else if (light.lightType == LightType.PointLight) { - this.pointLights.splice(this.pointLights.indexOf(light), 1); - } else if (light.lightType == LightType.SpotLight) { - this.spotLights.splice(this.spotLights.indexOf(light), 1); - } - } - checkLightShadowState() { - const lights = this.getAllLights(); - for (let i = 0; i < lights.length; i++) { - const light = lights[i]; - if (light.shadowDirty) { - light.shadowDirty = false; - this.lightCountDirty = true; - } - } - } - updateLightShadow() { - if (this.spotLightShadowMapTextureArray) this.spotLightShadowMapTextureArray.dirty = true; - if (this.pointLightShadowMapTextureArray) this.pointLightShadowMapTextureArray.dirty = true; - if (this.directLightShadowMapTextureArray) this.directLightShadowMapTextureArray.dirty = true; - } - updateLight(camera) { - if (this.lightCountDirty) { - this.lightCountDirty = false; - if (this.lightShaderData) this.lightShaderData.destroy(); - this.createLightShaderData(); - } - } - createLightShaderData() { - this.lightShaderData = new ShaderData("light", 0, 2, 2); - this.lightUniformBuffer = new UniformBuffer({ - label: "light", - type: BufferBindingType.ReadOnlyStorage, - usage: BufferUsage.Storage | BufferUsage.CopyDst - }); - this.lightShaderData.setDefine("spotLightsCount", this.spotLights.length); - this.lightShaderData.setDefine("pointLightsCount", this.pointLights.length); - this.lightShaderData.setDefine("dirtectLightsCount", this.directLights.length); - this.lightShaderData.setDefine("ambientLightCount", 1); - this.lightShaderData.setDefine("USE_SPOTLIGHT", this.spotLights.length); - this.lightShaderData.setDefine("USE_POINTLIGHT", this.pointLights.length); - this.lightShaderData.setDefine("USE_DIRTECTLIGHT", this.directLights.length); - this.lightShaderData.setDefine("USE_AMBIENTLIGHT", 1); - if (this.ambientLight) - this.lightUniformBuffer.setUniform( - "ambientLight", - () => { - return this.ambientLight.ColorAndIntensity; - }, - UniformEnum.FloatVec4 - ); - if (this.spotLights.length) { - // 初始化聚光灯 - this.lightUniformBuffer.setUniform( - "spotLights", - () => { - return this.spotLights; - }, - UniformEnum.SpotLights, - this.spotLights.length - ); - } - if (this.pointLights.length) { - // 点光源 - this.lightUniformBuffer.setUniform( - "pointLights", - () => { - return this.pointLights; - }, - UniformEnum.PointLights, - this.pointLights.length - ); - } - if (this.directLights.length) { - // 方向光 - this.lightUniformBuffer.setUniform( - "directLights", - () => { - return this.directLights; - }, - UniformEnum.DirtectLights, - this.directLights.length - ); - } - shadowShaderData: { - if (this.openShadow) { - const spotLightShadowMapTextureArray = (this.spotLightShadowMapTextureArray = - this.createShadowMapTextureArray(this.spotLights)); - const pointLightShadowMapTextureArray = (this.pointLightShadowMapTextureArray = - this.createShadowMapTextureArray(this.pointLights)); - const directLightShadowMapTextureArray = (this.directLightShadowMapTextureArray = - this.createShadowMapTextureArray(this.directLights)); - if ( - !spotLightShadowMapTextureArray && - !pointLightShadowMapTextureArray && - !directLightShadowMapTextureArray - ) - break shadowShaderData; - // define - this.lightShaderData.setDefine("openShadow", this.openShadow); - this.lightShaderData.setDefine("OPEN_SHADOW", this.openShadow); - // shadowUniformBuffer - this.shadowUniformBuffer = new UniformBuffer({ - label: "shadow", - type: BufferBindingType.ReadOnlyStorage, - usage: BufferUsage.Storage | BufferUsage.CopyDst - }); - // matrix,near,far... - const spotLightWithShadowCount = this.setShadowUniform( - "spotLightShadows", - this.spotLights, - UniformEnum.SpotLightShadows - ); - const pointLightWithShadowCount = this.setShadowUniform( - "pointLightShadows", - this.pointLights, - UniformEnum.PointLightShadows - ); - const directLightWithShadowCount = this.setShadowUniform( - "directLightShadows", - this.directLights, - UniformEnum.DirtectLightShadows - ); - this.lightShaderData.setUniformBuffer("shadow", this.shadowUniformBuffer); - this.lightShaderData.setDefine("spotLightShadowMapsCount", spotLightWithShadowCount); - this.lightShaderData.setDefine("pointLightShadowMapsCount", pointLightWithShadowCount); - this.lightShaderData.setDefine("directLightShadowMapsCount", directLightWithShadowCount); - this.lightShaderData.setDefine("USE_SPOTLIGHT_SHADOWMAP", spotLightWithShadowCount); - this.lightShaderData.setDefine("USE_POINTLIGHT_SHADOWMAP", pointLightWithShadowCount); - this.lightShaderData.setDefine("USE_DIRECTLIGHT_SHADOWMAP", directLightWithShadowCount); - // texture,sample - if (spotLightShadowMapTextureArray !== undefined) { - if (spotLightShadowMapTextureArray.textureProp.size.depth != spotLightWithShadowCount) - console.warn("spotLightShadowMap align has problem"); - this.lightShaderData.setTexture("spotLightShadowMapTextureArray", spotLightShadowMapTextureArray); - this.lightShaderData.setDefine("SPOTLIGHT_SHADOWMAP_TEXTUREARRAY", true); - // this._testTexture = spotLightShadowMapTextureArray - } - if (pointLightShadowMapTextureArray !== undefined) { - if (pointLightShadowMapTextureArray.textureProp.size.depth != pointLightWithShadowCount) - console.warn("pointLightShadowMap align has problem"); - this.lightShaderData.setTexture("pointLightShadowMapTextureArray", pointLightShadowMapTextureArray); - this.lightShaderData.setDefine("POINTLIGHT_SHADOWMAP_TEXTUREARRAY", true); - // this._testTexture = pointLightShadowMapTextureArray; - } - if (directLightShadowMapTextureArray !== undefined) { - if (directLightShadowMapTextureArray.textureProp.size.depth != directLightWithShadowCount) - console.warn("directLightShadowMap align has problem"); - this.lightShaderData.setTexture( - "directLightShadowMapTextureArray", - directLightShadowMapTextureArray - ); - this.lightShaderData.setDefine("DIRECTLIGHT_SHADOWMAP_TEXTUREARRAY", true); - // this._testTexture = directLightShadowMapTextureArray - } - this.lightShaderData.setSampler( - "shadowSampler", - new Sampler({ compare: CompareFunction.Less }, { type: SamplerBindingType.Comparison }) - ); - // this.lightShaderData.setSampler("shadowSampler", new Sampler()); - } - } - this.lightShaderData.setUniformBuffer("light", this.lightUniformBuffer); - } - getAllLights() { - const result = []; - return result.concat(this.spotLights, this.pointLights, this.directLights); - } - destroy() { - this.lightShaderData.destroy(); - this.lightUniformBuffer.destroy(); - } - createShadowMapTextureArray(lights) { - if (lights.length <= 0) return undefined; - const shadowMapSources = []; - for (let i = 0; i < lights.length; i++) { - const light = lights[i]; - if (light.shadow) { - const shadowMapTexture = light.shadow.getShadowMapTexture(); - const shadowMapSource = { - source: shadowMapTexture, - width: shadowMapTexture.textureProp.size.width, - height: shadowMapTexture.textureProp.size.height, - depth: 1, - x: 0, - y: 0, - z: i - }; - shadowMapSources.push(shadowMapSource); - } - } - if (shadowMapSources.length <= 0) return undefined; - const shadowMapTextureArray = new Texture({ - size: { - width: shadowMapSources[0].width, - height: shadowMapSources[0].height, - depth: shadowMapSources.length - }, - fixedSize: true, - sampleType: TextureSampleType.Depth, - format: TextureFormat.Depth24Plus, - usage: TextureUsage.TextureBinding | TextureUsage.CopyDst, - data: shadowMapSources, - viewFormats: TextureViewDimension.E2dArray - }); - return shadowMapTextureArray; - } - setShadowUniform(uniformName, lights, uniformType) { - if (lights.length) { - const lightWithShadowArray = []; - for (let i = 0; i < lights.length; i++) { - const light = lights[i]; - if (!light.shadow) continue; - lightWithShadowArray.push(light); - } - this.shadowUniformBuffer.setUniform( - uniformName, - () => { - return lightWithShadowArray; - }, - uniformType, - lightWithShadowArray.length - ); - return lightWithShadowArray.length; - } - } -} - -class MeshManger { - constructor() { - this._list = new Map(); - } - get length() { - return this._list.size; - } - update(frameState, camera) { - this._list.forEach((instance) => { - instance.update(frameState, camera); - }); - } - add(instance) { - if (this._list.get(instance.uid)) return this._list.get(instance.uid); - this._list.set(instance.uid, instance); - return instance; - } - remove(instance) { - if (this._list.get(instance.uid)) { - instance.destroy(); - this._list.delete(instance.uid); - return true; - } - return false; - } - contains(instance) { - return !!this._list.get(instance.uid); - } -} - -class ResolveFrame { - constructor() { - this.geometry = new Geometry({}); - this.geometry.setAttribute( - new Float32Attribute("position", [-1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0], 2) - ); - this.geometry.count = 6; - const shader = getVertFrag("resolve", { positionLocation: 0 }); - this.material = new ShaderMaterial({ - shaderId: "resolve", - frag: shader.frag, - vert: shader.vert, - uniformTextureAndSampler: { - texture: { - type: "texture", - value: undefined - }, - sampler: { - type: "sampler", - value: new Sampler({ - magFilter: "linear", - minFilter: "linear" - }) - } - } - }); - this.quadMesh = new Mesh(this.geometry, this.material); - } - setSize(width, height) { - this.canvasRenderTarget.setSize(width, height); - this.material.dirty = true; - } - render(context, colorTexture) { - if (!this.canvasRenderTarget) this.initRenderTarget(context); - // this.material - this.material.shaderMaterialParms.uniformTextureAndSampler.texture.value = colorTexture; - this.material.update(undefined, this.quadMesh); - const drawComand = this.quadMesh.getDrawCommand(); - const currentRenderPassEncoder = this.canvasRenderTarget.beginRenderPass(context.device); - drawComand.render({ device: context.device, passEncoder: currentRenderPassEncoder }); - this.canvasRenderTarget.endRenderPass(); - } - initRenderTarget(context) { - const { width, height, depth } = context.presentationSize; - const colorAttachment = new Attachment( - { r: 0.0, g: 0.0, b: 0.0, a: 0 }, - { - textureView: () => { - return context.context.getCurrentTexture().createView(); - } - } - ); - const depthTexture = new Texture({ - label: "resolveDepth", - size: { width, height, depth }, - format: TextureFormat.Depth24Plus, - usage: TextureUsage.RenderAttachment - }); - const depthAttachment = new Attachment(1.0, { texture: depthTexture }); - this.canvasRenderTarget = new RenderTarget("render", [colorAttachment], depthAttachment); - } -} - -class PostEffectCollection { - constructor() { - this._postEffects = new Map(); - this.currentColorTexture = undefined; - this.resolveFrame = new ResolveFrame(); - } - add(postEffect) { - this._postEffects.set(postEffect.id, postEffect); - } - remove(postEffect) { - this._postEffects.delete(postEffect.id); - postEffect.destroy(); - } - render(context, colorTexture) { - this.currentColorTexture = colorTexture; - this._postEffects.forEach((postEffect) => { - this.currentColorTexture = postEffect.render(context, this.currentColorTexture); - }); - this.resolveFrame.render(context, this.currentColorTexture); - } - setSize(width, height) { - this._postEffects.forEach((postEffect) => postEffect.setSize(width, height)); - this.resolveFrame.setSize(width, height); - } - postEffectsSort() { - // this._postEffects.sort() - } -} - -class Pass { - constructor(context) { - this.context = context; - } - update(frameState) { - // todo; - } - setSize(width, height) { - // todo ; - } - beforeRender(options) { - this.passRenderEncoder = this.renderTarget.beginRenderPass(this.context.device); - if (this.computeTarget) - this.passComputeEncoder = this.computeTarget.beginComputePassEncoder(this.context.device); - } - getColorTexture(index = 0) { - return this.renderTarget.getColorTexture(index); - } - getDepthTexture() { - return this.renderTarget.getDepthTexture(); - } - afterRender() { - this.renderTarget.endRenderPass(); - if (this.computeTarget) this.computeTarget.endComputePassEncoder(); - } -} - -class BasicPass extends Pass { - constructor(context) { - super(context); - this.init(context); - } - beforeRender(frameState) { - this.updateRenderTarget(frameState); - super.beforeRender(); - } - render(frameState, camera) { - const { renderQueue, lightManger } = frameState; - renderQueue.sort(); - renderQueue.preRender(camera, this.context, this.passRenderEncoder); - renderQueue.transparentRender(camera, this.context, this.passRenderEncoder, undefined, undefined, lightManger); - renderQueue.opaqueRender(camera, this.context, this.passRenderEncoder, undefined, undefined, lightManger); - renderQueue.debugQueueRender(camera, this.context, this.passRenderEncoder); - } - init(context) { - this.createRenderTarget(context); - } - createRenderTarget(context) { - const { width, height, depth } = context.presentationSize; - const colorTexture = new Texture({ - label: "basicPassColor", - size: { width, height, depth }, - format: this.context.presentationFormat, - usage: TextureUsage.RenderAttachment | TextureUsage.TextureBinding - }); - const depthTexture = new Texture({ - label: "basicPassDepth", - size: { width, height, depth }, - format: TextureFormat.Depth24Plus, - usage: TextureUsage.RenderAttachment - }); - const colorAttachment = new Attachment({ r: 0.0, g: 0.0, b: 0.0, a: 0.0 }, { texture: colorTexture }); - const depthAttachment = new Attachment(1.0, { texture: depthTexture }); - this.renderTarget = new RenderTarget("render", [colorAttachment], depthAttachment); - } - setSize(width, height) { - this.renderTarget.setSize(width, height, 1); - } - updateRenderTarget(frameState) { - if (frameState?.background?.value instanceof Color) { - const { red, green, blue } = frameState.background.value; - const opacity = frameState.background?.opacity; - const clearValue = { - r: red, - g: green, - b: blue, - a: opacity ?? 1.0 - }; - this.renderTarget.colorAttachments[0].value = clearValue; - } - } -} - -/** - * A plane in Hessian Normal Form defined by - *
- * ax + by + cz + d = 0
- * 
- * where (a, b, c) is the plane's normal, d is the signed - * distance to the plane, and (x, y, z) is any point on - * the plane. - * - * @alias Plane - * @constructor - * - * @param {Vector3} normal The plane's normal (normalized). - * @param {Number} distance The shortest distance from the origin to the plane. The sign of - * @example - * // The plane x=0 - * const plane = new Plane(Vector3.UNIT_X, 0.0); - * - * @exception {DeveloperError} Normal must be normalized - */ -class Plane { - constructor(normal, distance) { - this.normal = Vector3.clone(normal); - this.distance = distance; - } - normalize() { - const inverseNormalLength = 1.0 / this.normal.length(); - this.normal = Vector3.multiplyByScalar(this.normal, inverseNormalLength, this.normal); - this.distance *= inverseNormalLength; - return this; - } - static fromPointNormal(point, normal, result) { - if (!GMath.equalsEpsilon(Vector3.magnitude(normal), 1.0, GMath.EPSILON6)) { - throw new Error("normal must be normalized."); - } - // >>includeEnd('debug'); - const distance = -Vector3.dot(normal, point); - if (!defined(result)) { - return new Plane(normal, distance); - } - Vector3.clone(normal, result.normal); - result.distance = distance; - return result; - } - static fromVector4(coefficients, result) { - const normal = Vector3.fromVector4(coefficients, scratchNormal); - const distance = coefficients.w; - // >>includeStart('debug', pragmas.debug); - if (!GMath.equalsEpsilon(Vector3.magnitude(normal), 1.0, GMath.EPSILON6)) { - throw new Error("normal must be normalized."); - } - // >>includeEnd('debug'); - if (!defined(result)) { - return new Plane(normal, distance); - } - Vector3.clone(normal, result.normal); - result.distance = distance; - return result; - } - static getPointDistance(plane, point) { - return Vector3.dot(plane.normal, point) + plane.distance; - } - static projectPointOntoPlane(plane, point, result) { - if (!defined(result)) { - result = new Vector3(); - } - // projectedPoint = point - (normal.point + scale) * normal - const pointDistance = Plane.getPointDistance(plane, point); - const scaledNormal = Vector3.multiplyByScalar(plane.normal, pointDistance, scratchCartesian); - return Vector3.subtract(point, scaledNormal, result); - } - static transform(plane, transform, result) { - const normal = plane.normal; - const distance = plane.distance; - const inverseTranspose = Matrix4.inverseTranspose(transform, scratchInverseTranspose); - let planeAsCartesian4 = Vector4.fromElements(normal.x, normal.y, normal.z, distance, scratchPlaneCartesian4); - planeAsCartesian4 = Matrix4.multiplyByVector(inverseTranspose, planeAsCartesian4, planeAsCartesian4); - // Convert the transformed plane to Hessian Normal Form - const transformedNormal = Vector3.fromVector4(planeAsCartesian4, scratchTransformNormal); - planeAsCartesian4 = Vector4.divideByScalar( - planeAsCartesian4, - Vector3.magnitude(transformedNormal), - planeAsCartesian4 - ); - return Plane.fromVector4(planeAsCartesian4, result); - } - static clone(plane, result) { - if (!defined(result)) { - return new Plane(plane.normal, plane.distance); - } - Vector3.clone(plane.normal, result.normal); - result.distance = plane.distance; - return result; - } - static equals(left, right) { - return left.distance === right.distance && Vector3.equals(left.normal, right.normal); - } -} -Plane.ORIGIN_XY_PLANE = Object.freeze(new Plane(Vector3.UNIT_Z, 0.0)); -Plane.ORIGIN_YZ_PLANE = Object.freeze(new Plane(Vector3.UNIT_X, 0.0)); -Plane.ORIGIN_ZX_PLANE = Object.freeze(new Plane(Vector3.UNIT_Y, 0.0)); -const scratchNormal = new Vector3(); -const scratchCartesian = new Vector3(); -const scratchInverseTranspose = new Matrix4(); -const scratchPlaneCartesian4 = new Vector4(); -const scratchTransformNormal = new Vector3(); - -/** - * The culling volume defined by planes. - * - * @alias CullingVolume - * @constructor - * - * @param {Vector4[]} [planes] An array of clipping planes. - */ -class CullingVolume { - constructor(planes) { - this.planes = defaultValue(planes, [ - new Plane(Vector3.UNIT_Z, 0.0), - new Plane(Vector3.UNIT_Z, 0.0), - new Plane(Vector3.UNIT_Z, 0.0), - new Plane(Vector3.UNIT_Z, 0.0), - new Plane(Vector3.UNIT_Z, 0.0), - new Plane(Vector3.UNIT_Z, 0.0) - ]); - } - /** - * Constructs a culling volume from a bounding sphere. Creates six planes that create a box containing the sphere. - * The planes are aligned to the x, y, and z axes in world coordinates. - * - * @param {BoundingSphere} boundingSphere The bounding sphere used to create the culling volume. - * @param {CullingVolume} [result] The object onto which to store the result. - * @returns {CullingVolume} The culling volume created from the bounding sphere. - */ - static fromBoundingSphere(boundingSphere, result) { - if (!defined(boundingSphere)) { - throw new Error("boundingSphere is required."); - } - if (!defined(result)) { - result = new CullingVolume(); - } - const length = faces.length; - const planes = result.planes; - planes.length = 2 * length; - const center = boundingSphere.center; - const radius = boundingSphere.radius; - let planeIndex = 0; - for (let i = 0; i < length; ++i) { - const faceNormal = faces[i]; - let plane0 = planes[planeIndex]; - let plane1 = planes[planeIndex + 1]; - if (!defined(plane0)) { - plane0 = planes[planeIndex] = new Vector4(); - } - if (!defined(plane1)) { - plane1 = planes[planeIndex + 1] = new Vector4(); - } - Vector3.multiplyByScalar(faceNormal, -radius, scratchPlaneCenter); - Vector3.add(center, scratchPlaneCenter, scratchPlaneCenter); - plane0.x = faceNormal.x; - plane0.y = faceNormal.y; - plane0.z = faceNormal.z; - plane0.w = -Vector3.dot(faceNormal, scratchPlaneCenter); - Vector3.multiplyByScalar(faceNormal, radius, scratchPlaneCenter); - Vector3.add(center, scratchPlaneCenter, scratchPlaneCenter); - plane1.x = -faceNormal.x; - plane1.y = -faceNormal.y; - plane1.z = -faceNormal.z; - plane1.w = -Vector3.dot(Vector3.negate(faceNormal, scratchPlaneNormal), scratchPlaneCenter); - planeIndex += 2; - } - return result; - } - /** - * Determines whether a bounding volume intersects the culling volume. - * - * @param {Object} boundingVolume The bounding volume whose intersection with the culling volume is to be tested. - * @returns {Intersect} Intersect.OUTSIDE, Intersect.INTERSECTING, or Intersect.INSIDE. - */ - computeVisibility(boundingVolume) { - if (!defined(boundingVolume)) { - throw new Error("boundingVolume is required."); - } - const planes = this.planes; - let intersecting = false; - for (let k = 0, len = planes.length; k < len; ++k) { - const result = boundingVolume.intersectPlane(planes[k]); - if (result === Intersect.OUTSIDE) { - return Intersect.OUTSIDE; - } else if (result === Intersect.INTERSECTING) { - intersecting = true; - } - } - return intersecting ? Intersect.INTERSECTING : Intersect.INSIDE; - } -} -CullingVolume.MASK_OUTSIDE = 0xffffffff; -CullingVolume.MASK_INSIDE = 0x00000000; -CullingVolume.MASK_INDETERMINATE = 0x7fffffff; -const faces = [new Vector3(), new Vector3(), new Vector3()]; -Vector3.clone(Vector3.UNIT_X, faces[0]); -Vector3.clone(Vector3.UNIT_Y, faces[1]); -Vector3.clone(Vector3.UNIT_Z, faces[2]); -const scratchPlaneCenter = new Vector3(); -const scratchPlaneNormal = new Vector3(); -new Vector4(); -new Plane(new Vector3(1.0, 0.0, 0.0), 0.0); - -class Camera extends RenderObject { - constructor() { - super(); - this._viewMatrix = undefined; - this.type = RenderObjectType.Camera; - this.cullingVolume = new CullingVolume(); - this._viewMatrix = new Matrix4(); - this._vpMatrix = new Matrix4(); - this.projectMatrixDirty = true; - this.createShaderData(); - } - get viewMatrix() { - this.updateMatrix(); - Matrix4.inverse(this.modelMatrix, this._viewMatrix); - return this._viewMatrix; - } - get projectionMatrix() { - this.updateProjectionMatrix(); - return this._projectionMatrix; - } - get vpMatrix() { - Matrix4.multiply(this.projectionMatrix, this.viewMatrix, this._vpMatrix); - return this._vpMatrix; - } - get inverseViewMatrix() { - this.updateMatrix(); - return this.modelMatrix; - } - updateProjectionMatrix() {} - /** - * get a culling volume for this frustum. - */ - getCullingVolume() { - const cloneViewMatrix = this.viewMatrix.clone(new Matrix4()); - const vpMatrix = Matrix4.multiply(this.projectionMatrix, cloneViewMatrix, new Matrix4()); - const planes = this.cullingVolume.planes; - const me = vpMatrix; - const me0 = me[0], - me1 = me[1], - me2 = me[2], - me3 = me[3]; - const me4 = me[4], - me5 = me[5], - me6 = me[6], - me7 = me[7]; - const me8 = me[8], - me9 = me[9], - me10 = me[10], - me11 = me[11]; - const me12 = me[12], - me13 = me[13], - me14 = me[14], - me15 = me[15]; - planes[0] = new Plane(new Vector3(me3 - me0, me7 - me4, me11 - me8), me15 - me12); - planes[0].normalize(); - planes[1] = new Plane(new Vector3(me3 + me0, me7 + me4, me11 + me8), me15 + me12); - planes[1].normalize(); - planes[2] = new Plane(new Vector3(me3 + me1, me7 + me5, me11 + me9), me15 + me13); - planes[2].normalize(); - planes[3] = new Plane(new Vector3(me3 - me1, me7 - me5, me11 - me9), me15 - me13); - planes[3].normalize(); - planes[4] = new Plane(new Vector3(me3 - me2, me7 - me6, me11 - me10), me15 - me14); - planes[4].normalize(); - planes[5] = new Plane(new Vector3(me3 + me2, me7 + me6, me11 + me10), me15 + me14); - planes[5].normalize(); - return this.cullingVolume; - } - createShaderData() { - this.shaderData = new ShaderData("camera", 0, 1, 1); - const uniformBuffer = new UniformBuffer({ label: "camera" }); - uniformBuffer.setUniform( - "projectionMatrix", - () => { - return this.projectionMatrix; - }, - UniformEnum.Mat4 - ); - uniformBuffer.setUniform( - "viewMatrix", - () => { - return this.viewMatrix; - }, - UniformEnum.Mat4 - ); - uniformBuffer.setUniform( - "inverseViewMatrix", - () => { - return this.inverseViewMatrix; - }, - UniformEnum.Mat4 - ); - uniformBuffer.setUniform( - "position", - () => { - return this.position; - }, - UniformEnum.FloatVec3 - ); - this.shaderData.setUniformBuffer("camera", uniformBuffer); - } -} - -class PerspectiveCamera extends Camera { - constructor(fov = 50, aspect = 1, near = 0.1, far = 2000) { - super(); - this._aspect = aspect; - this.fov = fov; - this.near = near; - this.far = far; - this.xOffset = 0; - this.yOffset = 0; - this.projectMatrixDirty = true; - this.updateCameraParms(); - this.cullingVolume = new CullingVolume(); - this.isPerspectiveCamera = true; - } - get aspect() { - return this._aspect; - } - set aspect(v) { - this.projectMatrixDirty = true; - this._aspect = v; - } - get fov() { - return this._fov; - } - set fov(v) { - this.projectMatrixDirty = true; - this._fov = v; - } - updateCameraParms() { - this.top = this.near * Math.tan(0.5 * GMath.RADIANS_PER_DEGREE * this.fov); - this.height = 2 * this.top; - this.width = this.aspect * this.height; - this.left = -0.5 * this.width; - } - updateProjectionMatrix() { - if (this.projectMatrixDirty) { - this.updateCameraParms(); - this._projectionMatrix = Matrix4.makePerspective( - this.left, - this.left + this.width, - this.top, - this.top - this.height, - this.near, - this.far - ); - this.projectMatrixDirty = false; - } - } -} - -class PointLightShadowCamera extends PerspectiveCamera { - constructor(fov = 50, aspect = 1, near = 0.1, far = 2000) { - super(fov, aspect, near, far); - this.vpMatrixArray = [new Matrix4(), new Matrix4(), new Matrix4(), new Matrix4(), new Matrix4(), new Matrix4()]; - } - // createShaderData() { - // this.shaderData = new ShaderData("camera", 0, 1, 1); - // const uniformBuffer = new UniformBuffer({ - // label: "pointLightShadowCamera", - // type: "read-only-storage", - // usage: BufferUsage.Storage | BufferUsage.CopyDst, - // hasDynamicOffset: true, - // minBindingSize: 64, - // maxOffset: 6, - // size: 256 * 6 - // }); - // uniformBuffer.setMatrix4Array( - // "vpMatrixArray", - // () => { - // if (this.vpMatrixArray.length != 6) throw new Error("pointLightShadowCamera uniformBuffer has Error"); - // return this.vpMatrixArray; - // }, - // 6, - // 256 - // ); - // this.shaderData.setUniformBuffer("pointLightShadowCamera", uniformBuffer); - // this.shaderData.setDefine("isPointLightShadowMap", true); - // } - createShaderData() { - this.shaderData = new ShaderData("camera", 0, 1, 1); - const uniformBuffer = new UniformBuffer({ - label: "pointLightShadowCamera", - type: "read-only-storage", - usage: BufferUsage.Storage | BufferUsage.CopyDst - }); - uniformBuffer.setUniform( - "vpMatrix", - () => { - return this.vpMatrix; - }, - UniformEnum.Mat4 - ); - this.shaderData.setUniformBuffer("pointLightShadowCamera", uniformBuffer); - this.shaderData.setDefine("isPointLightShadowMap", true); - this.shaderData.setDefine("IS_POINTLIGHT_SHADOWMAP", true); - } - updateVpMatrixArrayAndIndex(index) { - Matrix4.clone(this.vpMatrix, this.vpMatrixArray[index]); - } -} - -class BaseShadow { - constructor(shadowMapSize, camera) { - this._shadowMapSize = shadowMapSize; - this._camera = camera; - this.viewPortDirty = true; - this.vpMatrixDirty = true; - this._init(); - } - get camera() { - return this._camera; - } - get shadowMapSize() { - return this._shadowMapSize; - } - get viewports() { - return this._viewports; - } - getShadowMapTexture() { - return this._shadowMap; - } - _init() { - this._initShadowMapTexture(); - } - _initShadowMapTexture() { - this._createShadowMapTexture(); - } - _createShadowMapTexture() { - this._shadowMap = new Texture({ - size: { - width: this._shadowMapSize.x, - height: this._shadowMapSize.y, - depth: 1 - }, - fixedSize: true, - sampleType: TextureSampleType.Depth, - format: TextureFormat.Depth24Plus, - usage: TextureUsage.RenderAttachment | TextureUsage.TextureBinding | TextureUsage.CopySrc - }); - } - update(light) {} -} - -class PointLightShadow extends BaseShadow { - get camera() { - return this._camera; - } - constructor() { - const camera = new PointLightShadowCamera(90, 1, 0.1, 500); - super(new Vector2(1536, 1024), camera); - this.viewportSize = new Vector2(512, 512); - this.currentViewportIndex = 0; - this.type = "pointLightShadow"; - this.vpMatrixArrayDirty = true; - this._viewports = [ - // positive X 0 - new Vector4(0, 0, 1 / 3, 1 / 2), - // negative X 1 - new Vector4(1, 0, 1 / 3, 1 / 2), - // positive Z 2 - new Vector4(2, 0, 1 / 3, 1 / 2), - // negative Z 3 - new Vector4(0, 1, 1 / 3, 1 / 2), - // positive Y 4 - new Vector4(1, 1, 1 / 3, 1 / 2), - // negative Y 5 - new Vector4(2, 1, 1 / 3, 1 / 2) - ]; - this._pointLightShadowLookDirections = [ - new Vector3(1, 0, 0), - new Vector3(-1, 0, 0), - new Vector3(0, 0, 1), - new Vector3(0, 0, -1), - new Vector3(0, 1, 0), - new Vector3(0, -1, 0) - ]; - this._pointLightShadowUps = [ - new Vector3(0, 1, 0), - new Vector3(0, 1, 0), - new Vector3(0, 1, 0), - new Vector3(0, 1, 0), - new Vector3(0, 0, 1), - new Vector3(0, 0, -1) - ]; - } - update(light) { - this.updateMatrices(light); - } - updateMatrices(light) { - if (this.camera instanceof PointLightShadowCamera) { - this.camera.position.copy(light.position); - const target = Vector3.clone(light.position); - target.add(this._pointLightShadowLookDirections[this.currentViewportIndex]); - this.camera.up.copy(this._pointLightShadowUps[this.currentViewportIndex]); - const { x, y, z } = target; - this.camera.lookAt(x, y, z); - this.camera.updateMatrix(); - this.camera.updateVpMatrixArrayAndIndex(this.currentViewportIndex); - if (this.currentViewportIndex == 5) this.vpMatrixArrayDirty = true; - } - } -} - -class PointLight extends Light { - get shadow() { - return this._shadow; - } - set shadow(value) { - this.shadowDirty = true; - this._shadow = value; - } - constructor(color, intensity, distance = 0, decay = 4, openShadow = true) { - super(color, intensity); - this._distance = distance; - this._decay = decay; - this.distanceDirty = true; - this.decayDirty = true; - this.lightType = LightType.PointLight; - if (openShadow) this.shadow = new PointLightShadow(); - } - set distance(value) { - this.distanceDirty = true; - this._distance = value; - } - get distance() { - return this._distance; - } - set decay(value) { - this.decayDirty = true; - this._decay = value; - } - get decay() { - return this._decay; - } -} -// uniform -// color: {}, -// position: {}, -// decay: {}, -// distance: {} - -class ShadowPass extends Pass { - constructor(context) { - super(context); - this.init(context); - } - render(frameState, camera) { - const { renderQueue, context, lightManger } = frameState; - const lights = lightManger.getAllLights(); - if (lights.length === 0) return; - for (let i = 0; i < lights.length; i++) { - const light = lights[i]; - const shadow = light.shadow; - if (!shadow) continue; - // this._testTexture = context.lightManger._testTexture - // this.beforeRender({ shadow }); - if (shadow instanceof PointLightShadow && light instanceof PointLight) { - for (let i = 0; i < shadow.viewports.length; i++) { - // 动态buffer暂未调通,先以此种方式解决 - switch (i) { - case 0: - this.renderTarget.depthAttachment.op = "clear"; - break; - default: - this.renderTarget.depthAttachment.op = "load"; - break; - } - this.beforeRender({ shadow }); - const viewport = shadow.viewports[i]; - const viewportSize = shadow.viewportSize; - shadow.currentViewportIndex = i; - shadow.update(light); - // light.forceUpdate = true; - context.setViewPort( - viewport.x * viewportSize.x, - viewport.y * viewportSize.y, - viewportSize.x, - viewportSize.y - ); - context.setScissorTest( - viewport.x * viewportSize.x, - viewport.y * viewportSize.y, - viewportSize.x, - viewportSize.y - ); - this.subRender(renderQueue, shadow, lightManger); - super.afterRender(); - } - } else { - this.renderTarget.depthAttachment.op = "clear"; - this.beforeRender({ shadow }); - shadow.update(light); - context.setViewPort(0, 0, shadow.shadowMapSize.x, shadow.shadowMapSize.y); - context.setScissorTest(0, 0, shadow.shadowMapSize.x, shadow.shadowMapSize.y); - this.subRender(renderQueue, shadow, lightManger); - super.afterRender(); - } - } - // super.afterRender(); - lightManger.updateLightShadow(); - context.resetViewPortToFullCanvas(); - } - subRender(renderQueue, shadow, lightManger) { - renderQueue.sort(); - // renderQueue.preRender(shadow.camera, this.context, this.passRenderEncoder); - renderQueue.transparentRender( - shadow.camera, - this.context, - this.passRenderEncoder, - this.shadowMaterial, - CommandSubType.Shadow, - lightManger - ); - renderQueue.opaqueRender( - shadow.camera, - this.context, - this.passRenderEncoder, - this.shadowMaterial, - CommandSubType.Shadow, - lightManger - ); - } - // getDepthTexture(): Texture { - // return this._testTexture; - // } - beforeRender(options) { - const { shadow } = options; - this.setRenderTarget(shadow); - super.beforeRender(); - } - setSize(width, height) { - this.renderTarget.setSize(width, height, 1); - } - setRenderTarget(shadow) { - this.renderTarget.depthAttachment.texture = shadow.getShadowMapTexture(); - } - init(context) { - this.createRenderTarget(context); - this.createShadowMaterial(); - } - createRenderTarget(context) { - const depthAttachment = new Attachment(1.0, { texture: undefined }); - this.renderTarget = new RenderTarget("render", [], depthAttachment); - } - createShadowMaterial() { - const shadowMapShaderFunction = (defines = {}) => { - const finalDefines = Object.assign( - { - selfBinding: 0, - cameraBinding: 0, - positionLocation: 0 - }, - defines - ); - return getVertFrag("shadowMap", finalDefines).vert; - }; - this.shadowMaterial = new ShaderMaterial({ - shaderId: "shadowMaterial", - uniformBuffers: [ - { - uid: "shadow", - uniforms: { - modelMatrix: { type: "mat4x4", value: null } - } - } - ], - vert: shadowMapShaderFunction, - frag: undefined, - light: false // TODO:先true,false有显示bug - }); - } -} - -class ForwardRenderLine { - constructor(context) { - this.context = context; - this.basicPass = new BasicPass(context); - this.shadowPass = new ShadowPass(context); - } - getOutputTexture() { - return this.basicPass.getColorTexture(0); - // return this.shadowPass.getDepthTexture() - } - render(frameState, camera) { - this.shadowPass.render(frameState, camera); - this.basicPass.beforeRender(frameState); - this.basicPass.render(frameState, camera); - this.basicPass.afterRender(); - } - setSize(width, height) { - this.basicPass.setSize(width, height); - this.shadowPass.setSize(width, height); - } - destroy() { - this.basicPass = undefined; - } -} - -class Scene extends EventDispatcher { - constructor(options) { - super(); - this.container = - options.container instanceof HTMLDivElement - ? options.container - : document.getElementById(options.container); - this.meshManger = new MeshManger(); - this.postEffectCollection = new PostEffectCollection(); - this.context = new Context({ - canvas: null, - container: this.container, - pixelRatio: 1 - }); - this.requestAdapter = options.requestAdapter || {}; - this.deviceDescriptor = options.deviceDescriptor || {}; - this.presentationContextDescriptor = options.presentationContextDescriptor; - this.ready = false; - this.inited = false; - this.lightManger = new LightManger({ openShadow: true }); - this.background = options.background; - } - async init() { - await this.context.init(this.requestAdapter, this.deviceDescriptor, this.presentationContextDescriptor); - this.currentRenderPipeline = new ForwardRenderLine(this.context); - this.frameState = new FrameState(this.context, this.lightManger, FrameState.getFrameStateOptionsByScene(this)); - this.viewport = new ViewPort(0, 0, this.context.presentationSize.width, this.context.presentationSize.height); - this.ready = true; - } - add(instance) { - if ( - [RenderObjectType.Node, RenderObjectType.Skybox, RenderObjectType.Mesh, RenderObjectType.Debug].includes( - instance.type - ) - ) { - this.meshManger.add(instance); - } else if (instance.type == RenderObjectType.Light) { - this.lightManger.add(instance); - } else if (instance.type == RenderObjectType.PostEffect) { - this.postEffectCollection.add(instance); - } - } - remove(instance) { - if ([RenderObjectType.Node, RenderObjectType.Skybox, RenderObjectType.Mesh].includes(instance.type)) { - this.meshManger.remove(instance); - } else if (instance.type == RenderObjectType.Light) { - this.lightManger.remove(instance); - } else if (instance.type == RenderObjectType.PostEffect) { - this.postEffectCollection.remove(instance); - } - } - setCamera(camera) { - this.camera = camera; - } - resize(width, height) { - this.context.resize(width, height); - this?.currentRenderPipeline?.setSize(width, height); - this?.postEffectCollection?.setSize(width, height); - } - async render(node, camera) { - if (!this.inited) { - this.inited = true; - await this.init(); - this.update(node, camera); - this.afterRender(); - } else { - this.update(node, camera); - this.afterRender(); - } - } - afterRender() { - // TODO - } - setViewPort(x, y, width, height) { - if (!this.ready) return false; - this.context.setViewPort(x, y, width, height); - return true; - } - setScissorTest(x, y, width, height) { - if (!this.ready) return false; - this.context.setScissorTest(x, y, width, height); - return true; - } - update(node, camera) { - if (!this.ready) return; - // 释放纹理 - textureCache.releasedTextures(); - // 更新FrameState - this.frameState.update(camera ?? this.camera, FrameState.getFrameStateOptionsByScene(this)); - // update primitive and select - (node ?? this.meshManger).update(this.frameState, camera ?? this.camera); - // selct renderPipeline - this.currentRenderPipeline.render(this.frameState, camera ?? this.camera); - // 后处理 - this.postEffectCollection.render(this.context, this.currentRenderPipeline.getOutputTexture()); - } -} - -class PostEffect { - constructor(width, height, id) { - this.width = width; - this.height = height; - this.initDefaultParms(); - this.id = id; - this.priority = 0; - this.isPostEffect = true; - this.type = RenderObjectType.PostEffect; - } - render(context, colorTexture) { - return null; - } - setSize(width, height) { - // todo ; - } - destroy() { - this?.currentRenderTarget?.destroy(); - } - renderMesh(context) { - this.fullScreenQuad.material.dirty = true; - this.fullScreenQuad.material.update(); - const drawComand = this.fullScreenQuad.getDrawCommand(); - const currentRenderPassEncoder = this.currentRenderTarget.beginRenderPass(context.device); - drawComand.render({ device: context.device, passEncoder: currentRenderPassEncoder }); - this.currentRenderTarget.endRenderPass(); - } - initDefaultParms() { - const geometry = new Geometry({}); - geometry.setAttribute( - new Float32Attribute("position", [-1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0], 2) - ); - geometry.count = 6; - // rs - const primitive = new Primitive(); - const target = new Target(); - // target.format=TextureFormat.RGBA8Unorm - const renderState = new RenderState(); - renderState.primitive = primitive; - renderState.targets = [target]; - this.renderState = renderState; - this.fullScreenQuad = new Mesh(geometry); - this.defaultSampler = new Sampler(); - } -} - -class BloomPostEffect extends PostEffect { - constructor(options) { - super(options.width, options.height, "bloom"); - this.strength = options.strength; - this.radius = options.radius; - this.threshold = options.threshold; - this.init(); - } - destroy() { - this.renderTargetBright.destroy(); - } - render(context, colorTexture) { - // 1. Extract Bright Areas - this.currentRenderTarget = this.renderTargetBright; - this.highPassUniformTextureAndSampler.tDiffuse.value = colorTexture; - this.fullScreenQuad.material = this.materialHighPassFilter; - this.renderMesh(context); - // 2. Blur All the mips progressively - let inputRenderTarget = this.renderTargetBright; - for (let i = 0; i < this.nMips; i++) { - this.fullScreenQuad.material = this.separableBlurMaterials[i]; - this.separableBlurMaterials[i].uniforms.tDiffuse.value = inputRenderTarget.getColorTexture(); - this.separableBlurMaterials[i].uniforms.direction.value = BloomPostEffect.BlurDirectionX; - this.currentRenderTarget = this.renderTargetsHorizontal[i]; - this.renderMesh(context); - this.fullScreenQuad.material = this.separableBlurYMaterials[i]; - this.separableBlurYMaterials[i].uniforms.tDiffuse.value = this.renderTargetsHorizontal[i].getColorTexture(); - this.separableBlurYMaterials[i].uniforms.direction.value = BloomPostEffect.BlurDirectionY; - this.currentRenderTarget = this.renderTargetsVertical[i]; - this.renderMesh(context); - inputRenderTarget = this.renderTargetsVertical[i]; - } - // Composite All the mips - this.fullScreenQuad.material = this.compositeMaterial; - this.currentRenderTarget = this.renderTargetsHorizontal[0]; - this.renderMesh(context); - // blend - this.blendUniformTextureAndSampler.baseColorTexture.value = colorTexture; - this.fullScreenQuad.material = this.blendMaterial; - this.currentRenderTarget = this.blendTarget; - this.renderMesh(context); - return this.currentRenderTarget.getColorTexture(); - } - setSize(width, height) { - this?.renderTargetsHorizontal?.forEach((renderTarget) => renderTarget.setSize(width, height, 1)); - this?.renderTargetsVertical?.forEach((renderTarget) => renderTarget.setSize(width, height, 1)); - this?.renderTargetBright?.setSize?.(width, height, 1); - this?.blendTarget?.setSize?.(width, height, 1); - } - init() { - this.renderTargetsHorizontal = []; - this.renderTargetsVertical = []; - this.nMips = 5; - let resx = Math.round(this.width / 2); - let resy = Math.round(this.height / 2); - this.renderTargetBright = new RenderTarget("render", [this.createColorAttachment(resx, resy)]); - for (let i = 0; i < this.nMips; i++) { - const renderTargetHorizonal = new RenderTarget("render", [this.createColorAttachment(resx, resy)]); - this.renderTargetsHorizontal.push(renderTargetHorizonal); - const renderTargetVertical = new RenderTarget("render", [this.createColorAttachment(resx, resy)]); - this.renderTargetsVertical.push(renderTargetVertical); - resx = Math.round(resx / 2); - resy = Math.round(resy / 2); - } - // luminosity high pass material - this.highPassUniformBuffer = { - uniforms: { - luminosityThreshol: { type: "float", value: this.threshold }, - smoothWidth: { type: "float", value: 0.01 }, - defaultColor: { type: "color", value: new Color(0.0, 0, 0) }, - defaultOpacity: { type: "float", value: 1.0 } - } - }; - this.highPassUniformTextureAndSampler = { - tDiffuse: { type: "texture", value: null }, - tSampler: { - type: "sampler", - value: this.defaultSampler - } - }; - const shader = getVertFrag("luminosityHigh", { positionLocation: 0 }); - this.materialHighPassFilter = new ShaderMaterial({ - shaderId: "bloom", - uniformBuffers: [this.highPassUniformBuffer], - uniformTextureAndSampler: this.highPassUniformTextureAndSampler, - vert: shader.vert, - frag: shader.frag - }); - // Gaussian Blur Materials - this.materialHighPassFilter.renderState = this.renderState; - this.separableBlurMaterials = []; - this.separableBlurYMaterials = []; - const kernelSizeArray = [3, 5, 7, 9, 11]; - resx = Math.round(this.width / 2); - resy = Math.round(this.height / 2); - for (let i = 0; i < this.nMips; i++) { - this.separableBlurMaterials.push(this.getSeperableBlurMaterial(kernelSizeArray[i], "BlurMaterial" + i)); - this.separableBlurYMaterials.push(this.getSeperableBlurMaterial(kernelSizeArray[i], "BlurMaterialY" + i)); - resx = Math.round(resx / 2); - resy = Math.round(resy / 2); - } - // Composite material - this.compositeMaterial = this.getCompositeMaterial(this.nMips, "compositeMaterial"); - this.compositeMaterial.renderState = this.renderState; - this.blendUniformTextureAndSampler = { - tDiffuse: { type: "texture", value: this.renderTargetsHorizontal[0].getColorTexture() }, - baseColorTexture: { type: "texture", value: null }, - tSampler: { - type: "sampler", - value: this.defaultSampler - } - }; - const blendShader = getVertFrag("blend", { positionLocation: 0 }); - this.blendMaterial = new ShaderMaterial({ - shaderId: "postBlend", - uniformTextureAndSampler: this.blendUniformTextureAndSampler, - vert: blendShader.vert, - frag: blendShader.frag - }); - this.blendMaterial.renderState = this.renderState; - this.blendTarget = new RenderTarget("render", [this.createColorAttachment(this.width, this.height)]); - } - createColorAttachment(width, height) { - const colorTexture = new Texture({ - size: { width, height, depth: 1 }, - format: TextureFormat.BGRA8Unorm, - usage: TextureUsage.RenderAttachment | TextureUsage.TextureBinding - }); - const colorAttachment = new Attachment({ r: 0.0, g: 0.0, b: 0.0, a: 0.0 }, { texture: colorTexture }); - return colorAttachment; - } - getCompositeMaterial(nMips, type) { - return new ShaderMaterial({ - shaderId: type, - uniformTextureAndSampler: { - blurTexture1: { type: "texture", value: this.renderTargetsVertical[0].getColorTexture() }, - blurTexture2: { type: "texture", value: this.renderTargetsVertical[1].getColorTexture() }, - blurTexture3: { type: "texture", value: this.renderTargetsVertical[2].getColorTexture() }, - blurTexture4: { type: "texture", value: this.renderTargetsVertical[3].getColorTexture() }, - blurTexture5: { type: "texture", value: this.renderTargetsVertical[4].getColorTexture() }, - tSampler: { - type: "sampler", - value: this.defaultSampler - } - }, - uniformBuffers: [ - { - uid: type, - uniforms: { - bloomStrength: { type: "f32", value: this.strength }, - bloomRadius: { type: "f32", value: this.radius }, - bloomFactors: { type: "array", value: [1.0, 0.8, 0.6, 0.4, 0.2] }, - bloomTintColors: { - type: "array", - value: [ - new Vector3(1, 1, 1), - new Vector3(1, 1, 1), - new Vector3(1, 1, 1), - new Vector3(1, 1, 1), - new Vector3(1, 1, 1) - ] - } - } - } - ], - vert: () => { - return ` - struct VertexInput { - @location(0) position: vec2, - } - struct VertexOutput { - @builtin(position) position: vec4, - @location(0) uv: vec2, - }; - @vertex - fn main(input: VertexInput) -> VertexOutput { - var output:VertexOutput; - output.uv = input.position * 0.5 + 0.5; - output.position = vec4(input.position, 0.0, 1.0);; - return output; - } - `; - }, - frag: (defines) => { - return ` - struct FragInput { - @location(0) uv: vec2, - }; - struct BloomUniforms{ - bloomStrength:f32, - bloomRadius:f32, - bloomFactors : array, - bloomTintColors : array,5> - } - @group(0) @binding(0) var bloomUniforms : BloomUniforms; - - @group(0) @binding(blurTexture1Binding) var blurTexture1: texture_2d; - @group(0) @binding(blurTexture2Binding) var blurTexture2: texture_2d; - @group(0) @binding(blurTexture3Binding) var blurTexture3: texture_2d; - @group(0) @binding(blurTexture4Binding) var blurTexture4: texture_2d; - @group(0) @binding(blurTexture5Binding) var blurTexture5: texture_2d; - @group(0) @binding(tSamplerBinding) var tSampler: sampler; - - fn lerpBloomFactor(factor:f32)->f32 { - let mirrorFactor:f32 = 1.2 - factor; - return mix(factor, mirrorFactor, bloomUniforms.bloomRadius); - } - @fragment - fn main(input:FragInput)-> @location(0) vec4 { - return bloomUniforms.bloomStrength * ( lerpBloomFactor(bloomUniforms.bloomFactors[0]) * vec4(bloomUniforms.bloomTintColors[0], 1.0) * textureSample(blurTexture1, tSampler, input.uv) + - lerpBloomFactor(bloomUniforms.bloomFactors[1]) * vec4(bloomUniforms.bloomTintColors[1], 1.0) * textureSample(blurTexture2, tSampler, input.uv) + - lerpBloomFactor(bloomUniforms.bloomFactors[2]) * vec4(bloomUniforms.bloomTintColors[2], 1.0) * textureSample(blurTexture3, tSampler, input.uv) + - lerpBloomFactor(bloomUniforms.bloomFactors[3]) * vec4(bloomUniforms.bloomTintColors[3], 1.0) * textureSample(blurTexture4, tSampler, input.uv) + - lerpBloomFactor(bloomUniforms.bloomFactors[4]) * vec4(bloomUniforms.bloomTintColors[4], 1.0) * textureSample(blurTexture5, tSampler, input.uv) ); - }`; - } - }); - } - getSeperableBlurMaterial(kernelRadius, type) { - const shader = getVertFrag("blur", { - kernelRadius: kernelRadius, - sigmaConst: kernelRadius, - positionLocation: 0 - }); - const mat = new ShaderMaterial({ - shaderId: type, - uniformBuffers: [ - { - uid: type, - uniforms: { - direction: { type: "vec2", value: new Vector2(0.0, 0.0) } - } - } - ], - uniformTextureAndSampler: { - tDiffuse: { type: "texture", value: null }, - tSampler: { - type: "sampler", - value: this.defaultSampler - } - }, - vert: shader.vert, - frag: shader.frag - }); - mat.renderState = this.renderState; - return mat; - } -} -BloomPostEffect.BlurDirectionX = new Vector2(1.0, 0.0); -BloomPostEffect.BlurDirectionY = new Vector2(0.0, 1.0); - -class OrthographicCamera extends Camera { - constructor(left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000) { - super(); - this.near = near; - this.far = far; - this.left = left; - this.top = top; - this.bottom = bottom; - this.right = right; - this.isOrthographicCamera = true; - } - updateCameraParms() { - const dx = (this.right - this.left) / 2; - const dy = (this.top - this.bottom) / 2; - const cx = (this.right + this.left) / 2; - const cy = (this.top + this.bottom) / 2; - return { - left: cx - dx, - right: cx + dx, - top: cy + dy, - bottom: cy - dy - }; - } - updateProjectionMatrix() { - if (this.projectMatrixDirty) { - const { left, right, top, bottom } = this.updateCameraParms(); - this._projectionMatrix = Matrix4.makeOrthographic(left, right, top, bottom, this.near, this.far); - this.projectMatrixDirty = false; - } - } -} - -class SpotLightShadow extends BaseShadow { - constructor() { - const camera = new PerspectiveCamera(60, 1, 0.1, 500); - super(new Vector2(1024, 1024), camera); - this.type = "spotLightShadow"; - } - update(light) { - this.updateMatrices(light); - } - updateMatrices(light) { - this.camera.position.copy(light.position); - const { x, y, z } = light.target; - this.camera.lookAt(x, y, z); - this.camera.updateMatrix(); - this.vpMatrixDirty = true; - } -} - -class SpotLight extends Light { - constructor(color, intensity, distance = 0, angle = 60, penumbra = 60, decay = 4, openShadow = true) { - super(color, intensity); - this._distance = distance; - this._angle = (angle / 180) * Math.PI; - this._penumbra = (penumbra / 180) * Math.PI; - this._decay = decay; - this.lightType = LightType.SpotLight; - this.angleDirty = true; - this.penumbraDirty = true; - this.distanceDirty = true; - this.decayDirty = true; - this.coneCosDirty = true; - this.penumbraCosDirty = true; - if (openShadow) this.shadow = new SpotLightShadow(); - this.updateConeCosOrPenumbraCos(); - } - get dirtectDirty() { - return this.positionDirty || this.targetDirty; - } - set dirtectDirty(value) { - this.positionDirty = value; - this.targetDirty = value; - } - get directional() { - const result = new Vector3(); - Vector3.subtract(this.position, this.target, result); - return Vector3.normalize(result, new Vector3()); - } - get angle() { - return this._angle; - } - set angle(value) { - this.angleDirty = true; - this._angle = (value / 180) * Math.PI; - this.updateConeCosOrPenumbraCos(); - } - get penumbra() { - return this._penumbra; - } - set penumbra(value) { - this.penumbraDirty = true; - this._penumbra = (value / 180) * Math.PI; - this.updateConeCosOrPenumbraCos(); - } - set distance(value) { - this.distanceDirty = true; - this._distance = value; - } - get distance() { - return this._distance; - } - set decay(value) { - this.decayDirty = true; - this._decay = value; - } - get decay() { - return this._decay; - } - set coneCos(value) { - this.coneCosDirty = true; - this._coneCos = value; - } - get coneCos() { - return this._coneCos; - } - set penumbraCos(value) { - this.penumbraCosDirty = true; - this._penumbraCos = value; - } - get penumbraCos() { - return this._penumbraCos; - } - updateConeCosOrPenumbraCos() { - this._coneCos = Math.cos(this.angle); - this._penumbraCos = Math.cos(this.angle + this.penumbra); - } -} -// uniform -// color: {}, -// position: {}, -// direction: {}, -// distance: {}, -// coneCos: {}, -// penumbraCos: {}, -// decay: {} - -class DirectionalLightShadow extends BaseShadow { - constructor() { - const camera = new OrthographicCamera(-50, 50, 50, -50, 0, 100); - super(new Vector2(1024, 1024), camera); - this.type = "directionalLightShadow"; - } - update(light) { - this.updateMatrices(light); - } - updateMatrices(light) { - this.camera.position.copy(light.position); - const { x, y, z } = light.target; - this.camera.lookAt(x, y, z); - this.camera.updateMatrix(); - this.vpMatrixDirty = true; - } -} - -class DirectionalLight extends Light { - constructor(color, intensity, openShadow = true) { - super(color, intensity); - this.lightType = LightType.DirectionalLight; - if (openShadow) this.shadow = new DirectionalLightShadow(); - } - get dirtectDirty() { - return this.positionDirty || this.targetDirty; - } - set dirtectDirty(value) { - this.positionDirty = value; - this.targetDirty = value; - } - get directional() { - const result = new Vector3(); - Vector3.subtract(this.target, this.position, result); - return result.normalize(); - } -} -// uniform -// direction: {}, -// color: {} - -class Node extends RenderObject { - constructor() { - super(); - this.type = RenderObjectType.Node; - this.children = new Map(); - this.parent = null; - this.uid = createGuid(); - } - add(node) { - node.parent = this; - this.children.set(node.uid, node); - } - remove(node) { - this.children.delete(node.uid); - } - update(frameState, camera) { - this.updateMatrix(this?.parent?.modelMatrix?.clone()); - this?.children?.forEach?.((node) => { - node.update(frameState, camera); - }); - } - destroy() { - this.children.forEach((node) => { - node.destroy(); - }); - this?.children?.clear(); - } - traverse(traverseFunction, param) { - for (let i = 0, len = this.children.size; i < len; i++) { - this.children.forEach((child) => { - child.traverse(traverseFunction, param); - }); - } - } -} - -class SKinMesh extends Mesh { - constructor(geometry, material) { - super(geometry, material); - this.type = RenderObjectType.SkinMesh; - this.uniformMatrixs = []; - this.hasAddJoints = false; - } - setSkinData(data) { - this.inverseBindMatrices = data.inverseBindMatrices; - this.joints = data.joints; - } - update(frameState, camera) { - this.uniformMatrixs = this.joints.map((joint) => joint.modelMatrix); - super.update(frameState, camera); - if (!this.hasAddJoints) this.addUniformsToMaterial(); - } - addUniformsToMaterial() { - if (!this.material.shaderData) return; - this.hasAddJoints = true; - if (this.joints) { - const skinJointsBuffer = new UniformBuffer({ - label: "skinJointsBuffer", - type: BufferBindingType.ReadOnlyStorage, - usage: BufferUsage.Storage | BufferUsage.CopyDst, - size: 3000 - }); - const invsBuffer = new UniformBuffer({ - label: "invsBuffer", - type: BufferBindingType.ReadOnlyStorage, - usage: BufferUsage.Storage | BufferUsage.CopyDst, - size: 3000 - }); - skinJointsBuffer.setUniform( - "joints", - () => { - return this.uniformMatrixs; - }, - UniformEnum.Mat4Array, - this.uniformMatrixs.length - ); - invsBuffer.setUniform( - "jointsInv", - () => { - return this.inverseBindMatrices; - }, - UniformEnum.Mat4Array, - this.inverseBindMatrices.length - ); - this.material.shaderData.setUniformBuffer("skinJointsBuffer", skinJointsBuffer); - this.material.shaderData.setUniformBuffer("invsBuffer", invsBuffer); - } - } -} - -function newTypedArray(type, buffer, byteOffset, length) { - switch (type) { - case 5120: - return new Int8Array(buffer, byteOffset, length); - case 5121: - return new Uint8Array(buffer, byteOffset, length); - case 5122: - return new Int16Array(buffer, byteOffset, length); - case 5123: - return new Uint16Array(buffer, byteOffset, length); - case 5124: - return new Int32Array(buffer, byteOffset, length); - case 5125: - return new Uint32Array(buffer, byteOffset, length); - case 5126: - return new Float32Array(buffer, byteOffset, length); - default: - throw new Error("invalid component type"); - } -} -function toIndices(array) { - if (array instanceof Uint16Array || array instanceof Uint32Array) { - return array; - } - let toArray; - if (array instanceof Float32Array) { - toArray = new Uint32Array(array.length); - } else { - let max = 0; - for (let i = 0; i < array.length; i++) { - max = max < array[i] ? array[i] : max; - } - if (max < 65536) { - toArray = new Uint16Array(array.length); - } else { - toArray = new Uint32Array(array.length); - } - } - array.forEach((element, index) => { - toArray[index] = element; - }); - return toArray; -} -function generateNormals(indices, positions) { - const normals = new Float32Array(positions.length); - const vertexCount = indices ? indices.length : positions.length; - for (let i = 0; i < vertexCount; i += 3) { - const triIndices = []; - for (let n = 0; n < 3; n += 1) { - if (indices) { - triIndices.push(indices[i + n]); - } else { - triIndices.push(i + n); - } - } - const triangle = triIndices.map((vertexIndex) => { - const index = vertexIndex * 3; - return new Vector3(positions[index], positions[index + 1], positions[index + 2]); - }); - const dv1 = new Vector3(); - Vector3.subtract(triangle[1], triangle[0], dv1); - const dv2 = new Vector3(); - Vector3.subtract(triangle[2], triangle[0], dv2); - const normal = new Vector3(); - Vector3.cross(dv1.normalize(), dv2.normalize(), normal); - for (let n = 0; n < 3; n += 1) { - const index = (i + n) * 3; - normals[index + 0] += normal.x; - normals[index + 1] += normal.y; - normals[index + 2] += normal.z; - } - } - return normals; -} -const gltfEnum = { - SCALAR: 1, - VEC2: 2, - VEC3: 3, - VEC4: 4, - MAT2: 4, - MAT3: 9, - MAT4: 16, - 5120: 1, - 5121: 1, - 5122: 2, - 5123: 2, - 5125: 4, - 5126: 4, - 9728: "nearest", - 9729: "linear", - 9984: "linear", - 9985: "linear", - 9986: "linear", - 9987: "linear", - 33071: "clamp-to-edge", - 33648: "mirror-repeat", - 10497: "repeat" -}; - -class Accessor { - constructor(options) { - this.values = options.values ?? []; - this.id = options.id; - this.count = options.count; - this.componentType = options.componentType; - this.type = options.type; - this.min = options.min; - this.max = options.max; - } - getArray() { - return Array.from(this.values); - } - getVec4Array() { - const result = []; - for (let i = 0; i < this.values.length; i += 4) { - result.push(new Vector4(this.values[i], this.values[i + 1], this.values[i + 2], this.values[i + 3])); - } - return result; - } - getMat4Array() { - const result = []; - for (let i = 0; i < this.values.length; i += 16) { - const mat4 = new Matrix4(); - Matrix4.fromColumnMajorArray(this.values.slice(i, i + 16), mat4); - result.push(mat4); - } - return result; - } -} - -class Animation { - constructor(name, samplers, channels) { - this.name = name; - this.samplers = samplers; - this.channels = channels; - } - play(time) { - let node, animationSampler, target; - this?.channels?.map((channel) => { - animationSampler = channel.sampler; - animationSampler.getValue(time); - target = channel.target; - node = target.node; - switch (target.path) { - case "rotation": - Quaternion.clone(animationSampler.currentValue, node.quaternion); - break; - case "translation": - Vector4.clone(animationSampler.currentValue, node.position); - break; - case "scale": - Vector4.clone(animationSampler.currentValue, node.scale); - break; - } - }); - } -} - -class AnimationChannel { - constructor() {} -} - -class AnimationChannelTarget { - constructor(node, path) { - this.node = node; - this.path = path; - } -} - -var Type2NumOfComponent; -(function (Type2NumOfComponent) { - Type2NumOfComponent[(Type2NumOfComponent["SCALAR"] = 1)] = "SCALAR"; - Type2NumOfComponent[(Type2NumOfComponent["VEC2"] = 2)] = "VEC2"; - Type2NumOfComponent[(Type2NumOfComponent["VEC3"] = 3)] = "VEC3"; - Type2NumOfComponent[(Type2NumOfComponent["VEC4"] = 4)] = "VEC4"; - Type2NumOfComponent[(Type2NumOfComponent["MAT2"] = 4)] = "MAT2"; - Type2NumOfComponent[(Type2NumOfComponent["MAT3"] = 9)] = "MAT3"; - Type2NumOfComponent[(Type2NumOfComponent["MAT4"] = 16)] = "MAT4"; -})(Type2NumOfComponent || (Type2NumOfComponent = {})); - -class AnimationSampler { - constructor() {} - formGltf(gltf, sampler) { - this.input = gltf.accessors[sampler.input].values; //required, accessor object - this.output = gltf.accessors[sampler.output].values; //required, accessor object - this.interpolation = sampler.interpolation !== undefined ? sampler.interpolation : "LINEAR"; - this.currentIndex = 0; - // this.currentValue=new Vector4(); - this.endTime = this.input[this.input.length - 1]; - this.inputMax = this.endTime - this.input[0]; - this.inputType = gltf?.json?.accessors[sampler.input]?.type; - this.outputType = gltf?.json?.accessors[sampler.output]?.type; - } - getValue(time) { - if (time > this.endTime) { - time -= this.inputMax * Math.ceil((time - this.endTime) / this.inputMax); - this.currentIndex = 0; - } - const len = this.input.length; - while (this.currentIndex <= len - 2 && time >= this.input[this.currentIndex + 1]) { - this.currentIndex++; - } - if (this.currentIndex >= len - 1) { - // loop - time -= this.inputMax; - this.currentIndex = 0; - } - // @tmp: assume no stride - const count = Type2NumOfComponent[this.outputType]; - const animationOutputValueVec4a = count === 4 ? new Quaternion() : new Vector4(); - const animationOutputValueVec4b = count === 4 ? new Quaternion() : new Vector4(); - if (!this.currentValue) this.currentValue = count === 4 ? new Quaternion() : new Vector4(); - const i = this.currentIndex; - const o = i * count; - const on = o + count; - const u = Math.max(0, time - this.input[i]) / (this.input[i + 1] - this.input[i]); - animationOutputValueVec4a.set(this.output[o + 0], this.output[o + 1], this.output[o + 2], this.output[o + 3]); - animationOutputValueVec4b.set( - this.output[on + 0], - this.output[on + 1], - this.output[on + 2], - this.output[on + 3] - ); - switch (this.interpolation) { - case "LINEAR": - count === 4 - ? Quaternion.slerp(animationOutputValueVec4a, animationOutputValueVec4b, u, this.currentValue) - : Vector4.lerp(animationOutputValueVec4a, animationOutputValueVec4b, u, this.currentValue); - break; - } - } -} - -class GLTF { - constructor(json, rootUrl, glbOffset = 0, glbBin) { - this.json = json; - this.bufferViews = json.bufferViews; - this.glbOffset = glbOffset; - this.rootUrl = rootUrl; - this.scenes = json.scenes; - this.cameras = json.cameras || []; - this.glbBin = glbBin; - this.meshes = []; - } - async parseData() { - this.buffers = await this.loadBuffes(); - this.images = await this.loadImages(); - this.parseSamplers(); - this.parseTextures(); - this.parseMaterials(); - this.parseAccessors(); - this.parseMeshs(); - this.parseNodes(); - this.normalizeData(); - this.parseScenes(); - this.parseAnimations(); - } - getAccessor(index) { - return this.accessors[index]; - } - parseSamplers() { - this.samplers = this.json.samplers ? this.json.samplers.map((sampler) => this.getSampler(sampler)) : []; - } - parseScenes() { - this.scenes = this.json.scenes.map((scene) => { - const nodes = scene?.nodes?.map((nodeId) => { - return this.nodes[nodeId]; - }); - return nodes; - }); - } - parseTextures() { - this.textures = this.json.textures - ? this.json.textures.map((texture) => { - return { - sampler: texture.sampler !== undefined ? this.samplers[texture.sampler] : this.getSampler({}), - texture: this.createTexture(texture.source) - }; - }) - : []; - } - parseMaterials() { - this.materials = this.json.materials - ? this.json.materials.map((material) => { - const mat = new PbrMaterial(); - const { - baseColorFactor, - metallicFactor, - metallicRoughnessTexture, - baseColorTexture, - roughnessFactor - } = material.pbrMetallicRoughness; - if (material.normalTexture) mat.normalTexture = this.textures[material.normalTexture.index].texture; - if (material.occlusionTexture) - mat.aoTexture = this.textures[material.occlusionTexture.index].texture; - if (material.emissiveTexture) - mat.emissiveTexture = this.textures[material.emissiveTexture.index].texture; - if (baseColorTexture) mat.baseTexture = this.textures[baseColorTexture.index].texture; - if (metallicRoughnessTexture) - mat.metalnessRoughnessTexture = this.textures[metallicRoughnessTexture.index].texture; - if (baseColorFactor) - mat.color = new Color(baseColorFactor[0], baseColorFactor[1], baseColorFactor[2]); - mat.metalness = metallicFactor ?? 1.0; - mat.roughness = roughnessFactor ?? 0.0; - mat.baseSampler = new Sampler({ - magFilter: "linear", - minFilter: "linear", - addressModeU: "repeat", - addressModeV: "repeat" - }); - return mat; - }) - : []; - } - parseAccessors() { - this.accessors = this.json.accessors.map((accessor, index) => { - const n = gltfEnum[accessor.type]; - let array; - if (accessor.bufferView === undefined) { - array = newTypedArray( - accessor.componentType, - new ArrayBuffer(n * accessor.count * gltfEnum[accessor.componentType]), - 0, - accessor.count * n - ); - } else { - array = this.getBufferView(accessor, n); - } - if (accessor.sparse) { - accessor.sparse.indices.count = accessor.sparse.count; - accessor.sparse.values.count = accessor.sparse.count; - accessor.sparse.values.componentType = accessor.componentType; - const indices = this.getBufferView(accessor.sparse.indices, 1); - const values = this.getBufferView(accessor.sparse.values, n); - for (let i = 0; i < accessor.sparse.count; i += 1) { - for (let j = 0; j < n; j += 1) { - array[indices[i] * n + j] = values[i * n + j]; - } - } - } - return new Accessor({ - componentType: gltfEnum[accessor.componentType], - count: accessor.count, - type: n, - values: array, - id: index, - min: accessor?.min, - max: accessor?.max - }); - }); - } - parseAnimations() { - this.animations = this?.json?.animations?.map((gltfAnimation, index) => { - const samplers = gltfAnimation?.samplers?.map((gltfSampler) => { - const sampler = new AnimationSampler(); - sampler.formGltf(this, gltfSampler); - return sampler; - }); - const channels = gltfAnimation?.channels?.map((gltfChannel) => { - const animationChannel = new AnimationChannel(); - animationChannel.sampler = samplers[gltfChannel.sampler]; - animationChannel.target = new AnimationChannelTarget( - this.nodes[gltfChannel.target.node], - gltfChannel.target.path - ); - return animationChannel; - }); - const animation = new Animation(index.toString(), samplers, channels); - return animation; - }); - } - parseMeshs() { - this.meshes = this?.json?.meshes?.map?.((gltfmesh) => { - return { - name: gltfmesh.name, - primitives: gltfmesh?.primitives?.map?.((primitive) => { - const material = - primitive.material !== undefined - ? this.materials[primitive.material] - : { pbrMetallicRoughness: {} }; - const geo = this.createGeometry(primitive, material); - const mesh = new Mesh(geo, material); - mesh.name = gltfmesh.name; - return mesh; - }) - }; - }); - } - getSampler(samplerJson) { - return new Sampler({ - magFilter: gltfEnum[samplerJson.magFilter || 9729], - minFilter: gltfEnum[samplerJson.minFilter || 9729], - addressModeU: gltfEnum[samplerJson.wrapS || 10497], - addressModeV: gltfEnum[samplerJson.wrapT || 10497] - }); - } - getBufferView(accessor, n) { - const bufferView = this.bufferViews[accessor.bufferView]; - const offset = (bufferView.byteOffset || 0) + (accessor.byteOffset || 0); - const stride = Math.max(bufferView.byteStride / 4 || 0, n); - let array = newTypedArray( - accessor.componentType, - this.buffers[bufferView.buffer], - bufferView.buffer === 0 ? offset + this.glbOffset : offset, - (accessor.count - 1) * stride + n - ); - if (stride > n) { - const TypedArrayConstructor = array.constructor; - const strided = new TypedArrayConstructor(accessor.count * n); - for (let i = 0, j = 0; i < strided.length; i += n, j += stride) { - for (let k = 0; k < n; k += 1) { - strided[i + k] = array[j + k]; - } - } - array = strided; - } - return array; - } - createGeometry(primitive, material) { - let indices = null; - let accessor = null; - const defines = { HAS_NORMAL: true }; - let vertexCount; - accessor = this.getAccessor(primitive.attributes.POSITION); - const positions = accessor.getArray(); - vertexCount = accessor.count; - // const { max, min } = accessor; - // const boundingBox = { max, min }; - if (primitive.indices !== undefined) { - accessor = this.getAccessor(primitive.indices); - indices = toIndices(accessor.getArray()); - vertexCount = accessor.count; - } - let normals; - if (primitive.attributes.NORMAL !== undefined) { - accessor = this.getAccessor(primitive.attributes.NORMAL); - normals = accessor.getArray(); - } else { - normals = generateNormals(indices, positions); - } - let uvs = null; - if (primitive.attributes.TEXCOORD_0 !== undefined) { - accessor = this.getAccessor(primitive.attributes.TEXCOORD_0); - uvs = accessor.getArray(); - defines.HAS_UV = true; - } - if (primitive.attributes.TEXCOORD_1 !== undefined) { - accessor = this.getAccessor(primitive.attributes.TEXCOORD_1); - accessor.getArray(); - defines.HAS_UV1 = true; - } - if (primitive.attributes.TANGENT !== undefined && primitive.attributes.NORMAL !== undefined) { - accessor = this.getAccessor(primitive.attributes.TANGENT); - accessor.getArray(); - // defines.HAS_TANGENT = true; - } else if (material.normalTexture); - let colors = null, - colorSize = 3; - if (primitive.attributes.COLOR_0 !== undefined) { - accessor = this.accessors[primitive.attributes.COLOR_0]; - colors = accessor.getArray(); - colorSize = accessor.type; - defines.HAS_COLOR = true; - } - let joints = null; - if (primitive.attributes.JOINTS_0 !== undefined) { - accessor = this.getAccessor(primitive.attributes.JOINTS_0); - joints = accessor.getArray(); - defines.HAS_SKIN = true; - } - let weights = null; - if (primitive.attributes.WEIGHTS_0 !== undefined) { - accessor = this.getAccessor(primitive.attributes.WEIGHTS_0); - weights = accessor.getArray(); - } - const geo = new Geometry({ type: "pbrGeomtry" }); - if (indices) geo.setIndice(indices); - if (positions) geo.setAttribute(new Float32Attribute("position", Array.from(positions), 3)); - if (normals) geo.setAttribute(new Float32Attribute("normal", Array.from(normals), 3)); - if (colors) geo.setAttribute(new Float32Attribute("color", Array.from(colors), colorSize)); - if (uvs) geo.setAttribute(new Float32Attribute("uv", Array.from(uvs), 2)); - if (joints) geo.setAttribute(new Float32Attribute("joint0", Array.from(joints), 4)); - if (weights) geo.setAttribute(new Float32Attribute("weight0", Array.from(weights), 4)); - geo.defines = defines; - geo.computeBoundingSphere(Array.from(positions)); - geo.count = vertexCount; - return geo; - } - createTexture(source) { - return new Texture({ - size: { - width: this.images[source].width, - height: this.images[source].height, - depth: 1 - }, - data: { - source: this.images[source] - }, - format: "rgba8unorm", - usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT - }); - } - async loadImages() { - const images = []; - let loadExternalImages = Promise.resolve(); - if (this.json.images) { - loadExternalImages = Promise.all( - this.json.images.map(async (image, index) => { - if (image.uri) { - const imageUrl = image.uri.slice(0, 5) === "data:" ? image.uri : `${this.rootUrl}/${image.uri}`; - images[index] = await fetch(imageUrl) - .then((response) => response.blob()) - .then((blob) => - createImageBitmap(blob, { - colorSpaceConversion: "none" - }) - ); - } - }) - ); - } - let loadInternalImages = Promise.resolve(); - if (this.json.images) { - loadInternalImages = Promise.all( - this.json.images.map(async (image, index) => { - if (image.bufferView !== undefined) { - const { buffer, byteOffset, byteLength } = this.json.bufferViews[image.bufferView]; - const array = new Uint8Array( - this.buffers[buffer], - buffer === 0 ? byteOffset + this.glbOffset : byteOffset, - byteLength - ); - let type; - if (image.mimeType) { - type = image.mimeType; - } else { - type = array[0] === 0xff ? "image/jpeg" : "image/png"; - } - const blob = new Blob([array], { type }); - images[index] = await createImageBitmap(blob, { - colorSpaceConversion: "none" - }); - } - }) - ); - } - await Promise.all([loadExternalImages, loadInternalImages]); - return images; - } - async loadBuffes() { - const buffers = []; - await Promise.all( - this.json.buffers.map((buffer, index) => { - if (!buffer.uri) { - if (index !== 0) { - throw new Error("buffer uri undefined"); - } - buffers[index] = this.glbBin; - return Promise.resolve(); - } - const bufferUrl = buffer.uri.slice(0, 5) === "data:" ? buffer.uri : `${this.rootUrl}/${buffer.uri}`; - return fetch(bufferUrl) - .then((response) => response.arrayBuffer()) - .then((arrayBuffer) => { - buffers[index] = arrayBuffer; - }); - }) - ); - return buffers; - } - parseNodes() { - this.nodes = this?.json?.nodes?.map((gltfNode) => { - const node = new Node(); - this.parseNodeTRS(node, gltfNode); - if (gltfNode.name) node.name = gltfNode.name; - if (gltfNode.mesh != undefined) { - let gltfSkin = undefined, - isSkinMesh = false; - if (gltfNode.skin != undefined) { - gltfSkin = this.json.skins[gltfNode.skin]; - isSkinMesh = true; - } - this.meshes[gltfNode.mesh].primitives.forEach((primitive, index, source) => { - const tempPrimitive = - isSkinMesh && primitive.type == RenderObjectType.Mesh - ? new SKinMesh(primitive.geometry, primitive.material) - : primitive; - if (isSkinMesh && primitive.type == RenderObjectType.Mesh) { - source[index] = tempPrimitive; - tempPrimitive.setSkinData({ - inverseBindMatrices: this.getAccessor(gltfSkin.inverseBindMatrices).getMat4Array(), - joints: gltfSkin.joints - // name: gltfSkin.name, - // skeleton: gltfSkin.skeleton - }); - } - node.add(tempPrimitive); - }); - } - return node; - }); - } - parseNodeTRS(node, gltfNode) { - let { matrix, rotation, translation, scale } = gltfNode; - if (matrix) { - const tempMatrix4 = new Matrix4(), - tempScale = new Vector3(), - tempTranslation = new Vector3(), - tempRotation = new Quaternion(); - Matrix4.fromColumnMajorArray(matrix, tempMatrix4); - Matrix4.getScale(tempMatrix4, tempScale); - Matrix4.getTranslation(tempMatrix4, tempTranslation); - Matrix4.getRotation(tempMatrix4, tempRotation); - rotation = tempRotation.toArray(); - translation = tempTranslation.toArray(); - scale = tempScale.toArray(); - } - if (rotation) node.quaternion.set(rotation[0], rotation[1], rotation[2], rotation[3]); - if (translation) node.position.set(translation[0], translation[1], translation[2]); - if (scale) node.scale.set(scale[0], scale[1], scale[2]); - return node; - } - normalizeData() { - this?.nodes?.map?.((node, index) => { - this.json?.nodes[index]?.children?.map((nodeId) => { - const childNode = this.nodes[nodeId]; - node.add(childNode); - }); - }); - this.meshes.map((mesh) => { - mesh.primitives.map((primitive) => { - if (primitive.type == RenderObjectType.SkinMesh) - primitive.joints = primitive.joints.map((joint) => { - return this.nodes[joint]; - }); - }); - }); - } -} -async function loadGLTF(url) { - let gltf; - const ext = url.split(".").pop(); - const rootUrl = url.substring(0, url.lastIndexOf("/")); - if (ext === "gltf") { - const json = await fetch(url).then((response) => response.json()); - gltf = new GLTF(json, rootUrl, 0); - } else { - const glb = await fetch(url).then((response) => response.arrayBuffer()); - const jsonLength = new Uint32Array(glb, 12, 1)[0]; - const jsonChunk = new Uint8Array(glb, 20, jsonLength); - const json = JSON.parse(new TextDecoder("utf-8").decode(jsonChunk)); - gltf = new GLTF(json, rootUrl, 28 + jsonLength, glb); - } - await gltf.parseData(); - return gltf; -} - -async function loadTexture(url) { - const img = document.createElement("img"); - img.src = url; - await img.decode(); - const imageBitmap = await createImageBitmap(img); - const baseTexture = new Texture({ - size: { width: imageBitmap.width, height: imageBitmap.height, depth: 1 }, - data: { - source: imageBitmap - }, - format: "rgba8unorm" - }); - return baseTexture; -} - -// from three.js -class Spherical { - constructor(radius = 1, phi = 0, theta = 0) { - this.radius = radius; - this.phi = phi; // polar angle - this.theta = theta; // azimuthal angle - return this; - } - set(radius, phi, theta) { - this.radius = radius; - this.phi = phi; - this.theta = theta; - return this; - } - copy(other) { - this.radius = other.radius; - this.phi = other.phi; - this.theta = other.theta; - return this; - } - // restrict phi to be between EPS and PI-EPS - makeSafe() { - const EPS = 0.000001; - this.phi = Math.max(EPS, Math.min(Math.PI - EPS, this.phi)); - return this; - } - setFromVector3(v) { - return this.setFromCartesianCoords(v.x, v.y, v.z); - } - setFromCartesianCoords(x, y, z) { - this.radius = Math.sqrt(x * x + y * y + z * z); - if (this.radius === 0) { - this.theta = 0; - this.phi = 0; - } else { - this.theta = Math.atan2(x, z); - this.phi = Math.acos(GMath.clamp(y / this.radius, -1, 1)); - } - return this; - } - clone() { - return new Spherical(this.radius, this.phi, this.theta); - } -} - -//from three.js -const _changeEvent = { type: "change" }; -const _startEvent = { type: "start" }; -const _endEvent = { type: "end" }; -class OrbitControl extends EventDispatcher { - constructor(object, domElement) { - super(); - if (domElement === undefined) - console.warn('OrbitControls: The second parameter "domElement" is now mandatory.'); - if (domElement === document) - console.error( - 'OrbitControls: "document" should not be used as the target "domElement". Please use "renderer.domElement" instead.' - ); - this.object = object; - this.domElement = domElement; - this.domElement.style.touchAction = "none"; // disable touch scroll - // Set to false to disable this control - this.enabled = true; - // "target" sets the location of focus, where the object orbits around - this.target = new Vector3(); - // How far you can dolly in and out ( PerspectiveCamera only ) - this.minDistance = 0; - this.maxDistance = Infinity; - // How far you can zoom in and out ( OrthographicCamera only ) - this.minZoom = 0; - this.maxZoom = Infinity; - // How far you can orbit vertically, upper and lower limits. - // Range is 0 to Math.PI radians. - this.minPolarAngle = 0; // radians - this.maxPolarAngle = Math.PI; // radians - // How far you can orbit horizontally, upper and lower limits. - // If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI ) - this.minAzimuthAngle = -Infinity; // radians - this.maxAzimuthAngle = Infinity; // radians - // Set to true to enable damping (inertia) - // If damping is enabled, you must call controls.update() in your animation loop - this.enableDamping = false; - this.dampingFactor = 0.05; - // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. - // Set to false to disable zooming - this.enableZoom = true; - this.zoomSpeed = 1.0; - // Set to false to disable rotating - this.enableRotate = true; - this.rotateSpeed = 1.0; - // Set to false to disable panning - this.enablePan = true; - this.panSpeed = 1.0; - this.screenSpacePanning = false; // if false, pan orthogonal to world-space direction camera.up - this.keyPanSpeed = 7.0; // pixels moved per arrow key push - // Set to true to automatically rotate around the target - // If auto-rotate is enabled, you must call controls.update() in your animation loop - this.autoRotate = false; - this.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60 - // The four arrow keys - this.keys = { - LEFT: "ArrowLeft", - UP: "ArrowUp", - RIGHT: "ArrowRight", - BOTTOM: "ArrowDown" - }; - // Mouse buttons - this.mouseButtons = { - LEFT: MOUSE.ROTATE, - MIDDLE: MOUSE.DOLLY, - RIGHT: MOUSE.PAN - }; - // Touch fingers - this.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN }; - // for reset - this.target0 = this.target.clone(); - this.position0 = this.object.position.clone(); - this.zoom0 = this.object.zoom; - // the target DOM element for key events - this._domElementKeyEvents = null; - // - // public methods - // - // this method is exposed, but perhaps it would be better if we can make it private... - const that = this; - this.update = (function () { - const offset = new Vector3(); - // so camera.up is the orbit axis - const quat = new Quaternion().setFromUnitVectors(that.object.up, new Vector3(0, 1, 0)); - const quatInverse = quat.clone().invert(); - const lastPosition = new Vector3(); - const lastQuaternion = new Quaternion(); - const twoPI = 2 * Math.PI; - return function update() { - const position = that.object.position; - offset.copy(position).subtract(that.target); - // rotate offset to "y-axis-is-up" space - offset.applyQuaternion(quat); - // angle from z-axis around y-axis - spherical.setFromVector3(offset); - if (that.autoRotate && state === STATE.NONE) { - rotateLeft(that.getAutoRotationAngle()); - } - if (that.enableDamping) { - spherical.theta += sphericalDelta.theta * that.dampingFactor; - spherical.phi += sphericalDelta.phi * that.dampingFactor; - } else { - spherical.theta += sphericalDelta.theta; - spherical.phi += sphericalDelta.phi; - } - // restrict theta to be between desired limits - let min = that.minAzimuthAngle; - let max = that.maxAzimuthAngle; - if (isFinite(min) && isFinite(max)) { - if (min < -Math.PI) min += twoPI; - else if (min > Math.PI) min -= twoPI; - if (max < -Math.PI) max += twoPI; - else if (max > Math.PI) max -= twoPI; - if (min <= max) { - spherical.theta = Math.max(min, Math.min(max, spherical.theta)); - } else { - spherical.theta = - spherical.theta > (min + max) / 2 - ? Math.max(min, spherical.theta) - : Math.min(max, spherical.theta); - } - } - // restrict phi to be between desired limits - spherical.phi = Math.max(that.minPolarAngle, Math.min(that.maxPolarAngle, spherical.phi)); - spherical.makeSafe(); - spherical.radius *= scale; - // restrict radius to be between desired limits - spherical.radius = Math.max(that.minDistance, Math.min(that.maxDistance, spherical.radius)); - // move target to panned location - if (that.enableDamping === true) { - that.target.addScaledVector(panOffset, that.dampingFactor); - } else { - that.target.add(panOffset); - } - Vector3.fromSpherical(spherical, offset); - // rotate offset back to "camera-up-vector-is-up" space - offset.applyQuaternion(quatInverse); - position.copy(that.target).add(offset); - that.object.lookAt(that.target.x, that.target.y, that.target.z); - if (that.enableDamping === true) { - sphericalDelta.theta *= 1 - that.dampingFactor; - sphericalDelta.phi *= 1 - that.dampingFactor; - Vector3.multiplyByScalar(panOffset, 1 - that.dampingFactor, panOffset); - // panOffset.multiplyScalar( 1 - this.dampingFactor ); - } else { - sphericalDelta.set(0, 0, 0); - panOffset.set(0, 0, 0); - } - scale = 1; - // update condition is: - // min(camera displacement, camera rotation in radians)^2 > EPS - // using small-angle approximation cos(x/2) = 1 - x^2 / 8 - if ( - zoomChanged || - Vector3.distanceSquared(lastPosition, that.object.position) > EPS || - 8 * (1 - lastQuaternion.dot(that.object.quaternion)) > EPS - ) { - that.dispatchEvent(_changeEvent); - //lastPosition.copy( this.object.position ); - Vector3.clone(that.object.position, lastPosition); - Quaternion.clone(that.object.quaternion, lastQuaternion); - //lastQuaternion.copy( this.object.quaternion ); - zoomChanged = false; - return true; - } - return false; - }; - })(); - this.init(); - } - getPolarAngle() { - return this.spherical.phi; - } - getAzimuthalAngle() { - return this.spherical.theta; - } - getDistance() { - return Vector3.distance(this.object.position, this.target); - } - listenToKeyEvents(domElement) { - domElement.addEventListener("keydown", this.onKeyDown); - this._domElementKeyEvents = domElement; - } - saveState() { - Vector3.clone(this.target, this.target0); - //this.target0.copy( this.target ); - Vector3.clone(this.object.position, this.position0); - //this.position0.copy( this.object.position ); - this.zoom0 = this.object.zoom; - } - reset() { - Vector3.clone(this.target0, this.target); - //this.target.copy( this.target0 ); - Vector3.clone(this.position0, this.object.position); - //this.object.position.copy( this.position0 ); - this.object.zoom = this.zoom0; - this.object.updateProjectionMatrix(); - this.dispatchEvent(_changeEvent); - this.update(); - state = STATE.NONE; - } - init() { - const that = this; - const panLeft = (function () { - const v = new Vector3(); - return function panLeft(distance, objectMatrix) { - v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix - v.multiplyByScalar(-distance); - panOffset.add(v); - }; - })(); - const panUp = (function () { - const panUpV = new Vector3(); - return function panUp(distance, objectMatrix) { - if (that.screenSpacePanning === true) { - panUpV.setFromMatrixColumn(objectMatrix, 1); - } else { - panUpV.setFromMatrixColumn(objectMatrix, 0); - //panUpV.crossVectors( this.object.up, panUpV ); - Vector3.cross(that.object.up, panUpV, panUpV); - } - panUpV.multiplyByScalar(distance); - panOffset.add(panUpV); - }; - })(); - // deltaX and deltaY are in pixels; right and down are positive - const pan = (function () { - const offset = new Vector3(); - return function pan(deltaX, deltaY) { - const element = that.domElement; - if (that.object.isPerspectiveCamera) { - // perspective - const position = that.object.position; - offset.copy(position).subtract(that.target); - let targetDistance = offset.length(); - // half of the fov is center to top of screen - targetDistance *= Math.tan(((that.object.fov / 2) * Math.PI) / 180.0); - // we use only clientHeight here so aspect ratio does not distort speed - panLeft((2 * deltaX * targetDistance) / element.clientHeight, that.object.modelMatrix); - panUp((2 * deltaY * targetDistance) / element.clientHeight, that.object.modelMatrix); - } else if (that.object.isOrthographicCamera) { - // orthographic - panLeft( - (deltaX * (that.object.right - that.object.left)) / that.object.zoom / element.clientWidth, - that.object.modelMatrix - ); - panUp( - (deltaY * (that.object.top - that.object.bottom)) / that.object.zoom / element.clientHeight, - that.object.modelMatrix - ); - } else { - // camera neither orthographic nor perspective - console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."); - that.enablePan = false; - } - }; - })(); - const dollyOut = (dollyScale) => { - if (this.object.isPerspectiveCamera) { - scale /= dollyScale; - } else if (this.object.isOrthographicCamera) { - this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom * dollyScale)); - this.object.updateProjectionMatrix(); - zoomChanged = true; - } else { - console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."); - this.enableZoom = false; - } - }; - const dollyIn = (dollyScale) => { - if (this.object.isPerspectiveCamera) { - scale *= dollyScale; - } else if (this.object.isOrthographicCamera) { - this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / dollyScale)); - this.object.updateProjectionMatrix(); - zoomChanged = true; - } else { - console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."); - this.enableZoom = false; - } - }; - const handleMouseMoveRotate = (event) => { - rotateEnd.set(event.clientX, event.clientY); - Vector2.subtract(rotateEnd, rotateStart, rotateDelta); - Vector2.multiplyByScalar(rotateDelta, this.rotateSpeed, rotateDelta); - //rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( this.rotateSpeed ); - const element = this.domElement; - rotateLeft((2 * Math.PI * rotateDelta.x) / element.clientHeight); // yes, height - rotateUp((2 * Math.PI * rotateDelta.y) / element.clientHeight); - Vector2.clone(rotateEnd, rotateStart); - //rotateStart.copy( rotateEnd ); - this.update(); - }; - const handleMouseMoveDolly = (event) => { - dollyEnd.set(event.clientX, event.clientY); - Vector2.subtract(dollyEnd, dollyStart, dollyDelta); - // dollyDelta.subVectors( dollyEnd, dollyStart ); - if (dollyDelta.y > 0) { - dollyOut(getZoomScale()); - } else if (dollyDelta.y < 0) { - dollyIn(getZoomScale()); - } - Vector2.clone(dollyEnd, dollyStart); - // dollyStart.copy( dollyEnd ); - this.update(); - }; - const handleMouseMovePan = (event) => { - panEnd.set(event.clientX, event.clientY); - Vector2.subtract(panEnd, panStart, panDelta); - Vector2.multiplyByScalar(panDelta, this.panSpeed, panDelta); - //panDelta.subVectors( panEnd, panStart ).multiplyScalar( this.panSpeed ); - pan(panDelta.x, panDelta.y); - Vector2.clone(panEnd, panStart); - //panStart.copy( panEnd ); - this.update(); - }; - const handleMouseWheel = (event) => { - if (event.deltaY < 0) { - dollyIn(getZoomScale()); - } else if (event.deltaY > 0) { - dollyOut(getZoomScale()); - } - this.update(); - }; - const handleKeyDown = (event) => { - let needsUpdate = false; - switch (event.code) { - case this.keys.UP: - pan(0, this.keyPanSpeed); - needsUpdate = true; - break; - case this.keys.BOTTOM: - pan(0, -this.keyPanSpeed); - needsUpdate = true; - break; - case this.keys.LEFT: - pan(this.keyPanSpeed, 0); - needsUpdate = true; - break; - case this.keys.RIGHT: - pan(-this.keyPanSpeed, 0); - needsUpdate = true; - break; - } - if (needsUpdate) { - // prevent the browser from scrolling on cursor keys - event.preventDefault(); - this.update(); - } - }; - const handleTouchStartDollyPan = () => { - if (this.enableZoom) handleTouchStartDolly(); - if (this.enablePan) handleTouchStartPan(); - }; - const handleTouchStartDollyRotate = () => { - if (this.enableZoom) handleTouchStartDolly(); - if (this.enableRotate) handleTouchStartRotate(); - }; - const handleTouchMoveRotate = (event) => { - if (pointers.length == 1) { - rotateEnd.set(event.pageX, event.pageY); - } else { - const position = getSecondPointerPosition(event); - const x = 0.5 * (event.pageX + position.x); - const y = 0.5 * (event.pageY + position.y); - rotateEnd.set(x, y); - } - Vector2.subtract(rotateEnd, rotateStart, rotateDelta); - Vector2.multiplyByScalar(rotateDelta, this.rotateSpeed, rotateDelta); - //rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( this.rotateSpeed ); - const element = this.domElement; - rotateLeft((2 * Math.PI * rotateDelta.x) / element.clientHeight); // yes, height - rotateUp((2 * Math.PI * rotateDelta.y) / element.clientHeight); - Vector2.clone(rotateEnd, rotateStart); - //rotateStart.copy( rotateEnd ); - }; - const handleTouchMovePan = (event) => { - if (pointers.length === 1) { - panEnd.set(event.pageX, event.pageY); - } else { - const position = getSecondPointerPosition(event); - const x = 0.5 * (event.pageX + position.x); - const y = 0.5 * (event.pageY + position.y); - panEnd.set(x, y); - } - Vector2.subtract(panEnd, panStart, panDelta); - Vector2.multiplyByScalar(panDelta, this.panSpeed, panDelta); - //panDelta.subVectors( panEnd, panStart ).multiplyScalar( this.panSpeed ); - pan(panDelta.x, panDelta.y); - Vector2.clone(panEnd, panStart); - // panStart.copy( panEnd ); - }; - const handleTouchMoveDolly = (event) => { - const position = getSecondPointerPosition(event); - const dx = event.pageX - position.x; - const dy = event.pageY - position.y; - const distance = Math.sqrt(dx * dx + dy * dy); - dollyEnd.set(0, distance); - dollyDelta.set(0, Math.pow(dollyEnd.y / dollyStart.y, this.zoomSpeed)); - dollyOut(dollyDelta.y); - Vector2.clone(dollyEnd, dollyStart); - //dollyStart.copy( dollyEnd ); - }; - const handleTouchMoveDollyPan = (event) => { - if (this.enableZoom) handleTouchMoveDolly(event); - if (this.enablePan) handleTouchMovePan(event); - }; - const handleTouchMoveDollyRotate = (event) => { - if (this.enableZoom) handleTouchMoveDolly(event); - if (this.enableRotate) handleTouchMoveRotate(event); - }; - // - // event handlers - FSM: listen for events and reset state - // - this.onPointerDown = (event) => { - if (this.enabled === false) return; - if (pointers.length === 0) { - this.domElement.setPointerCapture(event.pointerId); - this.domElement.addEventListener("pointermove", this.onPointerMove); - this.domElement.addEventListener("pointerup", this.onPointerUp); - } - // - addPointer(event); - if (event.pointerType === "touch") { - onTouchStart(event); - } else { - onMouseDown(event); - } - }; - this.onPointerMove = (event) => { - if (this.enabled === false) return; - if (event.pointerType === "touch") { - onTouchMove(event); - } else { - onMouseMove(event); - } - }; - this.onPointerUp = (event) => { - removePointer(event); - if (pointers.length === 0) { - this.domElement.releasePointerCapture(event.pointerId); - this.domElement.removeEventListener("pointermove", this.onPointerMove); - this.domElement.removeEventListener("pointerup", this.onPointerUp); - } - this.dispatchEvent(_endEvent); - state = STATE.NONE; - }; - const onMouseDown = (event) => { - let mouseAction; - switch (event.button) { - case 0: - mouseAction = this.mouseButtons.LEFT; - break; - case 1: - mouseAction = this.mouseButtons.MIDDLE; - break; - case 2: - mouseAction = this.mouseButtons.RIGHT; - break; - default: - mouseAction = -1; - } - switch (mouseAction) { - case MOUSE.DOLLY: - if (this.enableZoom === false) return; - handleMouseDownDolly(event); - state = STATE.DOLLY; - break; - case MOUSE.ROTATE: - if (event.ctrlKey || event.metaKey || event.shiftKey) { - if (this.enablePan === false) return; - handleMouseDownPan(event); - state = STATE.PAN; - } else { - if (this.enableRotate === false) return; - handleMouseDownRotate(event); - state = STATE.ROTATE; - } - break; - case MOUSE.PAN: - if (event.ctrlKey || event.metaKey || event.shiftKey) { - if (this.enableRotate === false) return; - handleMouseDownRotate(event); - state = STATE.ROTATE; - } else { - if (this.enablePan === false) return; - handleMouseDownPan(event); - state = STATE.PAN; - } - break; - default: - state = STATE.NONE; - } - if (state !== STATE.NONE) { - this.dispatchEvent(_startEvent); - } - }; - const onMouseMove = (event) => { - switch (state) { - case STATE.ROTATE: - if (this.enableRotate === false) return; - handleMouseMoveRotate(event); - break; - case STATE.DOLLY: - if (this.enableZoom === false) return; - handleMouseMoveDolly(event); - break; - case STATE.PAN: - if (this.enablePan === false) return; - handleMouseMovePan(event); - break; - } - }; - this.onMouseWheel = (event) => { - if (this.enabled === false || this.enableZoom === false || state !== STATE.NONE) return; - event.preventDefault(); - this.dispatchEvent(_startEvent); - handleMouseWheel(event); - this.dispatchEvent(_endEvent); - }; - this.onKeyDown = (event) => { - if (this.enabled === false || this.enablePan === false) return; - handleKeyDown(event); - }; - const onTouchStart = (event) => { - trackPointer(event); - switch (pointers.length) { - case 1: - switch (this.touches.ONE) { - case TOUCH.ROTATE: - if (this.enableRotate === false) return; - handleTouchStartRotate(); - state = STATE.TOUCH_ROTATE; - break; - case TOUCH.PAN: - if (this.enablePan === false) return; - handleTouchStartPan(); - state = STATE.TOUCH_PAN; - break; - default: - state = STATE.NONE; - } - break; - case 2: - switch (this.touches.TWO) { - case TOUCH.DOLLY_PAN: - if (this.enableZoom === false && this.enablePan === false) return; - handleTouchStartDollyPan(); - state = STATE.TOUCH_DOLLY_PAN; - break; - case TOUCH.DOLLY_ROTATE: - if (this.enableZoom === false && this.enableRotate === false) return; - handleTouchStartDollyRotate(); - state = STATE.TOUCH_DOLLY_ROTATE; - break; - default: - state = STATE.NONE; - } - break; - default: - state = STATE.NONE; - } - if (state !== STATE.NONE) { - this.dispatchEvent(_startEvent); - } - }; - const onTouchMove = (event) => { - trackPointer(event); - switch (state) { - case STATE.TOUCH_ROTATE: - if (this.enableRotate === false) return; - handleTouchMoveRotate(event); - this.update(); - break; - case STATE.TOUCH_PAN: - if (this.enablePan === false) return; - handleTouchMovePan(event); - this.update(); - break; - case STATE.TOUCH_DOLLY_PAN: - if (this.enableZoom === false && this.enablePan === false) return; - handleTouchMoveDollyPan(event); - this.update(); - break; - case STATE.TOUCH_DOLLY_ROTATE: - if (this.enableZoom === false && this.enableRotate === false) return; - handleTouchMoveDollyRotate(event); - this.update(); - break; - default: - state = STATE.NONE; - } - }; - this.onContextMenu = (event) => { - if (this.enabled === false) return; - event.preventDefault(); - }; - this.getAutoRotationAngle = () => { - return ((2 * Math.PI) / 60 / 60) * this.autoRotateSpeed; - }; - const getZoomScale = () => { - return Math.pow(0.95, this.zoomSpeed); - }; - this.domElement.addEventListener("contextmenu", this.onContextMenu); - this.domElement.addEventListener("pointerdown", this.onPointerDown); - this.domElement.addEventListener("pointercancel", onPointerCancel); - this.domElement.addEventListener("wheel", this.onMouseWheel, { - passive: false - }); - } - dispose() { - this.domElement.removeEventListener("contextmenu", this.onContextMenu); - this.domElement.removeEventListener("pointerdown", this.onPointerDown); - this.domElement.removeEventListener("pointercancel", onPointerCancel); - this.domElement.removeEventListener("wheel", this.onMouseWheel); - this.domElement.removeEventListener("pointermove", this.onPointerMove); - this.domElement.removeEventListener("pointerup", this.onPointerUp); - if (this._domElementKeyEvents !== null) { - this._domElementKeyEvents.removeEventListener("keydown", this.onKeyDown); - } - //this.dispatchEvent( { type: 'dispose' } ); // should this be added here? - } -} -const STATE = { - NONE: -1, - ROTATE: 0, - DOLLY: 1, - PAN: 2, - TOUCH_ROTATE: 3, - TOUCH_PAN: 4, - TOUCH_DOLLY_PAN: 5, - TOUCH_DOLLY_ROTATE: 6 -}; -let state = STATE.NONE; -const EPS = 0.000001; -// current position in spherical coordinates -const spherical = new Spherical(); -const sphericalDelta = new Spherical(); -let scale = 1; -const panOffset = new Vector3(); -let zoomChanged = false; -const rotateStart = new Vector2(); -const rotateEnd = new Vector2(); -const rotateDelta = new Vector2(); -const panStart = new Vector2(); -const panEnd = new Vector2(); -const panDelta = new Vector2(); -const dollyStart = new Vector2(); -const dollyEnd = new Vector2(); -const dollyDelta = new Vector2(); -const pointers = []; -const pointerPositions = {}; -var MOUSE; -(function (MOUSE) { - MOUSE[(MOUSE["LEFT"] = 0)] = "LEFT"; - MOUSE[(MOUSE["MIDDLE"] = 1)] = "MIDDLE"; - MOUSE[(MOUSE["RIGHT"] = 2)] = "RIGHT"; - MOUSE[(MOUSE["ROTATE"] = 0)] = "ROTATE"; - MOUSE[(MOUSE["DOLLY"] = 1)] = "DOLLY"; - MOUSE[(MOUSE["PAN"] = 2)] = "PAN"; -})(MOUSE || (MOUSE = {})); -var TOUCH; -(function (TOUCH) { - TOUCH[(TOUCH["ROTATE"] = 0)] = "ROTATE"; - TOUCH[(TOUCH["PAN"] = 1)] = "PAN"; - TOUCH[(TOUCH["DOLLY_PAN"] = 2)] = "DOLLY_PAN"; - TOUCH[(TOUCH["DOLLY_ROTATE"] = 3)] = "DOLLY_ROTATE"; -})(TOUCH || (TOUCH = {})); -function rotateLeft(angle) { - sphericalDelta.theta -= angle; -} -function rotateUp(angle) { - sphericalDelta.phi -= angle; -} -function addPointer(event) { - pointers.push(event); -} -function removePointer(event) { - delete pointerPositions[event.pointerId]; - for (let i = 0; i < pointers.length; i++) { - if (pointers[i].pointerId == event.pointerId) { - pointers.splice(i, 1); - return; - } - } -} -function trackPointer(event) { - let position = pointerPositions[event.pointerId]; - if (position === undefined) { - position = new Vector2(); - pointerPositions[event.pointerId] = position; - } - position.set(event.pageX, event.pageY); -} -function getSecondPointerPosition(event) { - const pointer = event.pointerId === pointers[0].pointerId ? pointers[1] : pointers[0]; - return pointerPositions[pointer.pointerId]; -} -function handleMouseDownRotate(event) { - rotateStart.set(event.clientX, event.clientY); -} -function handleMouseDownDolly(event) { - dollyStart.set(event.clientX, event.clientY); -} -function handleMouseDownPan(event) { - panStart.set(event.clientX, event.clientY); -} -function onPointerCancel(event) { - removePointer(event); -} -function handleTouchStartRotate() { - if (pointers.length === 1) { - rotateStart.set(pointers[0].pageX, pointers[0].pageY); - } else { - const x = 0.5 * (pointers[0].pageX + pointers[1].pageX); - const y = 0.5 * (pointers[0].pageY + pointers[1].pageY); - rotateStart.set(x, y); - } -} -function handleTouchStartPan() { - if (pointers.length === 1) { - panStart.set(pointers[0].pageX, pointers[0].pageY); - } else { - const x = 0.5 * (pointers[0].pageX + pointers[1].pageX); - const y = 0.5 * (pointers[0].pageY + pointers[1].pageY); - panStart.set(x, y); - } -} -function handleTouchStartDolly() { - const dx = pointers[0].pageX - pointers[1].pageX; - const dy = pointers[0].pageY - pointers[1].pageY; - const distance = Math.sqrt(dx * dx + dy * dy); - dollyStart.set(0, distance); -} - -export { - AddressMode, - AmbientLight, - Attachment, - Attribute, - Axes, - BindGroup, - BindGroupEntity, - BlendFactor, - BlendOperation, - BlinnPhongMaterial, - BloomPostEffect, - BoxGeometry, - Buffer, - BufferUsage, - Color, - ColorWriteFlags, - CompareFunction, - Context, - CubeTextureLoader, - CullMode, - DirectionalLight, - DrawCommand, - FilterMode, - FrontFace, - IndexFormat, - InputStepMode, - Instance, - InstanceMesh, - Mesh, - Model, - OrbitControl, - OrthographicCamera, - PbrMaterial, - PerspectiveCamera, - PlaneGeometry, - PointLight, - PrimitiveTopology, - RenderState, - RenderTarget, - Sampler, - Scene, - ShaderMaterial, - ShaderStage, - ShadowMapDebugger, - SkyBox, - SphereGeometry, - SpotLight, - Sprite, - StencilOperation, - StorageTextureAccess, - Texture, - TextureAspect, - TextureDimension, - TextureFormat, - TextureSampleType, - TextureUsage, - TextureViewDimension, - TorusKnotGeometry, - Vector3, - VertexFormat, - loadGLTF, - loadTexture -}; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb3JlL1dlYkdQVUNvbnN0YW50LnRzIiwiLi4vc3JjL3JlbmRlci9CdWZmZXIudHMiLCIuLi9zcmMvcmVuZGVyL1BpcGVsaW5lTGF5b3V0LnRzIiwiLi4vc3JjL3JlbmRlci9QaXBlbGluZS50cyIsIi4uL3NyYy9yZW5kZXIvRHJhd0NvbW1hbmQudHMiLCIuLi9zcmMvY29yZS9XZWJHUFVUeXBlcy50cyIsIi4uL3NyYy9zaGFkZXIvbWF0ZXJpYWwvY29sb3JGcmFnLnRzIiwiLi4vc3JjL3NoYWRlci9tYXRlcmlhbC9jb2xvclZlcnQudHMiLCIuLi9zcmMvc2hhZGVyL21hdGVyaWFsL3Bicl9mcy50cyIsIi4uL3NyYy9zaGFkZXIvbWF0ZXJpYWwvcGJyX3ZzLnRzIiwiLi4vc3JjL3NoYWRlci9XZ3NsUHJlcHJvY2Vzc29yLnRzIiwiLi4vc3JjL3NoYWRlci9tYXRlcmlhbC9wYnJGcmFnLnRzIiwiLi4vc3JjL3NoYWRlci9tYXRlcmlhbC9wYnJWZXJ0LnRzIiwiLi4vc3JjL3NoYWRlci9tYXRlcmlhbC9waG9uZ0ZyYWcudHMiLCIuLi9zcmMvc2hhZGVyL21hdGVyaWFsL3Bob25nVmVydC50cyIsIi4uL3NyYy9zaGFkZXIvbWF0ZXJpYWwvcG9pbnRfZnMudHMiLCIuLi9zcmMvc2hhZGVyL21hdGVyaWFsL3BvaW50X3ZzLnRzIiwiLi4vc3JjL3NoYWRlci9tYXRlcmlhbC9xdWFkRnJhZy50cyIsIi4uL3NyYy9zaGFkZXIvbWF0ZXJpYWwvcXVhZFZlcnQudHMiLCIuLi9zcmMvc2hhZGVyL21hdGVyaWFsL3NreUJveEZyYWcudHMiLCIuLi9zcmMvc2hhZGVyL21hdGVyaWFsL3NreUJveFZlcnQudHMiLCIuLi9zcmMvc2hhZGVyL21hdGVyaWFsL3Nwcml0ZV9mcy50cyIsIi4uL3NyYy9zaGFkZXIvbWF0ZXJpYWwvc3ByaXRlX3ZzLnRzIiwiLi4vc3JjL3NoYWRlci9wb3N0UHJvY2Vzcy9ibGVuZC9ibGVuZEZyYWcudHMiLCIuLi9zcmMvc2hhZGVyL3Bvc3RQcm9jZXNzL2Jsb29tL0JsdXIudHMiLCIuLi9zcmMvc2hhZGVyL3Bvc3RQcm9jZXNzL2Jsb29tL0x1bWlub3NpdHlIaWdoLnRzIiwiLi4vc3JjL3NoYWRlci9zaGFkZXJDaHVuay9hdHRyaWJ1dGUvRnJhZ0lucHV0LnRzIiwiLi4vc3JjL3NoYWRlci9zaGFkZXJDaHVuay9hdHRyaWJ1dGUvUG9pbnRGcmFnSW5wdXQudHMiLCIuLi9zcmMvc2hhZGVyL3NoYWRlckNodW5rL2F0dHJpYnV0ZS9Qb2ludFZlcnRJbnB1dC50cyIsIi4uL3NyYy9zaGFkZXIvc2hhZGVyQ2h1bmsvYXR0cmlidXRlL1BvaW50VmVydE91dHB1dC50cyIsIi4uL3NyYy9zaGFkZXIvc2hhZGVyQ2h1bmsvYXR0cmlidXRlL1ZlcnRleElucHV0LnRzIiwiLi4vc3JjL3NoYWRlci9zaGFkZXJDaHVuay9hdHRyaWJ1dGUvVmVydGV4T3V0cHV0LnRzIiwiLi4vc3JjL3NoYWRlci9zaGFkZXJDaHVuay9jb21tb24vU3lzdGVtVW5pZm9ybS50cyIsIi4uL3NyYy9zaGFkZXIvc2hhZGVyQ2h1bmsvY29tbW9uL1RleHR1cmVBbmRTYW1wbGVyRGVmaW5lLnRzIiwiLi4vc3JjL3NoYWRlci9zaGFkZXJDaHVuay9lbnZpcm9ubWVudC9lbnZpcm9ubWVudC50cyIsIi4uL3NyYy9zaGFkZXIvc2hhZGVyQ2h1bmsvaW5zdGFuY2UvSW5zdGFuY2UudHMiLCIuLi9zcmMvc2hhZGVyL3NoYWRlckNodW5rL2xpZ2h0L2xpZ2h0LnRzIiwiLi4vc3JjL3NoYWRlci9zaGFkZXJDaHVuay9saWdodC9saWdodENvbW1vbi50cyIsIi4uL3NyYy9zaGFkZXIvc2hhZGVyQ2h1bmsvbm9ybWFsL2dldE5vcm1hbEJhY2tVcC50cyIsIi4uL3NyYy9zaGFkZXIvc2hhZGVyQ2h1bmsvcGJyL2JyZGYudHMiLCIuLi9zcmMvc2hhZGVyL3NoYWRlckNodW5rL3Bici9pYmwudHMiLCIuLi9zcmMvc2hhZGVyL3NoYWRlckNodW5rL3Bici9wYnJGdW5jdGlvbi50cyIsIi4uL3NyYy9zaGFkZXIvc2hhZGVyQ2h1bmsvcGJyL3BiclN0cnVjdC50cyIsIi4uL3NyYy9zaGFkZXIvc2hhZGVyQ2h1bmsvcGJyL3BiclRleHR1cmUudHMiLCIuLi9zcmMvc2hhZGVyL3NoYWRlckNodW5rL3Bici9wYnJVdGlscy50cyIsIi4uL3NyYy9zaGFkZXIvc2hhZGVyQ2h1bmsvcGhvbmcvYmxpbm5fcGhvbmcudHMiLCIuLi9zcmMvc2hhZGVyL3NoYWRlckNodW5rL3Bob25nL3Bob25nRnVuY3Rpb24udHMiLCIuLi9zcmMvc2hhZGVyL3NoYWRlckNodW5rL3Bob25nL3Bob25nVXRpbHMudHMiLCIuLi9zcmMvc2hhZGVyL3NoYWRlckNodW5rL3NraW4vU2tpblZlcnQudHMiLCIuLi9zcmMvc2hhZGVyL3NoYWRlckNodW5rL3N0cnVjdC9QYnJNYXRlcmlhbFN0cnVjdC50cyIsIi4uL3NyYy9zaGFkZXIvc2hhZGVyQ2h1bmsvU2hhZGVyQ2h1bmsudHMiLCIuLi9zcmMvc2hhZGVyL3NoYWRlckNodW5rL3NoYWRvdy9zaGFkb3dNYXBEZWJ1Z2dlckZyYWcudHMiLCIuLi9zcmMvc2hhZGVyL3NoYWRlckNodW5rL3NoYWRvdy9zaGFkb3dNYXBEZWJ1Z2dlclZlcnQudHMiLCIuLi9zcmMvc2hhZGVyL3NoYWRlckNodW5rL3NoYWRvdy9zaGFkb3dNYXBGcmFnLnRzIiwiLi4vc3JjL3NoYWRlci9zaGFkZXJDaHVuay9zaGFkb3cvc2hhZG93TWFwVmVydC50cyIsIi4uL3NyYy9zaGFkZXIvV0dTTFBhcnNlRGVmaW5lcy50cyIsIi4uL3NyYy9zaGFkZXIvU2hhZGVycy50cyIsIi4uL3NyYy9zaGFkZXIvU2hhZGVyU291cmNlLnRzIiwiLi4vc3JjL3V0aWxzL2xvYWRHbHNsYW5nTW9kdWxlLnRzIiwiLi4vc3JjL3V0aWxzL01pcG1hcEdlbmVyYXRvci50cyIsIi4uL3NyYy91dGlscy9kZWZhdWx0VmFsdWUudHMiLCIuLi9zcmMvcmVuZGVyL1JlbmRlclN0YXRlLnRzIiwiLi4vc3JjL3JlbmRlci9Db250ZXh0LnRzIiwiLi4vc3JjL3JlbmRlci9UZXh0dXJlLnRzIiwiLi4vc3JjL3JlbmRlci9TYW1wbGVyLnRzIiwiLi4vc3JjL3JlbmRlci9BdHRhY2htZW50LnRzIiwiLi4vc3JjL3V0aWxzL2RlZmluZWQudHMiLCIuLi9ub2RlX21vZHVsZXMvbWVyc2VubmUtdHdpc3Rlci9zcmMvbWVyc2VubmUtdHdpc3Rlci5qcyIsIi4uL3NyYy9tYXRoL01hdGgudHMiLCIuLi9zcmMvbWF0aC9WZWN0b3IyLnRzIiwiLi4vc3JjL21hdGgvVmVjdG9yMy50cyIsIi4uL3NyYy9yZW5kZXIvQXR0cmlidXRlLnRzIiwiLi4vc3JjL3JlbmRlci9CaW5kR3JvdXAudHMiLCIuLi9zcmMvcmVuZGVyL0JpbmRHcm91cEVudGl0eS50cyIsIi4uL3NyYy9yZW5kZXIvUmVuZGVyVGFyZ2V0LnRzIiwiLi4vc3JjL21hdGgvTWF0cml4My50cyIsIi4uL3NyYy9tYXRoL1ZlY3RvcjQudHMiLCIuLi9zcmMvbWF0aC9NYXRyaXg0LnRzIiwiLi4vc3JjL2NvcmUvQm91bmRpbmdTcGhlcmUudHMiLCIuLi9zcmMvcmVuZGVyL0luZGV4QnVmZmVyLnRzIiwiLi4vc3JjL3JlbmRlci9BdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL3JlbmRlci9WZXJ0ZXhCdWZmZXIudHMiLCIuLi9zcmMvdXRpbHMvY29tYmluZS50cyIsIi4uL3NyYy9nZW9tZXRyeS9HZW9tZXRyeS50cyIsIi4uL3NyYy9nZW9tZXRyeS9QbGFuZUdlb21ldHJ5LnRzIiwiLi4vc3JjL21hdGgvUXVhdGVybmlvbi50cyIsIi4uL3NyYy9jb3JlL1JlbmRlck9iamVjdC50cyIsIi4uL3NyYy9saWdodC9MaWdodC50cyIsIi4uL3NyYy9tYXRoL0NvbG9yLnRzIiwiLi4vc3JjL21hdGgvTWF0cml4Mi50cyIsIi4uL3NyYy9yZW5kZXIvVW5pZm9ybXMudHMiLCIuLi9zcmMvcmVuZGVyL1VuaWZvcm1CdWZmZXIudHMiLCIuLi9zcmMvdXRpbHMvdW5pZm9ybVV0aWxzLnRzIiwiLi4vc3JjL3JlbmRlci9CaW5kR3JvdXBMYXlvdXQudHMiLCIuLi9zcmMvcmVuZGVyL0JpbmRHcm91cExheW91dEVudHJ5LnRzIiwiLi4vc3JjL3JlbmRlci9TaGFkZXJEYXRhLnRzIiwiLi4vc3JjL21hdGVyaWFsL01hdGVyaWFsLnRzIiwiLi4vc3JjL21hdGVyaWFsL1NoYWRlck1hdGVyaWFsLnRzIiwiLi4vc3JjL3V0aWxzL2NyZWF0ZUd1aWQudHMiLCIuLi9zcmMvbWVzaC9NZXNoLnRzIiwiLi4vc3JjL2hlbHBlci9TaGFkb3dNYXBEZWJ1Z2dlci50cyIsIi4uL3NyYy9tYXRlcmlhbC9Db2xvck1hdGVyaWFsLnRzIiwiLi4vc3JjL21lc2gvQXhlcy50cyIsIi4uL3NyYy9nZW9tZXRyeS9Ta3lCb3hHZW9tZXRyeS50cyIsIi4uL3NyYy91dGlscy9kZXN0cm95T2JqZWN0LnRzIiwiLi4vc3JjL2NvcmUvVGV4dHVyZUNhY2hlLnRzIiwiLi4vc3JjL2xvYWRlci9DdWJlVGV4dHVyZUxvYWRlci50cyIsIi4uL3NyYy9tYXRlcmlhbC9Ta3lCb3hNYXRlcmlhbC50cyIsIi4uL3NyYy9tZXNoL1NreUJveC50cyIsIi4uL3NyYy9tZXNoL0luc3RhbmNlLnRzIiwiLi4vc3JjL21lc2gvSW5zdGFuY2VNZXNoLnRzIiwiLi4vc3JjL3JlbmRlci9Db21wdXRlQ29tbWFuZC50cyIsIi4uL3NyYy9tZXNoL01vZGVsLnRzIiwiLi4vc3JjL2dlb21ldHJ5L1Nwcml0ZUdlb21ldHJ5LnRzIiwiLi4vc3JjL21hdGVyaWFsL1Nwcml0ZU1hdGVyaWFsLnRzIiwiLi4vc3JjL21lc2gvU3ByaXRlLnRzIiwiLi4vc3JjL3V0aWxzL0dlb21ldHJ5VXRpbHMudHMiLCIuLi9zcmMvZ2VvbWV0cnkvU3BoZXJlR2VvbWV0cnkudHMiLCIuLi9zcmMvZ2VvbWV0cnkvQm94R2VvbWV0cnkudHMiLCIuLi9zcmMvZ2VvbWV0cnkvVG9ydXNLbm90R2VvbWV0cnkudHMiLCIuLi9zcmMvbWF0ZXJpYWwvQmxpbm5QaG9uZ01hdGVyaWFsLnRzIiwiLi4vc3JjL21hdGVyaWFsL1Bick1hdGVyaWFsLnRzIiwiLi4vc3JjL2NvcmUvRXZlbnREaXNwYXRjaGVyLnRzIiwiLi4vc3JjL2NvcmUvUmVuZGVyUXVldWUudHMiLCIuLi9zcmMvY29yZS9GcmFtZVN0YXRlLnRzIiwiLi4vc3JjL2xpZ2h0L0FtYmllbnRMaWdodC50cyIsIi4uL3NyYy9jb3JlL0xpZ2h0TWFuZ2VyLnRzIiwiLi4vc3JjL2NvcmUvTWVzaE1hbmdlci50cyIsIi4uL3NyYy9wb3N0LXByb2Nlc3MvUmVzb2x2ZUZyYW1lLnRzIiwiLi4vc3JjL3Bvc3QtcHJvY2Vzcy9Qb3N0RWZmZWN0Q29sbGVjdGlvbi50cyIsIi4uL3NyYy9wYXNzL1Bhc3MudHMiLCIuLi9zcmMvcGFzcy9CYXNpY1Bhc3MudHMiLCIuLi9zcmMvbWF0aC9QbGFuZS50cyIsIi4uL3NyYy9jb3JlL0N1bGxpbmdWb2x1bWUudHMiLCIuLi9zcmMvY2FtZXJhL0NhbWVyYS50cyIsIi4uL3NyYy9jYW1lcmEvUGVyc3BlY3RpdmVDYW1lcmEudHMiLCIuLi9zcmMvY2FtZXJhL1BvaW50TGlnaHRTaGFkb3dDYW1lcmEudHMiLCIuLi9zcmMvbGlnaHQvc2hhZG93cy9CYXNlU2hhZG93LnRzIiwiLi4vc3JjL2xpZ2h0L3NoYWRvd3MvUG9pbnRMaWdodFNoYWRvdy50cyIsIi4uL3NyYy9saWdodC9Qb2ludExpZ2h0LnRzIiwiLi4vc3JjL3Bhc3MvU2hhZG93UGFzcy50cyIsIi4uL3NyYy9yZW5kZXJwaXBlbGluZS9Gb3J3YXJkUmVuZGVyTGluZS50cyIsIi4uL3NyYy9TY2VuZS50cyIsIi4uL3NyYy9wb3N0LXByb2Nlc3MvUG9zdEVmZmVjdC50cyIsIi4uL3NyYy9wb3N0LXByb2Nlc3MvQmxvb21Qb3N0RWZmZWN0LnRzIiwiLi4vc3JjL2NhbWVyYS9PcnRob2dyYXBoaWNDYW1lcmEudHMiLCIuLi9zcmMvbGlnaHQvc2hhZG93cy9TcG90TGlnaHRTaGFkb3cudHMiLCIuLi9zcmMvbGlnaHQvU3BvdExpZ2h0LnRzIiwiLi4vc3JjL2xpZ2h0L3NoYWRvd3MvRGlyZWN0aW9uYWxMaWdodFNoYWRvdy50cyIsIi4uL3NyYy9saWdodC9EaXJlY3Rpb25hbExpZ2h0LnRzIiwiLi4vc3JjL21lc2gvTm9kZS50cyIsIi4uL3NyYy9tZXNoL1NLaW5NZXNoLnRzIiwiLi4vc3JjL3V0aWxzL2dsdGZVdGlscy50cyIsIi4uL3NyYy9sb2FkZXIvZ2x0Zi9saWJzL0FjY2Vzc29yLnRzIiwiLi4vc3JjL2xvYWRlci9nbHRmL2xpYnMvQW5pbWF0aW9uLnRzIiwiLi4vc3JjL2xvYWRlci9nbHRmL2xpYnMvQW5pbWF0aW9uQ2hhbm5lbC50cyIsIi4uL3NyYy9sb2FkZXIvZ2x0Zi9saWJzL0FuaW1hdGlvbkNoYW5uZWxUYXJnZXQudHMiLCIuLi9zcmMvbG9hZGVyL2dsdGYvdHlwZXMvZ2x0ZlR5cGUudHMiLCIuLi9zcmMvbG9hZGVyL2dsdGYvbGlicy9BbmltYXRpb25TYW1wbGVyLnRzIiwiLi4vc3JjL2xvYWRlci9HTFRGTG9hZGVyLnRzIiwiLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwiLi4vc3JjL21hdGgvU3BoZXJpY2FsLnRzIiwiLi4vc3JjL2NvbnRyb2wvT3JiaXRDb250cm9sLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBlbnVtIFByZWRlZmluZWRDb2xvclNwYWNlIHtcblx0U1JHQiA9IFwic3JnYlwiXG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBlbnVtIFBvd2VyUHJlZmVyZW5jZSB7XG5cdExvd1Bvd2VyID0gXCJsb3ctcG93ZXJcIixcblx0SGlnaFBlcmZvcm1hbmNlID0gXCJoaWdoLXBlcmZvcm1hbmNlXCJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gRmVhdHVyZU5hbWUge1xuXHREZXB0aENsaXBDb250cm9sID0gXCJkZXB0aC1jbGlwLWNvbnRyb2xcIixcblx0RGVwdGgyNFVub3JtU3RlbmNpbDggPSBcImRlcHRoMjR1bm9ybS1zdGVuY2lsOFwiLFxuXHREZXB0aDMyRmxvYXRTdGVuY2lsOCA9IFwiZGVwdGgzMmZsb2F0LXN0ZW5jaWw4XCIsXG5cdFRleHR1cmVDb21wcmVzc2lvbkJDID0gXCJ0ZXh0dXJlLWNvbXByZXNzaW9uLWJjXCIsXG5cdFRleHR1cmVDb21wcmVzc2lvbkVUQzIgPSBcInRleHR1cmUtY29tcHJlc3Npb24tZXRjMlwiLFxuXHRUZXh0dXJlQ29tcHJlc3Npb25BU1RDID0gXCJ0ZXh0dXJlLWNvbXByZXNzaW9uLWFzdGNcIixcblx0VGltZXN0YW1wUXVlcnkgPSBcInRpbWVzdGFtcC1xdWVyeVwiLFxuXHRJbmRpcmVjdEZpcnN0SW5zdGFuY2UgPSBcImluZGlyZWN0LWZpcnN0LWluc3RhbmNlXCIsXG5cdFNoYWRlckYxNiA9IFwic2hhZGVyLWYxNlwiLFxuXHRCR1JBOFVub3JtU3RvcmFnZSA9IFwiYmdyYTh1bm9ybS1zdG9yYWdlXCJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gQnVmZmVyVXNhZ2Uge1xuXHRNYXBSZWFkID0gMSxcblx0TWFwV3JpdGUgPSAyLFxuXHRDb3B5U3JjID0gNCxcblx0Q29weURzdCA9IDgsXG5cdEluZGV4ID0gMTYsXG5cdFZlcnRleCA9IDMyLFxuXHRVbmlmb3JtID0gNjQsXG5cdFN0b3JhZ2UgPSAxMjgsXG5cdEluZGlyZWN0ID0gMjU2LFxuXHRRdWVyeVJlc29sdmUgPSA1MTJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gTWFwTW9kZSB7XG5cdFJlYWQgPSAxLFxuXHRXcml0ZSA9IDJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gVGV4dHVyZURpbWVuc2lvbiB7XG5cdEUxZCA9IFwiMWRcIixcblx0RTJkID0gXCIyZFwiLFxuXHRFM2QgPSBcIjNkXCJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gVGV4dHVyZVVzYWdlIHtcblx0Q29weVNyYyA9IDEsXG5cdENvcHlEc3QgPSAyLFxuXHRUZXh0dXJlQmluZGluZyA9IDQsXG5cdFN0b3JhZ2VCaW5kaW5nID0gOCxcblx0UmVuZGVyQXR0YWNobWVudCA9IDE2XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBlbnVtIFRleHR1cmVWaWV3RGltZW5zaW9uIHtcblx0RTFkID0gXCIxZFwiLFxuXHRFMmQgPSBcIjJkXCIsXG5cdEUyZEFycmF5ID0gXCIyZC1hcnJheVwiLFxuXHRDdWJlID0gXCJjdWJlXCIsXG5cdEN1YmVBcnJheSA9IFwiY3ViZS1hcnJheVwiLFxuXHRFM2QgPSBcIjNkXCJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gVGV4dHVyZUFzcGVjdCB7XG5cdEFsbCA9IFwiYWxsXCIsXG5cdFN0ZW5jaWxPbmx5ID0gXCJzdGVuY2lsLW9ubHlcIixcblx0RGVwdGhPbmx5ID0gXCJkZXB0aC1vbmx5XCJcbn1cblxuLyoqXG4gKiBDb21tZW50cyB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9nZngtcnMvd2dwdS9ibG9iL21hc3Rlci93Z3B1LXR5cGVzL3NyYy9saWIucnNcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZW51bSBUZXh0dXJlRm9ybWF0IHtcblx0Ly8gOC1iaXQgZm9ybWF0c1xuXHRSOFVub3JtID0gXCJyOHVub3JtXCIsIC8vIFJlZCBjaGFubmVsIG9ubHkuIDggYml0IGludGVnZXIgcGVyIGNoYW5uZWwuIFswLCAyNTVdIGNvbnZlcnRlZCB0by9mcm9tIGZsb2F0IFswLCAxXSBpbiBzaGFkZXIuXG5cdFI4U25vcm0gPSBcInI4c25vcm1cIiwgLy8gUmVkIGNoYW5uZWwgb25seS4gOCBiaXQgaW50ZWdlciBwZXIgY2hhbm5lbC4gWy0xMjcsIDEyN10gY29udmVydGVkIHRvL2Zyb20gZmxvYXQgWy0xLCAxXSBpbiBzaGFkZXIuXG5cdFI4VWludCA9IFwicjh1aW50XCIsIC8vIFJlZCBjaGFubmVsIG9ubHkuIDggYml0IGludGVnZXIgcGVyIGNoYW5uZWwuIFVuc2lnbmVkIGluIHNoYWRlci5cblx0UjhTaW50ID0gXCJyOHNpbnRcIiwgLy8gUmVkIGNoYW5uZWwgb25seS4gOCBiaXQgaW50ZWdlciBwZXIgY2hhbm5lbC4gU2lnbmVkIGluIHNoYWRlci5cblxuXHQvLyAxNi1iaXQgZm9ybWF0c1xuXHRSMTZVaW50ID0gXCJyMTZ1aW50XCIsIC8vIFJlZCBjaGFubmVsIG9ubHkuIDE2IGJpdCBpbnRlZ2VyIHBlciBjaGFubmVsLiBVbnNpZ25lZCBpbiBzaGFkZXIuXG5cdFIxNlNpbnQgPSBcInIxNnNpbnRcIiwgLy8gUmVkIGNoYW5uZWwgb25seS4gMTYgYml0IGludGVnZXIgcGVyIGNoYW5uZWwuIFNpZ25lZCBpbiBzaGFkZXIuXG5cdFIxNkZsb2F0ID0gXCJyMTZmbG9hdFwiLCAvLyBSZWQgY2hhbm5lbCBvbmx5LiAxNiBiaXQgZmxvYXQgcGVyIGNoYW5uZWwuIEZsb2F0IGluIHNoYWRlci5cblx0Ukc4VW5vcm0gPSBcInJnOHVub3JtXCIsIC8vIFJlZCBhbmQgZ3JlZW4gY2hhbm5lbHMuIDggYml0IGludGVnZXIgcGVyIGNoYW5uZWwuIFswLCAyNTVdIGNvbnZlcnRlZCB0by9mcm9tIGZsb2F0IFswLCAxXSBpbiBzaGFkZXIuXG5cdFJHOFNub3JtID0gXCJyZzhzbm9ybVwiLCAvLyBSZWQgYW5kIGdyZWVuIGNoYW5uZWxzLiA4IGJpdCBpbnRlZ2VyIHBlciBjaGFubmVsLiBbLTEyNywgMTI3XSBjb252ZXJ0ZWQgdG8vZnJvbSBmbG9hdCBbLTEsIDFdIGluIHNoYWRlci5cblx0Ukc4VWludCA9IFwicmc4dWludFwiLCAvLyBSZWQgYW5kIGdyZWVuIGNoYW5uZWxzLiA4IGJpdCBpbnRlZ2VyIHBlciBjaGFubmVsLiBVbnNpZ25lZCBpbiBzaGFkZXIuXG5cdFJHOFNpbnQgPSBcInJnOHNpbnRcIiwgLy8gUmVkIGFuZCBncmVlbiBjaGFubmVscy4gOCBiaXQgaW50ZWdlciBwZXIgY2hhbm5lbC4gU2lnbmVkIGluIHNoYWRlci5cblxuXHQvLyAzMi1iaXQgZm9ybWF0c1xuXHRSMzJVaW50ID0gXCJyMzJ1aW50XCIsIC8vIFJlZCBjaGFubmVsIG9ubHkuIDMyIGJpdCBpbnRlZ2VyIHBlciBjaGFubmVsLiBVbnNpZ25lZCBpbiBzaGFkZXIuXG5cdFIzMlNpbnQgPSBcInIzMnNpbnRcIiwgLy8gUmVkIGNoYW5uZWwgb25seS4gMzIgYml0IGludGVnZXIgcGVyIGNoYW5uZWwuIFNpZ25lZCBpbiBzaGFkZXIuXG5cdFIzMkZsb2F0ID0gXCJyMzJmbG9hdFwiLCAvLyBSZWQgY2hhbm5lbCBvbmx5LiAzMiBiaXQgZmxvYXQgcGVyIGNoYW5uZWwuIEZsb2F0IGluIHNoYWRlci5cblx0UkcxNlVpbnQgPSBcInJnMTZ1aW50XCIsIC8vIFJlZCBhbmQgZ3JlZW4gY2hhbm5lbHMuIDE2IGJpdCBpbnRlZ2VyIHBlciBjaGFubmVsLiBVbnNpZ25lZCBpbiBzaGFkZXIuXG5cdFJHMTZTaW50ID0gXCJyZzE2c2ludFwiLCAvLyBSZWQgYW5kIGdyZWVuIGNoYW5uZWxzLiAxNiBiaXQgaW50ZWdlciBwZXIgY2hhbm5lbC4gU2lnbmVkIGluIHNoYWRlci5cblx0UkcxNkZsb2F0ID0gXCJyZzE2ZmxvYXRcIiwgLy8gUmVkIGFuZCBncmVlbiBjaGFubmVscy4gMTYgYml0IGZsb2F0IHBlciBjaGFubmVsLiBGbG9hdCBpbiBzaGFkZXIuXG5cdFJHQkE4VW5vcm0gPSBcInJnYmE4dW5vcm1cIiwgLy8gUmVkLCBncmVlbiwgYmx1ZSwgYW5kIGFscGhhIGNoYW5uZWxzLiA4IGJpdCBpbnRlZ2VyIHBlciBjaGFubmVsLiBbMCwgMjU1XSBjb252ZXJ0ZWQgdG8vZnJvbSBmbG9hdCBbMCwgMV0gaW4gc2hhZGVyLlxuXHRSR0JBOFVub3JtU1JHQiA9IFwicmdiYTh1bm9ybS1zcmdiXCIsIC8vIFJlZCwgZ3JlZW4sIGJsdWUsIGFuZCBhbHBoYSBjaGFubmVscy4gOCBiaXQgaW50ZWdlciBwZXIgY2hhbm5lbC4gU3JnYi1jb2xvciBbMCwgMjU1XSBjb252ZXJ0ZWQgdG8vZnJvbSBsaW5lYXItY29sb3IgZmxvYXQgWzAsIDFdIGluIHNoYWRlci5cblx0UkdCQThTbm9ybSA9IFwicmdiYThzbm9ybVwiLCAvLyBSZWQsIGdyZWVuLCBibHVlLCBhbmQgYWxwaGEgY2hhbm5lbHMuIDggYml0IGludGVnZXIgcGVyIGNoYW5uZWwuIFstMTI3LCAxMjddIGNvbnZlcnRlZCB0by9mcm9tIGZsb2F0IFstMSwgMV0gaW4gc2hhZGVyLlxuXHRSR0JBOFVpbnQgPSBcInJnYmE4dWludFwiLCAvLyBSZWQsIGdyZWVuLCBibHVlLCBhbmQgYWxwaGEgY2hhbm5lbHMuIDggYml0IGludGVnZXIgcGVyIGNoYW5uZWwuIFVuc2lnbmVkIGluIHNoYWRlci5cblx0UkdCQThTaW50ID0gXCJyZ2JhOHNpbnRcIiwgLy8gUmVkLCBncmVlbiwgYmx1ZSwgYW5kIGFscGhhIGNoYW5uZWxzLiA4IGJpdCBpbnRlZ2VyIHBlciBjaGFubmVsLiBTaWduZWQgaW4gc2hhZGVyLlxuXHRCR1JBOFVub3JtID0gXCJiZ3JhOHVub3JtXCIsIC8vIEJsdWUsIGdyZWVuLCByZWQsIGFuZCBhbHBoYSBjaGFubmVscy4gOCBiaXQgaW50ZWdlciBwZXIgY2hhbm5lbC4gWzAsIDI1NV0gY29udmVydGVkIHRvL2Zyb20gZmxvYXQgWzAsIDFdIGluIHNoYWRlci5cblx0QkdSQThVbm9ybVNSR0IgPSBcImJncmE4dW5vcm0tc3JnYlwiLCAvLyBCbHVlLCBncmVlbiwgcmVkLCBhbmQgYWxwaGEgY2hhbm5lbHMuIDggYml0IGludGVnZXIgcGVyIGNoYW5uZWwuIFNyZ2ItY29sb3IgWzAsIDI1NV0gY29udmVydGVkIHRvL2Zyb20gbGluZWFyLWNvbG9yIGZsb2F0IFswLCAxXSBpbiBzaGFkZXIuXG5cdC8vIFBhY2tlZCAzMi1iaXQgZm9ybWF0c1xuXHRSR0I5RTVVRmxvYXQgPSBcInJnYjllNXVmbG9hdFwiLCAvLyBQYWNrZWQgdW5zaWduZWQgZmxvYXQgd2l0aCA5IGJpdHMgbWFudGlzYSBmb3IgZWFjaCBSR0IgY29tcG9uZW50LCB0aGVuIGEgY29tbW9uIDUgYml0cyBleHBvbmVudFxuXHRSR0IxMEEyVW5vcm0gPSBcInJnYjEwYTJ1bm9ybVwiLCAvLyBSZWQsIGdyZWVuLCBibHVlLCBhbmQgYWxwaGEgY2hhbm5lbHMuIDEwIGJpdCBpbnRlZ2VyIGZvciBSR0IgY2hhbm5lbHMsIDIgYml0IGludGVnZXIgZm9yIGFscGhhIGNoYW5uZWwuIFswLCAxMDIzXSAoWzAsIDNdIGZvciBhbHBoYSkgY29udmVydGVkIHRvL2Zyb20gZmxvYXQgWzAsIDFdIGluIHNoYWRlci5cblx0UkcxMUIxMFVGbG9hdCA9IFwicmcxMWIxMHVmbG9hdFwiLCAvLyBSZWQsIGdyZWVuLCBhbmQgYmx1ZSBjaGFubmVscy4gMTEgYml0IGZsb2F0IHdpdGggbm8gc2lnbiBiaXQgZm9yIFJHIGNoYW5uZWxzLiAxMCBiaXQgZmxvYXQgd2l0aCBubyBzaWduIGJpdCBmb3IgYmx1ZSBjaGFubmVsLiBGbG9hdCBpbiBzaGFkZXIuXG5cblx0Ly8gNjQtYml0IGZvcm1hdHNcblx0UkczMlVpbnQgPSBcInJnMzJ1aW50XCIsIC8vIFJlZCBhbmQgZ3JlZW4gY2hhbm5lbHMuIDMyIGJpdCBpbnRlZ2VyIHBlciBjaGFubmVsLiBVbnNpZ25lZCBpbiBzaGFkZXIuXG5cdFJHMzJTaW50ID0gXCJyZzMyc2ludFwiLCAvLyBSZWQgYW5kIGdyZWVuIGNoYW5uZWxzLiAzMiBiaXQgaW50ZWdlciBwZXIgY2hhbm5lbC4gU2lnbmVkIGluIHNoYWRlci5cblx0UkczMkZsb2F0ID0gXCJyZzMyZmxvYXRcIiwgLy8gUmVkIGFuZCBncmVlbiBjaGFubmVscy4gMzIgYml0IGZsb2F0IHBlciBjaGFubmVsLiBGbG9hdCBpbiBzaGFkZXIuXG5cdFJHQkExNlVpbnQgPSBcInJnYmExNnVpbnRcIiwgLy8gUmVkLCBncmVlbiwgYmx1ZSwgYW5kIGFscGhhIGNoYW5uZWxzLiAxNiBiaXQgaW50ZWdlciBwZXIgY2hhbm5lbC4gVW5zaWduZWQgaW4gc2hhZGVyLlxuXHRSR0JBMTZTaW50ID0gXCJyZ2JhMTZzaW50XCIsIC8vIFJlZCwgZ3JlZW4sIGJsdWUsIGFuZCBhbHBoYSBjaGFubmVscy4gMTYgYml0IGludGVnZXIgcGVyIGNoYW5uZWwuIFNpZ25lZCBpbiBzaGFkZXIuXG5cdFJHQkExNkZsb2F0ID0gXCJyZ2JhMTZmbG9hdFwiLCAvLyBSZWQsIGdyZWVuLCBibHVlLCBhbmQgYWxwaGEgY2hhbm5lbHMuIDE2IGJpdCBmbG9hdCBwZXIgY2hhbm5lbC4gRmxvYXQgaW4gc2hhZGVyLlxuXG5cdC8vIDEyOC1iaXQgZm9ybWF0c1xuXHRSR0JBMzJVaW50ID0gXCJyZ2JhMzJ1aW50XCIsIC8vIFJlZCwgZ3JlZW4sIGJsdWUsIGFuZCBhbHBoYSBjaGFubmVscy4gMzIgYml0IGludGVnZXIgcGVyIGNoYW5uZWwuIFVuc2lnbmVkIGluIHNoYWRlci5cblx0UkdCQTMyU2ludCA9IFwicmdiYTMyc2ludFwiLCAvLyBSZWQsIGdyZWVuLCBibHVlLCBhbmQgYWxwaGEgY2hhbm5lbHMuIDMyIGJpdCBpbnRlZ2VyIHBlciBjaGFubmVsLiBTaWduZWQgaW4gc2hhZGVyLlxuXHRSR0JBMzJGbG9hdCA9IFwicmdiYTMyZmxvYXRcIiwgLy8gUmVkLCBncmVlbiwgYmx1ZSwgYW5kIGFscGhhIGNoYW5uZWxzLiAzMiBiaXQgZmxvYXQgcGVyIGNoYW5uZWwuIEZsb2F0IGluIHNoYWRlci5cblxuXHQvLyBEZXB0aCBhbmQgc3RlbmNpbCBmb3JtYXRzXG5cdFN0ZW5jaWw4ID0gXCJzdGVuY2lsOFwiLFxuXHREZXB0aDE2VW5vcm0gPSBcImRlcHRoMTZ1bm9ybVwiLFxuXHREZXB0aDI0UGx1cyA9IFwiZGVwdGgyNHBsdXNcIiwgLy8gU3BlY2lhbCBkZXB0aCBmb3JtYXQgd2l0aCBhdCBsZWFzdCAyNCBiaXQgaW50ZWdlciBkZXB0aC5cblx0RGVwdGgyNFBsdXNTdGVuY2lsOCA9IFwiZGVwdGgyNHBsdXMtc3RlbmNpbDhcIiwgLy8gU3BlY2lhbCBkZXB0aC9zdGVuY2lsIGZvcm1hdCB3aXRoIGF0IGxlYXN0IDI0IGJpdCBpbnRlZ2VyIGRlcHRoIGFuZCA4IGJpdHMgaW50ZWdlciBzdGVuY2lsLlxuXHREZXB0aDMyRmxvYXQgPSBcImRlcHRoMzJmbG9hdFwiLCAvLyBTcGVjaWFsIGRlcHRoIGZvcm1hdCB3aXRoIDMyIGJpdCBmbG9hdGluZyBwb2ludCBkZXB0aC5cblxuXHQvLyBCQyBjb21wcmVzc2VkIGZvcm1hdHMgdXNhYmxlIGlmIFwidGV4dHVyZS1jb21wcmVzc2lvbi1iY1wiIGlzIGJvdGhcblx0Ly8gc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UvdXNlciBhZ2VudCBhbmQgZW5hYmxlZCBpbiByZXF1ZXN0RGV2aWNlLlxuXHRCQzFSR0JBVW5vcm0gPSBcImJjMS1yZ2JhLXVub3JtXCIsIC8vIDR4NCBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDggYnl0ZXMgcGVyIGJsb2NrICg0IGJpdC9weCkuIDQgY29sb3IgKyBhbHBoYSBwYWxsZXQuIDUgYml0IFIgKyA2IGJpdCBHICsgNSBiaXQgQiArIDEgYml0IGFscGhhLiBBbHNvIGtub3duIGFzIERYVDEuXG5cdEJDMVJHQkFVbm9ybVNSR0IgPSBcImJjMS1yZ2JhLXVub3JtLXNyZ2JcIiwgLy8gNHg0IGJsb2NrIGNvbXByZXNzZWQgdGV4dHVyZS4gOCBieXRlcyBwZXIgYmxvY2sgKDQgYml0L3B4KS4gNCBjb2xvciArIGFscGhhIHBhbGxldC4gNSBiaXQgUiArIDYgYml0IEcgKyA1IGJpdCBCICsgMSBiaXQgYWxwaGEuIEFsc28ga25vd24gYXMgRFhUMS5cblx0QkMyUkdCQVVub3JtID0gXCJiYzItcmdiYS11bm9ybVwiLCAvLyA0eDQgYmxvY2sgY29tcHJlc3NlZCB0ZXh0dXJlLiAxNiBieXRlcyBwZXIgYmxvY2sgKDggYml0L3B4KS4gNCBjb2xvciBwYWxsZXQuIDUgYml0IFIgKyA2IGJpdCBHICsgNSBiaXQgQiArIDQgYml0IGFscGhhLiBBbHNvIGtub3duIGFzIERYVDMuXG5cdEJDMlJHQkFVbm9ybVNSR0IgPSBcImJjMi1yZ2JhLXVub3JtLXNyZ2JcIiwgLy8gNHg0IGJsb2NrIGNvbXByZXNzZWQgdGV4dHVyZS4gMTYgYnl0ZXMgcGVyIGJsb2NrICg4IGJpdC9weCkuIDQgY29sb3IgcGFsbGV0LiA1IGJpdCBSICsgNiBiaXQgRyArIDUgYml0IEIgKyA0IGJpdCBhbHBoYS4gQWxzbyBrbm93biBhcyBEWFQzLlxuXHRCQzNSR0JBVW5vcm0gPSBcImJjMy1yZ2JhLXVub3JtXCIsIC8vIDR4NCBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDE2IGJ5dGVzIHBlciBibG9jayAoOCBiaXQvcHgpLiA0IGNvbG9yIHBhbGxldCArIDggYWxwaGEgcGFsbGV0LiA1IGJpdCBSICsgNiBiaXQgRyArIDUgYml0IEIgKyA4IGJpdCBhbHBoYS4gQWxzbyBrbm93biBhcyBEWFQ1LlxuXHRCQzNSR0JBVW5vcm1TUkdCID0gXCJiYzMtcmdiYS11bm9ybS1zcmdiXCIsIC8vIDR4NCBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDE2IGJ5dGVzIHBlciBibG9jayAoOCBiaXQvcHgpLiA0IGNvbG9yIHBhbGxldCArIDggYWxwaGEgcGFsbGV0LiA1IGJpdCBSICsgNiBiaXQgRyArIDUgYml0IEIgKyA4IGJpdCBhbHBoYS4gQWxzbyBrbm93biBhcyBEWFQ1LlxuXHRCQzRSVW5vcm0gPSBcImJjNC1yLXVub3JtXCIsIC8vIDR4NCBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDggYnl0ZXMgcGVyIGJsb2NrICg0IGJpdC9weCkuIDggY29sb3IgcGFsbGV0LiA4IGJpdCBSLiBBbHNvIGtub3duIGFzIFJHVEMxLlxuXHRCQzRSU25vcm0gPSBcImJjNC1yLXNub3JtXCIsIC8vIDR4NCBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDggYnl0ZXMgcGVyIGJsb2NrICg0IGJpdC9weCkuIDggY29sb3IgcGFsbGV0LiA4IGJpdCBSLiBBbHNvIGtub3duIGFzIFJHVEMxLlxuXHRCQzVSR1Vub3JtID0gXCJiYzUtcmctdW5vcm1cIiwgLy8gNHg0IGJsb2NrIGNvbXByZXNzZWQgdGV4dHVyZS4gMTYgYnl0ZXMgcGVyIGJsb2NrICg4IGJpdC9weCkuIDggY29sb3IgcmVkIHBhbGxldCArIDggY29sb3IgZ3JlZW4gcGFsbGV0LiA4IGJpdCBSRy4gQWxzbyBrbm93biBhcyBSR1RDMi5cblx0QkM1UkdTbm9ybSA9IFwiYmM1LXJnLXNub3JtXCIsIC8vIDR4NCBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDE2IGJ5dGVzIHBlciBibG9jayAoOCBiaXQvcHgpLiA4IGNvbG9yIHJlZCBwYWxsZXQgKyA4IGNvbG9yIGdyZWVuIHBhbGxldC4gOCBiaXQgUkcuIEFsc28ga25vd24gYXMgUkdUQzIuXG5cdEJDNkhSR0JVRmxvYXQgPSBcImJjNmgtcmdiLXVmbG9hdFwiLCAvLyA0eDQgYmxvY2sgY29tcHJlc3NlZCB0ZXh0dXJlLiAxNiBieXRlcyBwZXIgYmxvY2sgKDggYml0L3B4KS4gVmFyaWFibGUgc2l6ZWQgcGFsbGV0LiAxNiBiaXQgdW5zaWduZWQgZmxvYXQgUkdCLiBGbG9hdCBpbiBzaGFkZXIuIEFsc28ga25vd24gYXMgQlBUQyAoZmxvYXQpLlxuXHRCQzZIUkdCRmxvYXQgPSBcImJjNmgtcmdiLWZsb2F0XCIsIC8vIDR4NCBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDE2IGJ5dGVzIHBlciBibG9jayAoOCBiaXQvcHgpLiBWYXJpYWJsZSBzaXplZCBwYWxsZXQuIDE2IGJpdCBzaWduZWQgZmxvYXQgUkdCLiBGbG9hdCBpbiBzaGFkZXIuIEFsc28ga25vd24gYXMgQlBUQyAoZmxvYXQpLlxuXHRCQzdSR0JBVW5vcm0gPSBcImJjNy1yZ2JhLXVub3JtXCIsIC8vIDR4NCBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDE2IGJ5dGVzIHBlciBibG9jayAoOCBiaXQvcHgpLiBWYXJpYWJsZSBzaXplZCBwYWxsZXQuIDggYml0IGludGVnZXIgUkdCQS4gQWxzbyBrbm93biBhcyBCUFRDICh1bm9ybSkuXG5cdEJDN1JHQkFVbm9ybVNSR0IgPSBcImJjNy1yZ2JhLXVub3JtLXNyZ2JcIiwgLy8gNHg0IGJsb2NrIGNvbXByZXNzZWQgdGV4dHVyZS4gMTYgYnl0ZXMgcGVyIGJsb2NrICg4IGJpdC9weCkuIFZhcmlhYmxlIHNpemVkIHBhbGxldC4gOCBiaXQgaW50ZWdlciBSR0JBLiBBbHNvIGtub3duIGFzIEJQVEMgKHVub3JtKS5cblxuXHQvLyBFVEMyIGNvbXByZXNzZWQgZm9ybWF0cyB1c2FibGUgaWYgXCJ0ZXh0dXJlLWNvbXByZXNzaW9uLWV0YzJcIiBpcyBib3RoXG5cdC8vIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlL3VzZXIgYWdlbnQgYW5kIGVuYWJsZWQgaW4gcmVxdWVzdERldmljZS5cblx0RVRDMlJHQjhVbm9ybSA9IFwiZXRjMi1yZ2I4dW5vcm1cIiwgLy8gNHg0IGJsb2NrIGNvbXByZXNzZWQgdGV4dHVyZS4gOCBieXRlcyBwZXIgYmxvY2sgKDQgYml0L3B4KS4gQ29tcGxleCBwYWxsZXQuIDggYml0IGludGVnZXIgUkdCLlxuXHRFVEMyUkdCOFVub3JtU1JHQiA9IFwiZXRjMi1yZ2I4dW5vcm0tc3JnYlwiLCAvLyA0eDQgYmxvY2sgY29tcHJlc3NlZCB0ZXh0dXJlLiA4IGJ5dGVzIHBlciBibG9jayAoNCBiaXQvcHgpLiBDb21wbGV4IHBhbGxldC4gOCBiaXQgaW50ZWdlciBSR0IuXG5cdEVUQzJSR0I4QTFVbm9ybSA9IFwiZXRjMi1yZ2I4YTF1bm9ybVwiLCAvLyA0eDQgYmxvY2sgY29tcHJlc3NlZCB0ZXh0dXJlLiA4IGJ5dGVzIHBlciBibG9jayAoNCBiaXQvcHgpLiBDb21wbGV4IHBhbGxldC4gOCBiaXQgaW50ZWdlciBSR0IgKyAxIGJpdCBhbHBoYS5cblx0RVRDMlJHQjhBMVVub3JtU1JHQiA9IFwiZXRjMi1yZ2I4YTF1bm9ybS1zcmdiXCIsIC8vIDR4NCBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDggYnl0ZXMgcGVyIGJsb2NrICg0IGJpdC9weCkuIENvbXBsZXggcGFsbGV0LiA4IGJpdCBpbnRlZ2VyIFJHQiArIDEgYml0IGFscGhhLlxuXHRFVEMyUkdCQThVbm9ybSA9IFwiZXRjMi1yZ2JhOHVub3JtXCIsIC8vIDR4NCBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDE2IGJ5dGVzIHBlciBibG9jayAoOCBiaXQvcHgpLiBDb21wbGV4IHBhbGxldC4gOCBiaXQgaW50ZWdlciBSR0IgKyA4IGJpdCBhbHBoYS5cblx0RVRDMlJHQkE4VW5vcm1TUkdCID0gXCJldGMyLXJnYmE4dW5vcm0tc3JnYlwiLCAvLyA0eDQgYmxvY2sgY29tcHJlc3NlZCB0ZXh0dXJlLiAxNiBieXRlcyBwZXIgYmxvY2sgKDggYml0L3B4KS4gQ29tcGxleCBwYWxsZXQuIDggYml0IGludGVnZXIgUkdCICsgOCBiaXQgYWxwaGEuXG5cdEVBQ1IxMVVub3JtID0gXCJlYWMtcjExdW5vcm1cIiwgLy8gNHg0IGJsb2NrIGNvbXByZXNzZWQgdGV4dHVyZS4gOCBieXRlcyBwZXIgYmxvY2sgKDQgYml0L3B4KS4gQ29tcGxleCBwYWxsZXQuIDExIGJpdCBpbnRlZ2VyIFIuXG5cdEVBQ1IxMVNub3JtID0gXCJlYWMtcjExc25vcm1cIiwgLy8gNHg0IGJsb2NrIGNvbXByZXNzZWQgdGV4dHVyZS4gOCBieXRlcyBwZXIgYmxvY2sgKDQgYml0L3B4KS4gQ29tcGxleCBwYWxsZXQuIDExIGJpdCBpbnRlZ2VyIFIuXG5cdEVBQ1JHMTFVbm9ybSA9IFwiZWFjLXJnMTF1bm9ybVwiLCAvLyA0eDQgYmxvY2sgY29tcHJlc3NlZCB0ZXh0dXJlLiAxNiBieXRlcyBwZXIgYmxvY2sgKDggYml0L3B4KS4gQ29tcGxleCBwYWxsZXQuIDExIGJpdCBpbnRlZ2VyIFIgKyAxMSBiaXQgaW50ZWdlciBHLlxuXHRFQUNSRzExU25vcm0gPSBcImVhYy1yZzExc25vcm1cIiwgLy8gNHg0IGJsb2NrIGNvbXByZXNzZWQgdGV4dHVyZS4gMTYgYnl0ZXMgcGVyIGJsb2NrICg4IGJpdC9weCkuIENvbXBsZXggcGFsbGV0LiAxMSBiaXQgaW50ZWdlciBSICsgMTEgYml0IGludGVnZXIgRy5cblxuXHQvLyBBU1RDIGNvbXByZXNzZWQgZm9ybWF0cyB1c2FibGUgaWYgXCJ0ZXh0dXJlLWNvbXByZXNzaW9uLWFzdGNcIiBpcyBib3RoXG5cdC8vIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlL3VzZXIgYWdlbnQgYW5kIGVuYWJsZWQgaW4gcmVxdWVzdERldmljZS5cblx0QVNUQzR4NFVub3JtID0gXCJhc3RjLTR4NC11bm9ybVwiLCAvLyA0eDQgYmxvY2sgY29tcHJlc3NlZCB0ZXh0dXJlLiAxNiBieXRlcyBwZXIgYmxvY2sgKDggYml0L3B4KS4gQ29tcGxleCBwYWxsZXQuIDggYml0IGludGVnZXIgUkdCQS5cblx0QVNUQzR4NFVub3JtU1JHQiA9IFwiYXN0Yy00eDQtdW5vcm0tc3JnYlwiLCAvLyA0eDQgYmxvY2sgY29tcHJlc3NlZCB0ZXh0dXJlLiAxNiBieXRlcyBwZXIgYmxvY2sgKDggYml0L3B4KS4gQ29tcGxleCBwYWxsZXQuIDggYml0IGludGVnZXIgUkdCQS5cblx0QVNUQzV4NFVub3JtID0gXCJhc3RjLTV4NC11bm9ybVwiLCAvLyA1eDQgYmxvY2sgY29tcHJlc3NlZCB0ZXh0dXJlLiAxNiBieXRlcyBwZXIgYmxvY2sgKDYuNCBiaXQvcHgpLiBDb21wbGV4IHBhbGxldC4gOCBiaXQgaW50ZWdlciBSR0JBLlxuXHRBU1RDNXg0VW5vcm1TUkdCID0gXCJhc3RjLTV4NC11bm9ybS1zcmdiXCIsIC8vIDV4NCBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDE2IGJ5dGVzIHBlciBibG9jayAoNi40IGJpdC9weCkuIENvbXBsZXggcGFsbGV0LiA4IGJpdCBpbnRlZ2VyIFJHQkEuXG5cdEFTVEM1eDVVbm9ybSA9IFwiYXN0Yy01eDUtdW5vcm1cIiwgLy8gNXg1IGJsb2NrIGNvbXByZXNzZWQgdGV4dHVyZS4gMTYgYnl0ZXMgcGVyIGJsb2NrICg1LjEyIGJpdC9weCkuIENvbXBsZXggcGFsbGV0LiA4IGJpdCBpbnRlZ2VyIFJHQkEuXG5cdEFTVEM1eDVVbm9ybVNSR0IgPSBcImFzdGMtNXg1LXVub3JtLXNyZ2JcIiwgLy8gNXg1IGJsb2NrIGNvbXByZXNzZWQgdGV4dHVyZS4gMTYgYnl0ZXMgcGVyIGJsb2NrICg1LjEyIGJpdC9weCkuIENvbXBsZXggcGFsbGV0LiA4IGJpdCBpbnRlZ2VyIFJHQkEuXG5cdEFTVEM2eDVVbm9ybSA9IFwiYXN0Yy02eDUtdW5vcm1cIiwgLy8gNng1IGJsb2NrIGNvbXByZXNzZWQgdGV4dHVyZS4gMTYgYnl0ZXMgcGVyIGJsb2NrICg0LjI3IGJpdC9weCkuIENvbXBsZXggcGFsbGV0LiA4IGJpdCBpbnRlZ2VyIFJHQkEuXG5cdEFTVEM2eDVVbm9ybVNSR0IgPSBcImFzdGMtNng1LXVub3JtLXNyZ2JcIiwgLy8gNng1IGJsb2NrIGNvbXByZXNzZWQgdGV4dHVyZS4gMTYgYnl0ZXMgcGVyIGJsb2NrICg0LjI3IGJpdC9weCkuIENvbXBsZXggcGFsbGV0LiA4IGJpdCBpbnRlZ2VyIFJHQkEuXG5cdEFTVEM2eDZVbm9ybSA9IFwiYXN0Yy02eDYtdW5vcm1cIiwgLy8gNng2IGJsb2NrIGNvbXByZXNzZWQgdGV4dHVyZS4gMTYgYnl0ZXMgcGVyIGJsb2NrICgzLjU2IGJpdC9weCkuIENvbXBsZXggcGFsbGV0LiA4IGJpdCBpbnRlZ2VyIFJHQkEuXG5cdEFTVEM2eDZVbm9ybVNSR0IgPSBcImFzdGMtNng2LXVub3JtLXNyZ2JcIiwgLy8gNng2IGJsb2NrIGNvbXByZXNzZWQgdGV4dHVyZS4gMTYgYnl0ZXMgcGVyIGJsb2NrICgzLjU2IGJpdC9weCkuIENvbXBsZXggcGFsbGV0LiA4IGJpdCBpbnRlZ2VyIFJHQkEuXG5cdEFTVEM4eDVVbm9ybSA9IFwiYXN0Yy04eDUtdW5vcm1cIiwgLy8gOHg1IGJsb2NrIGNvbXByZXNzZWQgdGV4dHVyZS4gMTYgYnl0ZXMgcGVyIGJsb2NrICgzLjIgYml0L3B4KS4gQ29tcGxleCBwYWxsZXQuIDggYml0IGludGVnZXIgUkdCQS5cblx0QVNUQzh4NVVub3JtU1JHQiA9IFwiYXN0Yy04eDUtdW5vcm0tc3JnYlwiLCAvLyA4eDUgYmxvY2sgY29tcHJlc3NlZCB0ZXh0dXJlLiAxNiBieXRlcyBwZXIgYmxvY2sgKDMuMiBiaXQvcHgpLiBDb21wbGV4IHBhbGxldC4gOCBiaXQgaW50ZWdlciBSR0JBLlxuXHRBU1RDOHg2VW5vcm0gPSBcImFzdGMtOHg2LXVub3JtXCIsIC8vIDh4NiBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDE2IGJ5dGVzIHBlciBibG9jayAoMi42NyBiaXQvcHgpLiBDb21wbGV4IHBhbGxldC4gOCBiaXQgaW50ZWdlciBSR0JBLlxuXHRBU1RDOHg2VW5vcm1TUkdCID0gXCJhc3RjLTh4Ni11bm9ybS1zcmdiXCIsIC8vIDh4NiBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDE2IGJ5dGVzIHBlciBibG9jayAoMi42NyBiaXQvcHgpLiBDb21wbGV4IHBhbGxldC4gOCBiaXQgaW50ZWdlciBSR0JBLlxuXHRBU1RDOHg4VW5vcm0gPSBcImFzdGMtOHg4LXVub3JtXCIsIC8vIDh4OCBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDE2IGJ5dGVzIHBlciBibG9jayAoMiBiaXQvcHgpLiBDb21wbGV4IHBhbGxldC4gOCBiaXQgaW50ZWdlciBSR0JBLlxuXHRBU1RDOHg4VW5vcm1TUkdCID0gXCJhc3RjLTh4OC11bm9ybS1zcmdiXCIsIC8vIDh4OCBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDE2IGJ5dGVzIHBlciBibG9jayAoMiBiaXQvcHgpLiBDb21wbGV4IHBhbGxldC4gOCBiaXQgaW50ZWdlciBSR0JBLlxuXHRBU1RDMTB4NVVub3JtID0gXCJhc3RjLTEweDUtdW5vcm1cIiwgLy8gMTB4NSBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDE2IGJ5dGVzIHBlciBibG9jayAoMi41NiBiaXQvcHgpLiBDb21wbGV4IHBhbGxldC4gOCBiaXQgaW50ZWdlciBSR0JBLlxuXHRBU1RDMTB4NVVub3JtU1JHQiA9IFwiYXN0Yy0xMHg1LXVub3JtLXNyZ2JcIiwgLy8gMTB4NSBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDE2IGJ5dGVzIHBlciBibG9jayAoMi41NiBiaXQvcHgpLiBDb21wbGV4IHBhbGxldC4gOCBiaXQgaW50ZWdlciBSR0JBLlxuXHRBU1RDMTB4NlVub3JtID0gXCJhc3RjLTEweDYtdW5vcm1cIiwgLy8gMTB4NiBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDE2IGJ5dGVzIHBlciBibG9jayAoMi4xMyBiaXQvcHgpLiBDb21wbGV4IHBhbGxldC4gOCBiaXQgaW50ZWdlciBSR0JBLlxuXHRBU1RDMTB4NlVub3JtU1JHQiA9IFwiYXN0Yy0xMHg2LXVub3JtLXNyZ2JcIiwgLy8gMTB4NiBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDE2IGJ5dGVzIHBlciBibG9jayAoMi4xMyBiaXQvcHgpLiBDb21wbGV4IHBhbGxldC4gOCBiaXQgaW50ZWdlciBSR0JBLlxuXHRBU1RDMTB4OFVub3JtID0gXCJhc3RjLTEweDgtdW5vcm1cIiwgLy8gMTB4OCBibG9jayBjb21wcmVzc2VkIHRleHR1cmUuIDE2IGJ5dGVzIHBlciBibG9jayAoMS42IGJpdC9weCkuIENvbXBsZXggcGFsbGV0LiA4IGJpdCBpbnRlZ2VyIFJHQkEuXG5cdEFTVEMxMHg4VW5vcm1TUkdCID0gXCJhc3RjLTEweDgtdW5vcm0tc3JnYlwiLCAvLyAxMHg4IGJsb2NrIGNvbXByZXNzZWQgdGV4dHVyZS4gMTYgYnl0ZXMgcGVyIGJsb2NrICgxLjYgYml0L3B4KS4gQ29tcGxleCBwYWxsZXQuIDggYml0IGludGVnZXIgUkdCQS5cblx0QVNUQzEweDEwVW5vcm0gPSBcImFzdGMtMTB4MTAtdW5vcm1cIiwgLy8gMTB4MTAgYmxvY2sgY29tcHJlc3NlZCB0ZXh0dXJlLiAxNiBieXRlcyBwZXIgYmxvY2sgKDEuMjggYml0L3B4KS4gQ29tcGxleCBwYWxsZXQuIDggYml0IGludGVnZXIgUkdCQS5cblx0QVNUQzEweDEwVW5vcm1TUkdCID0gXCJhc3RjLTEweDEwLXVub3JtLXNyZ2JcIiwgLy8gMTB4MTAgYmxvY2sgY29tcHJlc3NlZCB0ZXh0dXJlLiAxNiBieXRlcyBwZXIgYmxvY2sgKDEuMjggYml0L3B4KS4gQ29tcGxleCBwYWxsZXQuIDggYml0IGludGVnZXIgUkdCQS5cblx0QVNUQzEyeDEwVW5vcm0gPSBcImFzdGMtMTJ4MTAtdW5vcm1cIiwgLy8gMTJ4MTAgYmxvY2sgY29tcHJlc3NlZCB0ZXh0dXJlLiAxNiBieXRlcyBwZXIgYmxvY2sgKDEuMDcgYml0L3B4KS4gQ29tcGxleCBwYWxsZXQuIDggYml0IGludGVnZXIgUkdCQS5cblx0QVNUQzEyeDEwVW5vcm1TUkdCID0gXCJhc3RjLTEyeDEwLXVub3JtLXNyZ2JcIiwgLy8gMTJ4MTAgYmxvY2sgY29tcHJlc3NlZCB0ZXh0dXJlLiAxNiBieXRlcyBwZXIgYmxvY2sgKDEuMDcgYml0L3B4KS4gQ29tcGxleCBwYWxsZXQuIDggYml0IGludGVnZXIgUkdCQS5cblx0QVNUQzEyeDEyVW5vcm0gPSBcImFzdGMtMTJ4MTItdW5vcm1cIiwgLy8gMTJ4MTIgYmxvY2sgY29tcHJlc3NlZCB0ZXh0dXJlLiAxNiBieXRlcyBwZXIgYmxvY2sgKDAuODkgYml0L3B4KS4gQ29tcGxleCBwYWxsZXQuIDggYml0IGludGVnZXIgUkdCQS5cblx0QVNUQzEyeDEyVW5vcm1TUkdCID0gXCJhc3RjLTEyeDEyLXVub3JtLXNyZ2JcIiwgLy8gMTJ4MTIgYmxvY2sgY29tcHJlc3NlZCB0ZXh0dXJlLiAxNiBieXRlcyBwZXIgYmxvY2sgKDAuODkgYml0L3B4KS4gQ29tcGxleCBwYWxsZXQuIDggYml0IGludGVnZXIgUkdCQS5cblxuXHQvLyBcImRlcHRoMjR1bm9ybS1zdGVuY2lsOFwiIGZlYXR1cmVcblx0RGVwdGgyNFVub3JtU3RlbmNpbDggPSBcImRlcHRoMjR1bm9ybS1zdGVuY2lsOFwiLFxuXG5cdC8vIFwiZGVwdGgzMmZsb2F0LXN0ZW5jaWw4XCIgZmVhdHVyZVxuXHREZXB0aDMyRmxvYXRTdGVuY2lsOCA9IFwiZGVwdGgzMmZsb2F0LXN0ZW5jaWw4XCJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gQWRkcmVzc01vZGUge1xuXHRDbGFtcFRvRWRnZSA9IFwiY2xhbXAtdG8tZWRnZVwiLFxuXHRSZXBlYXQgPSBcInJlcGVhdFwiLFxuXHRNaXJyb3JSZXBlYXQgPSBcIm1pcnJvci1yZXBlYXRcIlxufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgZW51bSBGaWx0ZXJNb2RlIHtcblx0TmVhcmVzdCA9IFwibmVhcmVzdFwiLFxuXHRMaW5lYXIgPSBcImxpbmVhclwiXG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBlbnVtIENvbXBhcmVGdW5jdGlvbiB7XG5cdE5ldmVyID0gXCJuZXZlclwiLFxuXHRMZXNzID0gXCJsZXNzXCIsXG5cdEVxdWFsID0gXCJlcXVhbFwiLFxuXHRMZXNzRXF1YWwgPSBcImxlc3MtZXF1YWxcIixcblx0R3JlYXRlciA9IFwiZ3JlYXRlclwiLFxuXHROb3RFcXVhbCA9IFwibm90LWVxdWFsXCIsXG5cdEdyZWF0ZXJFcXVhbCA9IFwiZ3JlYXRlci1lcXVhbFwiLFxuXHRBbHdheXMgPSBcImFsd2F5c1wiXG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBlbnVtIFNoYWRlclN0YWdlIHtcblx0VmVydGV4ID0gMSxcblx0RnJhZ21lbnQgPSAyLFxuXHRDb21wdXRlID0gNFxufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgZW51bSBCdWZmZXJCaW5kaW5nVHlwZSB7XG5cdFVuaWZvcm0gPSBcInVuaWZvcm1cIixcblx0U3RvcmFnZSA9IFwic3RvcmFnZVwiLFxuXHRSZWFkT25seVN0b3JhZ2UgPSBcInJlYWQtb25seS1zdG9yYWdlXCJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gU2FtcGxlckJpbmRpbmdUeXBlIHtcblx0RmlsdGVyaW5nID0gXCJmaWx0ZXJpbmdcIixcblx0Tm9uRmlsdGVyaW5nID0gXCJub24tZmlsdGVyaW5nXCIsXG5cdENvbXBhcmlzb24gPSBcImNvbXBhcmlzb25cIlxufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgZW51bSBUZXh0dXJlU2FtcGxlVHlwZSB7XG5cdEZsb2F0ID0gXCJmbG9hdFwiLFxuXHRVbmZpbHRlcmFibGVGbG9hdCA9IFwidW5maWx0ZXJhYmxlLWZsb2F0XCIsXG5cdERlcHRoID0gXCJkZXB0aFwiLFxuXHRTaW50ID0gXCJzaW50XCIsXG5cdFVpbnQgPSBcInVpbnRcIlxufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgZW51bSBTdG9yYWdlVGV4dHVyZUFjY2VzcyB7XG5cdFdyaXRlT25seSA9IFwid3JpdGUtb25seVwiXG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBlbnVtIENvbXBpbGF0aW9uTWVzc2FnZVR5cGUge1xuXHRFcnJvciA9IFwiZXJyb3JcIixcblx0V2FybmluZyA9IFwid2FybmluZ1wiLFxuXHRJbmZvID0gXCJpbmZvXCJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gQXV0b0xheW91dE1vZGUge1xuXHRBdXRvID0gXCJhdXRvXCJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gUHJpbWl0aXZlVG9wb2xvZ3kge1xuXHRQb2ludExpc3QgPSBcInBvaW50LWxpc3RcIixcblx0TGluZUxpc3QgPSBcImxpbmUtbGlzdFwiLFxuXHRMaW5lU3RyaXAgPSBcImxpbmUtc3RyaXBcIixcblx0VHJpYW5nbGVMaXN0ID0gXCJ0cmlhbmdsZS1saXN0XCIsXG5cdFRyaWFuZ2xlU3RyaXAgPSBcInRyaWFuZ2xlLXN0cmlwXCJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gRnJvbnRGYWNlIHtcblx0Q0NXID0gXCJjY3dcIixcblx0Q1cgPSBcImN3XCJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gQ3VsbE1vZGUge1xuXHROb25lID0gXCJub25lXCIsXG5cdEZyb250ID0gXCJmcm9udFwiLFxuXHRCYWNrID0gXCJiYWNrXCJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gQ29sb3JXcml0ZUZsYWdzIHtcblx0UmVkID0gMSxcblx0R3JlZW4gPSAyLFxuXHRCbHVlID0gNCxcblx0QWxwaGEgPSA4LFxuXHRBbGwgPSAxNVxufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgZW51bSBCbGVuZEZhY3RvciB7XG5cdFplcm8gPSBcInplcm9cIixcblx0T25lID0gXCJvbmVcIixcblx0U3JjID0gXCJzcmNcIixcblx0T25lTWludXNTcmMgPSBcIm9uZS1taW51cy1zcmNcIixcblx0U3JjQWxwaGEgPSBcInNyYy1hbHBoYVwiLFxuXHRPbmVNaW51c1NyY0FscGhhID0gXCJvbmUtbWludXMtc3JjLWFscGhhXCIsXG5cdERzdCA9IFwiZHN0XCIsXG5cdE9uZU1pbnVzRHN0ID0gXCJvbmUtbWludXMtZHN0XCIsXG5cdERzdEFscGhhID0gXCJkc3QtYWxwaGFcIixcblx0T25lTWludXNEc3RBbHBoYSA9IFwib25lLW1pbnVzLWRzdC1hbHBoYVwiLFxuXHRTcmNBbHBoYVNhdHVyYXRlZCA9IFwic3JjLWFscGhhLXNhdHVyYXRlZFwiLFxuXHRDb25zdGFudCA9IFwiY29uc3RhbnRcIixcblx0T25lTWludXNDb25zdGFudCA9IFwib25lLW1pbnVzLWNvbnN0YW50XCJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gQmxlbmRPcGVyYXRpb24ge1xuXHRBZGQgPSBcImFkZFwiLFxuXHRTdWJ0cmFjdCA9IFwic3VidHJhY3RcIixcblx0UmV2ZXJzZVN1YnRyYWN0ID0gXCJyZXZlcnNlLXN1YnRyYWN0XCIsXG5cdE1pbiA9IFwibWluXCIsXG5cdE1heCA9IFwibWF4XCJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gU3RlbmNpbE9wZXJhdGlvbiB7XG5cdEtlZXAgPSBcImtlZXBcIixcblx0WmVybyA9IFwiemVyb1wiLFxuXHRSZXBsYWNlID0gXCJyZXBsYWNlXCIsXG5cdEludmVydCA9IFwiaW52ZXJ0XCIsXG5cdEluY3JlbWVudENsYW1wID0gXCJpbmNyZW1lbnQtY2xhbXBcIixcblx0RGVjcmVtZW50Q2xhbXAgPSBcImRlY3JlbWVudC1jbGFtcFwiLFxuXHRJbmNyZW1lbnRXcmFwID0gXCJpbmNyZW1lbnQtd3JhcFwiLFxuXHREZWNyZW1lbnRXcmFwID0gXCJkZWNyZW1lbnQtd3JhcFwiXG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBlbnVtIEluZGV4Rm9ybWF0IHtcblx0VWludDE2ID0gXCJ1aW50MTZcIixcblx0VWludDMyID0gXCJ1aW50MzJcIlxufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgZW51bSBWZXJ0ZXhGb3JtYXQge1xuXHRVaW50OHgyID0gXCJ1aW50OHgyXCIsXG5cdFVpbnQ4eDQgPSBcInVpbnQ4eDRcIixcblx0U2ludDh4MiA9IFwic2ludDh4MlwiLFxuXHRTaW50OHg0ID0gXCJzaW50OHg0XCIsXG5cdFVub3JtOHgyID0gXCJ1bm9ybTh4MlwiLFxuXHRVbm9ybTh4NCA9IFwidW5vcm04eDRcIixcblx0U25vcm04eDIgPSBcInNub3JtOHgyXCIsXG5cdFNub3JtOHg0ID0gXCJzbm9ybTh4NFwiLFxuXHRVaW50MTZ4MiA9IFwidWludDE2eDJcIixcblx0VWludDE2eDQgPSBcInVpbnQxNng0XCIsXG5cdFNpbnQxNngyID0gXCJzaW50MTZ4MlwiLFxuXHRTaW50MTZ4NCA9IFwic2ludDE2eDRcIixcblx0VW5vcm0xNngyID0gXCJ1bm9ybTE2eDJcIixcblx0VW5vcm0xNng0ID0gXCJ1bm9ybTE2eDRcIixcblx0U25vcm0xNngyID0gXCJzbm9ybTE2eDJcIixcblx0U25vcm0xNng0ID0gXCJzbm9ybTE2eDRcIixcblx0RmxvYXQxNngyID0gXCJmbG9hdDE2eDJcIixcblx0RmxvYXQxNng0ID0gXCJmbG9hdDE2eDRcIixcblx0RmxvYXQzMiA9IFwiZmxvYXQzMlwiLFxuXHRGbG9hdDMyeDIgPSBcImZsb2F0MzJ4MlwiLFxuXHRGbG9hdDMyeDMgPSBcImZsb2F0MzJ4M1wiLFxuXHRGbG9hdDMyeDQgPSBcImZsb2F0MzJ4NFwiLFxuXHRVaW50MzIgPSBcInVpbnQzMlwiLFxuXHRVaW50MzJ4MiA9IFwidWludDMyeDJcIixcblx0VWludDMyeDMgPSBcInVpbnQzMngzXCIsXG5cdFVpbnQzMng0ID0gXCJ1aW50MzJ4NFwiLFxuXHRTaW50MzIgPSBcInNpbnQzMlwiLFxuXHRTaW50MzJ4MiA9IFwic2ludDMyeDJcIixcblx0U2ludDMyeDMgPSBcInNpbnQzMngzXCIsXG5cdFNpbnQzMng0ID0gXCJzaW50MzJ4NFwiXG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBlbnVtIElucHV0U3RlcE1vZGUge1xuXHRWZXJ0ZXggPSBcInZlcnRleFwiLFxuXHRJbnN0YW5jZSA9IFwiaW5zdGFuY2VcIlxufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgZW51bSBDb21wdXRlUGFzc1RpbWVzdGFtcExvY2F0aW9uIHtcblx0QmVnaW5uaW5nID0gXCJiZWdpbm5pbmdcIixcblx0RW5kID0gXCJlbmRcIlxufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgZW51bSBSZW5kZXJQYXNzVGltZXN0YW1wTG9jYXRpb24ge1xuXHRCZWdpbm5pbmcgPSBcImJlZ2lubmluZ1wiLFxuXHRFbmQgPSBcImVuZFwiXG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBlbnVtIExvYWRPcCB7XG5cdExvYWQgPSBcImxvYWRcIixcblx0Q2xlYXIgPSBcImNsZWFyXCJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gU3RvcmVPcCB7XG5cdFN0b3JlID0gXCJzdG9yZVwiLFxuXHREaXNjYXJkID0gXCJkaXNjYXJkXCJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gUXVlcnlUeXBlIHtcblx0T2NjbHVzaW9uID0gXCJvY2NsdXNpb25cIixcblx0VGltZXN0YW1wID0gXCJ0aW1lc3RhbXBcIlxufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgZW51bSBDYW52YXNBbHBoYU1vZGUge1xuXHRPcGFxdWUgPSBcIm9wYXF1ZVwiLFxuXHRQcmVtdWx0aXBsaWVkID0gXCJwcmVtdWx0aXBsaWVkXCJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gRGV2aWNlTG9zdFJlYXNvbiB7XG5cdERlc3Ryb3llZCA9IFwiZGVzdHJveWVkXCJcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGVudW0gRXJyb3JGaWx0ZXIge1xuXHRPdXRPZk1lbW9yeSA9IFwib3V0LW9mLW1lbW9yeVwiLFxuXHRWYWxpZGF0aW9uID0gXCJ2YWxpZGF0aW9uXCJcbn1cblxuZXhwb3J0IGVudW0gR1BVQ29sb3JXcml0ZSB7XG5cdFJlZCA9IDB4MSxcblx0R3JlZW4gPSAweDIsXG5cdEJsdWUgPSAweDQsXG5cdEFscGhhID0gMHg4LFxuXHRBbGwgPSAweGZcbn1cbmV4cG9ydCBlbnVtIENvbW1hbmRTdWJUeXBlIHtcblx0U2hhZG93ID0gXCJzaGFkb3dcIixcblx0UGljayA9IFwicGlja1wiXG59XG5leHBvcnQgZW51bSBJbnRlcnNlY3Qge1xuXHRPVVRTSURFID0gLTEsXG5cdElOVEVSU0VDVElORyA9IDAsXG5cdElOU0lERSA9IDFcbn1cbiIsImltcG9ydCB7IEJ1ZmZlclVzYWdlIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVQ29uc3RhbnRcIjtcclxuY2xhc3MgQnVmZmVyIHtcclxuXHRwdWJsaWMgZ3B1QnVmZmVyOiBHUFVCdWZmZXI7XHJcblx0ZGV2aWNlOiBHUFVEZXZpY2U7XHJcblx0dXNhZ2U6IG51bWJlcjtcclxuXHRkYXRhOiBBcnJheUJ1ZmZlclZpZXc7XHJcblx0c2l6ZTogbnVtYmVyO1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0bGFiZWw6IHN0cmluZyxcclxuXHRcdGRldmljZTogR1BVRGV2aWNlLFxyXG5cdFx0dXNhZ2U6IEdQVUJ1ZmZlclVzYWdlRmxhZ3MsXHJcblx0XHRkYXRhOiBBcnJheUJ1ZmZlclZpZXcgfCBudWxsLFxyXG5cdFx0c2l6ZT86IG51bWJlclxyXG5cdCkge1xyXG5cdFx0dGhpcy5kZXZpY2UgPSBkZXZpY2U7XHJcblx0XHR0aGlzLnVzYWdlID0gdXNhZ2U7XHJcblx0XHR0aGlzLmRhdGEgPSBkYXRhO1xyXG5cdFx0dGhpcy5zaXplID0gc2l6ZSAhPSB1bmRlZmluZWQgPyAoc2l6ZSArIDMpICYgfjMgOiAoZGF0YS5ieXRlTGVuZ3RoICsgMykgJiB+MzsgLy8gNCBieXRlcyBhbGlnbm1lbnRzIChiZWNhdXNlIG9mIHRoZSB1cGxvYWQgd2hpY2ggcmVxdWlyZXMgdGhpcylcclxuXHRcdHRoaXMuZ3B1QnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XHJcblx0XHRcdGxhYmVsOiBsYWJlbCB8fCBcIlwiLFxyXG5cdFx0XHRzaXplOiB0aGlzLnNpemUsXHJcblx0XHRcdHVzYWdlXHJcblx0XHR9KTtcclxuXHRcdGlmIChkYXRhKSB0aGlzLnNldFN1YkRhdGEoMCwgZGF0YSwgdGhpcy5zaXplKTtcclxuXHR9XHJcblx0c3RhdGljIGNyZWF0ZShcclxuXHRcdGxhYmVsOiBzdHJpbmcsXHJcblx0XHRkZXZpY2U6IEdQVURldmljZSxcclxuXHRcdHVzYWdlOiBHUFVCdWZmZXJVc2FnZUZsYWdzLFxyXG5cdFx0ZGF0YTogQXJyYXlCdWZmZXJWaWV3IHwgbnVsbCxcclxuXHRcdHNpemU/OiBudW1iZXJcclxuXHQpIHtcclxuXHRcdHJldHVybiBuZXcgQnVmZmVyKGxhYmVsLCBkZXZpY2UsIHVzYWdlLCBkYXRhLCBzaXplKTtcclxuXHR9XHJcblx0c3RhdGljIGNyZWF0ZVZlcnRleEJ1ZmZlcihsYWJlbDogc3RyaW5nLCBkZXZpY2U6IEdQVURldmljZSwgZGF0YTogQXJyYXlCdWZmZXJWaWV3KTogQnVmZmVyIHtcclxuXHRcdHJldHVybiBuZXcgQnVmZmVyKGxhYmVsLCBkZXZpY2UsIEJ1ZmZlclVzYWdlLlZlcnRleCB8IEJ1ZmZlclVzYWdlLkNvcHlEc3QsIGRhdGEsIGRhdGEuYnl0ZUxlbmd0aCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgY3JlYXRlSW5kZXhCdWZmZXIobGFiZWw6IHN0cmluZywgZGV2aWNlOiBHUFVEZXZpY2UsIGRhdGE6IEFycmF5QnVmZmVyVmlldyk6IEJ1ZmZlciB7XHJcblx0XHRyZXR1cm4gbmV3IEJ1ZmZlcihsYWJlbCwgZGV2aWNlLCBCdWZmZXJVc2FnZS5JbmRleCB8IEJ1ZmZlclVzYWdlLkNvcHlEc3QsIGRhdGEpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGNyZWF0ZVVuaWZvcm1CdWZmZXIobGFiZWw6IHN0cmluZywgZGV2aWNlOiBHUFVEZXZpY2UsIHNpemU6IG51bWJlciwgdXNhZ2U/OiBCdWZmZXJVc2FnZSk6IEJ1ZmZlciB7XHJcblx0XHRyZXR1cm4gbmV3IEJ1ZmZlcihsYWJlbCwgZGV2aWNlLCB1c2FnZSwgbnVsbCwgc2l6ZSk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgY3JlYXRlU3RvcmFnZUJ1ZmZlcihsYWJlbDogc3RyaW5nLCBkZXZpY2U6IEdQVURldmljZSwgc2l6ZTogbnVtYmVyLCB1c2FnZSA9IEJ1ZmZlclVzYWdlLlN0b3JhZ2UpOiBCdWZmZXIge1xyXG5cdFx0cmV0dXJuIG5ldyBCdWZmZXIobGFiZWwsIGRldmljZSwgdXNhZ2UsIG51bGwsIHNpemUpO1xyXG5cdH1cclxuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vZ3B1d2ViL2dwdXdlYi9ibG9iL21haW4vZGVzaWduL0J1ZmZlck9wZXJhdGlvbnMubWRcclxuXHRwdWJsaWMgc2V0U3ViRGF0YShvZmZzZXQ6IG51bWJlciwgZGF0YTogQXJyYXlCdWZmZXJWaWV3LCBzaXplPzogbnVtYmVyKTogdm9pZCB7XHJcblx0XHRjb25zdCBzcmNBcnJheUJ1ZmZlciA9IGRhdGEuYnVmZmVyO1xyXG5cdFx0Y29uc3QgYnl0ZUNvdW50ID0gc2l6ZSA/PyBzcmNBcnJheUJ1ZmZlci5ieXRlTGVuZ3RoO1xyXG5cdFx0Y29uc3Qgc3JjQnVmZmVyID0gdGhpcy5kZXZpY2UuY3JlYXRlQnVmZmVyKHtcclxuXHRcdFx0bWFwcGVkQXRDcmVhdGlvbjogdHJ1ZSxcclxuXHRcdFx0c2l6ZTogYnl0ZUNvdW50LFxyXG5cdFx0XHR1c2FnZTogR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkNcclxuXHRcdH0pO1xyXG5cdFx0Y29uc3QgYXJyYXlCdWZmZXIgPSBzcmNCdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKTtcclxuXHJcblx0XHRuZXcgVWludDE2QXJyYXkoYXJyYXlCdWZmZXIpLnNldChuZXcgVWludDE2QXJyYXkoc3JjQXJyYXlCdWZmZXIpKTsgLy8gbWVtY3B5XHJcblx0XHRzcmNCdWZmZXIudW5tYXAoKTtcclxuXHJcblx0XHR0aGlzLmNvcHlUb0J1ZmZlcihzcmNCdWZmZXIsIG9mZnNldCwgYnl0ZUNvdW50KTtcclxuXHJcblx0XHRzcmNCdWZmZXIuZGVzdHJveSgpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGNvcHlUb0J1ZmZlcihzcmNCdWZmZXI6IEdQVUJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGJ5dGVDb3VudDogbnVtYmVyKTogdm9pZCB7XHJcblx0XHRjb25zdCBjb21tYW5kRW5jb2RlciA9IHRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCk7XHJcblx0XHRjb21tYW5kRW5jb2Rlci5jb3B5QnVmZmVyVG9CdWZmZXIoc3JjQnVmZmVyLCAwLCB0aGlzLmdwdUJ1ZmZlciwgb2Zmc2V0LCBieXRlQ291bnQpO1xyXG5cdFx0dGhpcy5kZXZpY2UucXVldWUuc3VibWl0KFtjb21tYW5kRW5jb2Rlci5maW5pc2goKV0pO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGNvcHlUb1RleHR1cmUoXHJcblx0XHRieXRlc1BlclJvdzogbnVtYmVyLFxyXG5cdFx0cm93c1BlckltYWdlOiBudW1iZXIsXHJcblx0XHRkZXN0aW5hdGlvbjogR1BVSW1hZ2VDb3B5VGV4dHVyZSxcclxuXHRcdGV4dGVudDogR1BVRXh0ZW50M0RcclxuXHQpOiB2b2lkIHtcclxuXHRcdGNvbnN0IGNvbW1hbmRFbmNvZGVyID0gdGhpcy5kZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoKTtcclxuXHRcdGNvbW1hbmRFbmNvZGVyLmNvcHlCdWZmZXJUb1RleHR1cmUoXHJcblx0XHRcdHtcclxuXHRcdFx0XHRidWZmZXI6IHRoaXMuZ3B1QnVmZmVyLFxyXG5cdFx0XHRcdGJ5dGVzUGVyUm93LFxyXG5cdFx0XHRcdHJvd3NQZXJJbWFnZVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRkZXN0aW5hdGlvbixcclxuXHRcdFx0ZXh0ZW50XHJcblx0XHQpO1xyXG5cdFx0dGhpcy5kZXZpY2UucXVldWUuc3VibWl0KFtjb21tYW5kRW5jb2Rlci5maW5pc2goKV0pO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHR0aGlzLmdwdUJ1ZmZlci5kZXN0cm95KCk7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCdWZmZXI7XHJcbiIsImltcG9ydCBCaW5kR3JvdXBMYXlvdXQgZnJvbSBcIi4vQmluZEdyb3VwTGF5b3V0XCI7XHJcblxyXG5jb25zdCBwaXBlbGluZUxheW91dENhY2hlID0gbmV3IE1hcCgpO1xyXG5leHBvcnQgY2xhc3MgUGlwZWxpbmVMYXlvdXQge1xyXG4gIHB1YmxpYyBncHVQaXBlbGluZUxheW91dDogR1BVUGlwZWxpbmVMYXlvdXQ7XHJcbiAgaW5kZXg6IG51bWJlcjtcclxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxyXG4gICAgZGV2aWNlOiBHUFVEZXZpY2UsXHJcbiAgICBsYWJlbDogc3RyaW5nLFxyXG4gICAgcHVibGljIGdyb3VwTGF5b3V0czogQmluZEdyb3VwTGF5b3V0W10gPSBbXSxcclxuICAgIGluZGV4PzogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICB0aGlzLmluZGV4ID0gaW5kZXggfHwgMDtcclxuICAgIHRoaXMuZ3B1UGlwZWxpbmVMYXlvdXQgPSBkZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQoe1xyXG4gICAgICBsYWJlbDogbGFiZWwsXHJcbiAgICAgIGJpbmRHcm91cExheW91dHM6IGdyb3VwTGF5b3V0cy5tYXAoKGxheW91dCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBsYXlvdXQuZ3B1QmluZEdyb3VwTGF5b3V0O1xyXG4gICAgICB9KSxcclxuICAgIH0pO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0UGlwZWxpbmVMYXlvdXRGcm9tQ2FjaGUoXHJcbiAgICBkZXZpY2U6IEdQVURldmljZSxcclxuICAgIGxhYmVsOiBzdHJpbmcsXHJcbiAgICBncm91cExheW91dHM6IEJpbmRHcm91cExheW91dFtdXHJcbiAgKTogUGlwZWxpbmVMYXlvdXQge1xyXG4gICAgaWYgKHBpcGVsaW5lTGF5b3V0Q2FjaGUuaGFzKGxhYmVsKSkge1xyXG4gICAgICByZXR1cm4gcGlwZWxpbmVMYXlvdXRDYWNoZS5nZXQobGFiZWwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgYmluZEdyb3VwTGF5b3V0ID0gbmV3IFBpcGVsaW5lTGF5b3V0KGRldmljZSwgbGFiZWwsIGdyb3VwTGF5b3V0cyk7XHJcbiAgICAgIHBpcGVsaW5lTGF5b3V0Q2FjaGUuc2V0KGxhYmVsLCBiaW5kR3JvdXBMYXlvdXQpO1xyXG4gICAgICByZXR1cm4gYmluZEdyb3VwTGF5b3V0O1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgQmluZEdyb3VwTGF5b3V0IGZyb20gXCIuL0JpbmRHcm91cExheW91dFwiO1xyXG5pbXBvcnQgeyBDb21wdXRlQ29tbWFuZCB9IGZyb20gXCIuL0NvbXB1dGVDb21tYW5kXCI7XHJcbmltcG9ydCBEcmF3Q29tbWFuZCBmcm9tIFwiLi9EcmF3Q29tbWFuZFwiO1xyXG5pbXBvcnQgeyBQaXBlbGluZUxheW91dCB9IGZyb20gXCIuL1BpcGVsaW5lTGF5b3V0XCI7XHJcbmltcG9ydCB7IFJlbmRlclN0YXRlIH0gZnJvbSBcIi4vUmVuZGVyU3RhdGVcIjtcclxuXHJcbmNvbnN0IHJlbmRlclBpcGVsaW5lcyA9IG5ldyBNYXAoKTtcclxuY29uc3QgY29tcHV0ZVBpcGVsaW5lcyA9IG5ldyBNYXAoKTtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGlwZWxpbmUge1xyXG5cdGdwdVBpcGVsaW5lOiBHUFVSZW5kZXJQaXBlbGluZSB8IEdQVUNvbXB1dGVQaXBlbGluZTtcclxuXHR0eXBlOiBzdHJpbmc7XHJcblx0ZGV2aWNlOiBHUFVEZXZpY2U7XHJcblx0ZGVzY3JpcHRvcjogR1BVUmVuZGVyUGlwZWxpbmVEZXNjcmlwdG9yIHwgR1BVQ29tcHV0ZVBpcGVsaW5lRGVzY3JpcHRvcjtcclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHR5cGU6IHN0cmluZyxcclxuXHRcdGRldmljZTogR1BVRGV2aWNlLFxyXG5cdFx0ZGVzY3JpcHRvcjogR1BVUmVuZGVyUGlwZWxpbmVEZXNjcmlwdG9yIHwgR1BVQ29tcHV0ZVBpcGVsaW5lRGVzY3JpcHRvclxyXG5cdCkge1xyXG5cdFx0dGhpcy50eXBlID0gdHlwZTtcclxuXHRcdHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7XHJcblx0XHR0aGlzLmRldmljZSA9IGRldmljZTtcclxuXHRcdHRoaXMuY3JlYXRlUGlwZWxpbmUoKTtcclxuXHR9XHJcblx0cHJpdmF0ZSBjcmVhdGVQaXBlbGluZSgpIHtcclxuXHRcdGlmICh0aGlzLnR5cGUgPT0gXCJyZW5kZXJcIikge1xyXG5cdFx0XHR0aGlzLmdwdVBpcGVsaW5lID0gdGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUodGhpcy5kZXNjcmlwdG9yIGFzIEdQVVJlbmRlclBpcGVsaW5lRGVzY3JpcHRvcik7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmdwdVBpcGVsaW5lID0gdGhpcy5kZXZpY2UuY3JlYXRlQ29tcHV0ZVBpcGVsaW5lKHRoaXMuZGVzY3JpcHRvciBhcyBHUFVDb21wdXRlUGlwZWxpbmVEZXNjcmlwdG9yKTtcclxuXHRcdH1cclxuXHR9XHJcblx0cHVibGljIGJpbmQocGFzc0VuY29kZXI6IEdQVVJlbmRlclBhc3NFbmNvZGVyIHwgR1BVQ29tcHV0ZVBhc3NFbmNvZGVyKSB7XHJcblx0XHRpZiAodGhpcy50eXBlID09IFwicmVuZGVyXCIpIHtcclxuXHRcdFx0KHBhc3NFbmNvZGVyIGFzIEdQVVJlbmRlclBhc3NFbmNvZGVyKS5zZXRQaXBlbGluZSh0aGlzLmdwdVBpcGVsaW5lIGFzIEdQVVJlbmRlclBpcGVsaW5lKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdChwYXNzRW5jb2RlciBhcyBHUFVDb21wdXRlUGFzc0VuY29kZXIpLnNldFBpcGVsaW5lKHRoaXMuZ3B1UGlwZWxpbmUgYXMgR1BVQ29tcHV0ZVBpcGVsaW5lKTtcclxuXHRcdH1cclxuXHR9XHJcblx0c3RhdGljIGdldFJlbmRlclBpcGVsaW5lRnJvbUNhY2hlKFxyXG5cdFx0ZGV2aWNlOiBHUFVEZXZpY2UsXHJcblx0XHRkcmF3Q29tYW5kOiBEcmF3Q29tbWFuZCxcclxuXHRcdGdyb3VwTGF5b3V0czogQmluZEdyb3VwTGF5b3V0W11cclxuXHQpOiBQaXBlbGluZSB7XHJcblx0XHRjb25zdCB7IHJlbmRlclN0YXRlLCBzaGFkZXJTb3VyY2UgfSA9IGRyYXdDb21hbmQ7XHJcblx0XHRjb25zdCByc1N0ciA9IEpTT04uc3RyaW5naWZ5KHJlbmRlclN0YXRlKTtcclxuXHRcdGNvbnN0IGNvbWJpbmVTdHIgPSBzaGFkZXJTb3VyY2UudWlkLmNvbmNhdChyc1N0cik7XHJcblx0XHRjb25zdCBoYXNoSWQgPSBzdHJpbmdUb0hhc2goY29tYmluZVN0cik7XHJcblx0XHRjb25zdCBjb21iaW5lTGF5b3V0cyA9IGdyb3VwTGF5b3V0c1xyXG5cdFx0XHQ/LmZpbHRlcigobGF5b3V0KSA9PiBsYXlvdXQgIT0gdW5kZWZpbmVkKVxyXG5cdFx0XHQ/LnNvcnQoKGxheW91dDEsIGxheW91dDIpID0+IGxheW91dDEuaW5kZXggLSBsYXlvdXQyLmluZGV4KTtcclxuXHRcdGxldCBwaXBlbGluZSA9IHJlbmRlclBpcGVsaW5lcy5nZXQoaGFzaElkKTtcclxuXHRcdGlmICghcGlwZWxpbmUpIHtcclxuXHRcdFx0Y29uc3QgZGVzY3JpcHRvciA9IFBpcGVsaW5lLmdldFBpcGVsaW5lRGVzY3JpcHRvcihcclxuXHRcdFx0XHRkZXZpY2UsXHJcblx0XHRcdFx0ZHJhd0NvbWFuZCxcclxuXHRcdFx0XHRyZW5kZXJTdGF0ZSxcclxuXHRcdFx0XHRjb21iaW5lTGF5b3V0cyxcclxuXHRcdFx0XHRoYXNoSWQudG9TdHJpbmcoKVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRwaXBlbGluZSA9IG5ldyBQaXBlbGluZShcInJlbmRlclwiLCBkZXZpY2UsIGRlc2NyaXB0b3IpO1xyXG5cdFx0XHRyZW5kZXJQaXBlbGluZXMuc2V0KGhhc2hJZCwgcGlwZWxpbmUpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHBpcGVsaW5lO1xyXG5cdH1cclxuXHRzdGF0aWMgZ2V0Q29tcHV0ZVBpcGVsaW5lRnJvbUNhY2hlKFxyXG5cdFx0ZGV2aWNlOiBHUFVEZXZpY2UsXHJcblx0XHRjb21wdXRlQ29tbWFkOiBDb21wdXRlQ29tbWFuZCxcclxuXHRcdGdyb3VwTGF5b3V0czogQmluZEdyb3VwTGF5b3V0W11cclxuXHQpOiBQaXBlbGluZSB7XHJcblx0XHRjb25zdCB7IHNoYWRlclNvdXJjZSB9ID0gY29tcHV0ZUNvbW1hZDtcclxuXHRcdGNvbnN0IGhhc2hJZCA9IHN0cmluZ1RvSGFzaChzaGFkZXJTb3VyY2UudWlkKTtcclxuXHRcdGxldCBwaXBlbGluZSA9IGNvbXB1dGVQaXBlbGluZXMuZ2V0KGhhc2hJZCk7XHJcblx0XHRpZiAoIXBpcGVsaW5lKSB7XHJcblx0XHRcdHBpcGVsaW5lID0gbmV3IFBpcGVsaW5lKFwiY29tcHV0ZVwiLCBkZXZpY2UsIHtcclxuXHRcdFx0XHRsYXlvdXQ6IFBpcGVsaW5lTGF5b3V0LmdldFBpcGVsaW5lTGF5b3V0RnJvbUNhY2hlKGRldmljZSwgaGFzaElkLnRvU3RyaW5nKCksIGdyb3VwTGF5b3V0cylcclxuXHRcdFx0XHRcdC5ncHVQaXBlbGluZUxheW91dCxcclxuXHRcdFx0XHRjb21wdXRlOiB7XHJcblx0XHRcdFx0XHRtb2R1bGU6IHNoYWRlclNvdXJjZS5nZXRTaGFkZXJNb2R1bGUoZGV2aWNlKS5jb21wdXRlLFxyXG5cdFx0XHRcdFx0ZW50cnlQb2ludDogc2hhZGVyU291cmNlPy5jb21wdXRlPy5jb21wdXRlTWFpbiB8fCBcIm1haW5cIlxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHRcdGNvbXB1dGVQaXBlbGluZXMuc2V0KGhhc2hJZCwgcGlwZWxpbmUpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHBpcGVsaW5lO1xyXG5cdH1cclxuXHRwcml2YXRlIHN0YXRpYyBnZXRQaXBlbGluZURlc2NyaXB0b3IoXHJcblx0XHRkZXZpY2U6IEdQVURldmljZSxcclxuXHRcdGRyYXdDb21hbmQ6IERyYXdDb21tYW5kLFxyXG5cdFx0cmVuZGVyU3RhdGU6IFJlbmRlclN0YXRlLFxyXG5cdFx0Z3JvdXBMYXlvdXRzOiBCaW5kR3JvdXBMYXlvdXRbXSxcclxuXHRcdGhhc2hJZDogc3RyaW5nXHJcblx0KTogR1BVUmVuZGVyUGlwZWxpbmVEZXNjcmlwdG9yIHtcclxuXHRcdGNvbnN0IHsgdmVydGV4QnVmZmVycywgc2hhZGVyU291cmNlIH0gPSBkcmF3Q29tYW5kO1xyXG5cdFx0Y29uc3QgeyB2ZXJ0LCBmcmFnIH0gPSBzaGFkZXJTb3VyY2UuZ2V0U2hhZGVyTW9kdWxlKGRldmljZSk7XHJcblx0XHRjb25zdCBwaXBlbGluZURlYyA9IHtcclxuXHRcdFx0bGF5b3V0OiBQaXBlbGluZUxheW91dC5nZXRQaXBlbGluZUxheW91dEZyb21DYWNoZShkZXZpY2UsIGhhc2hJZCwgZ3JvdXBMYXlvdXRzKS5ncHVQaXBlbGluZUxheW91dFxyXG5cdFx0fSBhcyBhbnk7XHJcblx0XHRpZiAodmVydClcclxuXHRcdFx0cGlwZWxpbmVEZWMudmVydGV4ID0ge1xyXG5cdFx0XHRcdG1vZHVsZTogdmVydCxcclxuXHRcdFx0XHRlbnRyeVBvaW50OiBzaGFkZXJTb3VyY2U/LnJlbmRlcj8udmVydE1haW4gfHwgXCJtYWluXCIsXHJcblx0XHRcdFx0YnVmZmVyczogdmVydGV4QnVmZmVycy5tYXAoKHZlcnRleEJ1ZmZlcikgPT4gdmVydGV4QnVmZmVyLmdldEJ1ZmZlckRlcygpKVxyXG5cdFx0XHR9O1xyXG5cdFx0aWYgKHJlbmRlclN0YXRlLnByaW1pdGl2ZSkgcGlwZWxpbmVEZWMucHJpbWl0aXZlID0gcmVuZGVyU3RhdGUucHJpbWl0aXZlLmdldEdQVVByaW1pdGl2ZURlYygpO1xyXG5cdFx0aWYgKHJlbmRlclN0YXRlLmRlcHRoU3RlbmNpbCkgcGlwZWxpbmVEZWMuZGVwdGhTdGVuY2lsID0gcmVuZGVyU3RhdGUuZGVwdGhTdGVuY2lsLmdldEdQVURlcHRoU3RlbmNpbERlYygpO1xyXG5cdFx0aWYgKHJlbmRlclN0YXRlLm11bHRpc2FtcGxlKSBwaXBlbGluZURlYy5tdWx0aXNhbXBsZSA9IHJlbmRlclN0YXRlLm11bHRpc2FtcGxlLmdldE11bHRpU2FtcGxlRGVjKCk7XHJcblx0XHRpZiAoZnJhZylcclxuXHRcdFx0cGlwZWxpbmVEZWMuZnJhZ21lbnQgPSB7XHJcblx0XHRcdFx0bW9kdWxlOiBmcmFnLFxyXG5cdFx0XHRcdGVudHJ5UG9pbnQ6IHNoYWRlclNvdXJjZT8ucmVuZGVyPy5mcmFnTWFpbiB8fCBcIm1haW5cIixcclxuXHRcdFx0XHR0YXJnZXRzOiByZW5kZXJTdGF0ZS50YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XHJcblx0XHRcdFx0XHRyZXR1cm4gdGFyZ2V0LmdldEdQVVRhcmdldERlYygpO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdH07XHJcblx0XHRyZXR1cm4gcGlwZWxpbmVEZWM7XHJcblx0fVxyXG59XHJcbi8vIEJvcnJvd2VkIGZyb20gaHR0cHM6Ly93ZXJ4bHRkLmNvbS93cC8yMDEwLzA1LzEzL2phdmFzY3JpcHQtaW1wbGVtZW50YXRpb24tb2YtamF2YXMtc3RyaW5nLWhhc2hjb2RlLW1ldGhvZC9cclxuZnVuY3Rpb24gc3RyaW5nVG9IYXNoKHN0cikge1xyXG5cdGxldCBoYXNoID0gMDtcclxuXHRpZiAoc3RyLmxlbmd0aCA9PSAwKSByZXR1cm4gaGFzaDtcclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xyXG5cdFx0Y29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xyXG5cdFx0aGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIGNoYXI7XHJcblx0XHRoYXNoID0gaGFzaCAmIGhhc2g7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxyXG5cdH1cclxuXHRyZXR1cm4gaGFzaDtcclxufVxyXG4iLCJpbXBvcnQgQ2FtZXJhIGZyb20gXCIuLi9jYW1lcmEvQ2FtZXJhXCI7XHJcbmltcG9ydCB7IERyYXdDb21tYW5kUGFyYW1zIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVVHlwZXNcIjtcclxuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tIFwiLi4vbWF0ZXJpYWwvTWF0ZXJpYWxcIjtcclxuaW1wb3J0IHsgU2hhZGVyU291cmNlIH0gZnJvbSBcIi4uL3NoYWRlci9TaGFkZXJTb3VyY2VcIjtcclxuaW1wb3J0IEJ1ZmZlciBmcm9tIFwiLi9CdWZmZXJcIjtcclxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCIuL0NvbW1hbmRcIjtcclxuaW1wb3J0IENvbnRleHQgZnJvbSBcIi4vQ29udGV4dFwiO1xyXG5pbXBvcnQgSW5kZXhCdWZmZXIgZnJvbSBcIi4vSW5kZXhCdWZmZXJcIjtcclxuaW1wb3J0IFBpcGVsaW5lIGZyb20gXCIuL1BpcGVsaW5lXCI7XHJcbmltcG9ydCBRdWVyeVNldCBmcm9tIFwiLi9RdWVyeVNldFwiO1xyXG5pbXBvcnQgeyBSZW5kZXJTdGF0ZSwgU2Npc3NvclRlc3QsIFZpZXdQb3J0IH0gZnJvbSBcIi4vUmVuZGVyU3RhdGVcIjtcclxuaW1wb3J0IFJlbmRlclRhcmdldCBmcm9tIFwiLi9SZW5kZXJUYXJnZXRcIjtcclxuaW1wb3J0IFNoYWRlckRhdGEgZnJvbSBcIi4vU2hhZGVyRGF0YVwiO1xyXG5pbXBvcnQgVmVydGV4QnVmZmVyIGZyb20gXCIuL1ZlcnRleEJ1ZmZlclwiO1xyXG5cclxuY2xhc3MgRHJhd0NvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHtcclxuXHRwdWJsaWMgc2hhZGVyRGF0YT86IFNoYWRlckRhdGE7XHJcblxyXG5cdHB1YmxpYyByZW5kZXJUYXJnZXQ/OiBSZW5kZXJUYXJnZXQ7XHJcblxyXG5cdHB1YmxpYyB2ZXJ0ZXhCdWZmZXJzPzogQXJyYXk8VmVydGV4QnVmZmVyPjtcclxuXHJcblx0cHVibGljIGluZGV4QnVmZmVyPzogSW5kZXhCdWZmZXI7XHJcblxyXG5cdHB1YmxpYyByZW5kZXJTdGF0ZT86IFJlbmRlclN0YXRlO1xyXG5cclxuXHRwdWJsaWMgcXVlcnlJbmRleD86IG51bWJlcjtcclxuXHJcblx0cHVibGljIGNvdW50PzogbnVtYmVyO1xyXG5cclxuXHRwdWJsaWMgaW5zdGFuY2VzPzogbnVtYmVyO1xyXG5cclxuXHRwdWJsaWMgc2hhZGVyU291cmNlPzogU2hhZGVyU291cmNlO1xyXG5cclxuXHRwdWJsaWMgZGlydHk/OiBib29sZWFuO1xyXG5cclxuXHRwdWJsaWMgaW5kaXJlY3RCdWZmZXI/OiBCdWZmZXI7XHJcblxyXG5cdHB1YmxpYyBpbmRpcmVjdE9mZnNldD86IG51bWJlcjtcclxuXHJcblx0cHVibGljIGxpZ2h0U2hhZGVyRGF0YT86IFNoYWRlckRhdGE7XHJcblxyXG5cdHB1YmxpYyB1c2VMaWdodD86IGJvb2xlYW47XHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnM6IERyYXdDb21tYW5kUGFyYW1zKSB7XHJcblx0XHR0aGlzLnNoYWRlckRhdGEgPSBvcHRpb25zLnNoYWRlckRhdGE7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXQgPSBvcHRpb25zLnJlbmRlclRhcmdldDtcclxuXHJcblx0XHR0aGlzLnVzZUxpZ2h0ID0gb3B0aW9ucy51c2VMaWdodDtcclxuXHJcblx0XHR0aGlzLnZlcnRleEJ1ZmZlcnMgPSBvcHRpb25zLnZlcnRleEJ1ZmZlcnM7XHJcblxyXG5cdFx0dGhpcy5pbmRleEJ1ZmZlciA9IG9wdGlvbnMuaW5kZXhCdWZmZXI7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJTdGF0ZSA9IG9wdGlvbnMucmVuZGVyU3RhdGU7XHJcblxyXG5cdFx0dGhpcy5xdWVyeUluZGV4ID0gb3B0aW9ucy5xdWVyeUluZGV4O1xyXG5cclxuXHRcdHRoaXMuY291bnQgPSBvcHRpb25zLmNvdW50O1xyXG5cclxuXHRcdHRoaXMuaW5zdGFuY2VzID0gb3B0aW9ucy5pbnN0YW5jZXM7XHJcblxyXG5cdFx0dGhpcy5zaGFkZXJTb3VyY2UgPSBvcHRpb25zLnNoYWRlclNvdXJjZTtcclxuXHJcblx0XHR0aGlzLmRpcnR5ID0gb3B0aW9ucy5kaXJ0eTtcclxuXHJcblx0XHR0aGlzLmxpZ2h0U2hhZGVyRGF0YSA9IG9wdGlvbnMubGlnaHRTaGFkZXJEYXRhO1xyXG5cdH1cclxuXHRwdWJsaWMgc2hhbGxvd0Nsb25lKG1hdGVyaWFsPzogTWF0ZXJpYWwpIHtcclxuXHRcdGlmICghbWF0ZXJpYWwpIHJldHVybjtcclxuXHRcdHJldHVybiBuZXcgRHJhd0NvbW1hbmQoe1xyXG5cdFx0XHR2ZXJ0ZXhCdWZmZXJzOiB0aGlzLnZlcnRleEJ1ZmZlcnMsXHJcblx0XHRcdGluZGV4QnVmZmVyOiB0aGlzLmluZGV4QnVmZmVyLFxyXG5cdFx0XHRzaGFkZXJEYXRhOiBtYXRlcmlhbC5zaGFkZXJEYXRhLFxyXG5cdFx0XHRpbnN0YW5jZXM6IHRoaXMuaW5zdGFuY2VzLFxyXG5cdFx0XHRjb3VudDogdGhpcy5jb3VudCxcclxuXHRcdFx0cmVuZGVyU3RhdGU6IG1hdGVyaWFsLnJlbmRlclN0YXRlLFxyXG5cdFx0XHRzaGFkZXJTb3VyY2U6IG1hdGVyaWFsLnNoYWRlclNvdXJjZSxcclxuXHRcdFx0bGlnaHRTaGFkZXJEYXRhOiBtYXRlcmlhbC5saWdodCA/IHRoaXMubGlnaHRTaGFkZXJEYXRhIDogdW5kZWZpbmVkLFxyXG5cdFx0XHR1c2VMaWdodDogbWF0ZXJpYWwubGlnaHRcclxuXHRcdH0pO1xyXG5cdH1cclxuXHRwdWJsaWMgcmVuZGVyKHBhcmFtcz86IFJlbmRlclBhcmFtcyk6IHZvaWQge1xyXG5cdFx0Y29uc3QgeyBkZXZpY2UsIHBhc3NFbmNvZGVyLCBjYW1lcmEsIHF1ZXJ5U2V0LCB2aWV3UG9ydCwgc2Npc3NvclRlc3QgfSA9IHBhcmFtcyB8fCB7fTtcclxuXHRcdGNvbnN0IHtcclxuXHRcdFx0c2hhZGVyRGF0YSxcclxuXHRcdFx0cmVuZGVyU3RhdGUsXHJcblx0XHRcdHZlcnRleEJ1ZmZlcnMsXHJcblx0XHRcdGluZGV4QnVmZmVyLFxyXG5cdFx0XHRsaWdodFNoYWRlckRhdGEsXHJcblx0XHRcdHNoYWRlclNvdXJjZSxcclxuXHRcdFx0Y291bnQsXHJcblx0XHRcdGluc3RhbmNlcyxcclxuXHRcdFx0cmVuZGVyVGFyZ2V0LFxyXG5cdFx0XHR1c2VMaWdodCxcclxuXHRcdFx0aW5kaXJlY3RPZmZzZXQsXHJcblx0XHRcdGluZGlyZWN0QnVmZmVyLFxyXG5cdFx0XHRxdWVyeUluZGV4XHJcblx0XHR9ID0gdGhpcztcclxuXHRcdGNvbnN0IGN1cnJlbnRQYXNzRW5jb2RlciA9IHJlbmRlclRhcmdldD8uYmVnaW5SZW5kZXJQYXNzPy4oZGV2aWNlKSA/PyBwYXNzRW5jb2RlcjtcclxuXHRcdGNvbnN0IGRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCBsaWdodFNoYWRlckRhdGE/LmRlZmluZXMgPz8ge30sIGNhbWVyYT8uc2hhZGVyRGF0YT8uZGVmaW5lcyA/PyB7fSk7XHJcblxyXG5cdFx0c2hhZGVyRGF0YT8uYmluZD8uKGRldmljZSwgY3VycmVudFBhc3NFbmNvZGVyKTtcclxuXHJcblx0XHRjYW1lcmE/LnNoYWRlckRhdGE/LmJpbmQoZGV2aWNlLCBjdXJyZW50UGFzc0VuY29kZXIpO1xyXG5cclxuXHRcdHVzZUxpZ2h0ICYmIGxpZ2h0U2hhZGVyRGF0YT8uYmluZD8uKGRldmljZSwgY3VycmVudFBhc3NFbmNvZGVyKTtcclxuXHJcblx0XHRyZW5kZXJTdGF0ZT8uYmluZD8uKHtcclxuXHRcdFx0cGFzc0VuY29kZXI6IGN1cnJlbnRQYXNzRW5jb2RlcixcclxuXHRcdFx0dmlld1BvcnQ6IHZpZXdQb3J0IGFzIFZpZXdQb3J0LFxyXG5cdFx0XHRzY2lzc29yVGVzdDogPFNjaXNzb3JUZXN0PnNjaXNzb3JUZXN0XHJcblx0XHR9KTtcclxuXHJcblx0XHR2ZXJ0ZXhCdWZmZXJzPy5mb3JFYWNoPy4oKHZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyKSA9PiB2ZXJ0ZXhCdWZmZXI/LmJpbmQ/LihkZXZpY2UsIGN1cnJlbnRQYXNzRW5jb2RlcikpO1xyXG5cclxuXHRcdGluZGV4QnVmZmVyPy5iaW5kPy4oZGV2aWNlLCBjdXJyZW50UGFzc0VuY29kZXIpO1xyXG5cclxuXHRcdHNoYWRlclNvdXJjZT8uc2V0RGVmaW5lcz8uKGRlZmluZXMpO1xyXG5cclxuXHRcdGNvbnN0IHBpcGVsaW5lID0gUGlwZWxpbmUuZ2V0UmVuZGVyUGlwZWxpbmVGcm9tQ2FjaGUoZGV2aWNlLCB0aGlzLCBbXHJcblx0XHRcdHNoYWRlckRhdGE/Lmdyb3VwTGF5b3V0LFxyXG5cdFx0XHRsaWdodFNoYWRlckRhdGE/Lmdyb3VwTGF5b3V0LFxyXG5cdFx0XHRjYW1lcmE/LnNoYWRlckRhdGE/Lmdyb3VwTGF5b3V0XHJcblx0XHRdKTtcclxuXHRcdGlmIChxdWVyeUluZGV4ICE9IHVuZGVmaW5lZCkgcXVlcnlTZXQ/LmJlZ2luUXVlcnkoY3VycmVudFBhc3NFbmNvZGVyLCBxdWVyeUluZGV4KTtcclxuXHRcdHBpcGVsaW5lLmJpbmQoY3VycmVudFBhc3NFbmNvZGVyKTtcclxuXHRcdGlmIChpbmRleEJ1ZmZlcikge1xyXG5cdFx0XHRpZiAoaW5kaXJlY3RCdWZmZXIpIHtcclxuXHRcdFx0XHRjdXJyZW50UGFzc0VuY29kZXIuZHJhd0luZGV4ZWRJbmRpcmVjdChpbmRpcmVjdEJ1ZmZlci5ncHVCdWZmZXIsIGluZGlyZWN0T2Zmc2V0IHx8IDApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGN1cnJlbnRQYXNzRW5jb2Rlci5kcmF3SW5kZXhlZChjb3VudCB8fCAwLCBpbnN0YW5jZXMgfHwgMSwgMCwgMCwgMCk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAoY291bnQpIHtcclxuXHRcdFx0aWYgKGluZGlyZWN0QnVmZmVyKSB7XHJcblx0XHRcdFx0Y3VycmVudFBhc3NFbmNvZGVyLmRyYXdJbmRpcmVjdChpbmRpcmVjdEJ1ZmZlci5ncHVCdWZmZXIsIGluZGlyZWN0T2Zmc2V0KTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRjdXJyZW50UGFzc0VuY29kZXIuZHJhdyhjb3VudCwgaW5zdGFuY2VzIHx8IDEsIDAsIDApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAocXVlcnlJbmRleCAhPSB1bmRlZmluZWQpIHF1ZXJ5U2V0Py5lbmRRdWVyeShjdXJyZW50UGFzc0VuY29kZXIpO1xyXG5cdFx0cmVuZGVyVGFyZ2V0Py5lbmRSZW5kZXJQYXNzPy4oKTtcclxuXHR9XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgRHJhd0NvbW1hbmQ7XHJcbnR5cGUgUmVuZGVyUGFyYW1zID0ge1xyXG5cdGNvbnRleHQ/OiBDb250ZXh0O1xyXG5cdGRldmljZT86IEdQVURldmljZTtcclxuXHRwYXNzRW5jb2Rlcj86IEdQVVJlbmRlclBhc3NFbmNvZGVyO1xyXG5cdGNhbWVyYT86IENhbWVyYTtcclxuXHRxdWVyeVNldD86IFF1ZXJ5U2V0O1xyXG5cdHZpZXdQb3J0PzogVmlld1BvcnQ7XHJcblx0c2Npc3NvclRlc3Q/OiBTY2lzc29yVGVzdDtcclxufTtcclxuIiwiaW1wb3J0IHsgTGlnaHQgfSBmcm9tIFwiLi4vbGlnaHQvTGlnaHRcIjtcbmltcG9ydCB7IE1lc2ggfSBmcm9tIFwiLi4vbWVzaC9NZXNoXCI7XG5pbXBvcnQgUG9zdEVmZmVjdCBmcm9tIFwiLi4vcG9zdC1wcm9jZXNzL1Bvc3RFZmZlY3RcIjtcbmltcG9ydCBCaW5kR3JvdXBFbnRpdHkgZnJvbSBcIi4uL3JlbmRlci9CaW5kR3JvdXBFbnRpdHlcIjtcbmltcG9ydCBCaW5kR3JvdXBMYXlvdXQgZnJvbSBcIi4uL3JlbmRlci9CaW5kR3JvdXBMYXlvdXRcIjtcbmltcG9ydCBCdWZmZXIgZnJvbSBcIi4uL3JlbmRlci9CdWZmZXJcIjtcbmltcG9ydCBJbmRleEJ1ZmZlciBmcm9tIFwiLi4vcmVuZGVyL0luZGV4QnVmZmVyXCI7XG5pbXBvcnQgeyBSZW5kZXJTdGF0ZSB9IGZyb20gXCIuLi9yZW5kZXIvUmVuZGVyU3RhdGVcIjtcbmltcG9ydCBSZW5kZXJUYXJnZXQgZnJvbSBcIi4uL3JlbmRlci9SZW5kZXJUYXJnZXRcIjtcbmltcG9ydCBTYW1wbGVyIGZyb20gXCIuLi9yZW5kZXIvU2FtcGxlclwiO1xuaW1wb3J0IFNoYWRlckRhdGEgZnJvbSBcIi4uL3JlbmRlci9TaGFkZXJEYXRhXCI7XG5pbXBvcnQgVGV4dHVyZSBmcm9tIFwiLi4vcmVuZGVyL1RleHR1cmVcIjtcbmltcG9ydCBWZXJ0ZXhCdWZmZXIgZnJvbSBcIi4uL3JlbmRlci9WZXJ0ZXhCdWZmZXJcIjtcbmltcG9ydCB7IFNoYWRlclNvdXJjZSB9IGZyb20gXCIuLi9zaGFkZXIvU2hhZGVyU291cmNlXCI7XG5pbXBvcnQge1xuXHRCbGVuZEZhY3Rvcixcblx0QmxlbmRPcGVyYXRpb24sXG5cdENvbG9yV3JpdGVGbGFncyxcblx0Q29tcGFyZUZ1bmN0aW9uLFxuXHRDdWxsTW9kZSxcblx0RnJvbnRGYWNlLFxuXHRJbmRleEZvcm1hdCxcblx0SW5wdXRTdGVwTW9kZSxcblx0UHJpbWl0aXZlVG9wb2xvZ3ksXG5cdFNoYWRlclN0YWdlLFxuXHRTdGVuY2lsT3BlcmF0aW9uLFxuXHRTdG9yYWdlVGV4dHVyZUFjY2Vzcyxcblx0VGV4dHVyZUZvcm1hdFxufSBmcm9tIFwiLi9XZWJHUFVDb25zdGFudFwiO1xuZXhwb3J0IGNvbnN0IEdQVUNhbnZhc0NvbXBvc2l0aW5nQWxwaGFNb2RlOiB7XG5cdFtrZXk6IHN0cmluZ106IEdQVUNhbnZhc0NvbXBvc2l0aW5nQWxwaGFNb2RlO1xufSA9IHtcblx0T3BhcXVlOiBcIm9wYXF1ZVwiLFxuXHRQcmVtdWx0aXBsaWVkOiBcInByZW11bHRpcGxpZWRcIlxufTtcbmV4cG9ydCBpbnRlcmZhY2UgQ29udGV4dFN0YXRlIHtcblx0ZGV2aWNlOiBHUFVEZXZpY2U7XG5cdGdsc2xhbmc6IHtcblx0XHRjb21waWxlR0xTTDogKHNvdXJjZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcpID0+IHN0cmluZztcblx0fTtcblx0ZGVidWc6IGJvb2xlYW47XG5cdGVycm9yOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRleHRPcHRpb25zIHtcblx0Y2FudmFzPzogSFRNTENhbnZhc0VsZW1lbnQ7XG5cdGNvbnRhaW5lcj86IEhUTUxEaXZFbGVtZW50O1xuXHRjb250ZXh0PzogR1BVQ2FudmFzQ29udGV4dDtcblx0cGl4ZWxSYXRpbz86IG51bWJlcjtcblx0dXNlR0xTTD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlnaHRNYW5nZXJPcHRpb25zIHtcblx0b3BlblNoYWRvdzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCaW5kR3JvdXBMYXlvdXRFbnRyeSBleHRlbmRzIEdQVUJpbmRHcm91cExheW91dEVudHJ5IHtcblx0bmFtZTogc3RyaW5nO1xuXHR1bmlmb3Jtcz86IGFueVtdO1xuXHRkaW1lbnNpb24/OiBHUFVUZXh0dXJlRGltZW5zaW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRHcm91cE9wdGlvbnMgZXh0ZW5kcyBHUFVCaW5kR3JvdXBEZXNjcmlwdG9yIHtcblx0cmVzb3VyY2VzOiBHUFVCaW5kaW5nUmVzb3VyY2VbXTtcbn1cblxuZXhwb3J0IHR5cGUgU2hhZGVyU3RhZ2VOYW1lID0gXCJ2ZXJ0ZXhcIiB8IFwiZnJhZ21lbnRcIiB8IFwiY29tcHV0ZVwiO1xuXG5leHBvcnQgdHlwZSBTaGFkZXJTdGFnZU5hbWVPYmplY3RLZXlzID0ge1xuXHRba2V5IGluIFNoYWRlclN0YWdlTmFtZV0/OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgU2hhZGVyU3RhZ2VCb2R5TmFtZSA9IFwidmVydGV4Qm9keVwiIHwgXCJmcmFnbWVudEJvZHlcIiB8IFwiY29tcHV0ZUJvZHlcIjtcbmV4cG9ydCB0eXBlIFNoYWRlclN0YWdlQm9keU5hbWVPYmplY3RLZXlzID0ge1xuXHRba2V5IGluIFNoYWRlclN0YWdlQm9keU5hbWVdPzogc3RyaW5nO1xufTtcbmV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudE9wdGlvbnMge1xuXHRvcD86IEdQVVN0b3JlT3A7XG5cdHRleHR1cmU/OiBUZXh0dXJlO1xuXHRyZXNvbHZlVGFyZ2V0PzogVGV4dHVyZTtcblx0c3RvcmVPcD86IEdQVVN0b3JlT3A7XG5cdHRleHR1cmVWaWV3PzogKCkgPT4gR1BVVGV4dHVyZVZpZXc7XG59XG5cbmV4cG9ydCB0eXBlIFBhc3NUeXBlID0gXCJyZW5kZXJcIiB8IFwiY29tcHV0ZVwiO1xuXG5leHBvcnQgdHlwZSBHUFVCaW5kaW5nVHlwZSA9XG5cdHwgR1BVQnVmZmVyQmluZGluZ1R5cGVcblx0fCBHUFVTYW1wbGVyQmluZGluZ1R5cGVcblx0fCBHUFVUZXh0dXJlU2FtcGxlVHlwZVxuXHR8IEdQVVN0b3JhZ2VUZXh0dXJlQWNjZXNzO1xuXG5leHBvcnQgdHlwZSBCaW5kR3JvdXBMYXlvdXRFbnRyeVR5cGUgPSB7XG5cdGJpbmRpbmc6IG51bWJlcjtcblx0dmlzaWJpbGl0eTogR1BVU2hhZGVyU3RhZ2VGbGFncztcblx0dW5pZm9ybXM/OiBhbnlbXTtcblx0YnVmZmVyPzogR1BVQnVmZmVyQmluZGluZ0xheW91dDtcblx0c2FtcGxlcj86IEdQVVNhbXBsZXJCaW5kaW5nTGF5b3V0O1xuXHR0ZXh0dXJlPzogR1BVVGV4dHVyZUJpbmRpbmdMYXlvdXQ7XG5cdHN0b3JhZ2VUZXh0dXJlPzogR1BVU3RvcmFnZVRleHR1cmVCaW5kaW5nTGF5b3V0O1xuXHRleHRlcm5hbFRleHR1cmU/OiBHUFVFeHRlcm5hbFRleHR1cmVCaW5kaW5nTGF5b3V0O1xufTtcbmV4cG9ydCB0eXBlIEJ1ZmZlclJlc291cmNlVHlwZSA9IHtcblx0YnVmZmVyOiBHUFVCdWZmZXJCaW5kaW5nVHlwZTtcblx0b2Zmc2V0OiBudW1iZXI7XG5cdHNpemU6IG51bWJlcjtcbn07XG5leHBvcnQgdHlwZSBzYW1wbGVyQmluZEVudGl0eVJlc291cmNlVHlwZSA9IHtcblx0cmVzb3VyY2U6IEdQVVNhbXBsZXI7XG59O1xuZXhwb3J0IHR5cGUgdGV4dHVyZUJpbmRFbnRpdHlSZXNvdXJjZVR5cGUgPSB7XG5cdHJlc291cmNlOiBHUFVUZXh0dXJlVmlldztcbn07XG5leHBvcnQgdHlwZSBCaW5kR3JvdXBFbnRpdHlSZXNvdXJjZVR5cGUgPVxuXHR8IEJ1ZmZlclJlc291cmNlVHlwZVxuXHR8IHNhbXBsZXJCaW5kRW50aXR5UmVzb3VyY2VUeXBlXG5cdHwgdGV4dHVyZUJpbmRFbnRpdHlSZXNvdXJjZVR5cGU7XG5leHBvcnQgdHlwZSBCaW5kR3JvdXBFbnRpdHlPcHRpb25zID0ge1xuXHRiaW5kaW5nOiBudW1iZXI7XG5cdHJlc291cmNlOiBHUFVCaW5kaW5nUmVzb3VyY2U7XG59O1xuZXhwb3J0IHR5cGUgQmluZEdyb3VwQ2FjaGVPcHRpb25zID0ge1xuXHRkZXZpY2U6IEdQVURldmljZTtcblx0bGFiZWw6IHN0cmluZztcblx0bGF5b3V0OiBCaW5kR3JvdXBMYXlvdXQ7XG5cdGVudGlyZXM6IEJpbmRHcm91cEVudGl0eVtdO1xuXHRpbmRleD86IG51bWJlcjtcblx0b2Zmc2V0PzogbnVtYmVyO1xuXHRhbGlnbmVkU2l6ZT86IG51bWJlcjtcblx0bWF4T2Zmc2V0PzogbnVtYmVyO1xuXHRkeW5hbWljPzogYm9vbGVhbjtcbn07XG5leHBvcnQgdHlwZSBJbWFnZURhdGEgPSB7XG5cdHNvdXJjZTogSW1hZ2VCaXRtYXAgfCBIVE1MQ2FudmFzRWxlbWVudCB8IFRleHR1cmU7XG5cdHdpZHRoPzogbnVtYmVyO1xuXHRoZWlnaHQ/OiBudW1iZXI7XG5cdGRlcHRoPzogbnVtYmVyO1xuXHRzb3VyY2VYPzogbnVtYmVyO1xuXHRzb3VyY2VZPzogbnVtYmVyO1xuXHRtaXBMZXZlbD86IG51bWJlcjtcblx0eD86IG51bWJlcjtcblx0eT86IG51bWJlcjtcblx0ej86IG51bWJlcjtcblx0YXNwZWN0PzogXCJhbGxcIiB8IFwic3RlbmNpbC1vbmx5XCIgfCBcImRlcHRoLW9ubHlcIjtcblx0Y29sb3JTcGFjZT86IFwic3JnYlwiO1xuXHRwcmVtdWx0aXBsaWVkQWxwaGE/OiBib29sZWFuO1xufTtcbmV4cG9ydCB0eXBlIFdlYkdQVVRleHR1cmVQcm9wcyA9IHtcblx0c2l6ZTogdGV4dHVyZVNpemU7XG5cblx0Zml4ZWRTaXplPzogYm9vbGVhbjtcblxuXHRmb3JtYXQ6IHN0cmluZztcblxuXHRsYWJlbD86IHN0cmluZztcblxuXHR1c2FnZT86IG51bWJlcjtcblxuXHRzYW1wbGVyPzogU2FtcGxlcjtcblxuXHRkYXRhPzogSW1hZ2VEYXRhIHwgQXJyYXk8SW1hZ2VEYXRhPjtcblxuXHRtaXBMZXZlbENvdW50PzogbnVtYmVyO1xuXG5cdHNhbXBsZUNvdW50PzogbnVtYmVyO1xuXG5cdGRpbWVuc2lvbj86IGRpbWVuc2lvbjtcblxuXHR2aWV3Rm9ybWF0cz86IHN0cmluZztcblxuXHRzYW1wbGVUeXBlPzogc3RyaW5nO1xuXG5cdG5lZWRNaXBNYXA/OiBib29sZWFuO1xuXG5cdGRhdGFJc1RleHR1cmU/OiBib29sZWFuO1xuXG5cdGFjY2Vzcz86IFN0b3JhZ2VUZXh0dXJlQWNjZXNzO1xufTtcbmV4cG9ydCB0eXBlIHRleHR1cmVTaXplID0ge1xuXHR3aWR0aDogbnVtYmVyO1xuXHRoZWlnaHQ6IG51bWJlcjtcblx0ZGVwdGg6IG51bWJlcjtcbn07XG5leHBvcnQgdHlwZSBkaW1lbnNpb24gPSBcIjFkXCIgfCBcIjJkXCIgfCBcIjNkXCI7XG5leHBvcnQgdHlwZSBidWZmZXJMYXlvdXRUeXBlID0ge1xuXHR0eXBlOiBzdHJpbmc7IC8vIFwidW5pZm9ybVwiXG5cdGhhc0R5bmFtaWNPZmZzZXQ/OiBib29sZWFuO1xuXHRtaW5CaW5kaW5nU2l6ZT86IG51bWJlcjtcbn07XG4vLyByZW5kZXJzdGF0ZVxuZXhwb3J0IHR5cGUgRGVwdGhTdGVuY2lsID0ge1xuXHRmb3JtYXQ6IFRleHR1cmVGb3JtYXQ7XG5cdGRlcHRoV3JpdGVFbmFibGVkOiBib29sZWFuO1xuXHRkZXB0aENvbXBhcmU6IENvbXBhcmVGdW5jdGlvbjtcblx0c3RlbmNpbFJlYWRNYXNrPzogbnVtYmVyO1xuXHRzdGVuY2lsV3JpdGVNYXNrPzogbnVtYmVyO1xuXHRzdGVuY2lsRnJvbnQ/OiB7XG5cdFx0Y29tcGFyZTogQ29tcGFyZUZ1bmN0aW9uO1xuXHRcdGZhaWxPcDogU3RlbmNpbE9wZXJhdGlvbjtcblx0XHRkZXB0aEZhaWxPcDogU3RlbmNpbE9wZXJhdGlvbjtcblx0XHRwYXNzT3A6IFN0ZW5jaWxPcGVyYXRpb247XG5cdH07XG5cdHN0ZW5jaWxCYWNrPzoge1xuXHRcdGNvbXBhcmU6IENvbXBhcmVGdW5jdGlvbjtcblx0XHRmYWlsT3A6IFN0ZW5jaWxPcGVyYXRpb247XG5cdFx0ZGVwdGhGYWlsT3A6IFN0ZW5jaWxPcGVyYXRpb247XG5cdFx0cGFzc09wOiBTdGVuY2lsT3BlcmF0aW9uO1xuXHR9O1xuXHRkZXB0aEJpYXM/OiBudW1iZXI7XG5cdGRlcHRoQmlhc1Nsb3BlU2NhbGU/OiBudW1iZXI7XG5cdGRlcHRoQmlhc0NsYW1wPzogbnVtYmVyO1xufTtcbmV4cG9ydCB0eXBlIFByaW1pdGl2ZVN0YXRlID0ge1xuXHRmcm9udEZhY2U/OiBGcm9udEZhY2U7XG5cdGN1bGxNb2RlPzogQ3VsbE1vZGU7XG5cdHVuY2xpcHBlZERlcHRoPzogYm9vbGVhbjtcblx0dG9wb2xvZ3k/OiBQcmltaXRpdmVUb3BvbG9neTtcblx0c3RyaXBJbmRleEZvcm1hdD86IEluZGV4Rm9ybWF0O1xufTtcbmV4cG9ydCB0eXBlIE11bHRpU2FtcGxlID0ge1xuXHRjb3VudD86IG51bWJlcjtcblx0bWFzaz86IG51bWJlcjtcblx0YWxwaGFUb0NvdmVyYWdlRW5hYmxlZD86IGJvb2xlYW47XG59O1xuZXhwb3J0IHR5cGUgVGFyZ2V0ID0ge1xuXHRmb3JtYXQ6IFRleHR1cmVGb3JtYXQ7XG5cdGJsZW5kPzoge1xuXHRcdGNvbG9yOiB7XG5cdFx0XHRvcGVyYXRpb246IEJsZW5kT3BlcmF0aW9uO1xuXHRcdFx0c3JjRmFjdG9yOiBCbGVuZEZhY3Rvcjtcblx0XHRcdGRzdEZhY3RvcjogQmxlbmRGYWN0b3I7XG5cdFx0fTtcblx0XHRhbHBoYToge1xuXHRcdFx0b3BlcmF0aW9uOiBCbGVuZE9wZXJhdGlvbjtcblx0XHRcdHNyY0ZhY3RvcjogQmxlbmRGYWN0b3I7XG5cdFx0XHRkc3RGYWN0b3I6IEJsZW5kRmFjdG9yO1xuXHRcdH07XG5cdH07XG5cdHdyaXRlTWFzazogQ29sb3JXcml0ZUZsYWdzO1xufTtcbmV4cG9ydCB0eXBlIEJsZW5kQ29uc3RhbnQgPSB7XG5cdHI6IG51bWJlcjtcblx0ZzogbnVtYmVyO1xuXHRiOiBudW1iZXI7XG5cdGE6IG51bWJlcjtcbn07XG5leHBvcnQgdHlwZSBSZW5kZXJTdGF0ZVByb3BzID0ge1xuXHRkZXB0aFN0ZW5jaWw/OiBEZXB0aFN0ZW5jaWw7XG5cdHByaW1pdGl2ZT86IFByaW1pdGl2ZVN0YXRlO1xuXHRtdWx0aXNhbXBsZT86IE11bHRpU2FtcGxlO1xuXHRzdGVuY2lsUmVmZXJlbmNlPzogbnVtYmVyO1xuXHR0YXJnZXRzPzogQXJyYXk8VGFyZ2V0Pjtcblx0dmlld3BvcnQ/OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9O1xuXHRibGVuZENvbnN0YW50PzogQmxlbmRDb25zdGFudDtcblx0c2Npc3NvclRlc3RFbmFibGVkPzogYm9vbGVhbjtcblx0c3RlbmNpbEVuYWJsZWQ/OiBib29sZWFuO1xufTtcbmV4cG9ydCB0eXBlIFZpZXdQb3J0ID0ge1xuXHR4PzogbnVtYmVyO1xuXHR5PzogbnVtYmVyO1xuXHR3aWR0aD86IG51bWJlcjtcblx0aGVpZ2h0PzogbnVtYmVyO1xuXHRtaW5EZXB0aD86IG51bWJlcjtcblx0bWF4RGVwdGg/OiBudW1iZXI7XG59O1xuZXhwb3J0IHR5cGUgU2Npc3NvclRlc3QgPSB7XG5cdHg6IG51bWJlcjtcblx0eTogbnVtYmVyO1xuXHR3aWR0aDogbnVtYmVyO1xuXHRoZWlnaHQ6IG51bWJlcjtcbn07XG5leHBvcnQgdHlwZSBTaGFkZXJNYXRlcmlhbFBhcm1zID0ge1xuXHR0eXBlPzogc3RyaW5nO1xuXHRzaGFkZXJJZD86IHN0cmluZztcblx0ZnJhZz86IHN0cmluZyB8IFNoYWRlckZ1bmM7XG5cdHZlcnQ/OiBzdHJpbmcgfCBTaGFkZXJGdW5jO1xuXHR1bmlmb3Jtcz86IHsgW3VuaWZvcm06IHN0cmluZ106IElVbmlmb3JtIH07XG5cdHVuaWZvcm1CdWZmZXJzPzogQXJyYXk8VW5pZm9ybUJ1ZmZlclByb3A+O1xuXHR1bmlmb3JtVGV4dHVyZUFuZFNhbXBsZXI/OiB7XG5cdFx0W3VuaWZvcm06IHN0cmluZ106IElVbmlmb3JtPGFueT47XG5cdH07XG5cdGRlZmluZXM/OiBTaGFkZXJEZWZpbmU7XG5cdGxpZ2h0PzogYm9vbGVhbjtcbn07XG5leHBvcnQgaW50ZXJmYWNlIElVbmlmb3JtPFRWYWx1ZSA9IGFueT4ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdHZhbHVlOiBUVmFsdWU7XG5cdGJpbmRpbmc/OiBudW1iZXI7XG5cdHZpc2liaWxpdHk/OiBudW1iZXI7XG5cdHRleHR1cmVWaWV3PzogR1BVVGV4dHVyZVZpZXc7XG59XG5leHBvcnQgdHlwZSBVbmlmb3JtcyA9IHsgW3VuaWZvcm06IHN0cmluZ106IElVbmlmb3JtIH07XG5leHBvcnQgdHlwZSBJbnN0YW5jZSA9IE1lc2ggfCBQb3N0RWZmZWN0IHwgTGlnaHQ7XG5cbmV4cG9ydCBlbnVtIFJlbmRlck9iamVjdFR5cGUge1xuXHRDYW1lcmEgPSBcImNhbWVyYVwiLFxuXHRMaWdodCA9IFwibGlnaHRcIixcblx0TWVzaCA9IFwibWVzaFwiLFxuXHRTa2luTWVzaCA9IFwic2tpbk1lc2hcIixcblx0Tm9kZSA9IFwibm9kZVwiLFxuXHRBeGVzID0gXCJheGVzXCIsXG5cdFNreWJveCA9IFwic2t5Qm94XCIsXG5cdFBvc3RFZmZlY3QgPSBcInBvc3RFZmZlY3RcIixcblx0RGVidWcgPSBcImRlYnVnXCJcbn1cbmV4cG9ydCBlbnVtIExpZ2h0VHlwZSB7XG5cdFNwb3RMaWdodCA9IFwic3BvdExpZ2h0XCIsXG5cdFBvaW50TGlnaHQgPSBcInBvaW50TGlnaHRcIixcblx0QW1iaWVudExpZ2h0ID0gXCJhbWJpZW50TGlnaHRcIixcblx0RGlyZWN0aW9uYWxMaWdodCA9IFwiZGlyZWN0aW9uYWxMaWdodFwiXG59XG5leHBvcnQgdHlwZSBTaGFkZXJEZWZpbmUgPSB7IFtwcm9wOiBzdHJpbmddOiBib29sZWFuIHwgbnVtYmVyIH07XG5cbmV4cG9ydCB0eXBlIFNoYWRlclNvdXJjZVBhcmFtcyA9IHtcblx0c2hhZGVySWQ/OiBzdHJpbmc7XG5cdGRlZmluZXM/OiBTaGFkZXJEZWZpbmU7XG5cdGNvbXB1dGU/OiBjb21wdXRlUGFyYW1zO1xuXHRyZW5kZXI/OiByZW5kZXJQYXJhbXM7XG5cdGxhbmd1YWdlPzogU2hhZGVyTGFuZ3VhZ2U7XG59O1xuZXhwb3J0IHR5cGUgcmVuZGVyUGFyYW1zID0ge1xuXHR2ZXJ0TWFpbj86IHN0cmluZztcblx0ZnJhZ01haW4/OiBzdHJpbmc7XG5cdGZyYWdTaGFkZXI/OiBzdHJpbmcgfCBTaGFkZXJGdW5jO1xuXHR2ZXJ0U2hhZGVyPzogc3RyaW5nIHwgU2hhZGVyRnVuYztcbn07XG5leHBvcnQgdHlwZSBjb21wdXRlUGFyYW1zID0ge1xuXHRjb21wdXRlTWFpbj86IHN0cmluZztcblx0Y29tcHV0ZVNoYWRlcj86IHN0cmluZyB8IFNoYWRlckZ1bmM7XG59O1xuZXhwb3J0IGludGVyZmFjZSBHUFVTaGFkZXJNb2R1bGVPYmplY3Qge1xuXHR2ZXJ0OiBHUFVTaGFkZXJNb2R1bGU7XG5cdGZyYWc6IEdQVVNoYWRlck1vZHVsZTtcbn1cbmV4cG9ydCB0eXBlIFNoYWRlckZ1bmMgPSAoZGVmaW5lcz86IFNoYWRlckRlZmluZSkgPT4gc3RyaW5nO1xuZXhwb3J0IHR5cGUgU2hhZGVyU3RyaW5nID0ge1xuXHR2ZXJ0Pzogc3RyaW5nO1xuXHRmcmFnPzogc3RyaW5nO1xuXHRjb21wdXRlPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFNoYWRlck1vZHVsZSA9IHtcblx0dmVydD86IEdQVVNoYWRlck1vZHVsZTtcblx0ZnJhZz86IEdQVVNoYWRlck1vZHVsZTtcblx0Y29tcHV0ZT86IEdQVVNoYWRlck1vZHVsZTtcbn07XG5leHBvcnQgdHlwZSBVbmlmb3JtRnVuYyA9ICgpID0+IGFueTtcblxuZXhwb3J0IHR5cGUgRHJhd0NvbW1hbmRQYXJhbXMgPSB7XG5cdHNoYWRlckRhdGE/OiBTaGFkZXJEYXRhO1xuXG5cdHJlbmRlclRhcmdldD86IFJlbmRlclRhcmdldDtcblxuXHR2ZXJ0ZXhCdWZmZXJzPzogQXJyYXk8VmVydGV4QnVmZmVyPjtcblxuXHRpbmRleEJ1ZmZlcj86IEluZGV4QnVmZmVyO1xuXG5cdHJlbmRlclN0YXRlPzogUmVuZGVyU3RhdGU7XG5cblx0cXVlcnlJbmRleD86IG51bWJlcjtcblxuXHRjb3VudD86IG51bWJlcjtcblxuXHRpbnN0YW5jZXM/OiBudW1iZXI7XG5cblx0c2hhZGVyU291cmNlPzogU2hhZGVyU291cmNlO1xuXG5cdGRpcnR5PzogYm9vbGVhbjtcblxuXHRsaWdodFNoYWRlckRhdGE/OiBTaGFkZXJEYXRhO1xuXG5cdHVzZUxpZ2h0PzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIE1vZGVsUGFyYW1zID0ge1xuXHRzaGFkZXJJZD86IHN0cmluZztcblx0ZnJhZz86IHN0cmluZyB8IFNoYWRlckZ1bmM7XG5cdHZlcnQ/OiBzdHJpbmcgfCBTaGFkZXJGdW5jO1xuXHRjb21wdXRlPzogc3RyaW5nIHwgU2hhZGVyRnVuYztcblx0dmVydGV4QnVmZmVycz86IEFycmF5PFZlcnRleEJ1ZmZlclByb3A+O1xuXHR1bmlmb3JtVGV4dHVyZUFuZFNhbXBsZXI/OiB7XG5cdFx0W3VuaWZvcm06IHN0cmluZ106IElVbmlmb3JtPGFueT47XG5cdH07XG5cdHVuaWZvcm1CdWZmZXJzPzogQXJyYXk8VW5pZm9ybUJ1ZmZlclByb3A+O1xuXHRyZW5kZXJTdGF0ZT86IFJlbmRlclN0YXRlUHJvcDtcblx0Y291bnQ/OiBudW1iZXI7XG5cdGluc3RhbmNlcz86IG51bWJlcjtcblx0aW5kaWNlcz86IEFycmF5PG51bWJlcj47XG5cdGRyYXc/OiBEcmF3UGFybWFzO1xuXHRkaXNwYXRjaD86IHsgeD86IG51bWJlcjsgeT86IG51bWJlcjsgej86IG51bWJlciB9O1xuXHRyZW5kZXJUYXJnZXQ/OiBSZW5kZXJUYXJnZXQ7XG59O1xuZXhwb3J0IHR5cGUgVmVydGV4QnVmZmVyUHJvcCA9IHtcblx0dWlkPzogc3RyaW5nO1xuXHRzdGVwTW9kZT86IHN0cmluZztcblx0YXJyYXlTdHJpZGU/OiBudW1iZXI7XG5cdGF0dHJpYnV0ZXM/OiB7IFtwcm9wOiBzdHJpbmddOiBBdHRyaWJ1dGVQcm9wIH07XG59O1xuZXhwb3J0IHR5cGUgVW5pZm9ybUJ1ZmZlclByb3AgPSB7XG5cdHVpZD86IHN0cmluZztcblx0dHlwZT86IHN0cmluZztcblx0dXNhZ2U/OiBudW1iZXI7XG5cdGJpbmRpbmc/OiBudW1iZXI7XG5cdGJ1ZmZlcj86IEJ1ZmZlcjtcblx0YnVmZmVyU2l6ZT86IG51bWJlcjtcblx0dmlzaWJsaXR5PzogU2hhZGVyU3RhZ2U7XG5cdHVuaWZvcm1zPzogeyBbdW5pZm9ybTogc3RyaW5nXTogSVVuaWZvcm08YW55PiB9O1xufTtcbmV4cG9ydCB0eXBlIEF0dHJpYnV0ZVByb3AgPSB7XG5cdHNpemU/OiBudW1iZXI7XG5cdHZhbHVlPzogW107XG5cdG5hbWVzPzogQXJyYXk8c3RyaW5nPjtcblx0aXRlbVNpemVzPzogW107XG5cdGJ1ZmZlcj86IEJ1ZmZlcjtcbn07XG5leHBvcnQgdHlwZSBSZW5kZXJTdGF0ZVByb3AgPSB7XG5cdHN0ZW5jaWxSZWZlcmVuY2U6IG51bWJlcjtcblx0YmxlbmRDb25zdGFudD86IHtcblx0XHRyOiBudW1iZXI7XG5cdFx0ZzogbnVtYmVyO1xuXHRcdGI6IG51bWJlcjtcblx0XHRhOiBudW1iZXI7XG5cdH07XG5cdG11bHRpU2FtcGxlPzoge1xuXHRcdGNvdW50OiBudW1iZXI7XG5cdFx0bWFzazogbnVtYmVyO1xuXHRcdGFscGhhVG9Db3ZlcmFnZUVuYWJsZWQ6IGJvb2xlYW47XG5cdH07XG5cdHNjaXNzb3JUZXN0Pzoge1xuXHRcdHg6IG51bWJlcjtcblx0XHR5OiBudW1iZXI7XG5cdFx0d2lkdGg6IG51bWJlcjtcblx0XHRoZWlnaHQ6IG51bWJlcjtcblx0fTtcblx0dmlld1BvcnQ/OiB7XG5cdFx0eDogbnVtYmVyO1xuXHRcdHk6IG51bWJlcjtcblx0XHR3aWR0aDogbnVtYmVyO1xuXHRcdGhlaWdodDogbnVtYmVyO1xuXHRcdG1pbkRlcHRoOiBudW1iZXI7XG5cdFx0bWF4RGVwdGg6IG51bWJlcjtcblx0fTtcblx0cHJpbWl0aXZlPzoge1xuXHRcdGZyb250RmFjZTogc3RyaW5nO1xuXHRcdGN1bGxNb2RlOiBzdHJpbmc7XG5cdFx0dW5jbGlwcGVkRGVwdGg6IGJvb2xlYW47XG5cdFx0dG9wb2xvZ3k6IHN0cmluZztcblx0fTtcblx0ZGVwdGhTdGVuY2lsPzoge1xuXHRcdGZvcm1hdDogc3RyaW5nO1xuXHRcdGRlcHRoV3JpdGVFbmFibGVkOiBib29sZWFuO1xuXHRcdGRlcHRoQ29tcGFyZTogc3RyaW5nO1xuXHRcdHN0ZW5jaWxSZWFkTWFzazogbnVtYmVyO1xuXHRcdHN0ZW5jaWxXcml0ZU1hc2s6IG51bWJlcjtcblx0XHRzdGVuY2lsRnJvbnRDb21wYXJlOiBzdHJpbmc7XG5cdFx0c3RlbmNpbEZyb250RmFpbE9wOiBzdHJpbmc7XG5cdFx0c3RlbmNpbEZyb250RGVwdGhGYWlsT3A6IHN0cmluZztcblx0XHRzdGVuY2lsRnJvbnRQYXNzT3A6IHN0cmluZztcblxuXHRcdHN0ZW5jaWxCYWNrQ29tcGFyZTogc3RyaW5nO1xuXHRcdHN0ZW5jaWxCYWNrRmFpbE9wOiBzdHJpbmc7XG5cdFx0c3RlbmNpbEJhY2tEZXB0aEZhaWxPcDogc3RyaW5nO1xuXHRcdHN0ZW5jaWxCYWNrUGFzc09wOiBzdHJpbmc7XG5cdFx0ZGVwdGhCaWFzOiBudW1iZXI7XG5cdFx0ZGVwdGhCaWFzU2xvcGVTY2FsZTogbnVtYmVyO1xuXHRcdGRlcHRoQmlhc0NsYW1wOiBudW1iZXI7XG5cdH07XG5cdHRhcmdldHM/OiBBcnJheTx7XG5cdFx0Zm9ybWF0Pzogc3RyaW5nO1xuXHRcdGJsZW5kQ29sb3JPcGVyYXRpb24/OiBzdHJpbmc7XG5cdFx0YmxlbmRDb2xvclNyY0ZhY3Rvcj86IHN0cmluZztcblx0XHRibGVuZENvbG9yRHN0RmFjdG9yPzogc3RyaW5nO1xuXHRcdGJsZW5kQWxwaGFPcGVyYXRpb24/OiBzdHJpbmc7XG5cdFx0YmxlbmRBbHBoYVNyY0ZhY3Rvcj86IHN0cmluZztcblx0XHRibGVuZEFscGhhRHN0RmFjdG9yPzogc3RyaW5nO1xuXHRcdHdyaXRlTWFzazogR1BVQ29sb3JXcml0ZTtcblx0fT47XG59O1xuZXhwb3J0IHR5cGUgRHJhd1Bhcm1hcyA9IHtcblx0Y291bnQ/OiBudW1iZXI7IC8vIFRoZSBudW1iZXIgb2YgaW5kaWNlcyB0byBkcmF3Li9UaGUgbnVtYmVyIG9mIHZlcnRpY2VzIHRvIGRyYXcuXG5cdGluc3RhbmNlQ291bnQ/OiBudW1iZXI7IC8vIFRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIHRvIGRyYXcuXG5cdGZpcnN0SW5kZXg/OiBudW1iZXI7IC8vIE9mZnNldCBpbnRvIHRoZSBpbmRleCBidWZmZXIsIGluIGluZGljZXMsIGJlZ2luIGRyYXdpbmdcblx0Zmlyc3RWZXJ0ZXg/OiBudW1iZXI7IC8vIE9mZnNldCBpbnRvIHRoZSB2ZXJ0ZXggYnVmZmVycywgaW4gdmVydGljZXMsIHRvIGJlZ2luIGRyYXdpbmcgZnJvbS5cblx0YmFzZVZlcnRleD86IG51bWJlcjsgLy8gIEFkZGVkIHRvIGVhY2ggaW5kZXggdmFsdWUgYmVmb3JlIGluZGV4aW5nIGludG8gdGhlIHZlcnRleCBidWZmZXJzLlxuXHRmaXJzdEluc3RhbmNlPzogbnVtYmVyOyAvLyBGaXJzdCBpbnN0YW5jZSB0byBkcmF3LlxufTtcbmV4cG9ydCB0eXBlIFVuaWZvcm1TdHJ1Y3QgPSB7XG5cdFt1bmlmb3JtOiBzdHJpbmddOiB7IHR5cGU/OiBzdHJpbmc7IHZhbHVlPzogb2JqZWN0IHwgQXJyYXk8bnVtYmVyPjsgb2Zmc2V0PzogbnVtYmVyIH07XG59O1xuZXhwb3J0IGVudW0gVW5pZm9ybUVudW0ge1xuXHRGbG9hdCA9IFwiZjMyXCIsXG5cdEZsb2F0VmVjMiA9IFwidmVjMjxmMzI+XCIsXG5cdEZsb2F0VmVjMyA9IFwidmVjMzxmMzI+XCIsXG5cdEZsb2F0VmVjNCA9IFwidmVjNDxmMzI+XCIsXG5cdEZsb2F0QXJyYXkgPSBcImFycmF5PGYzMj5cIixcblx0TWF0MiA9IFwibWF0MngyPGYzMj5cIixcblx0TWF0MyA9IFwibWF0M3gzPGYzMj5cIixcblx0TWF0NCA9IFwibWF0NHg0PGYzMj5cIixcblx0Q29sb3IgPSBcImNvbG9yXCIsXG5cdE1hdDRBcnJheSA9IFwiYXJyYXk8bWF0NHg0PGYzMj4+XCIsXG5cdFZlYzJBcnJheSA9IFwiYXJyYXk8dmVjMjxmMzI+PlwiLFxuXHRWZWMzQXJyYXkgPSBcImFycmF5PHZlYzM8ZjMyPj5cIixcblx0VmVjNEFycmF5ID0gXCJhcnJheTx2ZWM0PGYzMj4+XCIsXG5cdFVuaWZvcm1VaW50ID0gXCJ1MzJcIixcblx0UG9pbnRMaWdodHMgPSBcInBvaW50TGlnaHRzXCIsXG5cdFBvaW50TGlnaHRTaGFkb3dzID0gXCJwb2ludExpZ2h0U2hhZG93c1wiLFxuXHRTcG90TGlnaHRzID0gXCJzcG90TGlnaHRzXCIsXG5cdFNwb3RMaWdodFNoYWRvd3MgPSBcInNwb3RMaWdodFNoYWRvd3NcIixcblx0RGlydGVjdExpZ2h0cyA9IFwiZGlydGVjdExpZ2h0c1wiLFxuXHREaXJ0ZWN0TGlnaHRTaGFkb3dzID0gXCJkaXJ0ZWN0TGlnaHRTaGFkb3dzXCIsXG5cdFVuaWZvcm1TdHJ1Y3RBcnJheSA9IFwiU3RydWN0QXJyYXlcIlxufVxuZXhwb3J0IHR5cGUgVmVydGV4QnVmZmVyUGFyYW1zID0ge1xuXHRsYWJlbDogc3RyaW5nO1xuXHRpbmRleD86IG51bWJlcjtcblx0bG9jYXRpb25JbmRleD86IG51bWJlcjtcblx0c3RlcE1vZGU/OiBJbnB1dFN0ZXBNb2RlO1xuXHRhcnJheVN0cmlkZT86IG51bWJlcjtcbn07XG5leHBvcnQgZW51bSBTaGFkZXJMYW5ndWFnZSB7XG5cdFdHU0wgPSBcIndnc2xcIixcblx0R0xTTCA9IFwiZ2xzbFwiXG59XG5leHBvcnQgZW51bSBTaGFkZXJNYWluU3RhZ2Uge1xuXHRWRVJUID0gXCJ2ZXJ0ZXhcIixcblx0RlJBRyA9IFwiZnJhZ21lbnRcIixcblx0Q09NUFVURSA9IFwiY29tcHV0ZVwiXG59XG4iLCIvLyBpbXBvcnQgQ29sb3IgZnJvbSBcIi4uLy4uL21hdGgvQ29sb3JcIjtcblxuZXhwb3J0IGRlZmF1bHQgYFxuICAgIHN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgICAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcbiAgICAgICAgQGxvY2F0aW9uKDApIGNvbG9yOiB2ZWM0PGYzMj4sXG4gICAgfTtcbiAgICBAZnJhZ21lbnRcbiAgICBmbiBtYWluKGlucHV0OlZlcnRleE91dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgICByZXR1cm4gaW5wdXQuY29sb3I7XG4gICAgfVxuICAgIGA7XG4iLCJleHBvcnQgZGVmYXVsdCBgXG4gICBzdHJ1Y3QgVmVydGV4SW5wdXQge1xuICAgICAgICBAbG9jYXRpb24ocG9zaXRpb25Mb2NhdGlvbikgcG9zaXRpb246IHZlYzM8ZjMyPiwgICAgICAgXG4gICAgICAgIEBsb2NhdGlvbihjb2xvckxvY2F0aW9uKSBjb2xvcjogdmVjNDxmMzI+LFxuICAgfVxuICAgc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgICAgICBAbG9jYXRpb24oMCkgY29sb3I6IHZlYzQ8ZjMyPixcbiAgICB9O1xuICAgc3RydWN0IFNlbGZVbmlmb3JtIHtcbiAgICAgIG1vZGVsTWF0cml4OiBtYXQ0eDQ8ZjMyPixcbiAgIH1cbiAgIHN0cnVjdCBTeXN0ZW1Vbmlmb3JtIHtcbiAgICAgIHByb2plY3Rpb25NYXRyaXg6IG1hdDR4NDxmMzI+LFxuICAgICAgdmlld01hdHJpeDogbWF0NHg0PGYzMj4sXG4gICAgICBpbnZlcnNlVmlld01hdHJpeDogbWF0NHg0PGYzMj4sXG4gICAgICBjYW1lcmFQb3NpdGlvbjogdmVjMzxmMzI+LFxuICAgfTsgXG4gICBAYmluZGluZyhjb2xvckJpbmRpbmcpIEBncm91cCgwKSB2YXI8dW5pZm9ybT4gc2VsZlVuaWZvcm0gOiBTZWxmVW5pZm9ybTtcbiAgIEBiaW5kaW5nKGNhbWVyYUJpbmRpbmcpIEBncm91cCgxKSB2YXI8dW5pZm9ybT4gc3lzdGVtVW5pZm9ybSA6IFN5c3RlbVVuaWZvcm07XG4gICBAdmVydGV4XG4gICBmbiBtYWluKGlucHV0OiBWZXJ0ZXhJbnB1dCkgLT4gVmVydGV4T3V0cHV0IHtcbiAgICB2YXIgb3V0cHV0OlZlcnRleE91dHB1dDtcbiAgICBvdXRwdXQuY29sb3I9aW5wdXQuY29sb3I7XG4gICAgb3V0cHV0LnBvc2l0aW9uID0gc3lzdGVtVW5pZm9ybS5wcm9qZWN0aW9uTWF0cml4ICogc3lzdGVtVW5pZm9ybS52aWV3TWF0cml4ICpzZWxmVW5pZm9ybS5tb2RlbE1hdHJpeCp2ZWM0PGYzMj4oaW5wdXQucG9zaXRpb24sMS4wKTtcbiAgICByZXR1cm4gb3V0cHV0O1xuICAgfVxuICAgYDtcbiIsImV4cG9ydCBkZWZhdWx0IGBcbiAgICAgICAgLy8gcmVmZXJlbmNlOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYtV2ViR0wtUEJSL2Jsb2IvbWFzdGVyL3NoYWRlcnMvcGJyLWZyYWcuZ2xzbFxuICAgICAgICAjaW5jbHVkZSA8cGJyVXRpbHM+XG4gICAgICAgICNpbmNsdWRlIDxsaWdodD5cbiAgICAgICAgI2luY2x1ZGUgPGJyZGY+XG4gICAgICAgICNpbmNsdWRlIDxQYnJNYXRlcmlhbFN0cnVjdD5cbiAgICAgICAgI2luY2x1ZGUgPFN5c3RlbVVuaWZvcm0+IFxuICAgICAgICAjaW5jbHVkZSA8RnJhZ0lucHV0PiAgIFxuICAgICAgICBzdHJ1Y3QgUGh5c2ljYWxNYXRlcmlhbCB7XG4gICAgICAgICAgICBkaWZmdXNlQ29sb3I6dmVjMzxmMzI+LFxuICAgICAgICAgICAgcm91Z2huZXNzOmYzMixcbiAgICAgICAgICAgIHNwZWN1bGFyQ29sb3I6dmVjMzxmMzI+LFxuICAgICAgICAgICAjaWYgVVNFX0NMRUFSQ09BVFxuICAgICAgICAgICAgICAgY2xlYXJjb2F0OmYzMixcbiAgICAgICAgICAgICAgIGNsZWFyY29hdFJvdWdobmVzczpmMzIsXG4gICAgICAgICAgICAgICBjbGVhcmNvYXRGMDp2ZWMzPGYzMj4sXG4gICAgICAgICAgICAgICBjbGVhcmNvYXRGOTA6ZjMyLFxuICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAjaWYgVVNFX0lSSURFU0NFTkNFXG4gICAgICAgICAgICAgICBpcmlkZXNjZW5jZTpmMzIsXG4gICAgICAgICAgICAgICBpcmlkZXNjZW5jZUlPUjpmMzIsXG4gICAgICAgICAgICAgICBpcmlkZXNjZW5jZVRoaWNrbmVzczpmMzIsXG4gICAgICAgICAgICAgICBpcmlkZXNjZW5jZUZyZXNuZWw6dmVjMzxmMzI+LFxuICAgICAgICAgICAgICAgaXJpZGVzY2VuY2VGMDp2ZWMzPGYzMj4sXG4gICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICNpZiBVU0VfU0hFRU5cbiAgICAgICAgICAgICAgIHNoZWVuQ29sb3I6dmVjMzxmMzI+LFxuICAgICAgICAgICAgICAgc2hlZW5Sb3VnaG5lc3M6ZjMyLFxuICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAjaWYgSU9SXG4gICAgICAgICAgICAgICAgaW9yOmYzMixcbiAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgI2lmIFVTRV9UUkFOU01JU1NJT05cbiAgICAgICAgICAgICAgIHRyYW5zbWlzc2lvbjpmMzIsXG4gICAgICAgICAgICAgICB0cmFuc21pc3Npb25BbHBoYTpmMzIsXG4gICAgICAgICAgICAgICB0aGlja25lc3M6ZjMyLFxuICAgICAgICAgICAgICAgYXR0ZW51YXRpb25EaXN0YW5jZTpmMzIsXG4gICAgICAgICAgICAgICBhdHRlbnVhdGlvbkNvbG9yOnZlYzM8ZjMyPixcbiAgICAgICAgICAgI2VuZGlmXG4gICAgICAgfTtcbiAgICAgICAgY29uc3QgTV9QSTpmMzIgPSAzLjE0MTU5MjY1MzU4OTc5MztcbiAgICAgICAgY29uc3QgY19NaW5Sb3VnaG5lc3M6ZjMyID0gMC4wNDtcbiAgICAgICAgI2luY2x1ZGUgPFRleHR1cmVBbmRTYW1wbGVyRGVmaW5lPlxuICAgICAgICAjaWYgVVNFX0lCTFxuICAgICAgICAgICAgI2luY2x1ZGUgPGlibD5cbiAgICAgICAgI2VuZGlmXG4gICAgICAgIEBiaW5kaW5nKHBickJpbmRpbmcpIEBncm91cCgwKSB2YXI8dW5pZm9ybT4gbWF0ZXJpYWxVbmlmb3JtIDogTWF0ZXJpYWxVbmlmb3JtO1xuICAgICAgICBAYmluZGluZyhjYW1lcmFCaW5kaW5nKSBAZ3JvdXAoMSkgdmFyPHVuaWZvcm0+IHN5c3RlbVVuaWZvcm0gOiBTeXN0ZW1Vbmlmb3JtO1xuICAgICAgICBAZnJhZ21lbnRcbiAgICAgICAgZm4gbWFpbihpbnB1dDpGcmFnSW5wdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4gXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwZXJjZXB0dWFsUm91Z2huZXNzOmYzMiA9IG1hdGVyaWFsVW5pZm9ybS5yb3VnaG5lc3M7XG4gICAgICAgICAgICB2YXIgbWV0YWxsaWM6ZjMyID0gbWF0ZXJpYWxVbmlmb3JtLm1ldGFsbGljO1xuXG4gICAgICAgICAgICAjaWYgVVNFX01FVEFMTkVTU1RFWFRVUkVcbiAgICAgICAgICAgICAgICBsZXQgbXJTYW1wbGU6dmVjNDxmMzI+ID0gdGV4dHVyZVNhbXBsZShtZXRhbG5lc3NSb3VnaG5lc3NUZXh0dXJlLG1ldGFsbmVzc1JvdWdobmVzc1NhbXBsZXIsIGlucHV0LnV2KTtcbiAgICAgICAgICAgICAgICBwZXJjZXB0dWFsUm91Z2huZXNzID0gbXJTYW1wbGUuZyAqIHBlcmNlcHR1YWxSb3VnaG5lc3M7XG4gICAgICAgICAgICAgICAgbWV0YWxsaWMgPSBtclNhbXBsZS5iICogbWV0YWxsaWM7XG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgIHBlcmNlcHR1YWxSb3VnaG5lc3MgPSBjbGFtcChwZXJjZXB0dWFsUm91Z2huZXNzLCBjX01pblJvdWdobmVzcywgMS4wKTtcbiAgICAgICAgICAgIG1ldGFsbGljID0gY2xhbXAobWV0YWxsaWMsIDAuMCwgMS4wKTtcbiAgICAgICAgICAgIGxldCBhbHBoYVJvdWdobmVzczpmMzIgPSBwZXJjZXB0dWFsUm91Z2huZXNzICogcGVyY2VwdHVhbFJvdWdobmVzcztcblxuXG4gICAgICAgICAgICAvLyBUaGUgYWxiZWRvIG1heSBiZSBkZWZpbmVkIGZyb20gYSBiYXNlIHRleHR1cmUgb3IgYSBmbGF0IGNvbG9yXG4gICAgICAgICAgICAjaWYgVVNFX1RFWFRVUkVcbiAgICAgICAgICAgICAgICBsZXQgYmFzZUNvbG9yOnZlYzQ8ZjMyPiA9IHRleHR1cmVTYW1wbGUoYmFzZUNvbG9yVGV4dHVyZSxiYXNlQ29sb3JTYW1wbGVyLCBpbnB1dC51dikgO1xuICAgICAgICAgICAgI2Vsc2VcbiAgICAgICAgICAgICAgICBsZXQgYmFzZUNvbG9yOnZlYzQ8ZjMyPiA9IHZlYzQ8ZjMyPihtYXRlcmlhbFVuaWZvcm0uY29sb3IsMS4wKTtcbiAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAjaWYgVVNFX05PUk1BTFRFWFRVUkVcbiAgICAgICAgICAgICAgICBsZXQgbjp2ZWMzPGYzMj4gPSBnZXROb3JtYWxCeU5vcm1hbFRleHR1cmUoaW5wdXQpOyAgXG4gICAgICAgICAgICAjZWxzZVxuICAgICAgICAgICAgICAgIGxldCBuOnZlYzM8ZjMyPiA9IGdldE5vcm1hbChpbnB1dCk7XG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgIHZhciBtYXRlcmlhbDpQaHlzaWNhbE1hdGVyaWFsO1xuICAgICAgICAgICAgbWF0ZXJpYWwuZGlmZnVzZUNvbG9yPWJhc2VDb2xvci5yZ2IqKCAxLjAgLSBtZXRhbGxpYyApO1xuICAgICAgICAgICAgbWF0ZXJpYWwucm91Z2huZXNzPXBlcmNlcHR1YWxSb3VnaG5lc3M7XG4gICAgICAgICAgICBtYXRlcmlhbC5zcGVjdWxhckNvbG9yPW1peCggdmVjMzxmMzI+KCAwLjA0KSwgYmFzZUNvbG9yLnJnYiwgbWV0YWxsaWMgKTtcbiAgICAgICAgICAgIHZhciBnZW9tZXRyeTpHZW9tZXRyeTtcbiAgICAgICAgICAgIGdlb21ldHJ5Lm5vcm1hbD1uO1xuICAgICAgICAgICAgZ2VvbWV0cnkudmlld0Rpcj1ub3JtYWxpemUoc3lzdGVtVW5pZm9ybS5jYW1lcmFQb3NpdGlvbiAtIGlucHV0LndvcmxkUG9zKTtcbiAgICAgICAgICAgIGdlb21ldHJ5LnBvc2l0aW9uPWlucHV0LndvcmxkUG9zO1xuICAgICAgICAgICAgZ2VvbWV0cnkuZG90TlYgPSBzYXR1cmF0ZShkb3QoZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyKSApO1xuICAgICAgICAgICAgLy9saWdodCBzaGFkaW5nXG4gICAgICAgICAgICB2YXIgcmVmbGVjdGVkTGlnaHQ9cGFyc2VMaWdodHMoZ2VvbWV0cnksbWF0ZXJpYWwpO1xuICAgICAgICAgICAgdmFyIGNvbG9yPXJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UrcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXI7XG4gICAgICAgICAgICAvL2libFxuICAgICAgICAgICAgI2lmIFVTRV9JQkwmJkhBU19VVlxuICAgICAgICAgICAgICAgIHZhciByZWZsZWN0ZWRMaWdodERpZmZ1c2U9aW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsKGdlb21ldHJ5LG1hdGVyaWFsKTtcbiAgICAgICAgICAgICAgICB2YXIgcmVmbGVjdGVkTGlnaHRTcGVjdWxhcj1pbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsKGdlb21ldHJ5LG1hdGVyaWFsKTtcbiAgICAgICAgICAgICAgICBjb2xvcis9cmVmbGVjdGVkTGlnaHREaWZmdXNlLmluZGlyZWN0RGlmZnVzZTtcbiAgICAgICAgICAgICAgICBjb2xvcis9cmVmbGVjdGVkTGlnaHRTcGVjdWxhci5pbmRpcmVjdFNwZWN1bGFyO1xuICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgICAjaWYgVVNFX0FPVEVYVFVSRVxuICAgICAgICAgICAgICAgIGxldCBhbzpmMzIgPSB0ZXh0dXJlU2FtcGxlKGFvVGV4dHVyZSxhb1NhbXBsZXIsIGlucHV0LnV2KS5yO1xuICAgICAgICAgICAgICAgIGNvbG9yID0gbWl4KGNvbG9yLCBjb2xvciAqIGFvLCBtYXRlcmlhbFVuaWZvcm0ub2NjbHVzaW9uU3RyZW5ndGgpO1xuICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICNpZiBVU0VfRU1JU1NJVkVURVhUVVJFXG4gICAgICAgICAgICAgICAgbGV0IGVtaXNzaXZlOnZlYzM8ZjMyPiA9IHRleHR1cmVTYW1wbGUoZW1pc3NpdmVUZXh0dXJlLCBlbWlzc2l2ZVNhbXBsZXIsaW5wdXQudXYpLnJnYiA7XG4gICAgICAgICAgICAgICAgY29sb3IgKz0gZW1pc3NpdmU7XG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICByZXR1cm4gdmVjNDxmMzI+KGNvbG9yLCBiYXNlQ29sb3IuYSk7XG4gICAgfVxuICAgYDtcbiIsImV4cG9ydCBkZWZhdWx0IGBcbiAgICAjaW5jbHVkZSA8UGJyTWF0ZXJpYWxTdHJ1Y3Q+XG4gICAgI2luY2x1ZGUgPFN5c3RlbVVuaWZvcm0+XG4gICAgI2luY2x1ZGUgPFZlcnRleElucHV0PlxuICAgICNpbmNsdWRlIDxWZXJ0ZXhPdXRwdXQ+IFxuICAgICNpbmNsdWRlIDxza2luVmVydEhlYWRlcj5cbiAgICAjaW5jbHVkZSA8aW5zdGFuY2VWZXJ0SGVhZGVyPlxuICAgIEBiaW5kaW5nKHBickJpbmRpbmcpIEBncm91cCgwKSB2YXI8dW5pZm9ybT4gbWF0ZXJpYWxVbmlmb3JtIDogTWF0ZXJpYWxVbmlmb3JtO1xuICAgIEBiaW5kaW5nKGNhbWVyYUJpbmRpbmcpIEBncm91cCgxKSB2YXI8dW5pZm9ybT4gc3lzdGVtVW5pZm9ybSA6IFN5c3RlbVVuaWZvcm07XG4gICAgQHZlcnRleFxuICAgIGZuIG1haW4oaW5wdXQ6IFZlcnRleElucHV0KS0+IFZlcnRleE91dHB1dFxuICAge1xuICAgICAgICB2YXIgb3V0cHV0OiBWZXJ0ZXhPdXRwdXQ7XG4gICAgICAgICNpZiBIQVNfVVZcbiAgICAgICAgICAgIG91dHB1dC51diA9IGlucHV0LnV2O1xuICAgICAgICAjZW5kaWZcbiAgICAgICAgdmFyIG1vZGVsTWF0cml4Om1hdDR4NDxmMzI+O1xuICAgICAgICB2YXIgdk5vcm1hbFZpZXc6dmVjMzxmMzI+O1xuICAgICAgICB2Tm9ybWFsVmlldyA9IG5vcm1hbGl6ZShtYXRlcmlhbFVuaWZvcm0ubm9ybWFsTWF0cml4ICogdmVjNDxmMzI+KGlucHV0Lm5vcm1hbCwwLjApKS54eXo7XG4gICAgICAgIG1vZGVsTWF0cml4PW1hdGVyaWFsVW5pZm9ybS5tb2RlbE1hdHJpeDsgICBcbiAgICAgICAgI2luY2x1ZGUgPHNraW5WZXJ0TWFpbj5cbiAgICAgICAgI2luY2x1ZGUgPGluc3RhbmNlVmVydE1haW4+ICBcbiAgICAgICAgb3V0cHV0Lm5vcm1hbCA9IHZOb3JtYWxWaWV3Lnh5ejtcbiAgICAgICAgb3V0cHV0LnBvc2l0aW9uID0gc3lzdGVtVW5pZm9ybS5wcm9qZWN0aW9uTWF0cml4ICogc3lzdGVtVW5pZm9ybS52aWV3TWF0cml4ICptb2RlbE1hdHJpeCogdmVjNDxmMzI+KGlucHV0LnBvc2l0aW9uLCAxLjApO1xuICAgICAgICBsZXQgbW9kZWxQb3M9bW9kZWxNYXRyaXggKnZlYzQ8ZjMyPihpbnB1dC5wb3NpdGlvbiwxLjApO1xuICAgICAgICBvdXRwdXQud29ybGRQb3MgPSBtb2RlbFBvcy54eXovbW9kZWxQb3MudztcbiAgICAgICAgcmV0dXJuIG91dHB1dDsgICBcbiAgIH1cbiAgIGA7XG4iLCJjb25zdCBwcmVwcm9jZXNzb3JTeW1ib2xzID0gLyMoW15cXHNdKikoXFxzKikvZ207XG4vLyBUZW1wbGF0ZSBsaXRlcmFsIHRhZyB0aGF0IGhhbmRsZXMgc2ltcGxlIHByZXByb2Nlc3NvciBzeW1ib2xzIGZvciBXR1NMXG4vLyBzaGFkZXJzLiBTdXBwb3J0cyAjaWYvZWxpZi9lbHNlL2VuZGlmIHN0YXRlbWVudHMuXG5leHBvcnQgZnVuY3Rpb24gd2dzbFBhcnNlRGVmaW5lcyhzdHJpbmdzLCAuLi52YWx1ZXMpIHtcblx0Y29uc3Qgc3RhdGVTdGFjayA9IFtdO1xuXHRsZXQgc3RhdGUgPSB7IGZyYWc6IFwiXCIsIGVsc2VJc1ZhbGlkOiBmYWxzZSwgZXhwcmVzc2lvbjogdHJ1ZSB9O1xuXHRsZXQgZGVwdGggPSAxO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyArK2kpIHtcblx0XHRjb25zdCBmcmFnID0gc3RyaW5nc1tpXTtcblx0XHRjb25zdCBtYXRjaGVkU3ltYm9scyA9IGZyYWcubWF0Y2hBbGwocHJlcHJvY2Vzc29yU3ltYm9scyk7XG5cblx0XHRsZXQgbGFzdEluZGV4ID0gMDtcblx0XHRsZXQgdmFsdWVDb25zdW1lZCA9IGZhbHNlO1xuXG5cdFx0Zm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVkU3ltYm9scykge1xuXHRcdFx0c3RhdGUuZnJhZyArPSBmcmFnLnN1YnN0cmluZyhsYXN0SW5kZXgsIG1hdGNoLmluZGV4KTtcblxuXHRcdFx0c3dpdGNoIChtYXRjaFsxXSkge1xuXHRcdFx0XHRjYXNlIFwiaWZcIjpcblx0XHRcdFx0XHRpZiAobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggIT0gZnJhZy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIiNpZiBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgdGVtcGxhdGUgZXhwcmVzc2lvbiAoaWU6ICR7dmFsdWV9KVwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dmFsdWVDb25zdW1lZCA9IHRydWU7XG5cdFx0XHRcdFx0c3RhdGVTdGFjay5wdXNoKHN0YXRlKTtcblx0XHRcdFx0XHRkZXB0aCsrO1xuXHRcdFx0XHRcdHN0YXRlID0geyBmcmFnOiBcIlwiLCBlbHNlSXNWYWxpZDogdHJ1ZSwgZXhwcmVzc2lvbjogISF2YWx1ZXNbaV0gfTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImVsaWZcIjpcblx0XHRcdFx0XHRpZiAobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggIT0gZnJhZy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIiNlbGlmIG11c3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSB0ZW1wbGF0ZSBleHByZXNzaW9uIChpZTogJHt2YWx1ZX0pXCIpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIXN0YXRlLmVsc2VJc1ZhbGlkKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCIjZWxpZiBub3QgcHJlY2VlZGVkIGJ5IGFuICNpZiBvciAjZWxpZlwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dmFsdWVDb25zdW1lZCA9IHRydWU7XG5cdFx0XHRcdFx0aWYgKHN0YXRlLmV4cHJlc3Npb24gJiYgc3RhdGVTdGFjay5sZW5ndGggIT0gZGVwdGgpIHtcblx0XHRcdFx0XHRcdHN0YXRlU3RhY2sucHVzaChzdGF0ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHN0YXRlID0geyBmcmFnOiBcIlwiLCBlbHNlSXNWYWxpZDogdHJ1ZSwgZXhwcmVzc2lvbjogISF2YWx1ZXNbaV0gfTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImVsc2VcIjpcblx0XHRcdFx0XHRpZiAoIXN0YXRlLmVsc2VJc1ZhbGlkKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCIjZWxzZSBub3QgcHJlY2VlZGVkIGJ5IGFuICNpZiBvciAjZWxpZlwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHN0YXRlLmV4cHJlc3Npb24gJiYgc3RhdGVTdGFjay5sZW5ndGggIT0gZGVwdGgpIHtcblx0XHRcdFx0XHRcdHN0YXRlU3RhY2sucHVzaChzdGF0ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHN0YXRlID0geyBmcmFnOiBtYXRjaFsyXSwgZWxzZUlzVmFsaWQ6IGZhbHNlLCBleHByZXNzaW9uOiB0cnVlIH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJlbmRpZlwiOlxuXHRcdFx0XHRcdGlmICghc3RhdGVTdGFjay5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIiNlbmRpZiBub3QgcHJlY2VlZGVkIGJ5IGFuICNpZlwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNhc2UtZGVjbGFyYXRpb25zXG5cdFx0XHRcdFx0Y29uc3QgYnJhbmNoU3RhdGUgPSBzdGF0ZVN0YWNrLmxlbmd0aCA9PSBkZXB0aCA/IHN0YXRlU3RhY2sucG9wKCkgOiBzdGF0ZTtcblx0XHRcdFx0XHRzdGF0ZSA9IHN0YXRlU3RhY2sucG9wKCk7XG5cdFx0XHRcdFx0ZGVwdGgtLTtcblx0XHRcdFx0XHRpZiAoYnJhbmNoU3RhdGUuZXhwcmVzc2lvbikge1xuXHRcdFx0XHRcdFx0c3RhdGUuZnJhZyArPSBicmFuY2hTdGF0ZS5mcmFnO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzdGF0ZS5mcmFnICs9IG1hdGNoWzJdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdC8vIFVua25vd24gcHJlcHJvY2Vzc29yIHN5bWJvbC4gRW1pdCBpdCBiYWNrIGludG8gdGhlIG91dHB1dCBmcmFnIHVuY2hhbmdlZC5cblx0XHRcdFx0XHRzdGF0ZS5mcmFnICs9IG1hdGNoWzBdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRsYXN0SW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgZnJhZyBkaWRuJ3QgZW5kIG9uIG9uZSBvZiB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbHMgYXBwZW5kIHRoZSByZXN0IG9mIGl0IGhlcmUuXG5cdFx0aWYgKGxhc3RJbmRleCAhPSBmcmFnLmxlbmd0aCkge1xuXHRcdFx0c3RhdGUuZnJhZyArPSBmcmFnLnN1YnN0cmluZyhsYXN0SW5kZXgsIGZyYWcubGVuZ3RoKTtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgbmV4dCB2YWx1ZSB3YXNuJ3QgY29uc3VtZWQgYnkgdGhlIHByZXByb2Nlc3NvciBzeW1ib2wsIGFwcGVuZCBpdCBoZXJlLlxuXHRcdGlmICghdmFsdWVDb25zdW1lZCAmJiB2YWx1ZXMubGVuZ3RoID4gaSkge1xuXHRcdFx0c3RhdGUuZnJhZyArPSB2YWx1ZXNbaV07XG5cdFx0fVxuXHR9XG5cblx0aWYgKHN0YXRlU3RhY2subGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiTWlzbWF0Y2hlZCAjaWYvI2VuZGlmIGNvdW50XCIpO1xuXHR9XG5cblx0cmV0dXJuIHN0YXRlLmZyYWc7XG59XG4iLCJpbXBvcnQgeyB3Z3NsUGFyc2VEZWZpbmVzIH0gZnJvbSBcIi4uL1dnc2xQcmVwcm9jZXNzb3JcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBickZyYWcoZGVmaW5lcykge1xyXG5cdHJldHVybiB3Z3NsUGFyc2VEZWZpbmVzYFxyXG4gICAgI2luY2x1ZGUgPGxpZ2h0Q29tbW9uPlxyXG4gICAgI2luY2x1ZGUgPGxpZ2h0PlxyXG4gICAgI2luY2x1ZGUgPGJyZGY+XHJcbiAgICAjaW5jbHVkZSA8cGJyU3RydWN0PlxyXG4gICAgI2luY2x1ZGUgPHBiclV0aWxzPlxyXG4gICAgI2luY2x1ZGUgPHBickZ1bmN0aW9uPlxyXG4gICAgI2luY2x1ZGUgPHBiclRleHR1cmU+XHJcbiAgICAjaW5jbHVkZSA8ZW52aXJvbm1lbnQ+XHJcbiAgICBzdHJ1Y3QgU3lzdGVtVW5pZm9ybSB7XHJcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeDogbWF0NHg0PGYzMj4sXHJcbiAgICAgICAgdmlld01hdHJpeDogbWF0NHg0PGYzMj4sXHJcbiAgICAgICAgaW52ZXJzZVZpZXdNYXRyaXg6IG1hdDR4NDxmMzI+LFxyXG4gICAgICAgIGNhbWVyYVBvc2l0aW9uOiB2ZWMzPGYzMj4sXHJcbiAgICB9OyBcclxuICAgIC8vIHVuaWZvcm0gdmVjMyBsaWdodFByb2JlWzldLFxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuc3RydWN0IFZlcnRleE91dHB1dCB7XHJcbiAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246IHZlYzQ8ZjMyPixcclxuICAgIEBidWlsdGluKGZyb250X2ZhY2luZykgaXNfZnJvbnQ6IGJvb2wsXHJcbiAgICBAbG9jYXRpb24oMCkgdlV2OiB2ZWMyPGYzMj4sXHJcbiAgICBAbG9jYXRpb24oMSkgdlZpZXdQb3NpdGlvbjogdmVjMzxmMzI+LCAvLyBWZWN0b3IgZnJvbSB2ZXJ0ZXggdG8gY2FtZXJhLlxyXG4gICAgQGxvY2F0aW9uKDIpIHZXb3JsZFBvc2l0aW9uOiB2ZWMzPGYzMj4sXHJcbiAgICBAbG9jYXRpb24oMykgdk5vcm1hbDogdmVjMzxmMzI+LFxyXG4gICAgLy8g5Y+v6YCJXHJcbiAgICAjaWYgJHtkZWZpbmVzLlVTRV9MSUdIVFRFWFRVUkUgfHwgZGVmaW5lcy5VU0VfQU9URVhUVVJFfVxyXG4gICAgICAgIEBsb2NhdGlvbigke2RlZmluZXMudlV2Mk91dExvY2F0aW9ufSkgdlV2MjogdmVjMjxmMzI+LFxyXG4gICAgI2VuZGlmXHJcblxyXG4gICAgI2lmICR7ZGVmaW5lcy5VU0VfQ09MT1JfQUxQSEF9XHJcbiAgICAgICAgQGxvY2F0aW9uKCR7ZGVmaW5lcy52Q29sb3JPdXRMb2NhdGlvbn0pIHZDb2xvcjogdmVjNDxmMzI+LFxyXG4gICAgI2VsaWYgJHtkZWZpbmVzLlVTRV9DT0xPUiB8fCBkZWZpbmVzLlVTRV9JTlNUQU5DSU5HX0NPTE9SfVxyXG4gICAgICAgIEBsb2NhdGlvbigke2RlZmluZXMudkNvbG9yT3V0TG9jYXRpb259KSB2Q29sb3I6IHZlYzM8ZjMyPixcclxuICAgICNlbmRpZlxyXG5cclxuICAgICNpZiAke2RlZmluZXMuVVNFX1RBTkdFTlR9XHJcbiAgICAgICAgQGxvY2F0aW9uKCR7ZGVmaW5lcy52VGFuZ2VudE91dExvY2F0aW9ufSkgdlRhbmdlbnQ6IHZlYzM8ZjMyPixcclxuICAgICAgICBAbG9jYXRpb24oJHtkZWZpbmVzLnZCaXRhbmdlbnRPdXRMb2NhdGlvbn0pIHZCaXRhbmdlbnQ6IHZlYzM8ZjMyPixcclxuICAgICNlbmRpZlxyXG59O1xyXG4gICAgICAgIHN0cnVjdCBQaHlzaWNhbE1hdGVyaWFsIHtcclxuICAgICAgICAgICAgIGRpZmZ1c2VDb2xvcjp2ZWMzPGYzMj4sXHJcbiAgICAgICAgICAgICByb3VnaG5lc3M6ZjMyLFxyXG4gICAgICAgICAgICAgc3BlY3VsYXJDb2xvcjp2ZWMzPGYzMj4sXHJcbiAgICAgICAgICAgICBzcGVjdWxhckY5MDpmMzIsXHJcbiAgICAgICAgICAgICNpZiAke2RlZmluZXMuVVNFX0NMRUFSQ09BVH1cclxuICAgICAgICAgICAgICAgIGNsZWFyY29hdDpmMzIsXHJcbiAgICAgICAgICAgICAgICBjbGVhcmNvYXRSb3VnaG5lc3M6ZjMyLFxyXG4gICAgICAgICAgICAgICAgY2xlYXJjb2F0RjA6dmVjMzxmMzI+LFxyXG4gICAgICAgICAgICAgICAgY2xlYXJjb2F0RjkwOmYzMixcclxuICAgICAgICAgICAgI2VuZGlmXHJcblxyXG4gICAgICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9JUklERVNDRU5DRX1cclxuICAgICAgICAgICAgICAgIGlyaWRlc2NlbmNlOmYzMixcclxuICAgICAgICAgICAgICAgIGlyaWRlc2NlbmNlSU9SOmYzMixcclxuICAgICAgICAgICAgICAgIGlyaWRlc2NlbmNlVGhpY2tuZXNzOmYzMixcclxuICAgICAgICAgICAgICAgIGlyaWRlc2NlbmNlRnJlc25lbDp2ZWMzPGYzMj4sXHJcbiAgICAgICAgICAgICAgICBpcmlkZXNjZW5jZUYwOnZlYzM8ZjMyPixcclxuICAgICAgICAgICAgI2VuZGlmXHJcblxyXG4gICAgICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9TSEVFTn1cclxuICAgICAgICAgICAgICAgIHNoZWVuQ29sb3I6dmVjMzxmMzI+LFxyXG4gICAgICAgICAgICAgICAgc2hlZW5Sb3VnaG5lc3M6ZjMyLFxyXG4gICAgICAgICAgICAjZW5kaWZcclxuXHJcbiAgICAgICAgICAgICNpZiAke2RlZmluZXMuSU9SfVxyXG4gICAgICAgICAgICAgICAgIGlvcjpmMzIsXHJcbiAgICAgICAgICAgICNlbmRpZlxyXG5cclxuICAgICAgICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfVFJBTlNNSVNTSU9OfVxyXG4gICAgICAgICAgICAgICAgdHJhbnNtaXNzaW9uOmYzMixcclxuICAgICAgICAgICAgICAgIHRyYW5zbWlzc2lvbkFscGhhOmYzMixcclxuICAgICAgICAgICAgICAgIHRoaWNrbmVzczpmMzIsXHJcbiAgICAgICAgICAgICAgICBhdHRlbnVhdGlvbkRpc3RhbmNlOmYzMixcclxuICAgICAgICAgICAgICAgIGF0dGVudWF0aW9uQ29sb3I6dmVjMzxmMzI+LFxyXG4gICAgICAgICAgICAjZW5kaWZcclxuICAgICAgICB9O1xyXG5AYmluZGluZygwKSBAZ3JvdXAoMCkgdmFyPHVuaWZvcm0+IG1hdGVyaWFsVW5pZm9ybSA6IE1hdGVyaWFsVW5pZm9ybTtcclxuQGJpbmRpbmcoMCkgQGdyb3VwKDEpIHZhcjx1bmlmb3JtPiBzeXN0ZW1Vbmlmb3JtIDogU3lzdGVtVW5pZm9ybTtcclxuQGZyYWdtZW50XHJcbmZuIG1haW4oaW5wdXQ6VmVydGV4T3V0cHV0KS0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xyXG4gICAgICAgIHZhciBkaWZmdXNlQ29sb3I6dmVjNDxmMzI+ID0gdmVjNChtYXRlcmlhbFVuaWZvcm0uZGlmZnVzZSwgbWF0ZXJpYWxVbmlmb3JtLm9wYWNpdHkgKTtcclxuICAgICAgIC8vIFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XHJcbiAgICAgICAgdmFyIHJlZmxlY3RlZExpZ2h0OlJlZmxlY3RlZExpZ2h0O1xyXG4gICAgICAgIHZhciB0b3RhbEVtaXNzaXZlUmFkaWFuY2U6dmVjMzxmMzI+ID0gbWF0ZXJpYWxVbmlmb3JtLmVtaXNzaXZlO1xyXG4gICAgICAgICNpZiAke2RlZmluZXMuVVNFX1RFWFRVUkV9XHJcbiAgICAgICAgICAgIHZhciBzYW1wbGVkRGlmZnVzZUNvbG9yOnZlYzQ8ZjMyPiA9dGV4dHVyZVNhbXBsZShiYXNlVGV4dHVyZSwgYmFzZVNhbXBsZXIsIGlucHV0LnZVdik7XHJcbiAgICAgICAgICAgICNpZiAke2RlZmluZXMuREVDT0RFX1ZJREVPX1RFWFRVUkV9XHJcbiAgICAgICAgICAgICAgICBzYW1wbGVkRGlmZnVzZUNvbG9yID0gdmVjNDxmMzI+KCBtaXgoIHBvdyggc2FtcGxlZERpZmZ1c2VDb2xvci5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzPGYzMj4oIDAuMDUyMTMyNzAxNCApLCB2ZWMzPGYzMj4oIDIuNCApICksIHNhbXBsZWREaWZmdXNlQ29sb3IucmdiICogMC4wNzczOTkzODA4LCB2ZWMzPGYzMj4oIGxlc3NUaGFuRXF1YWwoIHNhbXBsZWREaWZmdXNlQ29sb3IucmdiLCB2ZWMzPGYzMj4oIDAuMDQwNDUgKSApICkgKSwgc2FtcGxlZERpZmZ1c2VDb2xvci53ICk7XHJcbiAgICAgICAgICAgICNlbmRpZlxyXG5cclxuICAgICAgICAgICAgZGlmZnVzZUNvbG9yICo9IHNhbXBsZWREaWZmdXNlQ29sb3I7XHJcbiAgICAgICAgI2VuZGlmXHJcblxyXG4gICAgICAgIHZhciByb3VnaG5lc3NGYWN0b3I6ZjMyID0gbWF0ZXJpYWxVbmlmb3JtLnJvdWdobmVzcztcclxuICAgIFxyXG4gICAgICAgICNpZiAke2RlZmluZXMuVVNFX1JPVUdITkVTU1RFWFRVUkV9XHJcbiAgICAgICAgICAgIGxldCB0ZXhlbFJvdWdobmVzczp2ZWM0PGYzMj49dGV4dHVyZVNhbXBsZShyb3VnaG5lc3NUZXh0dXJlLCBiYXNlU2FtcGxlciwgaW5wdXQudlV2KTtcclxuICAgICAgICAgICAgcm91Z2huZXNzRmFjdG9yICo9IHRleGVsUm91Z2huZXNzLmc7XHJcbiAgICAgICAgI2VuZGlmXHJcblxyXG4gICAgICAgIHZhciBtZXRhbG5lc3NGYWN0b3I6ZjMyID0gbWF0ZXJpYWxVbmlmb3JtLm1ldGFsbmVzcztcclxuICAgIFxyXG4gICAgICAgICNpZiAke2RlZmluZXMuVVNFX01FVEFMTkVTU1RFWFRVUkV9XHJcbiAgICAgICAgICAgIGxldCB0ZXhlbE1ldGFsbmVzczp2ZWM0PGYzMj4gPXRleHR1cmVTYW1wbGUobWV0YWxuZXNzVGV4dHVyZSwgYmFzZVNhbXBsZXIsIGlucHV0LnZVdik7XHJcbiAgICAgICAgICAgIG1ldGFsbmVzc0ZhY3RvciAqPSB0ZXhlbE1ldGFsbmVzcy5iO1xyXG4gICAgICAgICNlbmRpZlxyXG5cclxuICAgICAgICBsZXQgZmFjZURpcmVjdGlvbjpmMzIgPXNlbGVjdCgtMS4wLDEuMCxpbnB1dC5pc19mcm9udCk7XHJcbiAgICAgICAgI2lmICR7ZGVmaW5lcy5GTEFUX1NIQURFRH1cclxuICAgICAgICAgICAgbGV0IGZkeDp2ZWMzPGYzMj4gPSBkcGR4KCBpbnB1dC52Vmlld1Bvc2l0aW9uICk7XHJcbiAgICAgICAgICAgIGxldCBmZHk6dmVjMzxmMzI+ID0gZHBkeSggaW5wdXQudlZpZXdQb3NpdGlvbiApO1xyXG4gICAgICAgICAgICBsZXQgbm9ybWFsOnZlYzM8ZjMyPiA9IG5vcm1hbGl6ZSggY3Jvc3MoIGZkeSwgZmR4ICkgKTtcclxuICAgICAgICAjZWxzZVxyXG4gICAgICAgICAgICBsZXQgbm9ybWFsOnZlYzM8ZjMyPiA9IG5vcm1hbGl6ZSggaW5wdXQudk5vcm1hbCApO1xyXG4gICAgICAgICAgICAjaWYgJHtkZWZpbmVzLkRPVUJMRV9TSURFRH1cclxuICAgICAgICAgICAgICAgIG5vcm1hbCA9IG5vcm1hbCAqIGZhY2VEaXJlY3Rpb247XHJcbiAgICAgICAgICAgICNlbmRpZlxyXG4gICAgICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9UQU5HRU5UfVxyXG4gICAgICAgICAgICAgICAgbGV0IHRhbmdlbnQ6dmVjMzxmMzI+ID0gbm9ybWFsaXplKCBpbnB1dC52VGFuZ2VudCApO1xyXG4gICAgICAgICAgICAgICAgbGV0IGJpdGFuZ2VudDp2ZWMzPGYzMj4gPSBub3JtYWxpemUoIGlucHV0LnZCaXRhbmdlbnQgKTtcclxuICAgICAgICAgICAgICAgICNpZiAke2RlZmluZXMuRE9VQkxFX1NJREVEfVxyXG4gICAgICAgICAgICAgICAgICAgIHRhbmdlbnQgPSB0YW5nZW50ICogZmFjZURpcmVjdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICBiaXRhbmdlbnQgPSBiaXRhbmdlbnQgKiBmYWNlRGlyZWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgICAgICAgICAjaWYgJHtkZWZpbmVzLlRBTkdFTlRTUEFDRV9OT1JNQUxURVhUVVJFIHx8IGRlZmluZXMuVVNFX0NMRUFSQ09BVF9OT1JNQUxURVhUVVJFfVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2VEJOOm1hdDN4MzxmMzI+ID0gbWF0M3gzPGYzMj4oIHRhbmdlbnQsIGJpdGFuZ2VudCwgbm9ybWFsICk7XHJcbiAgICAgICAgICAgICAgICAjZW5kaWZcclxuICAgICAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgI2VuZGlmXHJcbiAgICBcclxuICAgICAgICBsZXQgZ2VvbWV0cnlOb3JtYWw6dmVjMzxmMzI+ID0gbm9ybWFsO1xyXG5cclxuICAgICAgICAjaWYgJHtkZWZpbmVzLk9CSkVDVFNQQUNFX05PUk1BTFRFWFRVUkV9XHJcbiAgICAgICAgICAgIG5vcm1hbCA9dGV4dHVyZVNhbXBsZShub3JtYWxUZXh0dXJlLCBiYXNlU2FtcGxlciwgaW5wdXQudlV2KS54eXogKiAyLjAgLSAxLjA7XHJcbiAgICAgICAgICAgICNpZiAke2RlZmluZXMuRkxJUF9TSURFRH1cclxuICAgICAgICAgICAgICAgIG5vcm1hbCA9IC0gbm9ybWFsO1xyXG4gICAgICAgICAgICAjZW5kaWZcclxuICAgICAgICAgICAgI2lmICR7ZGVmaW5lcy5ET1VCTEVfU0lERUR9XHJcbiAgICAgICAgICAgICAgICBub3JtYWwgPSBub3JtYWwgKiBmYWNlRGlyZWN0aW9uO1xyXG4gICAgICAgICAgICAjZW5kaWZcclxuXHJcbiAgICAgICAgICAgIG5vcm1hbCA9IG5vcm1hbGl6ZShtYXRlcmlhbFVuaWZvcm0ubm9ybWFsTWF0cml4ICogbm9ybWFsICk7XHJcblxyXG4gICAgICAgICAgICAjZWxpZiAke2RlZmluZXMuVEFOR0VOVFNQQUNFX05PUk1BTFRFWFRVUkV9XHJcbiAgICAgICAgICAgIGxldCB0ZW1wTWFwTjp2ZWMzPGYzMj4gPXRleHR1cmVTYW1wbGUobm9ybWFsVGV4dHVyZSwgYmFzZVNhbXBsZXIsIGlucHV0LnZVdikueHl6ICogMi4wIC0gMS4wO1xyXG4gICAgICAgICAgICBsZXQgbWFwTjp2ZWMzPGYzMj4gPXRlbXBNYXBOLnh5ICo9IG1hdGVyaWFsVW5pZm9ybS5ub3JtYWxTY2FsZTtcclxuICAgICAgICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfVEFOR0VOVH1cclxuICAgICAgICAgICAgICAgIG5vcm1hbCA9IG5vcm1hbGl6ZSggdlRCTiAqIG1hcE4gKTtcclxuICAgICAgICAgICAgI2Vsc2VcclxuICAgICAgICAgICAgICAgIG5vcm1hbCA9IHBlcnR1cmJOb3JtYWwyQXJiKCAtIGlucHV0LnZWaWV3UG9zaXRpb24sIG5vcm1hbCwgbWFwTiwgZmFjZURpcmVjdGlvbiApO1xyXG4gICAgICAgICAgICAjZW5kaWZcclxuXHJcbiAgICAgICAgICAgICNlbGlmICR7ZGVmaW5lcy5VU0VfQlVNUFRFWFRVUkV9XHJcblxyXG4gICAgICAgICAgICAgICAgbm9ybWFsID0gcGVydHVyYk5vcm1hbEFyYiggLSBpbnB1dC52Vmlld1Bvc2l0aW9uLCBub3JtYWwsIGRIZHh5X2Z3ZCgpLCBmYWNlRGlyZWN0aW9uICk7XHJcbiAgICAgICAgI2VuZGlmXHJcblxyXG4gICAgICAgICNpZiAke2RlZmluZXMuVVNFX0NMRUFSQ09BVH1cclxuICAgICAgICAgICAgdmFyIGNsZWFyY29hdE5vcm1hbDp2ZWMzPGYzMj4gPSBnZW9tZXRyeU5vcm1hbDtcclxuICAgICAgICAjZW5kaWZcclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9DTEVBUkNPQVRfTk9STUFMVEVYVFVSRX1cclxuICAgICAgICAgICAgdmFyIGNsZWFyY29hdE1hcE46dmVjMzxmMzI+ID10ZXh0dXJlU2FtcGxlKGNsZWFyY29hdE5vcm1hbFRleHR1cmUsIGJhc2VTYW1wbGVyLCBpbnB1dC52VXYpLnh5eiAqIDIuMCAtIDEuMDtcclxuICAgICAgICAgICAgY2xlYXJjb2F0TWFwTi54eSAqPSBtYXRlcmlhbFVuaWZvcm0uY2xlYXJjb2F0Tm9ybWFsU2NhbGU7XHJcbiAgICAgICAgICAgICNpZiAke2RlZmluZXMuVVNFX1RBTkdFTlR9XHJcbiAgICAgICAgICAgICAgICBjbGVhcmNvYXROb3JtYWwgPSBub3JtYWxpemUoIHZUQk4gKiBjbGVhcmNvYXRNYXBOICk7XHJcbiAgICAgICAgICAgICNlbHNlXHJcbiAgICAgICAgICAgICAgICBjbGVhcmNvYXROb3JtYWwgPSBwZXJ0dXJiTm9ybWFsMkFyYiggLSBpbnB1dC52Vmlld1Bvc2l0aW9uLCBjbGVhcmNvYXROb3JtYWwsIGNsZWFyY29hdE1hcE4sIGZhY2VEaXJlY3Rpb24gKTtcclxuICAgICAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfRU1JU1NJVkVURVhUVVJFfVxyXG4gICAgICAgICAgICBsZXQgZW1pc3NpdmVDb2xvcjp2ZWM0PGYzMj4gPXRleHR1cmVTYW1wbGUoZW1pc3NpdmVUZXh0dXJlLCBiYXNlU2FtcGxlciwgaW5wdXQudlV2KTtcclxuICAgICAgICAgICAgdG90YWxFbWlzc2l2ZVJhZGlhbmNlICo9IGVtaXNzaXZlQ29sb3IucmdiO1xyXG4gICAgICAgICNlbmRpZlxyXG5cclxuICAgICAgICB2YXIgbWF0ZXJpYWw6UGh5c2ljYWxNYXRlcmlhbDtcclxuICAgICAgICBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiICogKCAxLjAgLSBtZXRhbG5lc3NGYWN0b3IgKTtcclxuICAgICAgICBsZXQgZHh5OnZlYzM8ZjMyPiA9IG1heCggYWJzKCBkcGR4KCBnZW9tZXRyeU5vcm1hbCApICksIGFicyggZHBkeSggZ2VvbWV0cnlOb3JtYWwgKSApICk7XHJcbiAgICAgICAgbGV0IGdlb21ldHJ5Um91Z2huZXNzOmYzMiA9IG1heCggbWF4KCBkeHkueCwgZHh5LnkgKSwgZHh5LnogKTtcclxuICAgICAgICBtYXRlcmlhbC5yb3VnaG5lc3MgPSBtYXgoIHJvdWdobmVzc0ZhY3RvciwgMC4wNTI1ICk7XHJcbiAgICAgICAgbWF0ZXJpYWwucm91Z2huZXNzICs9IGdlb21ldHJ5Um91Z2huZXNzO1xyXG4gICAgICAgIG1hdGVyaWFsLnJvdWdobmVzcyA9IG1pbiggbWF0ZXJpYWwucm91Z2huZXNzLCAxLjAgKTtcclxuXHJcbiAgICAgICAgI2lmICR7ZGVmaW5lcy5JT1J9XHJcbiAgICAgICAgICAgIG1hdGVyaWFsLmlvciA9IG1hdGVyaWFsVW5pZm9ybS5pb3I7XHJcbiAgICAgICAgICAgICNpZiAke2RlZmluZXMuU1BFQ1VMQVJ9XHJcbiAgICAgICAgICAgICAgICBsZXQgc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3I6ZjMyID0gbWF0ZXJpYWxVbmlmb3JtLnNwZWN1bGFySW50ZW5zaXR5O1xyXG4gICAgICAgICAgICAgICAgbGV0IHNwZWN1bGFyQ29sb3JGYWN0b3I6dmVjMzxmMzI+ID0gbWF0ZXJpYWxVbmlmb3JtLnNwZWN1bGFyQ29sb3I7XHJcbiAgICAgICAgICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9TUEVDVUxBUklOVEVOU0lUWVRFWFRVUkV9XHJcbiAgICAgICAgICAgICAgICAgICAgc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgKj10ZXh0dXJlU2FtcGxlKHNwZWN1bGFySW50ZW5zaXR5VGV4dHVyZSwgYmFzZVNhbXBsZXIsIGlucHV0LnZVdikuYTtcclxuICAgICAgICAgICAgICAgICNlbmRpZlxyXG5cclxuICAgICAgICAgICAgICAgICNpZiAke2RlZmluZXMuVVNFX1NQRUNVTEFSQ09MT1JURVhUVVJFfVxyXG4gICAgICAgICAgICAgICAgICAgIHNwZWN1bGFyQ29sb3JGYWN0b3IgKj10ZXh0dXJlU2FtcGxlKHNwZWN1bGFyQ29sb3JUZXh0dXJlLCBiYXNlU2FtcGxlciwgaW5wdXQudlV2KS5yZ2I7XHJcbiAgICAgICAgICAgICAgICAjZW5kaWZcclxuXHJcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5zcGVjdWxhckY5MCA9IG1peCggc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IsIDEuMCwgbWV0YWxuZXNzRmFjdG9yICk7XHJcbiAgICAgICAgICAgICNlbHNlXHJcbiAgICAgICAgICAgICAgICBsZXQgc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3I6ZjMyID0gMS4wO1xyXG4gICAgICAgICAgICAgICAgbGV0IHNwZWN1bGFyQ29sb3JGYWN0b3I6dmVjMzxmMzI+ID0gdmVjMzxmMzI+KCAxLjAgKTtcclxuICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNwZWN1bGFyRjkwID0gMS4wO1xyXG4gICAgICAgICAgICAjZW5kaWZcclxuICAgICAgICAgICAgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggbWluKCBwb3cyKCAoIG1hdGVyaWFsLmlvciAtIDEuMCApIC8gKCBtYXRlcmlhbC5pb3IgKyAxLjAgKSApICogc3BlY3VsYXJDb2xvckZhY3RvciwgdmVjMyggMS4wICkgKSAqIHNwZWN1bGFySW50ZW5zaXR5RmFjdG9yLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcclxuICAgICAgICAjZWxzZVxyXG4gICAgICAgICAgICBtYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gbWl4KCB2ZWMzPGYzMj4oIDAuMDQgKSwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XHJcbiAgICAgICAgICAgIG1hdGVyaWFsLnNwZWN1bGFyRjkwID0gMS4wO1xyXG4gICAgICAgICNlbmRpZlxyXG4gICAgICAgICNpZiAke2RlZmluZXMuVVNFX0NMRUFSQ09BVH1cclxuICAgICAgICAgICAgbWF0ZXJpYWwuY2xlYXJjb2F0ID0gbWF0ZXJpYWxVbmlmb3JtLmNsZWFyY29hdDtcclxuICAgICAgICAgICAgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzID0gbWF0ZXJpYWxVbmlmb3JtLmNsZWFyY29hdFJvdWdobmVzcztcclxuICAgICAgICAgICAgbWF0ZXJpYWwuY2xlYXJjb2F0RjAgPSB2ZWMzPGYzMj4oIDAuMDQgKTtcclxuICAgICAgICAgICAgbWF0ZXJpYWwuY2xlYXJjb2F0RjkwID0gMS4wO1xyXG4gICAgICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9DTEVBUkNPQVRURVhUVVJFfVxyXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuY2xlYXJjb2F0ICo9dGV4dHVyZVNhbXBsZShjbGVhcmNvYXRUZXh0dXJlLCBiYXNlU2FtcGxlciwgaW5wdXQudlV2KS54O1xyXG4gICAgICAgICAgICAjZW5kaWZcclxuICAgICAgICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfQ0xFQVJDT0FUX1JPVUdITkVTU1RFWFRVUkV9XHJcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKj10ZXh0dXJlU2FtcGxlKGNsZWFyY29hdFJvdWdobmVzc1RleHR1cmUsIGJhc2VTYW1wbGVyLCBpbnB1dC52VXYpLnk7XHJcbiAgICAgICAgICAgICNlbmRpZlxyXG4gICAgICAgICAgICBtYXRlcmlhbC5jbGVhcmNvYXQgPSBzYXR1cmF0ZSggbWF0ZXJpYWwuY2xlYXJjb2F0ICk7XHJcbiAgICAgICAgICAgIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IG1heCggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCAwLjA1MjUgKTtcclxuICAgICAgICAgICAgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICs9IGdlb21ldHJ5Um91Z2huZXNzO1xyXG4gICAgICAgICAgICBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBtaW4oIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgMS4wICk7XHJcbiAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfSVJJREVTQ0VOQ0V9XHJcbiAgICAgICAgICAgIG1hdGVyaWFsLmlyaWRlc2NlbmNlID0gbWF0ZXJpYWxVbmlmb3JtLmlyaWRlc2NlbmNlO1xyXG4gICAgICAgICAgICBtYXRlcmlhbC5pcmlkZXNjZW5jZUlPUiA9IG1hdGVyaWFsVW5pZm9ybS5pcmlkZXNjZW5jZUlPUjtcclxuICAgICAgICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfSVJJREVTQ0VOQ0VURVhUVVJFfVxyXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuaXJpZGVzY2VuY2UgKj10ZXh0dXJlU2FtcGxlKGlyaWRlc2NlbmNlVGV4dHVyZSwgYmFzZVNhbXBsZXIsIGlucHV0LnZVdikucjtcclxuICAgICAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgICAgICNpZiAke2RlZmluZXMuVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU1RFWFRVUkV9XHJcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzcyA9IChtYXRlcmlhbFVuaWZvcm0uaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtIC0gbWF0ZXJpYWxVbmlmb3JtLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bSkgKiB0ZXh0dXJlU2FtcGxlKGlyaWRlc2NlbmNlVGhpY2tuZXNzVGV4dHVyZSwgYmFzZVNhbXBsZXIsIGlucHV0LnZVdikuZyArIG1hdGVyaWFsVW5pZm9ybS5pcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW07XHJcbiAgICAgICAgICAgICNlbHNlXHJcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzcyA9IG1hdGVyaWFsVW5pZm9ybS5pcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW07XHJcbiAgICAgICAgICAgICNlbmRpZlxyXG4gICAgICAgICNlbmRpZlxyXG4gICAgICAgICNpZiAke2RlZmluZXMuVVNFX1NIRUVOfVxyXG4gICAgICAgICAgICBtYXRlcmlhbC5zaGVlbkNvbG9yID0gbWF0ZXJpYWxVbmlmb3JtLnNoZWVuQ29sb3I7XHJcbiAgICAgICAgICAgICNpZiAke2RlZmluZXMuVVNFX1NIRUVOQ09MT1JURVhUVVJFfVxyXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2hlZW5Db2xvciAqPXRleHR1cmVTYW1wbGUoc2hlZW5Db2xvclRleHR1cmUsIGJhc2VTYW1wbGVyLCBpbnB1dC52VXYpLnJnYjtcclxuICAgICAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgICAgIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzID0gY2xhbXAoIG1hdGVyaWFsVW5pZm9ybS5zaGVlblJvdWdobmVzcywgMC4wNywgMS4wICk7XHJcbiAgICAgICAgICAgICNpZiAke2RlZmluZXMuVVNFX1NIRUVOUk9VR0hORVNTVEVYVFVSRX1cclxuICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzICo9dGV4dHVyZVNhbXBsZShzaGVlblJvdWdobmVzc1RleHR1cmUsIGJhc2VTYW1wbGVyLCBpbnB1dC52VXYpLmE7XHJcbiAgICAgICAgICAgICNlbmRpZlxyXG4gICAgICAgICNlbmRpZlxyXG4gICAgICAgIFxyXG4gICAgICAgIHZhciBnZW9tZXRyeTpHZW9tZXRyaWNDb250ZXh0O1xyXG4gICAgICAgIGdlb21ldHJ5LnBvc2l0aW9uID0gLSBpbnB1dC52Vmlld1Bvc2l0aW9uO1xyXG4gICAgICAgIGdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbDtcclxuICAgICAgIC8vIGdlb21ldHJ5LnZpZXdEaXIgPSAoIGlzT3J0aG9ncmFwaGljICkgPyB2ZWMzKCAwLCAwLCAxICkgOiBub3JtYWxpemUoIGlucHV0LnZWaWV3UG9zaXRpb24gKTtcclxuICAgICAgICBnZW9tZXRyeS52aWV3RGlyID0gbm9ybWFsaXplKCBpbnB1dC52Vmlld1Bvc2l0aW9uKTsgXHJcblxyXG4gICAgICAgICNpZiAke2RlZmluZXMuVVNFX0NMRUFSQ09BVH1cclxuICAgICAgICAgICAgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsID0gY2xlYXJjb2F0Tm9ybWFsO1xyXG4gICAgICAgICNlbmRpZlxyXG5cclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9JUklERVNDRU5DRX1cclxuICAgICAgICAgICAgbGV0IGRvdE5WaTpmMzIgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xyXG4gICAgICAgICAgICBpZiAoIG1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzID09IDAuMCApIHtcclxuICAgICAgICAgICAgICAgIG1hdGVyaWFsLmlyaWRlc2NlbmNlID0gMC4wO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuaXJpZGVzY2VuY2UgPSBzYXR1cmF0ZSggbWF0ZXJpYWwuaXJpZGVzY2VuY2UgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIG1hdGVyaWFsLmlyaWRlc2NlbmNlID4gMC4wICkge1xyXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuaXJpZGVzY2VuY2VGcmVzbmVsID0gZXZhbElyaWRlc2NlbmNlKCAxLjAsIG1hdGVyaWFsLmlyaWRlc2NlbmNlSU9SLCBkb3ROVmksIG1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICk7XHJcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5pcmlkZXNjZW5jZUYwID0gU2NobGlja190b19GMCggbWF0ZXJpYWwuaXJpZGVzY2VuY2VGcmVzbmVsLCAxLjAsIGRvdE5WaSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgI2VuZGlmXHJcblxyXG4gICAgICAgIHZhciBpYmxJcnJhZGlhbmNlOnZlYzM8ZjMyPiA9IHZlYzM8ZjMyPiggMC4wICk7XHJcbiAgICAgICAgdmFyIGlycmFkaWFuY2U6dmVjMzxmMzI+ID0gZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZShjb21tb25MaWdodHNQYXJtcy5hbWJpZW50KTtcclxuICAgICAgICAvL2lycmFkaWFuY2UgKz0gZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGxpZ2h0UHJvYmUsIGdlb21ldHJ5Lm5vcm1hbCxzeXN0ZW1Vbmlmb3JtLnZpZXdNYXRyaXggKTtcclxuXHJcbiAgICAgICAgdmFyIHJhZGlhbmNlOnZlYzM8ZjMyPiA9IHZlYzM8ZjMyPiggMC4wICk7XHJcbiAgICAgICAgdmFyIGNsZWFyY29hdFJhZGlhbmNlOnZlYzM8ZjMyPiA9IHZlYzM8ZjMyPiggMC4wICk7XHJcblxyXG4gICAgICAgICNpZiAke2RlZmluZXMuVVNFX0xJR0hUVEVYVFVSRX1cclxuICAgICAgICAgICAgbGV0IGxpZ2h0TWFwVGV4ZWw6dmVjNDxmMzI+ID10ZXh0dXJlU2FtcGxlKGxpZ2h0VGV4dHVyZSwgYmFzZVNhbXBsZXIsIGlucHV0LnZVdjIpO1xyXG4gICAgICAgICAgICBsZXQgbGlnaHRNYXBJcnJhZGlhbmNlOnZlYzM8ZjMyPiA9IGxpZ2h0TWFwVGV4ZWwucmdiICogbWF0ZXJpYWxVbmlmb3JtLmxpZ2h0VGV4dHVyZUludGVuc2l0eTtcclxuICAgICAgICAgICAgaXJyYWRpYW5jZSArPSBsaWdodE1hcElycmFkaWFuY2U7XHJcbiAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgLy8mJiBkZWZpbmVzLlNUQU5EQVJEJiZkZWZpbmVzLkVOVlRFWFRVUkVfVFlQRV9DVUJFX1VWXHJcbiAgICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfRU5WVEVYVFVSRX0gXHJcbiAgICAgICAgICAgIGlibElycmFkaWFuY2UgKz0gZ2V0SUJMSXJyYWRpYW5jZSggZ2VvbWV0cnkubm9ybWFsLGJhc2VTYW1wbGVyLHN5c3RlbVVuaWZvcm0udmlld01hdHJpeCApO1xyXG4gICAgICAgICNlbmRpZlxyXG4gICAgICAgICNpZiAke2RlZmluZXMuVVNFX0VOVlRFWFRVUkV9XHJcbiAgICAgICAgICAgIHJhZGlhbmNlICs9IGdldElCTFJhZGlhbmNlKCBnZW9tZXRyeS52aWV3RGlyLGJhc2VTYW1wbGVyLHN5c3RlbVVuaWZvcm0udmlld01hdHJpeCwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbFVuaWZvcm0ucm91Z2huZXNzICk7XHJcbiAgICAgICAgICAgICNpZiAke2RlZmluZXMuVVNFX0NMRUFSQ09BVH1cclxuICAgICAgICAgICAgICAgIGNsZWFyY29hdFJhZGlhbmNlICs9IGdldElCTFJhZGlhbmNlKCBnZW9tZXRyeS52aWV3RGlyLGJhc2VTYW1wbGVyLHN5c3RlbVVuaWZvcm0udmlld01hdHJpeCwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcclxuICAgICAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgLy/nm7TmjqXlhYnnhadcclxuICAgICAgICAgICAgbGV0IGRpclJlZmxlY3RlZExpZ2h0OlJlZmxlY3RlZExpZ2h0PSBwYXJzZUxpZ2h0cyhnZW9tZXRyeSxtYXRlcmlhbCk7XHJcbiAgICAgICAgICAgIHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz1kaXJSZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlO1xyXG4gICAgICAgICAgICByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPWRpclJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyO1xyXG4gICAgICAgIC8v6Ze05o6l5ryr5Y+N5bCEXHJcbiAgICAgICAgICAgIGxldCBpbmRpcmVjdERpZmZ1c2VMaWdodDpSZWZsZWN0ZWRMaWdodD0gUkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsKCBpcnJhZGlhbmNlLCBnZW9tZXRyeSwgbWF0ZXJpYWwpO1xyXG4gICAgICAgICAgICByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9aW5kaXJlY3REaWZmdXNlTGlnaHQuaW5kaXJlY3REaWZmdXNlO1xyXG4gICAgICAgICAgICByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPWluZGlyZWN0RGlmZnVzZUxpZ2h0LmluZGlyZWN0U3BlY3VsYXI7XHJcbiAgICAgICAgLy/pl7TmjqXpq5jlhYlcclxuICAgICAgICAgICAgbGV0IGluZGlyZWN0U3BlY3VsYXJMaWdodDpSZWZsZWN0ZWRMaWdodD1SRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsKCByYWRpYW5jZSwgaWJsSXJyYWRpYW5jZSwgY2xlYXJjb2F0UmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCk7XHJcbiAgICAgICAgICAgIHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz1pbmRpcmVjdFNwZWN1bGFyTGlnaHQuaW5kaXJlY3REaWZmdXNlO1xyXG4gICAgICAgICAgICByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPWluZGlyZWN0U3BlY3VsYXJMaWdodC5pbmRpcmVjdFNwZWN1bGFyO1xyXG4gICAgICAgIC8v546v5aKD5YWJ6YGu6JS9XHJcbiAgICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfQU9URVhUVVJFfVxyXG4gICAgICAgICAgICBsZXQgYW1iaWVudE9jY2x1c2lvbjpmMzIgPSAodGV4dHVyZVNhbXBsZShhb1RleHR1cmUsIGJhc2VTYW1wbGVyLCBpbnB1dC52VXYyKS5yIC0gMS4wICkgKiBtYXRlcmlhbFVuaWZvcm0uYW9UZXh0dXJlSW50ZW5zaXR5ICsgMS4wO1xyXG5cclxuICAgICAgICAgICAgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IGFtYmllbnRPY2NsdXNpb247XHJcbiAgICAgICAgICAgIC8vJiZkZWZpbmVzLlNUQU5EQVJEXHJcbiAgICAgICAgICAgICNpZiAke2RlZmluZXMuVVNFX0VOVlRFWFRVUkV9IFxyXG4gICAgICAgICAgICAgICAgbGV0IGRvdE5WOmYzMiA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XHJcbiAgICAgICAgICAgICAgICByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICo9IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggZG90TlYsIGFtYmllbnRPY2NsdXNpb24sIG1hdGVyaWFsLnJvdWdobmVzcyApO1xyXG4gICAgICAgICAgICAjZW5kaWZcclxuICAgICAgICAjZW5kaWZcclxuXHJcbiAgICAgICAgdmFyIHRvdGFsRGlmZnVzZTp2ZWMzPGYzMj4gPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlO1xyXG4gICAgICAgIHZhciB0b3RhbFNwZWN1bGFyOnZlYzM8ZjMyPiA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhcjtcclxuICAgICAgICAvL+mAj+WwhFxyXG4gICAgICAgICNpZiAke2RlZmluZXMuVVNFX1RSQU5TTUlTU0lPTn1cclxuICAgICAgICAgICAgbWF0ZXJpYWwudHJhbnNtaXNzaW9uID0gbWF0ZXJpYWxVbmlmb3JtLnRyYW5zbWlzc2lvbjtcclxuICAgICAgICAgICAgbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEgPSAxLjA7XHJcbiAgICAgICAgICAgIG1hdGVyaWFsLnRoaWNrbmVzcyA9IG1hdGVyaWFsVW5pZm9ybS50aGlja25lc3M7XHJcbiAgICAgICAgICAgIG1hdGVyaWFsLmF0dGVudWF0aW9uRGlzdGFuY2UgPSBtYXRlcmlhbFVuaWZvcm0uYXR0ZW51YXRpb25EaXN0YW5jZTtcclxuICAgICAgICAgICAgbWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvciA9IG1hdGVyaWFsVW5pZm9ybS5hdHRlbnVhdGlvbkNvbG9yO1xyXG4gICAgICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9UUkFOU01JU1NJT05URVhUVVJFfVxyXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwudHJhbnNtaXNzaW9uICo9dGV4dHVyZVNhbXBsZSh0cmFuc21pc3Npb25UZXh0dXJlLCBiYXNlU2FtcGxlciwgaW5wdXQudlV2KS5yO1xyXG4gICAgICAgICAgICAjZW5kaWZcclxuICAgICAgICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfVEhJQ0tORVNTVEVYVFVSRX1cclxuICAgICAgICAgICAgICAgIG1hdGVyaWFsLnRoaWNrbmVzcyAqPXRleHR1cmVTYW1wbGUodGhpY2tuZXNzVGV4dHVyZSwgYmFzZVNhbXBsZXIsIGlucHV0LnZVdikuZztcclxuICAgICAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgICAgIGxldCBwb3M6dmVjMzxmMzI+ID0gdldvcmxkUG9zaXRpb247XHJcbiAgICAgICAgICAgIGxldCB2OnZlYzM8ZjMyPiA9IG5vcm1hbGl6ZSggY2FtZXJhUG9zaXRpb24gLSBwb3MgKTtcclxuICAgICAgICAgICAgbGV0IG46dmVjMzxmMzI+ID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCBzeXN0ZW1Vbmlmb3JtLnZpZXdNYXRyaXggKTtcclxuICAgICAgICAgICAgbGV0IHRyYW5zbWlzc2lvbjp2ZWM0PGYzMj4gPSBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKFxyXG4gICAgICAgICAgICBuLCB2LCBtYXRlcmlhbC5yb3VnaG5lc3MsIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJGOTAsIHBvcywgbW9kZWxNYXRyaXgsIHN5c3RlbVVuaWZvcm0udmlld01hdHJpeCwgc3lzdGVtVW5pZm9ybS5wcm9qZWN0aW9uTWF0cml4LCBtYXRlcmlhbC5pb3IsIG1hdGVyaWFsLnRoaWNrbmVzcywgbWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvciwgbWF0ZXJpYWwuYXR0ZW51YXRpb25EaXN0YW5jZSApO1xyXG4gICAgICAgICAgICBtYXRlcmlhbC50cmFuc21pc3Npb25BbHBoYSA9IG1peCggbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEsIHRyYW5zbWlzc2lvbi5hLCBtYXRlcmlhbC50cmFuc21pc3Npb24gKTtcclxuICAgICAgICAgICAgdG90YWxEaWZmdXNlID0gbWl4KCB0b3RhbERpZmZ1c2UsIHRyYW5zbWlzc2lvbi5yZ2IsIG1hdGVyaWFsLnRyYW5zbWlzc2lvbiApO1xyXG4gICAgICAgICNlbmRpZlxyXG5cclxuICAgICAgICBsZXQgb3V0Z29pbmdMaWdodDp2ZWMzPGYzMj4gPSB0b3RhbERpZmZ1c2UgKyB0b3RhbFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xyXG5cclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9TSEVFTn1cclxuICAgICAgICAgICAgbGV0IHNoZWVuRW5lcmd5Q29tcDpmMzIgPSAxLjAgLSAwLjE1NyAqIG1heDMoIG1hdGVyaWFsLnNoZWVuQ29sb3IgKTtcclxuICAgICAgICAgICAgb3V0Z29pbmdMaWdodCA9IG91dGdvaW5nTGlnaHQgKiBzaGVlbkVuZXJneUNvbXAgKyBzaGVlblNwZWN1bGFyO1xyXG4gICAgICAgICNlbmRpZlxyXG5cclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9DTEVBUkNPQVR9XHJcbiAgICAgICAgICAgIGxldCBkb3ROVmNjOmYzMiA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XHJcbiAgICAgICAgICAgIGxldCBGY2M6dmVjMzxmMzI+ID0gRl9TY2hsaWNrKCBtYXRlcmlhbC5jbGVhcmNvYXRGMCwgbWF0ZXJpYWwuY2xlYXJjb2F0RjkwLCBkb3ROVmNjICk7XHJcbiAgICAgICAgICAgIG91dGdvaW5nTGlnaHQgPSBvdXRnb2luZ0xpZ2h0ICogKCAxLjAgLSBtYXRlcmlhbC5jbGVhcmNvYXQgKiBGY2MgKSArIGNsZWFyY29hdFNwZWN1bGFyICogbWF0ZXJpYWwuY2xlYXJjb2F0O1xyXG4gICAgICAgICNlbmRpZlxyXG5cclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9UUkFOU01JU1NJT059XHJcbiAgICAgICAgICAgIGRpZmZ1c2VDb2xvci5hICo9IG1hdGVyaWFsLnRyYW5zbWlzc2lvbkFscGhhICsgMC4xO1xyXG4gICAgICAgICNlbmRpZlxyXG5cclxuICAgICAgICB2YXIgZmlubmFsQ29sb3I6dmVjNDxmMzI+O1xyXG4gICAgICAgIGZpbm5hbENvbG9yID0gdmVjNDxmMzI+KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xyXG4gICAgICAgICNpZiAke2RlZmluZXMuVE9ORV9NQVBQSU5HfVxyXG4gICAgICAgICAgIGZpbm5hbENvbG9yLnJnYiA9IHRvbmVNYXBwaW5nKCBmaW5uYWxDb2xvci5yZ2IsbWF0ZXJpYWxVbmlmb3JtLnRvbmVNYXBwaW5nRXhwb3N1cmUgKTtcclxuICAgICAgICAjZW5kaWZcclxuXHJcbiAgICAgICAgICBmaW5uYWxDb2xvciA9IGxpbmVhclRvT3V0cHV0VGV4ZWwoIGZpbm5hbENvbG9yKTtcclxuXHJcbiAgICAgICAgI2lmICR7ZGVmaW5lcy5QUkVNVUxUSVBMSUVEX0FMUEhBfVxyXG4gICAgICAgICAgICBmaW5uYWxDb2xvci5yZ2IgKj0gZmlubmFsQ29sb3IuYTtcclxuICAgICAgICAjZW5kaWZcclxuICAgICAgICAjaWYgJHtkZWZpbmVzLkRJVEhFUklOR31cclxuICAgICAgICAgICAgZmlubmFsQ29sb3IucmdiID0gZGl0aGVyaW5nKCBmaW5uYWxDb2xvci5yZ2IgKTtcclxuICAgICAgICAjZW5kaWZcclxuICAgICAgICByZXR1cm4gZmlubmFsQ29sb3I7XHJcbiAgICB9YDtcclxufVxyXG4iLCJpbXBvcnQgeyB3Z3NsUGFyc2VEZWZpbmVzIH0gZnJvbSBcIi4uL1dnc2xQcmVwcm9jZXNzb3JcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBiclZlcnQoZGVmaW5lcykge1xyXG4gIHJldHVybiB3Z3NsUGFyc2VEZWZpbmVzYFxyXG4gICAgI2luY2x1ZGUgPHBiclN0cnVjdD5cclxuICAgIHN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xyXG4gICAgICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxyXG4gICAgICAgIEBsb2NhdGlvbigwKSB2VXY6IHZlYzI8ZjMyPixcclxuICAgICAgICBAbG9jYXRpb24oMSkgdlZpZXdQb3NpdGlvbjogdmVjMzxmMzI+LCAvLyBWZWN0b3IgZnJvbSB2ZXJ0ZXggdG8gY2FtZXJhLlxyXG4gICAgICAgIEBsb2NhdGlvbigyKSB2V29ybGRQb3NpdGlvbjogdmVjMzxmMzI+LFxyXG4gICAgICAgIEBsb2NhdGlvbigzKSB2Tm9ybWFsOiB2ZWMzPGYzMj4sXHJcbiAgICAgICAgLy8g5Y+v6YCJXHJcbiAgICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfTElHSFRURVhUVVJFIHx8IGRlZmluZXMuVVNFX0FPVEVYVFVSRX1cclxuICAgICAgICAgICAgQGxvY2F0aW9uKCR7ZGVmaW5lcy52VXYyT3V0TG9jYXRpb259KSB2VXYyOiB2ZWMyPGYzMj4sXHJcbiAgICAgICAgI2VuZGlmXHJcblxyXG4gICAgICAgICNpZiAke2RlZmluZXMuVVNFX0NPTE9SX0FMUEhBfVxyXG4gICAgICAgICAgICBAbG9jYXRpb24oJHtkZWZpbmVzLnZDb2xvck91dExvY2F0aW9ufSkgdkNvbG9yOiB2ZWM0PGYzMj4sXHJcbiAgICAgICAgI2VsaWYgJHtkZWZpbmVzLlVTRV9DT0xPUiB8fCBkZWZpbmVzLlVTRV9JTlNUQU5DSU5HX0NPTE9SfVxyXG4gICAgICAgICAgICBAbG9jYXRpb24oJHtkZWZpbmVzLnZDb2xvck91dExvY2F0aW9ufSkgdkNvbG9yOiB2ZWMzPGYzMj4sXHJcbiAgICAgICAgI2VuZGlmXHJcblxyXG4gICAgICAgICNpZiAke2RlZmluZXMuVVNFX1RBTkdFTlR9XHJcbiAgICAgICAgICAgIEBsb2NhdGlvbigke2RlZmluZXMudlRhbmdlbnRPdXRMb2NhdGlvbn0pIHZUYW5nZW50OiB2ZWMzPGYzMj4sXHJcbiAgICAgICAgICAgIEBsb2NhdGlvbigke2RlZmluZXMudkJpdGFuZ2VudE91dExvY2F0aW9ufSkgdkJpdGFuZ2VudDogdmVjMzxmMzI+LFxyXG4gICAgICAgICNlbmRpZlxyXG4gICAgfTtcclxuICAgIHN0cnVjdCBHbG9iYWxVbmlmb3JtIHtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4OiBtYXQ0eDQ8ZjMyPixcclxuICAgICAgICB2aWV3TWF0cml4OiBtYXQ0eDQ8ZjMyPixcclxuICAgICAgICBpbnZlcnNlVmlld01hdHJpeDogbWF0NHg0PGYzMj4sXHJcbiAgICAgICAgY2FtZXJhUG9zaXRpb246IHZlYzM8ZjMyPixcclxuICAgIH07XHJcblxyXG4gICAgLy90ZXh0dXJlIGFuZCBzYW1wbGVyXHJcbiAgICAvLyBAZ3JvdXAoMCkgQGJpbmRpbmcoJHtkZWZpbmVzLnNhbXBsZXJCaW5kaW5nfSkgdmFyIGJhc2VTYW1wbGVyOiBzYW1wbGVyO1xyXG4gICAgI2lmICR7ZGVmaW5lcy5VU0VfU0tJTk5JTkd9XHJcbiAgICAgICAgLy91bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBib25lVGV4dHVyZTtcclxuICAgICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoJHtcclxuICAgICAgICAgIGRlZmluZXMuYm9uZVRleHR1cmVCaW5kaW5nXHJcbiAgICAgICAgfSkgdmFyIGJvbmVUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XHJcbiAgICAjZW5kaWZcclxuXHJcbiAgICAjaWYgJHtkZWZpbmVzLlVTRV9ESVNQTEFDRU1FTlRURVhUVVJFfVxyXG4gICAgICAgIC8vdW5pZm9ybSBzYW1wbGVyMkQgZGlzcGxhY2VtZW50TWFwO1xyXG4gICAgICAgIEBncm91cCgwKSBAYmluZGluZygke1xyXG4gICAgICAgICAgZGVmaW5lcy5kaXNwbGFjZW1lbnRUZXh0dXJlQmluZGluZ1xyXG4gICAgICAgIH0pIHZhciBkaXNwbGFjZW1lbnRNYXA6IHRleHR1cmVfMmQ8ZjMyPjtcclxuICAgICNlbmRpZlxyXG5cclxuICAgICNpZiAke2RlZmluZXMuTU9SUEhUQVJHRVRTX1RFWFRVUkV9XHJcbiAgICAgICAgLy91bmlmb3JtIHNhbXBsZXIyREFycmF5IG1vcnBoVGFyZ2V0c1RleHR1cmU7XHJcbiAgICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKCR7XHJcbiAgICAgICAgICBkZWZpbmVzLm1vcnBoVGFyZ2V0c1RleHR1cmVCaW5kaW5nXHJcbiAgICAgICAgfSkgdmFyIG1vcnBoVGFyZ2V0c1RleHR1cmU6IHRleHR1cmVfMmRfYXJyYXk8ZjMyPjtcclxuICAgICNlbmRpZlxyXG5cclxuICAgIHN0cnVjdCBWZXJ0ZXhJbnB1dCB7XHJcbiAgICAgICAgQGxvY2F0aW9uKDApIHBvc2l0aW9uOiB2ZWMzPGYzMj4sICBcclxuXHJcbiAgICAgICAgQGxvY2F0aW9uKDEpIG5vcm1hbDogdmVjMzxmMzI+LFxyXG5cclxuICAgICAgICBAbG9jYXRpb24oMikgdXY6IHZlYzI8ZjMyPixcclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9MSUdIVFRFWFRVUkUgfHwgZGVmaW5lcy5VU0VfQU9URVhUVVJFfVxyXG4gICAgICAgICAgICBAbG9jYXRpb24oJHtkZWZpbmVzLnV2MkxvY2F0aW9ufSkgdXYyOnZlYzI8ZjMyPixcclxuICAgICAgICAjZW5kaWZcclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9JTlNUQU5DSU5HfVxyXG4gICAgICAgICAgICBAbG9jYXRpb24oJHtcclxuICAgICAgICAgICAgICBkZWZpbmVzLmluc3RhbmNlTWF0cml4TG9jYXRpb25cclxuICAgICAgICAgICAgfSkgaW5zdGFuY2VNYXRyaXg6bWF0NHg0PGYzMj4sXHJcbiAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfSU5TVEFOQ0lOR19DT0xPUn1cclxuICAgICAgICAgICAgQGxvY2F0aW9uKCR7ZGVmaW5lcy5pbnN0YW5jZUNvbG9yTG9jYXRpb259KSBpbnN0YW5jZUNvbG9yOnZlYzM8ZjMyPixcclxuICAgICAgICAjZW5kaWZcclxuICAgICAgICBcclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9UQU5HRU5UfVxyXG4gICAgICAgICAgICBAbG9jYXRpb24oJHtkZWZpbmVzLnRhbmdlbnRMb2NhdGlvbn0pIHRhbmdlbnQ6dmVjNDxmMzI+LFxyXG4gICAgICAgICNlbmRpZlxyXG4gICAgICAgICNpZiAke2RlZmluZXMuVVNFX0NPTE9SX0FMUEhBfVxyXG4gICAgICAgICAgICBAbG9jYXRpb24oJHtkZWZpbmVzLmNvbG9yTG9jYXRpb259KSBjb2xvcjp2ZWM0PGYzMj4sXHJcbiAgICAgICAgI2VsaWYgJHtkZWZpbmVzLlVTRV9DT0xPUn1cclxuICAgICAgICAgICAgQGxvY2F0aW9uKCR7ZGVmaW5lcy5jb2xvckxvY2F0aW9ufSkgY29sb3I6dmVjMzxmMzI+LFxyXG4gICAgICAgICNlbmRpZlxyXG5cclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9NT1JQSFRBUkdFVFMgJiYgIWRlZmluZXMuTU9SUEhUQVJHRVRTX1RFWFRVUkV9XHJcbiAgICAgICAgICAgIEBsb2NhdGlvbigke2RlZmluZXMubW9ycGhUYXJnZXQwTG9jYXRpb259KSBtb3JwaFRhcmdldDA6dmVjMzxmMzI+LFxyXG5cclxuICAgICAgICAgICAgQGxvY2F0aW9uKCR7ZGVmaW5lcy5tb3JwaFRhcmdldDFMb2NhdGlvbn0pIG1vcnBoVGFyZ2V0MTp2ZWMzPGYzMj4sXHJcblxyXG4gICAgICAgICAgICBAbG9jYXRpb24oJHtkZWZpbmVzLm1vcnBoVGFyZ2V0MkxvY2F0aW9ufSkgbW9ycGhUYXJnZXQyOnZlYzM8ZjMyPixcclxuXHJcbiAgICAgICAgICAgIEBsb2NhdGlvbigke2RlZmluZXMubW9ycGhUYXJnZXQzTG9jYXRpb259KSBtb3JwaFRhcmdldDM6dmVjMzxmMzI+LFxyXG4gICAgICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9NT1JQSE5PUk1BTFN9XHJcbiAgICAgICAgICAgICAgICBAbG9jYXRpb24oJHtcclxuICAgICAgICAgICAgICAgICAgZGVmaW5lcy5tb3JwaE5vcm1hbDBMb2NhdGlvblxyXG4gICAgICAgICAgICAgICAgfSkgbW9ycGhOb3JtYWwwOnZlYzM8ZjMyPixcclxuXHJcbiAgICAgICAgICAgICAgICBAbG9jYXRpb24oJHtcclxuICAgICAgICAgICAgICAgICAgZGVmaW5lcy5tb3JwaE5vcm1hbDFMb2NhdGlvblxyXG4gICAgICAgICAgICAgICAgfSkgbW9ycGhOb3JtYWwxOnZlYzM8ZjMyPixcclxuXHJcbiAgICAgICAgICAgICAgICBAbG9jYXRpb24oJHtcclxuICAgICAgICAgICAgICAgICAgZGVmaW5lcy5tb3JwaE5vcm1hbDJMb2NhdGlvblxyXG4gICAgICAgICAgICAgICAgfSkgbW9ycGhOb3JtYWwyOnZlYzM8ZjMyPixcclxuXHJcbiAgICAgICAgICAgICAgICBAbG9jYXRpb24oJHtcclxuICAgICAgICAgICAgICAgICAgZGVmaW5lcy5tb3JwaE5vcm1hbDNMb2NhdGlvblxyXG4gICAgICAgICAgICAgICAgfSkgbW9ycGhOb3JtYWwzOnZlYzM8ZjMyPixcclxuICAgICAgICAgICAgI2Vsc2VcclxuICAgICAgICAgICAgICAgIEBsb2NhdGlvbigke1xyXG4gICAgICAgICAgICAgICAgICBkZWZpbmVzLm1vcnBoVGFyZ2V0NExvY2F0aW9uXHJcbiAgICAgICAgICAgICAgICB9KSBtb3JwaFRhcmdldDQ6dmVjMzxmMzI+LFxyXG5cclxuICAgICAgICAgICAgICAgIEBsb2NhdGlvbigke1xyXG4gICAgICAgICAgICAgICAgICBkZWZpbmVzLm1vcnBoVGFyZ2V0NUxvY2F0aW9uXHJcbiAgICAgICAgICAgICAgICB9KSBtb3JwaFRhcmdldDU6dmVjMzxmMzI+LFxyXG5cclxuICAgICAgICAgICAgICAgIEBsb2NhdGlvbigke1xyXG4gICAgICAgICAgICAgICAgICBkZWZpbmVzLm1vcnBoVGFyZ2V0NkxvY2F0aW9uXHJcbiAgICAgICAgICAgICAgICB9KSBtb3JwaFRhcmdldDY6dmVjMzxmMzI+LFxyXG5cclxuICAgICAgICAgICAgICAgIEBsb2NhdGlvbigke1xyXG4gICAgICAgICAgICAgICAgICBkZWZpbmVzLm1vcnBoVGFyZ2V0N0xvY2F0aW9uXHJcbiAgICAgICAgICAgICAgICB9KSBtb3JwaFRhcmdldDc6dmVjMzxmMzI+LFxyXG4gICAgICAgICAgICAjZW5kaWZcclxuICAgICAgICAjZW5kaWZcclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9TS0lOTklOR31cclxuICAgICAgICAgICAgQGxvY2F0aW9uKCR7ZGVmaW5lcy5za2luSW5kZXhMb2NhdGlvbn0pIHNraW5JbmRleDp2ZWM0PGYzMj4sXHJcbiAgICAgICAgICAgIEBsb2NhdGlvbigke2RlZmluZXMuc2tpbldlaWdodExvY2F0aW9ufSkgc2tpbldlaWdodDp2ZWM0PGYzMj4sXHJcbiAgICAgICAgI2VuZGlmXHJcbiAgfVxyXG5cclxuICAgICNpZiAke2RlZmluZXMuTU9SUEhUQVJHRVRTX1RFWFRVUkV9XHJcbiAgICAgICAgZm4gZ2V0TW9ycGgoIHZlcnRleEluZGV4OnUzMiwgbW9ycGhUYXJnZXRJbmRleDp1MzIsb2Zmc2V0OnUzMiApLT52ZWM0PGYzMj4ge1xyXG4gICAgICAgICAgICBsZXQgdGV4ZWxJbmRleDp1MzIgPSB2ZXJ0ZXhJbmRleCAqIE1PUlBIVEFSR0VUU19URVhUVVJFX1NUUklERSArIG9mZnNldDtcclxuICAgICAgICAgICAgbGV0IHk6dTMyID0gdGV4ZWxJbmRleCAvIG1hdGVyaWFsVW5pZm9ybS5tb3JwaFRhcmdldHNUZXh0dXJlU2l6ZS54O1xyXG4gICAgICAgICAgICBsZXQgeDp1MzIgPSB0ZXhlbEluZGV4IC0geSAqIG1hdGVyaWFsVW5pZm9ybS5tb3JwaFRhcmdldHNUZXh0dXJlU2l6ZS54O1xyXG4gICAgICAgICAgICBsZXQgbW9ycGhVVjp2ZWMzPHUzMj4gPSB2ZWMzPHUzMj4oIHgsIHksIG1vcnBoVGFyZ2V0SW5kZXggKTtcclxuICAgICAgICAgICAgLy90ZXh0dXJlTG9hZFxyXG4gICAgICAgICAgICAvL3JldHVybiB0ZXhlbEZldGNoKCBtb3JwaFRhcmdldHNUZXh0dXJlLCBtb3JwaFVWLCAwICk7XHJcbiAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlTG9hZCggbW9ycGhUYXJnZXRzVGV4dHVyZSwgbW9ycGhVViwgMCApO1xyXG4gICAgICAgIH1cclxuICAgICNlbmRpZlxyXG4gICAgI2lmICR7ZGVmaW5lcy5VU0VfU0tJTk5JTkd9XHJcbiAgICAgICAgZm4gZ2V0Qm9uZU1hdHJpeCggaTpmMzIgKS0+bWF0NHg0PGYzMj4ge1xyXG4gICAgICAgICAgICBsZXQgajpmMzIgPSBpICogNC4wO1xyXG4gICAgICAgICAgICBsZXQgeDpmMzIgPSBqJWYzMiggbWF0ZXJpYWxVbmlmb3JtLmJvbmVUZXh0dXJlU2l6ZSApO1xyXG4gICAgICAgICAgICBsZXQgeTpmMzIgPSBmbG9vciggaiAvIGYzMiggbWF0ZXJpYWxVbmlmb3JtLmJvbmVUZXh0dXJlU2l6ZSApICk7XHJcbiAgICAgICAgICAgIGxldCBkeDpmMzIgPSAxLjAgLyBmMzIoIG1hdGVyaWFsVW5pZm9ybS5ib25lVGV4dHVyZVNpemUgKTtcclxuICAgICAgICAgICAgbGV0IGR5OmYzMiA9IDEuMCAvIGYzMiggbWF0ZXJpYWxVbmlmb3JtLmJvbmVUZXh0dXJlU2l6ZSApO1xyXG4gICAgICAgICAgICB5ID0gZHkgKiAoIHkgKyAwLjUgKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCB2MTp2ZWM0PGYzMj4gPSB0ZXh0dXJlU2FtcGxlKGJvbmVUZXh0dXJlLCBiYXNlU2FtcGxlciwgdmVjMjxmMzI+KCBkeCAqICggeCArIDAuNSApLCB5ICkgKTtcclxuICAgICAgICAgICAgbGV0IHYyOnZlYzQ8ZjMyPiA9IHRleHR1cmVTYW1wbGUoYm9uZVRleHR1cmUsIGJhc2VTYW1wbGVyLCB2ZWMyPGYzMj4oIGR4ICogKCB4ICsgMS41ICksIHkgKSApO1xyXG4gICAgICAgICAgICBsZXQgdjM6dmVjNDxmMzI+ID0gdGV4dHVyZVNhbXBsZShib25lVGV4dHVyZSwgYmFzZVNhbXBsZXIsIHZlYzI8ZjMyPiggZHggKiAoIHggKyAyLjUgKSwgeSApICk7XHJcbiAgICAgICAgICAgIGxldCB2NDp2ZWM0PGYzMj4gPSB0ZXh0dXJlU2FtcGxlKGJvbmVUZXh0dXJlLCBiYXNlU2FtcGxlciwgdmVjMjxmMzI+KCBkeCAqICggeCArIDMuNSApLCB5ICkgKTtcclxuICAgICAgICAgICAgbGV0IGJvbmU6bWF0NHg0PGYzMj4gPSBtYXQ0eDQ8ZjMyPiggdjEsIHYyLCB2MywgdjQgKTtcclxuICAgICAgICAgICAgcmV0dXJuIGJvbmU7XHJcbiAgICAgICAgfVxyXG4gICAgI2VuZGlmXHJcblxyXG4gICAgQGJpbmRpbmcoMCkgQGdyb3VwKDApIHZhcjx1bmlmb3JtPiBtYXRlcmlhbFVuaWZvcm0gOiBNYXRlcmlhbFVuaWZvcm07XHJcbiAgICBAYmluZGluZygwKSBAZ3JvdXAoMSkgdmFyPHVuaWZvcm0+IGdsb2JhbFVuaWZvcm0gOiBHbG9iYWxVbmlmb3JtO1xyXG4gICAgQHZlcnRleFxyXG4gICAgZm4gbWFpbihpbnB1dDpWZXJ0ZXhJbnB1dCktPlZlcnRleE91dHB1dCB7XHJcbiAgICAgICAgdmFyIHZlcnRleE91dHB1dDpWZXJ0ZXhPdXRwdXQ7XHJcbiAgICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfVEVYVFVSRX1cclxuICAgICAgICAgICAgdmVydGV4T3V0cHV0LnZVdiA9IGlucHV0LnV2O1xyXG4gICAgICAgICNlbmRpZlxyXG4gICAgICAgICNpZiAke2RlZmluZXMuVVNFX0xJR0hUVEVYVFVSRSB8fCBkZWZpbmVzLlVTRV9BT1RFWFRVUkV9XHJcbiAgICAgICAgICAgIHZlcnRleE91dHB1dC52VXYyIGlucHV0LnV2MjtcclxuICAgICAgICAjZW5kaWZcclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9DT0xPUl9BTFBIQX1cclxuICAgICAgICAgICAgdmVydGV4T3V0cHV0LnZDb2xvciA9IHZlYzQoIDEuMCApO1xyXG4gICAgICAgICAgICAjZWxpZiAke2RlZmluZXMuVVNFX0NPTE9SIHx8IGRlZmluZXMuVVNFX0lOU1RBTkNJTkdfQ09MT1J9XHJcbiAgICAgICAgICAgIHZlcnRleE91dHB1dC52Q29sb3IgPSB2ZWMzKCAxLjAgKTtcclxuICAgICAgICAjZW5kaWZcclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9DT0xPUn1cclxuICAgICAgICAgICAgdmVydGV4T3V0cHV0LnZDb2xvciAqPSBpbnB1dC5jb2xvcjtcclxuICAgICAgICAjZW5kaWZcclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9JTlNUQU5DSU5HX0NPTE9SfVxyXG4gICAgICAgICAgICB2ZXJ0ZXhPdXRwdXQudkNvbG9yLnh5eiAqPSBpbnB1dC5pbnN0YW5jZUNvbG9yLnh5ejtcclxuICAgICAgICAjZW5kaWZcclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9NT1JQSENPTE9SUyAmJiBkZWZpbmVzLk1PUlBIVEFSR0VUU19URVhUVVJFfVxyXG4gICAgICAgICAgICB2ZXJ0ZXhPdXRwdXQudkNvbG9yICo9IG1hdGVyaWFsVW5pZm9ybS5tb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgOiB1MzIgPSAwdTsgaSA8IG1hdGVyaWFsVW5pZm9ybS5NT1JQSFRBUkdFVFNfQ09VTlQ7IGkgPSBpICsgMXUgKSB7XHJcbiAgICAgICAgICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9DT0xPUl9BTFBIQX1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIG1hdGVyaWFsVW5pZm9ybS5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXSAhID0gMC4wICkgdmVydGV4T3V0cHV0LnZDb2xvciArPSBnZXRNb3JwaCggZ2xfVmVydGV4SUQsIGksIDIgKSAqIG1hdGVyaWFsVW5pZm9ybS5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXTtcclxuICAgICAgICAgICAgICAgICAgICAjZWxpZiAke2RlZmluZXMuVVNFX0NPTE9SfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICggbWF0ZXJpYWxVbmlmb3JtLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdICEgPSAwLjAgKSB2ZXJ0ZXhPdXRwdXQudkNvbG9yICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMiApLnJnYiAqIG1hdGVyaWFsVW5pZm9ybS5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXTtcclxuICAgICAgICAgICAgICAgICNlbmRpZlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgdmFyIG9iamVjdE5vcm1hbDp2ZWMzPGYzMj4gPSB2ZWMzPGYzMj4oaW5wdXQubm9ybWFsKTtcclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9UQU5HRU5UfVxyXG4gICAgICAgICAgICBsZXQgb2JqZWN0VGFuZ2VudDp2ZWMzPGYzMj4gPSB2ZWMzPGYzMj4oIGlucHV0LnRhbmdlbnQueHl6ICk7XHJcbiAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfTU9SUEhOT1JNQUxTfVxyXG4gICAgICAgICAgICBvYmplY3ROb3JtYWwgKj0gbWF0ZXJpYWxVbmlmb3JtLm1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZTtcclxuICAgICAgICAgICAgI2lmICR7ZGVmaW5lcy5NT1JQSFRBUkdFVFNfVEVYVFVSRX1cclxuICAgICAgICAgICAgICAgIGZvciAoIGxldCBpIDogdTMyID0gMHU7IGkgPCBtYXRlcmlhbFVuaWZvcm0uTU9SUEhUQVJHRVRTX0NPVU5UOyBpID0gaSArIDF1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCBtYXRlcmlhbFVuaWZvcm0ubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF0gISA9IDAuMCApIG9iamVjdE5vcm1hbCArPSBnZXRNb3JwaCggZ2xfVmVydGV4SUQsIGksIDEgKS54eXogKiBtYXRlcmlhbFVuaWZvcm0ubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICNlbHNlXHJcbiAgICAgICAgICAgICAgICBvYmplY3ROb3JtYWwgKz0gbW9ycGhOb3JtYWwwICogbWF0ZXJpYWxVbmlmb3JtLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xyXG4gICAgICAgICAgICAgICAgb2JqZWN0Tm9ybWFsICs9IG1vcnBoTm9ybWFsMSAqIG1hdGVyaWFsVW5pZm9ybS5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcclxuICAgICAgICAgICAgICAgIG9iamVjdE5vcm1hbCArPSBtb3JwaE5vcm1hbDIgKiBtYXRlcmlhbFVuaWZvcm0ubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XHJcbiAgICAgICAgICAgICAgICBvYmplY3ROb3JtYWwgKz0gbW9ycGhOb3JtYWwzICogbWF0ZXJpYWxVbmlmb3JtLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xyXG4gICAgICAgICAgICAjZW5kaWZcclxuICAgICAgICAjZW5kaWZcclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9TS0lOTklOR31cclxuICAgICAgICAgICAgbGV0IGJvbmVNYXRYOm1hdDR4NDxmMzI+ID0gZ2V0Qm9uZU1hdHJpeCggaW5wdXQuc2tpbkluZGV4LnggKTtcclxuICAgICAgICAgICAgbGV0IGJvbmVNYXRZOm1hdDR4NDxmMzI+ID0gZ2V0Qm9uZU1hdHJpeCggaW5wdXQuc2tpbkluZGV4LnkgKTtcclxuICAgICAgICAgICAgbGV0IGJvbmVNYXRaOm1hdDR4NDxmMzI+ID0gZ2V0Qm9uZU1hdHJpeCggaW5wdXQuc2tpbkluZGV4LnogKTtcclxuICAgICAgICAgICAgbGV0IGJvbmVNYXRXOm1hdDR4NDxmMzI+ID0gZ2V0Qm9uZU1hdHJpeCggaW5wdXQuc2tpbkluZGV4LncgKTtcclxuICAgICAgICAjZW5kaWZcclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9TS0lOTklOR31cclxuICAgICAgICAgICAgbGV0IHNraW5NYXRyaXg6bWF0NHg0PGYzMj4gPSBtYXQ0eDQ8ZjMyPiggMC4wICk7XHJcbiAgICAgICAgICAgIHNraW5NYXRyaXggKz0gaW5wdXQuc2tpbldlaWdodC54ICogYm9uZU1hdFg7XHJcbiAgICAgICAgICAgIHNraW5NYXRyaXggKz0gaW5wdXQuc2tpbldlaWdodC55ICogYm9uZU1hdFk7XHJcbiAgICAgICAgICAgIHNraW5NYXRyaXggKz0gaW5wdXQuc2tpbldlaWdodC56ICogYm9uZU1hdFo7XHJcbiAgICAgICAgICAgIHNraW5NYXRyaXggKz0gaW5wdXQuc2tpbldlaWdodC53ICogYm9uZU1hdFc7XHJcbiAgICAgICAgICAgIHNraW5NYXRyaXggPSBtYXRlcmlhbFVuaWZvcm0uYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0cml4ICogbWF0ZXJpYWxVbmlmb3JtLmJpbmRNYXRyaXg7XHJcbiAgICAgICAgICAgIG9iamVjdE5vcm1hbCA9IHZlYzQ8ZjMyPiggc2tpbk1hdHJpeCAqIHZlYzQ8ZjMyPiggb2JqZWN0Tm9ybWFsLCAwLjAgKSApLnh5ejtcclxuICAgICAgICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfVEFOR0VOVH1cclxuICAgICAgICAgICAgICAgIG9iamVjdFRhbmdlbnQgPSB2ZWM0PGYzMj4oIHNraW5NYXRyaXggKiB2ZWM0PGYzMj4oIG9iamVjdFRhbmdlbnQsIDAuMCApICkueHl6O1xyXG4gICAgICAgICAgICAjZW5kaWZcclxuICAgICAgICAjZW5kaWZcclxuICAgICAgICB2YXIgdHJhbnNmb3JtZWROb3JtYWw6dmVjMzxmMzI+ID0gb2JqZWN0Tm9ybWFsO1xyXG4gICAgICAgIC8vIHRyYW5zZm9ybWVkTm9ybWFsKz12ZWMzPGYzMj4oMC4wKTtcclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9JTlNUQU5DSU5HfVxyXG4gICAgICAgICAgICBsZXQgbTptYXQzeDM8ZjMyPiA9IG1hdDN4MzxmMzI+KCBpbnB1dC5pbnN0YW5jZU1hdHJpeCApO1xyXG4gICAgICAgICAgICB0cmFuc2Zvcm1lZE5vcm1hbCAvPSB2ZWMzPGYzMj4oIGRvdCggbVsgMCBdLCBtWyAwIF0gKSwgZG90KCBtWyAxIF0sIG1bIDEgXSApLCBkb3QoIG1bIDIgXSwgbVsgMiBdICkgKTtcclxuICAgICAgICAgICAgdHJhbnNmb3JtZWROb3JtYWwgPSBtICogdHJhbnNmb3JtZWROb3JtYWw7XHJcbiAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgdHJhbnNmb3JtZWROb3JtYWwgPSBtYXRlcmlhbFVuaWZvcm0ubm9ybWFsTWF0cml4ICogdHJhbnNmb3JtZWROb3JtYWw7XHJcbiAgICAgICAgI2lmICR7ZGVmaW5lcy5GTElQX1NJREVEfVxyXG4gICAgICAgICAgICB0cmFuc2Zvcm1lZE5vcm1hbCA9IC0gdHJhbnNmb3JtZWROb3JtYWw7XHJcbiAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfVEFOR0VOVH1cclxuICAgICAgICAgICAgbGV0IHRyYW5zZm9ybWVkVGFuZ2VudDp2ZWMzPGYzMj4gPSAoZ2xvYmFsVW5pZm9ybS52aWV3TWF0cml4Km1hdGVyaWFsVW5pZm9ybS5tb2RlbE1hdHJpeCAqIHZlYzQ8ZjMyPiggb2JqZWN0VGFuZ2VudCwgMC4wICkgKS54eXo7XHJcbiAgICAgICAgICAgICNpZiAke2RlZmluZXMuRkxJUF9TSURFRH1cclxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkVGFuZ2VudCA9IC0gdHJhbnNmb3JtZWRUYW5nZW50O1xyXG4gICAgICAgICAgICAjZW5kaWZcclxuICAgICAgICAjZW5kaWZcclxuICAgICAgICB2ZXJ0ZXhPdXRwdXQudk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcclxuICAgICAgICAjaWYgJHtkZWZpbmVzLkZMQVRfU0hBREVEfVxyXG4gICAgICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9UQU5HRU5UfVxyXG4gICAgICAgICAgICAgICAgdlRhbmdlbnQgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xyXG4gICAgICAgICAgICAgICAgdkJpdGFuZ2VudCA9IG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiBpbnB1dC50YW5nZW50LncgKTtcclxuICAgICAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgbGV0IHRyYW5zZm9ybWVkOnZlYzM8ZjMyPiA9IHZlYzM8ZjMyPiggaW5wdXQucG9zaXRpb24gKTtcclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9NT1JQSFRBUkdFVFN9XHJcbiAgICAgICAgICAgIHRyYW5zZm9ybWVkICo9IG1hdGVyaWFsVW5pZm9ybS5tb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7XHJcbiAgICAgICAgICAgICNpZiAke2RlZmluZXMuTU9SUEhUQVJHRVRTX1RFWFRVUkV9XHJcbiAgICAgICAgICAgICAgICBmb3IgKCBsZXQgaSA6IHUzMiA9IDB1OyBpIDwgbWF0ZXJpYWxVbmlmb3JtLk1PUlBIVEFSR0VUU19DT1VOVDsgaSA9IGkgKyAxdSApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIG1hdGVyaWFsVW5pZm9ybS5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXSAhID0gMC4wICkgdHJhbnNmb3JtZWQgKz0gZ2V0TW9ycGgoIGdsX1ZlcnRleElELCBpLCAwICkueHl6ICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICNlbHNlXHJcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCArPSBpbnB1dC5tb3JwaFRhcmdldDAgKiBtYXRlcmlhbFVuaWZvcm0ubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XHJcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCArPSBpbnB1dC5tb3JwaFRhcmdldDEgKiBtYXRlcmlhbFVuaWZvcm0ubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07XHJcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCArPSBpbnB1dC5tb3JwaFRhcmdldDIgKiBtYXRlcmlhbFVuaWZvcm0ubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XHJcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCArPSBpbnB1dC5tb3JwaFRhcmdldDMgKiBtYXRlcmlhbFVuaWZvcm0ubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XHJcbiAgICAgICAgICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9NT1JQSE5PUk1BTFN9XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWQgKz0gaW5wdXQubW9ycGhUYXJnZXQ0ICogbWF0ZXJpYWxVbmlmb3JtLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkICs9IGlucHV0Lm1vcnBoVGFyZ2V0NSAqIG1hdGVyaWFsVW5pZm9ybS5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIDUgXTtcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCArPSBpbnB1dC5tb3JwaFRhcmdldDYgKiBtYXRlcmlhbFVuaWZvcm0ubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA2IF07XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWQgKz0gaW5wdXQubW9ycGhUYXJnZXQ3ICogbWF0ZXJpYWxVbmlmb3JtLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNyBdO1xyXG4gICAgICAgICAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgICAgICNlbmRpZlxyXG4gICAgICAgICNlbmRpZlxyXG4gICAgICAgICNpZiAke2RlZmluZXMuVVNFX1NLSU5OSU5HfVxyXG4gICAgICAgICAgICBsZXQgc2tpblZlcnRleDp2ZWM0PGYzMj4gPSBtYXRlcmlhbFVuaWZvcm0uYmluZE1hdHJpeCAqIHZlYzQ8ZjMyPiggdHJhbnNmb3JtZWQsIDEuMCApO1xyXG4gICAgICAgICAgICBsZXQgc2tpbm5lZDp2ZWM0PGYzMj4gPSB2ZWM0PGYzMj4oIDAuMCApO1xyXG4gICAgICAgICAgICBza2lubmVkICs9IGJvbmVNYXRYICogc2tpblZlcnRleCAqIGlucHV0LnNraW5XZWlnaHQueDtcclxuICAgICAgICAgICAgc2tpbm5lZCArPSBib25lTWF0WSAqIHNraW5WZXJ0ZXggKiBpbnB1dC5za2luV2VpZ2h0Lnk7XHJcbiAgICAgICAgICAgIHNraW5uZWQgKz0gYm9uZU1hdFogKiBza2luVmVydGV4ICogaW5wdXQuc2tpbldlaWdodC56O1xyXG4gICAgICAgICAgICBza2lubmVkICs9IGJvbmVNYXRXICogc2tpblZlcnRleCAqIGlucHV0LnNraW5XZWlnaHQudztcclxuICAgICAgICAgICAgdHJhbnNmb3JtZWQgPSAoIG1hdGVyaWFsVW5pZm9ybS5iaW5kTWF0cml4SW52ZXJzZSAqIHNraW5uZWQgKS54eXo7XHJcbiAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfRElTUExBQ0VNRU5UVEVYVFVSRX0gXHJcbiAgICAgICAgICAgIHRyYW5zZm9ybWVkICs9IG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAodGV4dHVyZVNhbXBsZShkaXNwbGFjZW1lbnRNYXAsIGJhc2VTYW1wbGVyLCB2VXYpLnggKiBtYXRlcmlhbFVuaWZvcm0uZGlzcGxhY2VtZW50U2NhbGUgKyBtYXRlcmlhbFVuaWZvcm0uZGlzcGxhY2VtZW50QmlhcyApO1xyXG4gICAgICAgICNlbmRpZlxyXG4gICAgICAgIHZhciBtdlBvc2l0aW9uOnZlYzQ8ZjMyPiA9IHZlYzQ8ZjMyPiggdHJhbnNmb3JtZWQsIDEuMCApO1xyXG4gICAgICAgICNpZiAke2RlZmluZXMuVVNFX0lOU1RBTkNJTkd9XHJcbiAgICAgICAgICAgIG12UG9zaXRpb24gPSBpbnB1dC5pbnN0YW5jZU1hdHJpeCAqIG12UG9zaXRpb247XHJcbiAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgbXZQb3NpdGlvbiA9IGdsb2JhbFVuaWZvcm0udmlld01hdHJpeCptYXRlcmlhbFVuaWZvcm0ubW9kZWxNYXRyaXggKiBtdlBvc2l0aW9uO1xyXG4gICAgICAgIHZlcnRleE91dHB1dC5wb3NpdGlvbiA9IGdsb2JhbFVuaWZvcm0ucHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247XHJcbiAgICAgICAgdmVydGV4T3V0cHV0LnZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6L212UG9zaXRpb24udztcclxuICAgICAgICAjaWYgJHtcclxuICAgICAgICAgIGRlZmluZXMuVVNFX0VOVlRFWFRVUkUgfHwgZGVmaW5lcy5ESVNUQU5DRSB8fCBkZWZpbmVzLlVTRV9UUkFOU01JU1NJT05cclxuICAgICAgICB9IFxyXG4gICAgICAgICAgICB2YXIgd29ybGRQb3NpdGlvbjp2ZWM0PGYzMj4gPSB2ZWM0PGYzMj4oIHRyYW5zZm9ybWVkLCAxLjAgKTtcclxuICAgICAgICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfSU5TVEFOQ0lOR31cclxuICAgICAgICAgICAgICAgIHdvcmxkUG9zaXRpb24gPSBpbnB1dC5pbnN0YW5jZU1hdHJpeCAqIHdvcmxkUG9zaXRpb247XHJcbiAgICAgICAgICAgICNlbmRpZlxyXG4gICAgICAgICAgICB3b3JsZFBvc2l0aW9uID0gbWF0ZXJpYWxVbmlmb3JtLm1vZGVsTWF0cml4ICogd29ybGRQb3NpdGlvbjtcclxuICAgICAgICAjZW5kaWZcclxuICAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9UUkFOU01JU1NJT059XHJcbiAgICAgICAgICAgIHZlcnRleE91dHB1dC52V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6O1xyXG4gICAgICAgICNlbmRpZlxyXG4gICAgICAgIHJldHVybiB2ZXJ0ZXhPdXRwdXQ7XHJcbiAgICB9XHJcbiAgICBgO1xyXG59XHJcbiIsImV4cG9ydCBkZWZhdWx0IGAgIFxuICAgIHN0cnVjdCBNYXRlcmlhbFVuaWZvcm0ge1xuICAgICAgbW9kZWxNYXRyaXg6IG1hdDR4NDxmMzI+LFxuICAgICAgY29sb3I6IHZlYzM8ZjMyPixcbiAgICAgIG9wYWNpdHk6ZjMyLFxuICAgICAgbm9ybWFsTWF0cml4OiBtYXQ0eDQ8ZjMyPixcbiAgICAgIGVtaXNzaXZlOnZlYzM8ZjMyPixcbiAgICAgIHNoaW5pbmVzczpmMzIsXG4gICAgICBzcGVjdWxhcjp2ZWMzPGYzMj4sICAgICAgXG4gICB9XG4gICAgI2luY2x1ZGUgPEZyYWdJbnB1dD5cbiAgICAjaW5jbHVkZSA8U3lzdGVtVW5pZm9ybT5cbiAgICAjaW5jbHVkZSA8VGV4dHVyZUFuZFNhbXBsZXJEZWZpbmU+XG4gICAgI2luY2x1ZGUgPGxpZ2h0PlxuICAgIEBiaW5kaW5nKHBob25nQmluZGluZykgQGdyb3VwKDApIHZhcjx1bmlmb3JtPiBtYXRlcmlhbFVuaWZvcm0gOiBNYXRlcmlhbFVuaWZvcm07XG4gICAgQGJpbmRpbmcoY2FtZXJhQmluZGluZykgQGdyb3VwKDEpIHZhcjx1bmlmb3JtPiBzeXN0ZW1Vbmlmb3JtIDogU3lzdGVtVW5pZm9ybTtcbiAgICBAZnJhZ21lbnRcbiAgICBmbiBtYWluKGlucHV0OkZyYWdJbnB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgICAgIHZhciB0b3RhbEVtaXNzaXZlUmFkaWFuY2U6dmVjMzxmMzI+ID0gbWF0ZXJpYWxVbmlmb3JtLmVtaXNzaXZlO1xuICAgICAgICB2YXIgY29sb3I6dmVjNDxmMzI+O1xuICAgICAgICAjaWYgVVNFX0NPTE9SVEVYVFVSRVxuICAgICAgICAgICAgY29sb3I9IHZlYzQ8ZjMyPih0ZXh0dXJlU2FtcGxlKGJhc2VDb2xvclRleHR1cmUsIGJhc2VDb2xvclNhbXBsZXIsIGlucHV0LnV2KS5yZ2IrbWF0ZXJpYWxVbmlmb3JtLmNvbG9yLG1hdGVyaWFsVW5pZm9ybS5vcGFjaXR5KTtcbiAgICAgICAgI2Vsc2VcbiAgICAgICAgICAgIGNvbG9yPXZlYzQ8ZjMyPihtYXRlcmlhbFVuaWZvcm0uY29sb3IsbWF0ZXJpYWxVbmlmb3JtLm9wYWNpdHkpO1xuICAgICAgICAjZW5kaWYgICAgIFxuICAgICAgICBsZXQgIHY6dmVjMzxmMzI+ID0gIG5vcm1hbGl6ZSggc3lzdGVtVW5pZm9ybS5jYW1lcmFQb3NpdGlvbiAtIGlucHV0LndvcmxkUG9zKTtcbiAgICAgICAgI2lmIFVTRV9OT1JNQUxURVhUVVJFXG4gICAgICAgICAgICBsZXQgbjp2ZWMzPGYzMj4gPSBnZXROb3JtYWxCeU5vcm1hbFRleHR1cmUoaW5wdXQpOyAgXG4gICAgICAgICNlbHNlXG4gICAgICAgICAgICBsZXQgbjp2ZWMzPGYzMj4gPSBnZXROb3JtYWwoaW5wdXQpO1xuICAgICAgICAjZW5kaWZcbiAgICAgICAgdmFyIGdlb21ldHJ5Okdlb21ldHJ5O1xuICAgICAgICBnZW9tZXRyeS5ub3JtYWw9bjtcbiAgICAgICAgZ2VvbWV0cnkudmlld0Rpcj12O1xuICAgICAgICBnZW9tZXRyeS5wb3NpdGlvbj1pbnB1dC53b3JsZFBvcztcbiAgICAgICAgbGV0IGxpZ2h0Q29sb3I6UmVmbGVjdGVkTGlnaHQ9cGFyc2VMaWdodHMoZ2VvbWV0cnksbWF0ZXJpYWxVbmlmb3JtLnNoaW5pbmVzcyk7XG4gICAgICAgIC8vIHZhciBmaW5uYWxDb2xvcjp2ZWMzPGYzMj49Y29sb3IueHl6ICsgKGxpZ2h0Q29sb3IuZGlyZWN0RGlmZnVzZSArIGxpZ2h0Q29sb3IuZGlyZWN0U3BlY3VsYXIgKyBsaWdodENvbG9yLmFtYmllbnQpO1xuICAgICAgICB2YXIgZmlubmFsQ29sb3I6dmVjMzxmMzI+PWNvbG9yLnh5eiAqIChsaWdodENvbG9yLmRpcmVjdERpZmZ1c2UgKyBsaWdodENvbG9yLmRpcmVjdFNwZWN1bGFyICsgbGlnaHRDb2xvci5hbWJpZW50KTtcblxuICAgICAgICAvLyBmaW5uYWxDb2xvciA9IGxpZ2h0Q29sb3IudGVzdENvbG9yLnh5ejtcblxuICAgICAgICByZXR1cm4gdmVjNDxmMzI+KGZpbm5hbENvbG9yLGNvbG9yLmEpO1xuICAgIH1gO1xuIiwiZXhwb3J0IGRlZmF1bHQgYFxuICAgICAgc3RydWN0IE1hdGVyaWFsVW5pZm9ybSB7XG4gICAgICAgICAgICBtb2RlbE1hdHJpeDogbWF0NHg0PGYzMj4sXG4gICAgICAgICAgICBjb2xvcjogdmVjMzxmMzI+LFxuICAgICAgICAgICAgb3BhY2l0eTpmMzIsXG4gICAgICAgICAgICBub3JtYWxNYXRyaXg6IG1hdDR4NDxmMzI+LFxuICAgICAgICAgICAgZW1pc3NpdmU6dmVjMzxmMzI+LFxuICAgICAgICAgICAgc3BlY3VsYXI6dmVjMzxmMzI+LFxuICAgICAgICAgICAgc2hpbmluZXNzOmYzMixcbiAgICAgIH1cbiAgICAgICNpbmNsdWRlIDxWZXJ0ZXhPdXRwdXQ+XG4gICAgICAjaW5jbHVkZSA8U3lzdGVtVW5pZm9ybT5cbiAgICAgICNpbmNsdWRlIDxWZXJ0ZXhJbnB1dD5cbiAgICAgIEBiaW5kaW5nKHBob25nQmluZGluZykgQGdyb3VwKDApIHZhcjx1bmlmb3JtPiBzZWxmVW5pZm9ybSA6IE1hdGVyaWFsVW5pZm9ybTtcbiAgICAgIEBiaW5kaW5nKGNhbWVyYUJpbmRpbmcpIEBncm91cCgxKSB2YXI8dW5pZm9ybT4gc3lzdGVtVW5pZm9ybSA6IFN5c3RlbVVuaWZvcm07XG4gICAgICBAdmVydGV4XG4gICAgICBmbiBtYWluKGlucHV0OiBWZXJ0ZXhJbnB1dCkgLT4gVmVydGV4T3V0cHV0IHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQ6IFZlcnRleE91dHB1dDtcbiAgICAgICAgICAgICNpZiBIQVNfVVZcbiAgICAgICAgICAgICAgIG91dHB1dC51diA9IGlucHV0LnV2O1xuICAgICAgICAgICAgI2VuZGlmIFxuICAgICAgICAgICAgbGV0IG1vZGVsUG9zPXNlbGZVbmlmb3JtLm1vZGVsTWF0cml4ICp2ZWM0PGYzMj4oaW5wdXQucG9zaXRpb24sMS4wKTtcbiAgICAgICAgICAgIG91dHB1dC53b3JsZFBvcyA9IG1vZGVsUG9zLnh5ei9tb2RlbFBvcy53O1xuICAgICAgICAgICAgbGV0IHZOb3JtYWxWaWV3ID0gc2VsZlVuaWZvcm0ubm9ybWFsTWF0cml4ICogdmVjNDxmMzI+KGlucHV0Lm5vcm1hbCwwLjApO1xuICAgICAgICAgICAgb3V0cHV0Lm5vcm1hbCA9ICB2Tm9ybWFsVmlldy54eXo7XG4gICAgICAgICAgICBvdXRwdXQudmlldyA9IHN5c3RlbVVuaWZvcm0uY2FtZXJhUG9zaXRpb24ueHl6IC0gbW9kZWxQb3MueHl6O1xuICAgICAgICAgICAgbGV0IHZpZXdQb3NpdGlvbj1zeXN0ZW1Vbmlmb3JtLnZpZXdNYXRyaXggKiBtb2RlbFBvcztcbiAgICAgICAgICAgIG91dHB1dC52aWV3UG9zaXRpb24gPSAtdmlld1Bvc2l0aW9uLnh5ejtcbiAgICAgICAgICAgIG91dHB1dC5wb3NpdGlvbiA9IHN5c3RlbVVuaWZvcm0ucHJvamVjdGlvbk1hdHJpeCAqIHN5c3RlbVVuaWZvcm0udmlld01hdHJpeCAqIG1vZGVsUG9zO1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgIH1gO1xuIiwiZXhwb3J0IGNvbnN0IHBvaW50X2ZzID0gYFxuICAjaW5jbHVkZSA8UG9pbnRGcmFnSW5wdXQ+XG4gIHN0cnVjdCBTZWxmVW5pZm9ybSB7XG4gICAgbW9kZWxNYXRyaXg6IG1hdDR4NDxmMzI+LFxuICAgIGNvbG9yOnZlYzM8ZjMyPixcbiAgICBzaXplOmYzMixcbiAgICBvcGFjaXR5OmYzMixcbiAgfVxuICBAYmluZGluZyhwb2ludEJpbmRpbmcpIEBncm91cCgwKSB2YXI8dW5pZm9ybT4gc2VsZlVuaWZvcm0gOiBTZWxmVW5pZm9ybTtcbiAgI2lmIFVTRV9DT0xPUlRFWFRVUkVcbiAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoYmFzZUNvbG9yU2FtcGxlckJpbmRpbmcpIHZhciBiYXNlQ29sb3JTYW1wbGVyOiBzYW1wbGVyO1xuICAgIEBncm91cCgwKSBAYmluZGluZyhiYXNlQ29sb3JUZXh0dXJlQmluZGluZykgdmFyIGJhc2VDb2xvclRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbiAgI2VuZGlmXG4gIEBmcmFnbWVudFxuICBmbiBtYWluKGlucHV0OlBvaW50RnJhZ0lucHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbiAgICB2YXIgY29sb3I6dmVjNDxmMzI+PXZlYzQ8ZjMyPihzZWxmVW5pZm9ybS5jb2xvcixzZWxmVW5pZm9ybS5vcGFjaXR5KTtcbiAgICAjaWYgVVNFX0NPTE9SVEVYVFVSRVxuICAgICAgY29sb3I9dGV4dHVyZVNhbXBsZShiYXNlQ29sb3JUZXh0dXJlLCBiYXNlQ29sb3JTYW1wbGVyLCBpbnB1dC51dik7XG4gICAgI2VuZGlmXG4gICAgI2lmIEhBU19DT0xPUlxuICAgICAgY29sb3I9dmVjNDxmMzI+KGlucHV0LmNvbG9yLHNlbGZVbmlmb3JtLm9wYWNpdHkpO1xuICAgICNlbmRpZlxuICAgIHJldHVybiBjb2xvcjtcbiAgfVxuICBgO1xuIiwiZXhwb3J0IGNvbnN0IHBvaW50X3ZzID0gYFxuICAgICNpbmNsdWRlIDxQb2ludFZlcnRPdXRwdXQ+XG4gICAgI2luY2x1ZGUgPFN5c3RlbVVuaWZvcm0+XG4gICAgI2luY2x1ZGUgPFBvaW50VmVydElucHV0PlxuICAgIHN0cnVjdCBTZWxmVW5pZm9ybSB7XG4gICAgICBtb2RlbE1hdHJpeDogbWF0NHg0PGYzMj4sXG4gICAgICBjb2xvcjp2ZWMzPGYzMj4sXG4gICAgICBzaXplOmYzMixcbiAgICAgIG9wYWNpdHk6ZjMyLFxuICAgIH1cbiAgICBAYmluZGluZyhwb2ludEJpbmRpbmcpIEBncm91cCgwKSB2YXI8dW5pZm9ybT4gc2VsZlVuaWZvcm0gOiBTZWxmVW5pZm9ybTtcbiAgICBAYmluZGluZyhjYW1lcmFCaW5kaW5nKSBAZ3JvdXAoMSkgdmFyPHVuaWZvcm0+IHN5c3RlbVVuaWZvcm0gOiBTeXN0ZW1Vbmlmb3JtO1xuICAgIEB2ZXJ0ZXhcbiAgICAgIGZuIG1haW4oaW5wdXQ6IFBvaW50VmVydElucHV0KSAtPiBQb2ludFZlcnRPdXRwdXQge1xuICAgICAgdmFyIG91dHB1dDpQb2ludFZlcnRPdXRwdXQ7XG4gICAgICBsZXQgbXZQb3NpdGlvbjp2ZWM0PGYzMj49IHlzdGVtVW5pZm9ybS52aWV3TWF0cml4ICpzZWxmVW5pZm9ybS5tb2RlbE1hdHJpeCp2ZWM0PGYzMj4oMC4wLDAuMCwwLjAsIDEuMCApO1xuICAgICAgI2lmIEhBU19VVlxuICAgICAgICAgIG91dHB1dC51dj1pbnB1dC51djtcbiAgICAgICNlbmRpZlxuICAgICAgI2lmIEhBU19DT0xPUlxuICAgICAgICAgIG91dHB1dC5jb2xvcj1pbnB1dC5jb2xvcjtcbiAgICAgICNlbmRpZlxuICAgICAgI2lmIEhBU19TSVpFXG4gICAgICAgICAgb3V0cHV0LnNpemU9aW5wdXQuc2l6ZTtcbiAgICAgICNlbmRpZlxuICAgICAgdmVjMiBhbGlnbmVkUG9zaXRpb24gPSBpbnB1dC5wb3NpdGlvbi54eSogc2VsZlVuaWZvcm0uc2l6ZTtcbiAgICAgIG12UG9zaXRpb24ueHkgKz0gYWxpZ25lZFBvc2l0aW9uO1xuICAgICAgb3V0cHV0LnBvc2l0aW9uID0gc3lzdGVtVW5pZm9ybS5wcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICB9XG4gICBgO1xuIiwiZXhwb3J0IGRlZmF1bHQgYFxuICAgIEBncm91cCgwKSBAYmluZGluZygxKSB2YXIgYmFzZVNhbXBsZXI6IHNhbXBsZXI7XG4gICAgQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhciBjb2xvclRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbiAgICBzdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICAgICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgICAgIEBsb2NhdGlvbigwKSB1djogdmVjMjxmMzI+LFxuICAgIH07XG4gICAgQGZyYWdtZW50XG4gICAgZm4gbWFpbihpbnB1dDpWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgICAgcmV0dXJuIHRleHR1cmVTYW1wbGUoY29sb3JUZXh0dXJlLCBiYXNlU2FtcGxlciwgdmVjMjxmMzI+KGlucHV0LnV2LngsMS4wLWlucHV0LnV2LnkpKTtcbiAgICB9XG4gICAgYDtcbiIsImV4cG9ydCBkZWZhdWx0IGBcbiAgICBzdHJ1Y3QgVmVydGV4SW5wdXQge1xuICAgICAgICAgQGxvY2F0aW9uKHBvc2l0aW9uTG9jYXRpb24pIHBvc2l0aW9uOiB2ZWMyPGYzMj4sICAgICAgIFxuICAgIH1cbiAgICBzdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICAgICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgICAgICAgQGxvY2F0aW9uKDApIHV2OiB2ZWMyPGYzMj4sXG4gICAgIH07XG4gICAgQHZlcnRleFxuICAgIGZuIG1haW4oaW5wdXQ6IFZlcnRleElucHV0KSAtPiBWZXJ0ZXhPdXRwdXQge1xuICAgICB2YXIgb3V0cHV0OlZlcnRleE91dHB1dDtcbiAgICAgb3V0cHV0LnV2ID0gaW5wdXQucG9zaXRpb24gKiAwLjUgKyAwLjU7XG4gICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzQ8ZjMyPihpbnB1dC5wb3NpdGlvbiwgMC4wLCAxLjApOztcbiAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG4gICAgYDtcbiIsImV4cG9ydCBkZWZhdWx0IGBcbiAgICBmbiBsZXNzVGhhbkVxdWFsKGE6dmVjMzxmMzI+LGI6dmVjMzxmMzI+KS0+dmVjMzxmMzI+e1xuICAgICAgICBsZXQgeFZhbHVlOmYzMj1zZWxlY3QoYi54LGEueCxhLng8PWIueCk7XG4gICAgICAgIGxldCB5VmFsdWU6ZjMyPXNlbGVjdChiLnksYS55LGEueTw9Yi55KTtcbiAgICAgICAgbGV0IHpWYWx1ZTpmMzI9c2VsZWN0KGIueixhLnosYS56PD1iLnopO1xuICAgICAgICByZXR1cm4gdmVjMzxmMzI+KHhWYWx1ZSx5VmFsdWUselZhbHVlKTsgICAgXG4gICAgIH1cbiAgICBmbiBMaW5lYXJUb3NSR0IoIHZhbHVlOnZlYzQ8ZjMyPiApLT52ZWM0PGYzMj4ge1xuICAgICAgICByZXR1cm4gdmVjNDxmMzI+KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzPGYzMj4oIDAuNDE2NjYgKSApICogMS4wNTUgLSB2ZWMzPGYzMj4oIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzPGYzMj4oIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMzxmMzI+KCAwLjAwMzEzMDggKSApICkgKSwgdmFsdWUuYSApO1xuICAgIH1cbiAgc3RydWN0IEZyYWdtZW50SW5wdXQge1xuICAgIEBsb2NhdGlvbigwKSB0ZXhDb29yZCA6IHZlYzM8ZjMyPlxuICB9O1xuICBAZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyIGRlZmF1bHRTYW1wbGVyOiBzYW1wbGVyO1xuICBAZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIHNreWJveFRleHR1cmU6IHRleHR1cmVfY3ViZTxmMzI+O1xuICBAZnJhZ21lbnRcbiAgZm4gbWFpbihpbnB1dCA6IEZyYWdtZW50SW5wdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgIGxldCBjb2xvciA9IHRleHR1cmVTYW1wbGUoc2t5Ym94VGV4dHVyZSwgZGVmYXVsdFNhbXBsZXIsIGlucHV0LnRleENvb3JkKTtcbiAgICByZXR1cm4gTGluZWFyVG9zUkdCKGNvbG9yKTtcbiAgfVxuYDtcbiIsImV4cG9ydCBkZWZhdWx0IGBcbiAgIHN0cnVjdCBTeXN0ZW1Vbmlmb3JtIHtcbiAgICAgICBwcm9qZWN0aW9uTWF0cml4OiBtYXQ0eDQ8ZjMyPixcbiAgICAgICB2aWV3TWF0cml4OiBtYXQ0eDQ8ZjMyPixcbiAgICAgICBpbnZlcnNlVmlld01hdHJpeDogbWF0NHg0PGYzMj4sXG4gICAgICAgY2FtZXJhUG9zaXRpb246IHZlYzM8ZjMyPixcbiAgIH07IFxuICAgc3RydWN0IE1hdGVyaWFsVW5pZm9ybSB7XG4gICAgbW9kZWxNYXRyaXg6IG1hdDR4NDxmMzI+LFxuIH1cbiAgIEBiaW5kaW5nKHNreWJveEJpbmRpbmcpIEBncm91cCgwKSB2YXI8dW5pZm9ybT4gc2VsZlVuaWZvcm0gOiBNYXRlcmlhbFVuaWZvcm07XG4gICBAYmluZGluZyhjYW1lcmFCaW5kaW5nKSBAZ3JvdXAoMSkgdmFyPHVuaWZvcm0+IHN5c3RlbVVuaWZvcm0gOiBTeXN0ZW1Vbmlmb3JtO1xuICAgICBzdHJ1Y3QgVmVydGV4SW5wdXQge1xuICAgICAgIEBsb2NhdGlvbihwb3NpdGlvbkxvY2F0aW9uKSBwb3NpdGlvbiA6IHZlYzM8ZjMyPixcbiAgICAgfTtcbiAgICAgc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uIDogdmVjNDxmMzI+LFxuICAgICAgIEBsb2NhdGlvbigwKSB0ZXhDb29yZCA6IHZlYzM8ZjMyPixcbiAgICAgfTtcbiAgICAgQHZlcnRleFxuICAgICBmbiBtYWluKGlucHV0IDogVmVydGV4SW5wdXQpIC0+IFZlcnRleE91dHB1dCB7XG4gICAgICAgdmFyIG91dHB1dCA6IFZlcnRleE91dHB1dDtcbiAgICAgICBvdXRwdXQudGV4Q29vcmQgPSBpbnB1dC5wb3NpdGlvbi54eXo7XG4gICAgICAgdmFyIG1vZGVsVmlldyA9IHN5c3RlbVVuaWZvcm0udmlld01hdHJpeDtcbiAgICAgICAvLyBEcm9wIHRoZSB0cmFuc2xhdGlvbiBwb3J0aW9uIG9mIHRoZSBtb2RlbFZpZXcgbWF0cml4XG4gICAgICAgbW9kZWxWaWV3WzNdID0gdmVjNCgwLjAsIDAuMCwgMC4wLCBtb2RlbFZpZXdbM10udyk7XG4gICAgICAgb3V0cHV0LnBvc2l0aW9uID0gc3lzdGVtVW5pZm9ybS5wcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3ICogdmVjNDxmMzI+KGlucHV0LnBvc2l0aW9uLDEuMCk7XG4gICAgICAgb3V0cHV0LnBvc2l0aW9uID0gb3V0cHV0LnBvc2l0aW9uLnh5d3c7XG4gICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgfVxuICAgYDtcbiIsImV4cG9ydCBjb25zdCBzcHJpdGVfZnMgPSBgXG4gICNpbmNsdWRlIDxWZXJ0ZXhPdXRwdXQ+XG4gIHN0cnVjdCBTZWxmVW5pZm9ybSB7XG4gICAgbW9kZWxNYXRyaXg6IG1hdDR4NDxmMzI+LFxuICAgIGNvbG9yOnZlYzM8ZjMyPixcbiAgICByb3RhdGlvbjpmMzIsXG4gICAgY2VudGVyOnZlYzI8ZjMyPixcbiAgICBvcGFjaXR5OmYzMixcbiAgfVxuICBAYmluZGluZyhzcHJpdGVCaW5kaW5nKSBAZ3JvdXAoMCkgdmFyPHVuaWZvcm0+IHNlbGZVbmlmb3JtIDogU2VsZlVuaWZvcm07XG4gICNpZiBVU0VfQ09MT1JURVhUVVJFXG4gICAgQGdyb3VwKDApIEBiaW5kaW5nKGJhc2VDb2xvclNhbXBsZXJCaW5kaW5nKSB2YXIgYmFzZUNvbG9yU2FtcGxlcjogc2FtcGxlcjtcbiAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoYmFzZUNvbG9yVGV4dHVyZUJpbmRpbmcpIHZhciBiYXNlQ29sb3JUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG4gICNlbmRpZlxuICBAZnJhZ21lbnRcbiAgZm4gbWFpbihpbnB1dDpWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgICNpZiBVU0VfQ09MT1JURVhUVVJFXG4gICAgICByZXR1cm4gdGV4dHVyZVNhbXBsZShiYXNlQ29sb3JUZXh0dXJlLCBiYXNlQ29sb3JTYW1wbGVyLCBpbnB1dC51dik7XG4gICAgI2Vsc2VcbiAgICAgIHJldHVybiB2ZWM0PGYzMj4oc2VsZlVuaWZvcm0uY29sb3Isc2VsZlVuaWZvcm0ub3BhY2l0eSk7XG4gICAgI2VuZGlmXG4gIH1cbiAgYDtcbiIsImV4cG9ydCBjb25zdCBzcHJpdGVfdnMgPSBgXG5cbiAgI2luY2x1ZGUgPFZlcnRleElucHV0PlxuICAjaW5jbHVkZSA8VmVydGV4T3V0cHV0PlxuICAjaW5jbHVkZSA8U3lzdGVtVW5pZm9ybT5cbiAgc3RydWN0IFNlbGZVbmlmb3JtIHtcbiAgICBtb2RlbE1hdHJpeDogbWF0NHg0PGYzMj4sXG4gICAgY29sb3I6dmVjMzxmMzI+LFxuICAgIHJvdGF0aW9uOmYzMixcbiAgICBjZW50ZXI6dmVjMjxmMzI+LFxuICAgIG9wYWNpdHk6ZjMyLFxuICB9XG4gIEBiaW5kaW5nKHNwcml0ZUJpbmRpbmcpIEBncm91cCgwKSB2YXI8dW5pZm9ybT4gc2VsZlVuaWZvcm0gOiBTZWxmVW5pZm9ybTtcbiAgQGJpbmRpbmcoY2FtZXJhQmluZGluZykgQGdyb3VwKDEpIHZhcjx1bmlmb3JtPiBzeXN0ZW1Vbmlmb3JtIDogU3lzdGVtVW5pZm9ybTtcbiAgQHZlcnRleFxuICBmbiBtYWluKGlucHV0OiBWZXJ0ZXhJbnB1dCkgLT4gVmVydGV4T3V0cHV0IHtcbiAgICAgIHZhciBvdXRwdXQ6VmVydGV4T3V0cHV0O1xuICAgICAgdmFyIG12UG9zaXRpb246dmVjNDxmMzI+PSBzeXN0ZW1Vbmlmb3JtLnZpZXdNYXRyaXggKnNlbGZVbmlmb3JtLm1vZGVsTWF0cml4KnZlYzQ8ZjMyPigwLjAsMC4wLDAuMCwxLjApO1xuICAgICAgI2lmIEhBU19VVlxuICAgICAgICBvdXRwdXQudXY9aW5wdXQudXY7XG4gICAgICAjZW5kaWZcbiAgICAgIHZhciBzY2FsZTp2ZWMyPGYzMj47XG4gICAgICBzY2FsZS54ID0gbGVuZ3RoKHZlYzM8ZjMyPihzZWxmVW5pZm9ybS5tb2RlbE1hdHJpeFswXS54LCBzZWxmVW5pZm9ybS5tb2RlbE1hdHJpeFswXS55LCBzZWxmVW5pZm9ybS5tb2RlbE1hdHJpeFswXS56KSk7XG4gICAgICBzY2FsZS55ID0gbGVuZ3RoKHZlYzM8ZjMyPihzZWxmVW5pZm9ybS5tb2RlbE1hdHJpeFsxXS54LCBzZWxmVW5pZm9ybS5tb2RlbE1hdHJpeFsxXS55LCBzZWxmVW5pZm9ybS5tb2RlbE1hdHJpeFsxXS56KSk7XG4gICAgICAvLyBzY2FsZSAqPSAtIG12UG9zaXRpb24uejtcbiAgICAgIHZhciBhbGlnbmVkUG9zaXRpb246dmVjMjxmMzI+ID0oaW5wdXQucG9zaXRpb24ueHktIChzZWxmVW5pZm9ybS5jZW50ZXIgLSB2ZWMyPGYzMj4oMC41LDAuNSkpKSAqIHNjYWxlO1xuICAgICAgbGV0IHJvdGF0ZWRQb3NpdGlvblggPSBjb3Moc2VsZlVuaWZvcm0ucm90YXRpb24pICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHNlbGZVbmlmb3JtLnJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTtcbiAgICAgIGxldCByb3RhdGVkUG9zaXRpb25ZID0gc2luKHNlbGZVbmlmb3JtLnJvdGF0aW9uKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCBzZWxmVW5pZm9ybS5yb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7XG4gICAgICB2YXIgcm90YXRlZFBvc2l0aW9uPXZlYzI8ZjMyPihyb3RhdGVkUG9zaXRpb25YLHJvdGF0ZWRQb3NpdGlvblkpO1xuICAgICAgbGV0IG5ld1BvaW50ID1tdlBvc2l0aW9uLnh5KyByb3RhdGVkUG9zaXRpb247XG4gICAgICBvdXRwdXQucG9zaXRpb24gPSBzeXN0ZW1Vbmlmb3JtLnByb2plY3Rpb25NYXRyaXggKiB2ZWM0PGYzMj4obmV3UG9pbnQueCxuZXdQb2ludC55LG12UG9zaXRpb24ueixtdlBvc2l0aW9uLncpO1xuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuICBgO1xuIiwiZXhwb3J0IGRlZmF1bHQgYFxuICAgIHN0cnVjdCBGcmFnSW5wdXQge1xuICAgICAgICBAbG9jYXRpb24oMCkgdXY6IHZlYzI8ZjMyPixcbiAgICB9O1xuICAgIEBncm91cCgwKSBAYmluZGluZyh7e3REaWZmdXNlQmluZGluZ319KSB2YXIgdERpZmZ1c2U6IHRleHR1cmVfMmQ8ZjMyPjtcbiAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoe3tiYXNlQ29sb3JUZXh0dXJlQmluZGluZ319KSB2YXIgYmFzZUNvbG9yVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuICAgIEBncm91cCgwKSBAYmluZGluZyh7e3RTYW1wbGVyQmluZGluZ319KSB2YXIgdFNhbXBsZXI6IHNhbXBsZXI7XG4gICAgQGZyYWdtZW50XG4gICAgZm4gbWFpbihpbnB1dDpGcmFnSW5wdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgICAgICBsZXQgcG9zdENvbG9yOnZlYzQ8ZjMyPiA9IHRleHR1cmVTYW1wbGUodERpZmZ1c2UsIHRTYW1wbGVyLCBpbnB1dC51dik7XG4gICAgICAgIGxldCBiYXNlQ29sb3I6dmVjNDxmMzI+ID0gdGV4dHVyZVNhbXBsZShiYXNlQ29sb3JUZXh0dXJlLCB0U2FtcGxlciwgaW5wdXQudXYpO1xuICAgICAgcmV0dXJuIGJhc2VDb2xvcitwb3N0Q29sb3I7XG4gICAgfSAgIFxuICAgIGA7XG4iLCJleHBvcnQgZGVmYXVsdCBgXG4gICAgc3RydWN0IEZyYWdJbnB1dCB7XG4gICAgICAgIEBsb2NhdGlvbigwKSB1djogdmVjMjxmMzI+LFxuICAgIH1cbiAgICBzdHJ1Y3QgQmx1clVuaWZvcm1zIHtcbiAgICAgICAgZGlyZWN0aW9uOnZlYzI8ZjMyPixcbiAgICB9XG4gICAgZm4gZ2F1c3NpYW5QZGYoeDpmMzIsIHNpZ21hOmYzMiktPmYzMiB7XG4gICAgICAgIHJldHVybiAwLjM5ODk0ICogZXhwKCAtMC41ICogeCAqIHgvKCBzaWdtYSAqIHNpZ21hKSkvc2lnbWE7XG4gICAgfVxuICAgIEBncm91cCgwKSBAYmluZGluZygwKSAgdmFyPHVuaWZvcm0+IGJsdXJVbmlmb3JtcyA6IEJsdXJVbmlmb3JtcztcbiAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoe3t0RGlmZnVzZUJpbmRpbmd9fSkgdmFyIHREaWZmdXNlOiB0ZXh0dXJlXzJkPGYzMj47XG4gICAgQGdyb3VwKDApIEBiaW5kaW5nKHt7dFNhbXBsZXJCaW5kaW5nfX0pIHZhciB0U2FtcGxlcjogc2FtcGxlcjtcbiAgICBAZnJhZ21lbnRcbiAgICBmbiBtYWluKGlucHV0OkZyYWdJbnB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XG4gICAgICAgIGxldCBpbnZTaXplOnZlYzI8ZjMyPiA9IHZlYzI8ZjMyPigxLjAsMS4wKSAvIHZlYzI8ZjMyPih0ZXh0dXJlRGltZW5zaW9ucyh0RGlmZnVzZSkpO1xuICAgICAgICBsZXQgZlNpZ21hOmYzMiA9ZjMyKHNpZ21hQ29uc3QpO1xuICAgICAgICB2YXIgd2VpZ2h0U3VtOmYzMiA9IGdhdXNzaWFuUGRmKDAuMCwgZlNpZ21hKTtcbiAgICAgICAgbGV0IGJhc2VDb2xvcj10ZXh0dXJlU2FtcGxlKHREaWZmdXNlLCB0U2FtcGxlciwgaW5wdXQudXYpO1xuICAgICAgICB2YXIgZGlmZnVzZVN1bTp2ZWMzPGYzMj4gPSBiYXNlQ29sb3IucmdiICogd2VpZ2h0U3VtO1xuICAgICAgICBsZXQgdXZPZmZzZXQ6dmVjMjxmMzI+ID0gYmx1clVuaWZvcm1zLmRpcmVjdGlvbiAqIGludlNpemU7XG4gICAgICAgIGZvciggdmFyIGkgOiB1MzIgPSAxOyBpIDwga2VybmVsUmFkaXVzO2kgPSBpICsgMSApIHtcbiAgICAgICAgICAgIGxldCB4OmYzMiA9IGYzMihpKTtcbiAgICAgICAgICAgIGxldCB3OmYzMiA9IGdhdXNzaWFuUGRmKHgsIGZTaWdtYSk7XG4gICAgICAgICAgICBsZXQgc2FtcGxlMTp2ZWMzPGYzMj49dGV4dHVyZVNhbXBsZSh0RGlmZnVzZSwgdFNhbXBsZXIsIGlucHV0LnV2KyB1dk9mZnNldCp4KS5yZ2I7XG4gICAgICAgICAgICBsZXQgc2FtcGxlMjp2ZWMzPGYzMj49dGV4dHVyZVNhbXBsZSh0RGlmZnVzZSwgdFNhbXBsZXIsIGlucHV0LnV2LSB1dk9mZnNldCp4KS5yZ2I7XG4gICAgICAgICAgICBkaWZmdXNlU3VtID1kaWZmdXNlU3VtKyAoc2FtcGxlMitzYW1wbGUyKSogdztcbiAgICAgICAgICAgIHdlaWdodFN1bSArPSAyLjAgKiB3O1xuICAgICAgICB9XG4gICAgICAgIGRpZmZ1c2VTdW0vPXdlaWdodFN1bTtcbiAgICAgIHJldHVybiB2ZWM0PGYzMj4oZGlmZnVzZVN1bSxiYXNlQ29sb3IuYSk7XG4gICAgfVxuICBgO1xuIiwiZXhwb3J0IGRlZmF1bHQgYFxuICAgIHN0cnVjdCBMdW1pbm9zaXR5VW5pZm9ybXN7XG4gICAgICAgIGx1bWlub3NpdHlUaHJlc2hvbGQ6ZjMyLFxuICAgICAgICBzbW9vdGhXaWR0aDpmMzIsXG4gICAgICAgIGRlZmF1bHRDb2xvcjp2ZWMzPGYzMj4sXG4gICAgICAgIGRlZmF1bHRPcGFjaXR5OmYzMixcbiAgICB9XG4gICAgc3RydWN0IEZyYWdJbnB1dCB7XG4gICAgICAgIEBsb2NhdGlvbigwKSB1djogdmVjMjxmMzI+LFxuICAgIH07XG4gICAgQGdyb3VwKDApIEBiaW5kaW5nKDApICB2YXI8dW5pZm9ybT4gbHVtaW5vc2l0eVVuaWZvcm1zIDogTHVtaW5vc2l0eVVuaWZvcm1zO1xuICAgIEBncm91cCgwKSBAYmluZGluZyh7e3REaWZmdXNlQmluZGluZ319KSB2YXIgdERpZmZ1c2U6IHRleHR1cmVfMmQ8ZjMyPjtcbiAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoe3t0U2FtcGxlckJpbmRpbmd9fSkgdmFyIHRTYW1wbGVyOiBzYW1wbGVyO1xuICAgIEBmcmFnbWVudFxuICAgIGZuIG1haW4oaW5wdXQ6RnJhZ0lucHV0KS0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuXG4gICAgICAgIGxldCB0ZXhlbDp2ZWM0PGYzMj4gPSB0ZXh0dXJlU2FtcGxlKHREaWZmdXNlLCB0U2FtcGxlciwgaW5wdXQudXYpO1xuXG4gICAgICAgIGxldCBsdW1hOnZlYzM8ZjMyPiA9IHZlYzM8ZjMyPiggMC4yOTksMC41ODcsMC4xMTQgKTtcblxuICAgICAgICBsZXQgdjpmMzIgPSBkb3QoIHRleGVsLnh5eiwgbHVtYSApO1xuXG4gICAgICAgIGxldCBvdXRwdXRDb2xvcjp2ZWM0PGYzMj4gPSB2ZWM0PGYzMj4oIGx1bWlub3NpdHlVbmlmb3Jtcy5kZWZhdWx0Q29sb3IucmdiLCBsdW1pbm9zaXR5VW5pZm9ybXMuZGVmYXVsdE9wYWNpdHkgKTtcblxuICAgICAgICBsZXQgYWxwaGE6ZjMyID0gc21vb3Roc3RlcCggbHVtaW5vc2l0eVVuaWZvcm1zLmx1bWlub3NpdHlUaHJlc2hvbGQsIGx1bWlub3NpdHlVbmlmb3Jtcy5sdW1pbm9zaXR5VGhyZXNob2xkICsgbHVtaW5vc2l0eVVuaWZvcm1zLnNtb290aFdpZHRoLCB2ICk7XG5cbiAgICAgICByZXR1cm4gbWl4KCBvdXRwdXRDb2xvciwgdGV4ZWwsIGFscGhhICk7XG4gICAgfVxuICAgIGA7XG4iLCJleHBvcnQgY29uc3QgRnJhZ0lucHV0ID0gYFxuICAgIHN0cnVjdCBGcmFnSW5wdXQge1xuICAgICAgQGJ1aWx0aW4oZnJvbnRfZmFjaW5nKSBmcm9udEZhY2luZzogYm9vbCxcbiAgICAgIEBsb2NhdGlvbigwKSB3b3JsZFBvczp2ZWMzPGYzMj4sXG4gICAgICBAbG9jYXRpb24oMSkgbm9ybWFsOnZlYzM8ZjMyPixcbiAgICAgIEBsb2NhdGlvbigyKSB1djp2ZWMyPGYzMj4sXG4gICAgICBAbG9jYXRpb24oMykgdmlldzogdmVjMzxmMzI+LCAvLyBWZWN0b3IgZnJvbSB2ZXJ0ZXggdG8gY2FtZXJhLlxuICAgICAgQGxvY2F0aW9uKDQpIGNvbG9yOiB2ZWM0PGYzMj4sXG4gICAgICBAbG9jYXRpb24oNSkgdmlld1Bvc2l0aW9uOiB2ZWMzPGYzMj4sXG4gIH0gXG4gIGA7XG4iLCJleHBvcnQgY29uc3QgUG9pbnRGcmFnSW5wdXQgPSBgXG4gICAgICBzdHJ1Y3QgUG9pbnRGcmFnSW5wdXR7XG4gICAgICAgIEBsb2NhdGlvbigwKSB1djp2ZWMyPGYzMj4sXG4gICAgICAgIEBsb2NhdGlvbigxKSBjb2xvcjogdmVjNDxmMzI+LFxuICAgICAgICBAbG9jYXRpb24oMikgc2l6ZTogZjMyLFxuICAgICAgfVxuICAgIGA7XG4iLCJleHBvcnQgY29uc3QgUG9pbnRWZXJ0SW5wdXQgPSBgXG4gIHN0cnVjdCBQb2ludFZlcnRJbnB1dCB7XG4gICAgQGxvY2F0aW9uKHBvc2l0aW9uTG9jYXRpb24pIHBvc2l0aW9uOiB2ZWMzPGYzMj4sICAgICAgIFxuICAgIEBsb2NhdGlvbih1dkxvY2F0aW9uKSB1djogdmVjMjxmMzI+LFxuICAgICNpZiBIQVNfQ09MT1IgXG4gICAgICAgIEBsb2NhdGlvbihjb2xvckxvY2F0aW9uKSBjb2xvcjogdmVjMzxmMzI+LFxuICAgICNlbmRpZlxuICAgICNpZiBIQVNfU0laRVxuICAgICAgICBAbG9jYXRpb24oc2l6ZUxvY2F0aW9uKSBzaXplOiBmMzIsXG4gICAgI2VuZGlmXG4gICAgI2lmIFVTRV9JTlNUQU5DRVxuICAgICAgICBAYnVpbHRpbihpbnN0YW5jZV9pbmRleCkgaW5zdGFuY2VJZHggOiB1MzJcbiAgICAjZW5kaWZcbiAgfVxuICBgO1xuIiwiZXhwb3J0IGNvbnN0IFBvaW50VmVydE91dHB1dCA9IGBcbiAgICBzdHJ1Y3QgUG9pbnRWZXJ0T3V0cHV0e1xuICAgICAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb246dmVjNDxmMzI+LFxuICAgICAgICBAbG9jYXRpb24oMCkgdXY6dmVjMjxmMzI+LFxuICAgICAgICBAbG9jYXRpb24oMSkgY29sb3I6IHZlYzQ8ZjMyPixcbiAgICAgICAgQGxvY2F0aW9uKDIpIHNpemU6IGYzMixcbiAgICB9XG4gICBgO1xuIiwiZXhwb3J0IGNvbnN0IFZlcnRleElucHV0ID0gYFxuICAgICAgICBzdHJ1Y3QgVmVydGV4SW5wdXQge1xuICAgICAgICAgICAgQGxvY2F0aW9uKHBvc2l0aW9uTG9jYXRpb24pIHBvc2l0aW9uOiB2ZWMzPGYzMj4sICAgXG4gICAgICAgICAgICAjaWYgSEFTX05PUk1BTCAgXG4gICAgICAgICAgICAgICAgQGxvY2F0aW9uKG5vcm1hbExvY2F0aW9uKSBub3JtYWw6IHZlYzM8ZjMyPixcbiAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgI2lmIEhBU19DT0xPUiBcbiAgICAgICAgICAgICAgICBAbG9jYXRpb24oY29sb3JMb2NhdGlvbikgY29sb3I6IHZlYzM8ZjMyPixcbiAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgI2lmIEhBU19VVlxuICAgICAgICAgICAgICAgIEBsb2NhdGlvbih1dkxvY2F0aW9uKSB1djogdmVjMjxmMzI+LFxuICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgICAjaWYgSEFTX1NLSU5cbiAgICAgICAgICAgICAgICBAbG9jYXRpb24oam9pbnQwTG9jYXRpb24pIGpvaW50MDp2ZWM0PGYzMj4sXG4gICAgICAgICAgICAgICAgQGxvY2F0aW9uKHdlaWdodDBMb2NhdGlvbikgd2VpZ2h0MDp2ZWM0PGYzMj4sXG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgICNpZiBVU0VfSU5TVEFOQ0VcbiAgICAgICAgICAgICAgICBAYnVpbHRpbihpbnN0YW5jZV9pbmRleCkgaW5zdGFuY2VJZHggOiB1MzJcbiAgICAgICAgICAgICNlbmRpZlxuICAgICAgICB9XG4gICBgO1xuIiwiZXhwb3J0IGNvbnN0IFZlcnRleE91dHB1dCA9IGBcbiAgICBzdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICAgICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOnZlYzQ8ZjMyPixcbiAgICAgICAgQGxvY2F0aW9uKDApIHdvcmxkUG9zOnZlYzM8ZjMyPixcbiAgICAgICAgQGxvY2F0aW9uKDEpIG5vcm1hbDp2ZWMzPGYzMj4sXG4gICAgICAgIEBsb2NhdGlvbigyKSB1djp2ZWMyPGYzMj4sXG4gICAgICAgIEBsb2NhdGlvbigzKSB2aWV3OiB2ZWMzPGYzMj4sIC8vIFZlY3RvciBmcm9tIHZlcnRleCB0byBjYW1lcmEuXG4gICAgICAgIEBsb2NhdGlvbig0KSBjb2xvcjogdmVjNDxmMzI+LFxuICAgICAgICBAbG9jYXRpb24oNSkgdmlld1Bvc2l0aW9uOiB2ZWMzPGYzMj4sXG4gICAgfSBcbiAgICBgO1xuIiwiZXhwb3J0IGNvbnN0IFN5c3RlbVVuaWZvcm0gPSBgXG4gICAgICBzdHJ1Y3QgU3lzdGVtVW5pZm9ybSB7XG4gICAgICAgICAgcHJvamVjdGlvbk1hdHJpeDogbWF0NHg0PGYzMj4sXG4gICAgICAgICAgdmlld01hdHJpeDogbWF0NHg0PGYzMj4sXG4gICAgICAgICAgaW52ZXJzZVZpZXdNYXRyaXg6IG1hdDR4NDxmMzI+LFxuICAgICAgICAgIGNhbWVyYVBvc2l0aW9uOiB2ZWMzPGYzMj4sXG4gICAgICB9OyBcbiAgYDtcbiIsImV4cG9ydCBjb25zdCBUZXh0dXJlQW5kU2FtcGxlckRlZmluZSA9IGBcbiAgICAjaWYgVVNFX0lCTFxuICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKHNwZWN1bGFyRW52VGV4dHVyZUJpbmRpbmcpIHZhciBzcGVjdWxhckVudlRleHR1cmU6IHRleHR1cmVfY3ViZTxmMzI+O1xuICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKHNwZWN1bGFyRW52U2FtcGxlckJpbmRpbmcpIHZhciBzcGVjdWxhckVudlNhbXBsZXI6IHNhbXBsZXI7XG4gICAgI2VuZGlmXG4gICAgI2lmIFVTRV9URVhUVVJFXG4gICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoYmFzZUNvbG9yVGV4dHVyZUJpbmRpbmcpIHZhciBiYXNlQ29sb3JUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG4gICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoYmFzZUNvbG9yU2FtcGxlckJpbmRpbmcpIHZhciBiYXNlQ29sb3JTYW1wbGVyOiBzYW1wbGVyO1xuICAgICNlbmRpZlxuICAgIC8vIG5vcm1hbCBtYXBcbiAgICAjaWYgVVNFX05PUk1BTFRFWFRVUkVcbiAgICAgIEBncm91cCgwKSBAYmluZGluZyhub3JtYWxUZXh0dXJlQmluZGluZykgdmFyIG5vcm1hbFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbiAgICAgIEBncm91cCgwKSBAYmluZGluZyhub3JtYWxTYW1wbGVyQmluZGluZykgdmFyIG5vcm1hbFNhbXBsZXI6IHNhbXBsZXI7XG4gICAgI2VuZGlmXG4gICAgLy8gZW1taXN2ZSBtYXBcbiAgICAjaWYgVVNFX0VNSVNTSVZFVEVYVFVSRVxuICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKGVtaXNzaXZlVGV4dHVyZUJpbmRpbmcpIHZhciBlbWlzc2l2ZVRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbiAgICAgIEBncm91cCgwKSBAYmluZGluZyhlbWlzc2l2ZVNhbXBsZXJCaW5kaW5nKSB2YXIgZW1pc3NpdmVTYW1wbGVyOiBzYW1wbGVyO1xuICAgICNlbmRpZlxuXG4gICAgLy8gbWV0YWwgcm91Z2huZXNzXG4gICAgI2lmIFVTRV9NRVRBTE5FU1NURVhUVVJFXG4gICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcobWV0YWxuZXNzUm91Z2huZXNzVGV4dHVyZUJpbmRpbmcpIHZhciBtZXRhbG5lc3NSb3VnaG5lc3NUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG4gICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcobWV0YWxuZXNzUm91Z2huZXNzU2FtcGxlckJpbmRpbmcpIHZhciBtZXRhbG5lc3NSb3VnaG5lc3NTYW1wbGVyOiBzYW1wbGVyO1xuICAgICNlbmRpZlxuICAgIC8vIG9jY2x1c2lvbiB0ZXh0dXJlXG4gICAgI2lmIFVTRV9BT1RFWFRVUkVcbiAgICAgIEBncm91cCgwKSBAYmluZGluZyhhb1RleHR1cmVCaW5kaW5nKSB2YXIgYW9UZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG4gICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoYW9TYW1wbGVyQmluZGluZykgdmFyIGFvU2FtcGxlcjogc2FtcGxlcjtcbiAgICAjZW5kaWZcbiAgICAjaWYgVVNFX05PUk1BTFRFWFRVUkVcbiAgICAgICNpbmNsdWRlIDxnZXRUQk4+XG4gICAgICAjaW5jbHVkZSA8Z2V0Tm9ybWFsQnlOb3JtYWxUZXh0dXJlPlxuICAgICNlbHNlXG4gICAgICAjaW5jbHVkZSA8Z2V0Tm9ybWFsPlxuICAgICNlbmRpZlxuICBgO1xuIiwiaW1wb3J0IHsgd2dzbFBhcnNlRGVmaW5lcyB9IGZyb20gXCIuLi8uLi9XZ3NsUHJlcHJvY2Vzc29yXCI7XHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVudmlyb25tZW50KGRlZmluZXMpIHtcclxuICByZXR1cm4gd2dzbFBhcnNlRGVmaW5lc2BcclxuICAgI2lmICR7ZGVmaW5lcy5FTlZURVhUVVJFX1RZUEVfQ1VCRV9VVn1cclxuICAgICAgICBjb25zdCBjdWJlVVZfbWluTWlwTGV2ZWw6ZjMyPSA0LjA7XHJcbiAgICAgICAgY29uc3QgY3ViZVVWX21pblRpbGVTaXplOmYzMj0gMTYuMDtcclxuICAgICAgICBjb25zdCBDVUJFVVZfTUFYX01JUDpmMzI9Ni4wO1xyXG4gICAgICAgIGNvbnN0IENVQkVVVl9URVhFTF9XSURUSDpmMzI9MS4wLzI1Ni4wO1xyXG4gICAgICAgIGNvbnN0IENVQkVVVl9URVhFTF9IRUlHSFQ6ZjMyPTEuMC8yNTYuMDtcclxuICAgICAgICBmbiBnZXRGYWNlKGRpcmVjdGlvbjp2ZWMzPGYzMj4gKS0+ZjMyIHtcclxuICAgICAgICAgICAgbGV0IGFic0RpcmVjdGlvbjp2ZWMzPGYzMj4gPSBhYnMoIGRpcmVjdGlvbiApO1xyXG4gICAgICAgICAgICB2YXIgZmFjZTpmMzIgPSAtIDEuMDtcclxuICAgICAgICAgICAgaWYgKCBhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi56ICkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCBhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi55ICl7XHJcbiAgICAgICAgICAgICAgICAgICAgZmFjZSA9c2VsZWN0KDMuMCwwLjAsZGlyZWN0aW9uLnggPiAwLjApO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgZmFjZSA9c2VsZWN0KDQuMCwxLjAsZGlyZWN0aW9uLnkgPiAwLjApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIGFic0RpcmVjdGlvbi56ID4gYWJzRGlyZWN0aW9uLnkgKXtcclxuICAgICAgICAgICAgICAgICAgICBmYWNlID1zZWxlY3QoNS4wLDIuMCxkaXJlY3Rpb24ueiA+IDAuMCk7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBmYWNlID1zZWxlY3QoNC4wLDEuMCxkaXJlY3Rpb24ueSA+IDAuMCk7XHJcbiAgICAgICAgICAgICAgICB9ICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmbiBnZXRVViggZGlyZWN0aW9uOnZlYzM8ZjMyPiwgZmFjZTpmMzIgKS0+dmVjMjxmMzI+IHtcclxuICAgICAgICAgICAgdmFyIHV2OnZlYzI8ZjMyPjtcclxuICAgICAgICAgICAgaWYgKCBmYWNlID09IDAuMCApIHtcclxuICAgICAgICAgICAgICAgIHV2ID0gdmVjMjxmMzI+KCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnggKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICggZmFjZSA9PSAxLjAgKSB7XHJcbiAgICAgICAgICAgICAgICB1diA9IHZlYzI8ZjMyPiggLSBkaXJlY3Rpb24ueCwgLSBkaXJlY3Rpb24ueiApIC8gYWJzKCBkaXJlY3Rpb24ueSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKCBmYWNlID09IDIuMCApIHtcclxuICAgICAgICAgICAgICAgIHV2ID0gdmVjMjxmMzI+KCAtIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueiApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHtcclxuICAgICAgICAgICAgICAgIHV2ID0gdmVjMjxmMzI+KCAtIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueCApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKCBmYWNlID09IDQuMCApIHtcclxuICAgICAgICAgICAgICAgIHV2ID0gdmVjMjxmMzI+KCAtIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueiApIC8gYWJzKCBkaXJlY3Rpb24ueSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdXYgPSB2ZWMyPGYzMj4oIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueiApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAwLjUgKiAoIHV2ICsgMS4wICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZuIGJpbGluZWFyQ3ViZVVWKGVudlRleHR1cmU6dGV4dHVyZV9jdWJlPGYzMj4sYmFzZVNhbXBsZXI6c2FtcGxlcixkaXJlY3Rpb246dmVjMzxmMzI+LCBtaXBJbnQ6ZjMyICktPnZlYzM8ZjMyPiB7XHJcbiAgICAgICAgICAgIHZhciBmYWNlOmYzMiA9IGdldEZhY2UoIGRpcmVjdGlvbiApO1xyXG4gICAgICAgICAgICBsZXQgZmlsdGVySW50OmYzMiA9IG1heCggY3ViZVVWX21pbk1pcExldmVsIC0gbWlwSW50LCAwLjAgKTtcclxuICAgICAgICAgICAgbGV0IHRlbXBNaXBJbnQgPSBtYXgoIG1pcEludCwgY3ViZVVWX21pbk1pcExldmVsICk7XHJcbiAgICAgICAgICAgIGxldCBmYWNlU2l6ZTpmMzIgPSBleHAyKCB0ZW1wTWlwSW50ICk7XHJcbiAgICAgICAgICAgIHZhciB1djp2ZWMyPGYzMj4gPSBnZXRVViggZGlyZWN0aW9uLCBmYWNlICkgKiAoIGZhY2VTaXplIC0gMi4wICkgKyAxLjA7XHJcbiAgICAgICAgICAgIGlmICggZmFjZSA+IDIuMCApIHtcclxuICAgICAgICAgICAgICAgIHV2LnkgKz0gZmFjZVNpemU7XHJcbiAgICAgICAgICAgICAgICBmYWNlIC09IDMuMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB1di54ICs9IGZhY2UgKiBmYWNlU2l6ZTtcclxuICAgICAgICAgICAgdXYueCArPSBmaWx0ZXJJbnQgKiAzLjAgKiBjdWJlVVZfbWluVGlsZVNpemU7XHJcbiAgICAgICAgICAgIHV2LnkgKz0gNC4wICogKCBleHAyKCBDVUJFVVZfTUFYX01JUCApIC0gZmFjZVNpemUgKTtcclxuICAgICAgICAgICAgdXYueCAqPSBDVUJFVVZfVEVYRUxfV0lEVEg7XHJcbiAgICAgICAgICAgIHV2LnkgKj0gQ1VCRVVWX1RFWEVMX0hFSUdIVDtcclxuICAgICAgICAgICAgcmV0dXJuIHRleHR1cmVTYW1wbGUoZW52VGV4dHVyZSxiYXNlU2FtcGxlcixkaXJlY3Rpb24pLnJnYjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3ViZVVWX3IwOmYzMj0gMS4wO1xyXG4gICAgICAgIGNvbnN0IGN1YmVVVl92MDpmMzI9IDAuMzM5O1xyXG4gICAgICAgIGNvbnN0IGN1YmVVVl9tMDpmMzI9IC0gMi4wO1xyXG4gICAgICAgIGNvbnN0IGN1YmVVVl9yMTpmMzI9IDAuODtcclxuICAgICAgICBjb25zdCBjdWJlVVZfdjE6ZjMyPSAwLjI3NjtcclxuICAgICAgICBjb25zdCBjdWJlVVZfbTE6ZjMyPSAtIDEuMDtcclxuICAgICAgICBjb25zdCBjdWJlVVZfcjQ6ZjMyPSAwLjQ7XHJcbiAgICAgICAgY29uc3QgY3ViZVVWX3Y0OmYzMj0gMC4wNDY7XHJcbiAgICAgICAgY29uc3QgY3ViZVVWX200OmYzMj0gMi4wO1xyXG4gICAgICAgIGNvbnN0IGN1YmVVVl9yNTpmMzI9IDAuMzA1O1xyXG4gICAgICAgIGNvbnN0IGN1YmVVVl92NTpmMzI9IDAuMDE2O1xyXG4gICAgICAgIGNvbnN0IGN1YmVVVl9tNTpmMzI9IDMuMDtcclxuICAgICAgICBjb25zdCBjdWJlVVZfcjY6ZjMyPSAwLjIxO1xyXG4gICAgICAgIGNvbnN0IGN1YmVVVl92NjpmMzI9IDAuMDAzODtcclxuICAgICAgICBjb25zdCBjdWJlVVZfbTY6ZjMyPSA0LjA7XHJcbiAgICAgICAgZm4gcm91Z2huZXNzVG9NaXAoIHJvdWdobmVzczpmMzIpLT5mMzIge1xyXG4gICAgICAgICAgICB2YXIgbWlwOmYzMiA9IDAuMDtcclxuICAgICAgICAgICAgaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3IxICkge1xyXG4gICAgICAgICAgICAgICAgbWlwID0gKCBjdWJlVVZfcjAgLSByb3VnaG5lc3MgKSAqICggY3ViZVVWX20xIC0gY3ViZVVWX20wICkgLyAoIGN1YmVVVl9yMCAtIGN1YmVVVl9yMSApICsgY3ViZVVWX20wO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3I0ICkge1xyXG4gICAgICAgICAgICAgICAgbWlwID0gKCBjdWJlVVZfcjEgLSByb3VnaG5lc3MgKSAqICggY3ViZVVWX200IC0gY3ViZVVWX20xICkgLyAoIGN1YmVVVl9yMSAtIGN1YmVVVl9yNCApICsgY3ViZVVWX20xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3I1ICkge1xyXG4gICAgICAgICAgICAgICAgbWlwID0gKCBjdWJlVVZfcjQgLSByb3VnaG5lc3MgKSAqICggY3ViZVVWX201IC0gY3ViZVVWX200ICkgLyAoIGN1YmVVVl9yNCAtIGN1YmVVVl9yNSApICsgY3ViZVVWX200O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3I2ICkge1xyXG4gICAgICAgICAgICAgICAgbWlwID0gKCBjdWJlVVZfcjUgLSByb3VnaG5lc3MgKSAqICggY3ViZVVWX202IC0gY3ViZVVWX201ICkgLyAoIGN1YmVVVl9yNSAtIGN1YmVVVl9yNiApICsgY3ViZVVWX201O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbWlwID0gLSAyLjAgKiBsb2cyKCAxLjE2ICogcm91Z2huZXNzICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG1pcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm4gdGV4dHVyZUN1YmVVVihlbnZUZXh0dXJlOnRleHR1cmVfY3ViZTxmMzI+LCBiYXNlU2FtcGxlcjpzYW1wbGVyLHNhbXBsZURpcjp2ZWMzPGYzMj4scm91Z2huZXNzOmYzMiApLT52ZWM0PGYzMj4ge1xyXG4gICAgICAgICAgICBsZXQgbWlwID0gY2xhbXAoIHJvdWdobmVzc1RvTWlwKCByb3VnaG5lc3MgKSwgY3ViZVVWX20wLCBDVUJFVVZfTUFYX01JUCApO1xyXG4gICAgICAgICAgICBsZXQgbWlwRiA9IGZyYWN0KCBtaXAgKTtcclxuICAgICAgICAgICAgbGV0IG1pcEludCA9IGZsb29yKCBtaXAgKTtcclxuICAgICAgICAgICAgbGV0IGNvbG9yMDp2ZWMzPGYzMj4gPSBiaWxpbmVhckN1YmVVViggZW52VGV4dHVyZSxiYXNlU2FtcGxlcixzYW1wbGVEaXIsIG1pcEludCApO1xyXG4gICAgICAgICAgICBpZiAoIG1pcEYgPT0gMC4wICkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZlYzQ8ZjMyPihjb2xvcjAsIDEuMCApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbG9yMTp2ZWMzPGYzMj4gPSBiaWxpbmVhckN1YmVVViggZW52VGV4dHVyZSxiYXNlU2FtcGxlciwgc2FtcGxlRGlyLCBtaXBJbnQgKyAxLjAgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2ZWM0PGYzMj4obWl4KCBjb2xvcjAsIGNvbG9yMSwgbWlwRiApLCAxLjAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgI2VuZGlmXHJcbiAgICNpZiAke2RlZmluZXMuVVNFX0VOVlRFWFRVUkV9XHJcbiAgICAgICAgZm4gZ2V0SUJMSXJyYWRpYW5jZSggbm9ybWFsOnZlYzM8ZjMyPixiYXNlU2FtcGxlcjpzYW1wbGVyLHZpZXdNYXRyaXg6bWF0NHg0PGYzMj4pLT52ZWMzPGYzMj4ge1xyXG4gICAgICAgICAgICAjaWYgJHtkZWZpbmVzLkVOVlRFWFRVUkVfVFlQRV9DVUJFX1VWfVxyXG4gICAgICAgICAgICAgICAgbGV0IHdvcmxkTm9ybWFsOnZlYzM8ZjMyPiA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xyXG4gICAgICAgICAgICAgICAgbGV0IGVudlRleHR1cmVDb2xvcjp2ZWM0PGYzMj4gPSB0ZXh0dXJlQ3ViZVVWKCBlbnZUZXh0dXJlLGJhc2VTYW1wbGVyLCB3b3JsZE5vcm1hbCwgMS4wICk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUEkgKiBlbnZUZXh0dXJlQ29sb3IucmdiICogbWF0ZXJpYWxVbmlmb3JtLmVudlRleHR1cmVJbnRlbnNpdHk7XHJcbiAgICAgICAgICAgICNlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmVjMzxmMzI+KCAwLjAgKTtcclxuICAgICAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZuIGdldElCTFJhZGlhbmNlKCB2aWV3RGlyOnZlYzM8ZjMyPixiYXNlU2FtcGxlcjpzYW1wbGVyLHZpZXdNYXRyaXg6bWF0NHg0PGYzMj4sbm9ybWFsOnZlYzM8ZjMyPiwgcm91Z2huZXNzOmYzMiApLT52ZWMzPGYzMj4ge1xyXG4gICAgICAgICAgICAjaWYgJHtkZWZpbmVzLkVOVlRFWFRVUkVfVFlQRV9DVUJFX1VWfVxyXG4gICAgICAgICAgICAgICAgdmFyIHJlZmxlY3RWZWM6dmVjMzxmMzI+ID0gcmVmbGVjdCggLSB2aWV3RGlyLCBub3JtYWwgKTtcclxuICAgICAgICAgICAgICAgIHJlZmxlY3RWZWMgPSBub3JtYWxpemUoIG1peCggcmVmbGVjdFZlYywgbm9ybWFsLCByb3VnaG5lc3MgKiByb3VnaG5lc3MpICk7XHJcbiAgICAgICAgICAgICAgICByZWZsZWN0VmVjID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggcmVmbGVjdFZlYywgdmlld01hdHJpeCApO1xyXG4gICAgICAgICAgICAgICAgbGV0IGVudlRleHR1cmVDb2xvcjp2ZWM0PGYzMj4gPSB0ZXh0dXJlQ3ViZVVWKCBlbnZUZXh0dXJlLGJhc2VTYW1wbGVyLCByZWZsZWN0VmVjLCByb3VnaG5lc3MgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZUZXh0dXJlQ29sb3IucmdiICogbWF0ZXJpYWxVbmlmb3JtLmVudlRleHR1cmVJbnRlbnNpdHk7XHJcbiAgICAgICAgICAgICNlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmVjMzxmMzI+KCAwLjAgKTtcclxuICAgICAgICAgICAgI2VuZGlmXHJcbiAgICAgICAgICAgIH1cclxuICAgICNlbmRpZlxyXG4gICBgO1xyXG59XHJcbiIsImV4cG9ydCBjb25zdCBpbnN0YW5jZVZlcnRIZWFkZXIgPSBgXG4gICAjaWYgVVNFX0lOU1RBTkNFXG4gICAgICBzdHJ1Y3QgSW5zdGFuY2VzVW5pZm9ybSB7XG4gICAgICAgICBpbnN0YW5jZU1hdHJpeHM6ICBhcnJheTxtYXQ0eDQ8ZjMyPiwgaW5zdGFuY2VDb3VudD4sXG4gICAgICB9O1xuICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKGluc3RhbmNlTWF0cml4c0J1ZmZlckJpbmRpbmcpIHZhcjxzdG9yYWdlLCByZWFkPiBpbnN0YW5jZXNVbmlmb3JtOiBJbnN0YW5jZXNVbmlmb3JtO1xuICAgICNlbmRpZlxuICAgYDtcblxuZXhwb3J0IGNvbnN0IGluc3RhbmNlVmVydE1haW4gPSBgXG4gICAgICAjaWYgVVNFX0lOU1RBTkNFXG4gICAgICAgICBtb2RlbE1hdHJpeD1pbnN0YW5jZXNVbmlmb3JtLmluc3RhbmNlTWF0cml4c1tpbnB1dC5pbnN0YW5jZUlkeF07XG4gICAgICAjZW5kaWZcbiAgIGA7XG4iLCJleHBvcnQgZGVmYXVsdCBgIFxuICAgIHN0cnVjdCBSZWZsZWN0ZWRMaWdodCB7XG4gICAgICAgIGFtYmllbnQ6IHZlYzM8ZjMyPixcbiAgICAgICAgZGlyZWN0RGlmZnVzZTp2ZWMzPGYzMj4sXG4gICAgICAgIGRpcmVjdFNwZWN1bGFyOnZlYzM8ZjMyPixcbiAgICAgICAgaW5kaXJlY3REaWZmdXNlOnZlYzM8ZjMyPixcbiAgICAgICAgaW5kaXJlY3RTcGVjdWxhcjp2ZWMzPGYzMj4sXG4gICAgICAgIHRlc3RDb2xvcjogdmVjMzxmMzI+LFxuICAgIH07IFxuICAgIHN0cnVjdCBJbmNpZGVudExpZ2h0IHtcbiAgICAgICAgY29sb3I6IHZlYzM8ZjMyPixcbiAgICAgICAgZGlyZWN0aW9uOiB2ZWMzPGYzMj4sXG4gICAgICAgIHZpc2libGU6IGJvb2wsXG4gICAgfTtcbiAgICBzdHJ1Y3QgR2VvbWV0cnkge1xuICAgICAgICBwb3NpdGlvbjogdmVjMzxmMzI+LFxuICAgICAgICBub3JtYWw6IHZlYzM8ZjMyPixcbiAgICAgICAgdmlld0RpcjogdmVjMzxmMzI+LFxuICAgICAgICBkb3ROVjpmMzIsXG4gICAgICAgICNpZiBVU0VfQ0xFQVJDT0FUXG4gICAgICAgICAgICB2ZWMzIGNsZWFyY29hdE5vcm1hbDtcbiAgICAgICAgI2VuZGlmXG4gICAgfTtcblxuICAgICNpZiBVU0VfU1BPVExJR0hUXG4gICAgICAgIHN0cnVjdCBTcG90TGlnaHQge1xuICAgICAgICAgICAgcG9zaXRpb246IHZlYzM8ZjMyPixcbiAgICAgICAgICAgIGRpc3RhbmNlOiBmMzIsXG4gICAgICAgICAgICBkaXJlY3Rpb246IHZlYzM8ZjMyPixcbiAgICAgICAgICAgIGNvbmVDb3M6IGYzMixcbiAgICAgICAgICAgIGNvbG9yOiB2ZWMzPGYzMj4sXG4gICAgICAgICAgICBwZW51bWJyYUNvczogZjMyLFxuICAgICAgICAgICAgZGVjYXk6IGYzMixcbiAgICAgICAgfTtcbiAgICAgICAgZm4gZ2V0U3BvdExpZ2h0SW5mbyhzcG90TGlnaHQ6U3BvdExpZ2h0LHdvcmxkUG9zOnZlYzM8ZjMyPixzaGluaW5lc3M6ZjMyLG46dmVjMzxmMzI+LHY6dmVjMzxmMzI+KS0+UmVmbGVjdGVkTGlnaHR7XG4gICAgICAgICAgICAgICAgdmFyIGRpcmVjdGlvbjp2ZWMzPGYzMj4gPSBzcG90TGlnaHQucG9zaXRpb24gLSB3b3JsZFBvcztcbiAgICAgICAgICAgICAgICB2YXIgbGlnaHRDb2xvcjpSZWZsZWN0ZWRMaWdodDtcbiAgICAgICAgICAgICAgICBsZXQgbGlnaHREaXN0YW5jZTpmMzIgPSBsZW5ndGgoZGlyZWN0aW9uKTtcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBub3JtYWxpemUoZGlyZWN0aW9uKTtcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGVDb3M6ZjMyID0gZG90KCBkaXJlY3Rpb24sIHNwb3RMaWdodC5kaXJlY3Rpb24gKTtcbiAgICAgICAgICAgICAgICBsZXQgZGVjYXk6ZjMyID0gY2xhbXAoMS4wIC0gcG93KGxpZ2h0RGlzdGFuY2Uvc3BvdExpZ2h0LmRpc3RhbmNlLCBzcG90TGlnaHQuZGVjYXkpLCAwLjAsIDEuMCk7XG4gICAgICAgICAgICAgICAgbGV0IHNwb3RFZmZlY3Q6ZjMyID0gc21vb3Roc3RlcCggc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBzcG90TGlnaHQuY29uZUNvcywgYW5nbGVDb3MgKTtcbiAgICAgICAgICAgICAgICBsZXQgZGVjYXlUb3RhbDpmMzIgPSBkZWNheSAqIHNwb3RFZmZlY3Q7XG4gICAgICAgICAgICAgICAgbGV0IGQ6ZjMyID0gbWF4KCBkb3QoIG4sIGRpcmVjdGlvbiApLCAwLjAgKSAgKiBkZWNheVRvdGFsO1xuICAgICAgICAgICAgICAgIGxpZ2h0Q29sb3IuZGlyZWN0RGlmZnVzZT0gc3BvdExpZ2h0LmNvbG9yICogZDtcbiAgICAgICAgICAgICAgICBsZXQgaGFsZkRpcjp2ZWMzPGYzMj4gPSBub3JtYWxpemUoIHYgKyBkaXJlY3Rpb24gKTtcbiAgICAgICAgICAgICAgICBsZXQgczpmMzIgPSBwb3coIGNsYW1wKCBkb3QoIG4sIGhhbGZEaXIgKSwgMC4wLCAxLjAgKSwgc2hpbmluZXNzICkgKiBkZWNheVRvdGFsO1xuICAgICAgICAgICAgICAgIGxpZ2h0Q29sb3IuZGlyZWN0U3BlY3VsYXI9IHNwb3RMaWdodC5jb2xvciAqIHM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpZ2h0Q29sb3I7XG4gICAgICAgIH1cbiAgICAgICAgZm4gZ2V0U3BvdExpZ2h0SW5jaWRlbnRMaWdodChzcG90TGlnaHQ6U3BvdExpZ2h0LCBnZW9tZXRyeTpHZW9tZXRyeSktPkluY2lkZW50TGlnaHQge1xuICAgICAgICAgICAgdmFyIGluY2lkZW50TGlnaHQ6SW5jaWRlbnRMaWdodDtcbiAgICAgICAgICAgIGxldCBsVmVjdG9yOnZlYzM8ZjMyPiA9IHNwb3RMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xuICAgICAgICAgICAgaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTtcbiAgICBcbiAgICAgICAgICAgIGxldCBsaWdodERpc3RhbmNlOmYzMiA9IGxlbmd0aCggbFZlY3RvciApO1xuICAgICAgICAgICAgbGV0IGFuZ2xlQ29zOmYzMiA9IGRvdCggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24sIHNwb3RMaWdodC5kaXJlY3Rpb24gKTtcbiAgICBcbiAgICAgICAgICAgIGxldCBzcG90RWZmZWN0OmYzMiA9IHNtb290aHN0ZXAoIHNwb3RMaWdodC5wZW51bWJyYUNvcywgc3BvdExpZ2h0LmNvbmVDb3MsIGFuZ2xlQ29zICk7XG4gICAgICAgICAgICBsZXQgZGVjYXlFZmZlY3Q6ZjMyID0gY2xhbXAoMS4wIC0gcG93KGxpZ2h0RGlzdGFuY2Uvc3BvdExpZ2h0LmRpc3RhbmNlLCA0LjApLCAwLjAsIDEuMCk7XG4gICAgXG4gICAgICAgICAgICBpbmNpZGVudExpZ2h0LmNvbG9yPXNwb3RMaWdodC5jb2xvcipzcG90RWZmZWN0ICogZGVjYXlFZmZlY3Q7IFxuICAgICAgICAgICAgcmV0dXJuICBpbmNpZGVudExpZ2h0O1xuICAgICAgICB9XG5cbiAgICAjZW5kaWYgXG5cbiAgICAjaWYgVVNFX1BPSU5UTElHSFRcbiAgICAgICAgc3RydWN0IFBvaW50TGlnaHQge1xuICAgICAgICAgICAgcG9zaXRpb246IHZlYzM8ZjMyPixcbiAgICAgICAgICAgIGRpc3RhbmNlOiBmMzIsXG4gICAgICAgICAgICBjb2xvcjogdmVjMzxmMzI+LFxuICAgICAgICAgICAgZGVjYXk6IGYzMixcbiAgICAgICAgfTtcbiAgICAgICAgZm4gZ2V0UG9pbnRMaWdodEluZm8ocG9pbnRMaWdodDpQb2ludExpZ2h0LHdvcmxkUG9zOnZlYzM8ZjMyPixzaGluaW5lc3M6ZjMyLG46dmVjMzxmMzI+LHY6dmVjMzxmMzI+KS0+UmVmbGVjdGVkTGlnaHR7XG4gICAgICAgICAgICB2YXIgbGlnaHRDb2xvcjpSZWZsZWN0ZWRMaWdodDtcbiAgICAgICAgICAgIHZhciBkaXJlY3Rpb246dmVjMzxmMzI+ID0gd29ybGRQb3MgLSBwb2ludExpZ2h0LnBvc2l0aW9uO1xuICAgICAgICAgICAgbGV0IGRpc3Q6ZjMyID0gbGVuZ3RoKCBkaXJlY3Rpb24gKTtcbiAgICAgICAgICAgIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZShkaXJlY3Rpb24pO1xuICAgICAgICAgICAgbGV0IGRlY2F5ID0gY2xhbXAoMS4wIC0gcG93KGRpc3QgLyBwb2ludExpZ2h0LmRpc3RhbmNlLCBwb2ludExpZ2h0LmRlY2F5KSwgMC4wLCAxLjApO1xuICAgIFxuICAgICAgICAgICAgbGV0IGQgPSAgbWF4KCBkb3QoIG4sIC1kaXJlY3Rpb24gKSwgMC4wICkgKiBkZWNheTtcbiAgICAgICAgICAgIGxpZ2h0Q29sb3IuZGlyZWN0RGlmZnVzZSA9IHBvaW50TGlnaHQuY29sb3IgKiBkO1xuICAgIFxuICAgICAgICAgICAgbGV0IGhhbGZEaXI6dmVjMzxmMzI+ID0gbm9ybWFsaXplKCB2IC0gZGlyZWN0aW9uICk7XG4gICAgICAgICAgICBsZXQgczpmMzIgPSBwb3coIGNsYW1wKCBkb3QoIG4sIGhhbGZEaXIgKSwgMC4wLCAxLjAgKSwgc2hpbmluZXNzICkgICogZGVjYXk7XG4gICAgICAgICAgICBsaWdodENvbG9yLmRpcmVjdFNwZWN1bGFyID0gcG9pbnRMaWdodC5jb2xvciAqIHM7XG4gICAgICAgICAgICByZXR1cm4gbGlnaHRDb2xvcjtcbiAgICAgICAgfVxuICAgICAgICBmbiBnZXRQb2ludExpZ2h0SW5jaWRlbnRMaWdodChwb2ludExpZ2h0OlBvaW50TGlnaHQsIGdlb21ldHJ5Okdlb21ldHJ5KS0+SW5jaWRlbnRMaWdodCB7XG4gICAgICAgICAgICB2YXIgaW5jaWRlbnRMaWdodDpJbmNpZGVudExpZ2h0O1xuICAgICAgICAgICAgbGV0IGxWZWN0b3I6dmVjMzxmMzI+ID0gcG9pbnRMaWdodC5wb3NpdGlvbi1nZW9tZXRyeS5wb3NpdGlvbjtcbiAgICAgICAgICAgIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uPSBub3JtYWxpemUoIGxWZWN0b3IgKTtcbiAgICAgICAgICAgIGxldCBsaWdodERpc3RhbmNlOmYzMiA9IGxlbmd0aCggbFZlY3RvciApO1xuICAgICAgICAgICAgLy8gbGV0IHdlaWdodDpmMzI9MS4wIC0gcG93KGxpZ2h0RGlzdGFuY2UvcG9pbnRMaWdodC5kaXN0YW5jZSwgNC4wKTtcbiAgICAgICAgICAgIGluY2lkZW50TGlnaHQuY29sb3I9cG9pbnRMaWdodC5jb2xvcipjbGFtcCgxLjAgLSBwb3cobGlnaHREaXN0YW5jZS9wb2ludExpZ2h0LmRpc3RhbmNlLCA0LjApLCAwLjAsIDEuMCk7XG4gICAgICAgICAgICByZXR1cm4gaW5jaWRlbnRMaWdodDtcbiAgICAgICAgfVxuICAgICNlbmRpZlxuICAgICNpZiBVU0VfRElSVEVDVExJR0hUXG4gICAgICAgIHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogdmVjMzxmMzI+LFxuICAgICAgICAgICAgY29sb3I6IHZlYzM8ZjMyPixcbiAgICAgICAgfTtcbiAgICAgICAgZm4gZ2V0RGlyZWN0TGlnaHRJbmZvKGRpcmVjdGlvbmFsTGlnaHQ6RGlyZWN0aW9uYWxMaWdodCxzaGluaW5lc3M6ZjMyLG46dmVjMzxmMzI+LHY6dmVjMzxmMzI+KS0+UmVmbGVjdGVkTGlnaHR7XG4gICAgICAgICAgICB2YXIgbGlnaHRDb2xvcjpSZWZsZWN0ZWRMaWdodDtcbiAgICAgICAgICAgIGxldCBkOmYzMiA9IG1heChkb3QobiwgLWRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uKSwgMC4wKTtcbiAgICAgICAgICAgIGxpZ2h0Q29sb3IuZGlyZWN0RGlmZnVzZSArPSBkaXJlY3Rpb25hbExpZ2h0LmNvbG9yICogZDtcbiAgICBcbiAgICAgICAgICAgIGxldCBoYWxmRGlyOnZlYzM8ZjMyPiA9IG5vcm1hbGl6ZSggdiAtIGRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uICk7XG4gICAgICAgICAgICBsZXQgczpmMzIgPSBwb3coIGNsYW1wKCBkb3QoIG4sIGhhbGZEaXIgKSwgMC4wLCAxLjAgKSwgc2hpbmluZXNzICk7XG4gICAgICAgICAgICBsaWdodENvbG9yLmRpcmVjdFNwZWN1bGFyICs9IGRpcmVjdGlvbmFsTGlnaHQuY29sb3IgKiBzO1xuICAgICAgICAgICAgcmV0dXJuIGxpZ2h0Q29sb3I7XG4gICAgICAgIH1cbiAgICAgICAgZm4gZ2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodEluY2lkZW50TGlnaHQoZGlyZWN0aW9uYWxMaWdodDpEaXJlY3Rpb25hbExpZ2h0LGdlb21ldHJ5Okdlb21ldHJ5KS0+SW5jaWRlbnRMaWdodCB7XG4gICAgICAgICAgICB2YXIgaW5jaWRlbnRMaWdodDpJbmNpZGVudExpZ2h0O1xuICAgICAgICAgICAgaW5jaWRlbnRMaWdodC5jb2xvciA9IGRpcmVjdGlvbmFsTGlnaHQuY29sb3I7XG4gICAgICAgICAgICBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZShkaXJlY3Rpb25hbExpZ2h0LmRpcmVjdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gaW5jaWRlbnRMaWdodDsgICAgICAgICBcbiAgICAgICAgfVxuICAgICNlbmRpZlxuXG4gICAgI2lmIE9QRU5fU0hBRE9XIFxuICAgICAgICBzdHJ1Y3QgTGlnaHRJbmZvIHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogdmVjMzxmMzI+LFxuICAgICAgICAgICAgdmlld3BvcnQ6IHZlYzQ8ZjMyPixcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIGZuIGxpbmVhcml6ZURlcHRoKGRlcHRoOiBmMzIsIG5lYXI6IGYzMiwgZmFyOiBmMzIpLT5mMzIge1xuICAgICAgICAgICAgcmV0dXJuIDIgKiAobmVhciAqIGZhcikgLyAoZmFyICsgbmVhciAtIGRlcHRoICogKGZhciAtIG5lYXIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuIGdldEN1YmVGYWNlKHYgOiB2ZWMzPGYzMj4pIC0+IGkzMntcbiAgICAgICAgICAgIGxldCB2QWJzID0gYWJzKHYpO1xuICAgICAgICBcbiAgICAgICAgICAgIGlmICh2QWJzLnogPj0gdkFicy54ICYmIHZBYnMueiA+PSB2QWJzLnkpIHtcbiAgICAgICAgICAgICAgaWYgKHYueiA8IDAuMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgICAgIGlmICh2QWJzLnkgPj0gdkFicy54KSB7XG4gICAgICAgICAgICAgIGlmICh2LnkgPCAwLjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gNTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICBpZiAodi54IDwgMC4wKSB7XG4gICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBmbiBnZXRTaGFkb3dWYWx1ZShzaGFkb3dNYXBBcnJheTp0ZXh0dXJlX2RlcHRoXzJkX2FycmF5LCBzaGFkb3dTYW1wbGVyOnNhbXBsZXJfY29tcGFyaXNvbiwgbGlnaHRQb3M6dmVjNDxmMzI+LCBnZW9tZXRyeTpHZW9tZXRyeSwgbGlnaHRJbmZvOkxpZ2h0SW5mbywgaW5kZXg6dTMyLCBpc1BvaW50TGlnaHQ6IGJvb2wsIG5lYXI6IGYzMiwgZmFyOiBmMzIpLT5mMzIge1xuICAgICAgICAgICAgdmFyIHZpc2liaWxpdHkgPSAwLjA7XG4gICAgICAgICAgICB2YXIgcHJvamVjdFBvczogdmVjMzxmMzI+ID0gbGlnaHRQb3MueHl6IC8gbGlnaHRQb3MudztcbiAgICAgICAgICAgIHZhciBzaGFkb3dQb3M6IHZlYzM8ZjMyPiA9IHZlYzMocHJvamVjdFBvcy54eSAqIHZlYzIoMC41LCAtMC41KSArIHZlYzIoMC41KSwgcHJvamVjdFBvcy56KTtcbiAgICAgICAgICAgIHZhciBkOmYzMiA9IGRvdChnZW9tZXRyeS5ub3JtYWwsIC1saWdodEluZm8uZGlyZWN0aW9uKTtcbiAgICAgICAgICAgIHZhciBiaWFzID0gbWF4KDAuMDEyICogKDEuMCAtIGQpLCAwLjAwMSkgLyBsaWdodFBvcy53O1xuICAgICAgICAgICAgbGV0IG9uZU92ZXJTaGFkb3dEZXB0aFRleHR1cmVTaXplID0gMS4wIC8gMTAyNC4wO1xuICAgICAgICAgICAgLy8gdmFyIGRlcHRoID0gc2VsZWN0KHNoYWRvd1Bvcy56LCAobGluZWFyaXplRGVwdGgoc2hhZG93UG9zLnosIG5lYXIsIGZhcikgLSBuZWFyKSAvIChmYXItIG5lYXIpLCBpc1BlcnNwZWN0aXZlQ2FtZXJhKTtcbiAgICAgICAgICAgIHZhciBkZXB0aCA9IHNoYWRvd1Bvcy56O1xuXG4gICAgICAgICAgICBpZiAoaXNQb2ludExpZ2h0KSB7XG4gICAgICAgICAgICAgICAgc2hhZG93UG9zLnggPSBzaGFkb3dQb3MueCAqIGxpZ2h0SW5mby52aWV3cG9ydC56O1xuICAgICAgICAgICAgICAgIHNoYWRvd1Bvcy55ID0gc2hhZG93UG9zLnkgKiBsaWdodEluZm8udmlld3BvcnQudztcbiAgICAgICAgICAgICAgICB2YXIgdmlld3BvcnRYID0gbGlnaHRJbmZvLnZpZXdwb3J0LnggKiBsaWdodEluZm8udmlld3BvcnQuejtcbiAgICAgICAgICAgICAgICB2YXIgdmlld3BvcnRZID0gbGlnaHRJbmZvLnZpZXdwb3J0LnkgKiBsaWdodEluZm8udmlld3BvcnQudztcbiAgICAgICAgICAgICAgICB2YXIgdXZPZmZzZXQgPSAxLjUgLyAxMDI0LjA7XG4gICAgICAgICAgICAgICAgc2hhZG93UG9zLnggPSBjbGFtcChzaGFkb3dQb3MueCArIHZpZXdwb3J0WCwgdmlld3BvcnRYICsgdXZPZmZzZXQsIHZpZXdwb3J0WCArIGxpZ2h0SW5mby52aWV3cG9ydC56IC0gdXZPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHNoYWRvd1Bvcy55ID0gY2xhbXAoc2hhZG93UG9zLnkgKyB2aWV3cG9ydFksIHZpZXdwb3J0WSArIHV2T2Zmc2V0LCB2aWV3cG9ydFkgKyBsaWdodEluZm8udmlld3BvcnQudyAtIHV2T2Zmc2V0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yICh2YXIgeSA9IC0xOyB5IDw9IDE7IHkrKykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAtMTsgeCA8PSAxOyB4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IHZlYzI8ZjMyPih2ZWMyKHgsIHkpKSAqIG9uZU92ZXJTaGFkb3dEZXB0aFRleHR1cmVTaXplO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5ICs9IHRleHR1cmVTYW1wbGVDb21wYXJlKFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93TWFwQXJyYXksIHNoYWRvd1NhbXBsZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dQb3MueHkgKyBvZmZzZXQsIGluZGV4LCBkZXB0aCAtIGJpYXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpc2liaWxpdHkgLz0gOS4wO1xuICAgICAgICAgICAgdmFyIGluRnJ1c3R1bSA9IHNoYWRvd1Bvcy54ID49IDAuMCAmJiBzaGFkb3dQb3MueCA8PSAxLjAgJiYgc2hhZG93UG9zLnkgPj0gMC4wICYmIHNoYWRvd1Bvcy55IDw9IDEuMDtcbiAgICAgICAgICAgIGlmICghaW5GcnVzdHVtIHx8IGRlcHRoID4gMS4wKSB7XG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eSA9IDEuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2aXNpYmlsaXR5O1xuICAgICAgICB9XG4gICAgI2VuZGlmXG5cbiAgICAjaWYgVVNFX0FNQklFTlRMSUdIVHx8VVNFX1NQT1RMSUdIVHx8VVNFX1BPSU5UTElHSFR8fFVTRV9ESVJURUNUTElHSFRcbiAgICAgICAgc3RydWN0IExpZ2h0VW5pZm9ybXN7XG4gICAgICAgICAgICAjaWYgVVNFX0FNQklFTlRMSUdIVFxuICAgICAgICAgICAgICAgIGFtYmllbnQ6dmVjNDxmMzI+LFxuICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgICAjaWYgVVNFX1NQT1RMSUdIVFxuICAgICAgICAgICAgICAgIHNwb3RMaWdodHM6YXJyYXk8U3BvdExpZ2h0LHNwb3RMaWdodHNDb3VudD4sXG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgICNpZiBVU0VfUE9JTlRMSUdIVFxuICAgICAgICAgICAgICAgIHBvaW50TGlnaHRzOmFycmF5PFBvaW50TGlnaHQscG9pbnRMaWdodHNDb3VudD4sXG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgICNpZiBVU0VfRElSVEVDVExJR0hUXG4gICAgICAgICAgICAgICAgZGlydGVjdExpZ2h0czphcnJheTxEaXJlY3Rpb25hbExpZ2h0LGRpcnRlY3RMaWdodHNDb3VudD4sXG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgfVxuICAgICAgICBAZ3JvdXAoMikgQGJpbmRpbmcobGlnaHRCaW5kaW5nKSB2YXI8c3RvcmFnZSwgcmVhZD4gbGlnaHRVbmlmb3JtczogTGlnaHRVbmlmb3JtcztcblxuICAgICAgICAjaWYgT1BFTl9TSEFET1dcbiAgICAgICAgICAgICNpZiBVU0VfU1BPVExJR0hUX1NIQURPV01BUFxuICAgICAgICAgICAgICAgIHN0cnVjdCBTcG90TGlnaHRTaGFkb3cge1xuICAgICAgICAgICAgICAgICAgICBzaGFkb3dDYW1lcmFWUE1hdHJpeDogbWF0NHg0PGYzMj4sXG4gICAgICAgICAgICAgICAgICAgIHNoYWRvd0NhbWVyYU5lYXI6IGYzMixcbiAgICAgICAgICAgICAgICAgICAgc2hhZG93Q2FtZXJhRmFyOiBmMzJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgICNpZiBVU0VfUE9JTlRMSUdIVF9TSEFET1dNQVBcbiAgICAgICAgICAgICAgICBzdHJ1Y3QgUG9pbnRMaWdodFNoYWRvdyB7XG4gICAgICAgICAgICAgICAgICAgIHNoYWRvd0NhbWVyYVZQTWF0cml4QXJyYXk6IGFycmF5PG1hdDR4NDxmMzI+LCA2PixcbiAgICAgICAgICAgICAgICAgICAgc2hhZG93Q2FtZXJhVmlld3BvcnRBcnJheTogYXJyYXk8dmVjNDxmMzI+LCA2PixcbiAgICAgICAgICAgICAgICAgICAgc2hhZG93Q2FtZXJhTmVhcjogZjMyLFxuICAgICAgICAgICAgICAgICAgICBzaGFkb3dDYW1lcmFGYXI6IGYzMixcbiAgICAgICAgICAgICAgICAgICAgLy8gc2hhZG93Q2FtZXJhVlBNYXRyaXg6IG1hdDR4NDxmMzI+LFxuICAgICAgICAgICAgICAgICAgICAvLyBzaGFkb3dDYW1lcmFWUE1hdHJpeEFycmF5OiBhcnJheTxtYXQ0eDQ8ZjMyPiwgNj4sXG4gICAgICAgICAgICAgICAgICAgIC8vIHNoYWRvd0NhbWVyYVZpZXdwb3J0QXJyYXk6IGFycmF5PHZlYzQ8ZjMyPiwgNj4sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgICAjaWYgVVNFX0RJUkVDVExJR0hUX1NIQURPV01BUFxuICAgICAgICAgICAgICAgIHN0cnVjdCBEaXJlY3RMaWdodFNoYWRvdyB7XG4gICAgICAgICAgICAgICAgICAgIHNoYWRvd0NhbWVyYVZQTWF0cml4OiBtYXQ0eDQ8ZjMyPixcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgIHN0cnVjdCBTaGFkb3dVbmlmb3Jtc3tcbiAgICAgICAgICAgICAgICAjaWYgVVNFX1NQT1RMSUdIVF9TSEFET1dNQVBcbiAgICAgICAgICAgICAgICAgICAgc3BvdExpZ2h0U2hhZG93czphcnJheTxTcG90TGlnaHRTaGFkb3csc3BvdExpZ2h0U2hhZG93TWFwc0NvdW50PixcbiAgICAgICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgICAgICAjaWYgVVNFX1BPSU5UTElHSFRfU0hBRE9XTUFQXG4gICAgICAgICAgICAgICAgICAgIHBvaW50TGlnaHRTaGFkb3dzOmFycmF5PFBvaW50TGlnaHRTaGFkb3cscG9pbnRMaWdodFNoYWRvd01hcHNDb3VudD4sXG4gICAgICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgICAgICAgI2lmIFVTRV9ESVJFQ1RMSUdIVF9TSEFET1dNQVBcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0TGlnaHRTaGFkb3dzOmFycmF5PERpcmVjdExpZ2h0U2hhZG93LGRpcmVjdExpZ2h0U2hhZG93TWFwc0NvdW50PixcbiAgICAgICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBncm91cCgyKSBAYmluZGluZyhzaGFkb3dCaW5kaW5nKSB2YXI8c3RvcmFnZSwgcmVhZD4gc2hhZG93VW5pZm9ybXM6IFNoYWRvd1VuaWZvcm1zO1xuXG4gICAgICAgICAgICAjaWYgU1BPVExJR0hUX1NIQURPV01BUF9URVhUVVJFQVJSQVlcbiAgICAgICAgICAgICAgICBAZ3JvdXAoMikgQGJpbmRpbmcoc3BvdExpZ2h0U2hhZG93TWFwVGV4dHVyZUFycmF5QmluZGluZykgdmFyIHNwb3RMaWdodFNoYWRvd01hcFRleHR1cmVBcnJheTogdGV4dHVyZV9kZXB0aF8yZF9hcnJheTtcbiAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgI2lmIFBPSU5UTElHSFRfU0hBRE9XTUFQX1RFWFRVUkVBUlJBWVxuICAgICAgICAgICAgICAgIEBncm91cCgyKSBAYmluZGluZyhwb2ludExpZ2h0U2hhZG93TWFwVGV4dHVyZUFycmF5QmluZGluZykgdmFyIHBvaW50TGlnaHRTaGFkb3dNYXBUZXh0dXJlQXJyYXk6IHRleHR1cmVfZGVwdGhfMmRfYXJyYXk7XG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgICNpZiBESVJFQ1RMSUdIVF9TSEFET1dNQVBfVEVYVFVSRUFSUkFZXG4gICAgICAgICAgICAgICAgQGdyb3VwKDIpIEBiaW5kaW5nKGRpcmVjdExpZ2h0U2hhZG93TWFwVGV4dHVyZUFycmF5QmluZGluZykgdmFyIGRpcmVjdExpZ2h0U2hhZG93TWFwVGV4dHVyZUFycmF5OiB0ZXh0dXJlX2RlcHRoXzJkX2FycmF5O1xuICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgICBAZ3JvdXAoMikgQGJpbmRpbmcoc2hhZG93U2FtcGxlckJpbmRpbmcpIHZhciBzaGFkb3dTYW1wbGVyOiBzYW1wbGVyX2NvbXBhcmlzb247XG4gICAgICAgICNlbmRpZlxuXG4gICAgI2VuZGlmXG4gICAgI2lmIE1BVEVSSUFMX1BIT05HXG4gICAgICAgIGZuIHBhcnNlTGlnaHRzKGdlb21ldHJ5Okdlb21ldHJ5LHNoaW5pbmVzczpmMzIpLT5SZWZsZWN0ZWRMaWdodCB7XG4gICAgI2VsaWYgTUFURVJJQUxfUEJSXG4gICAgICAgIGZuIHBhcnNlTGlnaHRzKGdlb21ldHJ5Okdlb21ldHJ5LG1hdGVyaWFsOlBoeXNpY2FsTWF0ZXJpYWwpLT5SZWZsZWN0ZWRMaWdodHtcbiAgICAjZW5kaWZcbiAgICAgICAgdmFyIHJlZmxlY3RlZExpZ2h0OlJlZmxlY3RlZExpZ2h0O1xuICAgICAgICB2YXIgc2hhZG93VmFsdWU6ZjMyID0gMS4wO1xuICAgICAgICAjaWYgVVNFX0FNQklFTlRMSUdIVFxuICAgICAgICAgICAgLy/lpITnkIbnjq/looPlhYlcbiAgICAgICAgICAgIHZhciBhbWJpZW50Q29sb3I6dmVjMzxmMzI+ID0gbGlnaHRVbmlmb3Jtcy5hbWJpZW50Lnh5eiAqIGxpZ2h0VW5pZm9ybXMuYW1iaWVudC53O1xuICAgICAgICAgICAgcmVmbGVjdGVkTGlnaHQuYW1iaWVudCArPSBhbWJpZW50Q29sb3I7XG4gICAgICAgICNlbmRpZlxuXG4gICAgICAgICNpZiBVU0VfU1BPVExJR0hUXG4gICAgICAgICAgICAvL+WkhOeQhuiBmuWFieeBr1xuICAgICAgICAgICAgdmFyIHNwb3RMaWdodDpTcG90TGlnaHQ7XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gMHU7IGsgPCBzcG90TGlnaHRzQ291bnQ7IGsgPSBrICsgMXUpIHtcbiAgICAgICAgICAgICAgICBzcG90TGlnaHQ9IGxpZ2h0VW5pZm9ybXMuc3BvdExpZ2h0c1trXTtcbiAgICAgICAgICAgICAgICAjaWYgTUFURVJJQUxfUEhPTkcmJk9QRU5fU0hBRE9XJiZVU0VfU1BPVExJR0hUX1NIQURPV01BUFxuICAgICAgICAgICAgICAgICAgICBpZiBrIDwgdGV4dHVyZU51bUxheWVycyhzcG90TGlnaHRTaGFkb3dNYXBUZXh0dXJlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcG90TGlnaHRTaGFkb3c6U3BvdExpZ2h0U2hhZG93ID0gc2hhZG93VW5pZm9ybXMuc3BvdExpZ2h0U2hhZG93c1trXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaWdodFBvczogdmVjNDxmMzI+ID0gc3BvdExpZ2h0U2hhZG93LnNoYWRvd0NhbWVyYVZQTWF0cml4ICogdmVjNDxmMzI+KGdlb21ldHJ5LnBvc2l0aW9uLDEuMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGlnaHRJbmZvOkxpZ2h0SW5mbztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0SW5mby5kaXJlY3Rpb24gPSBub3JtYWxpemUoZ2VvbWV0cnkucG9zaXRpb24gLSBzcG90TGlnaHQucG9zaXRpb24pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dWYWx1ZSA9IGdldFNoYWRvd1ZhbHVlKHNwb3RMaWdodFNoYWRvd01hcFRleHR1cmVBcnJheSwgc2hhZG93U2FtcGxlciwgbGlnaHRQb3MsIGdlb21ldHJ5LCBsaWdodEluZm8sIGssIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dDYW1lcmFOZWFyLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93Q2FtZXJhRmFyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzcG90TGlnaHQuY29sb3IgKj0gc2hhZG93VmFsdWU7XG4gICAgICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgICAgICAgI2lmIE1BVEVSSUFMX1BIT05HXG4gICAgICAgICAgICAgICAgICAgIGxldCBzcFJlZmxlY3RlZExpZ2h0PWdldFNwb3RMaWdodEluZm8oc3BvdExpZ2h0LGdlb21ldHJ5LnBvc2l0aW9uLHNoaW5pbmVzcyxnZW9tZXRyeS5ub3JtYWwsZ2VvbWV0cnkudmlld0Rpcik7XG4gICAgICAgICAgICAgICAgI2VsaWYgTUFURVJJQUxfUEJSXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmNpZGVudExpZ2h0PWdldFNwb3RMaWdodEluY2lkZW50TGlnaHQoc3BvdExpZ2h0LGdlb21ldHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwUmVmbGVjdGVkTGlnaHQ9ZGlyZWN0X1BoeXNpY2FsKGluY2lkZW50TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCk7XG4gICAgICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICAgICByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlKz1zcFJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2U7XG4gICAgICAgICAgICAgICAgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIrPXNwUmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICNlbmRpZlxuICAgICAgICAjaWYgVVNFX1BPSU5UTElHSFRcbiAgICAgICAgICAgIC8v5aSE55CG54K55YWJ5rqQXG4gICAgICAgICAgICB2YXIgcG9pbnRMaWdodDpQb2ludExpZ2h0O1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDB1OyBqIDwgcG9pbnRMaWdodHNDb3VudDtqID0gaiArIDF1KSB7XG4gICAgICAgICAgICAgICAgcG9pbnRMaWdodCA9IGxpZ2h0VW5pZm9ybXMucG9pbnRMaWdodHNbal07XG4gICAgICAgICAgICAgICAgI2lmIE1BVEVSSUFMX1BIT05HJiZPUEVOX1NIQURPVyYmVVNFX1BPSU5UTElHSFRfU0hBRE9XTUFQXG4gICAgICAgICAgICAgICAgICAgIGlmIGogPCB0ZXh0dXJlTnVtTGF5ZXJzKHBvaW50TGlnaHRTaGFkb3dNYXBUZXh0dXJlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb2ludExpZ2h0U2hhZG93OlBvaW50TGlnaHRTaGFkb3cgPSBzaGFkb3dVbmlmb3Jtcy5wb2ludExpZ2h0U2hhZG93c1tqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaWdodEluZm86TGlnaHRJbmZvO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlnaHRJbmZvLmRpcmVjdGlvbiA9IG5vcm1hbGl6ZShnZW9tZXRyeS5wb3NpdGlvbiAtIHBvaW50TGlnaHQucG9zaXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1YmVGYWNlID0gZ2V0Q3ViZUZhY2UobGlnaHRJbmZvLmRpcmVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGlnaHRQb3M6IHZlYzQ8ZjMyPiA9IHBvaW50TGlnaHRTaGFkb3cuc2hhZG93Q2FtZXJhVlBNYXRyaXhBcnJheVtjdWJlRmFjZV0gKiB2ZWM0PGYzMj4oZ2VvbWV0cnkucG9zaXRpb24sMS4wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0SW5mby52aWV3cG9ydCA9IHBvaW50TGlnaHRTaGFkb3cuc2hhZG93Q2FtZXJhVmlld3BvcnRBcnJheVtjdWJlRmFjZV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhciBsaWdodFBvczogdmVjNDxmMzI+ID0gcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dDYW1lcmFWUE1hdHJpeCAqIHZlYzQ8ZjMyPihnZW9tZXRyeS5wb3NpdGlvbiwxLjApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dWYWx1ZSA9IGdldFNoYWRvd1ZhbHVlKHBvaW50TGlnaHRTaGFkb3dNYXBUZXh0dXJlQXJyYXksIHNoYWRvd1NhbXBsZXIsIGxpZ2h0UG9zLCBnZW9tZXRyeSwgbGlnaHRJbmZvLCBqLCB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93Q2FtZXJhTmVhciwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dDYW1lcmFGYXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZsZWN0ZWRMaWdodC50ZXN0Q29sb3IgPSB2ZWMzKHBvaW50TGlnaHRTaGFkb3cuc2hhZG93Q2FtZXJhRmFyIC8gMTAwMCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dDYW1lcmFWUE1hdHJpeEFycmF5WzVdWzNdWzJdIC8gMjU1LCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0NhbWVyYVZQTWF0cml4QXJyYXlbNV1bM11bM10gLyAyNTUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmbGVjdGVkTGlnaHQudGVzdENvbG9yID0gdmVjMyhwb2ludExpZ2h0U2hhZG93LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93Q2FtZXJhTmVhciwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dDYW1lcmFOZWFyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwb2ludExpZ2h0LmNvbG9yICo9IHNoYWRvd1ZhbHVlO1xuICAgICAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgICAgICNpZiBNQVRFUklBTF9QSE9OR1xuICAgICAgICAgICAgICAgICAgICBsZXQgcG9pUmVmbGVjdGVkTGlnaHQ9Z2V0UG9pbnRMaWdodEluZm8ocG9pbnRMaWdodCxnZW9tZXRyeS5wb3NpdGlvbixzaGluaW5lc3MsZ2VvbWV0cnkubm9ybWFsLGdlb21ldHJ5LnZpZXdEaXIpO1xuICAgICAgICAgICAgICAgICNlbGlmIE1BVEVSSUFMX1BCUlxuICAgICAgICAgICAgICAgICAgIGxldCBpbmNpZGVudExpZ2h0PWdldFBvaW50TGlnaHRJbmNpZGVudExpZ2h0KHBvaW50TGlnaHQsZ2VvbWV0cnkpO1xuICAgICAgICAgICAgICAgICAgIGxldCBwb2lSZWZsZWN0ZWRMaWdodD1kaXJlY3RfUGh5c2ljYWwoaW5jaWRlbnRMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsKTtcbiAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgIHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UrPXBvaVJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2U7XG4gICAgICAgICAgICAgICAgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIrPXBvaVJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyO1xuICAgICAgICAgICAgfVxuICAgICAgICAjZW5kaWZcbiAgICAgICAgI2lmIFVTRV9ESVJURUNUTElHSFRcbiAgICAgICAgICAgIC8v5aSE55CG5pa55ZCR5YWJXG4gICAgICAgICAgICB2YXIgZGlyZWN0aW9uYWxMaWdodDpEaXJlY3Rpb25hbExpZ2h0O1xuICAgICAgICAgICAgZm9yICh2YXIgaT0gMHU7IGkgPGRpcnRlY3RMaWdodHNDb3VudDsgaSA9IGkgKyAxdSkge1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbmFsTGlnaHQgPSBsaWdodFVuaWZvcm1zLmRpcnRlY3RMaWdodHNbaV07XG4gICAgICAgICAgICAgICAgI2lmIE1BVEVSSUFMX1BIT05HJiZPUEVOX1NIQURPVyYmVVNFX0RJUkVDVExJR0hUX1NIQURPV01BUFxuICAgICAgICAgICAgICAgICAgICBpZiBpIDwgdGV4dHVyZU51bUxheWVycyhkaXJlY3RMaWdodFNoYWRvd01hcFRleHR1cmVBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpcmVjdExpZ2h0U2hhZG93OkRpcmVjdExpZ2h0U2hhZG93ID0gc2hhZG93VW5pZm9ybXMuZGlyZWN0TGlnaHRTaGFkb3dzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpZ2h0UG9zOiB2ZWM0PGYzMj4gPSBkaXJlY3RMaWdodFNoYWRvdy5zaGFkb3dDYW1lcmFWUE1hdHJpeCAqIHZlYzQ8ZjMyPihnZW9tZXRyeS5wb3NpdGlvbiwxLjApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpZ2h0SW5mbzpMaWdodEluZm87XG4gICAgICAgICAgICAgICAgICAgICAgICBsaWdodEluZm8uZGlyZWN0aW9uID0gZGlyZWN0aW9uYWxMaWdodC5kaXJlY3Rpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dWYWx1ZSA9IGdldFNoYWRvd1ZhbHVlKGRpcmVjdExpZ2h0U2hhZG93TWFwVGV4dHVyZUFycmF5LCBzaGFkb3dTYW1wbGVyLCBsaWdodFBvcywgZ2VvbWV0cnksIGxpZ2h0SW5mbywgaSwgZmFsc2UsIDAsIDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbmFsTGlnaHQuY29sb3IgKj0gc2hhZG93VmFsdWU7XG4gICAgICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAjaWYgTUFURVJJQUxfUEhPTkdcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpclJlZmxlY3RlZExpZ2h0PWdldERpcmVjdExpZ2h0SW5mbyhkaXJlY3Rpb25hbExpZ2h0LHNoaW5pbmVzcyxnZW9tZXRyeS5ub3JtYWwsZ2VvbWV0cnkudmlld0Rpcik7XG4gICAgICAgICAgICAgICAgI2VsaWYgTUFURVJJQUxfUEJSXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmNpZGVudExpZ2h0PWdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJbmNpZGVudExpZ2h0KGRpcmVjdGlvbmFsTGlnaHQsZ2VvbWV0cnkpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGlyUmVmbGVjdGVkTGlnaHQ9ZGlyZWN0X1BoeXNpY2FsKGluY2lkZW50TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCk7XG4gICAgICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICAgICByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlKz1kaXJSZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlO1xuICAgICAgICAgICAgICAgIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyKz1kaXJSZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgI2VuZGlmXG4gICAgICAgIHJldHVybiByZWZsZWN0ZWRMaWdodDtcbiAgICB9YDtcbiIsImV4cG9ydCBkZWZhdWx0IGBcbiAgICBzdHJ1Y3QgUmVmbGVjdGVkTGlnaHQge1xuICAgICAgICBkaXJlY3REaWZmdXNlOnZlYzM8ZjMyPixcbiAgICAgICAgZGlyZWN0U3BlY3VsYXI6dmVjMzxmMzI+LFxuICAgICAgICBpbmRpcmVjdERpZmZ1c2U6dmVjMzxmMzI+LFxuICAgICAgICBpbmRpcmVjdFNwZWN1bGFyOnZlYzM8ZjMyPixcbiAgICB9O1xuICAgIHN0cnVjdCBHZW9tZXRyeSB7XG4gICAgICAgIHBvc2l0aW9uOiB2ZWMzPGYzMj4sXG4gICAgICAgIG5vcm1hbDogdmVjMzxmMzI+LFxuICAgICAgICB2aWV3RGlyOiB2ZWMzPGYzMj4sXG4gICAgICAgICNpZiBVU0VfQ0xFQVJDT0FUXG4gICAgICAgICAgICB2ZWMzIGNsZWFyY29hdE5vcm1hbDtcbiAgICAgICAgI2VuZGlmXG4gICAgfTtcbiAgICBmbiBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKGFtYmllbnRMaWdodENvbG9yOiB2ZWMzPGYzMj4pIC0+IHZlYzM8ZjMyPiB7XG4gICAgICAgIGxldCBpcnJhZGlhbmNlID0gYW1iaWVudExpZ2h0Q29sb3I7XG4gICAgICAgIHJldHVybiBpcnJhZGlhbmNlO1xuICAgIH1cbiAgICBmbiBnZXREaXN0YW5jZUF0dGVudWF0aW9uKGxpZ2h0RGlzdGFuY2U6IGYzMiwgY3V0b2ZmRGlzdGFuY2U6IGYzMiwgZGVjYXlFeHBvbmVudDogZjMyKSAtPiBmMzIge1xuICAgICAgICBpZiAoY3V0b2ZmRGlzdGFuY2UgPiAwLjAgJiYgZGVjYXlFeHBvbmVudCA+IDAuMCkge1xuICAgICAgICAgICAgbGV0IHg6ZjMyID0gc2F0dXJhdGUoLSBsaWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKyAxLjApO1xuICAgICAgICAgICAgcmV0dXJuIHBvdyh4LCBkZWNheUV4cG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMS4wO1xuICAgIH1cbiAgICBmbiBnZXRTcG90QXR0ZW51YXRpb24oY29uZUNvc2luZTogZjMyLCBwZW51bWJyYUNvc2luZTogZjMyLCBhbmdsZUNvc2luZTogZjMyKSAtPiBmMzIge1xuICAgICAgICByZXR1cm4gc21vb3Roc3RlcChjb25lQ29zaW5lLCBwZW51bWJyYUNvc2luZSwgYW5nbGVDb3NpbmUpO1xuICAgIH1cbiAgICBmbiBzaEdldElycmFkaWFuY2VBdCggbm9ybWFsOnZlYzM8ZjMyPiwgc2hDb2VmZmljaWVudHM6YXJyYXk8dmVjMzxmMzI+LDk+KS0+dmVjMzxmMzI+IHtcbiAgICAgICAgbGV0IHg6ZjMyID0gbm9ybWFsLng7IFxuICAgICAgICBsZXQgeTpmMzIgPSBub3JtYWwueTsgXG4gICAgICAgIGxldCB6OmYzMiA9IG5vcm1hbC56O1xuICAgICAgICB2YXIgcmVzdWx0OnZlYzM8ZjMyPiA9IHNoQ29lZmZpY2llbnRzWyAwIF0gKiAwLjg4NjIyNztcbiAgICAgICAgcmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAxIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHk7XG4gICAgICAgIHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6O1xuICAgICAgICByZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDtcbiAgICAgICAgcmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA0IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB5O1xuICAgICAgICByZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDUgXSAqIDIuMCAqIDAuNDI5MDQzICogeSAqIHo7XG4gICAgICAgIHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNiBdICogKCAwLjc0MzEyNSAqIHogKiB6IC0gMC4yNDc3MDggKTtcbiAgICAgICAgcmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA3IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB6O1xuICAgICAgICByZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDggXSAqIDAuNDI5MDQzICogKCB4ICogeCAtIHkgKiB5ICk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGZuIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGRpcjp2ZWMzPGYzMj4sIG1hdHJpeDptYXQ0eDQ8ZjMyPiApLT52ZWMzPGYzMj4ge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQ8ZjMyPiggZGlyLCAwLjAgKSAqIG1hdHJpeCApLnh5eiApO1xuICAgIH1cbiBgO1xuIiwiZXhwb3J0IGNvbnN0IGdldE5vcm1hbCA9IGBcbiAgICAgIGZuIGdldE5vcm1hbChpbnB1dDpGcmFnSW5wdXQpLT52ZWMzPGYzMj57XG4gICAgICAgIHZhciBub3JtYWw6dmVjMzxmMzI+O1xuICAgICAgICAjaWYgSEFTX05PUk1BTFxuICAgICAgICAgICAgbm9ybWFsPSBpbnB1dC5ub3JtYWw7XG4gICAgICAgICNlbHNlXG4gICAgICAgICAgbGV0IHBvc19keCA9IGRwZHgoaW5wdXQud29ybGRQb3MpO1xuICAgICAgICAgIGxldCBwb3NfZHkgPSBkcGR5KGlucHV0LndvcmxkUG9zKTtcbiAgICAgICAgICBub3JtYWwgPSBub3JtYWxpemUoIGNyb3NzKHBvc19keSwgcG9zX2R4KSApO1xuICAgICAgICAjZW5kaWZcbiAgICAgICAgcmV0dXJuIG5vcm1hbCooZjMyKGlucHV0LmZyb250RmFjaW5nKSAqIDIuMCAtIDEuMCk7XG4gICAgICB9XG4gICAgYDtcbmV4cG9ydCBjb25zdCBnZXROb3JtYWxCeU5vcm1hbFRleHR1cmUgPSBgXG4gICAgICBmbiBnZXROb3JtYWxCeU5vcm1hbFRleHR1cmUoaW5wdXQ6RnJhZ0lucHV0KS0+dmVjMzxmMzI+e1xuICAgICAgICB2YXIgbjp2ZWMzPGYzMj4gPSB0ZXh0dXJlU2FtcGxlKG5vcm1hbFRleHR1cmUsbm9ybWFsU2FtcGxlciwgaW5wdXQudXYpLnJnYjtcbiAgICAgICAgbGV0IHRibjptYXQzeDM8ZjMyPiA9Z2V0VEJOKGlucHV0KTtcbiAgICAgICAgbiA9IG5vcm1hbGl6ZSh0Ym4gKiAoMi4wICogbiAtIHZlYzMoMS4wKSkpO1xuICAgICAgICBuPW4qKGYzMihpbnB1dC5mcm9udEZhY2luZykgKiAyLjAgLSAxLjApO1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cbiAgICBgO1xuZXhwb3J0IGNvbnN0IGdldFRCTiA9IGBcbiAgICAgICAgZm4gZ2V0VEJOKGlucHV0OkZyYWdJbnB1dCktPm1hdDN4MzxmMzI+e1xuICAgICAgICAjaWYgSEFTX1RBTkdFTlRcbiAgICAgICAgICAgIGxldCB0Ym46bWF0M3gzPGYzMj4gPSBpbnB1dC50Ym47XG4gICAgICAgICNlbHNlXG4gICAgICAgICAgICBsZXQgbm9ybWFsOnZlYzM8ZjMyPiA9bm9ybWFsaXplKGlucHV0Lm5vcm1hbCk7XG4gICAgICAgICAgICBsZXQgdXY6dmVjMjxmMzI+ID0gc2VsZWN0KC1pbnB1dC51dixpbnB1dC51dixpbnB1dC5mcm9udEZhY2luZyk7XG4gICAgICAgICAgICAgIC8vIHJlZjogaHR0cDovL3d3dy50aGV0ZW50aHBsYW5ldC5kZS9hcmNoaXZlcy8xMTgwXG4gICAgICAgICAgICAgIC8vIGdldCBlZGdlIHZlY3RvcnMgb2YgdGhlIHBpeGVsIHRyaWFuZ2xlXG4gICAgICAgICAgICAgIGxldCBkcDE6dmVjMzxmMzI+ID0gIHZlYzM8ZjMyPihkcGR4KGlucHV0LndvcmxkUG9zLngpLCBkcGR4KGlucHV0LndvcmxkUG9zLnkpLCBkcGR4KGlucHV0LndvcmxkUG9zLnopKTtcbiAgICAgICAgICAgICAgbGV0IGRwMjp2ZWMzPGYzMj4gPSAgdmVjMzxmMzI+KGRwZHkoaW5wdXQud29ybGRQb3MueCksIGRwZHkoaW5wdXQud29ybGRQb3MueSksIGRwZHkoaW5wdXQud29ybGRQb3MueikpO1xuICAgICAgICAgICAgICBsZXQgZHV2MTp2ZWMyPGYzMj4gPSBkcGR4KHV2KTtcbiAgICAgICAgICAgICAgbGV0IGR1djI6dmVjMjxmMzI+ID0gZHBkeSh1dik7XG5cbiAgICAgICAgICAgICAgLy8gc29sdmUgdGhlIGxpbmVhciBzeXN0ZW1cbiAgICAgICAgICAgICAgbGV0IGRwMnBlcnA6dmVjMzxmMzI+ID0gY3Jvc3MoZHAyLCBub3JtYWwpO1xuICAgICAgICAgICAgICBsZXQgZHAxcGVycDp2ZWMzPGYzMj4gPSBjcm9zcyhub3JtYWwsIGRwMSk7XG4gICAgICAgICAgICAgIGxldCB0YW5nZW50OnZlYzM8ZjMyPiA9IGRwMnBlcnAgKiBkdXYxLnggKyBkcDFwZXJwICogZHV2Mi54O1xuICAgICAgICAgICAgICBsZXQgYmlub3JtYWw6dmVjMzxmMzI+ID0gZHAycGVycCAqIGR1djEueSArIGRwMXBlcnAgKiBkdXYyLnk7XG4gICAgICAgICAgICAgIC8vIGNvbnN0cnVjdCBhIHNjYWxlLWludmFyaWFudCBmcmFtZSBcbiAgICAgICAgICAgICAgbGV0IHJlc3VsdDpmMzI9bWF4KGRvdCh0YW5nZW50LCB0YW5nZW50KSwgZG90KGJpbm9ybWFsLCBiaW5vcm1hbCkpO1xuICAgICAgICAgICAgICBsZXQgaW52bWF4OmYzMiA9IDEuMC9zcXJ0KHJlc3VsdCk7XG4gICAgICAgICAgICAgIGxldCB0Ym46bWF0M3gzPGYzMj4gPSBtYXQzeDM8ZjMyPih0YW5nZW50ICogaW52bWF4LCBiaW5vcm1hbCAqIGludm1heCwgbm9ybWFsKTtcbiAgICAgICAgI2VuZGlmXG4gICAgICAgIHJldHVybiB0Ym47XG4gICAgICB9XG4gIGA7XG4iLCJleHBvcnQgZGVmYXVsdCBgXG4gICAgICAgICNpZiBVU0VfU0hFRU5cbiAgICAgICAgICAgICAgICBmbiBEX0NoYXJsaWUoIHJvdWdobmVzczpmMzIsZG90Tkg6ZjMyICktPmYzMiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbHBoYTpmMzIgPSBwb3cyKCByb3VnaG5lc3MgKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGludkFscGhhOmYzMiA9IDEuMCAvIGFscGhhO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29zMmg6ZjMyID0gZG90TkggKiBkb3ROSDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNpbjJoOmYzMiA9IG1heCggMS4wIC0gY29zMmgsIDAuMDA3ODEyNSApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCAyLjAgKyBpbnZBbHBoYSApICogcG93KCBzaW4yaCwgaW52QWxwaGEgKiAwLjUgKSAvICggMi4wICogcGkgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm4gVl9OZXViZWx0KCBkb3ROVjpmMzIsIGRvdE5MOmYzMiApLT5mMzIge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2F0dXJhdGUoIDEuMCAvICggNC4wICogKCBkb3ROTCArIGRvdE5WIC0gZG90TkwgKiBkb3ROViApICkgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm4gQlJERl9TaGVlbihsaWdodERpcjp2ZWMzPGYzMj4sIHZpZXdEaXI6dmVjMzxmMzI+LCBub3JtYWw6dmVjMzxmMzI+LHNoZWVuQ29sb3I6dmVjMzxmMzI+LHNoZWVuUm91Z2huZXNzOmYzMiApLT52ZWMzPGYzMj4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGFsZkRpcjp2ZWMzPGYzMj4gPSBub3JtYWxpemUoIGxpZ2h0RGlyICsgdmlld0RpciApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG90Tkw6ZjMyID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBsaWdodERpciApICk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkb3ROVjpmMzIgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG90Tkg6ZjMyID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IEQ6ZjMyID0gRF9DaGFybGllKCBzaGVlblJvdWdobmVzcywgZG90TkggKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IFY6ZjMyID0gVl9OZXViZWx0KCBkb3ROViwgZG90TkwgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNoZWVuQ29sb3IgKiAoIEQgKiBWICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAjZW5kaWZcbiAgICAgICAgZm4gQlJERl9MYW1iZXJ0KGRpZmZ1c2VDb2xvcjp2ZWMzPGYzMj4pLT52ZWMzPGYzMj4ge1xuXG4gICAgICAgICAgICByZXR1cm4gcmVjaXByb2NhbF9waSAqIGRpZmZ1c2VDb2xvcjtcblxuICAgICAgICB9IC8vIHZhbGlkYXRlZFxuXG4gICAgICAgIGZuIEZfU2NobGljayggZjA6dmVjMzxmMzI+LCBkb3RWSDpmMzIgKS0+dmVjMzxmMzI+IHtcblxuICAgICAgICAgICAgLy8gT3JpZ2luYWwgYXBwcm94aW1hdGlvbiBieSBDaHJpc3RvcGhlIFNjaGxpY2sgJzk0XG4gICAgICAgICAgICAvLyBmbG9hdCBmcmVzbmVsID0gcG93KCAxLjAgLSBkb3RWSCwgNS4wICk7XG5cbiAgICAgICAgICAgIC8vIE9wdGltaXplZCB2YXJpYW50IChwcmVzZW50ZWQgYnkgRXBpYyBhdCBTSUdHUkFQSCAnMTMpXG4gICAgICAgICAgICAvLyBodHRwczovL2NkbjIudW5yZWFsZW5naW5lLmNvbS9SZXNvdXJjZXMvZmlsZXMvMjAxM1NpZ2dyYXBoUHJlc2VudGF0aW9uc05vdGVzLTI2OTE1NzM4LnBkZlxuICAgICAgICAgICBsZXQgZnJlc25lbCA9IGV4cDIoICggLSA1LjU1NDczICogZG90VkggLSA2Ljk4MzE2ICkgKiBkb3RWSCApO1xuICAgICAgICAgICByZXR1cm4gKCAxLjAgLSBmMCApICogZnJlc25lbCArIGYwO1xuXG4gICAgICAgIH0gLy8gdmFsaWRhdGVkXG5cbiAgICAgICAgZm4gU2NobGlja190b19GMChmOnZlYzM8ZjMyPiwgZjkwOmYzMiwgZG90Vkg6ZjMyICktPnZlYzM8ZjMyPiB7XG4gICAgICAgICAgICBsZXQgeDpmMzIgPSBjbGFtcCggMS4wIC0gZG90VkgsIDAuMCwgMS4wICk7XG4gICAgICAgICAgICBsZXQgeDI6ZjMyID0geCAqIHg7XG4gICAgICAgICAgICBsZXQgeDU6ZjMyID0gY2xhbXAoIHggKiB4MiAqIHgyLCAwLjAsIDAuOTk5OSApO1xuXG4gICAgICAgICAgICByZXR1cm4gKCBmIC0gdmVjMyggZjkwICkgKiB4NSApIC8gKCAxLjAgLSB4NSApO1xuICAgICAgICB9XG4gICAgICAgIGZuIFZfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGE6ZjMyLCBkb3ROTDpmMzIsZG90TlY6ZjMyICktPmYzMiB7XG5cbiAgICAgICAgICAgIGxldCBhMiA6ZjMyPSBwb3cyKCBhbHBoYSApO1xuXG4gICAgICAgICAgICBsZXQgZ3Y6ZjMyID0gZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcbiAgICAgICAgICAgIGxldCBnbDpmMzIgPSBkb3ROViAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TkwgKSApO1xuXG4gICAgICAgICAgICByZXR1cm4gMC41IC8gbWF4KChndiArIGdsKSwgMC4wMDAwMDAwMDEgKTtcblxuICAgICAgICB9XG4gICAgICAgIGZuIERfZ2d4KCBhbHBoYTpmMzIsIGRvdE5IOmYzMiApLT5mMzIge1xuXG4gICAgICAgICAgICBsZXQgYTI6ZjMyID0gcG93MiggYWxwaGEgKTtcblxuICAgICAgICAgICAgbGV0IGRlbm9tOmYzMiA9IHBvdzIoIGRvdE5IICkgKiAoIGEyIC0gMS4wICkgKyAxLjA7IC8vIGF2b2lkIGFscGhhID0gMCB3aXRoIGRvdE5IID0gMVxuXG4gICAgICAgICAgICByZXR1cm4gcmVjaXByb2NhbF9waSAqIGEyIC8gcG93MiggZGVub20gKTtcblxuICAgICAgICB9XG4gICAgICAgIGZuIEJSREZfZ2d4KCBsaWdodERpcjp2ZWMzPGYzMj4sIHZpZXdEaXI6dmVjMzxmMzI+LCBub3JtYWw6dmVjMzxmMzI+LCBmMDp2ZWMzPGYzMj4sICByb3VnaG5lc3M6ZjMyICktPnZlYzM8ZjMyPiB7XG5cbiAgICAgICAgICAgIGxldCBhbHBoYTpmMzIgPSBwb3cyKCByb3VnaG5lc3MgKTsgLy8gVUU0J3Mgcm91Z2huZXNzXG5cbiAgICAgICAgICAgIGxldCBoYWxmRGlyID0gbm9ybWFsaXplKCBsaWdodERpciArIHZpZXdEaXIgKTtcblxuICAgICAgICAgICAgbGV0IGRvdE5MOmYzMiA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgbGlnaHREaXIgKSApO1xuICAgICAgICAgICAgbGV0IGRvdE5WOmYzMiA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XG4gICAgICAgICAgICBsZXQgZG90Tkg6ZjMyID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTtcbiAgICAgICAgICAgIGxldCBkb3RWSDpmMzIgPSBzYXR1cmF0ZSggZG90KCBsaWdodERpciwgaGFsZkRpciApICk7XG5cbiAgICAgICAgICAgIGxldCBmID0gRl9TY2hsaWNrKCBmMCwgIGRvdFZIICk7XG5cbiAgICAgICAgICAgIGxldCB2ID0gVl9HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7XG5cbiAgICAgICAgICAgIGxldCBkID0gRF9nZ3goIGFscGhhLCBkb3ROSCApO1xuXG4gICAgICAgICAgICByZXR1cm4gZiAqICggdiAqIGQgKTtcblxuICAgICAgICB9XG4gICAgICAgIGZuIGRpcmVjdF9QaHlzaWNhbCggZGlyZWN0TGlnaHQ6SW5jaWRlbnRMaWdodCwgZ2VvbWV0cnk6R2VvbWV0cnksbWF0ZXJpYWw6UGh5c2ljYWxNYXRlcmlhbCktPlJlZmxlY3RlZExpZ2h0IHtcbiAgICAgICAgICAgIHZhciByZWZsZWN0ZWRMaWdodDpSZWZsZWN0ZWRMaWdodDtcbiAgICAgICAgICAgIGxldCBkb3ROTDpmMzIgPSBzYXR1cmF0ZShkb3QoIGdlb21ldHJ5Lm5vcm1hbCxnZW9tZXRyeS52aWV3RGlyKSk7XG4gICAgICAgICAgICBsZXQgaXJyYWRpYW5jZTp2ZWMzPGYzMj4gPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yKjMuMTQxNTkyNjtcbiAgICAgICAgICAgIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyID0gaXJyYWRpYW5jZSAqIEJSREZfZ2d4KCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwucm91Z2huZXNzICk7XG4gICAgICAgICAgICByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlID0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG4gICAgICAgICAgICByZXR1cm4gcmVmbGVjdGVkTGlnaHQ7XG4gICAgICAgIH1cbiAgYDtcbiIsImV4cG9ydCBkZWZhdWx0IGBcbiAgZm4gZ2V0TGlnaHRQcm9iZVJhZGlhbmNlKCB2aWV3RGlyOnZlYzM8ZjMyPixub3JtYWw6dmVjMzxmMzI+LCByb3VnaG5lc3M6ZjMyICktPnZlYzM8ZjMyPntcbiAgICB2YXIgcmVmbGVjdFZlYzp2ZWMzPGYzMj4gPSByZWZsZWN0KCAtdmlld0Rpciwgbm9ybWFsICk7XG4gICAgcmVmbGVjdFZlYy54ID0gLXJlZmxlY3RWZWMueDsgLy8gVGV4dHVyZUN1YmUgaXMgbGVmdC1oYW5kLHNvIHggbmVlZCBpbnZlcnNlXG4gICAgbGV0IG1pcENvdW50OmYzMiA9IDEwLjA7IC8vIHJlc29sdXRpb24gb2YgMjU2eDI1NlxuICAgIGxldCBsb2Q6ZjMyID0gcm91Z2huZXNzICogbWlwQ291bnQ7XG4gICAgbGV0IHNwZWN1bGFyTGlnaHQ6dmVjMzxmMzI+ID0gdGV4dHVyZVNhbXBsZUxldmVsKHNwZWN1bGFyRW52VGV4dHVyZSxzcGVjdWxhckVudlNhbXBsZXIsIHJlZmxlY3RWZWMsIGxvZCkucmdiO1xuICAgIHJldHVybiBzcGVjdWxhckxpZ2h0O1xuICB9XG4gIGZuIGdldExpZ2h0UHJvYmVJcnJhZGlhbmNlKCBsaWdodFByb2JlOmFycmF5PHZlYzM8ZjMyPiw5Piwgbm9ybWFsOnZlYzM8ZjMyPiktPnZlYzM8ZjMyPiB7XG4gICAgdmFyIHdvcmxkTm9ybWFsOnZlYzM8ZjMyPiA9IG5vcm1hbDtcbiAgICB3b3JsZE5vcm1hbC54ID0gLW5vcm1hbC54O1xuICAgIHZhciBpcnJhZGlhbmNlOnZlYzM8ZjMyPiA9IGxpZ2h0UHJvYmVbMF07XG4gICAgaXJyYWRpYW5jZSs9bGlnaHRQcm9iZVsxXSAqIChub3JtYWwueSk7XG4gICAgaXJyYWRpYW5jZSs9bGlnaHRQcm9iZVsyXSAqIChub3JtYWwueikgO1xuICAgIGlycmFkaWFuY2UrPWxpZ2h0UHJvYmVbM10gKiAobm9ybWFsLngpIDtcblxuICAgIGlycmFkaWFuY2UrPWxpZ2h0UHJvYmVbNF0gKiAobm9ybWFsLnkgKiBub3JtYWwueCkgO1xuICAgIGlycmFkaWFuY2UrPWxpZ2h0UHJvYmVbNV0gKiAobm9ybWFsLnkgKiBub3JtYWwueikgO1xuICAgIGlycmFkaWFuY2UrPWxpZ2h0UHJvYmVbNl0gKiAoMy4wICogbm9ybWFsLnogKiBub3JtYWwueiAtIDEuMCk7XG4gICAgaXJyYWRpYW5jZSs9bGlnaHRQcm9iZVs3XSAqIChub3JtYWwueiAqIG5vcm1hbC54KSA7XG4gICAgaXJyYWRpYW5jZSs9bGlnaHRQcm9iZVs4XSAqIChub3JtYWwueCAqIG5vcm1hbC54IC0gbm9ybWFsLnkgKiBub3JtYWwueSk7XG5cbiAgICByZXR1cm4gbWF4KGlycmFkaWFuY2UsIHZlYzM8ZjMyPigwLjAsMC4wLDAuMCkpO1xuICB9XG4gIGZuIERGR0FwcHJveCggc3BlY3VsYXJDb2xvcjp2ZWMzPGYzMj4sIHJvdWdobmVzczpmMzIsZG90TlY6ZjMyICktPnZlYzM8ZjMyPiB7XG4gICAgY29uc3QgYzA6dmVjNDxmMzI+ID0gdmVjNDxmMzI+KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApO1xuICAgIGxldCBjMTp2ZWM0PGYzMj4gPSB2ZWM0PGYzMj4oIDEsIDAuMDQyNSwgMS4wNCwgLSAwLjA0ICk7XG4gICAgbGV0IHI6dmVjNDxmMzI+ID0gcm91Z2huZXNzICogYzAgKyBjMTtcbiAgICBsZXQgYTAwNDpmMzIgPSBtaW4oIHIueCAqIHIueCwgZXhwMiggLSA5LjI4ICogZG90TlYgKSApICogci54ICsgci55O1xuICAgIGxldCBmYWI6dmVjMjxmMzI+ID0gdmVjMjxmMzI+KCAtIDEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xuICAgIHJldHVybiBzcGVjdWxhckNvbG9yICogZmFiLnggKyBmYWIueTtcbiAgfVxuICAvL+mXtOaOpeWFieeFp1xuICBmbiBpbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoZ2VvbWV0cnk6R2VvbWV0cnksIG1hdGVyaWFsOlBoeXNpY2FsTWF0ZXJpYWwgKS0+UmVmbGVjdGVkTGlnaHQge1xuICAgICAgdmFyIHJlZmxlY3RlZExpZ2h0OlJlZmxlY3RlZExpZ2h0O1xuICAgICAgdmFyIGlycmFkaWFuY2U6dmVjMzxmMzI+ID0gbGlnaHRVbmlmb3Jtcy5hbWJpZW50Lnh5eipsaWdodFVuaWZvcm1zLmFtYmllbnQudztcbiAgICAgIGlycmFkaWFuY2UgKj0gcGk7XG4gICAgICByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG4gICAgICByZXR1cm4gcmVmbGVjdGVkTGlnaHQ7XG4gIH1cbiAgLy/pl7TmjqXpq5jlhYlcbiAgZm4gaW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbChnZW9tZXRyeTpHZW9tZXRyeSwgbWF0ZXJpYWw6UGh5c2ljYWxNYXRlcmlhbCktPlJlZmxlY3RlZExpZ2h0IHtcbiAgICAgIHZhciByZWZsZWN0ZWRMaWdodDpSZWZsZWN0ZWRMaWdodDtcbiAgICAgIC8vIElCTCBzcGVjdWxhclxuICAgICAgbGV0IHJhZGlhbmNlOnZlYzM8ZjMyPiA9IGdldExpZ2h0UHJvYmVSYWRpYW5jZShnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIG1hdGVyaWFsLnJvdWdobmVzcyk7XG4gICAgICBsZXQgcmFkaWFuY2VBdHRlbnVhdGlvbjpmMzIgPSAxLjA7XG4gICAgICByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IHJhZGlhbmNlQXR0ZW51YXRpb24gKiByYWRpYW5jZSAqIERGR0FwcHJveChtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5yb3VnaG5lc3MsIGdlb21ldHJ5LmRvdE5WICk7XG4gICAgICByZXR1cm4gcmVmbGVjdGVkTGlnaHQ7XG4gICAgfVxuICBgO1xuIiwiaW1wb3J0IHsgd2dzbFBhcnNlRGVmaW5lcyB9IGZyb20gXCIuLi8uLi9XZ3NsUHJlcHJvY2Vzc29yXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBickZ1bmN0aW9uKGRlZmluZXMpIHtcblx0cmV0dXJuIHdnc2xQYXJzZURlZmluZXNgXG5cbiAgICAjaWYgJHtkZWZpbmVzLkRJVEhFUklOR31cbiAgICAgICAgZm4gZGl0aGVyaW5nKGNvbG9yOnZlYzM8ZjMyPiApLT52ZWMzPGYzMj4ge1xuICAgICAgICAgICAgbGV0IGdyaWRfcG9zaXRpb246ZjMyID0gcmFuZCggZ2xfRnJhZ0Nvb3JkLnh5ICk7XG4gICAgICAgICAgICBsZXQgZGl0aGVyX3NoaWZ0X1JHQjp2ZWMzPGYzMj4gPSB2ZWMzPGYzMj4oIDAuMjUgLyAyNTUuMCwgLTAuMjUgLyAyNTUuMCwgMC4yNSAvIDI1NS4wICk7XG4gICAgICAgICAgICBkaXRoZXJfc2hpZnRfUkdCID0gbWl4KCAyLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCAtMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgZ3JpZF9wb3NpdGlvbiApO1xuICAgICAgICAgICAgcmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjtcbiAgICAgICAgfVxuICAgICNlbmRpZlxuXG4gICAgI2lmICR7ZGVmaW5lcy5VU0VfSVJJREVTQ0VOQ0V9XG4gICAgICAgIGZuIEJSREZfR0dYX0lyaWRlc2NlbmNlKCBsaWdodERpcjp2ZWMzPGYzMj4sIHZpZXdEaXI6dmVjMzxmMzI+LG5vcm1hbDp2ZWMzPGYzMj4sIGYwOnZlYzM8ZjMyPiwgZjkwOmYzMixpcmlkZXNjZW5jZTpmMzIsIGlyaWRlc2NlbmNlRnJlc25lbDp2ZWMzPGYzMj4scm91Z2huZXNzOmYzMiApLT52ZWMzPGYzMj4ge1xuICAgICAgICAgICAgbGV0IGFscGhhOmYzMiA9IHBvdzIoIHJvdWdobmVzcyApO1xuICAgICAgICAgICAgbGV0IGhhbGZEaXI6dmVjMzxmMzI+ID0gbm9ybWFsaXplKCBsaWdodERpciArIHZpZXdEaXIgKTtcbiAgICAgICAgICAgIGxldCBkb3ROTDpmMzIgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGxpZ2h0RGlyICkgKTtcbiAgICAgICAgICAgIGxldCBkb3ROVjpmMzIgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApO1xuICAgICAgICAgICAgbGV0IGRvdE5IOmYzMiA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgaGFsZkRpciApICk7XG4gICAgICAgICAgICBsZXQgZG90Vkg6ZjMyID0gc2F0dXJhdGUoIGRvdCggdmlld0RpciwgaGFsZkRpciApICk7XG4gICAgICAgICAgICBsZXQgZjp2ZWMzPGYzMj4gPSBtaXgoIEZfU2NobGljayggZjAsIGY5MCwgZG90VkggKSwgaXJpZGVzY2VuY2VGcmVzbmVsLCBpcmlkZXNjZW5jZSApO1xuICAgICAgICAgICAgbGV0IHY6ZjMyID0gVl9HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7XG4gICAgICAgICAgICBsZXQgZDpmMzIgPSBEX2dneChhbHBoYSwgZG90TkggKTtcbiAgICAgICAgICAgIHJldHVybiBmICogKCB2ICogZCApO1xuICAgICAgICB9XG4gICAgI2VuZGlmXG5cbiAgICAjaWYgJHtkZWZpbmVzLlVTRV9TSEVFTn1cbiAgICAgICAgZm4gRF9DaGFybGllKCByb3VnaG5lc3M6ZjMyLGRvdE5IOmYzMiApLT5mMzIge1xuICAgICAgICAgICAgbGV0IGFscGhhOmYzMiA9IHBvdzIoIHJvdWdobmVzcyApO1xuICAgICAgICAgICAgbGV0IGludkFscGhhOmYzMiA9IDEuMCAvIGFscGhhO1xuICAgICAgICAgICAgbGV0IGNvczJoOmYzMiA9IGRvdE5IICogZG90Tkg7XG4gICAgICAgICAgICBsZXQgc2luMmg6ZjMyID0gbWF4KCAxLjAgLSBjb3MyaCwgMC4wMDc4MTI1ICk7XG4gICAgICAgICAgICByZXR1cm4gKCAyLjAgKyBpbnZBbHBoYSApICogcG93KCBzaW4yaCwgaW52QWxwaGEgKiAwLjUgKSAvICggMi4wICogcGkgKTtcbiAgICAgICAgfVxuICAgICAgICBmbiBWX05ldWJlbHQoIGRvdE5WOmYzMiwgZG90Tkw6ZjMyICktPmYzMiB7XG4gICAgICAgICAgICByZXR1cm4gc2F0dXJhdGUoIDEuMCAvICggNC4wICogKCBkb3ROTCArIGRvdE5WIC0gZG90TkwgKiBkb3ROViApICkgKTtcbiAgICAgICAgfVxuICAgICAgICBmbiBCUkRGX1NoZWVuKGxpZ2h0RGlyOnZlYzM8ZjMyPiwgdmlld0Rpcjp2ZWMzPGYzMj4sIG5vcm1hbDp2ZWMzPGYzMj4sc2hlZW5Db2xvcjp2ZWMzPGYzMj4sc2hlZW5Sb3VnaG5lc3M6ZjMyICktPnZlYzM8ZjMyPiB7XG4gICAgICAgICAgICBsZXQgaGFsZkRpcjp2ZWMzPGYzMj4gPSBub3JtYWxpemUoIGxpZ2h0RGlyICsgdmlld0RpciApO1xuICAgICAgICAgICAgbGV0IGRvdE5MOmYzMiA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgbGlnaHREaXIgKSApO1xuICAgICAgICAgICAgbGV0IGRvdE5WOmYzMiA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XG4gICAgICAgICAgICBsZXQgZG90Tkg6ZjMyID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTtcbiAgICAgICAgICAgIGxldCBkOmYzMiA9IERfQ2hhcmxpZSggc2hlZW5Sb3VnaG5lc3MsIGRvdE5IICk7XG4gICAgICAgICAgICBsZXQgdjpmMzIgPSBWX05ldWJlbHQoIGRvdE5WLCBkb3ROTCApO1xuICAgICAgICAgICAgcmV0dXJuIHNoZWVuQ29sb3IgKiAoIGQgKiB2ICk7XG4gICAgICAgIH1cbiAgICAjZW5kaWZcblxuICAgICNpZiAke2RlZmluZXMuVVNFX0lSSURFU0NFTkNFfVxuICAgICAgICBsZXQgWFlaX1RPX1JFQzcwOTogbWF0M3gzPGYzMj4gPSBtYXQzeDM8ZjMyPihcbiAgICAgICAgMy4yNDA0NTQyLCAtMC45NjkyNjYwLCAwLjA1NTY0MzQsIC0xLjUzNzEzODUsIDEuODc2MDEwOCwgLTAuMjA0MDI1OSwgLTAuNDk4NTMxNCwgMC4wNDE1NTYwLCAxLjA1NzIyNTJcbiAgICAgICAgKTtcbiAgICAgICAgZm4gRnJlc25lbDBUb0lvciggZnJlc25lbDA6dmVjMzxmMzI+ICktPnZlYzM8ZjMyPiB7XG4gICAgICAgICAgICBsZXQgc3FydEYwOnZlYzM8ZjMyPiA9IHNxcnQoIGZyZXNuZWwwICk7XG4gICAgICAgICAgICByZXR1cm4gKCB2ZWMzPGYzMj4oIDEuMCApICsgc3FydEYwICkgLyAoIHZlYzM8ZjMyPiggMS4wICkgLSBzcXJ0RjAgKTtcbiAgICAgICAgfVxuICAgICAgICBmbiBJb3JUb0ZyZXNuZWwwKHRyYW5zbWl0dGVkSW9yOnZlYzM8ZjMyPixpbmNpZGVudElvcjpmMzIgKS0+dmVjMzxmMzI+IHtcbiAgICAgICAgICAgIHJldHVybiBwb3cyVmVjdG9yKCAoIHRyYW5zbWl0dGVkSW9yIC0gdmVjMzxmMzI+KCBpbmNpZGVudElvciApICkgLyAoIHRyYW5zbWl0dGVkSW9yICsgdmVjMzxmMzI+KCBpbmNpZGVudElvciApICkgKTtcbiAgICAgICAgfVxuICAgICAgICBmbiBJb3JUb0ZyZXNuZWwwKHRyYW5zbWl0dGVkSW9yOmYzMiwgaW5jaWRlbnRJb3I6ZjMyICktPmYzMiB7XG4gICAgICAgICAgICByZXR1cm4gcG93MlZlY3RvciggKCB0cmFuc21pdHRlZElvciAtIGluY2lkZW50SW9yICkgLyAoIHRyYW5zbWl0dGVkSW9yICsgaW5jaWRlbnRJb3IgKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm4gZXZhbFNlbnNpdGl2aXR5KG9wZDpmMzIsc2hpZnQ6dmVjMzxmMzI+ICktPnZlYzM8ZjMyPiB7XG4gICAgICAgICAgICBsZXQgcGhhc2U6ZjMyID0gMi4wICogcGkgKiBvcGQgKiAxLjBlLTk7XG4gICAgICAgICAgICBsZXQgdmFsOnZlYzM8ZjMyPiA9IHZlYzM8ZjMyPiggNS40ODU2ZS0xMywgNC40MjAxZS0xMywgNS4yNDgxZS0xMyApO1xuICAgICAgICAgICAgbGV0IHBvczp2ZWMzPGYzMj4gPSB2ZWMzPGYzMj4oIDEuNjgxMGUrMDYsIDEuNzk1M2UrMDYsIDIuMjA4NGUrMDYgKTtcbiAgICAgICAgICAgIGxldCB2YXJ0OnZlYzM8ZjMyPiA9IHZlYzM8ZjMyPiggNC4zMjc4ZSswOSwgOS4zMDQ2ZSswOSwgNi42MTIxZSswOSApO1xuICAgICAgICAgICAgbGV0IHh5ejp2ZWMzPGYzMj4gPSB2YWwgKiBzcXJ0KCAyLjAgKiBwaSAqIHZhcnQgKSAqIGNvcyggcG9zICogcGhhc2UgKyBzaGlmdCApICogZXhwKCAtIHBvdzIoIHBoYXNlICkgKiB2YXJ0ICk7XG4gICAgICAgICAgICB4eXoueCArPSA5Ljc0NzBlLTE0ICogc3FydCggMi4wICogcGkgKiA0LjUyODJlKzA5ICkgKiBjb3MoIDIuMjM5OWUrMDYgKiBwaGFzZSArIHNoaWZ0WyAwIF0gKSAqIGV4cCggLSA0LjUyODJlKzA5ICogcG93MiggcGhhc2UgKSApO1xuICAgICAgICAgICAgeHl6IC89IDEuMDY4NWUtNztcbiAgICAgICAgICAgIGxldCByZ2I6dmVjMzxmMzI+ID0gWFlaX1RPX1JFQzcwOSAqIHh5ejtcbiAgICAgICAgICAgIHJldHVybiByZ2I7XG4gICAgICAgIH1cbiAgICAgICAgZm4gZXZhbElyaWRlc2NlbmNlKG91dHNpZGVJT1I6ZjMyLCBldGEyOmYzMixjb3NUaGV0YTE6ZjMyLHRoaW5GaWxtVGhpY2tuZXNzOmYzMixiYXNlRjA6dmVjMzxmMzI+ICktPnZlYzM8ZjMyPiB7XG4gICAgICAgICAgICB2YXIgSTp2ZWMzPGYzMj47XG4gICAgICAgICAgICBsZXQgaXJpZGVzY2VuY2VJT1I6ZjMyID0gbWl4KCBvdXRzaWRlSU9SLCBldGEyLCBzbW9vdGhzdGVwKCAwLjAsIDAuMDMsIHRoaW5GaWxtVGhpY2tuZXNzICkgKTtcbiAgICAgICAgICAgIGxldCBzaW5UaGV0YTJTcTpmMzIgPSBwb3cyKCBvdXRzaWRlSU9SIC8gaXJpZGVzY2VuY2VJT1IgKSAqICggMS4wIC0gcG93MiggY29zVGhldGExICkgKTtcbiAgICAgICAgICAgIGxldCBjb3NUaGV0YTJTcTpmMzIgPSAxLjAgLSBzaW5UaGV0YTJTcTtcbiAgICAgICAgICAgIGlmICggY29zVGhldGEyU3EgPCAwLjAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZlYzM8ZjMyPiggMS4wICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY29zVGhldGEyOmYzMiA9IHNxcnQoIGNvc1RoZXRhMlNxICk7XG4gICAgICAgICAgICBsZXQgUjA6ZjMyID0gSW9yVG9GcmVzbmVsMCggaXJpZGVzY2VuY2VJT1IsIG91dHNpZGVJT1IgKTtcbiAgICAgICAgICAgIGxldCBSMTI6ZjMyID0gRl9TY2hsaWNrKCBSMCwgMS4wLCBjb3NUaGV0YTEgKTtcbiAgICAgICAgICAgIGxldCBSMjE6ZjMyID0gUjEyO1xuICAgICAgICAgICAgbGV0IFQxMjE6ZjMyID0gMS4wIC0gUjEyO1xuICAgICAgICAgICAgbGV0IHBoaTEyOmYzMiA9IDAuMDtcbiAgICAgICAgICAgIGlmICggaXJpZGVzY2VuY2VJT1IgPCBvdXRzaWRlSU9SICkgcGhpMTIgPSBwaTtcbiAgICAgICAgICAgIGxldCBwaGkyMTpmMzIgPSBwaSAtIHBoaTEyO1xuICAgICAgICAgICAgbGV0IGJhc2VJT1I6dmVjMzxmMzI+ID0gRnJlc25lbDBUb0lvciggY2xhbXAoIGJhc2VGMCwgMC4wLCAwLjk5OTkgKSApO1xuICAgICAgICAgICAgbGV0IFIxOnZlYzM8ZjMyPiA9IElvclRvRnJlc25lbDAoIGJhc2VJT1IsIGlyaWRlc2NlbmNlSU9SICk7XG4gICAgICAgICAgICBsZXQgUjIzOnZlYzM8ZjMyPiA9IEZfU2NobGljayggUjEsIDEuMCwgY29zVGhldGEyICk7XG4gICAgICAgICAgICBsZXQgcGhpMjM6dmVjMzxmMzI+ID0gdmVjMzxmMzI+KCAwLjAgKTtcbiAgICAgICAgICAgIGlmICggYmFzZUlPUlsgMCBdIDwgaXJpZGVzY2VuY2VJT1IgKSBwaGkyM1sgMCBdID0gcGk7XG4gICAgICAgICAgICBpZiAoIGJhc2VJT1JbIDEgXSA8IGlyaWRlc2NlbmNlSU9SICkgcGhpMjNbIDEgXSA9IHBpO1xuICAgICAgICAgICAgaWYgKCBiYXNlSU9SWyAyIF0gPCBpcmlkZXNjZW5jZUlPUiApIHBoaTIzWyAyIF0gPSBwaTtcbiAgICAgICAgICAgIGxldCBPUEQ6ZjMyID0gMi4wICogaXJpZGVzY2VuY2VJT1IgKiB0aGluRmlsbVRoaWNrbmVzcyAqIGNvc1RoZXRhMjtcbiAgICAgICAgICAgIGxldCBwaGk6dmVjMzxmMzI+ID0gdmVjMzxmMzI+KCBwaGkyMSApICsgcGhpMjM7XG4gICAgICAgICAgICBsZXQgUjEyMzp2ZWMzPGYzMj4gPSBjbGFtcCggUjEyICogUjIzLCAxZS01LCAwLjk5OTkgKTtcbiAgICAgICAgICAgIGxldCByMTIzOnZlYzM8ZjMyPiA9IHNxcnQoIFIxMjMgKTtcbiAgICAgICAgICAgIGxldCBSczp2ZWMzPGYzMj4gPSBwb3cyKCBUMTIxICkgKiBSMjMgLyAoIHZlYzM8ZjMyPiggMS4wICkgLSBSMTIzICk7XG4gICAgICAgICAgICBsZXQgQzA6dmVjMzxmMzI+ID0gUjEyICsgUnM7XG4gICAgICAgICAgICBJID0gQzA7XG4gICAgICAgICAgICBsZXQgQ206dmVjMzxmMzI+ID0gUnMgLSBUMTIxO1xuICAgICAgICAgICAgZm9yICggbGV0IG0gOiB1MzIgPSAxO20gPD0gMjsgKysgbSApIHtcbiAgICAgICAgICAgICAgICBDbSAqPSByMTIzO1xuICAgICAgICAgICAgICAgIFNtOnZlYzM8ZjMyPiA9IDIuMCAqIGV2YWxTZW5zaXRpdml0eSggZjMyKCBtICkgKiBPUEQsIGYzMiggbSApICogcGhpICk7XG4gICAgICAgICAgICAgICAgSSArPSBDbSAqIFNtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1heCggSSwgdmVjMzxmMzI+KCAwLjAgKSApO1xuICAgICAgICB9XG4gICAgI2VuZGlmXG4gICAgY29uc3QgY2xlYXJjb2F0U3BlY3VsYXI6dmVjMzxmMzI+ID0gdmVjMzxmMzI+KCAwLjAgKTtcbiAgICBjb25zdCBzaGVlblNwZWN1bGFyOnZlYzM8ZjMyPiA9IHZlYzM8ZjMyPiggMC4wICk7XG5cbiAgICBmbiBJQkxTaGVlbkJSREYoIG5vcm1hbDp2ZWMzPGYzMj4sIHZpZXdEaXI6dmVjMzxmMzI+LCByb3VnaG5lc3M6ZjMyICktPmYzMiB7XG4gICAgICAgIGxldCBkb3ROVjpmMzIgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApO1xuICAgICAgICBsZXQgcjI6ZjMyID0gcm91Z2huZXNzICogcm91Z2huZXNzO1xuICAgICAgICBsZXQgYTpmMzIgPXNlbGVjdCgtOC40OCAqIHIyICsgMTQuMyAqIHJvdWdobmVzcyAtIDkuOTUsLTMzOS4yICogcjIgKyAxNjEuNCAqIHJvdWdobmVzcyAtIDI1Ljkscm91Z2huZXNzIDwgMC4yNSk7XG4gICAgICAgIC8vbGV0IGE6ZjMyID0gcm91Z2huZXNzIDwgMC4yNSA/IC0zMzkuMiAqIHIyICsgMTYxLjQgKiByb3VnaG5lc3MgLSAyNS45IDogLTguNDggKiByMiArIDE0LjMgKiByb3VnaG5lc3MgLSA5Ljk1O1xuICAgICAgICBsZXQgYjpmMzI9c2VsZWN0KDEuOTcgKiByMiAtIDMuMjcgKiByb3VnaG5lc3MgKyAwLjcyLDQ0LjAgKiByMiAtIDIzLjcgKiByb3VnaG5lc3MgKyAzLjI2LCByb3VnaG5lc3MgPCAwLjI1KTtcbiAgICAgICAgLy9sZXQgYjpmMzIgPSByb3VnaG5lc3MgPCAwLjI1ID8gNDQuMCAqIHIyIC0gMjMuNyAqIHJvdWdobmVzcyArIDMuMjYgOiAxLjk3ICogcjIgLSAzLjI3ICogcm91Z2huZXNzICsgMC43MjtcbiAgICAgICAgLy9sZXQgREc6ZjMyID0gZXhwKCBhICogZG90TlYgKyBiICkgKyAoIHJvdWdobmVzcyA8IDAuMjUgPyAwLjAgOiAwLjEgKiAoIHJvdWdobmVzcyAtIDAuMjUgKSApO1xuICAgICAgICBsZXQgZGc6ZjMyID0gZXhwKCBhICogZG90TlYgKyBiICkgKyBzZWxlY3QoMC4xICogKCByb3VnaG5lc3MgLSAwLjI1ICksMC4wLHJvdWdobmVzcyA8IDAuMjUpO1xuICAgICAgICByZXR1cm4gc2F0dXJhdGUoIGRnICogcmVjaXByb2NhbF9waSApO1xuICAgIH1cbiAgICBmbiBERkdBcHByb3goIHNwZWN1bGFyQ29sb3I6dmVjMzxmMzI+LCByb3VnaG5lc3M6ZjMyLGRvdE5WOmYzMiApLT52ZWMzPGYzMj4ge1xuICAgICAgICBjb25zdCBjMDp2ZWM0PGYzMj4gPSB2ZWM0PGYzMj4oIC0gMSwgLSAwLjAyNzUsIC0gMC41NzIsIDAuMDIyICk7XG4gICAgICAgIGxldCBjMTp2ZWM0PGYzMj4gPSB2ZWM0PGYzMj4oIDEsIDAuMDQyNSwgMS4wNCwgLSAwLjA0ICk7XG4gICAgICAgIGxldCByOnZlYzQ8ZjMyPiA9IHJvdWdobmVzcyAqIGMwICsgYzE7XG4gICAgICAgIGxldCBhMDA0OmYzMiA9IG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7XG4gICAgICAgIGxldCBmYWI6dmVjMjxmMzI+ID0gdmVjMjxmMzI+KCAtIDEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xuICAgICAgICByZXR1cm4gc3BlY3VsYXJDb2xvciAqIGZhYi54ICsgZmFiLnk7XG4gICAgfVxuICAgIGZuIEVudmlyb25tZW50QlJERiggbm9ybWFsOnZlYzM8ZjMyPix2aWV3RGlyOnZlYzM8ZjMyPixzcGVjdWxhckNvbG9yOnZlYzM8ZjMyPiwgc3BlY3VsYXJGOTA6ZjMyLHJvdWdobmVzczpmMzIgKS0+dmVjMzxmMzI+IHtcbiAgICAgICAgbGV0IGZhYjp2ZWMyPGYzMj4gPSBERkdBcHByb3goIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XG4gICAgICAgIHJldHVybiBzcGVjdWxhckNvbG9yICogZmFiLnggKyBzcGVjdWxhckY5MCAqIGZhYi55O1xuICAgIH1cblxuXG4gICAgZm4gY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBkb3ROVjpmMzIsIGFtYmllbnRPY2NsdXNpb246ZjMyLCByb3VnaG5lc3M6ZjMyICktPmYzMiB7XG4gICAgICAgIHJldHVybiBzYXR1cmF0ZSggcG93KCBkb3ROViArIGFtYmllbnRPY2NsdXNpb24sIGV4cDIoIC0gMTYuMCAqIHJvdWdobmVzcyAtIDEuMCApICkgLSAxLjAgKyBhbWJpZW50T2NjbHVzaW9uICk7XG4gICAgfVxuICAgICNpZiAke2RlZmluZXMuVVNFX1RSQU5TTUlTU0lPTn1cblxuICAgIGZuIGdldFZvbHVtZVRyYW5zbWlzc2lvblJheSggbjp2ZWMzPGYzMj4sIHY6dmVjMzxmMzI+LCB0aGlja25lc3M6ZjMyLCBpb3I6ZjMyLCBtb2RlbE1hdHJpeDptYXQ0eDQ6ZjMyKS0+dmVjMzxmMzI+IHtcbiAgICAgICAgdmFyIHJlZnJhY3Rpb25WZWN0b3I6dmVjMzxmMzI+ID0gcmVmcmFjdCggLSB2LCBub3JtYWxpemUoIG4gKSwgMS4wIC8gaW9yICk7XG4gICAgICAgIHZhciBtb2RlbFNjYWxlOnZlYzM8ZjMyPjtcbiAgICAgICAgbW9kZWxTY2FsZS54ID0gbGVuZ3RoKCB2ZWMzPGYzMj4oIG1vZGVsTWF0cml4WzBdLnh5eiApICk7XG4gICAgICAgIG1vZGVsU2NhbGUueSA9IGxlbmd0aCggdmVjMzxmMzI+KCBtb2RlbE1hdHJpeFsxXS54eXogKSApO1xuICAgICAgICBtb2RlbFNjYWxlLnogPSBsZW5ndGgoIHZlYzM8ZjMyPiggbW9kZWxNYXRyaXhbMl0ueHl6ICkgKTtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZSggcmVmcmFjdGlvblZlY3RvciApICogdGhpY2tuZXNzICogbW9kZWxTY2FsZTtcbiAgICB9XG4gICAgZm4gYXBwbHlJb3JUb1JvdWdobmVzcyhyb3VnaG5lc3M6ZjMyLCBpb3I6ZjMyICktPmYzMiB7XG4gICAgICAgIHJldHVybiByb3VnaG5lc3MgKiBjbGFtcCggaW9yICogMi4wIC0gMi4wLCAwLjAsIDEuMCApO1xuICAgIH1cbiAgICBmbiBnZXRUcmFuc21pc3Npb25TYW1wbGUoIGZyYWdDb29yZDp2ZWMyPGYzMj4sIHJvdWdobmVzczpmMzIsaW9yOmYzMiApLT52ZWM0PGYzMj4ge1xuICAgICAgICBsZXQgZnJhbWVidWZmZXJMb2Q6ZjMyID0gbG9nMiggbWF0ZXJpYWxVbmlmb3JtLnRyYW5zbWlzc2lvblNhbXBsZXJTaXplLnggKSAqIGFwcGx5SW9yVG9Sb3VnaG5lc3MoIHJvdWdobmVzcywgaW9yICk7XG4gICAgICAgIHJldHVybiB0ZXh0dXJlU2FtcGxlTGV2ZWwodHJhbnNtaXNzaW9uU2FtcGxlclRleHR1cmUsYmFzZVNhbXBsZXIsZnJhZ0Nvb3JkLnh5LCBmcmFtZWJ1ZmZlckxvZCk7XG5cbiAgICB9XG4gICAgZm4gYXBwbHlWb2x1bWVBdHRlbnVhdGlvbiggcmFkaWFuY2U6dmVjMzx2ZWMzPiwgdHJhbnNtaXNzaW9uRGlzdGFuY2U6ZjMyLGF0dGVudWF0aW9uQ29sb3I6dmVjMzxmMzI+LGF0dGVudWF0aW9uRGlzdGFuY2U6ZjMyICktPnZlYzM8ZjMyPiB7XG4gICAgICAgIGlmICggaXNpbmYoIGF0dGVudWF0aW9uRGlzdGFuY2UgKSApIHtcbiAgICAgICAgICAgIHJldHVybiByYWRpYW5jZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhdHRlbnVhdGlvbkNvZWZmaWNpZW50OnZlYzM8ZjMyPiA9IC1sb2coIGF0dGVudWF0aW9uQ29sb3IgKSAvIGF0dGVudWF0aW9uRGlzdGFuY2U7XG4gICAgICAgICAgICBsZXQgdHJhbnNtaXR0YW5jZTp2ZWMzPGYzMj4gPSBleHAoIC0gYXR0ZW51YXRpb25Db2VmZmljaWVudCAqIHRyYW5zbWlzc2lvbkRpc3RhbmNlICk7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNtaXR0YW5jZSAqIHJhZGlhbmNlO1xuICAgICAgICB9XG4gICAgXG4gICAgfVxuICAgIGZuIGdldElCTFZvbHVtZVJlZnJhY3Rpb24oIG46dmVjMzxmMzI+LHY6dmVjMzxmMzI+LCByb3VnaG5lc3M6ZjMyLCBkaWZmdXNlQ29sb3I6dmVjMzxmMzI+LHNwZWN1bGFyQ29sb3I6dmVjMzxmMzI+LCBzcGVjdWxhckY5MDpmMzIscG9zaXRpb246dmVjMzxmMzI+LCBtb2RlbE1hdHJpeDptYXQ0eDQ8ZjMyPiwgdmlld01hdHJpeDptYXQ0eDQ8ZjMyPixwcm9qTWF0cml4Om1hdDR4NDxmMzI+LGlvcjpmMzIsIHRoaWNrbmVzczpmMzIsYXR0ZW51YXRpb25Db2xvcjp2ZWMzPGYzMj4sYXR0ZW51YXRpb25EaXN0YW5jZTpmMzIgKS0+dmVjNDxmMzI+IHtcbiAgICAgICAgbGV0IHRyYW5zbWlzc2lvblJheTp2ZWMzPGYzMj4gPSBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoIG4sIHYsIHRoaWNrbmVzcywgaW9yLCBtb2RlbE1hdHJpeCApO1xuICAgICAgICBsZXQgcmVmcmFjdGVkUmF5RXhpdDp2ZWMzPGYzMj4gPSBwb3NpdGlvbiArIHRyYW5zbWlzc2lvblJheTtcbiAgICAgICAgbGV0IG5kY1Bvczp2ZWM0PGYzMj4gPSBwcm9qTWF0cml4ICogdmlld01hdHJpeCAqIHZlYzQoIHJlZnJhY3RlZFJheUV4aXQsIDEuMCApO1xuICAgICAgICBsZXQgcmVmcmFjdGlvbkNvb3Jkczp2ZWMyPGYzMj4gPSBuZGNQb3MueHkgLyBuZGNQb3MudztcbiAgICAgICAgcmVmcmFjdGlvbkNvb3JkcyArPSAxLjA7XG4gICAgICAgIHJlZnJhY3Rpb25Db29yZHMgLz0gMi4wO1xuICAgICAgICBsZXQgdHJhbnNtaXR0ZWRMaWdodDp2ZWM0PGYzMj4gPSBnZXRUcmFuc21pc3Npb25TYW1wbGUoIHJlZnJhY3Rpb25Db29yZHMsIHJvdWdobmVzcywgaW9yICk7XG4gICAgICAgIGxldCBhdHRlbnVhdGVkQ29sb3I6dmVjMzxmMzI+ID0gYXBwbHlWb2x1bWVBdHRlbnVhdGlvbiggdHJhbnNtaXR0ZWRMaWdodC5yZ2IsIGxlbmd0aCggdHJhbnNtaXNzaW9uUmF5ICksIGF0dGVudWF0aW9uQ29sb3IsIGF0dGVudWF0aW9uRGlzdGFuY2UgKTtcbiAgICAgICAgbGV0IEY6dmVjMzxmMzI+ID0gRW52aXJvbm1lbnRCUkRGKCBuLCB2LCBzcGVjdWxhckNvbG9yLCBzcGVjdWxhckY5MCwgcm91Z2huZXNzICk7XG4gICAgICAgIHJldHVybiB2ZWM0PGYzMj4oICggMS4wIC0gRiApICogYXR0ZW51YXRlZENvbG9yICogZGlmZnVzZUNvbG9yLCB0cmFuc21pdHRlZExpZ2h0LmEgKTtcbiAgICB9XG4gICAgI2VuZGlmXG5cbiAgICAjaWYgJHtkZWZpbmVzLlVTRV9CVU1QVEVYVFVSRX1cbiAgICAgICAgZm4gZEhkeHlfZndkKCktPnZlYzI8ZjMyPiB7XG4gICAgICAgICAgICBsZXQgZFNUZHg6dmVjMjxmMzI+ID0gZHBkeCggdlV2ICk7XG4gICAgICAgICAgICBsZXQgZFNUZHk6dmVjMjxmMzI+ID0gZHBkeSggdlV2ICk7XG5cbiAgICAgICAgICAgIGxldCBIbGw6ZjMyID0gbWF0ZXJpYWxVbmlmb3JtLmJ1bXBTY2FsZSAqIHRleHR1cmVTYW1wbGUoYnVtcFRleHR1cmUsIGJhc2VTYW1wbGVyLCB2VXYpLng7XG4gICAgICAgICAgICBsZXQgZEJ4OmYzMiA9IG1hdGVyaWFsVW5pZm9ybS5idW1wU2NhbGUgKiB0ZXh0dXJlU2FtcGxlKGJ1bXBUZXh0dXJlLCBiYXNlU2FtcGxlciwgdlV2ICsgZFNUZHgpLnggLSBIbGw7XG4gICAgICAgICAgICBsZXQgZEJ5OmYzMiA9IG1hdGVyaWFsVW5pZm9ybS5idW1wU2NhbGUgKiB0ZXh0dXJlU2FtcGxlKGJ1bXBUZXh0dXJlLCBiYXNlU2FtcGxlciwgdlV2ICsgZFNUZHkpLnggLSBIbGw7XG4gICAgICAgICAgICByZXR1cm4gdmVjMjxmMzI+KCBkQngsIGRCeSApO1xuICAgICAgICB9XG4gICAgICAgIGZuIHBlcnR1cmJOb3JtYWxBcmIoIHN1cmZfcG9zOnZlYzM8ZjMyPiwgc3VyZl9ub3JtOnZlYzM8ZjMyPiwgZEhkeHk6dmVjMjxmMzI+LCBmYWNlRGlyZWN0aW9uOmYzMiApLT52ZWMzPGYzMj4ge1xuICAgICAgICAgICAgbGV0IHZTaWdtYVg6dmVjMzxmMzI+ID0gZHBkeCggc3VyZl9wb3MueHl6ICk7XG4gICAgICAgICAgICBsZXQgdlNpZ21hWTp2ZWMzPGYzMj4gPSBkcGR5KCBzdXJmX3Bvcy54eXogKTtcbiAgICAgICAgICAgIGxldCB2Tjp2ZWMzPGYzMj4gPSBzdXJmX25vcm07XG4gICAgICAgICAgICBsZXQgUjE6dmVjMzxmMzI+ID0gY3Jvc3MoIHZTaWdtYVksIHZOICk7XG4gICAgICAgICAgICBsZXQgUjI6dmVjMzxmMzI+ID0gY3Jvc3MoIHZOLCB2U2lnbWFYICk7XG4gICAgICAgICAgICBsZXQgZkRldDpmMzIgPSBkb3QoIHZTaWdtYVgsIFIxICkgKiBmYWNlRGlyZWN0aW9uO1xuICAgICAgICAgICAgbGV0IHZHcmFkOnZlYzM8ZjMyPiA9IHNpZ24oIGZEZXQgKSAqICggZEhkeHkueCAqIFIxICsgZEhkeHkueSAqIFIyICk7XG4gICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKCBhYnMoIGZEZXQgKSAqIHN1cmZfbm9ybSAtIHZHcmFkICk7XG4gICAgICAgIH1cbiAgICAjZW5kaWZcblxuICAgIC8vISBkZWZpbmVkICggVVNFX1RBTkdFTlQgKSAmJiAoIGRlZmluZWQgKCBUQU5HRU5UU1BBQ0VfTk9STUFMVEVYVFVSRSApIHx8IGRlZmluZWQgKCBVU0VfQ0xFQVJDT0FUX05PUk1BTFRFWFRVUkUgKSApXG4gICAgI2lmICR7KCFkZWZpbmVzLlVTRV9UQU5HRU5UICYmIGRlZmluZXMuVEFOR0VOVFNQQUNFX05PUk1BTFRFWFRVUkUpIHx8IGRlZmluZXMuVVNFX0NMRUFSQ09BVF9OT1JNQUxURVhUVVJFfVxuICAgIGZuIHBlcnR1cmJOb3JtYWwyQXJiKCBleWVfcG9zOnZlYzM8ZjMyPiwgc3VyZl9ub3JtOnZlYzM8ZjMyPiwgdGV4dHVyZU46dmVjMzxmMzI+LCBmYWNlRGlyZWN0aW9uOmYzMiApLT52ZWMzPGYzMj4ge1xuICAgICAgICBsZXQgcTA6dmVjMzxmMzI+ID0gZHBkeCggZXllX3Bvcy54eXogKTtcbiAgICAgICAgbGV0IHExOnZlYzM8ZjMyPiA9IGRwZHkoIGV5ZV9wb3MueHl6ICk7XG4gICAgICAgIGxldCBzdDA6dmVjMjxmMzI+ID0gZHBkeCggdlV2LnN0ICk7XG4gICAgICAgIGxldCBzdDE6dmVjMjxmMzI+ID0gZHBkeSggdlV2LnN0ICk7XG4gICAgICAgIGxldCBOOnZlYzM8ZjMyPiA9IHN1cmZfbm9ybTtcbiAgICAgICAgbGV0IHExcGVycDp2ZWMzPGYzMj4gPSBjcm9zcyggcTEsIE4gKTtcbiAgICAgICAgbGV0IHEwcGVycDp2ZWMzPGYzMj4gPSBjcm9zcyggTiwgcTAgKTtcbiAgICAgICAgbGV0IFQ6dmVjMzxmMzI+ID0gcTFwZXJwICogc3QwLnggKyBxMHBlcnAgKiBzdDEueDtcbiAgICAgICAgbGV0IEI6dmVjMzxmMzI+ID0gcTFwZXJwICogc3QwLnkgKyBxMHBlcnAgKiBzdDEueTtcbiAgICAgICAgbGV0IGRldDpmMzIgPSBtYXgoIGRvdCggVCwgVCApLCBkb3QoIEIsIEIgKSApO1xuICAgICAgICBsZXQgc2NhbGU6ZjMyID0gKCBkZXQgPT0gMC4wICkgPyAwLjAgOiBmYWNlRGlyZWN0aW9uICogaW52ZXJzZXNxcnQoIGRldCApO1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplKCBUICogKCB0ZXh0dXJlTi54ICogc2NhbGUgKSArIEIgKiAoIHRleHR1cmVOLnkgKiBzY2FsZSApICsgTiAqIHRleHR1cmVOLnogKTtcbiAgICB9XG4gICAgI2VuZGlmXG4gICAgc3RydWN0IE11bHRpQW5kU2luZ2xlU2NhdHRlcntcbiAgICAgICAgbXVsdGlTY2F0dGVyOnZlYzM8ZjMyPixcbiAgICAgICAgc2luZ2xlU2NhdHRlcjp2ZWMzPGYzMj5cbiAgICB9XG4gICAjaWYgJHtkZWZpbmVzLlVTRV9JUklERVNDRU5DRX1cbiAgIC8vLy8vLy8vaW5vdXQgdmVjMyBzaW5nbGVTY2F0dGVyLCBpbm91dCB2ZWMzIG11bHRpU2NhdHRlclxuICAgICAgIGZuIGNvbXB1dGVNdWx0aXNjYXR0ZXJpbmdJcmlkZXNjZW5jZSggbm9ybWFsOnZlYzM8ZjMyPiwgdmlld0Rpcjp2ZWMzPGYzMj4sIHNwZWN1bGFyQ29sb3I6dmVjMzxmMzI+LCBzcGVjdWxhckY5MDpmMzIsIGlyaWRlc2NlbmNlOmYzMixpcmlkZXNjZW5jZUYwOnZlYzM8ZjMyPiwgcm91Z2huZXNzOmYzMiApLT5NdWx0aUFuZFNpbmdsZVNjYXR0ZXIge1xuICAgI2Vsc2VcbiAgIC8vLy8vLy8vaW5vdXQgdmVjMyBzaW5nbGVTY2F0dGVyLCBpbm91dCB2ZWMzIG11bHRpU2NhdHRlclxuICAgICAgIGZuIGNvbXB1dGVNdWx0aXNjYXR0ZXJpbmcoIG5vcm1hbDp2ZWMzPGYzMj4sdmlld0Rpcjp2ZWMzPGYzMj4sIHNwZWN1bGFyQ29sb3I6dmVjMzxmMzI+LCBzcGVjdWxhckY5MDpmMzIsIHJvdWdobmVzczpmMzIpLT5NdWx0aUFuZFNpbmdsZVNjYXR0ZXIge1xuICAgI2VuZGlmXG4gICBsZXQgZmFiOnZlYzI8ZjMyPiA9IERGR0FwcHJveCggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTtcblxuICAgdmFyIG11bHRpQW5kU2luZ2xlU2NhdHRlcjpNdWx0aUFuZFNpbmdsZVNjYXR0ZXI7XG5cbiAgICNpZiAke2RlZmluZXMuVVNFX0lSSURFU0NFTkNFfVxuICAgICAgIGxldCBGcjp2ZWMzPGYzMj4gPSBtaXgoIHNwZWN1bGFyQ29sb3IsIGlyaWRlc2NlbmNlRjAsIGlyaWRlc2NlbmNlICk7XG4gICAjZWxzZVxuICAgICAgIGxldCBGcjp2ZWMzPGYzMj4gPSBzcGVjdWxhckNvbG9yO1xuICAgI2VuZGlmXG4gICAgICAgbGV0IEZzc0Vzczp2ZWMzPGYzMj4gPSBGciAqIGZhYi54ICsgc3BlY3VsYXJGOTAgKiBmYWIueTtcbiAgICAgICBsZXQgRXNzOmYzMiA9IGZhYi54ICsgZmFiLnk7XG4gICAgICAgbGV0IEVtczpmMzIgPSAxLjAgLSBFc3M7XG4gICAgICAgbGV0IEZhdmc6dmVjMzxmMzI+ID0gRnIgKyAoIDEuMCAtIEZyICkgKiAwLjA0NzYxOTtcbiAgICAgICBsZXQgRm1zOnZlYzM8ZjMyPiA9IEZzc0VzcyAqIEZhdmcgLyAoIDEuMCAtIEVtcyAqIEZhdmcgKTtcbiAgICAvLyAgICBzaW5nbGVTY2F0dGVyICs9IEZzc0VzcztcbiAgICAvLyAgICBtdWx0aVNjYXR0ZXIgKz0gRm1zICogRW1zO1xuICAgICAgIG11bHRpQW5kU2luZ2xlU2NhdHRlci5tdWx0aVNjYXR0ZXI9Rm1zICogRW1zO1xuICAgICAgIG11bHRpQW5kU2luZ2xlU2NhdHRlci5zaW5nbGVTY2F0dGVyPUZzc0VzcztcbiAgICAgICByZXR1cm4gbXVsdGlBbmRTaW5nbGVTY2F0dGVyO1xuICAgfVxuICAgLy/nm7TmjqXlhYnnhadcbiAgIGZuIFJFX0RpcmVjdF9QaHlzaWNhbCggZGlyZWN0TGlnaHQ6SW5jaWRlbnRMaWdodCwgZ2VvbWV0cnk6R2VvbWV0cmljQ29udGV4dCwgIG1hdGVyaWFsOlBoeXNpY2FsTWF0ZXJpYWwpLT5SZWZsZWN0ZWRMaWdodCB7XG4gICAgICAgdmFyIHJlZmxlY3RlZExpZ2h0OlJlZmxlY3RlZExpZ2h0O1xuICAgICAgIGxldCBkb3ROTDpmMzIgPSBzYXR1cmF0ZShkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uKSk7XG4gICAgICAgbGV0IGlycmFkaWFuY2U6dmVjMzxmMzI+ID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcbiAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9DTEVBUkNPQVR9XG4gICAgICAgICAgIGxldCBkb3ROTGNjOmYzMiA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcbiAgICAgICAgICAgbGV0IGNjSXJyYWRpYW5jZTp2ZWMzPGYzMj4gPSBkb3ROTGNjICogZGlyZWN0TGlnaHQuY29sb3I7XG4gICAgICAgICAgIGNsZWFyY29hdFNwZWN1bGFyICs9IGNjSXJyYWRpYW5jZSAqIEJSREZfZ2d4KCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwuY2xlYXJjb2F0RjAsIG1hdGVyaWFsLmNsZWFyY29hdEY5MCwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7XG4gICAgICAgI2VuZGlmXG5cbiAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9TSEVFTn1cbiAgICAgICAgICAgc2hlZW5TcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9TaGVlbiggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIG1hdGVyaWFsLnNoZWVuQ29sb3IsIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzICk7XG4gICAgICAgI2VuZGlmXG5cbiAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9JUklERVNDRU5DRX1cbiAgICAgICAgICAgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgPSBpcnJhZGlhbmNlICogQlJERl9HR1hfSXJpZGVzY2VuY2UoIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2UsIG1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCwgbWF0ZXJpYWwucm91Z2huZXNzICk7XG4gICAgICAgI2Vsc2VcbiAgICAgICAgICAgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgPSBpcnJhZGlhbmNlICogQlJERl9nZ3goIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCwgbWF0ZXJpYWwucm91Z2huZXNzICk7XG4gICAgICAgI2VuZGlmXG4gICAgICAgcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xuICAgICAgIHJldHVybiByZWZsZWN0ZWRMaWdodDtcbiAgIH1cbiAgIC8v6Ze05o6l5YWJ54WnXG4gICBmbiBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGlycmFkaWFuY2U6dmVjMzxmMzI+LCBnZW9tZXRyeTpHZW9tZXRyaWNDb250ZXh0LCBtYXRlcmlhbDpQaHlzaWNhbE1hdGVyaWFsICktPlJlZmxlY3RlZExpZ2h0IHtcbiAgICAgICB2YXIgcmVmbGVjdGVkTGlnaHQ6UmVmbGVjdGVkTGlnaHQ7XG4gICAgICAgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlID0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG4gICAgICAgcmV0dXJuIHJlZmxlY3RlZExpZ2h0O1xuICAgfVxuICAgLy/pl7TmjqXpq5jlhYlcbiAgIGZuIFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWwoIHJhZGlhbmNlOnZlYzM8ZjMyPiwgaXJyYWRpYW5jZTp2ZWMzPGYzMj4sIGNsZWFyY29hdFJhZGlhbmNlOnZlYzM8ZjMyPiwgZ2VvbWV0cnk6R2VvbWV0cmljQ29udGV4dCwgbWF0ZXJpYWw6UGh5c2ljYWxNYXRlcmlhbCktPlJlZmxlY3RlZExpZ2h0IHtcbiAgICAgICB2YXIgcmVmbGVjdGVkTGlnaHQ6UmVmbGVjdGVkTGlnaHQ7XG4gICAgICAgI2lmICR7ZGVmaW5lcy5VU0VfQ0xFQVJDT0FUfVxuICAgICAgICAgICBjbGVhcmNvYXRTcGVjdWxhciArPSBjbGVhcmNvYXRSYWRpYW5jZSAqIEVudmlyb25tZW50QlJERiggZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyLCBtYXRlcmlhbC5jbGVhcmNvYXRGMCwgbWF0ZXJpYWwuY2xlYXJjb2F0RjkwLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcbiAgICAgICAjZW5kaWZcbiAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9TSEVFTn1cbiAgICAgICAgICAgc2hlZW5TcGVjdWxhciArPSBpcnJhZGlhbmNlICogbWF0ZXJpYWwuc2hlZW5Db2xvciAqIElCTFNoZWVuQlJERiggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyLCBtYXRlcmlhbC5zaGVlblJvdWdobmVzcyApO1xuICAgICAgICNlbmRpZlxuICAgICAgIHZhciBzaW5nbGVTY2F0dGVyaW5nOnZlYzM8ZjMyPjtcbiAgICAgICB2YXIgbXVsdGlTY2F0dGVyaW5nOnZlYzM8ZjMyPjtcbiAgICAgICBsZXQgY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlOnZlYzM8ZjMyPiA9IGlycmFkaWFuY2UgKiByZWNpcHJvY2FsX3BpO1xuICAgICAgIHZhciB0ZW1wTXVsdGlBbmRTaW5nbGVTY2F0dGVyOk11bHRpQW5kU2luZ2xlU2NhdHRlcjtcbiAgICAgICAjaWYgJHtkZWZpbmVzLlVTRV9JUklERVNDRU5DRX1cbiAgICAgICAgICAgICB0ZW1wTXVsdGlBbmRTaW5nbGVTY2F0dGVyPWNvbXB1dGVNdWx0aXNjYXR0ZXJpbmdJcmlkZXNjZW5jZSggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2UsIG1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCwgbWF0ZXJpYWwucm91Z2huZXNzICk7XG4gICAgICAgI2Vsc2VcbiAgICAgICAgICAgIHRlbXBNdWx0aUFuZFNpbmdsZVNjYXR0ZXI9IGNvbXB1dGVNdWx0aXNjYXR0ZXJpbmcoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJGOTAsIG1hdGVyaWFsLnJvdWdobmVzcyApO1xuICAgICAgICNlbmRpZlxuICAgICAgIHNpbmdsZVNjYXR0ZXJpbmc9dGVtcE11bHRpQW5kU2luZ2xlU2NhdHRlci5zaW5nbGVTY2F0dGVyOyBcbiAgICAgICBtdWx0aVNjYXR0ZXJpbmc9dGVtcE11bHRpQW5kU2luZ2xlU2NhdHRlci5tdWx0aVNjYXR0ZXI7XG4gICAgICAgbGV0IHRvdGFsU2NhdHRlcmluZzp2ZWMzPGYzMj4gPSBzaW5nbGVTY2F0dGVyaW5nICsgbXVsdGlTY2F0dGVyaW5nO1xuICAgICAgIGxldCBkaWZmdXNlOnZlYzM8ZjMyPiA9IG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqICggMS4wIC0gbWF4KCBtYXgoIHRvdGFsU2NhdHRlcmluZy5yLCB0b3RhbFNjYXR0ZXJpbmcuZyApLCB0b3RhbFNjYXR0ZXJpbmcuYiApICk7XG4gICAgICAgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciA9IHJhZGlhbmNlICogc2luZ2xlU2NhdHRlcmluZztcbiAgICAgICByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyID0gbXVsdGlTY2F0dGVyaW5nICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xuICAgICAgIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSA9IGRpZmZ1c2UgKiBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2U7XG4gICAgICAgcmV0dXJuIHJlZmxlY3RlZExpZ2h0O1xuICAgfVxuICAgYDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGBcbiAgICAgICAgc3RydWN0IE1hdGVyaWFsVW5pZm9ybXtcblxuICAgICAgICAgICAgbW9kZWxNYXRyaXg6IG1hdDR4NDxmMzI+LFxuICAgIFxuICAgICAgICAgICAgZGlmZnVzZTp2ZWMzPGYzMj4sXG4gICAgXG4gICAgICAgICAgICBvcGFjaXR5OmYzMixcbiAgICBcbiAgICAgICAgICAgIG5vcm1hbE1hdHJpeDogbWF0M3gzPGYzMj4sXG4gICAgXG4gICAgICAgICAgICBlbWlzc2l2ZTp2ZWMzPGYzMj4sXG4gICAgXG4gICAgICAgICAgICByb3VnaG5lc3M6ZjMyLFxuICAgIFxuICAgICAgICAgICAgbWV0YWxuZXNzOmYzMixcbiAgICBcbiAgICAgICAgICAgICNpZiBUT05FX01BUFBJTkdcbiAgICAgICAgICAgICAgICB0b25lTWFwcGluZ0V4cG9zdXJlOmYzMixcbiAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICBcbiAgICAgICAgICAgICNpZiBTUEVDVUxBUlxuICAgIFxuICAgICAgICAgICAgICAgICBzcGVjdWxhckNvbG9yOnZlYzM8ZjMyPixcbiAgICBcbiAgICAgICAgICAgICAgICAgc3BlY3VsYXJJbnRlbnNpdHk6ZjMyLFxuICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgICBcbiAgICAgICAgICAgICNpZiBVU0VfU0hFRU5cbiAgICBcbiAgICAgICAgICAgICAgICBzaGVlbkNvbG9yOnZlYzM8ZjMyPixcbiAgICBcbiAgICAgICAgICAgICAgICBzaGVlblJvdWdobmVzczpmMzIsXG4gICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgI2lmIFVTRV9UUkFOU01JU1NJT05cbiAgICBcbiAgICAgICAgICAgICAgICBhdHRlbnVhdGlvbkNvbG9yOnZlYzM8ZjMyPixcbiAgICBcbiAgICAgICAgICAgICAgICB0cmFuc21pc3Npb246ZjMyLFxuICAgIFxuICAgICAgICAgICAgICAgIHRyYW5zbWlzc2lvblNhbXBsZXJTaXplOnZlYzI8ZjMyPixcbiAgICBcbiAgICAgICAgICAgICAgICB0aGlja25lc3M6ZjMyLFxuICAgIFxuICAgICAgICAgICAgICAgIGF0dGVudWF0aW9uRGlzdGFuY2U6ZjMyLFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICNpZiBVU0VfU0tJTk5JTkdcbiAgICBcbiAgICAgICAgICAgICAgICBiaW5kTWF0cml4Om1hdDR4NDxmMzI+LFxuICAgIFxuICAgICAgICAgICAgICAgIGJpbmRNYXRyaXhJbnZlcnNlOm1hdDR4NDxmMzI+LFxuICAgIFxuICAgICAgICAgICAgICAgIGJvbmVUZXh0dXJlU2l6ZTp1MzIsXG4gICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgI2lmIFVTRV9OT1JNQUxURVhUVVJFXG4gICAgICAgICAgICAgICAgIG5vcm1hbFNjYWxlOnZlYzI8ZjMyPixcbiAgICAgICAgICAgICNlbmRpZlxuICAgIFxuICAgICAgICAgICAgI2lmIElPUlxuICAgICAgICAgICAgICAgIGlvcjpmMzIsXG4gICAgICAgICAgICAjZW5kaWZcbiAgICBcbiAgICAgICAgICAgICNpZiBVU0VfQ0xFQVJDT0FUXG4gICAgXG4gICAgICAgICAgICAgICAgI2lmIFVTRV9DTEVBUkNPQVRfTk9STUFMVEVYVFVSRVxuICAgICAgICAgICAgICAgICAgICBjbGVhcmNvYXROb3JtYWxTY2FsZTp2ZWMyPGYzMj4sXG4gICAgICAgICAgICAgICAgI2VuZGlmXG4gICAgXG4gICAgICAgICAgICAgICAgIGNsZWFyY29hdDpmMzIsXG4gICAgXG4gICAgICAgICAgICAgICAgIGNsZWFyY29hdFJvdWdobmVzczpmMzIsXG4gICAgICAgICAgICAjZW5kaWZcbiAgICBcbiAgICAgICAgICAgICNpZiBVU0VfSVJJREVTQ0VOQ0VcbiAgICAgICAgICAgICAgICBpcmlkZXNjZW5jZTpmMzIsXG4gICAgXG4gICAgICAgICAgICAgICAgaXJpZGVzY2VuY2VJT1I6ZjMyLFxuICAgIFxuICAgICAgICAgICAgICAgIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bTpmMzIsXG4gICAgXG4gICAgICAgICAgICAgICAgaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtOmYzMixcbiAgICBcbiAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAjaWYgVVNFX0FPVEVYVFVSRVxuICAgICAgICAgICAgICAgICBhb1RleHR1cmVJbnRlbnNpdHk6ZjMyLFxuICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICNpZiBVU0VfTElHSFRURVhUVVJFXG4gICAgICAgICAgICAgICAgIGxpZ2h0VGV4dHVyZUludGVuc2l0eTpmMzIsXG4gICAgICAgICAgICAjZW5kaWZcbiAgICBcbiAgICAgICAgICAgICNpZiBVU0VfRU5WVEVYVFVSRVxuICAgICAgICAgICAgICAgIGVudlRleHR1cmVJbnRlbnNpdHk6ZjMyLFxuICAgIFxuICAgICAgICAgICAgICAgIGZsaXBFbnZUZXh0dXJlOmYzMixcbiAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAjaWYgVVNFX0JVTVBURVhUVVJFXG4gICAgICAgICAgICAgICAgYnVtcFNjYWxlOmYzMjtcbiAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAjaWYgVVNFX0RJU1BMQUNFTUVOVFRFWFRVUkVcbiAgICBcbiAgICAgICAgICAgICAgICBkaXNwbGFjZW1lbnRTY2FsZTpmMzIsXG4gICAgXG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50QmlhczpmMzIsXG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgI2lmIFVTRV9NT1JQSFRBUkdFVFNcbiAgICBcbiAgICAgICAgICAgICAgICBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U6ZjMyLFxuICAgIFxuICAgICAgICAgICAgICAgICNpZiBNT1JQSFRBUkdFVFNfVEVYVFVSRVxuICAgIFxuICAgICAgICAgICAgICAgICAgICBtb3JwaFRhcmdldHNUZXh0dXJlU2l6ZTp2ZWMyPHUzMj4sXG4gICAgXG4gICAgICAgICAgICAgICAgICAgIE1PUlBIVEFSR0VUU19DT1VOVDp1MzIsXG4gICAgXG4gICAgICAgICAgICAgICAgI2VuZGlmXG4gICAgXG4gICAgICAgICAgICAgICAgbW9ycGhUYXJnZXRJbmZsdWVuY2VzOmFycmF5PGYzMj4sXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgIH1cblxuICAgYDtcbiIsImV4cG9ydCBkZWZhdWx0IGAgICAgICAgIFxuICAgICAgICAgICAgI2lmIFVTRV9CVU1QVEVYVFVSRVxuICAgICAgICAgICAgICAgIEBncm91cCgwKSBAYmluZGluZyhidW1wVGV4dHVyZUJpbmRpbmcpIHZhciBidW1wVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgICAjaWYgVVNFX1RSQU5TTUlTU0lPTlxuICAgICAgICAgICAgICAgICNpZiBVU0VfVFJBTlNNSVNTSU9OVEVYVFVSRVxuICAgICAgICAgICAgICAgICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcodHJhbnNtaXNzaW9uVGV4dHVyZUJpbmRpbmcpIHZhciB0cmFuc21pc3Npb25UZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG4gICAgICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgICAgICAgI2lmIFVTRV9USElDS05FU1NURVhUVVJFXG4gICAgICAgICAgICAgICAgICAgIEBncm91cCgwKSBAYmluZGluZyh0aGlja25lc3NUZXh0dXJlQmluZGluZykgdmFyIHRoaWNrbmVzc1RleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbiAgICAgICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcodHJhbnNtaXNzaW9uU2FtcGxlclRleHR1cmVCaW5kaW5nKSB2YXIgdHJhbnNtaXNzaW9uU2FtcGxlclRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbiAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgI2lmIFVTRV9FTlZURVhUVVJFXG4gICAgICAgICAgICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKGVudlRleHR1cmVCaW5kaW5nKSB2YXIgZW52VGV4dHVyZTogdGV4dHVyZV9jdWJlPGYzMj47XG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgICNpZiBVU0VfTk9STUFMVEVYVFVSRVxuICAgICAgICAgICAgICAgIEBncm91cCgwKSBAYmluZGluZyhub3JtYWxUZXh0dXJlQmluZGluZykgdmFyIG5vcm1hbFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbiAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgXG4gICAgICAgICAgICAjaWYgVVNFX0NMRUFSQ09BVFRFWFRVUkVcbiAgICAgICAgICAgICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoY2xlYXJjb2F0VGV4dHVyZUJpbmRpbmcpIHZhciBjbGVhcmNvYXRUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgI2lmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTVEVYVFVSRVxuICAgICAgICAgICAgICAgIEBncm91cCgwKSBAYmluZGluZyhjbGVhcmNvYXRSY2xlYXJjb2F0Um91Z2huZXNzVGV4dHVyZUJpbmRpbmcpIHZhciBjbGVhcmNvYXRSb3VnaG5lc3NUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgI2lmIFVTRV9DTEVBUkNPQVRfTk9STUFMVEVYVFVSRVxuICAgICAgICAgICAgICAgIEBncm91cCgwKSBAYmluZGluZyhjbGVhcmNvYXROb3JtYWxUZXh0dXJlQmluZGluZykgdmFyIGNsZWFyY29hdE5vcm1hbFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbiAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgXG4gICAgICAgICAgICAjaWYgVVNFX0lSSURFU0NFTkNFVEVYVFVSRVxuICAgICAgICAgICAgICAgIEBncm91cCgwKSBAYmluZGluZyhpcmlkZXNjZW5jZVRleHR1cmVCaW5kaW5nKSB2YXIgaXJpZGVzY2VuY2VUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgI2lmIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NURVhUVVJFXG4gICAgICAgICAgICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKGlyaWRlc2NlbmNlVGhpY2tuZXNzVGV4dHVyZUJpbmRpbmcpIHZhciBpcmlkZXNjZW5jZVRoaWNrbmVzc1RleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbiAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgXG4gICAgICAgICAgICAjaWYgVVNFX1JPVUdITkVTU1RFWFRVUkVcbiAgICAgICAgICAgICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcocm91Z2huZXNzVGV4dHVyZUJpbmRpbmcpIHZhciByb3VnaG5lc3NUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgI2lmIFVTRV9NRVRBTE5FU1NURVhUVVJFXG4gICAgICAgICAgICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKG1ldGFsbmVzc1RleHR1cmVCaW5kaW5nKSB2YXIgbWV0YWxuZXNzVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICNpZiBTUEVDVUxBUlxuICAgICAgICAgICAgICAgICNpZiBVU0VfU1BFQ1VMQVJJTlRFTlNJVFlURVhUVVJFXG4gICAgICAgICAgICAgICAgICAgIEBncm91cCgwKSBAYmluZGluZyhzcGVjdWxhckludGVuc2l0eVRleHR1cmVCaW5kaW5nKSB2YXIgc3BlY3VsYXJJbnRlbnNpdHlUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG4gICAgICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICAgICAjaWYgVVNFX1NQRUNVTEFSQ09MT1JURVhUVVJFXG4gICAgICAgICAgICAgICAgICAgIEBncm91cCgwKSBAYmluZGluZyhzcGVjdWxhckNvbG9yVGV4dHVyZUJpbmRpbmcpIHZhciBzcGVjdWxhckNvbG9yVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuICAgICAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICNpZiBVU0VfU0hFRU5cbiAgICAgICAgICAgICAgICAjaWYgVVNFX1NIRUVOQ09MT1JURVhUVVJFXG4gICAgICAgICAgICAgICAgICAgIEBncm91cCgwKSBAYmluZGluZyhzaGVlbkNvbG9yVGV4dHVyZUJpbmRpbmcpIHZhciBzaGVlbkNvbG9yVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuICAgICAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgICAgICNpZiBVU0VfU0hFRU5ST1VHSE5FU1NURVhUVVJFXG4gICAgICAgICAgICAgICAgICAgIEBncm91cCgwKSBAYmluZGluZyhzaGVlblJvdWdobmVzc1RleHR1cmVCaW5kaW5nKSB2YXIgc2hlZW5Sb3VnaG5lc3NUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG4gICAgICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgI2lmIFVTRV9URVhUVVJFXG4gICAgICAgICAgICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKGJhc2VTYW1wbGVyQmluZGluZykgdmFyIGJhc2VTYW1wbGVyOiBzYW1wbGVyO1xuICAgICAgICAgICAgICAgIEBncm91cCgwKSBAYmluZGluZyhiYXNlVGV4dHVyZUJpbmRpbmcpIHZhciBiYXNlVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+O1xuICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICNpZiBVU0VfQUxQSEFURVhUVVJFXG4gICAgICAgICAgICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKGFscGhhVGV4dHVyZUJpbmRpbmcpIHZhciBhbHBoYVRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbiAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAjaWYgVVNFX0FPVEVYVFVSRVxuICAgICAgICAgICAgICAgIEBncm91cCgwKSBAYmluZGluZyhhb1RleHR1cmVCaW5kaW5nKSB2YXIgYW9UZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgICNpZiBVU0VfTElHSFRURVhUVVJFXG4gICAgICAgICAgICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKGxpZ2h0VGV4dHVyZUJpbmRpbmcpIHZhciBsaWdodFRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjtcbiAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAjaWYgVVNFX0VNSVNTSVZFVEVYVFVSRVxuICAgICAgICAgICAgICAgIEBncm91cCgwKSBAYmluZGluZyhlbWlzc2l2ZVRleHR1cmVCaW5kaW5nKSB2YXIgZW1pc3NpdmVUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47XG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgYDtcbiIsImV4cG9ydCBkZWZhdWx0IGBcbiAgICBjb25zdCBwaTpmMzI9IDMuMTQxNTkyNjUzNTg5NzkzO1xuICAgIFxuICAgIGNvbnN0IHJlY2lwcm9jYWxfcGk6ZjMyPSAwLjMxODMwOTg4NjE4Mzc5MDc7XG4gICAgZm4gcG93Mih4OmYzMiApLT5mMzIge1xuICAgICAgICByZXR1cm4geCp4O1xuICAgIH1cbiAgICBmbiBwb3cyVmVjdG9yKHg6dmVjMzxmMzI+ICktPnZlYzM8ZjMyPiB7XG4gICAgICAgIHJldHVybiB4Kng7XG4gICAgfVxuICAgIGZuIHBvdzMoIHg6ZjMyICktPmYzMiB7XG4gICAgICAgIHJldHVybiB4KngqeDtcbiAgICB9XG4gICAgZm4gcG93NCggeDpmMzIgKS0+ZjMyIHtcbiAgICAgICAgbGV0IHgyOmYzMiA9IHgqeDtcbiAgICAgICAgcmV0dXJuIHgyKngyO1xuICAgIH1cbiAgICBmbiBtYXgzKCB2OnZlYzM8ZjMyPiApLT5mMzIge1xuICAgICAgICByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApO1xuICAgIH1cbiAgICBmbiBhdmVyYWdlKHY6dmVjMzxmMzI+ICktPmYzMiB7XG4gICAgICAgIHJldHVybiBkb3QoIHYsIHZlYzM8ZjMyPiggMC4zMzMzMzMzICkgKTtcbiAgICB9XG4gICAgZm4gcmFuZCggdXY6dmVjMjxmMzI+ICktPmYzMiB7XG4gICAgICAgIGxldCBhOmYzMiA9IDEyLjk4OTg7XG4gICAgICAgIGxldCBiOmYzMiA9IDc4LjIzMztcbiAgICAgICAgbGV0IGM6ZjMyID0gNDM3NTguNTQ1MztcbiAgICAgICAgbGV0IGR0OmYzMiA9IGRvdCggdXYueHksIHZlYzI8ZjMyPiggYSwgYiApICk7XG4gICAgICAgIGxldCBzbjpmMzIgPSBkdCAlIHBpO1xuICAgICAgICByZXR1cm4gZnJhY3QoIHNpbiggc24gKSAqIGMgKTtcbiAgICB9XG4gICAgZm4gdHJhbnNmb3JtRGlyZWN0aW9uKCBkaXI6dmVjMzxmMzI+LCBtYXRyaXg6bWF0NHg0PGYzMj4gKS0+dmVjMzxmMzI+IHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0PGYzMj4oIGRpciwgMC4wICkgKS54eXogKTtcbiAgICB9XG5cbiAgICBmbiB0cmFuc3Bvc2VNYXQzKCBtOm1hdDN4MzxmMzI+ICktPm1hdDN4MzxmMzI+IHtcbiAgICAgICAgdmFyIHRtcDptYXQzeDM8ZjMyPjtcbiAgICAgICAgdG1wWyAwIF0gPSB2ZWMzPGYzMj4oIG1bIDAgXS54LCBtWyAxIF0ueCwgbVsgMiBdLnggKTtcbiAgICAgICAgdG1wWyAxIF0gPSB2ZWMzPGYzMj4oIG1bIDAgXS55LCBtWyAxIF0ueSwgbVsgMiBdLnkgKTtcbiAgICAgICAgdG1wWyAyIF0gPSB2ZWMzPGYzMj4oIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTtcbiAgICAgICAgcmV0dXJuIHRtcDtcbiAgICB9XG4gICAgZm4gbHVtaW5hbmNlKCByZ2I6dmVjMzxmMzI+ICktPmYzMiB7XG4gICAgICAgIGxldCB3ZWlnaHRzOnZlYzM8ZjMyPiA9IHZlYzM8ZjMyPigwLjIxMjY3MjksIDAuNzE1MTUyMiwgMC4wNzIxNzUwICk7XG4gICAgICAgIHJldHVybiBkb3QoIHdlaWdodHMsIHJnYiApO1xuICAgIH1cbiAgICBmbiBMaW5lYXJUb25lTWFwcGluZyggY29sb3I6dmVjMzxmMzI+LHRvbmVNYXBwaW5nRXhwb3N1cmU6ZjMyICApLT52ZWMzPGYzMj4ge1xuICAgICAgICByZXR1cm4gdG9uZU1hcHBpbmdFeHBvc3VyZSAqIGNvbG9yO1xuICAgIH1cblxuICAgIGZuIFJlaW5oYXJkVG9uZU1hcHBpbmcoIGNvbG9yOnZlYzM8ZjMyPix0b25lTWFwcGluZ0V4cG9zdXJlOmYzMiApLT52ZWMzPGYzMj4ge1xuICAgICAgICB2YXIgdGVtcENvbG9yOnZlYzM8ZjMyPjtcbiAgICAgICAgdGVtcENvbG9yPWNvbG9yO1xuICAgICAgICB0ZW1wQ29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcbiAgICAgICAgcmV0dXJuIHNhdHVyYXRlKCB0ZW1wQ29sb3IgLyAoIHZlYzM8ZjMyPiggMS4wICkgKyB0ZW1wQ29sb3IgKSApO1xuICAgIH1cbiAgICBmbiBDdXN0b21Ub25lTWFwcGluZyggY29sb3I6dmVjMzxmMzI+ICktPnZlYzM8ZjMyPiB7XG4gICAgICAgIHJldHVybiBjb2xvcjtcbiAgICB9XG4gICAgZm4gdG9uZU1hcHBpbmcoIGNvbG9yOnZlYzM8ZjMyPix0b25lTWFwcGluZ0V4cG9zdXJlOmYzMiAgKS0+dmVjMzxmMzI+IHtcbiAgICAgICAgcmV0dXJuIFJlaW5oYXJkVG9uZU1hcHBpbmcoIGNvbG9yLHRvbmVNYXBwaW5nRXhwb3N1cmUgKTtcbiAgICB9XG5cbiAgICBmbiBMaW5lYXJUb0xpbmVhciggdmFsdWU6dmVjNDxmMzI+ICktPnZlYzQ8ZjMyPiB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgZm4gbGVzc1RoYW5FcXVhbChhOnZlYzM8ZjMyPixiOnZlYzM8ZjMyPiktPnZlYzM8ZjMyPntcbiAgICAgICBsZXQgeFZhbHVlOmYzMj1zZWxlY3QoYi54LGEueCxhLng8PWIueCk7XG4gICAgICAgbGV0IHlWYWx1ZTpmMzI9c2VsZWN0KGIueSxhLnksYS55PD1iLnkpO1xuICAgICAgIGxldCB6VmFsdWU6ZjMyPXNlbGVjdChiLnosYS56LGEuejw9Yi56KTtcbiAgICAgICByZXR1cm4gdmVjMzxmMzI+KHhWYWx1ZSx5VmFsdWUselZhbHVlKTsgICAgXG4gICAgfVxuICAgIGZuIExpbmVhclRvc1JHQiggdmFsdWU6dmVjNDxmMzI+ICktPnZlYzQ8ZjMyPiB7XG4gICAgICAgIHJldHVybiB2ZWM0PGYzMj4oIG1peCggcG93KCB2YWx1ZS5yZ2IsIHZlYzM8ZjMyPiggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzM8ZjMyPiggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzM8ZjMyPiggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzPGYzMj4oIDAuMDAzMTMwOCApICkgKSApLCB2YWx1ZS5hICk7XG4gICAgfVxuICAgIGZuIGxpbmVhclRvT3V0cHV0VGV4ZWwodmFsdWU6dmVjNDxmMzI+ICktPnZlYzQ8ZjMyPiB7XG4gICAgICAgIHJldHVybiBMaW5lYXJUb3NSR0IoIHZhbHVlICk7XG4gICAgfVxuICAgIGA7XG4iLCJleHBvcnQgZGVmYXVsdCBgXG4gICAgICAgZm4gZ2V0UG9pbnRMaWdodEluZm8ocG9pbnRMaWdodDpQb2ludExpZ2h0LHdvcmxkUG9zOnZlYzM8ZjMyPixzaGluaW5lc3M6ZjMyLE46dmVjMzxmMzI+LFY6dmVjMzxmMzI+KS0+dmVjMzxmMzI+e1xuICAgICAgICB2YXIgY29sb3I9dmVjMzxmMzI+KDAuMCwwLjAsMC4wKTtcbiAgICAgICAgdmFyIGRpcmVjdGlvbjp2ZWMzPGYzMj4gPSB3b3JsZFBvcyAtIHBvaW50TGlnaHQucG9zaXRpb247XG4gICAgICAgIGxldCBkaXN0OmYzMiA9IGxlbmd0aCggZGlyZWN0aW9uICk7XG4gICAgICAgIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZShkaXJlY3Rpb24pO1xuICAgICAgICBsZXQgZGVjYXkgPSBjbGFtcCgxLjAgLSBwb3coZGlzdCAvIHBvaW50TGlnaHQuZGlzdGFuY2UsIDQuMCksIDAuMCwgMS4wKTtcblxuICAgICAgICBsZXQgZCA9ICBtYXgoIGRvdCggTiwgLWRpcmVjdGlvbiApLCAwLjAgKSAqIGRlY2F5O1xuICAgICAgICBjb2xvciArPSBwb2ludExpZ2h0LmNvbG9yICogZDtcblxuICAgICAgICBsZXQgaGFsZkRpcjp2ZWMzPGYzMj4gPSBub3JtYWxpemUoIFYgLSBkaXJlY3Rpb24gKTtcbiAgICAgICAgbGV0IHM6ZjMyID0gcG93KCBjbGFtcCggZG90KCBOLCBoYWxmRGlyICksIDAuMCwgMS4wICksIHNoaW5pbmVzcyApICAqIGRlY2F5O1xuICAgICAgICBjb2xvciArPSBwb2ludExpZ2h0LmNvbG9yICogcztcbiAgICAgICAgcmV0dXJuIGNvbG9yO1xuICAgICAgIH1cbiAgICAgICBmbiBnZXRTcG90TGlnaHRJbmZvKHNwb3RMaWdodDpTcG90TGlnaHQsd29ybGRQb3M6dmVjMzxmMzI+LHNoaW5pbmVzczpmMzIsTjp2ZWMzPGYzMj4sVjp2ZWMzPGYzMj4pLT52ZWMzPGYzMj57XG4gICAgICAgIHZhciBjb2xvcj12ZWMzPGYzMj4oMC4wLDAuMCwwLjApO1xuICAgICAgICAgICAgdmFyIGRpcmVjdGlvbjp2ZWMzPGYzMj4gPSBzcG90TGlnaHQucG9zaXRpb24gLSB3b3JsZFBvcztcbiAgICAgICAgICAgIGxldCBsaWdodERpc3RhbmNlOmYzMiA9IGxlbmd0aChkaXJlY3Rpb24pO1xuICAgICAgICAgICAgZGlyZWN0aW9uID0gbm9ybWFsaXplKGRpcmVjdGlvbik7XG4gICAgICAgICAgICBsZXQgYW5nbGVDb3M6ZjMyID0gZG90KCBkaXJlY3Rpb24sIC1zcG90TGlnaHQuZGlyZWN0aW9uICk7XG4gICAgICAgICAgICBsZXQgZGVjYXk6ZjMyID0gY2xhbXAoMS4wIC0gcG93KGxpZ2h0RGlzdGFuY2Uvc3BvdExpZ2h0LmRpc3RhbmNlLCA0LjApLCAwLjAsIDEuMCk7XG4gICAgICAgICAgICBsZXQgc3BvdEVmZmVjdDpmMzIgPSBzbW9vdGhzdGVwKCBzcG90TGlnaHQucGVudW1icmFDb3MsIHNwb3RMaWdodC5jb25lQ29zLCBhbmdsZUNvcyApO1xuICAgICAgICAgICAgbGV0IGRlY2F5VG90YWw6ZjMyID0gZGVjYXkgKiBzcG90RWZmZWN0O1xuICAgICAgICAgICAgbGV0IGQ6ZjMyID0gbWF4KCBkb3QoIE4sIGRpcmVjdGlvbiApLCAwLjAgKSAgKiBkZWNheVRvdGFsO1xuICAgICAgICAgICAgY29sb3IgKz0gc3BvdExpZ2h0LmNvbG9yICogZDtcbiAgICAgICAgICAgIGxldCBoYWxmRGlyOnZlYzM8ZjMyPiA9IG5vcm1hbGl6ZSggViArIGRpcmVjdGlvbiApO1xuICAgICAgICAgICAgbGV0IHM6ZjMyID0gcG93KCBjbGFtcCggZG90KCBOLCBoYWxmRGlyICksIDAuMCwgMS4wICksIHNoaW5pbmVzcyApICogZGVjYXlUb3RhbDtcbiAgICAgICAgICAgIGNvbG9yICs9IHNwb3RMaWdodC5jb2xvciAqIHM7XG4gICAgICAgICAgICByZXR1cm4gY29sb3I7XG4gICAgICAgfVxuICAgIHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0IHtcbiAgICAgICAgZGlyZWN0aW9uOiB2ZWMzPGYzMj4sXG4gICAgICAgIGNvbG9yOiB2ZWMzPGYzMj4sXG4gICAgfTtcbiAgICAgIGZuIGdldERpcmVjdExpZ2h0SW5mbyhkaXJlY3Rpb25hbExpZ2h0OkRpcmVjdGlvbmFsTGlnaHQsc2hpbmluZXNzOmYzMixOOnZlYzM8ZjMyPixWOnZlYzM8ZjMyPiktPnZlYzM8ZjMyPntcbiAgICAgICAgdmFyIGNvbG9yPXZlYzM8ZjMyPigwLjAsMC4wLDAuMCk7XG4gICAgICAgIGxldCBkOmYzMiA9IG1heChkb3QoTiwgLWRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uKSwgMC4wKTtcbiAgICAgICAgY29sb3IgKz0gZGlyZWN0aW9uYWxMaWdodC5jb2xvciAqIGQ7XG5cbiAgICAgICAgbGV0IGhhbGZEaXI6dmVjMzxmMzI+ID0gbm9ybWFsaXplKCBWIC0gZGlyZWN0aW9uYWxMaWdodC5kaXJlY3Rpb24gKTtcbiAgICAgICAgbGV0IHM6ZjMyID0gcG93KCBjbGFtcCggZG90KCBOLCBoYWxmRGlyICksIDAuMCwgMS4wICksIHNoaW5pbmVzcyApO1xuICAgICAgICBjb2xvciArPSBkaXJlY3Rpb25hbExpZ2h0LmNvbG9yICogcztcbiAgICAgICAgcmV0dXJuIGNvbG9yO1xuICAgICAgIH1cbiAgICBgO1xuIiwiZXhwb3J0IGRlZmF1bHQgYFxuICAgIGZuIEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKS0+ZjMyIHtcblxuICAgICAgICAvLyBnZW9tZXRyeSB0ZXJtIGlzIChuIGRvdCBsKShuIGRvdCB2KSAvIDQobiBkb3QgbCkobiBkb3QgdilcbiAgICAgICAgcmV0dXJuIDAuMjU7XG5cbiAgICB9XG4gICAgZm4gRF9CbGlublBob25nKCBzaGluaW5lc3M6ZjMyLCBkb3ROSDpmMzIgKS0+ZjMyIHtcblxuICAgICAgICByZXR1cm4gcmVjaXByb2NhbF9waSAqICggc2hpbmluZXNzICogMC41ICsgMS4wICkgKiBwb3coZG90TkgsIHNoaW5pbmVzcyk7XG5cbiAgICB9XG4gICAgZm4gQlJERl9CbGlublBob25nKCBsaWdodERpcjp2ZWMzPGYzMj4sIHZpZXdEaXI6dmVjMzxmMzI+LCBub3JtYWw6dmVjMzxmMzI+LCBzcGVjdWxhckNvbG9yOnZlYzM8ZjMyPiwgc2hpbmluZXNzOmYzMiApLT52ZWMzPGYzMj4ge1xuXG4gICAgICAgIGxldCAgaGFsZkRpciA9IG5vcm1hbGl6ZSggbGlnaHREaXIgKyB2aWV3RGlyICk7XG5cbiAgICAgICAgbGV0ICBkb3ROSDpmMzIgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApO1xuICAgICAgICBsZXQgZG90Vkg6ZjMyID0gc2F0dXJhdGUoIGRvdCggdmlld0RpciwgaGFsZkRpciApICk7XG5cbiAgICAgICAgbGV0IEYgPSBGX1NjaGxpY2soIHNwZWN1bGFyQ29sb3IsIDEuMCwgZG90VkggKTtcblxuICAgICAgICBsZXQgRzpmMzIgPSBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICk7XG5cbiAgICAgICAgbGV0IEQgPSBEX0JsaW5uUGhvbmcoIHNoaW5pbmVzcywgZG90TkggKTtcblxuICAgICAgICByZXR1cm4gRiAqICggRyAqIEQgKTtcblxuICAgIH0gXG4gICAgZm4gUkVfRGlyZWN0X0JsaW5uUGhvbmcoICBkaXJlY3RMaWdodDpJbmNpZGVudExpZ2h0LGdlb21ldHJ5Okdlb21ldHJpY0NvbnRleHQsIG1hdGVyaWFsOkJsaW5uUGhvbmdNYXRlcmlhbCApLT5SZWZsZWN0ZWRMaWdodHtcbiAgICAgICAgdmFyIHJlZmxlY3RlZExpZ2h0OlJlZmxlY3RlZExpZ2h0OyBcbiAgICAgICAgbGV0IGRvdE5MOmYzMiA9IHNhdHVyYXRlKGRvdChnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbikpO1xuICAgICAgICBsZXQgaXJyYWRpYW5jZTp2ZWMzPGYzMj4gPSBkb3ROTCpkaXJlY3RMaWdodC5jb2xvcjtcblxuICAgICAgICByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcblxuICAgICAgICByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhcj0gaXJyYWRpYW5jZSAqIEJSREZfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoO1xuICAgICAgICByZXR1cm4gcmVmbGVjdGVkTGlnaHQ7XG4gICAgfVxuICAgIGZuIFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nKCBpcnJhZGlhbmNlOnZlYzM8ZjMyPiwgZ2VvbWV0cnk6R2VvbWV0cmljQ29udGV4dCwgbWF0ZXJpYWw6Qmxpbm5QaG9uZ01hdGVyaWFsKS0+UmVmbGVjdGVkTGlnaHQge1xuICAgICAgICB2YXIgcmVmbGVjdGVkTGlnaHQ6UmVmbGVjdGVkTGlnaHQ7IFxuICAgICAgICByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG4gICAgICAgIHJldHVybiByZWZsZWN0ZWRMaWdodDtcbiAgICB9XG4gICAgYDtcbiIsImV4cG9ydCBkZWZhdWx0IGBcbiAgIHN0cnVjdCBCbGlublBob25nTWF0ZXJpYWwge1xuICAgICAgICBkaWZmdXNlQ29sb3I6dmVjMzxmMzI+LFxuICAgICAgICBzcGVjdWxhckNvbG9yOnZlYzM8ZjMyPixcbiAgICAgICAgc3BlY3VsYXJTaGluaW5lc3M6ZjMyLFxuICAgICAgICBzcGVjdWxhclN0cmVuZ3RoOmYzMixcbiAgICB9O1xuICAgIGNvbnN0IHJlY2lwcm9jYWxfcGk6ZjMyPSAwLjMxODMwOTg4NjE4Mzc5MDc7XG4gICBmbiBwb3cyKCB4OmYzMiApLT5mMzIgeyByZXR1cm4geCp4OyB9XG4gICBmbiBwb3czKCB4OmYzMiApLT5mMzIgeyByZXR1cm4geCp4Kng7IH1cbiAgIGZuIHBvdzQoeDpmMzIgKS0+ZjMyIHsgbGV0IHgyID0geCp4OyByZXR1cm4geDIqeDI7IH1cbiAgIGZuIG1heDMoIHY6dmVjMzxmMzI+ICktPmYzMiB7IHJldHVybiBtYXgoIG1heCggdi54LCB2LnkgKSwgdi56ICk7IH1cbiAgIGZuIGF2ZXJhZ2Uodjp2ZWMzPGYzMj4gKS0+ZjMyIHsgXG4gICAgICAgbGV0IHJlc3VsdD12ZWMzPGYzMj4oIDAuMzMzMzMzMywgIDAuMzMzMzMzMywgMC4zMzMzMzMzKTtcbiAgICAgICByZXR1cm4gZG90KCB2LHJlc3VsdCApOyBcbiAgIH1cbiAgIGA7XG4iLCJleHBvcnQgY29uc3QgZ2V0U2tpbk1hdHJpeCA9IGBcbiAgICNpZiBIQVNfU0tJTlxuICAgICAgICBzdHJ1Y3QgSm9pbnRzVW5pZm9ybXtcbiAgICAgICAgICAgICBtYXRyaXhzOmFycmF5PG1hdDR4NGY+LFxuICAgICAgICB9XG4gICAgICAgIHN0cnVjdCBJbnZlcnNlQmluZE1hdHJpY2VzVW5pZm9ybXtcbiAgICAgICAgICAgIG1hdHJpeHM6YXJyYXk8bWF0NHg0Zj4sXG4gICAgICAgIH1cbiAgICAgICAgQGJpbmRpbmcoc2tpbkpvaW50c0J1ZmZlckJpbmRpbmcpIEBncm91cCgwKSB2YXI8c3RvcmFnZSwgcmVhZD4gam9pbnRzVW5pZm9ybSA6IEpvaW50c1VuaWZvcm07XG4gICAgICAgIEBiaW5kaW5nKGludnNCdWZmZXJCaW5kaW5nKSBAZ3JvdXAoMCkgdmFyPHN0b3JhZ2UsIHJlYWQ+IGludmVyc2VCaW5kTWF0cmljZXNVbmlmb3JtIDogSW52ZXJzZUJpbmRNYXRyaWNlc1VuaWZvcm07XG4gICAgICAgIGZuIGdldFNraW5NYXRyaXgoam9pbnRzOiB2ZWM0Ziwgd2VpZ2h0czogdmVjNGYpIC0+IG1hdDR4NDxmMzI+IHtcbiAgICAgICAgICAgIGxldCBqb2ludDAgPSBqb2ludHNVbmlmb3JtLm1hdHJpeHNbdTMyKGpvaW50cy54KV0gKiBpbnZlcnNlQmluZE1hdHJpY2VzVW5pZm9ybS5tYXRyaXhzW3UzMihqb2ludHMueCldO1xuICAgICAgICAgICAgbGV0IGpvaW50MSA9IGpvaW50c1VuaWZvcm0ubWF0cml4c1t1MzIoam9pbnRzLnkpXSAqIGludmVyc2VCaW5kTWF0cmljZXNVbmlmb3JtLm1hdHJpeHNbdTMyKGpvaW50cy55KV07XG4gICAgICAgICAgICBsZXQgam9pbnQyID0gam9pbnRzVW5pZm9ybS5tYXRyaXhzW3UzMihqb2ludHMueildICogaW52ZXJzZUJpbmRNYXRyaWNlc1VuaWZvcm0ubWF0cml4c1t1MzIoam9pbnRzLnopXTtcbiAgICAgICAgICAgIGxldCBqb2ludDMgPSBqb2ludHNVbmlmb3JtLm1hdHJpeHNbdTMyKGpvaW50cy53KV0gKiBpbnZlcnNlQmluZE1hdHJpY2VzVW5pZm9ybS5tYXRyaXhzW3UzMihqb2ludHMudyldO1xuICAgICAgICBcbiAgICAgICAgICAgIGxldCBza2luTWF0cml4ID0gam9pbnQwICogd2VpZ2h0cy54ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2ludDEgKiB3ZWlnaHRzLnkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW50MiAqIHdlaWdodHMueiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbnQzICogd2VpZ2h0cy53O1xuICAgICAgICAgICAgcmV0dXJuIHNraW5NYXRyaXg7XG4gICAgICAgIH1cbiAgICAgICAgI2VuZGlmXG4gICBgO1xuXG5leHBvcnQgY29uc3Qgc2tpblZlcnRIZWFkZXIgPSBgXG4gICAjaWYgSEFTX1NLSU4gXG4gICAgICAgIHN0cnVjdCBKb2ludHNVbmlmb3Jte1xuICAgICAgICAgICAgIG1hdHJpeHM6YXJyYXk8bWF0NHg0Zj4sXG4gICAgICAgIH1cbiAgICAgICAgc3RydWN0IEludmVyc2VCaW5kTWF0cmljZXNVbmlmb3Jte1xuICAgICAgICAgICAgbWF0cml4czphcnJheTxtYXQ0eDRmPixcbiAgICAgICAgfVxuICAgICAgICBAYmluZGluZyhza2luSm9pbnRzQnVmZmVyQmluZGluZykgQGdyb3VwKDApIHZhcjxzdG9yYWdlLCByZWFkPiBqb2ludHNVbmlmb3JtIDogSm9pbnRzVW5pZm9ybTtcbiAgICAgICAgQGJpbmRpbmcoaW52c0J1ZmZlckJpbmRpbmcpIEBncm91cCgwKSB2YXI8c3RvcmFnZSwgcmVhZD4gaW52ZXJzZUJpbmRNYXRyaWNlc1VuaWZvcm0gOiBJbnZlcnNlQmluZE1hdHJpY2VzVW5pZm9ybTtcbiAgICAgICAgZm4gZ2V0U2tpbk1hdHJpeChqb2ludHM6IHZlYzRmLCB3ZWlnaHRzOiB2ZWM0ZikgLT4gbWF0NHg0PGYzMj4ge1xuICAgICAgICAgICAgbGV0IGpvaW50MCA9IGpvaW50c1VuaWZvcm0ubWF0cml4c1t1MzIoam9pbnRzLngpXSAqIGludmVyc2VCaW5kTWF0cmljZXNVbmlmb3JtLm1hdHJpeHNbdTMyKGpvaW50cy54KV07XG4gICAgICAgICAgICBsZXQgam9pbnQxID0gam9pbnRzVW5pZm9ybS5tYXRyaXhzW3UzMihqb2ludHMueSldICogaW52ZXJzZUJpbmRNYXRyaWNlc1VuaWZvcm0ubWF0cml4c1t1MzIoam9pbnRzLnkpXTtcbiAgICAgICAgICAgIGxldCBqb2ludDIgPSBqb2ludHNVbmlmb3JtLm1hdHJpeHNbdTMyKGpvaW50cy56KV0gKiBpbnZlcnNlQmluZE1hdHJpY2VzVW5pZm9ybS5tYXRyaXhzW3UzMihqb2ludHMueildO1xuICAgICAgICAgICAgbGV0IGpvaW50MyA9IGpvaW50c1VuaWZvcm0ubWF0cml4c1t1MzIoam9pbnRzLncpXSAqIGludmVyc2VCaW5kTWF0cmljZXNVbmlmb3JtLm1hdHJpeHNbdTMyKGpvaW50cy53KV07XG4gICAgICAgIFxuICAgICAgICAgICAgbGV0IHNraW5NYXRyaXggPSBqb2ludDAgKiB3ZWlnaHRzLnggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW50MSAqIHdlaWdodHMueSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbnQyICogd2VpZ2h0cy56ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2ludDMgKiB3ZWlnaHRzLnc7XG4gICAgICAgICAgICByZXR1cm4gc2tpbk1hdHJpeDtcbiAgICAgICAgfVxuICAgICAgICAjZW5kaWZcbiAgIGA7XG5leHBvcnQgY29uc3Qgc2tpblZlcnRNYWluID0gYFxuICAgICAgICAjaWYgSEFTX1NLSU5cbiAgICAgICAgICAgIG1vZGVsTWF0cml4ID1nZXRTa2luTWF0cml4KGlucHV0LmpvaW50MCxpbnB1dC53ZWlnaHQwKTtcbiAgICAgICAgICAgIHZOb3JtYWxWaWV3ID0gbm9ybWFsaXplKChtYXRlcmlhbFVuaWZvcm0ubm9ybWFsTWF0cml4ICogbW9kZWxNYXRyaXggKiB2ZWM0PGYzMj4oaW5wdXQubm9ybWFsLCAwLjApKS54eXopO1xuICAgICAgICAjZW5kaWZcbiAgYDtcbiIsImV4cG9ydCBjb25zdCBQYnJNYXRlcmlhbFN0cnVjdCA9IGBcbiAgICBzdHJ1Y3QgTWF0ZXJpYWxVbmlmb3JtIHtcbiAgICAgICAgICBtb2RlbE1hdHJpeDogbWF0NHg0PGYzMj4sXG4gICAgICAgICAgY29sb3I6IHZlYzM8ZjMyPixcbiAgICAgICAgICBvcGFjaXR5OmYzMixcbiAgICAgICAgICBub3JtYWxNYXRyaXg6IG1hdDR4NDxmMzI+LFxuICAgICAgICAgIGVtaXNzaXZlOnZlYzM8ZjMyPixcbiAgICAgICAgICBtZXRhbGxpYzpmMzIsXG4gICAgICAgICAgcm91Z2huZXNzOmYzMixcbiAgICAgICAgICAjaWYgVVNFX05PUk1BTFRFWFRVUkVcbiAgICAgICAgICAgICAgbm9ybWFsVGV4dHVyZVNjYWxlOnZlYzI8ZjMyPixcbiAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAjaWYgVVNFX0FPVEVYVFVSRVxuICAgICAgICAgICAgICBvY2NsdXNpb25TdHJlbmd0aDpmMzIsXG4gICAgICAgICAgI2VuZGlmXG4gICAgICB9XG4gICBgO1xuIiwiaW1wb3J0IHsgRnJhZ0lucHV0IH0gZnJvbSBcIi4vYXR0cmlidXRlL0ZyYWdJbnB1dFwiO1xyXG5pbXBvcnQgeyBQb2ludEZyYWdJbnB1dCB9IGZyb20gXCIuL2F0dHJpYnV0ZS9Qb2ludEZyYWdJbnB1dFwiO1xyXG5pbXBvcnQgeyBQb2ludFZlcnRJbnB1dCB9IGZyb20gXCIuL2F0dHJpYnV0ZS9Qb2ludFZlcnRJbnB1dFwiO1xyXG5pbXBvcnQgeyBQb2ludFZlcnRPdXRwdXQgfSBmcm9tIFwiLi9hdHRyaWJ1dGUvUG9pbnRWZXJ0T3V0cHV0XCI7XHJcbmltcG9ydCB7IFZlcnRleElucHV0IH0gZnJvbSBcIi4vYXR0cmlidXRlL1ZlcnRleElucHV0XCI7XHJcbmltcG9ydCB7IFZlcnRleE91dHB1dCB9IGZyb20gXCIuL2F0dHJpYnV0ZS9WZXJ0ZXhPdXRwdXRcIjtcclxuaW1wb3J0IHsgU3lzdGVtVW5pZm9ybSB9IGZyb20gXCIuL2NvbW1vbi9TeXN0ZW1Vbmlmb3JtXCI7XHJcbmltcG9ydCB7IFRleHR1cmVBbmRTYW1wbGVyRGVmaW5lIH0gZnJvbSBcIi4vY29tbW9uL1RleHR1cmVBbmRTYW1wbGVyRGVmaW5lXCI7XHJcbmltcG9ydCBlbnZpcm9ubWVudCBmcm9tIFwiLi9lbnZpcm9ubWVudC9lbnZpcm9ubWVudFwiO1xyXG5pbXBvcnQgeyBpbnN0YW5jZVZlcnRIZWFkZXIsIGluc3RhbmNlVmVydE1haW4gfSBmcm9tIFwiLi9pbnN0YW5jZS9JbnN0YW5jZVwiO1xyXG5pbXBvcnQgbGlnaHQgZnJvbSBcIi4vbGlnaHQvbGlnaHRcIjtcclxuaW1wb3J0IGxpZ2h0Q29tbW9uIGZyb20gXCIuL2xpZ2h0L2xpZ2h0Q29tbW9uXCI7XHJcbmltcG9ydCB7IGdldE5vcm1hbEJ5Tm9ybWFsVGV4dHVyZSwgZ2V0VEJOLCBnZXROb3JtYWwgfSBmcm9tIFwiLi9ub3JtYWwvZ2V0Tm9ybWFsQmFja1VwXCI7XHJcbmltcG9ydCBicmRmIGZyb20gXCIuL3Bici9icmRmXCI7XHJcbmltcG9ydCBpYmwgZnJvbSBcIi4vcGJyL2libFwiO1xyXG5pbXBvcnQgcGJyRnVuY3Rpb24gZnJvbSBcIi4vcGJyL3BickZ1bmN0aW9uXCI7XHJcbmltcG9ydCBwYnJTdHJ1Y3QgZnJvbSBcIi4vcGJyL3BiclN0cnVjdFwiO1xyXG5pbXBvcnQgcGJyVGV4dHVyZSBmcm9tIFwiLi9wYnIvcGJyVGV4dHVyZVwiO1xyXG5pbXBvcnQgcGJyVXRpbHMgZnJvbSBcIi4vcGJyL3BiclV0aWxzXCI7XHJcbmltcG9ydCBibGlubl9waG9uZyBmcm9tIFwiLi9waG9uZy9ibGlubl9waG9uZ1wiO1xyXG5pbXBvcnQgcGhvbmdGdW5jdGlvbiBmcm9tIFwiLi9waG9uZy9waG9uZ0Z1bmN0aW9uXCI7XHJcbmltcG9ydCBwaG9uZ1V0aWxzIGZyb20gXCIuL3Bob25nL3Bob25nVXRpbHNcIjtcclxuLy8gaW1wb3J0IGdldE5vcm1hbCBmcm9tIFwiLi9ub3JtYWwvZ2V0Tm9ybWFsXCI7XHJcbmltcG9ydCB7IHNraW5WZXJ0SGVhZGVyLCBza2luVmVydE1haW4gfSBmcm9tIFwiLi9za2luL1NraW5WZXJ0XCI7XHJcbmltcG9ydCB7IFBick1hdGVyaWFsU3RydWN0IH0gZnJvbSBcIi4vc3RydWN0L1Bick1hdGVyaWFsU3RydWN0XCI7XHJcbmNvbnN0IFNoYWRlckNodW5rID0ge1xyXG5cdGxpZ2h0LFxyXG5cdGJyZGYsXHJcblx0cGhvbmdGdW5jdGlvbixcclxuXHRwaG9uZ1V0aWxzLFxyXG5cdGxpZ2h0Q29tbW9uLFxyXG5cdHBiclN0cnVjdCxcclxuXHRwYnJGdW5jdGlvbixcclxuXHRwYnJUZXh0dXJlLFxyXG5cdHBiclV0aWxzLFxyXG5cdGVudmlyb25tZW50LFxyXG5cdGJsaW5uX3Bob25nLFxyXG5cdGdldE5vcm1hbCxcclxuXHRnZXRUQk4sXHJcblx0Z2V0Tm9ybWFsQnlOb3JtYWxUZXh0dXJlLFxyXG5cdGlibCxcclxuXHRza2luVmVydE1haW4sXHJcblx0c2tpblZlcnRIZWFkZXIsXHJcblx0RnJhZ0lucHV0LFxyXG5cdFZlcnRleElucHV0LFxyXG5cdFZlcnRleE91dHB1dCxcclxuXHRQYnJNYXRlcmlhbFN0cnVjdCxcclxuXHRTeXN0ZW1Vbmlmb3JtLFxyXG5cdGluc3RhbmNlVmVydE1haW4sXHJcblx0aW5zdGFuY2VWZXJ0SGVhZGVyLFxyXG5cdFRleHR1cmVBbmRTYW1wbGVyRGVmaW5lLFxyXG5cdFBvaW50VmVydElucHV0LFxyXG5cdFBvaW50VmVydE91dHB1dCxcclxuXHRQb2ludEZyYWdJbnB1dFxyXG59O1xyXG5leHBvcnQgZGVmYXVsdCBTaGFkZXJDaHVuaztcclxuIiwiZXhwb3J0IGRlZmF1bHQgYFxuICAgIEBncm91cCgwKSBAYmluZGluZygxKSB2YXIgc2hhZG93U2FtcGxlcjogc2FtcGxlcjtcbiAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyIHNoYWRvd01hcDogdGV4dHVyZV9kZXB0aF8yZDtcbiAgICBcbiAgICAvLyBAZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyIHNoYWRvd01hcDogdGV4dHVyZV9kZXB0aF8yZF9hcnJheTtcbiAgICAvLyBAZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyIHNoYWRvd01hcDogdGV4dHVyZV8yZDxmMzI+O1xuXG4gICAgc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgICAgICBAbG9jYXRpb24oMCkgdXY6IHZlYzI8ZjMyPixcbiAgICB9O1xuXG4gICAgZm4gbGluZWFyaXplRGVwdGgoZGVwdGg6IGYzMiwgbmVhcjogZjMyLCBmYXI6IGYzMiktPmYzMiB7XG4gICAgICByZXR1cm4gMiAqIChuZWFyICogZmFyKSAvIChmYXIgKyBuZWFyIC0gZGVwdGggKiAoZmFyIC0gbmVhcikpO1xuICAgIH1cblxuICAgIEBmcmFnbWVudFxuICAgIGZuIG1haW4oaW5wdXQ6VmVydGV4T3V0cHV0KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcblx0XHRcdGxldCBjb2xvcjogdmVjNDxmMzI+ID0gdGV4dHVyZUdhdGhlcihzaGFkb3dNYXAsIHNoYWRvd1NhbXBsZXIsIHZlYzI8ZjMyPihpbnB1dC51di54LDEuMC1pbnB1dC51di55KSk7XG4gICAgICBsZXQgZGVwdGggPSAobGluZWFyaXplRGVwdGgoY29sb3IuciwgMC4xLCA1MDApIC0gMC4xKSAvICg1MDAgLSAwLjEpO1xuICAgICAgcmV0dXJuIHZlYzQodmVjMyhkZXB0aCksIDEuMCk7IC8vIFBlcnNwZWN0aXZlQ2FtZXJhXG4gICAgICAvLyByZXR1cm4gY29sb3I7XG5cbiAgICAgIC8vIHJldHVybiB0ZXh0dXJlU2FtcGxlKHNoYWRvd01hcCwgc2hhZG93U2FtcGxlciwgdmVjMjxmMzI+KGlucHV0LnV2LngsMS4wLWlucHV0LnV2LnkpKTtcblxuICAgIH1cbiAgICBgO1xuIiwiZXhwb3J0IGRlZmF1bHQgYFxuICAgIHN0cnVjdCBWZXJ0ZXhJbnB1dCB7XG4gICAgICAgICBAbG9jYXRpb24ocG9zaXRpb25Mb2NhdGlvbikgcG9zaXRpb246IHZlYzI8ZjMyPiwgICAgICAgXG4gICAgfVxuICAgIHN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xuICAgICAgICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgICAgICBAbG9jYXRpb24oMCkgdXY6IHZlYzI8ZjMyPixcbiAgICAgfTtcbiAgICBAdmVydGV4XG4gICAgZm4gbWFpbihpbnB1dDogVmVydGV4SW5wdXQpIC0+IFZlcnRleE91dHB1dCB7XG4gICAgIHZhciBvdXRwdXQ6VmVydGV4T3V0cHV0O1xuICAgICBvdXRwdXQudXYgPSBpbnB1dC5wb3NpdGlvbiAqIDAuNSArIDAuNTtcbiAgICAgb3V0cHV0LnBvc2l0aW9uID0gdmVjNDxmMzI+KGlucHV0LnBvc2l0aW9uLCAwLjAsIDEuMCk7O1xuICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cbiAgICBgO1xuIiwiLy8gaW1wb3J0IENvbG9yIGZyb20gXCIuLi8uLi9tYXRoL0NvbG9yXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGBcbiAgICBzdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICAgICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgICAgIEBsb2NhdGlvbigwKSBjb2xvcjogdmVjNDxmMzI+LFxuICAgIH07XG4gICAgQGZyYWdtZW50XG4gICAgZm4gbWFpbihpbnB1dDpWZXJ0ZXhPdXRwdXQpIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xuICAgICAgcmV0dXJuIGlucHV0LmNvbG9yO1xuICAgIH1cbiAgICBgO1xuIiwiZXhwb3J0IGRlZmF1bHQgYFxuICAgc3RydWN0IFZlcnRleElucHV0IHtcbiAgICAgIEBsb2NhdGlvbihwb3NpdGlvbkxvY2F0aW9uKSBwb3NpdGlvbjogdmVjMzxmMzI+LCAgICAgICBcbiAgIH07XG4gICBzdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbjogdmVjNDxmMzI+LFxuICAgIH07XG4gICBzdHJ1Y3QgU2VsZlVuaWZvcm0ge1xuICAgICAgbW9kZWxNYXRyaXg6IG1hdDR4NDxmMzI+LFxuICAgfTtcbiAgIHN0cnVjdCBTeXN0ZW1Vbmlmb3JtIHtcbiAgICAgIHByb2plY3Rpb25NYXRyaXg6IG1hdDR4NDxmMzI+LFxuICAgICAgdmlld01hdHJpeDogbWF0NHg0PGYzMj4sXG4gICAgICBpbnZlcnNlVmlld01hdHJpeDogbWF0NHg0PGYzMj4sXG4gICAgICBjYW1lcmFQb3NpdGlvbjogdmVjMzxmMzI+LFxuICAgfTtcblxuICAgI2lmIElTX1BPSU5UTElHSFRfU0hBRE9XTUFQXG4gICAgICBzdHJ1Y3QgUG9pbnRMaWdodFVuaWZvcm0ge1xuICAgICAgICAgdnBNYXRyaXg6IG1hdDR4NDxmMzI+LFxuICAgICAgICAgLy8gdnBNYXRyaXhBcnJheTogYXJyYXk8bWF0NHg0PGYzMj4sIDY+LFxuICAgICAgfTtcbiAgICAgIEBncm91cCgxKSBAYmluZGluZyhwb2ludExpZ2h0U2hhZG93Q2FtZXJhQmluZGluZykgdmFyPHN0b3JhZ2UsIHJlYWQ+IHBvaW50TGlnaHRVbmlmb3JtOiBQb2ludExpZ2h0VW5pZm9ybTtcbiAgICNlbmRpZlxuXG4gICBAZ3JvdXAoMCkgQGJpbmRpbmcoc2VsZkJpbmRpbmcpIHZhcjx1bmlmb3JtPiBzZWxmVW5pZm9ybSA6IFNlbGZVbmlmb3JtO1xuICAgQGdyb3VwKDEpIEBiaW5kaW5nKGNhbWVyYUJpbmRpbmcpIHZhcjx1bmlmb3JtPiBzeXN0ZW1Vbmlmb3JtIDogU3lzdGVtVW5pZm9ybTtcblxuICAgQHZlcnRleFxuICAgZm4gbWFpbihpbnB1dDogVmVydGV4SW5wdXQpIC0+IFZlcnRleE91dHB1dCB7XG4gICAgICB2YXIgb3V0cHV0OlZlcnRleE91dHB1dDtcbiAgICAgICNpZiBJU19QT0lOVExJR0hUX1NIQURPV01BUFxuICAgICAgICAgb3V0cHV0LnBvc2l0aW9uID0gcG9pbnRMaWdodFVuaWZvcm0udnBNYXRyaXggKiBzZWxmVW5pZm9ybS5tb2RlbE1hdHJpeCAqIHZlYzQ8ZjMyPihpbnB1dC5wb3NpdGlvbiwxLjApO1xuICAgICAgI2Vsc2VcbiAgICAgICAgIG91dHB1dC5wb3NpdGlvbiA9IHN5c3RlbVVuaWZvcm0ucHJvamVjdGlvbk1hdHJpeCAqIHN5c3RlbVVuaWZvcm0udmlld01hdHJpeCAqIHNlbGZVbmlmb3JtLm1vZGVsTWF0cml4ICogdmVjNDxmMzI+KGlucHV0LnBvc2l0aW9uLDEuMCk7XG4gICAgICAjZW5kaWZcbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICB9XG4gICBgO1xuIiwiaW1wb3J0IHsgU2hhZGVyRGVmaW5lIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVVHlwZXNcIjtcblxuY29uc3QgcHJlcHJvY2Vzc29yU3ltYm9scyA9IC8jKFteXFxzXSopKFxccyopL2dtO1xuY29uc3QgZGVmaW5lUmV4ZyA9IC9cXGJbMC05QS1aXyYmfHxdK1xcYi9nO1xuY29uc3QgaXNOdW1lcmljID0gKG4pID0+ICFpc05hTihuKTtcbmV4cG9ydCBmdW5jdGlvbiBXR1NMUGFyc2VEZWZpbmVzKHNoYWRlcjogc3RyaW5nLCBkZWZpbmVzOiBTaGFkZXJEZWZpbmUpOiBzdHJpbmcge1xuXHRpZiAoIXNoYWRlcikgcmV0dXJuIHVuZGVmaW5lZDtcblx0Ly8gcGFyc2Ugc2hhZGVyIGlubmVyIGNvbnN0IGRlZmluZVxuXHRjb25zdCBub3REZWZpbmVDb25zdFNoYWRlciA9IFBhcnNlRGVmaW5lc0NvbnN0KHNoYWRlciwgZGVmaW5lcyk7XG5cdC8vIGZpbHRlciBcIiYmXCIsXCJ8fFwiLG51bWJlclxuXHRjb25zdCByZXhnRGVmaW5lcyA9IG5vdERlZmluZUNvbnN0U2hhZGVyXG5cdFx0Lm1hdGNoKGRlZmluZVJleGcpXG5cdFx0Py5maWx0ZXIoKGRlZmluZSkgPT4gIVtcIiYmXCIsIFwifHxcIiwgXCJfXCJdLmluY2x1ZGVzKGRlZmluZSkgJiYgIWlzTnVtZXJpYyhkZWZpbmUpICYmIGRlZmluZSAhPSBcIlwiKTtcblx0Ly8gbm9ybWFsbGl6ZSBkZWZpbmVzXG5cdGNvbnN0IG5vcm1hbGl6ZURlZmluZXMgPSBnZXROb3JtYWxpemVEZWZpbmVzKHJleGdEZWZpbmVzLCBkZWZpbmVzKTtcblx0Ly8gc3BsaXQgU2hhZGVyXG5cdGNvbnN0IHNoYWRlclN0cnMgPSBzcGxpdFNoYWRlclN0cnNCeURlZmluZShub3REZWZpbmVDb25zdFNoYWRlciwgcmV4Z0RlZmluZXMpO1xuXHQvLyBwYXJzZSBjb25kaXRpb25hbCBtYWNybyBkZWZpbml0aW9uXG5cdHJldHVybiBzaGFkZXJTdHJzLmxlbmd0aCA+IDAgPyBQYXJzZURlZmluZXMoc2hhZGVyU3Rycywgbm9ybWFsaXplRGVmaW5lcykgOiBub3REZWZpbmVDb25zdFNoYWRlcjtcbn1cbmZ1bmN0aW9uIFBhcnNlRGVmaW5lcyhzdHJpbmdzOiBBcnJheTxzdHJpbmc+LCB2YWx1ZXM6IEFycmF5PGJvb2xlYW4gfCBudW1iZXI+KTogc3RyaW5nIHtcblx0Y29uc3Qgc3RhdGVTdGFjayA9IFtdO1xuXHRsZXQgc3RhdGUgPSB7IGZyYWc6IFwiXCIsIGVsc2VJc1ZhbGlkOiBmYWxzZSwgZXhwcmVzc2lvbjogdHJ1ZSB9O1xuXHRsZXQgZGVwdGggPSAxO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyArK2kpIHtcblx0XHRjb25zdCBmcmFnID0gc3RyaW5nc1tpXTtcblx0XHRjb25zdCBtYXRjaGVkU3ltYm9scyA9IGZyYWcubWF0Y2hBbGwocHJlcHJvY2Vzc29yU3ltYm9scyk7XG5cblx0XHRsZXQgbGFzdEluZGV4ID0gMDtcblx0XHRsZXQgdmFsdWVDb25zdW1lZCA9IGZhbHNlO1xuXHRcdGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlZFN5bWJvbHMpIHtcblx0XHRcdHN0YXRlLmZyYWcgKz0gZnJhZy5zdWJzdHJpbmcobGFzdEluZGV4LCBtYXRjaC5pbmRleCk7XG5cblx0XHRcdHN3aXRjaCAobWF0Y2hbMV0pIHtcblx0XHRcdFx0Y2FzZSBcImlmXCI6XG5cdFx0XHRcdFx0aWYgKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoICE9IGZyYWcubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCIjaWYgbXVzdCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHRlbXBsYXRlIGV4cHJlc3Npb24gKGllOiAke3ZhbHVlfSlcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHZhbHVlQ29uc3VtZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHN0YXRlU3RhY2sucHVzaChzdGF0ZSk7XG5cdFx0XHRcdFx0ZGVwdGgrKztcblx0XHRcdFx0XHRzdGF0ZSA9IHsgZnJhZzogXCJcIiwgZWxzZUlzVmFsaWQ6IHRydWUsIGV4cHJlc3Npb246ICEhdmFsdWVzW2ldIH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJlbGlmXCI6XG5cdFx0XHRcdFx0aWYgKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoICE9IGZyYWcubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCIjZWxpZiBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgdGVtcGxhdGUgZXhwcmVzc2lvbiAoaWU6ICR7dmFsdWV9KVwiKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCFzdGF0ZS5lbHNlSXNWYWxpZCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiI2VsaWYgbm90IHByZWNlZWRlZCBieSBhbiAjaWYgb3IgI2VsaWZcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHZhbHVlQ29uc3VtZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGlmIChzdGF0ZS5leHByZXNzaW9uICYmIHN0YXRlU3RhY2subGVuZ3RoICE9IGRlcHRoKSB7XG5cdFx0XHRcdFx0XHRzdGF0ZVN0YWNrLnB1c2goc3RhdGUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzdGF0ZSA9IHsgZnJhZzogXCJcIiwgZWxzZUlzVmFsaWQ6IHRydWUsIGV4cHJlc3Npb246ICEhdmFsdWVzW2ldIH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJlbHNlXCI6XG5cdFx0XHRcdFx0aWYgKCFzdGF0ZS5lbHNlSXNWYWxpZCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiI2Vsc2Ugbm90IHByZWNlZWRlZCBieSBhbiAjaWYgb3IgI2VsaWZcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChzdGF0ZS5leHByZXNzaW9uICYmIHN0YXRlU3RhY2subGVuZ3RoICE9IGRlcHRoKSB7XG5cdFx0XHRcdFx0XHRzdGF0ZVN0YWNrLnB1c2goc3RhdGUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzdGF0ZSA9IHsgZnJhZzogbWF0Y2hbMl0sIGVsc2VJc1ZhbGlkOiBmYWxzZSwgZXhwcmVzc2lvbjogdHJ1ZSB9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiZW5kaWZcIjpcblx0XHRcdFx0XHRpZiAoIXN0YXRlU3RhY2subGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCIjZW5kaWYgbm90IHByZWNlZWRlZCBieSBhbiAjaWZcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jYXNlLWRlY2xhcmF0aW9uc1xuXHRcdFx0XHRcdGNvbnN0IGJyYW5jaFN0YXRlID0gc3RhdGVTdGFjay5sZW5ndGggPT0gZGVwdGggPyBzdGF0ZVN0YWNrLnBvcCgpIDogc3RhdGU7XG5cdFx0XHRcdFx0c3RhdGUgPSBzdGF0ZVN0YWNrLnBvcCgpO1xuXHRcdFx0XHRcdGRlcHRoLS07XG5cdFx0XHRcdFx0aWYgKGJyYW5jaFN0YXRlLmV4cHJlc3Npb24pIHtcblx0XHRcdFx0XHRcdHN0YXRlLmZyYWcgKz0gYnJhbmNoU3RhdGUuZnJhZztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c3RhdGUuZnJhZyArPSBtYXRjaFsyXTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHQvLyBVbmtub3duIHByZXByb2Nlc3NvciBzeW1ib2wuIEVtaXQgaXQgYmFjayBpbnRvIHRoZSBvdXRwdXQgZnJhZyB1bmNoYW5nZWQuXG5cdFx0XHRcdFx0c3RhdGUuZnJhZyArPSBtYXRjaFswXTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0bGFzdEluZGV4ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIGZyYWcgZGlkbid0IGVuZCBvbiBvbmUgb2YgdGhlIHByZXByb2Nlc3NvciBzeW1ib2xzIGFwcGVuZCB0aGUgcmVzdCBvZiBpdCBoZXJlLlxuXHRcdGlmIChsYXN0SW5kZXggIT0gZnJhZy5sZW5ndGgpIHtcblx0XHRcdHN0YXRlLmZyYWcgKz0gZnJhZy5zdWJzdHJpbmcobGFzdEluZGV4LCBmcmFnLmxlbmd0aCk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIG5leHQgdmFsdWUgd2Fzbid0IGNvbnN1bWVkIGJ5IHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9sLCBhcHBlbmQgaXQgaGVyZS5cblx0XHRpZiAoIXZhbHVlQ29uc3VtZWQgJiYgdmFsdWVzLmxlbmd0aCA+IGkpIHtcblx0XHRcdHN0YXRlLmZyYWcgKz0gdmFsdWVzW2ldO1xuXHRcdH1cblx0fVxuXHRpZiAoc3RhdGVTdGFjay5sZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJNaXNtYXRjaGVkICNpZi8jZW5kaWYgY291bnRcIik7XG5cdH1cblx0cmV0dXJuIHN0YXRlLmZyYWc7XG59XG5mdW5jdGlvbiBQYXJzZURlZmluZXNDb25zdChzb3VyY2VTaGFkZXI6IHN0cmluZywgZGVmaW5lcykge1xuXHRpZiAoIWRlZmluZXMpIHJldHVybiBzb3VyY2VTaGFkZXI7XG5cdGxldCByZXN1bHQgPSBzb3VyY2VTaGFkZXI7XG5cdGNvbnN0IGNvbnN0RGVmaW5lS2V5cyA9IE9iamVjdC5rZXlzKGRlZmluZXMpPy5maWx0ZXI/Ligoa2V5KSA9PiBrZXkgIT0ga2V5LnRvVXBwZXJDYXNlKCkpO1xuXHRjb25zdERlZmluZUtleXM/LmZvckVhY2g/Ligoa2V5OiBzdHJpbmcpID0+IHtcblx0XHRyZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbChrZXksIGRlZmluZXNba2V5XSk7XG5cdH0pO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gZ2V0Tm9ybWFsaXplRGVmaW5lcyhyZXhnRGVmaW5lczogQXJyYXk8c3RyaW5nPiwgZGVmaW5lczogU2hhZGVyRGVmaW5lKSB7XG5cdHJldHVybiByZXhnRGVmaW5lcz8ubWFwPy4oKGRlZmluZSkgPT4ge1xuXHRcdGlmIChkZWZpbmU/LmluY2x1ZGVzKFwiJiZcIikgfHwgZGVmaW5lPy5pbmNsdWRlcyhcInx8XCIpKSB7XG5cdFx0XHRpZiAoZGVmaW5lLmluY2x1ZGVzKFwiJiZcIikpIHtcblx0XHRcdFx0Y29uc3Qgc3BsaXREZWZpbmVzID0gZGVmaW5lLnNwbGl0KFwiJiZcIik7XG5cdFx0XHRcdHJldHVybiBnZXRBbmREZWZpbmVWYWx1ZShzcGxpdERlZmluZXMsIGRlZmluZXMpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgc3BsaXREZWZpbmVzID0gZGVmaW5lLnNwbGl0KFwifHxcIik7XG5cdFx0XHRyZXR1cm4gIWdldE9yRGVmaW5lVmFsdWUoc3BsaXREZWZpbmVzLCBkZWZpbmVzKTtcblx0XHR9XG5cdFx0cmV0dXJuIGRlZmluZXNbZGVmaW5lXTtcblx0fSk7XG59XG5mdW5jdGlvbiBnZXRBbmREZWZpbmVWYWx1ZShzcGxpdERlZmluZXM6IEFycmF5PHN0cmluZz4sIGRlZmluZXM6IFNoYWRlckRlZmluZSk6IGJvb2xlYW4ge1xuXHRsZXQgdG90YWwgPSAwO1xuXHRzcGxpdERlZmluZXM/LmZvckVhY2g/LigoZGVmaW5lS2V5KSA9PiAodG90YWwgKz0gTnVtYmVyKGRlZmluZXNbZGVmaW5lS2V5XSkgPiAxID8gMSA6IE51bWJlcihkZWZpbmVzW2RlZmluZUtleV0pKSk7XG5cdHJldHVybiB0b3RhbCA9PT0gc3BsaXREZWZpbmVzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIGdldE9yRGVmaW5lVmFsdWUoc3BsaXREZWZpbmVzOiBBcnJheTxzdHJpbmc+LCBkZWZpbmVzOiBTaGFkZXJEZWZpbmUpOiBib29sZWFuIHtcblx0bGV0IHRvdGFsID0gMDtcblx0c3BsaXREZWZpbmVzPy5mb3JFYWNoPy4oKGRlZmluZUtleSkgPT4gKHRvdGFsICs9IE51bWJlcihkZWZpbmVzW2RlZmluZUtleV0pID4gMSA/IDEgOiBOdW1iZXIoZGVmaW5lc1tkZWZpbmVLZXldKSkpO1xuXHRyZXR1cm4gdG90YWwgPT09IDA7XG59XG5mdW5jdGlvbiBzcGxpdFNoYWRlclN0cnNCeURlZmluZShzaGFkZXI6IHN0cmluZywgZGVmaW5lczogQXJyYXk8c3RyaW5nPik6IEFycmF5PHN0cmluZz4ge1xuXHRsZXQgY3VycmVudFNoYWRlclN0ciA9IHNoYWRlcjtcblx0Y29uc3Qgc2hhZGVyU3RycyA9XG5cdFx0ZGVmaW5lcz8ubWFwKChkZWZpbmUpID0+IHtcblx0XHRcdGNvbnN0IGxlbmd0aCA9IGN1cnJlbnRTaGFkZXJTdHIuaW5kZXhPZihkZWZpbmUpO1xuXHRcdFx0Y29uc3Qgc2xpY2VTdHIgPSBjdXJyZW50U2hhZGVyU3RyLnNsaWNlKDAsIGxlbmd0aCk7XG5cdFx0XHRjdXJyZW50U2hhZGVyU3RyID0gY3VycmVudFNoYWRlclN0ci5zbGljZShsZW5ndGggKyAxICsgZGVmaW5lLmxlbmd0aCk7XG5cdFx0XHRyZXR1cm4gc2xpY2VTdHI7XG5cdFx0fSkgfHwgW107XG5cdGlmIChzaGFkZXJTdHJzPy5sZW5ndGgpIHNoYWRlclN0cnMucHVzaChjdXJyZW50U2hhZGVyU3RyKTtcblx0cmV0dXJuIHNoYWRlclN0cnM7XG59XG4iLCJpbXBvcnQgY29sb3JGcmFnIGZyb20gXCIuL21hdGVyaWFsL2NvbG9yRnJhZ1wiO1xuaW1wb3J0IGNvbG9yVmVydCBmcm9tIFwiLi9tYXRlcmlhbC9jb2xvclZlcnRcIjtcbmltcG9ydCBwYnJfZnMgZnJvbSBcIi4vbWF0ZXJpYWwvcGJyX2ZzXCI7XG5pbXBvcnQgcGJyX3ZzIGZyb20gXCIuL21hdGVyaWFsL3Bicl92c1wiO1xuaW1wb3J0IHBickZyYWcgZnJvbSBcIi4vbWF0ZXJpYWwvcGJyRnJhZ1wiO1xuaW1wb3J0IHBiclZlcnQgZnJvbSBcIi4vbWF0ZXJpYWwvcGJyVmVydFwiO1xuaW1wb3J0IHBob25nRnJhZyBmcm9tIFwiLi9tYXRlcmlhbC9waG9uZ0ZyYWdcIjtcbmltcG9ydCBwaG9uZ1ZlcnQgZnJvbSBcIi4vbWF0ZXJpYWwvcGhvbmdWZXJ0XCI7XG5pbXBvcnQgeyBwb2ludF9mcyB9IGZyb20gXCIuL21hdGVyaWFsL3BvaW50X2ZzXCI7XG5pbXBvcnQgeyBwb2ludF92cyB9IGZyb20gXCIuL21hdGVyaWFsL3BvaW50X3ZzXCI7XG5pbXBvcnQgcXVhZEZyYWcgZnJvbSBcIi4vbWF0ZXJpYWwvcXVhZEZyYWdcIjtcbmltcG9ydCBxdWFkVmVydCBmcm9tIFwiLi9tYXRlcmlhbC9xdWFkVmVydFwiO1xuaW1wb3J0IHNreUJveEZyYWcgZnJvbSBcIi4vbWF0ZXJpYWwvc2t5Qm94RnJhZ1wiO1xuaW1wb3J0IHNreUJveFZlcnQgZnJvbSBcIi4vbWF0ZXJpYWwvc2t5Qm94VmVydFwiO1xuaW1wb3J0IHsgc3ByaXRlX2ZzIH0gZnJvbSBcIi4vbWF0ZXJpYWwvc3ByaXRlX2ZzXCI7XG5pbXBvcnQgeyBzcHJpdGVfdnMgfSBmcm9tIFwiLi9tYXRlcmlhbC9zcHJpdGVfdnNcIjtcbmltcG9ydCBibGVuZEZyYWcgZnJvbSBcIi4vcG9zdFByb2Nlc3MvYmxlbmQvYmxlbmRGcmFnXCI7XG5pbXBvcnQgQmx1ciBmcm9tIFwiLi9wb3N0UHJvY2Vzcy9ibG9vbS9CbHVyXCI7XG5pbXBvcnQgTHVtaW5vc2l0eUhpZ2ggZnJvbSBcIi4vcG9zdFByb2Nlc3MvYmxvb20vTHVtaW5vc2l0eUhpZ2hcIjtcbmltcG9ydCBTaGFkZXJDaHVuayBmcm9tIFwiLi9zaGFkZXJDaHVuay9TaGFkZXJDaHVua1wiO1xuaW1wb3J0IHNoYWRvd01hcERlYnVnZ2VyRnJhZyBmcm9tIFwiLi9zaGFkZXJDaHVuay9zaGFkb3cvc2hhZG93TWFwRGVidWdnZXJGcmFnXCI7XG5pbXBvcnQgc2hhZG93TWFwRGVidWdnZXJWZXJ0IGZyb20gXCIuL3NoYWRlckNodW5rL3NoYWRvdy9zaGFkb3dNYXBEZWJ1Z2dlclZlcnRcIjtcbmltcG9ydCBzaGFkb3dNYXBGcmFnIGZyb20gXCIuL3NoYWRlckNodW5rL3NoYWRvdy9zaGFkb3dNYXBGcmFnXCI7XG5pbXBvcnQgc2hhZG93TWFwVmVydCBmcm9tIFwiLi9zaGFkZXJDaHVuay9zaGFkb3cvc2hhZG93TWFwVmVydFwiO1xuaW1wb3J0IHsgV0dTTFBhcnNlRGVmaW5lcyB9IGZyb20gXCIuL1dHU0xQYXJzZURlZmluZXNcIjtcblxuZnVuY3Rpb24gcmVkdWNlQ29tbWEoc2hhZGVyKSB7XG5cdC8vIOWvueaJgOacieeahGluY2x1ZGXlpITnkIZcblx0cmV0dXJuIHNoYWRlciAhPSB1bmRlZmluZWQgPyByZXNvbHZlSW5jbHVkZXMoc2hhZGVyKSA6IHVuZGVmaW5lZDtcbn1cbmNvbnN0IGluY2x1ZGVQYXR0ZXJuID0gL15bIFxcdF0qI2luY2x1ZGUgKzwoW1xcd1xcZC4vXSspPi9nbTtcbmxldCBjdXJyZW50RGVmaW5lcyA9IHt9O1xuY29uc3Qgc2hhZGVycyA9IHtcblx0cGhvbmc6IHtcblx0XHRmcmFnOiBwaG9uZ0ZyYWcsXG5cdFx0dmVydDogcGhvbmdWZXJ0XG5cdH0sXG5cdGNvbG9yOiB7XG5cdFx0ZnJhZzogY29sb3JGcmFnLFxuXHRcdHZlcnQ6IGNvbG9yVmVydFxuXHR9LFxuXHRwYnI6IHtcblx0XHRmcmFnOiBwYnJGcmFnLFxuXHRcdHZlcnQ6IHBiclZlcnRcblx0fSxcblx0c2t5Ym94OiB7XG5cdFx0ZnJhZzogc2t5Qm94RnJhZyxcblx0XHR2ZXJ0OiBza3lCb3hWZXJ0XG5cdH0sXG5cdHJlc29sdmU6IHtcblx0XHRmcmFnOiBxdWFkRnJhZyxcblx0XHR2ZXJ0OiBxdWFkVmVydFxuXHR9LFxuXHRwYnJfbWF0OiB7XG5cdFx0ZnJhZzogcGJyX2ZzLFxuXHRcdHZlcnQ6IHBicl92c1xuXHR9LFxuXHRibHVyOiB7XG5cdFx0ZnJhZzogQmx1cixcblx0XHR2ZXJ0OiBxdWFkVmVydFxuXHR9LFxuXHRsdW1pbm9zaXR5SGlnaDoge1xuXHRcdGZyYWc6IEx1bWlub3NpdHlIaWdoLFxuXHRcdHZlcnQ6IHF1YWRWZXJ0XG5cdH0sXG5cdGJsZW5kOiB7XG5cdFx0ZnJhZzogYmxlbmRGcmFnLFxuXHRcdHZlcnQ6IHF1YWRWZXJ0XG5cdH0sXG5cdHNoYWRvd01hcERlYnVnZ2VyOiB7XG5cdFx0ZnJhZzogc2hhZG93TWFwRGVidWdnZXJGcmFnLFxuXHRcdHZlcnQ6IHNoYWRvd01hcERlYnVnZ2VyVmVydFxuXHR9LFxuXHRzaGFkb3dNYXA6IHtcblx0XHR2ZXJ0OiBzaGFkb3dNYXBWZXJ0LFxuXHRcdGZyYWc6IHNoYWRvd01hcEZyYWdcblx0fSxcblx0c3ByaXRlOiB7XG5cdFx0dmVydDogc3ByaXRlX3ZzLFxuXHRcdGZyYWc6IHNwcml0ZV9mc1xuXHR9LFxuXHRwb2ludDoge1xuXHRcdHZlcnQ6IHBvaW50X3ZzLFxuXHRcdGZyYWc6IHBvaW50X2ZzXG5cdH1cbn07XG5cbmZ1bmN0aW9uIHJlc29sdmVJbmNsdWRlcyhzdHJpbmcpIHtcblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKGluY2x1ZGVQYXR0ZXJuLCBpbmNsdWRlUmVwbGFjZXIpO1xufVxuXG5mdW5jdGlvbiBpbmNsdWRlUmVwbGFjZXIobWF0Y2gsIGluY2x1ZGUpIHtcblx0Y29uc3QgcGFydFNoYWRlciA9IFNoYWRlckNodW5rW2luY2x1ZGVdO1xuXHRpZiAocGFydFNoYWRlciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBDYW4gbm90IHJlc29sdmUgI2luY2x1ZGUgPCR7aW5jbHVkZX0+YCk7XG5cdH1cblx0Y29uc3QgcmVzdWx0ID0gV0dTTFBhcnNlRGVmaW5lcyhwYXJ0U2hhZGVyLCBjdXJyZW50RGVmaW5lcyk7XG5cdHJldHVybiByZXNvbHZlSW5jbHVkZXMocmVzdWx0KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZlcnRGcmFnKHR5cGUsIGRlZmluZXMgPSB7fSkge1xuXHRjb25zdCBzaGFkZXIgPSBzaGFkZXJzW3R5cGVdO1xuXHRjdXJyZW50RGVmaW5lcyA9IGRlZmluZXM7XG5cdHJldHVybiB7XG5cdFx0dmVydDogc2hhZGVyPy52ZXJ0ID8gcmVkdWNlQ29tbWEoV0dTTFBhcnNlRGVmaW5lcyhzaGFkZXIudmVydCwgY3VycmVudERlZmluZXMpKSA6IHVuZGVmaW5lZCxcblx0XHRmcmFnOiBzaGFkZXI/LmZyYWcgPyByZWR1Y2VDb21tYShXR1NMUGFyc2VEZWZpbmVzKHNoYWRlci5mcmFnLCBjdXJyZW50RGVmaW5lcykpIDogdW5kZWZpbmVkXG5cdH07XG59XG4iLCJpbXBvcnQge1xuXHRTaGFkZXJEZWZpbmUsXG5cdFNoYWRlclN0cmluZyxcblx0Y29tcHV0ZVBhcmFtcyxcblx0cmVuZGVyUGFyYW1zLFxuXHRTaGFkZXJNb2R1bGUsXG5cdFNoYWRlclNvdXJjZVBhcmFtcyxcblx0U2hhZGVyRnVuYyxcblx0U2hhZGVyTGFuZ3VhZ2UsXG5cdFNoYWRlck1haW5TdGFnZVxufSBmcm9tIFwiLi4vY29yZS9XZWJHUFVUeXBlc1wiO1xuaW1wb3J0IGdldFZlcnRGcmFnIGZyb20gXCIuL1NoYWRlcnNcIjtcbmltcG9ydCB7IFdHU0xQYXJzZURlZmluZXMgfSBmcm9tIFwiLi9XR1NMUGFyc2VEZWZpbmVzXCI7XG5leHBvcnQgY2xhc3MgU2hhZGVyU291cmNlIHtcblx0cHVibGljIGNvbXB1dGU6IGNvbXB1dGVQYXJhbXM7XG5cdHB1YmxpYyBzdGF0aWMgZ2xzbGFuZztcblx0cHVibGljIHJlbmRlcjogcmVuZGVyUGFyYW1zO1xuXHRwdWJsaWMgc2hhZGVySWQ6IHN0cmluZztcblx0cHVibGljIGRpcnR5OiBib29sZWFuO1xuXHRwdWJsaWMgZGVmaW5lcz86IFNoYWRlckRlZmluZTtcblx0cHJpdmF0ZSBfdWlkOiBzdHJpbmc7XG5cdHByaXZhdGUgX3NoYWRlck1vZHVsZTogU2hhZGVyTW9kdWxlO1xuXHRwcml2YXRlIF9zaGFkZXJMYW5ndWFnZTogU2hhZGVyTGFuZ3VhZ2U7XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNoYWRlclNvdXJjZVBhcmFtcykge1xuXHRcdHRoaXMuc2hhZGVySWQgPSBvcHRpb25zLnNoYWRlcklkO1xuXHRcdHRoaXMuZGVmaW5lcyA9IG9wdGlvbnMuZGVmaW5lcyB8fCB7fTtcblx0XHR0aGlzLnJlbmRlciA9IG9wdGlvbnMucmVuZGVyO1xuXHRcdHRoaXMuY29tcHV0ZSA9IG9wdGlvbnMuY29tcHV0ZTtcblx0XHR0aGlzLl9zaGFkZXJMYW5ndWFnZSA9IG9wdGlvbnMubGFuZ3VhZ2U7XG5cdFx0dGhpcy5kaXJ0eSA9IHRydWU7XG5cdH1cblx0Z2V0IHVpZCgpIHtcblx0XHR0aGlzLl91aWQgPSB0aGlzLnNoYWRlcklkLmNvbmNhdChKU09OLnN0cmluZ2lmeSh0aGlzLmRlZmluZXMpKTtcblx0XHRyZXR1cm4gdGhpcy5fdWlkO1xuXHR9XG5cdHB1YmxpYyBzZXREZWZpbmVzKGRlZmluZXMpIHtcblx0XHRpZiAoIWRlZmluZXMpIHJldHVybjtcblx0XHR0aGlzLmRpcnR5ID0gdHJ1ZTtcblx0XHR0aGlzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHRoaXMuZGVmaW5lcywgZGVmaW5lcyk7XG5cdH1cblx0cHVibGljIGdldFNoYWRlck1vZHVsZShkZXZpY2U6IEdQVURldmljZSk6IFNoYWRlck1vZHVsZSB7XG5cdFx0aWYgKHRoaXMuZGlydHkpIHtcblx0XHRcdGNvbnN0IHsgdmVydCwgZnJhZywgY29tcHV0ZSB9ID0gdGhpcy5nZXRTaGFkZXJTdHIoKSB8fCB7fTtcblx0XHRcdGNvbnN0IGlzR0xTTCA9IHRoaXMuX3NoYWRlckxhbmd1YWdlID09IFNoYWRlckxhbmd1YWdlLkdMU0w7XG5cdFx0XHRjb25zdCB2ZXJ0R1BVTW9kdWxlID0gdmVydFxuXHRcdFx0XHQ/IGRldmljZS5jcmVhdGVTaGFkZXJNb2R1bGUoe1xuXHRcdFx0XHRcdFx0Y29kZTogaXNHTFNMID8gU2hhZGVyU291cmNlPy5nbHNsYW5nLmNvbXBpbGVHTFNMKHZlcnQsIFNoYWRlck1haW5TdGFnZS5WRVJUKSA6IHZlcnRcblx0XHRcdFx0ICB9KVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGZyYWdHUFVNb2R1bGUgPSBmcmFnXG5cdFx0XHRcdD8gZGV2aWNlLmNyZWF0ZVNoYWRlck1vZHVsZSh7XG5cdFx0XHRcdFx0XHRjb2RlOiBpc0dMU0wgPyBTaGFkZXJTb3VyY2U/Lmdsc2xhbmcuY29tcGlsZUdMU0woZnJhZywgU2hhZGVyTWFpblN0YWdlLkZSQUcpIDogZnJhZ1xuXHRcdFx0XHQgIH0pXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgY29tcHV0ZUdQVU1vZHVsZSA9IGNvbXB1dGVcblx0XHRcdFx0PyBkZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKHtcblx0XHRcdFx0XHRcdGNvZGU6IGlzR0xTTCA/IFNoYWRlclNvdXJjZT8uZ2xzbGFuZy5jb21waWxlR0xTTChjb21wdXRlLCBTaGFkZXJNYWluU3RhZ2UuQ09NUFVURSkgOiBjb21wdXRlXG5cdFx0XHRcdCAgfSlcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHR0aGlzLl9zaGFkZXJNb2R1bGUgPSB7XG5cdFx0XHRcdHZlcnQ6IHZlcnRHUFVNb2R1bGUsXG5cdFx0XHRcdGZyYWc6IGZyYWdHUFVNb2R1bGUsXG5cdFx0XHRcdGNvbXB1dGU6IGNvbXB1dGVHUFVNb2R1bGVcblx0XHRcdH07XG5cdFx0XHR0aGlzLmRpcnR5ID0gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9zaGFkZXJNb2R1bGU7XG5cdH1cblx0cHVibGljIGRlc3Ryb3koKSB7XG5cdFx0dGhpcy5yZW5kZXIgPSBudWxsO1xuXHRcdHRoaXMuY29tcHV0ZSA9IG51bGw7XG5cdFx0dGhpcy5fc2hhZGVyTW9kdWxlID0gbnVsbDtcblx0XHR0aGlzLmRlZmluZXMgPSBudWxsO1xuXHR9XG5cdHByaXZhdGUgZ2V0U2hhZGVyU3RyKCk6IFNoYWRlclN0cmluZyB7XG5cdFx0Y29uc3QgeyBmcmFnU2hhZGVyLCB2ZXJ0U2hhZGVyIH0gPSB0aGlzLnJlbmRlciB8fCB7fTtcblx0XHRjb25zdCB7IGNvbXB1dGVTaGFkZXIgfSA9IHRoaXMuY29tcHV0ZSB8fCB7fTtcblx0XHRjb25zdCBzb3VyY2UgPSBnZXRWZXJ0RnJhZyh0aGlzLnNoYWRlcklkLCB0aGlzLmRlZmluZXMpO1xuXHRcdGNvbnN0IHZlcnQgPVxuXHRcdFx0c291cmNlPy52ZXJ0ID8/XG5cdFx0XHRXR1NMUGFyc2VEZWZpbmVzKHZlcnRTaGFkZXIgaW5zdGFuY2VvZiBGdW5jdGlvbiA/ICg8U2hhZGVyRnVuYz52ZXJ0U2hhZGVyKSgpIDogdmVydFNoYWRlciwgdGhpcy5kZWZpbmVzKTtcblx0XHRjb25zdCBmcmFnID1cblx0XHRcdHNvdXJjZT8uZnJhZyA/P1xuXHRcdFx0V0dTTFBhcnNlRGVmaW5lcyhmcmFnU2hhZGVyIGluc3RhbmNlb2YgRnVuY3Rpb24gPyAoPFNoYWRlckZ1bmM+ZnJhZ1NoYWRlcikoKSA6IGZyYWdTaGFkZXIsIHRoaXMuZGVmaW5lcyk7XG5cdFx0Y29uc3QgY29tcHV0ZSA9IFdHU0xQYXJzZURlZmluZXMoXG5cdFx0XHRjb21wdXRlU2hhZGVyIGluc3RhbmNlb2YgRnVuY3Rpb24gPyAoY29tcHV0ZVNoYWRlciBhcyBTaGFkZXJGdW5jKSgpIDogY29tcHV0ZVNoYWRlcixcblx0XHRcdHRoaXMuZGVmaW5lc1xuXHRcdCk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHZlcnQsXG5cdFx0XHRmcmFnLFxuXHRcdFx0Y29tcHV0ZVxuXHRcdH07XG5cdH1cblx0c3RhdGljIHJlcGxhY2VNYWluKHNvdXJjZTogc3RyaW5nLCByZW5hbWVkTWFpbjogc3RyaW5nKSB7XG5cdFx0cmVuYW1lZE1haW4gPSBgdm9pZCAke3JlbmFtZWRNYWlufSgpYDtcblx0XHRyZXR1cm4gc291cmNlLnJlcGxhY2UoL3ZvaWRcXHMrbWFpblxccypcXChcXHMqKD86dm9pZCk/XFxzKlxcKS9nLCByZW5hbWVkTWFpbik7XG5cdH1cbn1cbiIsImV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkR2xzbGFuZ01vZHVsZSgpOiBQcm9taXNlPGFueT4ge1xyXG5cdC8vIEB0cy1pZ25vcmVcclxuXHRjb25zdCBnbHNsYW5nTW9kdWxlID0gYXdhaXQgaW1wb3J0KFwiaHR0cHM6Ly91bnBrZy5jb20vQHdlYmdwdS9nbHNsYW5nQDAuMC4xNS9kaXN0L3dlYi1kZXZlbC9nbHNsYW5nLmpzXCIpO1xyXG5cdGNvbnN0IGdsc2xhbmcgPSBhd2FpdCBnbHNsYW5nTW9kdWxlLmRlZmF1bHQoKTtcclxuXHRyZXR1cm4gZ2xzbGFuZztcclxufVxyXG4iLCJpbXBvcnQgVGV4dHVyZSBmcm9tIFwiLi4vcmVuZGVyL1RleHR1cmVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNaXBtYXBHZW5lcmF0b3Ige1xyXG5cdGRldmljZTogR1BVRGV2aWNlO1xyXG5cdHNhbXBsZXI6IEdQVVNhbXBsZXI7XHJcblx0cGlwZWxpbmVzOiBvYmplY3Q7XHJcblx0bWlwbWFwU2hhZGVyTW9kdWxlOiBHUFVTaGFkZXJNb2R1bGU7XHJcblx0Y29uc3RydWN0b3IoZGV2aWNlKSB7XHJcblx0XHR0aGlzLmRldmljZSA9IGRldmljZTtcclxuXHRcdHRoaXMuc2FtcGxlciA9IGRldmljZS5jcmVhdGVTYW1wbGVyKHsgbWluRmlsdGVyOiBcImxpbmVhclwiIH0pO1xyXG5cdFx0Ly8gV2UnbGwgbmVlZCBhIG5ldyBwaXBlbGluZSBmb3IgZXZlcnkgdGV4dHVyZSBmb3JtYXQgdXNlZC5cclxuXHRcdHRoaXMucGlwZWxpbmVzID0ge307XHJcblx0fVxyXG5cdHByaXZhdGUgZ2V0TWlwbWFwUGlwZWxpbmUoZm9ybWF0KSB7XHJcblx0XHRsZXQgcGlwZWxpbmUgPSB0aGlzLnBpcGVsaW5lc1tmb3JtYXRdO1xyXG5cdFx0aWYgKCFwaXBlbGluZSkge1xyXG5cdFx0XHQvLyBTaGFkZXIgbW9kdWxlcyBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgcGlwZWxpbmVzLCBzbyBvbmx5IGNyZWF0ZSBvbmNlLlxyXG5cdFx0XHRpZiAoIXRoaXMubWlwbWFwU2hhZGVyTW9kdWxlKSB7XHJcblx0XHRcdFx0dGhpcy5taXBtYXBTaGFkZXJNb2R1bGUgPSB0aGlzLmRldmljZS5jcmVhdGVTaGFkZXJNb2R1bGUoe1xyXG5cdFx0XHRcdFx0Y29kZTogYFxyXG4gICAgICAgICAgICAgIHZhcjxwcml2YXRlPiBwb3MgOiBhcnJheTx2ZWMyPGYzMj4sIDM+ID0gYXJyYXk8dmVjMjxmMzI+LCAzPihcclxuICAgICAgICAgICAgICAgIHZlYzI8ZjMyPigtMS4wLCAtMS4wKSwgdmVjMjxmMzI+KC0xLjAsIDMuMCksIHZlYzI8ZjMyPigzLjAsIC0xLjApKTtcclxuICAgICAgICAgICAgICBzdHJ1Y3QgVmVydGV4T3V0cHV0IHtcclxuICAgICAgICAgICAgICAgIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbiA6IHZlYzQ8ZjMyPixcclxuICAgICAgICAgICAgICAgIEBsb2NhdGlvbigwKSB0ZXhDb29yZCA6IHZlYzI8ZjMyPixcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIEB2ZXJ0ZXhcclxuICAgICAgICAgICAgICBmbiB2ZXJ0ZXhNYWluKEBidWlsdGluKHZlcnRleF9pbmRleCkgdmVydGV4SW5kZXggOiB1MzIpIC0+IFZlcnRleE91dHB1dCB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb3V0cHV0IDogVmVydGV4T3V0cHV0O1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0LnRleENvb3JkID0gcG9zW3ZlcnRleEluZGV4XSAqIHZlYzI8ZjMyPigwLjUsIC0wLjUpICsgdmVjMjxmMzI+KDAuNSk7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXQucG9zaXRpb24gPSB2ZWM0PGYzMj4ocG9zW3ZlcnRleEluZGV4XSwgMC4wLCAxLjApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhciBpbWdTYW1wbGVyIDogc2FtcGxlcjtcclxuICAgICAgICAgICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyIGltZyA6IHRleHR1cmVfMmQ8ZjMyPjtcclxuICAgICAgICAgICAgICBAZnJhZ21lbnRcclxuICAgICAgICAgICAgICBmbiBmcmFnbWVudE1haW4oQGxvY2F0aW9uKDApIHRleENvb3JkIDogdmVjMjxmMzI+KSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlU2FtcGxlKGltZywgaW1nU2FtcGxlciwgdGV4Q29vcmQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHBpcGVsaW5lID0gdGhpcy5kZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmUoe1xyXG5cdFx0XHRcdGxheW91dDogXCJhdXRvXCIsXHJcblx0XHRcdFx0dmVydGV4OiB7XHJcblx0XHRcdFx0XHRtb2R1bGU6IHRoaXMubWlwbWFwU2hhZGVyTW9kdWxlLFxyXG5cdFx0XHRcdFx0ZW50cnlQb2ludDogXCJ2ZXJ0ZXhNYWluXCJcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGZyYWdtZW50OiB7XHJcblx0XHRcdFx0XHRtb2R1bGU6IHRoaXMubWlwbWFwU2hhZGVyTW9kdWxlLFxyXG5cdFx0XHRcdFx0ZW50cnlQb2ludDogXCJmcmFnbWVudE1haW5cIixcclxuXHRcdFx0XHRcdHRhcmdldHM6IFt7IGZvcm1hdCB9XVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHRcdHRoaXMucGlwZWxpbmVzW2Zvcm1hdF0gPSBwaXBlbGluZTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBwaXBlbGluZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBtaXBtYXBzIGZvciB0aGUgZ2l2ZW4gR1BVVGV4dHVyZSBmcm9tIHRoZSBkYXRhIGluIGxldmVsIDAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge21vZHVsZTpFeHRlcm5hbC5HUFVUZXh0dXJlfSB0ZXh0dXJlIC0gVGV4dHVyZSB0byBnZW5lcmF0ZSBtaXBtYXBzIGZvci5cclxuXHQgKiBAcGFyYW0ge29iamVjdH0gdGV4dHVyZURlc2NyaXB0b3IgLSBHUFVUZXh0dXJlRGVzY3JpcHRvciB0aGUgdGV4dHVyZSB3YXMgY3JlYXRlZCB3aXRoLlxyXG5cdCAqIEByZXR1cm5zIHttb2R1bGU6RXh0ZXJuYWwuR1BVVGV4dHVyZX0gLSBUaGUgb3JpZ2luYWxseSBwYXNzZWQgdGV4dHVyZVxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlTWlwbWFwKHNvdXJjZVRleHR1cmU6IFRleHR1cmUpIHtcclxuXHRcdGNvbnN0IHRleHR1cmUgPSBzb3VyY2VUZXh0dXJlLmdwdVRleHR1cmU7XHJcblx0XHRjb25zdCB0ZXh0dXJlRGVzY3JpcHRvciA9IHNvdXJjZVRleHR1cmUudGV4dHVyZVByb3A7XHJcblx0XHQvLyBUT0RPOiBEb2VzIHRoaXMgbmVlZCB0byBoYW5kbGUgc1JHQiBmb3JtYXRzIGRpZmZlcmVudGx5P1xyXG5cdFx0Y29uc3QgcGlwZWxpbmUgPSB0aGlzLmdldE1pcG1hcFBpcGVsaW5lKHRleHR1cmVEZXNjcmlwdG9yLmZvcm1hdCk7XHJcblxyXG5cdFx0aWYgKHRleHR1cmVEZXNjcmlwdG9yLmRpbWVuc2lvbiA9PSBcIjNkXCIgfHwgdGV4dHVyZURlc2NyaXB0b3IuZGltZW5zaW9uID09IFwiMWRcIikge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0aW5nIG1pcG1hcHMgZm9yIG5vbi0yZCB0ZXh0dXJlcyBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQhXCIpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBtaXBUZXh0dXJlID0gdGV4dHVyZTtcclxuXHRcdGNvbnN0IGFycmF5TGF5ZXJDb3VudCA9IHRleHR1cmVEZXNjcmlwdG9yLnNpemUuZGVwdGggfHwgMTsgLy8gT25seSB2YWxpZCBmb3IgMkQgdGV4dHVyZXMuXHJcblxyXG5cdFx0Ly8gSWYgdGhlIHRleHR1cmUgd2FzIGNyZWF0ZWQgd2l0aCBSRU5ERVJfQVRUQUNITUVOVCB1c2FnZSB3ZSBjYW4gcmVuZGVyIGRpcmVjdGx5IGJldHdlZW4gbWlwIGxldmVscy5cclxuXHRcdGNvbnN0IHJlbmRlclRvU291cmNlID0gdGV4dHVyZURlc2NyaXB0b3IudXNhZ2UgJiBHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlQ7XHJcblx0XHRpZiAoIXJlbmRlclRvU291cmNlKSB7XHJcblx0XHRcdC8vIE90aGVyd2lzZSB3ZSBoYXZlIHRvIHVzZSBhIHNlcGFyYXRlIHRleHR1cmUgdG8gcmVuZGVyIGludG8uIEl0IGNhbiBiZSBvbmUgbWlwIGxldmVsIHNtYWxsZXIgdGhhbiB0aGUgc291cmNlXHJcblx0XHRcdC8vIHRleHR1cmUsIHNpbmNlIHdlIGFscmVhZHkgaGF2ZSB0aGUgdG9wIGxldmVsLlxyXG5cdFx0XHRjb25zdCBtaXBUZXh0dXJlRGVzY3JpcHRvciA9IHtcclxuXHRcdFx0XHRzaXplOiB7XHJcblx0XHRcdFx0XHR3aWR0aDogTWF0aC5jZWlsKHRleHR1cmVEZXNjcmlwdG9yLnNpemUud2lkdGggLyAyKSxcclxuXHRcdFx0XHRcdGhlaWdodDogTWF0aC5jZWlsKHRleHR1cmVEZXNjcmlwdG9yLnNpemUuaGVpZ2h0IC8gMiksXHJcblx0XHRcdFx0XHRkZXB0aE9yQXJyYXlMYXllcnM6IGFycmF5TGF5ZXJDb3VudFxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0Zm9ybWF0OiA8R1BVVGV4dHVyZUZvcm1hdD50ZXh0dXJlRGVzY3JpcHRvci5mb3JtYXQsXHJcblx0XHRcdFx0dXNhZ2U6IEdQVVRleHR1cmVVc2FnZS5URVhUVVJFX0JJTkRJTkcgfCBHUFVUZXh0dXJlVXNhZ2UuQ09QWV9TUkMgfCBHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlQsXHJcblx0XHRcdFx0bWlwTGV2ZWxDb3VudDogdGV4dHVyZURlc2NyaXB0b3IubWlwTGV2ZWxDb3VudCAtIDFcclxuXHRcdFx0fTtcclxuXHRcdFx0bWlwVGV4dHVyZSA9IHRoaXMuZGV2aWNlLmNyZWF0ZVRleHR1cmUobWlwVGV4dHVyZURlc2NyaXB0b3IpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGNvbW1hbmRFbmNvZGVyID0gdGhpcy5kZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoe30pO1xyXG5cdFx0Ly8gVE9ETzogQ29uc2lkZXIgbWFraW5nIHRoaXMgc3RhdGljLlxyXG5cdFx0Y29uc3QgYmluZEdyb3VwTGF5b3V0ID0gcGlwZWxpbmUuZ2V0QmluZEdyb3VwTGF5b3V0KDApO1xyXG5cclxuXHRcdGZvciAobGV0IGFycmF5TGF5ZXIgPSAwOyBhcnJheUxheWVyIDwgYXJyYXlMYXllckNvdW50OyArK2FycmF5TGF5ZXIpIHtcclxuXHRcdFx0bGV0IHNyY1ZpZXcgPSB0ZXh0dXJlLmNyZWF0ZVZpZXcoe1xyXG5cdFx0XHRcdGJhc2VNaXBMZXZlbDogMCxcclxuXHRcdFx0XHRtaXBMZXZlbENvdW50OiAxLFxyXG5cdFx0XHRcdGRpbWVuc2lvbjogXCIyZFwiLFxyXG5cdFx0XHRcdGJhc2VBcnJheUxheWVyOiBhcnJheUxheWVyLFxyXG5cdFx0XHRcdGFycmF5TGF5ZXJDb3VudDogMVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGxldCBkc3RNaXBMZXZlbCA9IHJlbmRlclRvU291cmNlID8gMSA6IDA7XHJcblx0XHRcdGZvciAobGV0IGkgPSAxOyBpIDwgdGV4dHVyZURlc2NyaXB0b3IubWlwTGV2ZWxDb3VudDsgKytpKSB7XHJcblx0XHRcdFx0Y29uc3QgZHN0VmlldyA9IG1pcFRleHR1cmUuY3JlYXRlVmlldyh7XHJcblx0XHRcdFx0XHRiYXNlTWlwTGV2ZWw6IGRzdE1pcExldmVsKyssXHJcblx0XHRcdFx0XHRtaXBMZXZlbENvdW50OiAxLFxyXG5cdFx0XHRcdFx0ZGltZW5zaW9uOiBcIjJkXCIsXHJcblx0XHRcdFx0XHRiYXNlQXJyYXlMYXllcjogYXJyYXlMYXllcixcclxuXHRcdFx0XHRcdGFycmF5TGF5ZXJDb3VudDogMVxyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRjb25zdCBwYXNzRW5jb2RlciA9IGNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyh7XHJcblx0XHRcdFx0XHRjb2xvckF0dGFjaG1lbnRzOiBbXHJcblx0XHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0XHR2aWV3OiBkc3RWaWV3LFxyXG5cdFx0XHRcdFx0XHRcdGxvYWRPcDogXCJjbGVhclwiLFxyXG5cdFx0XHRcdFx0XHRcdHN0b3JlT3A6IFwic3RvcmVcIlxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRdXHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJpbmRHcm91cCA9IHRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7XHJcblx0XHRcdFx0XHRsYXlvdXQ6IGJpbmRHcm91cExheW91dCxcclxuXHRcdFx0XHRcdGVudHJpZXM6IFtcclxuXHRcdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRcdGJpbmRpbmc6IDAsXHJcblx0XHRcdFx0XHRcdFx0cmVzb3VyY2U6IHRoaXMuc2FtcGxlclxyXG5cdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdFx0YmluZGluZzogMSxcclxuXHRcdFx0XHRcdFx0XHRyZXNvdXJjZTogc3JjVmlld1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRdXHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdHBhc3NFbmNvZGVyLnNldFBpcGVsaW5lKHBpcGVsaW5lKTtcclxuXHRcdFx0XHRwYXNzRW5jb2Rlci5zZXRCaW5kR3JvdXAoMCwgYmluZEdyb3VwKTtcclxuXHRcdFx0XHRwYXNzRW5jb2Rlci5kcmF3KDMsIDEsIDAsIDApO1xyXG5cdFx0XHRcdHBhc3NFbmNvZGVyLmVuZCgpO1xyXG5cclxuXHRcdFx0XHRzcmNWaWV3ID0gZHN0VmlldztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIElmIHdlIGRpZG4ndCByZW5kZXIgdG8gdGhlIHNvdXJjZSB0ZXh0dXJlLCBmaW5pc2ggYnkgY29weWluZyB0aGUgbWlwIHJlc3VsdHMgZnJvbSB0aGUgdGVtcG9yYXJ5IG1pcG1hcCB0ZXh0dXJlXHJcblx0XHQvLyB0byB0aGUgc291cmNlLlxyXG5cdFx0aWYgKCFyZW5kZXJUb1NvdXJjZSkge1xyXG5cdFx0XHRjb25zdCBtaXBMZXZlbFNpemUgPSB7XHJcblx0XHRcdFx0d2lkdGg6IE1hdGguY2VpbCh0ZXh0dXJlRGVzY3JpcHRvci5zaXplLndpZHRoIC8gMiksXHJcblx0XHRcdFx0aGVpZ2h0OiBNYXRoLmNlaWwodGV4dHVyZURlc2NyaXB0b3Iuc2l6ZS5oZWlnaHQgLyAyKSxcclxuXHRcdFx0XHRkZXB0aE9yQXJyYXlMYXllcnM6IGFycmF5TGF5ZXJDb3VudFxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0Zm9yIChsZXQgaSA9IDE7IGkgPCB0ZXh0dXJlRGVzY3JpcHRvci5taXBMZXZlbENvdW50OyArK2kpIHtcclxuXHRcdFx0XHRjb21tYW5kRW5jb2Rlci5jb3B5VGV4dHVyZVRvVGV4dHVyZShcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0dGV4dHVyZTogbWlwVGV4dHVyZSxcclxuXHRcdFx0XHRcdFx0bWlwTGV2ZWw6IGkgLSAxXHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHR0ZXh0dXJlOiB0ZXh0dXJlLFxyXG5cdFx0XHRcdFx0XHRtaXBMZXZlbDogaVxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdG1pcExldmVsU2l6ZVxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdG1pcExldmVsU2l6ZS53aWR0aCA9IE1hdGguY2VpbChtaXBMZXZlbFNpemUud2lkdGggLyAyKTtcclxuXHRcdFx0XHRtaXBMZXZlbFNpemUuaGVpZ2h0ID0gTWF0aC5jZWlsKG1pcExldmVsU2l6ZS5oZWlnaHQgLyAyKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuZGV2aWNlLnF1ZXVlLnN1Ym1pdChbY29tbWFuZEVuY29kZXIuZmluaXNoKCldKTtcclxuXHJcblx0XHRpZiAoIXJlbmRlclRvU291cmNlKSB7XHJcblx0XHRcdG1pcFRleHR1cmUuZGVzdHJveSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0ZXh0dXJlO1xyXG5cdH1cclxufVxyXG4iLCJmdW5jdGlvbiBkZWZhdWx0VmFsdWUoYSwgYikge1xuXHRpZiAoYSAhPT0gdW5kZWZpbmVkICYmIGEgIT09IG51bGwpIHtcblx0XHRyZXR1cm4gYTtcblx0fVxuXHRyZXR1cm4gYjtcbn1cblxuLyoqXG4gKiBBIGZyb3plbiBlbXB0eSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igb3B0aW9ucyBwYXNzZWQgYXNcbiAqIGFuIG9iamVjdCBsaXRlcmFsLlxuICogQHR5cGUge09iamVjdH1cbiAqIEBtZW1iZXJvZiBkZWZhdWx0VmFsdWVcbiAqL1xuZGVmYXVsdFZhbHVlLkVNUFRZX09CSkVDVCA9IE9iamVjdC5mcmVlemUoe30pO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0VmFsdWU7XG4iLCJpbXBvcnQge1xyXG5cdEJsZW5kRmFjdG9yLFxyXG5cdEJsZW5kT3BlcmF0aW9uLFxyXG5cdFRleHR1cmVGb3JtYXQsXHJcblx0R1BVQ29sb3JXcml0ZSxcclxuXHRDb21wYXJlRnVuY3Rpb24sXHJcblx0U3RlbmNpbE9wZXJhdGlvbixcclxuXHRGcm9udEZhY2UsXHJcblx0Q3VsbE1vZGUsXHJcblx0UHJpbWl0aXZlVG9wb2xvZ3lcclxufSBmcm9tIFwiLi4vY29yZS9XZWJHUFVDb25zdGFudFwiO1xyXG4vLyBpbXBvcnQgeyBCaW5kUmVuZGVyU3RhdGUgfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVUeXBlc1wiO1xyXG5pbXBvcnQgZGVmYXVsdFZhbHVlIGZyb20gXCIuLi91dGlscy9kZWZhdWx0VmFsdWVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBSZW5kZXJTdGF0ZSB7XHJcblx0c2Npc3NvclRlc3Q6IFNjaXNzb3JUZXN0O1xyXG5cdHZpZXdwb3J0OiBWaWV3UG9ydDtcclxuXHR0YXJnZXRzOiBBcnJheTxUYXJnZXQ+O1xyXG5cdGRlcHRoU3RlbmNpbDogRGVwdGhTdGVuY2lsO1xyXG5cdGJsZW5kQ29uc3RhbnQ6IEJsZW5kQ29uc3RhbnQ7XHJcblx0c3RlbmNpbFJlZmVyZW5jZTogbnVtYmVyO1xyXG5cdG11bHRpc2FtcGxlOiBNdWx0aVNhbXBsZTtcclxuXHRwcmltaXRpdmU6IFByaW1pdGl2ZTtcclxuXHRzdGVuY2lsRW5hYmxlZDogYm9vbGVhbjtcclxuXHRzY2lzc29yVGVzdEVuYWJsZWQ6IGJvb2xlYW47XHJcblx0Y29uc3RydWN0b3IocGFyYW1zPzogUmVuZGVyU3RhdGVQYXJhbXMpIHtcclxuXHRcdHRoaXMuc2Npc3NvclRlc3QgPSBwYXJhbXM/LnNjaXNzb3JUZXN0O1xyXG5cdFx0dGhpcy52aWV3cG9ydCA9IHBhcmFtcz8udmlld3BvcnQ7XHJcblx0XHR0aGlzLmRlcHRoU3RlbmNpbCA9IHBhcmFtcz8uZGVwdGhTdGVuY2lsO1xyXG5cdFx0dGhpcy5ibGVuZENvbnN0YW50ID0gcGFyYW1zPy5ibGVuZENvbnN0YW50O1xyXG5cdFx0dGhpcy5zdGVuY2lsUmVmZXJlbmNlID0gcGFyYW1zPy5zdGVuY2lsUmVmZXJlbmNlO1xyXG5cdFx0dGhpcy5tdWx0aXNhbXBsZSA9IHBhcmFtcz8ubXVsdGlzYW1wbGU7XHJcblx0XHR0aGlzLnByaW1pdGl2ZSA9IHBhcmFtcz8ucHJpbWl0aXZlO1xyXG5cdFx0dGhpcy5zdGVuY2lsRW5hYmxlZCA9IGZhbHNlO1xyXG5cdFx0dGhpcy5zY2lzc29yVGVzdEVuYWJsZWQgPSBmYWxzZTtcclxuXHRcdHRoaXMudGFyZ2V0cyA9IHBhcmFtcz8udGFyZ2V0cztcclxuXHR9XHJcblx0YmluZChwYXJhbXM6IEJpbmRSZW5kZXJTdGF0ZSkge1xyXG5cdFx0Y29uc3QgeyBwYXNzRW5jb2Rlciwgdmlld1BvcnQsIHNjaXNzb3JUZXN0IH0gPSBwYXJhbXM7XHJcblx0XHRjb25zdCBmaW5hbFZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydCA/PyB2aWV3UG9ydDtcclxuXHRcdGNvbnN0IGZpbmFsU2Npc3NvclRlc3QgPSB0aGlzLnNjaXNzb3JUZXN0ID8/IHNjaXNzb3JUZXN0O1xyXG5cdFx0aWYgKHRoaXMuc3RlbmNpbFJlZmVyZW5jZSkgcGFzc0VuY29kZXIuc2V0U3RlbmNpbFJlZmVyZW5jZSh0aGlzLnN0ZW5jaWxSZWZlcmVuY2UpO1xyXG5cdFx0aWYgKChmaW5hbFZpZXdwb3J0IGFzIFZpZXdQb3J0KT8uZXF1YWxzQW5kVXBkYXRlQ2FjaGUoY2FjaGVWaWV3UG9ydCkpIHtcclxuXHRcdFx0Y29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBtaW5EZXB0aCwgbWF4RGVwdGggfSA9IGZpbmFsVmlld3BvcnQ7XHJcblx0XHRcdHBhc3NFbmNvZGVyLnNldFZpZXdwb3J0KHgsIHksIHdpZHRoLCBoZWlnaHQsIG1pbkRlcHRoLCBtYXhEZXB0aCk7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5ibGVuZENvbnN0YW50KSBwYXNzRW5jb2Rlci5zZXRCbGVuZENvbnN0YW50KHRoaXMuYmxlbmRDb25zdGFudCk7XHJcblx0XHRpZiAoKGZpbmFsU2Npc3NvclRlc3QgYXMgU2Npc3NvclRlc3QpPy5lcXVhbHNBbmRVcGRhdGVDYWNoZShjYWNoZVNjaXNzb3JUZXN0KSkge1xyXG5cdFx0XHRjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IGZpbmFsU2Npc3NvclRlc3Q7XHJcblx0XHRcdHBhc3NFbmNvZGVyLnNldFNjaXNzb3JSZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRkZXN0cm95KCkge1xyXG5cdFx0dGhpcy5zY2lzc29yVGVzdCA9IHVuZGVmaW5lZDtcclxuXHRcdHRoaXMudmlld3BvcnQgPSB1bmRlZmluZWQ7XHJcblx0XHR0aGlzLmRlcHRoU3RlbmNpbCA9IHVuZGVmaW5lZDtcclxuXHRcdHRoaXMuYmxlbmRDb25zdGFudCA9IHVuZGVmaW5lZDtcclxuXHRcdHRoaXMuc3RlbmNpbFJlZmVyZW5jZSA9IC0xO1xyXG5cdFx0dGhpcy5tdWx0aXNhbXBsZSA9IHVuZGVmaW5lZDtcclxuXHRcdHRoaXMucHJpbWl0aXZlID0gdW5kZWZpbmVkO1xyXG5cdFx0dGhpcy5zdGVuY2lsRW5hYmxlZCA9IGZhbHNlO1xyXG5cdFx0dGhpcy5zY2lzc29yVGVzdEVuYWJsZWQgPSBmYWxzZTtcclxuXHR9XHJcbn1cclxuZXhwb3J0IGNsYXNzIEJsZW5kQ29uc3RhbnQge1xyXG5cdHI6IG51bWJlcjtcclxuXHRnOiBudW1iZXI7XHJcblx0YjogbnVtYmVyO1xyXG5cdGE6IG51bWJlcjtcclxuXHRjb25zdHJ1Y3RvcihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIpIHtcclxuXHRcdHRoaXMuciA9IHI7XHJcblx0XHR0aGlzLmcgPSBnO1xyXG5cdFx0dGhpcy5iID0gYjtcclxuXHRcdHRoaXMuYSA9IGE7XHJcblx0fVxyXG59XHJcbmV4cG9ydCBjbGFzcyBNdWx0aVNhbXBsZSB7XHJcblx0Y291bnQ6IG51bWJlcjtcclxuXHRtYXNrOiBudW1iZXI7XHJcblx0YWxwaGFUb0NvdmVyYWdlRW5hYmxlZDogYm9vbGVhbjtcclxuXHRjb25zdHJ1Y3Rvcihjb3VudCA9IDEsIG1hc2sgPSAweGZmZmZmZmZmLCBhbHBoYVRvQ292ZXJhZ2VFbmFibGVkID0gZmFsc2UpIHtcclxuXHRcdHRoaXMuY291bnQgPSBjb3VudDtcclxuXHRcdHRoaXMubWFzayA9IG1hc2s7XHJcblx0XHR0aGlzLmFscGhhVG9Db3ZlcmFnZUVuYWJsZWQgPSBhbHBoYVRvQ292ZXJhZ2VFbmFibGVkO1xyXG5cdH1cclxuXHRnZXRNdWx0aVNhbXBsZURlYygpIHtcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdGNvdW50OiB0aGlzLmNvdW50LFxyXG5cdFx0XHRtYXNrOiB0aGlzLm1hc2ssXHJcblx0XHRcdGFscGhhVG9Db3ZlcmFnZUVuYWJsZWQ6IHRoaXMuYWxwaGFUb0NvdmVyYWdlRW5hYmxlZFxyXG5cdFx0fTtcclxuXHR9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFNjaXNzb3JUZXN0IHtcclxuXHR4OiBudW1iZXI7XHJcblx0eTogbnVtYmVyO1xyXG5cdHdpZHRoOiBudW1iZXI7XHJcblx0aGVpZ2h0OiBudW1iZXI7XHJcblx0dmFyaWFibGU6IGJvb2xlYW47XHJcblx0Y29uc3RydWN0b3IoeCA9IDAsIHkgPSAwLCB3aWR0aCA9IDAsIGhlaWdodCA9IDAsIHZhcmlhYmxlID0gdHJ1ZSkge1xyXG5cdFx0dGhpcy54ID0geDtcclxuXHRcdHRoaXMueSA9IHk7XHJcblx0XHR0aGlzLndpZHRoID0gd2lkdGg7XHJcblx0XHR0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuXHRcdHRoaXMudmFyaWFibGUgPSB2YXJpYWJsZTtcclxuXHR9XHJcblx0c2V0KHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG5cdFx0dGhpcy54ID0geDtcclxuXHRcdHRoaXMueSA9IHk7XHJcblx0XHR0aGlzLndpZHRoID0gd2lkdGg7XHJcblx0XHR0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuXHR9XHJcblx0ZXF1YWxzQW5kVXBkYXRlQ2FjaGUoc2Npc3NvclRlc3Q6IFNjaXNzb3JUZXN0KTogYm9vbGVhbiB7XHJcblx0XHRjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IHNjaXNzb3JUZXN0O1xyXG5cdFx0aWYgKHRoaXMueCAhPSB4IHx8IHRoaXMueSAhPSB5IHx8IHRoaXMud2lkdGggIT0gd2lkdGggfHwgdGhpcy5oZWlnaHQgIT0gaGVpZ2h0KSB7XHJcblx0XHRcdHNjaXNzb3JUZXN0LnNldCh0aGlzLngsIHRoaXMueSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFZpZXdQb3J0IHtcclxuXHR4OiBudW1iZXI7XHJcblx0eTogbnVtYmVyO1xyXG5cdHdpZHRoOiBudW1iZXI7XHJcblx0aGVpZ2h0OiBudW1iZXI7XHJcblx0bWluRGVwdGg6IG51bWJlcjtcclxuXHRtYXhEZXB0aDogbnVtYmVyO1xyXG5cdHZhcmlhYmxlOiBib29sZWFuO1xyXG5cdGNvbnN0cnVjdG9yKHggPSAwLCB5ID0gMCwgd2lkdGggPSAwLCBoZWlnaHQgPSAwLCBtaW5EZXB0aCA9IDAsIG1heERlcHRoID0gMSwgdmFyaWFibGUgPSB0cnVlKSB7XHJcblx0XHR0aGlzLnggPSB4O1xyXG5cdFx0dGhpcy55ID0geTtcclxuXHRcdHRoaXMud2lkdGggPSB3aWR0aDtcclxuXHRcdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cdFx0dGhpcy5taW5EZXB0aCA9IG1pbkRlcHRoO1xyXG5cdFx0dGhpcy5tYXhEZXB0aCA9IG1heERlcHRoO1xyXG5cdFx0dGhpcy52YXJpYWJsZSA9IHZhcmlhYmxlO1xyXG5cdH1cclxuXHRzZXQoeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBtaW5EZXB0aCA9IDAsIG1heERlcHRoID0gMSkge1xyXG5cdFx0aWYgKCF0aGlzLnZhcmlhYmxlKSByZXR1cm47XHJcblx0XHR0aGlzLnggPSB4O1xyXG5cdFx0dGhpcy55ID0geTtcclxuXHRcdHRoaXMud2lkdGggPSB3aWR0aDtcclxuXHRcdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cdFx0dGhpcy5taW5EZXB0aCA9IG1pbkRlcHRoO1xyXG5cdFx0dGhpcy5tYXhEZXB0aCA9IG1heERlcHRoO1xyXG5cdH1cclxuXHRlcXVhbHNBbmRVcGRhdGVDYWNoZSh2aWV3UG9ydDogVmlld1BvcnQpOiBib29sZWFuIHtcclxuXHRcdGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCwgbWluRGVwdGgsIG1heERlcHRoIH0gPSB2aWV3UG9ydDtcclxuXHRcdGlmIChcclxuXHRcdFx0dGhpcy54ICE9IHggfHxcclxuXHRcdFx0dGhpcy55ICE9IHkgfHxcclxuXHRcdFx0dGhpcy53aWR0aCAhPSB3aWR0aCB8fFxyXG5cdFx0XHR0aGlzLmhlaWdodCAhPSBoZWlnaHQgfHxcclxuXHRcdFx0dGhpcy5taW5EZXB0aCAhPSBtaW5EZXB0aCB8fFxyXG5cdFx0XHR0aGlzLm1heERlcHRoICE9IG1heERlcHRoXHJcblx0XHQpIHtcclxuXHRcdFx0dmlld1BvcnQuc2V0KHRoaXMueCwgdGhpcy55LCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgdGhpcy5taW5EZXB0aCwgdGhpcy5tYXhEZXB0aCk7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxufVxyXG5leHBvcnQgY2xhc3MgUHJpbWl0aXZlIHtcclxuXHRmcm9udEZhY2U6IEZyb250RmFjZTtcclxuXHRjdWxsTW9kZTogQ3VsbE1vZGU7XHJcblx0dW5jbGlwcGVkRGVwdGg6IGJvb2xlYW47XHJcblx0dG9wb2xvZ3k6IFByaW1pdGl2ZVRvcG9sb2d5O1xyXG5cdGNvbnN0cnVjdG9yKHRvcG9sb2d5PzogUHJpbWl0aXZlVG9wb2xvZ3ksIGN1bGxNb2RlPzogQ3VsbE1vZGUsIGZyb250RmFjZT86IEZyb250RmFjZSwgdW5jbGlwcGVkRGVwdGg/OiBib29sZWFuKSB7XHJcblx0XHR0aGlzLmZyb250RmFjZSA9IGRlZmF1bHRWYWx1ZShmcm9udEZhY2UsIEZyb250RmFjZS5DQ1cpO1xyXG5cdFx0dGhpcy5jdWxsTW9kZSA9IGRlZmF1bHRWYWx1ZShjdWxsTW9kZSwgQ3VsbE1vZGUuTm9uZSk7XHJcblx0XHR0aGlzLnVuY2xpcHBlZERlcHRoID0gZGVmYXVsdFZhbHVlKHVuY2xpcHBlZERlcHRoLCBmYWxzZSk7XHJcblx0XHR0aGlzLnRvcG9sb2d5ID0gZGVmYXVsdFZhbHVlKHRvcG9sb2d5LCBQcmltaXRpdmVUb3BvbG9neS5UcmlhbmdsZUxpc3QpO1xyXG5cdH1cclxuXHRnZXRHUFVQcmltaXRpdmVEZWMoKSB7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRmcm9udEZhY2U6IHRoaXMuZnJvbnRGYWNlLFxyXG5cdFx0XHRjdWxsTW9kZTogdGhpcy5jdWxsTW9kZSxcclxuXHRcdFx0dW5jbGlwcGVkRGVwdGg6IHRoaXMudW5jbGlwcGVkRGVwdGgsXHJcblx0XHRcdHRvcG9sb2d5OiB0aGlzLnRvcG9sb2d5XHJcblx0XHR9O1xyXG5cdH1cclxufVxyXG5leHBvcnQgY2xhc3MgRGVwdGhTdGVuY2lsIHtcclxuXHRmb3JtYXQ6IFRleHR1cmVGb3JtYXQ7XHJcblx0ZGVwdGhXcml0ZUVuYWJsZWQ6IGJvb2xlYW47XHJcblx0ZGVwdGhDb21wYXJlOiBDb21wYXJlRnVuY3Rpb247XHJcblx0c3RlbmNpbFJlYWRNYXNrOiBudW1iZXI7XHJcblx0c3RlbmNpbFdyaXRlTWFzazogbnVtYmVyO1xyXG5cdHN0ZW5jaWxGcm9udENvbXBhcmU6IENvbXBhcmVGdW5jdGlvbjtcclxuXHRzdGVuY2lsRnJvbnRGYWlsT3A6IFN0ZW5jaWxPcGVyYXRpb247XHJcblx0c3RlbmNpbEZyb250RGVwdGhGYWlsT3A6IFN0ZW5jaWxPcGVyYXRpb247XHJcblx0c3RlbmNpbEZyb250UGFzc09wOiBTdGVuY2lsT3BlcmF0aW9uO1xyXG5cclxuXHRzdGVuY2lsQmFja0NvbXBhcmU6IENvbXBhcmVGdW5jdGlvbjtcclxuXHRzdGVuY2lsQmFja0ZhaWxPcDogU3RlbmNpbE9wZXJhdGlvbjtcclxuXHRzdGVuY2lsQmFja0RlcHRoRmFpbE9wOiBTdGVuY2lsT3BlcmF0aW9uO1xyXG5cdHN0ZW5jaWxCYWNrUGFzc09wOiBTdGVuY2lsT3BlcmF0aW9uO1xyXG5cdGRlcHRoQmlhczogbnVtYmVyO1xyXG5cdGRlcHRoQmlhc1Nsb3BlU2NhbGU6IG51bWJlcjtcclxuXHRkZXB0aEJpYXNDbGFtcDogbnVtYmVyO1xyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBEZXB0aFN0ZW5jaWxQcm9wcykge1xyXG5cdFx0dGhpcy5mb3JtYXQgPSBkZWZhdWx0VmFsdWUob3B0aW9ucz8uZm9ybWF0LCBUZXh0dXJlRm9ybWF0LkRlcHRoMjRQbHVzKTtcclxuXHRcdHRoaXMuZGVwdGhXcml0ZUVuYWJsZWQgPSBkZWZhdWx0VmFsdWUob3B0aW9ucz8uZGVwdGhXcml0ZUVuYWJsZWQsIHRydWUpO1xyXG5cdFx0dGhpcy5kZXB0aENvbXBhcmUgPSBkZWZhdWx0VmFsdWUob3B0aW9ucz8uZGVwdGhDb21wYXJlLCBDb21wYXJlRnVuY3Rpb24uTGVzcyk7XHJcblx0XHR0aGlzLnN0ZW5jaWxSZWFkTWFzayA9IGRlZmF1bHRWYWx1ZShvcHRpb25zPy5zdGVuY2lsUmVhZE1hc2ssIDB4ZmZmZmZmZmYpO1xyXG5cdFx0dGhpcy5zdGVuY2lsV3JpdGVNYXNrID0gZGVmYXVsdFZhbHVlKG9wdGlvbnM/LnN0ZW5jaWxXcml0ZU1hc2ssIDB4ZmZmZmZmZmYpO1xyXG5cdFx0dGhpcy5zdGVuY2lsRnJvbnRDb21wYXJlID0gZGVmYXVsdFZhbHVlKG9wdGlvbnM/LnN0ZW5jaWxGcm9udENvbXBhcmUsIENvbXBhcmVGdW5jdGlvbi5BbHdheXMpO1xyXG5cdFx0dGhpcy5zdGVuY2lsRnJvbnRGYWlsT3AgPSBkZWZhdWx0VmFsdWUob3B0aW9ucz8uc3RlbmNpbEZyb250RmFpbE9wLCBTdGVuY2lsT3BlcmF0aW9uLktlZXApO1xyXG5cdFx0dGhpcy5zdGVuY2lsRnJvbnREZXB0aEZhaWxPcCA9IGRlZmF1bHRWYWx1ZShvcHRpb25zPy5zdGVuY2lsRnJvbnREZXB0aEZhaWxPcCwgU3RlbmNpbE9wZXJhdGlvbi5LZWVwKTtcclxuXHRcdHRoaXMuc3RlbmNpbEZyb250UGFzc09wID0gZGVmYXVsdFZhbHVlKG9wdGlvbnM/LnN0ZW5jaWxGcm9udFBhc3NPcCwgU3RlbmNpbE9wZXJhdGlvbi5LZWVwKTtcclxuXHRcdHRoaXMuc3RlbmNpbEJhY2tDb21wYXJlID0gZGVmYXVsdFZhbHVlKG9wdGlvbnM/LnN0ZW5jaWxCYWNrQ29tcGFyZSwgQ29tcGFyZUZ1bmN0aW9uLkFsd2F5cyk7XHJcblx0XHR0aGlzLnN0ZW5jaWxCYWNrRmFpbE9wID0gZGVmYXVsdFZhbHVlKG9wdGlvbnM/LnN0ZW5jaWxCYWNrRmFpbE9wLCBTdGVuY2lsT3BlcmF0aW9uLktlZXApO1xyXG5cdFx0dGhpcy5zdGVuY2lsQmFja0RlcHRoRmFpbE9wID0gZGVmYXVsdFZhbHVlKG9wdGlvbnM/LnN0ZW5jaWxCYWNrRGVwdGhGYWlsT3AsIFN0ZW5jaWxPcGVyYXRpb24uS2VlcCk7XHJcblx0XHR0aGlzLnN0ZW5jaWxCYWNrUGFzc09wID0gZGVmYXVsdFZhbHVlKG9wdGlvbnM/LnN0ZW5jaWxCYWNrUGFzc09wLCBTdGVuY2lsT3BlcmF0aW9uLktlZXApO1xyXG5cdFx0dGhpcy5kZXB0aEJpYXMgPSBkZWZhdWx0VmFsdWUob3B0aW9ucz8uZGVwdGhCaWFzLCAwKTtcclxuXHRcdHRoaXMuZGVwdGhCaWFzU2xvcGVTY2FsZSA9IGRlZmF1bHRWYWx1ZShvcHRpb25zPy5kZXB0aEJpYXNTbG9wZVNjYWxlLCAwKTtcclxuXHRcdHRoaXMuZGVwdGhCaWFzQ2xhbXAgPSBkZWZhdWx0VmFsdWUob3B0aW9ucz8uZGVwdGhCaWFzQ2xhbXAsIDApO1xyXG5cdH1cclxuXHRnZXRHUFVEZXB0aFN0ZW5jaWxEZWMoKSB7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRmb3JtYXQ6IHRoaXMuZm9ybWF0LFxyXG5cdFx0XHRkZXB0aFdyaXRlRW5hYmxlZDogdGhpcy5kZXB0aFdyaXRlRW5hYmxlZCxcclxuXHRcdFx0ZGVwdGhDb21wYXJlOiB0aGlzLmRlcHRoQ29tcGFyZSxcclxuXHRcdFx0c3RlbmNpbFJlYWRNYXNrOiB0aGlzLnN0ZW5jaWxSZWFkTWFzayxcclxuXHRcdFx0c3RlbmNpbFdyaXRlTWFzazogdGhpcy5zdGVuY2lsV3JpdGVNYXNrLFxyXG5cdFx0XHRzdGVuY2lsRnJvbnQ6IHtcclxuXHRcdFx0XHRjb21wYXJlOiB0aGlzLnN0ZW5jaWxGcm9udENvbXBhcmUsXHJcblx0XHRcdFx0ZmFpbE9wOiB0aGlzLnN0ZW5jaWxGcm9udEZhaWxPcCxcclxuXHRcdFx0XHRkZXB0aEZhaWxPcDogdGhpcy5zdGVuY2lsRnJvbnREZXB0aEZhaWxPcCxcclxuXHRcdFx0XHRwYXNzT3A6IHRoaXMuc3RlbmNpbEZyb250UGFzc09wXHJcblx0XHRcdH0sXHJcblx0XHRcdHN0ZW5jaWxCYWNrOiB7XHJcblx0XHRcdFx0Y29tcGFyZTogdGhpcy5zdGVuY2lsQmFja0NvbXBhcmUsXHJcblx0XHRcdFx0ZmFpbE9wOiB0aGlzLnN0ZW5jaWxCYWNrRmFpbE9wLFxyXG5cdFx0XHRcdGRlcHRoRmFpbE9wOiB0aGlzLnN0ZW5jaWxCYWNrRGVwdGhGYWlsT3AsXHJcblx0XHRcdFx0cGFzc09wOiB0aGlzLnN0ZW5jaWxCYWNrUGFzc09wXHJcblx0XHRcdH0sXHJcblx0XHRcdGRlcHRoQmlhczogdGhpcy5kZXB0aEJpYXMsXHJcblx0XHRcdGRlcHRoQmlhc1Nsb3BlU2NhbGU6IHRoaXMuZGVwdGhCaWFzU2xvcGVTY2FsZSxcclxuXHRcdFx0ZGVwdGhCaWFzQ2xhbXA6IHRoaXMuZGVwdGhCaWFzQ2xhbXBcclxuXHRcdH07XHJcblx0fVxyXG59XHJcbmV4cG9ydCBjbGFzcyBUYXJnZXQge1xyXG5cdGZvcm1hdDogVGV4dHVyZUZvcm1hdDtcclxuXHRibGVuZENvbG9yT3BlcmF0aW9uPzogQmxlbmRPcGVyYXRpb247XHJcblx0YmxlbmRDb2xvclNyY0ZhY3Rvcj86IEJsZW5kRmFjdG9yO1xyXG5cdGJsZW5kQ29sb3JEc3RGYWN0b3I/OiBCbGVuZEZhY3RvcjtcclxuXHRibGVuZEFscGhhT3BlcmF0aW9uPzogQmxlbmRPcGVyYXRpb247XHJcblx0YmxlbmRBbHBoYVNyY0ZhY3Rvcj86IEJsZW5kRmFjdG9yO1xyXG5cdGJsZW5kQWxwaGFEc3RGYWN0b3I/OiBCbGVuZEZhY3RvcjtcclxuXHR3cml0ZU1hc2s6IEdQVUNvbG9yV3JpdGU7XHJcblx0Y29uc3RydWN0b3Iob3B0aW9ucz86IFRhcmdldFByb3BzKSB7XHJcblx0XHR0aGlzLmZvcm1hdCA9IGRlZmF1bHRWYWx1ZShvcHRpb25zPy5mb3JtYXQsIFRleHR1cmVGb3JtYXQuQkdSQThVbm9ybSk7XHJcblx0XHR0aGlzLmJsZW5kQ29sb3JPcGVyYXRpb24gPSBkZWZhdWx0VmFsdWUob3B0aW9ucz8uYmxlbmRDb2xvck9wZXJhdGlvbiwgQmxlbmRPcGVyYXRpb24uQWRkKTtcclxuXHRcdHRoaXMuYmxlbmRDb2xvclNyY0ZhY3RvciA9IGRlZmF1bHRWYWx1ZShvcHRpb25zPy5ibGVuZENvbG9yU3JjRmFjdG9yLCBCbGVuZEZhY3Rvcj8uU3JjQWxwaGEpO1xyXG5cdFx0dGhpcy5ibGVuZENvbG9yRHN0RmFjdG9yID0gZGVmYXVsdFZhbHVlKG9wdGlvbnM/LmJsZW5kQ29sb3JEc3RGYWN0b3IsIEJsZW5kRmFjdG9yLk9uZU1pbnVzU3JjQWxwaGEpO1xyXG5cdFx0dGhpcy5ibGVuZEFscGhhT3BlcmF0aW9uID0gZGVmYXVsdFZhbHVlKG9wdGlvbnM/LmJsZW5kQWxwaGFPcGVyYXRpb24sIEJsZW5kT3BlcmF0aW9uLkFkZCk7XHJcblx0XHR0aGlzLmJsZW5kQWxwaGFTcmNGYWN0b3IgPSBkZWZhdWx0VmFsdWUob3B0aW9ucz8uYmxlbmRBbHBoYVNyY0ZhY3RvciwgQmxlbmRGYWN0b3IuT25lKTtcclxuXHRcdHRoaXMuYmxlbmRBbHBoYURzdEZhY3RvciA9IGRlZmF1bHRWYWx1ZShvcHRpb25zPy5ibGVuZEFscGhhRHN0RmFjdG9yLCBCbGVuZEZhY3Rvci5PbmUpO1xyXG5cdFx0dGhpcy53cml0ZU1hc2sgPSBkZWZhdWx0VmFsdWUob3B0aW9ucz8ud3JpdGVNYXNrLCBHUFVDb2xvcldyaXRlLkFsbCk7XHJcblx0fVxyXG5cdGdldEdQVVRhcmdldERlYygpIHtcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdGZvcm1hdDogdGhpcy5mb3JtYXQsXHJcblx0XHRcdGJsZW5kOiB7XHJcblx0XHRcdFx0Y29sb3I6IHtcclxuXHRcdFx0XHRcdG9wZXJhdGlvbjogdGhpcy5ibGVuZENvbG9yT3BlcmF0aW9uLFxyXG5cdFx0XHRcdFx0c3JjRmFjdG9yOiB0aGlzLmJsZW5kQ29sb3JTcmNGYWN0b3IsXHJcblx0XHRcdFx0XHRkc3RGYWN0b3I6IHRoaXMuYmxlbmRDb2xvckRzdEZhY3RvclxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0YWxwaGE6IHtcclxuXHRcdFx0XHRcdG9wZXJhdGlvbjogdGhpcy5ibGVuZEFscGhhT3BlcmF0aW9uLFxyXG5cdFx0XHRcdFx0c3JjRmFjdG9yOiB0aGlzLmJsZW5kQWxwaGFTcmNGYWN0b3IsXHJcblx0XHRcdFx0XHRkc3RGYWN0b3I6IHRoaXMuYmxlbmRBbHBoYURzdEZhY3RvclxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHRcdFx0d3JpdGVNYXNrOiB0aGlzLndyaXRlTWFza1xyXG5cdFx0fTtcclxuXHR9XHJcbn1cclxuY29uc3QgY2FjaGVWaWV3UG9ydCA9IG5ldyBWaWV3UG9ydCgpO1xyXG5jb25zdCBjYWNoZVNjaXNzb3JUZXN0ID0gbmV3IFNjaXNzb3JUZXN0KCk7XHJcbmV4cG9ydCB0eXBlIERlcHRoU3RlbmNpbFByb3BzID0ge1xyXG5cdGZvcm1hdD86IFRleHR1cmVGb3JtYXQ7XHJcblx0ZGVwdGhXcml0ZUVuYWJsZWQ/OiBib29sZWFuO1xyXG5cdGRlcHRoQ29tcGFyZT86IENvbXBhcmVGdW5jdGlvbjtcclxuXHRzdGVuY2lsUmVhZE1hc2s/OiBudW1iZXI7XHJcblx0c3RlbmNpbFdyaXRlTWFzaz86IG51bWJlcjtcclxuXHRzdGVuY2lsRnJvbnRDb21wYXJlPzogQ29tcGFyZUZ1bmN0aW9uO1xyXG5cdHN0ZW5jaWxGcm9udEZhaWxPcD86IFN0ZW5jaWxPcGVyYXRpb247XHJcblx0c3RlbmNpbEZyb250RGVwdGhGYWlsT3A/OiBTdGVuY2lsT3BlcmF0aW9uO1xyXG5cdHN0ZW5jaWxGcm9udFBhc3NPcD86IFN0ZW5jaWxPcGVyYXRpb247XHJcblxyXG5cdHN0ZW5jaWxCYWNrQ29tcGFyZT86IENvbXBhcmVGdW5jdGlvbjtcclxuXHRzdGVuY2lsQmFja0ZhaWxPcD86IFN0ZW5jaWxPcGVyYXRpb247XHJcblx0c3RlbmNpbEJhY2tEZXB0aEZhaWxPcD86IFN0ZW5jaWxPcGVyYXRpb247XHJcblx0c3RlbmNpbEJhY2tQYXNzT3A/OiBTdGVuY2lsT3BlcmF0aW9uO1xyXG5cdGRlcHRoQmlhcz86IG51bWJlcjtcclxuXHRkZXB0aEJpYXNTbG9wZVNjYWxlPzogbnVtYmVyO1xyXG5cdGRlcHRoQmlhc0NsYW1wPzogbnVtYmVyO1xyXG59O1xyXG5leHBvcnQgdHlwZSBUYXJnZXRQcm9wcyA9IHtcclxuXHRmb3JtYXQ/OiBUZXh0dXJlRm9ybWF0O1xyXG5cdGJsZW5kQ29sb3JPcGVyYXRpb24/OiBCbGVuZE9wZXJhdGlvbjtcclxuXHRibGVuZENvbG9yU3JjRmFjdG9yPzogQmxlbmRGYWN0b3I7XHJcblx0YmxlbmRDb2xvckRzdEZhY3Rvcj86IEJsZW5kRmFjdG9yO1xyXG5cdGJsZW5kQWxwaGFPcGVyYXRpb24/OiBCbGVuZE9wZXJhdGlvbjtcclxuXHRibGVuZEFscGhhU3JjRmFjdG9yPzogQmxlbmRGYWN0b3I7XHJcblx0YmxlbmRBbHBoYURzdEZhY3Rvcj86IEJsZW5kRmFjdG9yO1xyXG5cdHdyaXRlTWFzaz86IEdQVUNvbG9yV3JpdGU7XHJcbn07XHJcbmV4cG9ydCB0eXBlIFJlbmRlclN0YXRlUGFyYW1zID0ge1xyXG5cdHNjaXNzb3JUZXN0PzogU2Npc3NvclRlc3Q7XHJcblx0dmlld3BvcnQ/OiBWaWV3UG9ydDtcclxuXHR0YXJnZXRzPzogQXJyYXk8VGFyZ2V0PjtcclxuXHRkZXB0aFN0ZW5jaWw/OiBEZXB0aFN0ZW5jaWw7XHJcblx0YmxlbmRDb25zdGFudD86IEJsZW5kQ29uc3RhbnQ7XHJcblx0c3RlbmNpbFJlZmVyZW5jZT86IG51bWJlcjtcclxuXHRtdWx0aXNhbXBsZT86IE11bHRpU2FtcGxlO1xyXG5cdHByaW1pdGl2ZT86IFByaW1pdGl2ZTtcclxuXHRzdGVuY2lsRW5hYmxlZD86IGJvb2xlYW47XHJcblx0c2Npc3NvclRlc3RFbmFibGVkPzogYm9vbGVhbjtcclxufTtcclxuZXhwb3J0IHR5cGUgQmluZFJlbmRlclN0YXRlID0ge1xyXG5cdHBhc3NFbmNvZGVyOiBHUFVSZW5kZXJQYXNzRW5jb2RlcjtcclxuXHR2aWV3UG9ydDogVmlld1BvcnQ7XHJcblx0c2Npc3NvclRlc3Q6IFNjaXNzb3JUZXN0O1xyXG59O1xyXG4iLCJpbXBvcnQgeyBUZXh0dXJlVXNhZ2UgfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVDb25zdGFudFwiO1xyXG5pbXBvcnQgeyBHUFVDYW52YXNDb21wb3NpdGluZ0FscGhhTW9kZSwgQ29udGV4dE9wdGlvbnMgfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVUeXBlc1wiO1xyXG5pbXBvcnQgeyBTaGFkZXJTb3VyY2UgfSBmcm9tIFwiLi4vc2hhZGVyL1NoYWRlclNvdXJjZVwiO1xyXG5pbXBvcnQgeyBsb2FkR2xzbGFuZ01vZHVsZSB9IGZyb20gXCIuLi91dGlscy9sb2FkR2xzbGFuZ01vZHVsZVwiO1xyXG5pbXBvcnQgeyBNaXBtYXBHZW5lcmF0b3IgfSBmcm9tIFwiLi4vdXRpbHMvTWlwbWFwR2VuZXJhdG9yXCI7XHJcbmltcG9ydCB7IFNjaXNzb3JUZXN0LCBWaWV3UG9ydCB9IGZyb20gXCIuL1JlbmRlclN0YXRlXCI7XHJcblxyXG5jbGFzcyBDb250ZXh0IHtcclxuXHRwdWJsaWMgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcclxuXHJcblx0cHVibGljIGNvbnRleHQ6IEdQVUNhbnZhc0NvbnRleHQ7XHJcblxyXG5cdHB1YmxpYyBwaXhlbFJhdGlvOiBudW1iZXI7XHJcblxyXG5cdHB1YmxpYyBkZXZpY2U6IEdQVURldmljZTtcclxuXHJcblx0cHJpdmF0ZSBhZGFwdGVyOiBHUFVBZGFwdGVyO1xyXG5cclxuXHRwdWJsaWMgcHJlc2VudGF0aW9uU2l6ZTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9O1xyXG5cclxuXHRwdWJsaWMgcHJlc2VudGF0aW9uRm9ybWF0OiBHUFVUZXh0dXJlRm9ybWF0O1xyXG5cclxuXHRwdWJsaWMgbWlwbWFwVG9vbHM6IE1pcG1hcEdlbmVyYXRvcjtcclxuXHJcblx0cHJpdmF0ZSBfdmlld1BvcnQ6IFZpZXdQb3J0O1xyXG5cclxuXHRwcml2YXRlIF9zY2lzc29yVGVzdDogU2Npc3NvclRlc3Q7XHJcblxyXG5cdHByaXZhdGUgX3VzZUdMU0w6IGJvb2xlYW47IC8vIHdpbGwgZ2xzbCBzaGFkZXJzIGJlIHVzZWRcclxuXHJcblx0cHVibGljIGdldCB2aWV3UG9ydCgpOiBWaWV3UG9ydCB7XHJcblx0XHRyZXR1cm4gdGhpcy5fdmlld1BvcnQ7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZ2V0IHNjaXNzb3JUZXN0KCk6IFNjaXNzb3JUZXN0IHtcclxuXHRcdHJldHVybiB0aGlzLl9zY2lzc29yVGVzdDtcclxuXHR9XHJcblx0Y29uc3RydWN0b3IoeyBjYW52YXMsIGNvbnRhaW5lciwgY29udGV4dCwgcGl4ZWxSYXRpbywgdXNlR0xTTCA9IGZhbHNlIH06IENvbnRleHRPcHRpb25zKSB7XHJcblx0XHRpZiAoIWNvbnRhaW5lci5jbGllbnRXaWR0aCB8fCAhY29udGFpbmVyLmNsaWVudEhlaWdodCkgdGhyb3cgbmV3IEVycm9yKFwiY29udGFpbmVyIHdpZHRoIG9yIGhlaWdodCBpbGxlZ2FsaXR5XCIpO1xyXG5cdFx0dGhpcy5jYW52YXMgPSBjYW52YXMgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuXHRcdC8vIHRoaXMuY2FudmFzLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XHJcblx0XHR0aGlzLnBpeGVsUmF0aW8gPSBwaXhlbFJhdGlvIHx8IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XHJcblx0XHRjb25zdCB3aWR0aCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aCAqIHRoaXMucGl4ZWxSYXRpbztcclxuXHRcdGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQgKiB0aGlzLnBpeGVsUmF0aW87XHJcblx0XHR0aGlzLmNhbnZhcy53aWR0aCA9IHdpZHRoO1xyXG5cdFx0dGhpcy5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cdFx0dGhpcy5jYW52YXMuc3R5bGUud2lkdGggPSBjb250YWluZXIuY2xpZW50V2lkdGggKyBcInB4XCI7XHJcblx0XHR0aGlzLmNhbnZhcy5zdHlsZS5oZWlnaHQgPSBjb250YWluZXIuY2xpZW50SGVpZ2h0ICsgXCJweFwiO1xyXG5cdFx0Y29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY2FudmFzKTtcclxuXHRcdHRoaXMuY29udGV4dCA9IGNvbnRleHQgfHwgKHRoaXMuY2FudmFzLmdldENvbnRleHQoXCJ3ZWJncHVcIikgYXMgR1BVQ2FudmFzQ29udGV4dCk7XHJcblx0XHR0aGlzLl91c2VHTFNMID0gdXNlR0xTTDtcclxuXHRcdHRoaXMuZGV2aWNlID0gdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGFzeW5jIGluaXQoXHJcblx0XHRyZXF1ZXN0QWRhcHRlciA9IHt9LFxyXG5cdFx0ZGV2aWNlRGVzY3JpcHRvciA9IHt9LFxyXG5cdFx0cHJlc2VudGF0aW9uQ29udGV4dERlc2NyaXB0b3IgPSB7fVxyXG5cdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0aWYgKCF0aGlzLmNvbnRleHQpIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBpbnN0YW50aWF0ZSBcIndlYmdwdVwiIGNvbnRleHQuYCk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCFuYXZpZ2F0b3IuZ3B1KSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIFwibmF2aWdhdG9yLmdwdVwiLmApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLmFkYXB0ZXIgPSBhd2FpdCBuYXZpZ2F0b3IuZ3B1LnJlcXVlc3RBZGFwdGVyKCk7XHJcblx0XHRcdHRoaXMuZGV2aWNlID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlcXVlc3REZXZpY2UoKTtcclxuXHRcdFx0dGhpcy5wcmVzZW50YXRpb25TaXplID0ge1xyXG5cdFx0XHRcdHdpZHRoOiB0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCAqIHRoaXMucGl4ZWxSYXRpbyxcclxuXHRcdFx0XHRoZWlnaHQ6IHRoaXMuY2FudmFzLmNsaWVudEhlaWdodCAqIHRoaXMucGl4ZWxSYXRpbyxcclxuXHRcdFx0XHRkZXB0aDogMVxyXG5cdFx0XHR9O1xyXG5cdFx0XHR0aGlzLnByZXNlbnRhdGlvbkZvcm1hdCA9IG5hdmlnYXRvci5ncHUuZ2V0UHJlZmVycmVkQ2FudmFzRm9ybWF0KCk7XHJcblx0XHRcdHRoaXMuZGV2aWNlLmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmNhcHR1cmVkZXJyb3JcIiwgKGVycm9yKSA9PiB7XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvcihlcnJvcik7XHJcblx0XHRcdFx0Ly8gU3RhdGUuZXJyb3IgPSB0cnVlO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0aWYgKHRoaXMuX3VzZUdMU0wpIFNoYWRlclNvdXJjZS5nbHNsYW5nID0gYXdhaXQgbG9hZEdsc2xhbmdNb2R1bGUoKTtcclxuXHRcdFx0dGhpcy5taXBtYXBUb29scyA9IG5ldyBNaXBtYXBHZW5lcmF0b3IodGhpcy5kZXZpY2UpO1xyXG5cdFx0XHR0aGlzLmNvbnRleHQuY29uZmlndXJlKHtcclxuXHRcdFx0XHRkZXZpY2U6IHRoaXMuZGV2aWNlLFxyXG5cdFx0XHRcdGZvcm1hdDogdGhpcy5wcmVzZW50YXRpb25Gb3JtYXQsXHJcblx0XHRcdFx0dXNhZ2U6IFRleHR1cmVVc2FnZS5SZW5kZXJBdHRhY2htZW50LFxyXG5cdFx0XHRcdGFscGhhTW9kZTogXCJwcmVtdWx0aXBsaWVkXCIsXHJcblx0XHRcdFx0Li4ucHJlc2VudGF0aW9uQ29udGV4dERlc2NyaXB0b3JcclxuXHRcdFx0fSk7XHJcblx0XHRcdHRoaXMuX3ZpZXdQb3J0ID0gbmV3IFZpZXdQb3J0KFxyXG5cdFx0XHRcdDAsXHJcblx0XHRcdFx0MCxcclxuXHRcdFx0XHR0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCAqIHRoaXMucGl4ZWxSYXRpbyxcclxuXHRcdFx0XHR0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQgKiB0aGlzLnBpeGVsUmF0aW9cclxuXHRcdFx0KTtcclxuXHRcdFx0dGhpcy5fc2Npc3NvclRlc3QgPSBuZXcgU2Npc3NvclRlc3QoXHJcblx0XHRcdFx0MCxcclxuXHRcdFx0XHQwLFxyXG5cdFx0XHRcdHRoaXMuY2FudmFzLmNsaWVudFdpZHRoICogdGhpcy5waXhlbFJhdGlvLFxyXG5cdFx0XHRcdHRoaXMuY2FudmFzLmNsaWVudEhlaWdodCAqIHRoaXMucGl4ZWxSYXRpb1xyXG5cdFx0XHQpO1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlcnJvcik7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblx0cHVibGljIHNldFZpZXdQb3J0KHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG5cdFx0dGhpcy5fdmlld1BvcnQuc2V0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHJlc2V0Vmlld1BvcnRUb0Z1bGxDYW52YXMoKSB7XHJcblx0XHR0aGlzLl92aWV3UG9ydC5zZXQoMCwgMCwgdGhpcy5jYW52YXMuY2xpZW50V2lkdGggKiB0aGlzLnBpeGVsUmF0aW8sIHRoaXMuY2FudmFzLmNsaWVudEhlaWdodCAqIHRoaXMucGl4ZWxSYXRpbyk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgc2V0U2Npc3NvclRlc3QoeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XHJcblx0XHR0aGlzLl9zY2lzc29yVGVzdC5zZXQoeCwgeSwgd2lkdGgsIGhlaWdodCk7XHJcblx0fVxyXG5cdHB1YmxpYyByZXNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHByZXNlbnRhdGlvbkNvbnRleHREZXNjcmlwdG9yID0ge30pOiB2b2lkIHtcclxuXHRcdGNvbnN0IHcgPSB3aWR0aCAqIHRoaXMucGl4ZWxSYXRpbztcclxuXHRcdGNvbnN0IGggPSBoZWlnaHQgKiB0aGlzLnBpeGVsUmF0aW87XHJcblx0XHR0aGlzLmNhbnZhcy5zdHlsZS53aWR0aCA9IHcgKyBcInB4XCI7XHJcblx0XHR0aGlzLmNhbnZhcy5zdHlsZS5oZWlnaHQgPSBoICsgXCJweFwiO1xyXG5cdFx0dGhpcy5jYW52YXMud2lkdGggPSB3O1xyXG5cdFx0dGhpcy5jYW52YXMuaGVpZ2h0ID0gaDtcclxuXHRcdHRoaXMucHJlc2VudGF0aW9uU2l6ZSA9IHtcclxuXHRcdFx0d2lkdGg6IHcsXHJcblx0XHRcdGhlaWdodDogaCxcclxuXHRcdFx0ZGVwdGg6IDFcclxuXHRcdH07XHJcblx0XHR0aGlzLmNvbnRleHQuY29uZmlndXJlKHtcclxuXHRcdFx0ZGV2aWNlOiB0aGlzLmRldmljZSxcclxuXHRcdFx0Zm9ybWF0OiBuYXZpZ2F0b3IuZ3B1LmdldFByZWZlcnJlZENhbnZhc0Zvcm1hdCgpLFxyXG5cdFx0XHR1c2FnZTogVGV4dHVyZVVzYWdlLlJlbmRlckF0dGFjaG1lbnQsXHJcblx0XHRcdGFscGhhTW9kZTogR1BVQ2FudmFzQ29tcG9zaXRpbmdBbHBoYU1vZGUuUHJlbXVsdGlwbGllZCxcclxuXHRcdFx0Li4ucHJlc2VudGF0aW9uQ29udGV4dERlc2NyaXB0b3JcclxuXHRcdH0pO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29udGV4dDtcclxuIiwiaW1wb3J0IHsgU3RvcmFnZVRleHR1cmVBY2Nlc3MsIFRleHR1cmVGb3JtYXQgfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVDb25zdGFudFwiO1xyXG5pbXBvcnQgeyBXZWJHUFVUZXh0dXJlUHJvcHMsIEltYWdlRGF0YSB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVVR5cGVzXCI7XHJcbmltcG9ydCBkZWZhdWx0VmFsdWUgZnJvbSBcIi4uL3V0aWxzL2RlZmF1bHRWYWx1ZVwiO1xyXG5pbXBvcnQgeyBNaXBtYXBHZW5lcmF0b3IgfSBmcm9tIFwiLi4vdXRpbHMvTWlwbWFwR2VuZXJhdG9yXCI7XHJcbmltcG9ydCBDb250ZXh0IGZyb20gXCIuL0NvbnRleHRcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRleHR1cmUge1xyXG5cdFt4OiBzdHJpbmddOiBhbnk7XHJcblx0cHJpdmF0ZSBfdGV4dHVyZVZpZXc6IEdQVVRleHR1cmVWaWV3O1xyXG5cdHB1YmxpYyBncHVUZXh0dXJlPzogR1BVVGV4dHVyZTtcclxuXHRwdWJsaWMgbWlwTGV2ZWxDb3VudD86IG51bWJlcjtcclxuXHRwdWJsaWMgY29udGV4dD86IENvbnRleHQ7XHJcblx0cHVibGljIGRldmljZT86IEdQVURldmljZTtcclxuXHRwdWJsaWMgdGV4dHVyZVByb3A/OiBXZWJHUFVUZXh0dXJlUHJvcHM7XHJcblx0cHVibGljIGRpcnR5OiBib29sZWFuO1xyXG5cdHB1YmxpYyBmaXhlZFNpemU6IGJvb2xlYW47XHJcblx0cHVibGljIHN0YXRpYyBtaXBtYXBUb29sczogTWlwbWFwR2VuZXJhdG9yO1xyXG5cdGNvbnN0cnVjdG9yKHRleHR1cmVQcm9wOiBXZWJHUFVUZXh0dXJlUHJvcHMpIHtcclxuXHRcdHRoaXMudGV4dHVyZVByb3AgPSBPYmplY3QuYXNzaWduKFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0Zm9ybWF0OiBUZXh0dXJlRm9ybWF0LlJHQkE4VW5vcm0sXHJcblx0XHRcdFx0dXNhZ2U6IEdQVVRleHR1cmVVc2FnZS5URVhUVVJFX0JJTkRJTkcgfCBHUFVUZXh0dXJlVXNhZ2UuQ09QWV9EU1QgfCBHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlQsXHJcblx0XHRcdFx0ZGF0YUlzVGV4dHVyZTogZmFsc2VcclxuXHRcdFx0fSxcclxuXHRcdFx0dGV4dHVyZVByb3BcclxuXHRcdCk7XHJcblx0XHR0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuXHRcdHRoaXMuZml4ZWRTaXplID0gdGV4dHVyZVByb3AuZml4ZWRTaXplIHx8IGZhbHNlO1xyXG5cdH1cclxuXHRnZXQgbGF5b3V0VHlwZSgpIHtcclxuXHRcdGNvbnN0IHsgdmlld0Zvcm1hdHMsIHNhbXBsZVR5cGUsIHNhbXBsZUNvdW50IH0gPSB0aGlzLnRleHR1cmVQcm9wO1xyXG5cdFx0Ly8gY29uc3RcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdHNhbXBsZVR5cGU6IGRlZmF1bHRWYWx1ZShzYW1wbGVUeXBlLCBcImZsb2F0XCIpLFxyXG5cdFx0XHR2aWV3RGltZW5zaW9uOiBkZWZhdWx0VmFsdWUodmlld0Zvcm1hdHMsIFwiMmRcIiksXHJcblx0XHRcdG11bHRpc2FtcGxlZDogc2FtcGxlQ291bnQgJiYgc2FtcGxlQ291bnQgPiAxID8gdHJ1ZSA6IGZhbHNlXHJcblx0XHR9O1xyXG5cdH1cclxuXHRnZXQgc3RvcmFnZVRleHR1cmVMYXlvdXRUeXBlKCkge1xyXG5cdFx0Y29uc3QgeyBhY2Nlc3MgPSBTdG9yYWdlVGV4dHVyZUFjY2Vzcy5Xcml0ZU9ubHksIHZpZXdGb3JtYXRzLCBmb3JtYXQgfSA9IHRoaXMudGV4dHVyZVByb3A7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR2aWV3RGltZW5zaW9uOiBkZWZhdWx0VmFsdWUodmlld0Zvcm1hdHMsIFwiMmRcIiksXHJcblx0XHRcdGFjY2VzcyxcclxuXHRcdFx0Zm9ybWF0XHJcblx0XHR9O1xyXG5cdH1cclxuXHRnZXQgdGV4dHVyZVZpZXcoKSB7XHJcblx0XHRpZiAoIXRoaXMuX3RleHR1cmVWaWV3KVxyXG5cdFx0XHR0aGlzLl90ZXh0dXJlVmlldyA9IHRoaXMuZ3B1VGV4dHVyZS5jcmVhdGVWaWV3KHtcclxuXHRcdFx0XHRkaW1lbnNpb246IDxHUFVUZXh0dXJlVmlld0RpbWVuc2lvbj5kZWZhdWx0VmFsdWUodGhpcy50ZXh0dXJlUHJvcC52aWV3Rm9ybWF0cywgXCIyZFwiKVxyXG5cdFx0XHR9KTtcclxuXHRcdHJldHVybiB0aGlzLl90ZXh0dXJlVmlldztcclxuXHR9XHJcblx0dXBkYXRlKGRldmljZTogR1BVRGV2aWNlKSB7XHJcblx0XHRpZiAoIXRoaXMuZGV2aWNlKSB0aGlzLmRldmljZSA9IGRldmljZTtcclxuXHRcdGlmICh0aGlzLmRpcnR5KSB7XHJcblx0XHRcdHRoaXMuY2hlY2tOZWVkQ3JlYXRlVGV4dHVyZSgpO1xyXG5cdFx0XHR0aGlzLmRpcnR5ID0gZmFsc2U7XHJcblx0XHRcdGlmICh0aGlzLnRleHR1cmVQcm9wLmRhdGEpIHtcclxuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnRleHR1cmVQcm9wLmRhdGEpKSB7XHJcblx0XHRcdFx0XHR0aGlzLnRleHR1cmVQcm9wLmRhdGEuZm9yRWFjaCgoaW1hZ2VEYXRhKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2V0RGF0YShpbWFnZURhdGEpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHRoaXMuc2V0RGF0YSh0aGlzLnRleHR1cmVQcm9wLmRhdGEpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy50ZXh0dXJlUHJvcC5uZWVkTWlwTWFwKSB7XHJcblx0XHRcdFx0aWYgKCFUZXh0dXJlLm1pcG1hcFRvb2xzKSBUZXh0dXJlLm1pcG1hcFRvb2xzID0gbmV3IE1pcG1hcEdlbmVyYXRvcih0aGlzLmRldmljZSk7XHJcblx0XHRcdFx0dGhpcy5ncHVUZXh0dXJlID0gVGV4dHVyZS5taXBtYXBUb29scy5nZW5lcmF0ZU1pcG1hcCh0aGlzKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRwcml2YXRlIHNldERhdGEob3B0aW9uczogSW1hZ2VEYXRhKSB7XHJcblx0XHRjb25zdCB7XHJcblx0XHRcdHNvdXJjZSxcclxuXHRcdFx0d2lkdGggPSBvcHRpb25zLnNvdXJjZS53aWR0aCxcclxuXHRcdFx0aGVpZ2h0ID0gb3B0aW9ucy5zb3VyY2UuaGVpZ2h0LFxyXG5cdFx0XHRkZXB0aCA9IDEsXHJcblx0XHRcdHNvdXJjZVggPSAwLFxyXG5cdFx0XHRzb3VyY2VZID0gMCxcclxuXHRcdFx0bWlwTGV2ZWwgPSAwLFxyXG5cdFx0XHR4ID0gMCxcclxuXHRcdFx0eSA9IDAsXHJcblx0XHRcdHogPSAwLFxyXG5cdFx0XHRhc3BlY3QgPSBcImFsbFwiLFxyXG5cdFx0XHRjb2xvclNwYWNlID0gXCJzcmdiXCIsXHJcblx0XHRcdHByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlXHJcblx0XHR9ID0gb3B0aW9ucztcclxuXHRcdGlmIChzb3VyY2UgaW5zdGFuY2VvZiBUZXh0dXJlKSB7XHJcblx0XHRcdGxldCBjb21tYW5kRW5jb2RlciA9IHRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCk7XHJcblx0XHRcdGNvbW1hbmRFbmNvZGVyLmNvcHlUZXh0dXJlVG9UZXh0dXJlKFxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdHRleHR1cmU6IDxHUFVUZXh0dXJlPnNvdXJjZS5ncHVUZXh0dXJlLFxyXG5cdFx0XHRcdFx0b3JpZ2luOiBbc291cmNlWCwgc291cmNlWV1cclxuXHRcdFx0XHRcdC8vIGFzcGVjdFxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0dGV4dHVyZTogdGhpcy5ncHVUZXh0dXJlLFxyXG5cdFx0XHRcdFx0b3JpZ2luOiB7IHg6IDAsIHk6IDAsIHogfSxcclxuXHRcdFx0XHRcdG1pcExldmVsXHJcblx0XHRcdFx0XHQvLyBhc3BlY3RcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdHdpZHRoLFxyXG5cdFx0XHRcdFx0aGVpZ2h0LFxyXG5cdFx0XHRcdFx0ZGVwdGhPckFycmF5TGF5ZXJzOiAxXHJcblx0XHRcdFx0fVxyXG5cdFx0XHQpO1xyXG5cdFx0XHR0aGlzLmRldmljZS5xdWV1ZS5zdWJtaXQoW2NvbW1hbmRFbmNvZGVyLmZpbmlzaCgpXSk7XHJcblx0XHRcdGNvbW1hbmRFbmNvZGVyID0gbnVsbDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuZGV2aWNlLnF1ZXVlLmNvcHlFeHRlcm5hbEltYWdlVG9UZXh0dXJlKFxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdHNvdXJjZSxcclxuXHRcdFx0XHRcdG9yaWdpbjogW3NvdXJjZVgsIHNvdXJjZVldXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHR0ZXh0dXJlOiB0aGlzLmdwdVRleHR1cmUsXHJcblx0XHRcdFx0XHRvcmlnaW46IFt4LCB5LCB6XSxcclxuXHRcdFx0XHRcdG1pcExldmVsLFxyXG5cdFx0XHRcdFx0YXNwZWN0LFxyXG5cdFx0XHRcdFx0Y29sb3JTcGFjZSxcclxuXHRcdFx0XHRcdHByZW11bHRpcGxpZWRBbHBoYVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0W3dpZHRoLCBoZWlnaHQsIGRlcHRoXVxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRzZXRTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBkZXB0aD86IG51bWJlcikge1xyXG5cdFx0aWYgKHRoaXMuZml4ZWRTaXplKSByZXR1cm47XHJcblx0XHR0aGlzLnRleHR1cmVQcm9wLnNpemUud2lkdGggPSB3aWR0aDtcclxuXHRcdHRoaXMudGV4dHVyZVByb3Auc2l6ZS5oZWlnaHQgPSBoZWlnaHQ7XHJcblx0XHRpZiAoZGVwdGgpIHRoaXMudGV4dHVyZVByb3Auc2l6ZS5kZXB0aCA9IGRlcHRoO1xyXG5cdFx0dGhpcy5kaXJ0eSA9IHRydWU7XHJcblx0fVxyXG5cdGRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHR0aGlzLmdwdVRleHR1cmUuZGVzdHJveSgpO1xyXG5cdH1cclxuXHRwcml2YXRlIGNyZWF0ZUdQVVRleHR1cmUoKSB7XHJcblx0XHRpZiAodHlwZW9mIHRoaXMudGV4dHVyZVByb3AuZm9ybWF0ID09PSBcIm51bWJlclwiKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIm51bWJlciBmb3JtYXRcIik7XHJcblx0XHR9XHJcblx0XHRjb25zdCB7IHdpZHRoLCBoZWlnaHQsIGRlcHRoIH0gPSB0aGlzLnRleHR1cmVQcm9wLnNpemU7XHJcblx0XHRyZXR1cm4gdGhpcy5kZXZpY2UuY3JlYXRlVGV4dHVyZSh7XHJcblx0XHRcdGxhYmVsOiB0aGlzLnRleHR1cmVQcm9wPy5sYWJlbCB8fCBcInVuZGVmaW5lZFwiLFxyXG5cdFx0XHRzaXplOiBbd2lkdGgsIGhlaWdodCwgZGVwdGhdLFxyXG5cdFx0XHRkaW1lbnNpb246IHRoaXMudGV4dHVyZVByb3AuZGltZW5zaW9uIHx8IFwiMmRcIixcclxuXHRcdFx0Zm9ybWF0OiB0aGlzLnRleHR1cmVQcm9wLmZvcm1hdCBhcyBHUFVUZXh0dXJlRm9ybWF0LFxyXG5cdFx0XHR1c2FnZTogdGhpcy50ZXh0dXJlUHJvcC51c2FnZSxcclxuXHRcdFx0bWlwTGV2ZWxDb3VudDogdGhpcy50ZXh0dXJlUHJvcC5taXBMZXZlbENvdW50IHx8IDEsXHJcblx0XHRcdHNhbXBsZUNvdW50OiB0aGlzLnRleHR1cmVQcm9wLnNhbXBsZUNvdW50IHx8IDFcclxuXHRcdH0pO1xyXG5cdH1cclxuXHRwcml2YXRlIGNoZWNrTmVlZENyZWF0ZVRleHR1cmUoKSB7XHJcblx0XHRjb25zdCB7IHdpZHRoLCBoZWlnaHQsIGRlcHRoIH0gPSB0aGlzLnRleHR1cmVQcm9wLnNpemU7XHJcblx0XHRpZiAodGhpcy5ncHVUZXh0dXJlKSB7XHJcblx0XHRcdGlmICh3aWR0aCAhPSB0aGlzLmdwdVRleHR1cmUud2lkdGggfHwgaGVpZ2h0ICE9IHRoaXMuZ3B1VGV4dHVyZS5oZWlnaHQpIHtcclxuXHRcdFx0XHR0aGlzLl90ZXh0dXJlVmlldyA9IHVuZGVmaW5lZDtcclxuXHRcdFx0XHR0aGlzLmdwdVRleHR1cmUuZGVzdHJveSgpO1xyXG5cdFx0XHRcdHRoaXMuZ3B1VGV4dHVyZSA9IHRoaXMuY3JlYXRlR1BVVGV4dHVyZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmdwdVRleHR1cmUgPSB0aGlzLmNyZWF0ZUdQVVRleHR1cmUoKTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwiY2xhc3MgU2FtcGxlciB7XHJcblx0cHVibGljIGdwdVNhbXBsZXI6IEdQVVNhbXBsZXI7XHJcblx0cHVibGljIGxheW91dFR5cGU6IEdQVVNhbXBsZXJCaW5kaW5nTGF5b3V0O1xyXG5cclxuXHRzdGF0aWMgYmFzZVNhbXBsZXIgPSBuZXcgU2FtcGxlcih7XHJcblx0XHRtYWdGaWx0ZXI6IFwibGluZWFyXCIsXHJcblx0XHRtaW5GaWx0ZXI6IFwibGluZWFyXCJcclxuXHR9KTtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwdWJsaWMgZGVzY3JpcHRvcj86IEdQVVNhbXBsZXJEZXNjcmlwdG9yLFxyXG5cdFx0bGF5b3V0VHlwZTogR1BVU2FtcGxlckJpbmRpbmdMYXlvdXQgPSB7XHJcblx0XHRcdHR5cGU6IFwiZmlsdGVyaW5nXCJcclxuXHRcdH1cclxuXHQpIHtcclxuXHRcdHRoaXMuZGVzY3JpcHRvciA9IHt9O1xyXG5cdFx0T2JqZWN0LmFzc2lnbihcclxuXHRcdFx0dGhpcy5kZXNjcmlwdG9yLFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0bWFnRmlsdGVyOiBcImxpbmVhclwiLFxyXG5cdFx0XHRcdG1pbkZpbHRlcjogXCJsaW5lYXJcIixcclxuXHRcdFx0XHQvLyBtaXBtYXBGaWx0ZXI6IFwibGluZWFyXCIsXHJcblx0XHRcdFx0YWRkcmVzc01vZGVVOiBcImNsYW1wLXRvLWVkZ2VcIixcclxuXHRcdFx0XHRhZGRyZXNzTW9kZVY6IFwiY2xhbXAtdG8tZWRnZVwiXHJcblx0XHRcdFx0Ly8gYWRkcmVzc01vZGVXOiBcImNsYW1wLXRvLWVkZ2VcIixcclxuXHRcdFx0fSxcclxuXHRcdFx0ZGVzY3JpcHRvclxyXG5cdFx0KTtcclxuXHRcdHRoaXMubGF5b3V0VHlwZSA9IGxheW91dFR5cGU7XHJcblx0fVxyXG5cdHVwZGF0ZShkZXZpY2U6IEdQVURldmljZSkge1xyXG5cdFx0aWYgKCF0aGlzLmdwdVNhbXBsZXIpIHRoaXMuZ3B1U2FtcGxlciA9IGRldmljZS5jcmVhdGVTYW1wbGVyKHRoaXMuZGVzY3JpcHRvcik7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTYW1wbGVyO1xyXG4iLCJpbXBvcnQgeyBBdHRhY2htZW50T3B0aW9ucyB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVVR5cGVzXCI7XHJcbmltcG9ydCBUZXh0dXJlIGZyb20gXCIuL1RleHR1cmVcIjtcclxuXHJcbmNsYXNzIEF0dGFjaG1lbnQge1xyXG5cdHB1YmxpYyBvcDogR1BVTG9hZE9wID0gXCJjbGVhclwiO1xyXG5cdHB1YmxpYyBzdG9yZU9wOiBHUFVTdG9yZU9wID0gXCJzdG9yZVwiO1xyXG5cclxuXHRwdWJsaWMgdGV4dHVyZT86IFRleHR1cmU7XHJcblx0cHVibGljIHJlc29sdmVUYXJnZXQ/OiBUZXh0dXJlO1xyXG5cdHB1YmxpYyB0ZXh0dXJlVmlldz86ICgpID0+IEdQVVRleHR1cmVWaWV3O1xyXG5cdHB1YmxpYyByZWFkT25seT86IGJvb2xlYW47XHJcblxyXG5cdGNvbnN0cnVjdG9yKHB1YmxpYyB2YWx1ZTogR1BVQ29sb3JEaWN0IHwgR1BVQ29sb3IgfCBudW1iZXIsIG9wdGlvbnM/OiBBdHRhY2htZW50T3B0aW9ucykge1xyXG5cdFx0T2JqZWN0LmFzc2lnbih0aGlzLCBvcHRpb25zKTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEF0dGFjaG1lbnQ7XHJcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlZmluZWQodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGw7XG59XG4iLCIvKlxuICBodHRwczovL2dpdGh1Yi5jb20vYmFua3NlYW4gd3JhcHBlZCBNYWtvdG8gTWF0c3Vtb3RvIGFuZCBUYWt1amkgTmlzaGltdXJhJ3MgY29kZSBpbiBhIG5hbWVzcGFjZVxuICBzbyBpdCdzIGJldHRlciBlbmNhcHN1bGF0ZWQuIE5vdyB5b3UgY2FuIGhhdmUgbXVsdGlwbGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzXG4gIGFuZCB0aGV5IHdvbid0IHN0b21wIGFsbCBvdmVyIGVhY2hvdGhlcidzIHN0YXRlLlxuXG4gIElmIHlvdSB3YW50IHRvIHVzZSB0aGlzIGFzIGEgc3Vic3RpdHV0ZSBmb3IgTWF0aC5yYW5kb20oKSwgdXNlIHRoZSByYW5kb20oKVxuICBtZXRob2QgbGlrZSBzbzpcblxuICB2YXIgbSA9IG5ldyBNZXJzZW5uZVR3aXN0ZXIoKTtcbiAgdmFyIHJhbmRvbU51bWJlciA9IG0ucmFuZG9tKCk7XG5cbiAgWW91IGNhbiBhbHNvIGNhbGwgdGhlIG90aGVyIGdlbnJhbmRfe2Zvb30oKSBtZXRob2RzIG9uIHRoZSBpbnN0YW5jZS5cblxuICBJZiB5b3Ugd2FudCB0byB1c2UgYSBzcGVjaWZpYyBzZWVkIGluIG9yZGVyIHRvIGdldCBhIHJlcGVhdGFibGUgcmFuZG9tXG4gIHNlcXVlbmNlLCBwYXNzIGFuIGludGVnZXIgaW50byB0aGUgY29uc3RydWN0b3I6XG5cbiAgdmFyIG0gPSBuZXcgTWVyc2VubmVUd2lzdGVyKDEyMyk7XG5cbiAgYW5kIHRoYXQgd2lsbCBhbHdheXMgcHJvZHVjZSB0aGUgc2FtZSByYW5kb20gc2VxdWVuY2UuXG5cbiAgU2VhbiBNY0N1bGxvdWdoIChiYW5rc2VhbkBnbWFpbC5jb20pXG4qL1xuXG4vKlxuICAgQSBDLXByb2dyYW0gZm9yIE1UMTk5MzcsIHdpdGggaW5pdGlhbGl6YXRpb24gaW1wcm92ZWQgMjAwMi8xLzI2LlxuICAgQ29kZWQgYnkgVGFrdWppIE5pc2hpbXVyYSBhbmQgTWFrb3RvIE1hdHN1bW90by5cblxuICAgQmVmb3JlIHVzaW5nLCBpbml0aWFsaXplIHRoZSBzdGF0ZSBieSB1c2luZyBpbml0X3NlZWQoc2VlZClcbiAgIG9yIGluaXRfYnlfYXJyYXkoaW5pdF9rZXksIGtleV9sZW5ndGgpLlxuXG4gICBDb3B5cmlnaHQgKEMpIDE5OTcgLSAyMDAyLCBNYWtvdG8gTWF0c3Vtb3RvIGFuZCBUYWt1amkgTmlzaGltdXJhLFxuICAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnNcbiAgIGFyZSBtZXQ6XG5cbiAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXG4gICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuICAgICAzLiBUaGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlXG4gICAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlblxuICAgICAgICBwZXJtaXNzaW9uLlxuXG4gICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gICBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUlxuICAgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsXG4gICBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sXG4gICBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1JcbiAgIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0ZcbiAgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcbiAgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuXG5cbiAgIEFueSBmZWVkYmFjayBpcyB2ZXJ5IHdlbGNvbWUuXG4gICBodHRwOi8vd3d3Lm1hdGguc2NpLmhpcm9zaGltYS11LmFjLmpwL35tLW1hdC9NVC9lbXQuaHRtbFxuICAgZW1haWw6IG0tbWF0IEAgbWF0aC5zY2kuaGlyb3NoaW1hLXUuYWMuanAgKHJlbW92ZSBzcGFjZSlcbiovXG5cbnZhciBNZXJzZW5uZVR3aXN0ZXIgPSBmdW5jdGlvbihzZWVkKSB7XG5cdGlmIChzZWVkID09IHVuZGVmaW5lZCkge1xuXHRcdHNlZWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblx0fVxuXG5cdC8qIFBlcmlvZCBwYXJhbWV0ZXJzICovXG5cdHRoaXMuTiA9IDYyNDtcblx0dGhpcy5NID0gMzk3O1xuXHR0aGlzLk1BVFJJWF9BID0gMHg5OTA4YjBkZjsgICAvKiBjb25zdGFudCB2ZWN0b3IgYSAqL1xuXHR0aGlzLlVQUEVSX01BU0sgPSAweDgwMDAwMDAwOyAvKiBtb3N0IHNpZ25pZmljYW50IHctciBiaXRzICovXG5cdHRoaXMuTE9XRVJfTUFTSyA9IDB4N2ZmZmZmZmY7IC8qIGxlYXN0IHNpZ25pZmljYW50IHIgYml0cyAqL1xuXG5cdHRoaXMubXQgPSBuZXcgQXJyYXkodGhpcy5OKTsgLyogdGhlIGFycmF5IGZvciB0aGUgc3RhdGUgdmVjdG9yICovXG5cdHRoaXMubXRpPXRoaXMuTisxOyAvKiBtdGk9PU4rMSBtZWFucyBtdFtOXSBpcyBub3QgaW5pdGlhbGl6ZWQgKi9cblxuXHRpZiAoc2VlZC5jb25zdHJ1Y3RvciA9PSBBcnJheSkge1xuXHRcdHRoaXMuaW5pdF9ieV9hcnJheShzZWVkLCBzZWVkLmxlbmd0aCk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0dGhpcy5pbml0X3NlZWQoc2VlZCk7XG5cdH1cbn1cblxuLyogaW5pdGlhbGl6ZXMgbXRbTl0gd2l0aCBhIHNlZWQgKi9cbi8qIG9yaWdpbiBuYW1lIGluaXRfZ2VucmFuZCAqL1xuTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5pbml0X3NlZWQgPSBmdW5jdGlvbihzKSB7XG5cdHRoaXMubXRbMF0gPSBzID4+PiAwO1xuXHRmb3IgKHRoaXMubXRpPTE7IHRoaXMubXRpPHRoaXMuTjsgdGhpcy5tdGkrKykge1xuXHRcdHZhciBzID0gdGhpcy5tdFt0aGlzLm10aS0xXSBeICh0aGlzLm10W3RoaXMubXRpLTFdID4+PiAzMCk7XG5cdFx0dGhpcy5tdFt0aGlzLm10aV0gPSAoKCgoKHMgJiAweGZmZmYwMDAwKSA+Pj4gMTYpICogMTgxMjQzMzI1MykgPDwgMTYpICsgKHMgJiAweDAwMDBmZmZmKSAqIDE4MTI0MzMyNTMpXG5cdFx0KyB0aGlzLm10aTtcblx0XHQvKiBTZWUgS251dGggVEFPQ1AgVm9sMi4gM3JkIEVkLiBQLjEwNiBmb3IgbXVsdGlwbGllci4gKi9cblx0XHQvKiBJbiB0aGUgcHJldmlvdXMgdmVyc2lvbnMsIE1TQnMgb2YgdGhlIHNlZWQgYWZmZWN0ICAgKi9cblx0XHQvKiBvbmx5IE1TQnMgb2YgdGhlIGFycmF5IG10W10uICAgICAgICAgICAgICAgICAgICAgICAgKi9cblx0XHQvKiAyMDAyLzAxLzA5IG1vZGlmaWVkIGJ5IE1ha290byBNYXRzdW1vdG8gICAgICAgICAgICAgKi9cblx0XHR0aGlzLm10W3RoaXMubXRpXSA+Pj49IDA7XG5cdFx0LyogZm9yID4zMiBiaXQgbWFjaGluZXMgKi9cblx0fVxufVxuXG4vKiBpbml0aWFsaXplIGJ5IGFuIGFycmF5IHdpdGggYXJyYXktbGVuZ3RoICovXG4vKiBpbml0X2tleSBpcyB0aGUgYXJyYXkgZm9yIGluaXRpYWxpemluZyBrZXlzICovXG4vKiBrZXlfbGVuZ3RoIGlzIGl0cyBsZW5ndGggKi9cbi8qIHNsaWdodCBjaGFuZ2UgZm9yIEMrKywgMjAwNC8yLzI2ICovXG5NZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmluaXRfYnlfYXJyYXkgPSBmdW5jdGlvbihpbml0X2tleSwga2V5X2xlbmd0aCkge1xuXHR2YXIgaSwgaiwgaztcblx0dGhpcy5pbml0X3NlZWQoMTk2NTAyMTgpO1xuXHRpPTE7IGo9MDtcblx0ayA9ICh0aGlzLk4+a2V5X2xlbmd0aCA/IHRoaXMuTiA6IGtleV9sZW5ndGgpO1xuXHRmb3IgKDsgazsgay0tKSB7XG5cdFx0dmFyIHMgPSB0aGlzLm10W2ktMV0gXiAodGhpcy5tdFtpLTFdID4+PiAzMClcblx0XHR0aGlzLm10W2ldID0gKHRoaXMubXRbaV0gXiAoKCgoKHMgJiAweGZmZmYwMDAwKSA+Pj4gMTYpICogMTY2NDUyNSkgPDwgMTYpICsgKChzICYgMHgwMDAwZmZmZikgKiAxNjY0NTI1KSkpXG5cdFx0KyBpbml0X2tleVtqXSArIGo7IC8qIG5vbiBsaW5lYXIgKi9cblx0XHR0aGlzLm10W2ldID4+Pj0gMDsgLyogZm9yIFdPUkRTSVpFID4gMzIgbWFjaGluZXMgKi9cblx0XHRpKys7IGorKztcblx0XHRpZiAoaT49dGhpcy5OKSB7IHRoaXMubXRbMF0gPSB0aGlzLm10W3RoaXMuTi0xXTsgaT0xOyB9XG5cdFx0aWYgKGo+PWtleV9sZW5ndGgpIGo9MDtcblx0fVxuXHRmb3IgKGs9dGhpcy5OLTE7IGs7IGstLSkge1xuXHRcdHZhciBzID0gdGhpcy5tdFtpLTFdIF4gKHRoaXMubXRbaS0xXSA+Pj4gMzApO1xuXHRcdHRoaXMubXRbaV0gPSAodGhpcy5tdFtpXSBeICgoKCgocyAmIDB4ZmZmZjAwMDApID4+PiAxNikgKiAxNTY2MDgzOTQxKSA8PCAxNikgKyAocyAmIDB4MDAwMGZmZmYpICogMTU2NjA4Mzk0MSkpXG5cdFx0LSBpOyAvKiBub24gbGluZWFyICovXG5cdFx0dGhpcy5tdFtpXSA+Pj49IDA7IC8qIGZvciBXT1JEU0laRSA+IDMyIG1hY2hpbmVzICovXG5cdFx0aSsrO1xuXHRcdGlmIChpPj10aGlzLk4pIHsgdGhpcy5tdFswXSA9IHRoaXMubXRbdGhpcy5OLTFdOyBpPTE7IH1cblx0fVxuXG5cdHRoaXMubXRbMF0gPSAweDgwMDAwMDAwOyAvKiBNU0IgaXMgMTsgYXNzdXJpbmcgbm9uLXplcm8gaW5pdGlhbCBhcnJheSAqL1xufVxuXG4vKiBnZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIG9uIFswLDB4ZmZmZmZmZmZdLWludGVydmFsICovXG4vKiBvcmlnaW4gbmFtZSBnZW5yYW5kX2ludDMyICovXG5NZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLnJhbmRvbV9pbnQgPSBmdW5jdGlvbigpIHtcblx0dmFyIHk7XG5cdHZhciBtYWcwMSA9IG5ldyBBcnJheSgweDAsIHRoaXMuTUFUUklYX0EpO1xuXHQvKiBtYWcwMVt4XSA9IHggKiBNQVRSSVhfQSAgZm9yIHg9MCwxICovXG5cblx0aWYgKHRoaXMubXRpID49IHRoaXMuTikgeyAvKiBnZW5lcmF0ZSBOIHdvcmRzIGF0IG9uZSB0aW1lICovXG5cdFx0dmFyIGtrO1xuXG5cdFx0aWYgKHRoaXMubXRpID09IHRoaXMuTisxKSAgLyogaWYgaW5pdF9zZWVkKCkgaGFzIG5vdCBiZWVuIGNhbGxlZCwgKi9cblx0XHRcdHRoaXMuaW5pdF9zZWVkKDU0ODkpOyAgLyogYSBkZWZhdWx0IGluaXRpYWwgc2VlZCBpcyB1c2VkICovXG5cblx0XHRmb3IgKGtrPTA7a2s8dGhpcy5OLXRoaXMuTTtraysrKSB7XG5cdFx0XHR5ID0gKHRoaXMubXRba2tdJnRoaXMuVVBQRVJfTUFTSyl8KHRoaXMubXRba2srMV0mdGhpcy5MT1dFUl9NQVNLKTtcblx0XHRcdHRoaXMubXRba2tdID0gdGhpcy5tdFtrayt0aGlzLk1dIF4gKHkgPj4+IDEpIF4gbWFnMDFbeSAmIDB4MV07XG5cdFx0fVxuXHRcdGZvciAoO2trPHRoaXMuTi0xO2trKyspIHtcblx0XHRcdHkgPSAodGhpcy5tdFtra10mdGhpcy5VUFBFUl9NQVNLKXwodGhpcy5tdFtraysxXSZ0aGlzLkxPV0VSX01BU0spO1xuXHRcdFx0dGhpcy5tdFtra10gPSB0aGlzLm10W2trKyh0aGlzLk0tdGhpcy5OKV0gXiAoeSA+Pj4gMSkgXiBtYWcwMVt5ICYgMHgxXTtcblx0XHR9XG5cdFx0eSA9ICh0aGlzLm10W3RoaXMuTi0xXSZ0aGlzLlVQUEVSX01BU0spfCh0aGlzLm10WzBdJnRoaXMuTE9XRVJfTUFTSyk7XG5cdFx0dGhpcy5tdFt0aGlzLk4tMV0gPSB0aGlzLm10W3RoaXMuTS0xXSBeICh5ID4+PiAxKSBeIG1hZzAxW3kgJiAweDFdO1xuXG5cdFx0dGhpcy5tdGkgPSAwO1xuXHR9XG5cblx0eSA9IHRoaXMubXRbdGhpcy5tdGkrK107XG5cblx0LyogVGVtcGVyaW5nICovXG5cdHkgXj0gKHkgPj4+IDExKTtcblx0eSBePSAoeSA8PCA3KSAmIDB4OWQyYzU2ODA7XG5cdHkgXj0gKHkgPDwgMTUpICYgMHhlZmM2MDAwMDtcblx0eSBePSAoeSA+Pj4gMTgpO1xuXG5cdHJldHVybiB5ID4+PiAwO1xufVxuXG4vKiBnZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIG9uIFswLDB4N2ZmZmZmZmZdLWludGVydmFsICovXG4vKiBvcmlnaW4gbmFtZSBnZW5yYW5kX2ludDMxICovXG5NZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLnJhbmRvbV9pbnQzMSA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gKHRoaXMucmFuZG9tX2ludCgpPj4+MSk7XG59XG5cbi8qIGdlbmVyYXRlcyBhIHJhbmRvbSBudW1iZXIgb24gWzAsMV0tcmVhbC1pbnRlcnZhbCAqL1xuLyogb3JpZ2luIG5hbWUgZ2VucmFuZF9yZWFsMSAqL1xuTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5yYW5kb21faW5jbCA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcy5yYW5kb21faW50KCkqKDEuMC80Mjk0OTY3Mjk1LjApO1xuXHQvKiBkaXZpZGVkIGJ5IDJeMzItMSAqL1xufVxuXG4vKiBnZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIG9uIFswLDEpLXJlYWwtaW50ZXJ2YWwgKi9cbk1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUucmFuZG9tID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzLnJhbmRvbV9pbnQoKSooMS4wLzQyOTQ5NjcyOTYuMCk7XG5cdC8qIGRpdmlkZWQgYnkgMl4zMiAqL1xufVxuXG4vKiBnZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIG9uICgwLDEpLXJlYWwtaW50ZXJ2YWwgKi9cbi8qIG9yaWdpbiBuYW1lIGdlbnJhbmRfcmVhbDMgKi9cbk1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUucmFuZG9tX2V4Y2wgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuICh0aGlzLnJhbmRvbV9pbnQoKSArIDAuNSkqKDEuMC80Mjk0OTY3Mjk2LjApO1xuXHQvKiBkaXZpZGVkIGJ5IDJeMzIgKi9cbn1cblxuLyogZ2VuZXJhdGVzIGEgcmFuZG9tIG51bWJlciBvbiBbMCwxKSB3aXRoIDUzLWJpdCByZXNvbHV0aW9uKi9cbi8qIG9yaWdpbiBuYW1lIGdlbnJhbmRfcmVzNTMgKi9cbk1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUucmFuZG9tX2xvbmcgPSBmdW5jdGlvbigpIHtcblx0dmFyIGE9dGhpcy5yYW5kb21faW50KCk+Pj41LCBiPXRoaXMucmFuZG9tX2ludCgpPj4+Njtcblx0cmV0dXJuKGEqNjcxMDg4NjQuMCtiKSooMS4wLzkwMDcxOTkyNTQ3NDA5OTIuMCk7XG59XG5cbi8qIFRoZXNlIHJlYWwgdmVyc2lvbnMgYXJlIGR1ZSB0byBJc2FrdSBXYWRhLCAyMDAyLzAxLzA5IGFkZGVkICovXG5cbm1vZHVsZS5leHBvcnRzID0gTWVyc2VubmVUd2lzdGVyO1xuIiwiaW1wb3J0IE1lcnNlbm5lVHdpc3RlciBmcm9tIFwibWVyc2VubmUtdHdpc3RlclwiO1xyXG5pbXBvcnQgZGVmYXVsdFZhbHVlIGZyb20gXCIuLi91dGlscy9kZWZhdWx0VmFsdWVcIjtcclxuaW1wb3J0IGRlZmluZWQgZnJvbSBcIi4uL3V0aWxzL2RlZmluZWRcIjtcclxuXHJcbmNsYXNzIEdNYXRoIHtcclxuXHRwdWJsaWMgc3RhdGljIEVQU0lMT04xID0gMC4xO1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIEVQU0lMT04yID0gMC4wMTtcclxuXHJcblx0cHVibGljIHN0YXRpYyBFUFNJTE9OMyA9IDAuMDAxO1xyXG5cdHB1YmxpYyBzdGF0aWMgRVBTSUxPTjQgPSAwLjAwMDE7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgRVBTSUxPTjUgPSAwLjAwMDAxO1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIEVQU0lMT042ID0gMC4wMDAwMDE7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgRVBTSUxPTjcgPSAwLjAwMDAwMDE7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgRVBTSUxPTjggPSAwLjAwMDAwMDAxO1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIEVQU0lMT045ID0gMC4wMDAwMDAwMDE7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgRVBTSUxPTjEwID0gMC4wMDAwMDAwMDAxO1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIEVQU0lMT04xMSA9IDAuMDAwMDAwMDAwMDE7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgRVBTSUxPTjEyID0gMC4wMDAwMDAwMDAwMDE7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgRVBTSUxPTjEzID0gMC4wMDAwMDAwMDAwMDAxO1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIEVQU0lMT04xNCA9IDAuMDAwMDAwMDAwMDAwMDE7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgRVBTSUxPTjE1ID0gMC4wMDAwMDAwMDAwMDAwMDE7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgRVBTSUxPTjE2ID0gMC4wMDAwMDAwMDAwMDAwMDAxO1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIEVQU0lMT04xNyA9IDAuMDAwMDAwMDAwMDAwMDAwMDE7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgRVBTSUxPTjE4ID0gMC4wMDAwMDAwMDAwMDAwMDAwMDE7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgRVBTSUxPTjE5ID0gMC4wMDAwMDAwMDAwMDAwMDAwMDAxO1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIEVQU0lMT04yMCA9IDAuMDAwMDAwMDAwMDAwMDAwMDAwMDE7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgRVBTSUxPTjIxID0gMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDE7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgR1JBVklUQVRJT05BTFBBUkFNRVRFUiA9IDMuOTg2MDA0NDE4ZTE0O1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIFNJWFRZX0ZPVVJfS0lMT0JZVEVTID0gNjQgKiAxMDI0O1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIEZPVVJfR0lHQUJZVEVTID0gNCAqIDEwMjQgKiAxMDI0ICogMTAyNDtcclxuXHJcblx0c3RhdGljIHNpZ24gPSBkZWZhdWx0VmFsdWUoTWF0aC5zaWduLCBmdW5jdGlvbiBzaWduKHZhbHVlKSB7XHJcblx0XHR2YWx1ZSA9ICt2YWx1ZTsgLy8gY29lcmNlIHRvIG51bWJlclxyXG5cdFx0aWYgKHZhbHVlID09PSAwIHx8IHZhbHVlICE9PSB2YWx1ZSkge1xyXG5cdFx0XHQvLyB6ZXJvIG9yIE5hTlxyXG5cdFx0XHRyZXR1cm4gdmFsdWU7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdmFsdWUgPiAwID8gMSA6IC0xO1xyXG5cdH0pO1xyXG5cclxuXHRzdGF0aWMgc2lnbk5vdFplcm8odmFsdWUpIHtcclxuXHRcdHJldHVybiB2YWx1ZSA8IDAuMCA/IC0xLjAgOiAxLjA7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgdG9TTm9ybSh2YWx1ZTogbnVtYmVyLCByYW5nZU1heGltdW06IG51bWJlcik6IG51bWJlciB7XHJcblx0XHRyYW5nZU1heGltdW0gPSBkZWZhdWx0VmFsdWUocmFuZ2VNYXhpbXVtLCAyNTUpO1xyXG5cdFx0cmV0dXJuIE1hdGgucm91bmQoKEdNYXRoLmNsYW1wKHZhbHVlLCAtMS4wLCAxLjApICogMC41ICsgMC41KSAqIHJhbmdlTWF4aW11bSk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZnJvbVNOb3JtKHZhbHVlOiBudW1iZXIsIHJhbmdlTWF4aW11bTogbnVtYmVyKTogbnVtYmVyIHtcclxuXHRcdHJhbmdlTWF4aW11bSA9IGRlZmF1bHRWYWx1ZShyYW5nZU1heGltdW0sIDI1NSk7XHJcblx0XHRyZXR1cm4gKEdNYXRoLmNsYW1wKHZhbHVlLCAwLjAsIHJhbmdlTWF4aW11bSkgLyByYW5nZU1heGltdW0pICogMi4wIC0gMS4wO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG5vcm1hbGl6ZSh2YWx1ZTogbnVtYmVyLCByYW5nZU1pbmltdW06IG51bWJlciwgcmFuZ2VNYXhpbXVtOiBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0cmFuZ2VNYXhpbXVtID0gTWF0aC5tYXgocmFuZ2VNYXhpbXVtIC0gcmFuZ2VNaW5pbXVtLCAwLjApO1xyXG5cdFx0cmV0dXJuIHJhbmdlTWF4aW11bSA9PT0gMC4wID8gMC4wIDogR01hdGguY2xhbXAoKHZhbHVlIC0gcmFuZ2VNaW5pbXVtKSAvIHJhbmdlTWF4aW11bSwgMC4wLCAxLjApO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHNpbmggPSBkZWZhdWx0VmFsdWUoTWF0aC5zaW5oLCBmdW5jdGlvbiBzaW5oKHZhbHVlKSB7XHJcblx0XHRyZXR1cm4gKE1hdGguZXhwKHZhbHVlKSAtIE1hdGguZXhwKC12YWx1ZSkpIC8gMi4wO1xyXG5cdH0pO1xyXG5cclxuXHRzdGF0aWMgY29zaCA9IGRlZmF1bHRWYWx1ZShNYXRoLmNvc2gsIGZ1bmN0aW9uIGNvc2godmFsdWUpIHtcclxuXHRcdHJldHVybiAoTWF0aC5leHAodmFsdWUpICsgTWF0aC5leHAoLXZhbHVlKSkgLyAyLjA7XHJcblx0fSk7XHJcblxyXG5cdHN0YXRpYyBsZXJwKHA6IG51bWJlciwgcTogbnVtYmVyLCB0aW1lOiBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuICgxLjAgLSB0aW1lKSAqIHAgKyB0aW1lICogcTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBQSSA9IE1hdGguUEk7XHJcblxyXG5cdHN0YXRpYyBPTkVfT1ZFUl9QSSA9IDEuMCAvIE1hdGguUEk7XHJcblxyXG5cdHN0YXRpYyBQSV9PVkVSX1RXTyA9IE1hdGguUEkgLyAyLjA7XHJcblxyXG5cdHN0YXRpYyBQSV9PVkVSX1RIUkVFID0gTWF0aC5QSSAvIDMuMDtcclxuXHJcblx0c3RhdGljIFBJX09WRVJfRk9VUiA9IE1hdGguUEkgLyA0LjA7XHJcblxyXG5cdHN0YXRpYyBQSV9PVkVSX1NJWCA9IE1hdGguUEkgLyA2LjA7XHJcblxyXG5cdHN0YXRpYyBUSFJFRV9QSV9PVkVSX1RXTyA9ICgzLjAgKiBNYXRoLlBJKSAvIDIuMDtcclxuXHJcblx0c3RhdGljIFRXT19QSSA9IDIuMCAqIE1hdGguUEk7XHJcblxyXG5cdHN0YXRpYyBPTkVfT1ZFUl9UV09fUEkgPSAxLjAgLyAoMi4wICogTWF0aC5QSSk7XHJcblxyXG5cdHN0YXRpYyBSQURJQU5TX1BFUl9ERUdSRUUgPSBNYXRoLlBJIC8gMTgwLjA7XHJcblxyXG5cdHN0YXRpYyBERUdSRUVTX1BFUl9SQURJQU4gPSAxODAuMCAvIE1hdGguUEk7XHJcblxyXG5cdHN0YXRpYyBSQURJQU5TX1BFUl9BUkNTRUNPTkQgPSBHTWF0aC5SQURJQU5TX1BFUl9ERUdSRUUgLyAzNjAwLjA7XHJcblxyXG5cdHN0YXRpYyB0b1JhZGlhbnMoZGVncmVlczogbnVtYmVyKTogbnVtYmVyIHtcclxuXHRcdGlmICghZGVmaW5lZChkZWdyZWVzKSkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJkZWdyZWVzIGlzIHJlcXVpcmVkLlwiKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBkZWdyZWVzICogR01hdGguUkFESUFOU19QRVJfREVHUkVFO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHRvRGVncmVlcyhyYWRpYW5zOiBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0aWYgKCFkZWZpbmVkKHJhZGlhbnMpKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInJhZGlhbnMgaXMgcmVxdWlyZWQuXCIpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJhZGlhbnMgKiBHTWF0aC5ERUdSRUVTX1BFUl9SQURJQU47XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbmVnYXRpdmVQaVRvUGkoYW5nbGU6IG51bWJlcik6IG51bWJlciB7XHJcblx0XHRpZiAoIWRlZmluZWQoYW5nbGUpKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcImFuZ2xlIGlzIHJlcXVpcmVkLlwiKTtcclxuXHRcdH1cclxuXHRcdGlmIChhbmdsZSA+PSAtR01hdGguUEkgJiYgYW5nbGUgPD0gR01hdGguUEkpIHtcclxuXHRcdFx0Ly8gRWFybHkgZXhpdCBpZiB0aGUgaW5wdXQgaXMgYWxyZWFkeSBpbnNpZGUgdGhlIHJhbmdlLiBUaGlzIGF2b2lkc1xyXG5cdFx0XHQvLyB1bm5lY2Vzc2FyeSBtYXRoIHdoaWNoIGNvdWxkIGludHJvZHVjZSBmbG9hdGluZyBwb2ludCBlcnJvci5cclxuXHRcdFx0cmV0dXJuIGFuZ2xlO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIEdNYXRoLnplcm9Ub1R3b1BpKGFuZ2xlICsgR01hdGguUEkpIC0gR01hdGguUEk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgemVyb1RvVHdvUGkoYW5nbGU6IG51bWJlcik6IG51bWJlciB7XHJcblx0XHRpZiAoIWRlZmluZWQoYW5nbGUpKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcImFuZ2xlIGlzIHJlcXVpcmVkLlwiKTtcclxuXHRcdH1cclxuXHRcdGlmIChhbmdsZSA+PSAwICYmIGFuZ2xlIDw9IEdNYXRoLlRXT19QSSkge1xyXG5cdFx0XHQvLyBFYXJseSBleGl0IGlmIHRoZSBpbnB1dCBpcyBhbHJlYWR5IGluc2lkZSB0aGUgcmFuZ2UuIFRoaXMgYXZvaWRzXHJcblx0XHRcdC8vIHVubmVjZXNzYXJ5IG1hdGggd2hpY2ggY291bGQgaW50cm9kdWNlIGZsb2F0aW5nIHBvaW50IGVycm9yLlxyXG5cdFx0XHRyZXR1cm4gYW5nbGU7XHJcblx0XHR9XHJcblx0XHRjb25zdCBtb2QgPSBHTWF0aC5tb2QoYW5nbGUsIEdNYXRoLlRXT19QSSk7XHJcblx0XHRpZiAoTWF0aC5hYnMobW9kKSA8IEdNYXRoLkVQU0lMT04xNCAmJiBNYXRoLmFicyhhbmdsZSkgPiBHTWF0aC5FUFNJTE9OMTQpIHtcclxuXHRcdFx0cmV0dXJuIEdNYXRoLlRXT19QSTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBtb2Q7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbW9kKG06IG51bWJlciwgbjogbnVtYmVyKTogbnVtYmVyIHtcclxuXHRcdGlmICghZGVmaW5lZChtKSkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJtIGlzIHJlcXVpcmVkLlwiKTtcclxuXHRcdH1cclxuXHRcdGlmICghZGVmaW5lZChuKSkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJuIGlzIHJlcXVpcmVkLlwiKTtcclxuXHRcdH1cclxuXHRcdGlmIChuID09PSAwLjApIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiZGl2aXNvciBjYW5ub3QgYmUgMC5cIik7XHJcblx0XHR9XHJcblx0XHRpZiAoR01hdGguc2lnbihtKSA9PT0gR01hdGguc2lnbihuKSAmJiBNYXRoLmFicyhtKSA8IE1hdGguYWJzKG4pKSB7XHJcblx0XHRcdC8vIEVhcmx5IGV4aXQgaWYgdGhlIGlucHV0IGRvZXMgbm90IG5lZWQgdG8gYmUgbW9kZGVkLiBUaGlzIGF2b2lkc1xyXG5cdFx0XHQvLyB1bm5lY2Vzc2FyeSBtYXRoIHdoaWNoIGNvdWxkIGludHJvZHVjZSBmbG9hdGluZyBwb2ludCBlcnJvci5cclxuXHRcdFx0cmV0dXJuIG07XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuICgobSAlIG4pICsgbikgJSBuO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGVxdWFsc0Vwc2lsb24oXHJcblx0XHRsZWZ0OiBudW1iZXIsXHJcblx0XHRyaWdodDogbnVtYmVyLFxyXG5cdFx0cmVsYXRpdmVFcHNpbG9uOiBudW1iZXIsXHJcblx0XHRhYnNvbHV0ZUVwc2lsb246IG51bWJlciA9IHJlbGF0aXZlRXBzaWxvblxyXG5cdCk6IGJvb2xlYW4ge1xyXG5cdFx0aWYgKCFkZWZpbmVkKGxlZnQpKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcImxlZnQgaXMgcmVxdWlyZWQuXCIpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCFkZWZpbmVkKHJpZ2h0KSkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJyaWdodCBpcyByZXF1aXJlZC5cIik7XHJcblx0XHR9XHJcblxyXG5cdFx0cmVsYXRpdmVFcHNpbG9uID0gZGVmYXVsdFZhbHVlKHJlbGF0aXZlRXBzaWxvbiwgMC4wKTtcclxuXHRcdGFic29sdXRlRXBzaWxvbiA9IGRlZmF1bHRWYWx1ZShhYnNvbHV0ZUVwc2lsb24sIHJlbGF0aXZlRXBzaWxvbik7XHJcblx0XHRjb25zdCBhYnNEaWZmID0gTWF0aC5hYnMobGVmdCAtIHJpZ2h0KTtcclxuXHRcdHJldHVybiBhYnNEaWZmIDw9IGFic29sdXRlRXBzaWxvbiB8fCBhYnNEaWZmIDw9IHJlbGF0aXZlRXBzaWxvbiAqIE1hdGgubWF4KE1hdGguYWJzKGxlZnQpLCBNYXRoLmFicyhyaWdodCkpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGxlc3NUaGFuKGxlZnQ6IG51bWJlciwgcmlnaHQ6IG51bWJlciwgYWJzb2x1dGVFcHNpbG9uID0gMCk6IGJvb2xlYW4ge1xyXG5cdFx0aWYgKCFkZWZpbmVkKGxlZnQpKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcImZpcnN0IGlzIHJlcXVpcmVkLlwiKTtcclxuXHRcdH1cclxuXHRcdGlmICghZGVmaW5lZChyaWdodCkpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic2Vjb25kIGlzIHJlcXVpcmVkLlwiKTtcclxuXHRcdH1cclxuXHRcdGlmICghZGVmaW5lZChhYnNvbHV0ZUVwc2lsb24pKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC5cIik7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbGVmdCAtIHJpZ2h0IDwgLWFic29sdXRlRXBzaWxvbjtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBsZXNzVGhhbk9yRXF1YWxzKGxlZnQ6IG51bWJlciwgcmlnaHQ6IG51bWJlciwgYWJzb2x1dGVFcHNpbG9uID0gMCk6IGJvb2xlYW4ge1xyXG5cdFx0aWYgKCFkZWZpbmVkKGxlZnQpKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcImZpcnN0IGlzIHJlcXVpcmVkLlwiKTtcclxuXHRcdH1cclxuXHRcdGlmICghZGVmaW5lZChyaWdodCkpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic2Vjb25kIGlzIHJlcXVpcmVkLlwiKTtcclxuXHRcdH1cclxuXHRcdGlmICghZGVmaW5lZChhYnNvbHV0ZUVwc2lsb24pKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC5cIik7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbGVmdCAtIHJpZ2h0IDwgYWJzb2x1dGVFcHNpbG9uO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdyZWF0ZXJUaGFuKGxlZnQ6IG51bWJlciwgcmlnaHQ6IG51bWJlciwgYWJzb2x1dGVFcHNpbG9uID0gMCk6IGJvb2xlYW4ge1xyXG5cdFx0aWYgKCFkZWZpbmVkKGxlZnQpKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcImZpcnN0IGlzIHJlcXVpcmVkLlwiKTtcclxuXHRcdH1cclxuXHRcdGlmICghZGVmaW5lZChyaWdodCkpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic2Vjb25kIGlzIHJlcXVpcmVkLlwiKTtcclxuXHRcdH1cclxuXHRcdGlmICghZGVmaW5lZChhYnNvbHV0ZUVwc2lsb24pKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC5cIik7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbGVmdCAtIHJpZ2h0ID4gYWJzb2x1dGVFcHNpbG9uO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdyZWF0ZXJUaGFuT3JFcXVhbHMobGVmdDogbnVtYmVyLCByaWdodDogbnVtYmVyLCBhYnNvbHV0ZUVwc2lsb24gPSAwKTogYm9vbGVhbiB7XHJcblx0XHRpZiAoIWRlZmluZWQobGVmdCkpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiZmlyc3QgaXMgcmVxdWlyZWQuXCIpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCFkZWZpbmVkKHJpZ2h0KSkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJzZWNvbmQgaXMgcmVxdWlyZWQuXCIpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCFkZWZpbmVkKGFic29sdXRlRXBzaWxvbikpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLlwiKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBsZWZ0IC0gcmlnaHQgPiAtYWJzb2x1dGVFcHNpbG9uO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGlzUG93ZXJPZlR3byhuOiBudW1iZXIpOiBib29sZWFuIHtcclxuXHRcdC8vID4+aW5jbHVkZVN0YXJ0KCdkZWJ1ZycsIHByYWdtYXMuZGVidWcpO1xyXG5cdFx0aWYgKHR5cGVvZiBuICE9PSBcIm51bWJlclwiIHx8IG4gPCAwIHx8IG4gPiA0Mjk0OTY3Mjk1KSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuXCIpO1xyXG5cdFx0fVxyXG5cdFx0Ly8gPj5pbmNsdWRlRW5kKCdkZWJ1ZycpO1xyXG5cclxuXHRcdHJldHVybiBuICE9PSAwICYmIChuICYgKG4gLSAxKSkgPT09IDA7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbmV4dFBvd2VyT2ZUd28objogbnVtYmVyKTogbnVtYmVyIHtcclxuXHRcdGlmICh0eXBlb2YgbiAhPT0gXCJudW1iZXJcIiB8fCBuIDwgMCB8fCBuID4gMjE0NzQ4MzY0OCkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDJeMzEgaXMgcmVxdWlyZWQuXCIpO1xyXG5cdFx0fVxyXG5cdFx0Ly8gRnJvbSBodHRwOi8vZ3JhcGhpY3Muc3RhbmZvcmQuZWR1L35zZWFuZGVyL2JpdGhhY2tzLmh0bWwjUm91bmRVcFBvd2VyT2YyXHJcblx0XHQtLW47XHJcblx0XHRuIHw9IG4gPj4gMTtcclxuXHRcdG4gfD0gbiA+PiAyO1xyXG5cdFx0biB8PSBuID4+IDQ7XHJcblx0XHRuIHw9IG4gPj4gODtcclxuXHRcdG4gfD0gbiA+PiAxNjtcclxuXHRcdCsrbjtcclxuXHJcblx0XHRyZXR1cm4gbjtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBwcmV2aW91c1Bvd2VyT2ZUd28objogbnVtYmVyKTogbnVtYmVyIHtcclxuXHRcdGlmICh0eXBlb2YgbiAhPT0gXCJudW1iZXJcIiB8fCBuIDwgMCB8fCBuID4gNDI5NDk2NzI5NSkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kICgyXjMyKS0xIGlzIHJlcXVpcmVkLlwiKTtcclxuXHRcdH1cclxuXHJcblx0XHRuIHw9IG4gPj4gMTtcclxuXHRcdG4gfD0gbiA+PiAyO1xyXG5cdFx0biB8PSBuID4+IDQ7XHJcblx0XHRuIHw9IG4gPj4gODtcclxuXHRcdG4gfD0gbiA+PiAxNjtcclxuXHRcdG4gfD0gbiA+PiAzMjtcclxuXHJcblx0XHQvLyBUaGUgcHJldmlvdXMgYml0d2lzZSBvcGVyYXRpb25zIGltcGxpY2l0bHkgY29udmVydCB0byBzaWduZWQgMzItYml0LiBVc2UgYD4+PmAgdG8gY29udmVydCB0byB1bnNpZ25lZFxyXG5cdFx0biA9IChuID4+PiAwKSAtIChuID4+PiAxKTtcclxuXHJcblx0XHRyZXR1cm4gbjtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBjbGFtcCh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIHZhbHVlIDwgbWluID8gbWluIDogdmFsdWUgPiBtYXggPyBtYXggOiB2YWx1ZTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBuZXh0UmFuZG9tTnVtYmVyID0gZnVuY3Rpb24gKCk6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gcmFuZG9tTnVtYmVyR2VuZXJhdG9yLnJhbmRvbSgpO1xyXG5cdH07XHJcblxyXG5cdHN0YXRpYyByYW5kb21CZXR3ZWVuID0gZnVuY3Rpb24gKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gR01hdGgubmV4dFJhbmRvbU51bWJlcigpICogKG1heCAtIG1pbikgKyBtaW47XHJcblx0fTtcclxuXHJcblx0c3RhdGljIGFjb3NDbGFtcGVkID0gZnVuY3Rpb24gKHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0aWYgKCFkZWZpbmVkKHZhbHVlKSkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ2YWx1ZSBpcyByZXF1aXJlZC5cIik7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIE1hdGguYWNvcyhHTWF0aC5jbGFtcCh2YWx1ZSwgLTEuMCwgMS4wKSk7XHJcblx0fTtcclxuXHJcblx0c3RhdGljIGFzaW5DbGFtcGVkID0gZnVuY3Rpb24gKHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0aWYgKCFkZWZpbmVkKHZhbHVlKSkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ2YWx1ZSBpcyByZXF1aXJlZC5cIik7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIE1hdGguYXNpbihHTWF0aC5jbGFtcCh2YWx1ZSwgLTEuMCwgMS4wKSk7XHJcblx0fTtcclxuXHJcblx0c3RhdGljIGNob3JkTGVuZ3RoID0gZnVuY3Rpb24gKGFuZ2xlOiBudW1iZXIsIHJhZGl1czogbnVtYmVyKTogbnVtYmVyIHtcclxuXHRcdGlmICghZGVmaW5lZChhbmdsZSkpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiYW5nbGUgaXMgcmVxdWlyZWQuXCIpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCFkZWZpbmVkKHJhZGl1cykpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwicmFkaXVzIGlzIHJlcXVpcmVkLlwiKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gMi4wICogcmFkaXVzICogTWF0aC5zaW4oYW5nbGUgKiAwLjUpO1xyXG5cdH07XHJcblxyXG5cdHN0YXRpYyBsb2dCYXNlID0gZnVuY3Rpb24gKG51bWJlcjogbnVtYmVyLCBiYXNlOiBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0aWYgKCFkZWZpbmVkKG51bWJlcikpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwibnVtYmVyIGlzIHJlcXVpcmVkLlwiKTtcclxuXHRcdH1cclxuXHRcdGlmICghZGVmaW5lZChiYXNlKSkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJiYXNlIGlzIHJlcXVpcmVkLlwiKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gTWF0aC5sb2cobnVtYmVyKSAvIE1hdGgubG9nKGJhc2UpO1xyXG5cdH07XHJcblxyXG5cdHN0YXRpYyBjYnJ0ID0gZGVmYXVsdFZhbHVlKE1hdGguY2JydCwgZnVuY3Rpb24gY2JydChudW1iZXIpIHtcclxuXHRcdGNvbnN0IHJlc3VsdCA9IE1hdGgucG93KE1hdGguYWJzKG51bWJlciksIDEuMCAvIDMuMCk7XHJcblx0XHRyZXR1cm4gbnVtYmVyIDwgMC4wID8gLXJlc3VsdCA6IHJlc3VsdDtcclxuXHR9KTtcclxuXHRzdGF0aWMgbG9nMiA9IGRlZmF1bHRWYWx1ZShNYXRoLmxvZzIsIGZ1bmN0aW9uIGxvZzIobnVtYmVyKSB7XHJcblx0XHRyZXR1cm4gTWF0aC5sb2cobnVtYmVyKSAqIE1hdGguTE9HMkU7XHJcblx0fSk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICovXHJcblx0c3RhdGljIGZvZyhkaXN0YW5jZVRvQ2FtZXJhOiBudW1iZXIsIGRlbnNpdHk6IG51bWJlcik6IG51bWJlciB7XHJcblx0XHRjb25zdCBzY2FsYXIgPSBkaXN0YW5jZVRvQ2FtZXJhICogZGVuc2l0eTtcclxuXHRcdHJldHVybiAxLjAgLSBNYXRoLmV4cCgtKHNjYWxhciAqIHNjYWxhcikpO1xyXG5cdH1cclxufVxyXG5jb25zdCByYW5kb21OdW1iZXJHZW5lcmF0b3IgPSBuZXcgTWVyc2VubmVUd2lzdGVyKCk7XHJcbmNvbnN0IGZhY3RvcmlhbHMgPSBbMV07XHJcbmV4cG9ydCBkZWZhdWx0IEdNYXRoO1xyXG4iLCJpbXBvcnQgeyBBdHRyaWJ1dGUgfSBmcm9tIFwiLi4vcmVuZGVyL0F0dHJpYnV0ZVwiO1xyXG5pbXBvcnQgZGVmaW5lZCBmcm9tIFwiLi4vdXRpbHMvZGVmaW5lZFwiO1xyXG5pbXBvcnQgR01hdGggZnJvbSBcIi4vTWF0aFwiO1xyXG5pbXBvcnQgTWF0cml4MyBmcm9tIFwiLi9NYXRyaXgzXCI7XHJcbi8qKlxyXG4gKiBBIDJEIENhcnRlc2lhbiBwb2ludC5cclxuICogQGFsaWFzIFZlY3RvcjJcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBbeD0wLjBdIFRoZSBYIGNvbXBvbmVudC5cclxuICogQHBhcmFtIHtOdW1iZXJ9IFt5PTAuMF0gVGhlIFkgY29tcG9uZW50LlxyXG4gKlxyXG4gKi9cclxuY2xhc3MgVmVjdG9yMiB7XHJcblx0cHVibGljIHN0YXRpYyBaRVJPID0gT2JqZWN0LmZyZWV6ZShuZXcgVmVjdG9yMigwLjAsIDAuMCkpO1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIE9ORSA9IE9iamVjdC5mcmVlemUobmV3IFZlY3RvcjIoMS4wLCAxLjApKTtcclxuXHJcblx0cHVibGljIHN0YXRpYyBVTklUX1ggPSBPYmplY3QuZnJlZXplKG5ldyBWZWN0b3IyKDEuMCwgMC4wKSk7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgVU5JVF9ZID0gT2JqZWN0LmZyZWV6ZShuZXcgVmVjdG9yMigwLjAsIDEuMCkpO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihwdWJsaWMgeDogbnVtYmVyID0gMC4wLCBwdWJsaWMgeTogbnVtYmVyID0gMC4wKSB7XHJcblx0XHR0aGlzLnggPSB4O1xyXG5cdFx0dGhpcy55ID0geTtcclxuXHR9XHJcblx0c2V0KHg6IG51bWJlciwgeTogbnVtYmVyKTogVmVjdG9yMiB7XHJcblx0XHR0aGlzLnggPSB4O1xyXG5cdFx0dGhpcy55ID0geTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHR0b0FycmF5KCkge1xyXG5cdFx0cmV0dXJuIFt0aGlzLngsIHRoaXMueV07XHJcblx0fVxyXG5cclxuXHRjbG9uZShyZXN1bHQ6IFZlY3RvcjIpOiBWZWN0b3IyIHtcclxuXHRcdHJldHVybiBWZWN0b3IyLmNsb25lKHRoaXMsIHJlc3VsdCk7XHJcblx0fVxyXG5cclxuXHRlcXVhbHMocmlnaHQ6IFZlY3RvcjIpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiBWZWN0b3IyLmVxdWFscyh0aGlzLCByaWdodCk7XHJcblx0fVxyXG5cdGVxdWFsc0Vwc2lsb24ocmlnaHQ6IFZlY3RvcjIsIHJlbGF0aXZlRXBzaWxvbiA9IDAsIGFic29sdXRlRXBzaWxvbiA9IDApOiBib29sZWFuIHtcclxuXHRcdHJldHVybiBWZWN0b3IyLmVxdWFsc0Vwc2lsb24odGhpcywgcmlnaHQsIHJlbGF0aXZlRXBzaWxvbiwgYWJzb2x1dGVFcHNpbG9uKTtcclxuXHR9XHJcblxyXG5cdHRvU3RyaW5nKCkge1xyXG5cdFx0cmV0dXJuIGAoJHt0aGlzLnh9LCAke3RoaXMueX0pYDtcclxuXHR9XHJcblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZShhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgaW5kZXg6IG51bWJlcik6IFZlY3RvcjIge1xyXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoaW5kZXgpO1xyXG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoaW5kZXgpO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cdGFwcGx5TWF0cml4MyhtYXRyaXgzOiBNYXRyaXgzKTogVmVjdG9yMiB7XHJcblx0XHRjb25zdCB4ID0gdGhpcy54LFxyXG5cdFx0XHR5ID0gdGhpcy55O1xyXG5cdFx0dGhpcy54ID0gbWF0cml4M1swXSAqIHggKyBtYXRyaXgzWzNdICogeSArIG1hdHJpeDNbNl07XHJcblx0XHR0aGlzLnkgPSBtYXRyaXgzWzFdICogeCArIG1hdHJpeDNbNF0gKiB5ICsgbWF0cml4M1s3XTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGZyb21FbGVtZW50cyh4OiBudW1iZXIsIHk6IG51bWJlciwgcmVzdWx0OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcblx0XHRpZiAoIWRlZmluZWQocmVzdWx0KSkge1xyXG5cdFx0XHRyZXR1cm4gbmV3IFZlY3RvcjIoeCwgeSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmVzdWx0LnggPSB4O1xyXG5cdFx0cmVzdWx0LnkgPSB5O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBjbG9uZShjYXJ0ZXNpYW46IFZlY3RvcjIsIHJlc3VsdDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG5cdFx0aWYgKCFkZWZpbmVkKGNhcnRlc2lhbikpIHtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHRcdGlmICghZGVmaW5lZChyZXN1bHQpKSB7XHJcblx0XHRcdHJldHVybiBuZXcgVmVjdG9yMihjYXJ0ZXNpYW4ueCwgY2FydGVzaWFuLnkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJlc3VsdC54ID0gY2FydGVzaWFuLng7XHJcblx0XHRyZXN1bHQueSA9IGNhcnRlc2lhbi55O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtYXhpbXVtQ29tcG9uZW50KGNhcnRlc2lhbjogVmVjdG9yMik6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gTWF0aC5tYXgoY2FydGVzaWFuLngsIGNhcnRlc2lhbi55KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtaW5pbXVtQ29tcG9uZW50KGNhcnRlc2lhbjogVmVjdG9yMik6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gTWF0aC5taW4oY2FydGVzaWFuLngsIGNhcnRlc2lhbi55KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtaW5pbXVtQnlDb21wb25lbnQoZmlyc3Q6IFZlY3RvcjIsIHNlY29uZDogVmVjdG9yMiwgcmVzdWx0OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcblx0XHRyZXN1bHQueCA9IE1hdGgubWluKGZpcnN0LngsIHNlY29uZC54KTtcclxuXHRcdHJlc3VsdC55ID0gTWF0aC5taW4oZmlyc3QueSwgc2Vjb25kLnkpO1xyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbWF4aW11bUJ5Q29tcG9uZW50KGZpcnN0OiBWZWN0b3IyLCBzZWNvbmQ6IFZlY3RvcjIsIHJlc3VsdDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG5cdFx0cmVzdWx0LnggPSBNYXRoLm1heChmaXJzdC54LCBzZWNvbmQueCk7XHJcblx0XHRyZXN1bHQueSA9IE1hdGgubWF4KGZpcnN0LnksIHNlY29uZC55KTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgY2xhbXAodmFsdWU6IFZlY3RvcjIsIG1pbjogVmVjdG9yMiwgbWF4OiBWZWN0b3IyLCByZXN1bHQ6IFZlY3RvcjIpOiBWZWN0b3IyIHtcclxuXHRcdGNvbnN0IHggPSBHTWF0aC5jbGFtcCh2YWx1ZS54LCBtaW4ueCwgbWF4LngpO1xyXG5cdFx0Y29uc3QgeSA9IEdNYXRoLmNsYW1wKHZhbHVlLnksIG1pbi55LCBtYXgueSk7XHJcblxyXG5cdFx0cmVzdWx0LnggPSB4O1xyXG5cdFx0cmVzdWx0LnkgPSB5O1xyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbWFnbml0dWRlU3F1YXJlZChjYXJ0ZXNpYW46IFZlY3RvcjIpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIGNhcnRlc2lhbi54ICogY2FydGVzaWFuLnggKyBjYXJ0ZXNpYW4ueSAqIGNhcnRlc2lhbi55O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG1hZ25pdHVkZShjYXJ0ZXNpYW46IFZlY3RvcjIpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIE1hdGguc3FydChWZWN0b3IyLm1hZ25pdHVkZVNxdWFyZWQoY2FydGVzaWFuKSk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZGlzdGFuY2UobGVmdDogVmVjdG9yMiwgcmlnaHQ6IFZlY3RvcjIpOiBudW1iZXIge1xyXG5cdFx0VmVjdG9yMi5zdWJ0cmFjdChsZWZ0LCByaWdodCwgZGlzdGFuY2VTY3JhdGNoKTtcclxuXHRcdHJldHVybiBWZWN0b3IyLm1hZ25pdHVkZShkaXN0YW5jZVNjcmF0Y2gpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGRpc3RhbmNlU3F1YXJlZChsZWZ0OiBWZWN0b3IyLCByaWdodDogVmVjdG9yMik6IG51bWJlciB7XHJcblx0XHRWZWN0b3IyLnN1YnRyYWN0KGxlZnQsIHJpZ2h0LCBkaXN0YW5jZVNjcmF0Y2gpO1xyXG5cdFx0cmV0dXJuIFZlY3RvcjIubWFnbml0dWRlU3F1YXJlZChkaXN0YW5jZVNjcmF0Y2gpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG5vcm1hbGl6ZShjYXJ0ZXNpYW46IFZlY3RvcjIsIHJlc3VsdDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG5cdFx0Y29uc3QgbWFnbml0dWRlID0gVmVjdG9yMi5tYWduaXR1ZGUoY2FydGVzaWFuKTtcclxuXHJcblx0XHRyZXN1bHQueCA9IGNhcnRlc2lhbi54IC8gbWFnbml0dWRlO1xyXG5cdFx0cmVzdWx0LnkgPSBjYXJ0ZXNpYW4ueSAvIG1hZ25pdHVkZTtcclxuXHJcblx0XHQvLyA+PmluY2x1ZGVTdGFydCgnZGVidWcnLCBwcmFnbWFzLmRlYnVnKTtcclxuXHRcdGlmIChpc05hTihyZXN1bHQueCkgfHwgaXNOYU4ocmVzdWx0LnkpKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIm5vcm1hbGl6ZWQgcmVzdWx0IGlzIG5vdCBhIG51bWJlclwiKTtcclxuXHRcdH1cclxuXHRcdC8vID4+aW5jbHVkZUVuZCgnZGVidWcnKTtcclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGRvdChsZWZ0OiBWZWN0b3IyLCByaWdodDogVmVjdG9yMik6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gbGVmdC54ICogcmlnaHQueCArIGxlZnQueSAqIHJpZ2h0Lnk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgY3Jvc3MobGVmdDogVmVjdG9yMiwgcmlnaHQ6IFZlY3RvcjIpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIGxlZnQueCAqIHJpZ2h0LnkgLSBsZWZ0LnkgKiByaWdodC54O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG11bHRpcGx5Q29tcG9uZW50cyhsZWZ0OiBWZWN0b3IyLCByaWdodDogVmVjdG9yMiwgcmVzdWx0OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcblx0XHRyZXN1bHQueCA9IGxlZnQueCAqIHJpZ2h0Lng7XHJcblx0XHRyZXN1bHQueSA9IGxlZnQueSAqIHJpZ2h0Lnk7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGRpdmlkZUNvbXBvbmVudHMobGVmdDogVmVjdG9yMiwgcmlnaHQ6IFZlY3RvcjIsIHJlc3VsdDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG5cdFx0cmVzdWx0LnggPSBsZWZ0LnggLyByaWdodC54O1xyXG5cdFx0cmVzdWx0LnkgPSBsZWZ0LnkgLyByaWdodC55O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBhZGQobGVmdDogVmVjdG9yMiwgcmlnaHQ6IFZlY3RvcjIsIHJlc3VsdDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG5cdFx0cmVzdWx0LnggPSBsZWZ0LnggKyByaWdodC54O1xyXG5cdFx0cmVzdWx0LnkgPSBsZWZ0LnkgKyByaWdodC55O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBzdWJ0cmFjdChsZWZ0OiBWZWN0b3IyLCByaWdodDogVmVjdG9yMiwgcmVzdWx0OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcblx0XHRyZXN1bHQueCA9IGxlZnQueCAtIHJpZ2h0Lng7XHJcblx0XHRyZXN1bHQueSA9IGxlZnQueSAtIHJpZ2h0Lnk7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG11bHRpcGx5QnlTY2FsYXIoY2FydGVzaWFuOiBWZWN0b3IyLCBzY2FsYXI6IG51bWJlciwgcmVzdWx0OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcblx0XHRyZXN1bHQueCA9IGNhcnRlc2lhbi54ICogc2NhbGFyO1xyXG5cdFx0cmVzdWx0LnkgPSBjYXJ0ZXNpYW4ueSAqIHNjYWxhcjtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZGl2aWRlQnlTY2FsYXIoY2FydGVzaWFuOiBWZWN0b3IyLCBzY2FsYXI6IG51bWJlciwgcmVzdWx0OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcblx0XHRyZXN1bHQueCA9IGNhcnRlc2lhbi54IC8gc2NhbGFyO1xyXG5cdFx0cmVzdWx0LnkgPSBjYXJ0ZXNpYW4ueSAvIHNjYWxhcjtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbmVnYXRlKGNhcnRlc2lhbjogVmVjdG9yMiwgcmVzdWx0OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcblx0XHRyZXN1bHQueCA9IC1jYXJ0ZXNpYW4ueDtcclxuXHRcdHJlc3VsdC55ID0gLWNhcnRlc2lhbi55O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBhYnMoY2FydGVzaWFuOiBWZWN0b3IyLCByZXN1bHQ6IFZlY3RvcjIpOiBWZWN0b3IyIHtcclxuXHRcdHJlc3VsdC54ID0gTWF0aC5hYnMoY2FydGVzaWFuLngpO1xyXG5cdFx0cmVzdWx0LnkgPSBNYXRoLmFicyhjYXJ0ZXNpYW4ueSk7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGxlcnAoc3RhcnQ6IFZlY3RvcjIsIGVuZDogVmVjdG9yMiwgdDogbnVtYmVyLCByZXN1bHQ6IFZlY3RvcjIpOiBWZWN0b3IyIHtcclxuXHRcdFZlY3RvcjIubXVsdGlwbHlCeVNjYWxhcihlbmQsIHQsIGxlcnBTY3JhdGNoKTtcclxuXHRcdHJlc3VsdCA9IFZlY3RvcjIubXVsdGlwbHlCeVNjYWxhcihzdGFydCwgMS4wIC0gdCwgcmVzdWx0KTtcclxuXHRcdHJldHVybiBWZWN0b3IyLmFkZChsZXJwU2NyYXRjaCwgcmVzdWx0LCByZXN1bHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGFuZ2xlQmV0d2VlbihsZWZ0OiBWZWN0b3IyLCByaWdodDogVmVjdG9yMik6IG51bWJlciB7XHJcblx0XHRWZWN0b3IyLm5vcm1hbGl6ZShsZWZ0LCBhbmdsZUJldHdlZW5TY3JhdGNoKTtcclxuXHRcdFZlY3RvcjIubm9ybWFsaXplKHJpZ2h0LCBhbmdsZUJldHdlZW5TY3JhdGNoMik7XHJcblx0XHRyZXR1cm4gR01hdGguYWNvc0NsYW1wZWQoVmVjdG9yMi5kb3QoYW5nbGVCZXR3ZWVuU2NyYXRjaCwgYW5nbGVCZXR3ZWVuU2NyYXRjaDIpKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtb3N0T3J0aG9nb25hbEF4aXMoY2FydGVzaWFuOiBWZWN0b3IyLCByZXN1bHQ6IFZlY3RvcjIpOiBWZWN0b3IyIHtcclxuXHRcdGNvbnN0IGYgPSBWZWN0b3IyLm5vcm1hbGl6ZShjYXJ0ZXNpYW4sIG1vc3RPcnRob2dvbmFsQXhpc1NjcmF0Y2gpO1xyXG5cdFx0VmVjdG9yMi5hYnMoZiwgZik7XHJcblxyXG5cdFx0aWYgKGYueCA8PSBmLnkpIHtcclxuXHRcdFx0cmVzdWx0ID0gVmVjdG9yMi5jbG9uZShWZWN0b3IyLlVOSVRfWCwgcmVzdWx0KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJlc3VsdCA9IFZlY3RvcjIuY2xvbmUoVmVjdG9yMi5VTklUX1ksIHJlc3VsdCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBlcXVhbHMobGVmdDogVmVjdG9yMiwgcmlnaHQ6IFZlY3RvcjIpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiBsZWZ0ID09PSByaWdodCB8fCAoZGVmaW5lZChsZWZ0KSAmJiBkZWZpbmVkKHJpZ2h0KSAmJiBsZWZ0LnggPT09IHJpZ2h0LnggJiYgbGVmdC55ID09PSByaWdodC55KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICovXHJcblx0c3RhdGljIGVxdWFsc0FycmF5KGNhcnRlc2lhbjogVmVjdG9yMiwgYXJyYXk6IG51bWJlcltdLCBvZmZzZXQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIGNhcnRlc2lhbi54ID09PSBhcnJheVtvZmZzZXRdICYmIGNhcnRlc2lhbi55ID09PSBhcnJheVtvZmZzZXQgKyAxXTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBlcXVhbHNFcHNpbG9uKGxlZnQ6IFZlY3RvcjIsIHJpZ2h0OiBWZWN0b3IyLCByZWxhdGl2ZUVwc2lsb24gPSAwLCBhYnNvbHV0ZUVwc2lsb24gPSAwKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHRsZWZ0ID09PSByaWdodCB8fFxyXG5cdFx0XHQoZGVmaW5lZChsZWZ0KSAmJlxyXG5cdFx0XHRcdGRlZmluZWQocmlnaHQpICYmXHJcblx0XHRcdFx0R01hdGguZXF1YWxzRXBzaWxvbihsZWZ0LngsIHJpZ2h0LngsIHJlbGF0aXZlRXBzaWxvbiwgYWJzb2x1dGVFcHNpbG9uKSAmJlxyXG5cdFx0XHRcdEdNYXRoLmVxdWFsc0Vwc2lsb24obGVmdC55LCByaWdodC55LCByZWxhdGl2ZUVwc2lsb24sIGFic29sdXRlRXBzaWxvbikpXHJcblx0XHQpO1xyXG5cdH1cclxufVxyXG5jb25zdCBkaXN0YW5jZVNjcmF0Y2ggPSBuZXcgVmVjdG9yMigpO1xyXG5jb25zdCBsZXJwU2NyYXRjaCA9IG5ldyBWZWN0b3IyKCk7XHJcbmNvbnN0IGFuZ2xlQmV0d2VlblNjcmF0Y2ggPSBuZXcgVmVjdG9yMigpO1xyXG5jb25zdCBhbmdsZUJldHdlZW5TY3JhdGNoMiA9IG5ldyBWZWN0b3IyKCk7XHJcbmNvbnN0IG1vc3RPcnRob2dvbmFsQXhpc1NjcmF0Y2ggPSBuZXcgVmVjdG9yMigpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgVmVjdG9yMjtcclxuIiwiaW1wb3J0IHsgQXR0cmlidXRlIH0gZnJvbSBcIi4uL3JlbmRlci9BdHRyaWJ1dGVcIjtcclxuaW1wb3J0IGRlZmluZWQgZnJvbSBcIi4uL3V0aWxzL2RlZmluZWRcIjtcclxuaW1wb3J0IEdNYXRoIGZyb20gXCIuL01hdGhcIjtcclxuaW1wb3J0IE1hdHJpeDMgZnJvbSBcIi4vTWF0cml4M1wiO1xyXG5pbXBvcnQgTWF0cml4NCBmcm9tIFwiLi9NYXRyaXg0XCI7XHJcbmltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tIFwiLi9RdWF0ZXJuaW9uXCI7XHJcbmltcG9ydCB7IFNwaGVyaWNhbCB9IGZyb20gXCIuL1NwaGVyaWNhbFwiO1xyXG5pbXBvcnQgVmVjdG9yNCBmcm9tIFwiLi9WZWN0b3I0XCI7XHJcbmNsYXNzIFZlY3RvcjMge1xyXG5cdHB1YmxpYyBzdGF0aWMgWkVSTyA9IE9iamVjdC5mcmVlemUobmV3IFZlY3RvcjMoMC4wLCAwLjAsIDAuMCkpO1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIE9ORSA9IE9iamVjdC5mcmVlemUobmV3IFZlY3RvcjMoMS4wLCAxLjAsIDEuMCkpO1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIFVOSVRfWCA9IE9iamVjdC5mcmVlemUobmV3IFZlY3RvcjMoMS4wLCAwLjAsIDAuMCkpO1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIFVOSVRfWSA9IE9iamVjdC5mcmVlemUobmV3IFZlY3RvcjMoMC4wLCAxLjAsIDAuMCkpO1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIFVOSVRfWiA9IE9iamVjdC5mcmVlemUobmV3IFZlY3RvcjMoMC4wLCAwLjAsIDEuMCkpO1xyXG5cdHg6IG51bWJlcjtcclxuXHR5OiBudW1iZXI7XHJcblx0ejogbnVtYmVyO1xyXG5cclxuXHRjb25zdHJ1Y3Rvcih4ID0gMCwgeSA9IDAsIHogPSAwKSB7XHJcblx0XHR0aGlzLnggPSB4O1xyXG5cdFx0dGhpcy55ID0geTtcclxuXHRcdHRoaXMueiA9IHo7XHJcblx0fVxyXG5cdHNldCh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKTogVmVjdG9yMyB7XHJcblx0XHR0aGlzLnggPSB4O1xyXG5cdFx0dGhpcy55ID0geTtcclxuXHRcdHRoaXMueiA9IHo7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9XHJcblx0dG9BcnJheSgpOiBudW1iZXJbXSB7XHJcblx0XHRyZXR1cm4gW3RoaXMueCwgdGhpcy55LCB0aGlzLnpdO1xyXG5cdH1cclxuXHJcblx0Y29weSh2OiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcblx0XHR0aGlzLnggPSB2Lng7XHJcblx0XHR0aGlzLnkgPSB2Lnk7XHJcblx0XHR0aGlzLnogPSB2Lno7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9XHJcblx0bGVycChlbmQ6IFZlY3RvcjMsIHQ6IG51bWJlcik6IFZlY3RvcjMge1xyXG5cdFx0VmVjdG9yMy5sZXJwKHRoaXMsIGVuZCwgdCwgdGhpcyk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9XHJcblx0YWRkKHY6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuXHRcdFZlY3RvcjMuYWRkKHRoaXMsIHYsIHRoaXMpO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cdGFkZFNjYWxlZFZlY3Rvcih2OiBWZWN0b3IzLCBzOiBudW1iZXIpOiBWZWN0b3IzIHtcclxuXHRcdHRoaXMueCArPSB2LnggKiBzO1xyXG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XHJcblx0XHR0aGlzLnogKz0gdi56ICogcztcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHRzdWJ0cmFjdCh2OiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcblx0XHRWZWN0b3IzLnN1YnRyYWN0KHRoaXMsIHYsIHRoaXMpO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cdGFwcGx5UXVhdGVybmlvbihxOiBRdWF0ZXJuaW9uKTogVmVjdG9yMyB7XHJcblx0XHRjb25zdCB4ID0gdGhpcy54LFxyXG5cdFx0XHR5ID0gdGhpcy55LFxyXG5cdFx0XHR6ID0gdGhpcy56O1xyXG5cdFx0Y29uc3QgcXggPSBxLngsXHJcblx0XHRcdHF5ID0gcS55LFxyXG5cdFx0XHRxeiA9IHEueixcclxuXHRcdFx0cXcgPSBxLnc7XHJcblxyXG5cdFx0Ly8gY2FsY3VsYXRlIHF1YXQgKiB2ZWN0b3JcclxuXHJcblx0XHRjb25zdCBpeCA9IHF3ICogeCArIHF5ICogeiAtIHF6ICogeTtcclxuXHRcdGNvbnN0IGl5ID0gcXcgKiB5ICsgcXogKiB4IC0gcXggKiB6O1xyXG5cdFx0Y29uc3QgaXogPSBxdyAqIHogKyBxeCAqIHkgLSBxeSAqIHg7XHJcblx0XHRjb25zdCBpdyA9IC1xeCAqIHggLSBxeSAqIHkgLSBxeiAqIHo7XHJcblxyXG5cdFx0Ly8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdFxyXG5cclxuXHRcdHRoaXMueCA9IGl4ICogcXcgKyBpdyAqIC1xeCArIGl5ICogLXF6IC0gaXogKiAtcXk7XHJcblx0XHR0aGlzLnkgPSBpeSAqIHF3ICsgaXcgKiAtcXkgKyBpeiAqIC1xeCAtIGl4ICogLXF6O1xyXG5cdFx0dGhpcy56ID0gaXogKiBxdyArIGl3ICogLXF6ICsgaXggKiAtcXkgLSBpeSAqIC1xeDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9XHJcblx0c2V0RnJvbU1hdHJpeENvbHVtbihtOiBNYXRyaXgzIHwgTWF0cml4NCwgaW5kZXg6IG51bWJlcik6IFZlY3RvcjMge1xyXG5cdFx0cmV0dXJuIHRoaXMuZnJvbUFycmF5KG0sIGluZGV4ICogNCk7XHJcblx0fVxyXG5cdGZyb21BcnJheShhcnJheTogTWF0cml4MyB8IE1hdHJpeDQsIG9mZnNldCA9IDApOiBWZWN0b3IzIHtcclxuXHRcdHRoaXMueCA9IGFycmF5W29mZnNldF07XHJcblx0XHR0aGlzLnkgPSBhcnJheVtvZmZzZXQgKyAxXTtcclxuXHRcdHRoaXMueiA9IGFycmF5W29mZnNldCArIDJdO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHJcblx0bXVsdGlwbHlCeVNjYWxhcihzY2FsZTogbnVtYmVyKTogVmVjdG9yMyB7XHJcblx0XHRWZWN0b3IzLm11bHRpcGx5QnlTY2FsYXIodGhpcywgc2NhbGUsIHRoaXMpO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cclxuXHRjbG9uZSgpOiBWZWN0b3IzIHtcclxuXHRcdHJldHVybiBWZWN0b3IzLmNsb25lKHRoaXMsIG5ldyBWZWN0b3IzKCkpO1xyXG5cdH1cclxuXHRsZW5ndGgoKTogbnVtYmVyIHtcclxuXHRcdHJldHVybiBNYXRoLnNxcnQodGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56KTtcclxuXHR9XHJcblx0YXBwbHlNYXRyaXg0KG1hdHJpeDogTWF0cml4NCk6IFZlY3RvcjMge1xyXG5cdFx0Y29uc3QgeCA9IHRoaXMueCxcclxuXHRcdFx0eSA9IHRoaXMueSxcclxuXHRcdFx0eiA9IHRoaXMuejtcclxuXHRcdGNvbnN0IGUgPSBtYXRyaXg7XHJcblx0XHRjb25zdCB3ID0gMSAvIChlWzNdICogeCArIGVbN10gKiB5ICsgZVsxMV0gKiB6ICsgZVsxNV0pO1xyXG5cdFx0dGhpcy54ID0gKGVbMF0gKiB4ICsgZVs0XSAqIHkgKyBlWzhdICogeiArIGVbMTJdKSAqIHc7XHJcblx0XHR0aGlzLnkgPSAoZVsxXSAqIHggKyBlWzVdICogeSArIGVbOV0gKiB6ICsgZVsxM10pICogdztcclxuXHRcdHRoaXMueiA9IChlWzJdICogeCArIGVbNl0gKiB5ICsgZVsxMF0gKiB6ICsgZVsxNF0pICogdztcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHRhcHBseU1hdHJpeDMobWF0cml4OiBNYXRyaXgzKTogVmVjdG9yMyB7XHJcblx0XHRjb25zdCB4ID0gdGhpcy54LFxyXG5cdFx0XHR5ID0gdGhpcy55LFxyXG5cdFx0XHR6ID0gdGhpcy56O1xyXG5cdFx0dGhpcy54ID0geCAqIG1hdHJpeFswXSArIHkgKiBtYXRyaXhbM10gKyB6ICogbWF0cml4WzZdO1xyXG5cdFx0dGhpcy55ID0geCAqIG1hdHJpeFsxXSArIHkgKiBtYXRyaXhbNF0gKyB6ICogbWF0cml4WzddO1xyXG5cdFx0dGhpcy56ID0geCAqIG1hdHJpeFsyXSArIHkgKiBtYXRyaXhbNV0gKyB6ICogbWF0cml4WzhdO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cdHRyYW5zZm9ybURpcmVjdGlvbihtYXRyaXg6IE1hdHJpeDMgfCBNYXRyaXg0KTogVmVjdG9yMyB7XHJcblx0XHRjb25zdCB4ID0gdGhpcy54LFxyXG5cdFx0XHR5ID0gdGhpcy55LFxyXG5cdFx0XHR6ID0gdGhpcy56O1xyXG5cdFx0Y29uc3QgZSA9IG1hdHJpeDtcclxuXHRcdHRoaXMueCA9IGVbMF0gKiB4ICsgZVs0XSAqIHkgKyBlWzhdICogejtcclxuXHRcdHRoaXMueSA9IGVbMV0gKiB4ICsgZVs1XSAqIHkgKyBlWzldICogejtcclxuXHRcdHRoaXMueiA9IGVbMl0gKiB4ICsgZVs2XSAqIHkgKyBlWzEwXSAqIHo7XHJcblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcclxuXHR9XHJcblxyXG5cdHNldEZyb21NYXRyaXhQb3NpdGlvbihtYXRyaXg6IE1hdHJpeDQpIHtcclxuXHRcdGNvbnN0IGUgPSBtYXRyaXg7XHJcblxyXG5cdFx0dGhpcy54ID0gZVsxMl07XHJcblx0XHR0aGlzLnkgPSBlWzEzXTtcclxuXHRcdHRoaXMueiA9IGVbMTRdO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHJcblx0bm9ybWFsaXplKCk6IFZlY3RvcjMge1xyXG5cdFx0VmVjdG9yMy5ub3JtYWxpemUodGhpcywgdGhpcyk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9XHJcblxyXG5cdGVxdWFscyhyaWdodDogVmVjdG9yMyk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIFZlY3RvcjMuZXF1YWxzKHRoaXMsIHJpZ2h0KTtcclxuXHR9XHJcblxyXG5cdGVxdWFsc0Vwc2lsb24ocmlnaHQ6IFZlY3RvcjMsIHJlbGF0aXZlRXBzaWxvbiA9IDAsIGFic29sdXRlRXBzaWxvbiA9IDApOiBib29sZWFuIHtcclxuXHRcdHJldHVybiBWZWN0b3IzLmVxdWFsc0Vwc2lsb24odGhpcywgcmlnaHQsIHJlbGF0aXZlRXBzaWxvbiwgYWJzb2x1dGVFcHNpbG9uKTtcclxuXHR9XHJcblxyXG5cdHRvU3RyaW5nKCkge1xyXG5cdFx0cmV0dXJuIGAoJHt0aGlzLnh9LCAke3RoaXMueX0sICR7dGhpcy56fSlgO1xyXG5cdH1cclxuXHRmcm9tQnVmZmVyQXR0cmlidXRlKGF0dHJpYnV0ZTogQXR0cmlidXRlLCBpbmRleDogbnVtYmVyKTogVmVjdG9yMyB7XHJcblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WChpbmRleCk7XHJcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WShpbmRleCk7XHJcblx0XHR0aGlzLnogPSBhdHRyaWJ1dGUuZ2V0WihpbmRleCk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9XHJcblx0c3RhdGljIGZyb21WZWN0b3I0KHZlYzQ6IFZlY3RvcjQsIHJlc3VsdDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG5cdFx0cmVzdWx0LnggPSB2ZWM0Lng7XHJcblx0XHRyZXN1bHQueSA9IHZlYzQueTtcclxuXHRcdHJlc3VsdC56ID0gdmVjNC56O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBmcm9tU3BoZXJpY2FsKHNwaGVyaWNhbDogU3BoZXJpY2FsLCByZXN1bHQ6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuXHRcdGlmICghZGVmaW5lZChyZXN1bHQpKSB7XHJcblx0XHRcdHJlc3VsdCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHR9XHJcblx0XHRjb25zdCB7IHBoaSwgcmFkaXVzLCB0aGV0YSB9ID0gc3BoZXJpY2FsO1xyXG5cdFx0Y29uc3Qgc2luUGhpUmFkaXVzID0gTWF0aC5zaW4ocGhpKSAqIHJhZGl1cztcclxuXHRcdHJlc3VsdC54ID0gc2luUGhpUmFkaXVzICogTWF0aC5zaW4odGhldGEpO1xyXG5cdFx0cmVzdWx0LnkgPSBNYXRoLmNvcyhwaGkpICogcmFkaXVzO1xyXG5cdFx0cmVzdWx0LnogPSBzaW5QaGlSYWRpdXMgKiBNYXRoLmNvcyh0aGV0YSk7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGZyb21FbGVtZW50cyh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyLCByZXN1bHQ6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuXHRcdGlmICghZGVmaW5lZChyZXN1bHQpKSB7XHJcblx0XHRcdHJldHVybiBuZXcgVmVjdG9yMyh4LCB5LCB6KTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXN1bHQueCA9IHg7XHJcblx0XHRyZXN1bHQueSA9IHk7XHJcblx0XHRyZXN1bHQueiA9IHo7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGNsb25lKGNhcnRlc2lhbjogVmVjdG9yMywgcmVzdWx0OiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoKSk6IFZlY3RvcjMge1xyXG5cdFx0aWYgKCFkZWZpbmVkKGNhcnRlc2lhbikpIHtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHRcdGlmICghZGVmaW5lZChyZXN1bHQpKSB7XHJcblx0XHRcdHJldHVybiBuZXcgVmVjdG9yMyhjYXJ0ZXNpYW4ueCwgY2FydGVzaWFuLnksIGNhcnRlc2lhbi56KTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXN1bHQueCA9IGNhcnRlc2lhbi54O1xyXG5cdFx0cmVzdWx0LnkgPSBjYXJ0ZXNpYW4ueTtcclxuXHRcdHJlc3VsdC56ID0gY2FydGVzaWFuLno7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG1heGltdW1Db21wb25lbnQoY2FydGVzaWFuOiBWZWN0b3IzKTogbnVtYmVyIHtcclxuXHRcdHJldHVybiBNYXRoLm1heChjYXJ0ZXNpYW4ueCwgY2FydGVzaWFuLnksIGNhcnRlc2lhbi56KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtaW5pbXVtQ29tcG9uZW50KGNhcnRlc2lhbjogVmVjdG9yMyk6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gTWF0aC5taW4oY2FydGVzaWFuLngsIGNhcnRlc2lhbi55LCBjYXJ0ZXNpYW4ueik7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbWluaW11bUJ5Q29tcG9uZW50KGZpcnN0OiBWZWN0b3IzLCBzZWNvbmQ6IFZlY3RvcjMsIHJlc3VsdDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG5cdFx0cmVzdWx0LnggPSBNYXRoLm1pbihmaXJzdC54LCBzZWNvbmQueCk7XHJcblx0XHRyZXN1bHQueSA9IE1hdGgubWluKGZpcnN0LnksIHNlY29uZC55KTtcclxuXHRcdHJlc3VsdC56ID0gTWF0aC5taW4oZmlyc3Queiwgc2Vjb25kLnopO1xyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbWF4aW11bUJ5Q29tcG9uZW50KGZpcnN0OiBWZWN0b3IzLCBzZWNvbmQ6IFZlY3RvcjMsIHJlc3VsdDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG5cdFx0cmVzdWx0LnggPSBNYXRoLm1heChmaXJzdC54LCBzZWNvbmQueCk7XHJcblx0XHRyZXN1bHQueSA9IE1hdGgubWF4KGZpcnN0LnksIHNlY29uZC55KTtcclxuXHRcdHJlc3VsdC56ID0gTWF0aC5tYXgoZmlyc3Queiwgc2Vjb25kLnopO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBjbGFtcCh2YWx1ZTogVmVjdG9yMywgbWluOiBWZWN0b3IzLCBtYXg6IFZlY3RvcjMsIHJlc3VsdDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG5cdFx0Y29uc3QgeCA9IEdNYXRoLmNsYW1wKHZhbHVlLngsIG1pbi54LCBtYXgueCk7XHJcblx0XHRjb25zdCB5ID0gR01hdGguY2xhbXAodmFsdWUueSwgbWluLnksIG1heC55KTtcclxuXHRcdGNvbnN0IHogPSBHTWF0aC5jbGFtcCh2YWx1ZS56LCBtaW4ueiwgbWF4LnopO1xyXG5cclxuXHRcdHJlc3VsdC54ID0geDtcclxuXHRcdHJlc3VsdC55ID0geTtcclxuXHRcdHJlc3VsdC56ID0gejtcclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG1hZ25pdHVkZVNxdWFyZWQoY2FydGVzaWFuOiBWZWN0b3IzKTogbnVtYmVyIHtcclxuXHRcdHJldHVybiBjYXJ0ZXNpYW4ueCAqIGNhcnRlc2lhbi54ICsgY2FydGVzaWFuLnkgKiBjYXJ0ZXNpYW4ueSArIGNhcnRlc2lhbi56ICogY2FydGVzaWFuLno7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbWFnbml0dWRlKGNhcnRlc2lhbjogVmVjdG9yMyk6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KFZlY3RvcjMubWFnbml0dWRlU3F1YXJlZChjYXJ0ZXNpYW4pKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBkaXN0YW5jZShsZWZ0OiBWZWN0b3IzLCByaWdodDogVmVjdG9yMyk6IG51bWJlciB7XHJcblx0XHRWZWN0b3IzLnN1YnRyYWN0KGxlZnQsIHJpZ2h0LCBkaXN0YW5jZVNjcmF0Y2gpO1xyXG5cdFx0cmV0dXJuIFZlY3RvcjMubWFnbml0dWRlKGRpc3RhbmNlU2NyYXRjaCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZGlzdGFuY2VTcXVhcmVkKGxlZnQ6IFZlY3RvcjMsIHJpZ2h0OiBWZWN0b3IzKTogbnVtYmVyIHtcclxuXHRcdFZlY3RvcjMuc3VidHJhY3QobGVmdCwgcmlnaHQsIGRpc3RhbmNlU2NyYXRjaCk7XHJcblx0XHRyZXR1cm4gVmVjdG9yMy5tYWduaXR1ZGVTcXVhcmVkKGRpc3RhbmNlU2NyYXRjaCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbm9ybWFsaXplKGNhcnRlc2lhbjogVmVjdG9yMywgcmVzdWx0OiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcblx0XHRjb25zdCBtYWduaXR1ZGUgPSBWZWN0b3IzLm1hZ25pdHVkZShjYXJ0ZXNpYW4pO1xyXG5cclxuXHRcdHJlc3VsdC54ID0gY2FydGVzaWFuLnggLyBtYWduaXR1ZGU7XHJcblx0XHRyZXN1bHQueSA9IGNhcnRlc2lhbi55IC8gbWFnbml0dWRlO1xyXG5cdFx0cmVzdWx0LnogPSBjYXJ0ZXNpYW4ueiAvIG1hZ25pdHVkZTtcclxuXHJcblx0XHRpZiAoaXNOYU4ocmVzdWx0LngpIHx8IGlzTmFOKHJlc3VsdC55KSB8fCBpc05hTihyZXN1bHQueikpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyXCIpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZG90KGxlZnQ6IFZlY3RvcjMsIHJpZ2h0OiBWZWN0b3IzKTogbnVtYmVyIHtcclxuXHRcdHJldHVybiBsZWZ0LnggKiByaWdodC54ICsgbGVmdC55ICogcmlnaHQueSArIGxlZnQueiAqIHJpZ2h0Lno7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbXVsdGlwbHlDb21wb25lbnRzKGxlZnQ6IFZlY3RvcjMsIHJpZ2h0OiBWZWN0b3IzLCByZXN1bHQ6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuXHRcdHJlc3VsdC54ID0gbGVmdC54ICogcmlnaHQueDtcclxuXHRcdHJlc3VsdC55ID0gbGVmdC55ICogcmlnaHQueTtcclxuXHRcdHJlc3VsdC56ID0gbGVmdC56ICogcmlnaHQuejtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZGl2aWRlQ29tcG9uZW50cyhsZWZ0OiBWZWN0b3IzLCByaWdodDogVmVjdG9yMywgcmVzdWx0OiBWZWN0b3IzKSB7XHJcblx0XHRyZXN1bHQueCA9IGxlZnQueCAvIHJpZ2h0Lng7XHJcblx0XHRyZXN1bHQueSA9IGxlZnQueSAvIHJpZ2h0Lnk7XHJcblx0XHRyZXN1bHQueiA9IGxlZnQueiAvIHJpZ2h0Lno7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGFkZChsZWZ0OiBWZWN0b3IzLCByaWdodDogVmVjdG9yMywgcmVzdWx0OiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcblx0XHRyZXN1bHQueCA9IGxlZnQueCArIHJpZ2h0Lng7XHJcblx0XHRyZXN1bHQueSA9IGxlZnQueSArIHJpZ2h0Lnk7XHJcblx0XHRyZXN1bHQueiA9IGxlZnQueiArIHJpZ2h0Lno7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHN1YnRyYWN0KGxlZnQ6IFZlY3RvcjMsIHJpZ2h0OiBWZWN0b3IzLCByZXN1bHQ6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuXHRcdHJlc3VsdC54ID0gbGVmdC54IC0gcmlnaHQueDtcclxuXHRcdHJlc3VsdC55ID0gbGVmdC55IC0gcmlnaHQueTtcclxuXHRcdHJlc3VsdC56ID0gbGVmdC56IC0gcmlnaHQuejtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbXVsdGlwbHlCeVNjYWxhcihjYXJ0ZXNpYW46IFZlY3RvcjMsIHNjYWxhcjogbnVtYmVyLCByZXN1bHQ6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuXHRcdHJlc3VsdC54ID0gY2FydGVzaWFuLnggKiBzY2FsYXI7XHJcblx0XHRyZXN1bHQueSA9IGNhcnRlc2lhbi55ICogc2NhbGFyO1xyXG5cdFx0cmVzdWx0LnogPSBjYXJ0ZXNpYW4ueiAqIHNjYWxhcjtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZGl2aWRlQnlTY2FsYXIoY2FydGVzaWFuOiBWZWN0b3IzLCBzY2FsYXI6IG51bWJlciwgcmVzdWx0OiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcblx0XHRyZXN1bHQueCA9IGNhcnRlc2lhbi54IC8gc2NhbGFyO1xyXG5cdFx0cmVzdWx0LnkgPSBjYXJ0ZXNpYW4ueSAvIHNjYWxhcjtcclxuXHRcdHJlc3VsdC56ID0gY2FydGVzaWFuLnogLyBzY2FsYXI7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG5lZ2F0ZShjYXJ0ZXNpYW46IFZlY3RvcjMsIHJlc3VsdDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG5cdFx0cmVzdWx0LnggPSAtY2FydGVzaWFuLng7XHJcblx0XHRyZXN1bHQueSA9IC1jYXJ0ZXNpYW4ueTtcclxuXHRcdHJlc3VsdC56ID0gLWNhcnRlc2lhbi56O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBhYnMoY2FydGVzaWFuOiBWZWN0b3IzLCByZXN1bHQ6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuXHRcdHJlc3VsdC54ID0gTWF0aC5hYnMoY2FydGVzaWFuLngpO1xyXG5cdFx0cmVzdWx0LnkgPSBNYXRoLmFicyhjYXJ0ZXNpYW4ueSk7XHJcblx0XHRyZXN1bHQueiA9IE1hdGguYWJzKGNhcnRlc2lhbi56KTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbGVycChzdGFydDogVmVjdG9yMywgZW5kOiBWZWN0b3IzLCB0OiBudW1iZXIsIHJlc3VsdDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG5cdFx0VmVjdG9yMy5tdWx0aXBseUJ5U2NhbGFyKGVuZCwgdCwgbGVycFNjcmF0Y2gpO1xyXG5cdFx0cmVzdWx0ID0gVmVjdG9yMy5tdWx0aXBseUJ5U2NhbGFyKHN0YXJ0LCAxLjAgLSB0LCByZXN1bHQpO1xyXG5cdFx0cmV0dXJuIFZlY3RvcjMuYWRkKGxlcnBTY3JhdGNoLCByZXN1bHQsIHJlc3VsdCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgYW5nbGVCZXR3ZWVuKGxlZnQ6IFZlY3RvcjMsIHJpZ2h0OiBWZWN0b3IzKTogbnVtYmVyIHtcclxuXHRcdFZlY3RvcjMubm9ybWFsaXplKGxlZnQsIGFuZ2xlQmV0d2VlblNjcmF0Y2gpO1xyXG5cdFx0VmVjdG9yMy5ub3JtYWxpemUocmlnaHQsIGFuZ2xlQmV0d2VlblNjcmF0Y2gyKTtcclxuXHRcdGNvbnN0IGNvc2luZSA9IFZlY3RvcjMuZG90KGFuZ2xlQmV0d2VlblNjcmF0Y2gsIGFuZ2xlQmV0d2VlblNjcmF0Y2gyKTtcclxuXHRcdGNvbnN0IHNpbmUgPSBWZWN0b3IzLm1hZ25pdHVkZShWZWN0b3IzLmNyb3NzKGFuZ2xlQmV0d2VlblNjcmF0Y2gsIGFuZ2xlQmV0d2VlblNjcmF0Y2gyLCBhbmdsZUJldHdlZW5TY3JhdGNoKSk7XHJcblx0XHRyZXR1cm4gTWF0aC5hdGFuMihzaW5lLCBjb3NpbmUpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG1vc3RPcnRob2dvbmFsQXhpcyhjYXJ0ZXNpYW46IFZlY3RvcjMsIHJlc3VsdDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG5cdFx0Y29uc3QgZiA9IFZlY3RvcjMubm9ybWFsaXplKGNhcnRlc2lhbiwgbW9zdE9ydGhvZ29uYWxBeGlzU2NyYXRjaCk7XHJcblx0XHRWZWN0b3IzLmFicyhmLCBmKTtcclxuXHJcblx0XHRpZiAoZi54IDw9IGYueSkge1xyXG5cdFx0XHRpZiAoZi54IDw9IGYueikge1xyXG5cdFx0XHRcdHJlc3VsdCA9IFZlY3RvcjMuY2xvbmUoVmVjdG9yMy5VTklUX1gsIHJlc3VsdCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cmVzdWx0ID0gVmVjdG9yMy5jbG9uZShWZWN0b3IzLlVOSVRfWiwgcmVzdWx0KTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmIChmLnkgPD0gZi56KSB7XHJcblx0XHRcdHJlc3VsdCA9IFZlY3RvcjMuY2xvbmUoVmVjdG9yMy5VTklUX1ksIHJlc3VsdCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXN1bHQgPSBWZWN0b3IzLmNsb25lKFZlY3RvcjMuVU5JVF9aLCByZXN1bHQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgcHJvamVjdFZlY3RvcihhOiBWZWN0b3IzLCBiOiBWZWN0b3IzLCByZXN1bHQ6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuXHRcdGNvbnN0IHNjYWxhciA9IFZlY3RvcjMuZG90KGEsIGIpIC8gVmVjdG9yMy5kb3QoYiwgYik7XHJcblx0XHRyZXR1cm4gVmVjdG9yMy5tdWx0aXBseUJ5U2NhbGFyKGIsIHNjYWxhciwgcmVzdWx0KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBlcXVhbHMobGVmdDogVmVjdG9yMywgcmlnaHQ6IFZlY3RvcjMpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdGxlZnQgPT09IHJpZ2h0IHx8XHJcblx0XHRcdChkZWZpbmVkKGxlZnQpICYmIGRlZmluZWQocmlnaHQpICYmIGxlZnQueCA9PT0gcmlnaHQueCAmJiBsZWZ0LnkgPT09IHJpZ2h0LnkgJiYgbGVmdC56ID09PSByaWdodC56KVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICovXHJcblx0c3RhdGljIGVxdWFsc0FycmF5KGNhcnRlc2lhbjogVmVjdG9yMywgYXJyYXk6IG51bWJlcltdLCBvZmZzZXQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIGNhcnRlc2lhbi54ID09PSBhcnJheVtvZmZzZXRdICYmIGNhcnRlc2lhbi55ID09PSBhcnJheVtvZmZzZXQgKyAxXSAmJiBjYXJ0ZXNpYW4ueiA9PT0gYXJyYXlbb2Zmc2V0ICsgMl07XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZXF1YWxzRXBzaWxvbihsZWZ0OiBWZWN0b3IzLCByaWdodDogVmVjdG9yMywgcmVsYXRpdmVFcHNpbG9uID0gMCwgYWJzb2x1dGVFcHNpbG9uID0gMCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIChcclxuXHRcdFx0bGVmdCA9PT0gcmlnaHQgfHxcclxuXHRcdFx0KGRlZmluZWQobGVmdCkgJiZcclxuXHRcdFx0XHRkZWZpbmVkKHJpZ2h0KSAmJlxyXG5cdFx0XHRcdEdNYXRoLmVxdWFsc0Vwc2lsb24obGVmdC54LCByaWdodC54LCByZWxhdGl2ZUVwc2lsb24sIGFic29sdXRlRXBzaWxvbikgJiZcclxuXHRcdFx0XHRHTWF0aC5lcXVhbHNFcHNpbG9uKGxlZnQueSwgcmlnaHQueSwgcmVsYXRpdmVFcHNpbG9uLCBhYnNvbHV0ZUVwc2lsb24pICYmXHJcblx0XHRcdFx0R01hdGguZXF1YWxzRXBzaWxvbihsZWZ0LnosIHJpZ2h0LnosIHJlbGF0aXZlRXBzaWxvbiwgYWJzb2x1dGVFcHNpbG9uKSlcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgY3Jvc3MobGVmdDogVmVjdG9yMywgcmlnaHQ6IFZlY3RvcjMsIHJlc3VsdDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG5cdFx0Y29uc3QgbGVmdFggPSBsZWZ0Lng7XHJcblx0XHRjb25zdCBsZWZ0WSA9IGxlZnQueTtcclxuXHRcdGNvbnN0IGxlZnRaID0gbGVmdC56O1xyXG5cdFx0Y29uc3QgcmlnaHRYID0gcmlnaHQueDtcclxuXHRcdGNvbnN0IHJpZ2h0WSA9IHJpZ2h0Lnk7XHJcblx0XHRjb25zdCByaWdodFogPSByaWdodC56O1xyXG5cclxuXHRcdGNvbnN0IHggPSBsZWZ0WSAqIHJpZ2h0WiAtIGxlZnRaICogcmlnaHRZO1xyXG5cdFx0Y29uc3QgeSA9IGxlZnRaICogcmlnaHRYIC0gbGVmdFggKiByaWdodFo7XHJcblx0XHRjb25zdCB6ID0gbGVmdFggKiByaWdodFkgLSBsZWZ0WSAqIHJpZ2h0WDtcclxuXHJcblx0XHRyZXN1bHQueCA9IHg7XHJcblx0XHRyZXN1bHQueSA9IHk7XHJcblx0XHRyZXN1bHQueiA9IHo7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG1pZHBvaW50ID0gZnVuY3Rpb24gKGxlZnQ6IFZlY3RvcjMsIHJpZ2h0OiBWZWN0b3IzLCByZXN1bHQ6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuXHRcdHJlc3VsdC54ID0gKGxlZnQueCArIHJpZ2h0LngpICogMC41O1xyXG5cdFx0cmVzdWx0LnkgPSAobGVmdC55ICsgcmlnaHQueSkgKiAwLjU7XHJcblx0XHRyZXN1bHQueiA9IChsZWZ0LnogKyByaWdodC56KSAqIDAuNTtcclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH07XHJcbn1cclxuY29uc3QgZGlzdGFuY2VTY3JhdGNoID0gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgbGVycFNjcmF0Y2ggPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBhbmdsZUJldHdlZW5TY3JhdGNoID0gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgYW5nbGVCZXR3ZWVuU2NyYXRjaDIgPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBtb3N0T3J0aG9nb25hbEF4aXNTY3JhdGNoID0gbmV3IFZlY3RvcjMoKTtcclxuZXhwb3J0IGRlZmF1bHQgVmVjdG9yMztcclxuIiwiaW1wb3J0IHsgVmVydGV4Rm9ybWF0IH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVQ29uc3RhbnRcIjtcclxuaW1wb3J0IFZlY3RvcjIgZnJvbSBcIi4uL21hdGgvVmVjdG9yMlwiO1xyXG5pbXBvcnQgVmVjdG9yMyBmcm9tIFwiLi4vbWF0aC9WZWN0b3IzXCI7XHJcbmltcG9ydCBCdWZmZXIgZnJvbSBcIi4uL3JlbmRlci9CdWZmZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGUge1xyXG5cdHB1YmxpYyBvZmZzZXQ6IG51bWJlcjtcclxuXHRwdWJsaWMgc2hhZGVyTG9jYXRpb246IG51bWJlcjtcclxuXHRwdWJsaWMgdHlwZTogc3RyaW5nO1xyXG5cdHB1YmxpYyBmb3JtYXQ6IHN0cmluZztcclxuXHRwdWJsaWMgYXR0cmlidXRlQnl0ZVNpemU6IG51bWJlcjtcclxuXHRwdWJsaWMgYXR0cmlidXRlVHlwZTogQXR0cmlidXRlVHlwZTtcclxuXHRwdWJsaWMgZGlydHk6IGJvb2xlYW47XHJcblx0cHVibGljIHN0YXRpYyB2MyA9IG5ldyBWZWN0b3IzKCk7XHJcblx0cHVibGljIHN0YXRpYyB2MiA9IG5ldyBWZWN0b3IyKCk7XHJcblx0Y29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHZhbHVlOiBBcnJheTxudW1iZXI+LCBwdWJsaWMgaXRlbVNpemU6IG51bWJlcikge1xyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHRcdHRoaXMub2Zmc2V0ID0gMDtcclxuXHRcdHRoaXMuc2hhZGVyTG9jYXRpb24gPSAwO1xyXG5cdFx0dGhpcy5hdHRyaWJ1dGVUeXBlID0gQXR0cmlidXRlVHlwZS5hdHRyaWJ1dGU7XHJcblx0XHR0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuXHR9XHJcblx0Z2V0R1BVQXR0cmlidXRlKCk6IEFycmF5PEdQVUF0dHJpYnV0ZT4ge1xyXG5cdFx0cmV0dXJuIFtcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHNoYWRlckxvY2F0aW9uOiB0aGlzLnNoYWRlckxvY2F0aW9uLFxyXG5cdFx0XHRcdGZvcm1hdDogdGhpcy5mb3JtYXQsXHJcblx0XHRcdFx0b2Zmc2V0OiB0aGlzLm9mZnNldFxyXG5cdFx0XHR9XHJcblx0XHRdO1xyXG5cdH1cclxuXHRkZXN0cm95KCkge1xyXG5cdFx0dGhpcy52YWx1ZSA9IFtdO1xyXG5cdH1cclxuXHRhcHBseU1hdHJpeDMobWF0cml4Mykge1xyXG5cdFx0aWYgKHRoaXMuaXRlbVNpemUgPT09IDIpIHtcclxuXHRcdFx0Zm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLnZhbHVlLmxlbmd0aCAvIHRoaXMuaXRlbVNpemU7IGkgPCBsOyBpKyspIHtcclxuXHRcdFx0XHRBdHRyaWJ1dGUudjIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLCBpKTtcclxuXHRcdFx0XHRBdHRyaWJ1dGUudjIuYXBwbHlNYXRyaXgzKG1hdHJpeDMpO1xyXG5cdFx0XHRcdHRoaXMuc2V0WFkoaSwgQXR0cmlidXRlLnYyLngsIEF0dHJpYnV0ZS52Mi55KTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0aGlzLml0ZW1TaXplID09PSAzKSB7XHJcblx0XHRcdGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy52YWx1ZS5sZW5ndGggLyB0aGlzLml0ZW1TaXplOyBpIDwgbDsgaSsrKSB7XHJcblx0XHRcdFx0QXR0cmlidXRlLnYzLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcywgaSk7XHJcblx0XHRcdFx0QXR0cmlidXRlLnYzLmFwcGx5TWF0cml4MyhtYXRyaXgzKTtcclxuXHRcdFx0XHR0aGlzLnNldFhZWihpLCBBdHRyaWJ1dGUudjMueCwgQXR0cmlidXRlLnYzLnksIEF0dHJpYnV0ZS52My56KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cdGFwcGx5TWF0cml4NChtYXRyaXg0KSB7XHJcblx0XHRmb3IgKGxldCBpID0gMCwgbCA9IHRoaXMudmFsdWUubGVuZ3RoIC8gdGhpcy5pdGVtU2l6ZTsgaSA8IGw7IGkrKykge1xyXG5cdFx0XHRBdHRyaWJ1dGUudjMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLCBpKTtcclxuXHRcdFx0QXR0cmlidXRlLnYzLmFwcGx5TWF0cml4NChtYXRyaXg0KTtcclxuXHRcdFx0dGhpcy5zZXRYWVooaSwgQXR0cmlidXRlLnYzLngsIEF0dHJpYnV0ZS52My55LCBBdHRyaWJ1dGUudjMueik7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9XHJcblx0c2V0WChpbmRleCwgeCkge1xyXG5cdFx0dGhpcy52YWx1ZVtpbmRleCAqIHRoaXMuaXRlbVNpemVdID0geDtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHRnZXRYKGluZGV4KSB7XHJcblx0XHRjb25zdCB4ID0gdGhpcy52YWx1ZVtpbmRleCAqIHRoaXMuaXRlbVNpemVdO1xyXG5cdFx0cmV0dXJuIHg7XHJcblx0fVxyXG5cdHNldFkoaW5kZXgsIHkpIHtcclxuXHRcdHRoaXMudmFsdWVbaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMV0gPSB5O1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cdGdldFkoaW5kZXgpIHtcclxuXHRcdGNvbnN0IHkgPSB0aGlzLnZhbHVlW2luZGV4ICogdGhpcy5pdGVtU2l6ZSArIDFdO1xyXG5cdFx0cmV0dXJuIHk7XHJcblx0fVxyXG5cdHNldFooaW5kZXgsIHopIHtcclxuXHRcdHRoaXMudmFsdWVbaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMl0gPSB6O1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cdGdldFooaW5kZXgpIHtcclxuXHRcdGNvbnN0IHogPSB0aGlzLnZhbHVlW2luZGV4ICogdGhpcy5pdGVtU2l6ZSArIDJdO1xyXG5cdFx0cmV0dXJuIHo7XHJcblx0fVxyXG5cdGdldFcoaW5kZXgpIHtcclxuXHRcdGNvbnN0IHcgPSB0aGlzLnZhbHVlW2luZGV4ICogdGhpcy5pdGVtU2l6ZSArIDNdO1xyXG5cdFx0cmV0dXJuIHc7XHJcblx0fVxyXG5cdHNldFhZKGluZGV4LCB4LCB5KSB7XHJcblx0XHRpbmRleCAqPSB0aGlzLml0ZW1TaXplO1xyXG5cdFx0dGhpcy52YWx1ZVtpbmRleCArIDBdID0geDtcclxuXHRcdHRoaXMudmFsdWVbaW5kZXggKyAxXSA9IHk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9XHJcblx0c2V0WFlaKGluZGV4LCB4LCB5LCB6KSB7XHJcblx0XHRpbmRleCAqPSB0aGlzLml0ZW1TaXplO1xyXG5cdFx0dGhpcy52YWx1ZVtpbmRleCArIDBdID0geDtcclxuXHRcdHRoaXMudmFsdWVbaW5kZXggKyAxXSA9IHk7XHJcblx0XHR0aGlzLnZhbHVlW2luZGV4ICsgMl0gPSB6O1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cdHNldFhZWlcoaW5kZXgsIHgsIHksIHosIHcpIHtcclxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XHJcblx0XHR0aGlzLnZhbHVlW2luZGV4ICsgMF0gPSB4O1xyXG5cdFx0dGhpcy52YWx1ZVtpbmRleCArIDFdID0geTtcclxuXHRcdHRoaXMudmFsdWVbaW5kZXggKyAyXSA9IHo7XHJcblx0XHR0aGlzLnZhbHVlW2luZGV4ICsgM10gPSB3O1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSW50ZXJsZWF2ZWRBdHRyaWJ1dGUge1xyXG5cdHB1YmxpYyBuYW1lczogc3RyaW5nW107XHJcblx0cHVibGljIHZhbHVlOiBBcnJheTxudW1iZXI+O1xyXG5cdHB1YmxpYyBpdGVtU2l6ZXM6IG51bWJlcltdO1xyXG5cdHB1YmxpYyBmb3JtYXQ6IHN0cmluZztcclxuXHRwdWJsaWMgYnl0ZVNpemU6IG51bWJlcjtcclxuXHRwdWJsaWMgYXR0cmlidXRlVHlwZTogQXR0cmlidXRlVHlwZTtcclxuXHRwdWJsaWMgZGlydHk6IGJvb2xlYW47XHJcblx0Y29uc3RydWN0b3IobmFtZXM6IHN0cmluZ1tdLCB2YWx1ZTogQXJyYXk8bnVtYmVyPiwgaXRlbVNpemVzOiBudW1iZXJbXSkge1xyXG5cdFx0dGhpcy5uYW1lcyA9IG5hbWVzO1xyXG5cdFx0dGhpcy5pdGVtU2l6ZXMgPSBpdGVtU2l6ZXM7XHJcblx0XHR0aGlzLnZhbHVlID0gdmFsdWU7XHJcblx0XHR0aGlzLmF0dHJpYnV0ZVR5cGUgPSBBdHRyaWJ1dGVUeXBlLmludGVybGVhdmVkQXR0cmlidXRlO1xyXG5cdFx0dGhpcy5kaXJ0eSA9IHRydWU7XHJcblx0fVxyXG5cdGdldEdQVUF0dHJpYnV0ZSgpOiBBcnJheTxHUFVBdHRyaWJ1dGU+IHtcclxuXHRcdGNvbnN0IHJlc3VsdCA9IFtdO1xyXG5cdFx0dGhpcy5pdGVtU2l6ZXMucmVkdWNlKCh0b3RhbCwgY3VycmVudCwgaW5kZXgpID0+IHtcclxuXHRcdFx0cmVzdWx0LnB1c2goe1xyXG5cdFx0XHRcdHNoYWRlckxvY2F0aW9uOiBpbmRleCxcclxuXHRcdFx0XHRmb3JtYXQ6IGN1cnJlbnQgPT0gMSA/IGAke3RoaXMuZm9ybWF0fWAgOiBgJHt0aGlzLmZvcm1hdH14JHtjdXJyZW50fWAsXHJcblx0XHRcdFx0b2Zmc2V0OiB0b3RhbCAqIHRoaXMuYnl0ZVNpemVcclxuXHRcdFx0fSk7XHJcblx0XHRcdHJldHVybiAodG90YWwgKz0gY3VycmVudCk7XHJcblx0XHR9LCAwKTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cdGRlc3Ryb3koKSB7XHJcblx0XHR0aGlzLnZhbHVlID0gbnVsbDtcclxuXHRcdHRoaXMubmFtZXMgPSBudWxsO1xyXG5cdFx0dGhpcy5pdGVtU2l6ZXMgPSBudWxsO1xyXG5cdH1cclxufVxyXG5leHBvcnQgY2xhc3MgRmxvYXQzMkF0dHJpYnV0ZSBleHRlbmRzIEF0dHJpYnV0ZSB7XHJcblx0Y29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB2YWx1ZTogQXJyYXk8bnVtYmVyPiwgaXRlbVNpemU6IG51bWJlcikge1xyXG5cdFx0c3VwZXIobmFtZSwgdmFsdWUsIGl0ZW1TaXplKTtcclxuXHRcdGNvbnN0IHsgZm9ybWF0LCB0b3RhbEJ5dGVTaXplIH0gPSBnZXRBdHRyaWJ1dGVGb3JtYXQoVmVydGV4Rm9ybWF0LkZsb2F0MzIsIGl0ZW1TaXplKTtcclxuXHRcdHRoaXMuZm9ybWF0ID0gZm9ybWF0O1xyXG5cdFx0dGhpcy5hdHRyaWJ1dGVCeXRlU2l6ZSA9IHRvdGFsQnl0ZVNpemU7XHJcblx0fVxyXG59XHJcbmV4cG9ydCBjbGFzcyBJbnRlcmxlYXZlZEZsb2F0MzJBdHRyaWJ1dGUgZXh0ZW5kcyBJbnRlcmxlYXZlZEF0dHJpYnV0ZSB7XHJcblx0Y29uc3RydWN0b3IobmFtZXM6IHN0cmluZ1tdLCB2YWx1ZTogQXJyYXk8bnVtYmVyPiwgaXRlbVNpemVzOiBudW1iZXJbXSkge1xyXG5cdFx0c3VwZXIobmFtZXMsIHZhbHVlLCBpdGVtU2l6ZXMpO1xyXG5cdFx0dGhpcy5mb3JtYXQgPSBWZXJ0ZXhGb3JtYXQuRmxvYXQzMjtcclxuXHRcdHRoaXMuYnl0ZVNpemUgPSBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XHJcblx0fVxyXG59XHJcbmV4cG9ydCBjbGFzcyBCdWZmZXJGbG9hdDMyQXR0cmlidXRlIGV4dGVuZHMgSW50ZXJsZWF2ZWRGbG9hdDMyQXR0cmlidXRlIHtcclxuXHRwdWJsaWMgYnVmZmVyOiBCdWZmZXI7XHJcblx0Y29uc3RydWN0b3IobmFtZXM6IHN0cmluZ1tdLCBidWZmZXI6IEJ1ZmZlciwgaXRlbVNpemVzOiBudW1iZXJbXSkge1xyXG5cdFx0c3VwZXIobmFtZXMsIHVuZGVmaW5lZCwgaXRlbVNpemVzKTtcclxuXHRcdHRoaXMuYnVmZmVyID0gYnVmZmVyO1xyXG5cdH1cclxufVxyXG5leHBvcnQgZW51bSBBdHRyaWJ1dGVUeXBlIHtcclxuXHRpbnRlcmxlYXZlZEF0dHJpYnV0ZSA9IDAsXHJcblx0YXR0cmlidXRlID0gMVxyXG59XHJcbmV4cG9ydCB0eXBlIEdQVUF0dHJpYnV0ZSA9IHtcclxuXHRzaGFkZXJMb2NhdGlvbjogbnVtYmVyO1xyXG5cdGZvcm1hdDogc3RyaW5nO1xyXG5cdG9mZnNldDogbnVtYmVyO1xyXG59O1xyXG5mdW5jdGlvbiBnZXRBdHRyaWJ1dGVGb3JtYXQodHlwZTogc3RyaW5nLCBpdGVtU2l6ZTogbnVtYmVyKSB7XHJcblx0Y29uc3Qga2V5ID0gYCR7dHlwZX14JHtpdGVtU2l6ZX1gO1xyXG5cdHJldHVybiB7XHJcblx0XHRbVmVydGV4Rm9ybWF0LkZsb2F0MzJdOiB7XHJcblx0XHRcdGZvcm1hdDogXCJmbG9hdDMyXCIsXHJcblx0XHRcdHRvdGFsQnl0ZVNpemU6IEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIGl0ZW1TaXplLFxyXG5cdFx0XHRieXRlU2l6ZTogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXHJcblx0XHR9LFxyXG5cdFx0W1ZlcnRleEZvcm1hdC5GbG9hdDMyeDJdOiB7XHJcblx0XHRcdGZvcm1hdDogXCJmbG9hdDMyeDJcIixcclxuXHRcdFx0dG90YWxCeXRlU2l6ZTogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogaXRlbVNpemUsXHJcblx0XHRcdGJ5dGVTaXplOiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRcclxuXHRcdH0sXHJcblx0XHRbVmVydGV4Rm9ybWF0LkZsb2F0MzJ4M106IHtcclxuXHRcdFx0Zm9ybWF0OiBcImZsb2F0MzJ4M1wiLFxyXG5cdFx0XHR0b3RhbEJ5dGVTaXplOiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBpdGVtU2l6ZSxcclxuXHRcdFx0Ynl0ZVNpemU6IEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVFxyXG5cdFx0fSxcclxuXHRcdFtWZXJ0ZXhGb3JtYXQuRmxvYXQzMng0XToge1xyXG5cdFx0XHRmb3JtYXQ6IFwiZmxvYXQzMng0XCIsXHJcblx0XHRcdHRvdGFsQnl0ZVNpemU6IEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIGl0ZW1TaXplLFxyXG5cdFx0XHRieXRlU2l6ZTogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXHJcblx0XHR9XHJcblx0fVtrZXldO1xyXG59XHJcbiIsImltcG9ydCB7IEJpbmRHcm91cENhY2hlT3B0aW9ucyB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVVR5cGVzXCI7XHJcbmNvbnN0IGJpbmRHcm91cENhY2hlID0gbmV3IE1hcCgpO1xyXG5jbGFzcyBCaW5kR3JvdXAge1xyXG5cdGRldmljZTogR1BVRGV2aWNlO1xyXG5cdGdwdUJpbmRHcm91cDogR1BVQmluZEdyb3VwO1xyXG5cdGxhYmVsOiBzdHJpbmc7XHJcblx0aW5kZXg6IG51bWJlcjtcclxuXHRkaXJ0eTogYm9vbGVhbjtcclxuXHRvZmZzZXQ/OiBudW1iZXI7XHJcblx0Ly8gY29uc3QgdW5pZm9ybUJ5dGVzID0gNSAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcclxuXHQvLyBjb25zdCBhbGlnbmVkU2l6ZUJ5dGVzID0gTWF0aC5jZWlsKHVuaWZvcm1CeXRlcyAvIDI1NikgKiAyNTY7XHJcblx0Ly8gY29uc3QgYWxpZ25lZFNpemUgPWFsaWduZWRTaXplQnl0ZXMgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XHJcblx0YWxpZ25lZFNpemU/OiBudW1iZXI7XHJcblx0bWF4T2Zmc2V0PzogbnVtYmVyO1xyXG5cdGR5bmFtaWM/OiBib29sZWFuO1xyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnM6IEJpbmRHcm91cENhY2hlT3B0aW9ucykge1xyXG5cdFx0dGhpcy5pbmRleCA9IG9wdGlvbnMuaW5kZXggfHwgMDtcclxuXHRcdHRoaXMub2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQgPz8gMDtcclxuXHRcdHRoaXMuYWxpZ25lZFNpemUgPSBvcHRpb25zLmFsaWduZWRTaXplID8/IDA7XHJcblx0XHR0aGlzLm1heE9mZnNldCA9IG9wdGlvbnMubWF4T2Zmc2V0ID8/IDA7XHJcblx0XHR0aGlzLmR5bmFtaWMgPSBvcHRpb25zLmR5bmFtaWMgPz8gZmFsc2U7XHJcblx0XHR0aGlzLmdwdUJpbmRHcm91cCA9IG9wdGlvbnMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7XHJcblx0XHRcdGxhYmVsOiBvcHRpb25zLmxhYmVsLFxyXG5cdFx0XHRsYXlvdXQ6IG9wdGlvbnMubGF5b3V0LmdwdUJpbmRHcm91cExheW91dCxcclxuXHRcdFx0ZW50cmllczogb3B0aW9ucy5lbnRpcmVzLm1hcCgoZW50aXR5KSA9PiAoe1xyXG5cdFx0XHRcdGJpbmRpbmc6IGVudGl0eS5iaW5kaW5nLFxyXG5cdFx0XHRcdHJlc291cmNlOiBlbnRpdHkucmVzb3VyY2VcclxuXHRcdFx0fSkpXHJcblx0XHR9KTtcclxuXHR9XHJcblx0YmluZChwYXNzRW5jb2RlcjogR1BVUmVuZGVyUGFzc0VuY29kZXIgfCBHUFVDb21wdXRlUGFzc0VuY29kZXIpIHtcclxuXHRcdC8vIGR5bmFtaWMgdW5pZm9ybXMgbXVzdCBiaW5kIG11bHRpcGxlIHRpbWVzXHJcblx0XHRpZiAodGhpcy5keW5hbWljKSB7XHJcblx0XHRcdGNvbnN0IGR5bmFtaWNPZmZzZXRzID0gWzBdO1xyXG5cdFx0XHRkeW5hbWljT2Zmc2V0c1swXSA9IHRoaXMub2Zmc2V0ICogdGhpcy5hbGlnbmVkU2l6ZTtcclxuXHRcdFx0dGhpcy5vZmZzZXQgPSArK3RoaXMub2Zmc2V0IDwgdGhpcy5tYXhPZmZzZXQgPyB0aGlzLm9mZnNldCA6IDA7XHJcblx0XHRcdHBhc3NFbmNvZGVyLnNldEJpbmRHcm91cCh0aGlzLmluZGV4LCB0aGlzLmdwdUJpbmRHcm91cCwgZHluYW1pY09mZnNldHMpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cGFzc0VuY29kZXIuc2V0QmluZEdyb3VwKHRoaXMuaW5kZXgsIHRoaXMuZ3B1QmluZEdyb3VwKTtcclxuXHRcdH1cclxuXHR9XHJcblx0ZGVzdHJveSgpIHtcclxuXHRcdHRoaXMuZ3B1QmluZEdyb3VwID0gdW5kZWZpbmVkO1xyXG5cdFx0dGhpcy5kZXZpY2UgPSB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHN0YXRpYyBnZXRCaW5kR3JvdXBGcm9tQ2FjaGUob3B0aW9uczogQmluZEdyb3VwQ2FjaGVPcHRpb25zKTogQmluZEdyb3VwIHtcclxuXHRcdGlmIChiaW5kR3JvdXBDYWNoZS5oYXMob3B0aW9ucy5sYWJlbCkpIHtcclxuXHRcdFx0cmV0dXJuIGJpbmRHcm91cENhY2hlLmdldChvcHRpb25zLmxhYmVsKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNvbnN0IGJpbmRHcm91cCA9IG5ldyBCaW5kR3JvdXAob3B0aW9ucyk7XHJcblx0XHRcdGJpbmRHcm91cENhY2hlLnNldChvcHRpb25zLmxhYmVsLCBiaW5kR3JvdXApO1xyXG5cdFx0XHRyZXR1cm4gYmluZEdyb3VwO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRzdGF0aWMgcmVtb3ZlQmluZEdyb3VwRnJvbUNhY2hlKGJpbmRHcm91cDogQmluZEdyb3VwKSB7XHJcblx0XHRiaW5kR3JvdXBDYWNoZS5kZWxldGUoYmluZEdyb3VwKTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJpbmRHcm91cDtcclxuIiwiaW1wb3J0IHsgQmluZEdyb3VwRW50aXR5T3B0aW9ucyB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVVR5cGVzXCI7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCaW5kR3JvdXBFbnRpdHkge1xuXHRiaW5kaW5nOiBudW1iZXI7XG5cdHJlc291cmNlOiBHUFVCaW5kaW5nUmVzb3VyY2U7XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnM6IEJpbmRHcm91cEVudGl0eU9wdGlvbnMpIHtcblx0XHR0aGlzLmJpbmRpbmcgPSBvcHRpb25zLmJpbmRpbmc7XG5cdFx0dGhpcy5yZXNvdXJjZSA9IG9wdGlvbnMucmVzb3VyY2U7XG5cdH1cblx0cHVibGljIGdldEdQVUdyb3VwRW50aXR5KCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRiaW5kaW5nOiB0aGlzLmJpbmRpbmcsXG5cdFx0XHRyZXNvdXJjZTogdGhpcy5yZXNvdXJjZVxuXHRcdH07XG5cdH1cbn1cbiIsImltcG9ydCB7IFBhc3NUeXBlIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVVHlwZXNcIjtcclxuaW1wb3J0IEF0dGFjaG1lbnQgZnJvbSBcIi4vQXR0YWNobWVudFwiO1xyXG5pbXBvcnQgUXVlcnlTZXQgZnJvbSBcIi4vUXVlcnlTZXRcIjtcclxuaW1wb3J0IFRleHR1cmUgZnJvbSBcIi4vVGV4dHVyZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVuZGVyVGFyZ2V0IHtcclxuXHRwdWJsaWMgZGV2aWNlOiBHUFVEZXZpY2U7XHJcblx0cHVibGljIGNvbW1hbmRFbmNvZGVyOiBHUFVDb21tYW5kRW5jb2RlciB8IG51bGw7XHJcblx0cHJpdmF0ZSBfcmVuZGVyUGFzc0Rlc2NyaXB0b3I6IEdQVVJlbmRlclBhc3NEZXNjcmlwdG9yO1xyXG5cdHByaXZhdGUgcmVuZGVyRW5jb2RlcjogR1BVUmVuZGVyUGFzc0VuY29kZXI7XHJcblx0cHJpdmF0ZSBjb21wdXRlRW5jb2RlcjogR1BVQ29tcHV0ZVBhc3NFbmNvZGVyO1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHVibGljIHR5cGU6IFBhc3NUeXBlLFxyXG5cdFx0cHVibGljIGNvbG9yQXR0YWNobWVudHM6IEF0dGFjaG1lbnRbXSxcclxuXHRcdHB1YmxpYyBkZXB0aEF0dGFjaG1lbnQ/OiBBdHRhY2htZW50LFxyXG5cdFx0cHVibGljIHN0ZW5jaWxBdHRhY2htZW50PzogQXR0YWNobWVudCxcclxuXHRcdHB1YmxpYyBxdWVyeVNldD86IFF1ZXJ5U2V0LFxyXG5cdFx0cHVibGljIGZpeGVkU2l6ZT86IGJvb2xlYW5cclxuXHQpIHtcclxuXHRcdHRoaXMucmVuZGVyRW5jb2RlciA9IHVuZGVmaW5lZDtcclxuXHRcdHRoaXMuY29tcHV0ZUVuY29kZXIgPSB1bmRlZmluZWQ7XHJcblx0XHR0aGlzLl9yZW5kZXJQYXNzRGVzY3JpcHRvciA9IHVuZGVmaW5lZDtcclxuXHRcdHRoaXMuY29tbWFuZEVuY29kZXIgPSB1bmRlZmluZWQ7XHJcblx0XHR0aGlzLmRldmljZSA9IHVuZGVmaW5lZDtcclxuXHRcdHRoaXMuZml4ZWRTaXplID0gZmFsc2U7XHJcblx0fVxyXG5cdGdldCByZW5kZXJQYXNzRGVzY3JpcHRvcigpIHtcclxuXHRcdHRoaXMuX3JlbmRlclBhc3NEZXNjcmlwdG9yID0gdGhpcy5nZXRSZW5kZXJQYXNzRGVzY3JpcHRvcigpO1xyXG5cdFx0cmV0dXJuIHRoaXMuX3JlbmRlclBhc3NEZXNjcmlwdG9yO1xyXG5cdH1cclxuXHRwdWJsaWMgZ2V0Q29sb3JUZXh0dXJlKGluZGV4ID0gMCk6IFRleHR1cmUge1xyXG5cdFx0Y29uc3QgY29sQXR0ID0gdGhpcy5jb2xvckF0dGFjaG1lbnRzW2luZGV4XTtcclxuXHRcdGlmIChjb2xBdHQpIHtcclxuXHRcdFx0cmV0dXJuIGNvbEF0dC50ZXh0dXJlIGFzIFRleHR1cmU7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHR9XHJcblx0cHVibGljIGdldERlcHRoVGV4dHVyZSgpOiBUZXh0dXJlIHtcclxuXHRcdGlmICh0aGlzLmRlcHRoQXR0YWNobWVudCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5kZXB0aEF0dGFjaG1lbnQudGV4dHVyZSBhcyBUZXh0dXJlO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRwcml2YXRlIGdldFJlbmRlclBhc3NEZXNjcmlwdG9yKCk6IEdQVVJlbmRlclBhc3NEZXNjcmlwdG9yIHwgbnVsbCB7XHJcblx0XHR0aGlzLmRlcHRoQXR0YWNobWVudD8udGV4dHVyZT8udXBkYXRlKHRoaXMuZGV2aWNlKTtcclxuXHRcdHRoaXM/LnF1ZXJ5U2V0Py51cGRhdGUodGhpcy5kZXZpY2UpO1xyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0Li4uKHRoaXMuY29sb3JBdHRhY2htZW50cyAmJiB7XHJcblx0XHRcdFx0Y29sb3JBdHRhY2htZW50czogdGhpcy5jb2xvckF0dGFjaG1lbnRzLm1hcCgoY29sb3JBdHRhY2htZW50KSA9PiB7XHJcblx0XHRcdFx0XHRjb2xvckF0dGFjaG1lbnQ/LnRleHR1cmU/LnVwZGF0ZSAmJiBjb2xvckF0dGFjaG1lbnQ/LnRleHR1cmU/LnVwZGF0ZSh0aGlzLmRldmljZSk7XHJcblx0XHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0XHR2aWV3OlxyXG5cdFx0XHRcdFx0XHRcdC8vIOaaguaXtui/meS5iOWGmVxyXG5cdFx0XHRcdFx0XHRcdGNvbG9yQXR0YWNobWVudD8udGV4dHVyZVZpZXc/LigpID8/IGNvbG9yQXR0YWNobWVudC50ZXh0dXJlLnRleHR1cmVWaWV3LFxyXG5cdFx0XHRcdFx0XHRyZXNvbHZlVGFyZ2V0OlxyXG5cdFx0XHRcdFx0XHRcdGNvbG9yQXR0YWNobWVudC5yZXNvbHZlVGFyZ2V0ICE9IHVuZGVmaW5lZFxyXG5cdFx0XHRcdFx0XHRcdFx0PyBjb2xvckF0dGFjaG1lbnQucmVzb2x2ZVRhcmdldC50ZXh0dXJlVmlld1xyXG5cdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWQsXHJcblx0XHRcdFx0XHRcdGNsZWFyVmFsdWU6IGNvbG9yQXR0YWNobWVudC52YWx1ZSxcclxuXHRcdFx0XHRcdFx0bG9hZE9wOiBjb2xvckF0dGFjaG1lbnQub3AsXHJcblx0XHRcdFx0XHRcdHN0b3JlT3A6IGNvbG9yQXR0YWNobWVudC5zdG9yZU9wXHJcblx0XHRcdFx0XHR9IGFzIEdQVVJlbmRlclBhc3NDb2xvckF0dGFjaG1lbnQ7XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0fSksXHJcblx0XHRcdC4uLigodGhpcy5kZXB0aEF0dGFjaG1lbnQgfHwgdGhpcy5zdGVuY2lsQXR0YWNobWVudCkgJiYge1xyXG5cdFx0XHRcdGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQ6IHtcclxuXHRcdFx0XHRcdHZpZXc6IHRoaXMuZGVwdGhBdHRhY2htZW50Py50ZXh0dXJlPy50ZXh0dXJlVmlldyB8fCB1bmRlZmluZWQsXHJcblx0XHRcdFx0XHRkZXB0aExvYWRPcDogdGhpcy5kZXB0aEF0dGFjaG1lbnQ/Lm9wIHx8IFwiY2xlYXJcIixcclxuXHRcdFx0XHRcdGRlcHRoQ2xlYXJWYWx1ZTogdGhpcy5kZXB0aEF0dGFjaG1lbnQ/LnZhbHVlIHx8IDEuMCxcclxuXHRcdFx0XHRcdGRlcHRoU3RvcmVPcDogdGhpcy5kZXB0aEF0dGFjaG1lbnQ/LnN0b3JlT3AgfHwgXCJzdG9yZVwiLFxyXG5cdFx0XHRcdFx0ZGVwdGhSZWFkT25seTogdGhpcy5kZXB0aEF0dGFjaG1lbnQ/LnJlYWRPbmx5IHx8IGZhbHNlXHJcblx0XHRcdFx0XHQvLyBzdGVuY2lsTG9hZE9wOiB0aGlzLnN0ZW5jaWxBdHRhY2htZW50Py5vcCB8fCBcImNsZWFyXCIsXHJcblx0XHRcdFx0XHQvLyBzdGVuY2lsQ2xlYXJWYWx1ZTogdGhpcy5zdGVuY2lsQXR0YWNobWVudD8udmFsdWUgfHwgMCxcclxuXHRcdFx0XHRcdC8vIHN0ZW5jaWxTdG9yZU9wOiB0aGlzLnN0ZW5jaWxBdHRhY2htZW50Py5zdG9yZU9wIHx8IFwic3RvcmVcIixcclxuXHRcdFx0XHR9IGFzIEdQVVJlbmRlclBhc3NEZXB0aFN0ZW5jaWxBdHRhY2htZW50XHJcblx0XHRcdH0pLFxyXG5cdFx0XHQuLi4odGhpcy5xdWVyeVNldCAmJiB7IG9jY2x1c2lvblF1ZXJ5U2V0OiB0aGlzLnF1ZXJ5U2V0LmdwdVF1ZXJ5U2V0IH0pXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0cHVibGljIGJlZ2luUmVuZGVyUGFzcyhkZXZpY2U6IEdQVURldmljZSkge1xyXG5cdFx0aWYgKCF0aGlzLmRldmljZSkgdGhpcy5kZXZpY2UgPSBkZXZpY2U7XHJcblx0XHR0aGlzLmNvbW1hbmRFbmNvZGVyID0gdGhpcy5kZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoKTtcclxuXHRcdHRoaXMucmVuZGVyRW5jb2RlciA9IHRoaXMuY29tbWFuZEVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKHRoaXMucmVuZGVyUGFzc0Rlc2NyaXB0b3IpO1xyXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyRW5jb2RlcjtcclxuXHR9XHJcblx0cHVibGljIGVuZFJlbmRlclBhc3MoKSB7XHJcblx0XHR0aGlzLnJlbmRlckVuY29kZXI/LmVuZCgpO1xyXG5cdFx0dGhpcy5kZXZpY2UucXVldWUuc3VibWl0KFt0aGlzLmNvbW1hbmRFbmNvZGVyLmZpbmlzaCgpXSk7XHJcblx0XHR0aGlzLmNvbW1hbmRFbmNvZGVyID0gbnVsbDtcclxuXHRcdHRoaXMucmVuZGVyRW5jb2RlciA9IG51bGw7XHJcblx0fVxyXG5cdHB1YmxpYyBiZWdpbkNvbXB1dGVQYXNzRW5jb2RlcihkZXZpY2U6IEdQVURldmljZSkge1xyXG5cdFx0aWYgKCF0aGlzLmRldmljZSkgdGhpcy5kZXZpY2UgPSBkZXZpY2U7XHJcblx0XHR0aGlzLmNvbW1hbmRFbmNvZGVyID0gdGhpcy5kZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoKTtcclxuXHRcdHRoaXMuY29tcHV0ZUVuY29kZXIgPSB0aGlzLmNvbW1hbmRFbmNvZGVyLmJlZ2luQ29tcHV0ZVBhc3MoKTtcclxuXHRcdHJldHVybiB0aGlzLmNvbXB1dGVFbmNvZGVyO1xyXG5cdH1cclxuXHRwdWJsaWMgZW5kQ29tcHV0ZVBhc3NFbmNvZGVyKCkge1xyXG5cdFx0dGhpcy5jb21wdXRlRW5jb2Rlcj8uZW5kKCk7XHJcblx0XHR0aGlzLmRldmljZS5xdWV1ZS5zdWJtaXQoW3RoaXMuY29tbWFuZEVuY29kZXIuZmluaXNoKCldKTtcclxuXHRcdHRoaXMuY29tbWFuZEVuY29kZXIgPSBudWxsO1xyXG5cdFx0dGhpcy5yZW5kZXJFbmNvZGVyID0gbnVsbDtcclxuXHR9XHJcblx0cHVibGljIHNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGRlcHRoID0gMSkge1xyXG5cdFx0aWYgKHRoaXMuZml4ZWRTaXplKSByZXR1cm47XHJcblx0XHR0aGlzPy5kZXB0aEF0dGFjaG1lbnQ/LnRleHR1cmU/LnNldFNpemU/Lih3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7XHJcblx0XHR0aGlzPy5jb2xvckF0dGFjaG1lbnRzPy5mb3JFYWNoPy4oKGNvbG9yQXR0YWNobWVudCkgPT5cclxuXHRcdFx0Y29sb3JBdHRhY2htZW50Py50ZXh0dXJlPy5zZXRTaXplPy4od2lkdGgsIGhlaWdodCwgZGVwdGgpXHJcblx0XHQpO1xyXG5cdH1cclxuXHRkZXN0cm95KCkge1xyXG5cdFx0aWYgKHRoaXMuY29sb3JBdHRhY2htZW50cykge1xyXG5cdFx0XHR0aGlzLmNvbG9yQXR0YWNobWVudHMuZm9yRWFjaCgoY29sb3JBdHRhY2htZW50KSA9PiB7XHJcblx0XHRcdFx0aWYgKGNvbG9yQXR0YWNobWVudC50ZXh0dXJlKSB7XHJcblx0XHRcdFx0XHRjb2xvckF0dGFjaG1lbnQudGV4dHVyZS5kZXN0cm95KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLmRlcHRoQXR0YWNobWVudC50ZXh0dXJlKSB0aGlzLmRlcHRoQXR0YWNobWVudC50ZXh0dXJlLmRlc3Ryb3koKTtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IGRlZmF1bHRWYWx1ZSBmcm9tIFwiLi4vdXRpbHMvZGVmYXVsdFZhbHVlXCI7XHJcbmltcG9ydCBkZWZpbmVkIGZyb20gXCIuLi91dGlscy9kZWZpbmVkXCI7XHJcbmltcG9ydCBHTWF0aCBmcm9tIFwiLi9NYXRoXCI7XHJcbmltcG9ydCBNYXRyaXg0IGZyb20gXCIuL01hdHJpeDRcIjtcclxuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gXCIuL1F1YXRlcm5pb25cIjtcclxuaW1wb3J0IFZlY3RvcjMgZnJvbSBcIi4vVmVjdG9yM1wiO1xyXG4vKipcclxuICogQSAzeDMgbWF0cml4LCBpbmRleGFibGUgYXMgYSBjb2x1bW4tbWFqb3Igb3JkZXIgYXJyYXkuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBbY29sdW1uMFJvdzA9MC4wXSBUaGUgdmFsdWUgZm9yIGNvbHVtbiAwLCByb3cgMC5cclxuICogQHBhcmFtIHtOdW1iZXJ9IFtjb2x1bW4xUm93MD0wLjBdIFRoZSB2YWx1ZSBmb3IgY29sdW1uIDEsIHJvdyAwLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gW2NvbHVtbjJSb3cwPTAuMF0gVGhlIHZhbHVlIGZvciBjb2x1bW4gMiwgcm93IDAuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBbY29sdW1uMFJvdzE9MC4wXSBUaGUgdmFsdWUgZm9yIGNvbHVtbiAwLCByb3cgMS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IFtjb2x1bW4xUm93MT0wLjBdIFRoZSB2YWx1ZSBmb3IgY29sdW1uIDEsIHJvdyAxLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gW2NvbHVtbjJSb3cxPTAuMF0gVGhlIHZhbHVlIGZvciBjb2x1bW4gMiwgcm93IDEuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBbY29sdW1uMFJvdzI9MC4wXSBUaGUgdmFsdWUgZm9yIGNvbHVtbiAwLCByb3cgMi5cclxuICogQHBhcmFtIHtOdW1iZXJ9IFtjb2x1bW4xUm93Mj0wLjBdIFRoZSB2YWx1ZSBmb3IgY29sdW1uIDEsIHJvdyAyLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gW2NvbHVtbjJSb3cyPTAuMF0gVGhlIHZhbHVlIGZvciBjb2x1bW4gMiwgcm93IDIuXHJcbiAqL1xyXG5jbGFzcyBNYXRyaXgzIHtcclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdGNvbHVtbjBSb3cwID0gMCxcclxuXHRcdGNvbHVtbjFSb3cwID0gMCxcclxuXHRcdGNvbHVtbjJSb3cwID0gMCxcclxuXHRcdGNvbHVtbjBSb3cxID0gMCxcclxuXHRcdGNvbHVtbjFSb3cxID0gMCxcclxuXHRcdGNvbHVtbjJSb3cxID0gMCxcclxuXHRcdGNvbHVtbjBSb3cyID0gMCxcclxuXHRcdGNvbHVtbjFSb3cyID0gMCxcclxuXHRcdGNvbHVtbjJSb3cyID0gMFxyXG5cdCkge1xyXG5cdFx0dGhpc1swXSA9IGNvbHVtbjBSb3cwO1xyXG5cdFx0dGhpc1sxXSA9IGNvbHVtbjBSb3cxO1xyXG5cdFx0dGhpc1syXSA9IGNvbHVtbjBSb3cyO1xyXG5cdFx0dGhpc1szXSA9IGNvbHVtbjFSb3cwO1xyXG5cdFx0dGhpc1s0XSA9IGNvbHVtbjFSb3cxO1xyXG5cdFx0dGhpc1s1XSA9IGNvbHVtbjFSb3cyO1xyXG5cdFx0dGhpc1s2XSA9IGNvbHVtbjJSb3cwO1xyXG5cdFx0dGhpc1s3XSA9IGNvbHVtbjJSb3cxO1xyXG5cdFx0dGhpc1s4XSA9IGNvbHVtbjJSb3cyO1xyXG5cdH1cclxuXHRzZXRGcm9tTWF0cml4NChtYXRyaXg6IE1hdHJpeDQpOiBNYXRyaXgzIHtcclxuXHRcdHRoaXNbMF0gPSBtYXRyaXhbMF07XHJcblx0XHR0aGlzWzFdID0gbWF0cml4WzFdO1xyXG5cdFx0dGhpc1syXSA9IG1hdHJpeFsyXTtcclxuXHRcdHRoaXNbM10gPSBtYXRyaXhbNF07XHJcblx0XHR0aGlzWzRdID0gbWF0cml4WzVdO1xyXG5cdFx0dGhpc1s1XSA9IG1hdHJpeFsyXTtcclxuXHRcdHRoaXNbNl0gPSBtYXRyaXhbOF07XHJcblx0XHR0aGlzWzddID0gbWF0cml4WzldO1xyXG5cdFx0dGhpc1s4XSA9IG1hdHJpeFsxMF07XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9XHJcblx0Z2V0Tm9ybWFsTWF0cml4KG1hdHJpeDQ6IE1hdHJpeDQpOiBNYXRyaXgzIHtcclxuXHRcdHRoaXMuc2V0RnJvbU1hdHJpeDQobWF0cml4NCk7XHJcblx0XHRNYXRyaXgzLmludmVyc2UodGhpcywgdGhpcyk7XHJcblx0XHRNYXRyaXgzLnRyYW5zcG9zZSh0aGlzLCB0aGlzKTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGNsb25lKG1hdHJpeDogTWF0cml4MyB8IG51bWJlcltdLCByZXN1bHQ6IE1hdHJpeDMpOiBNYXRyaXgzIHtcclxuXHRcdGlmICghZGVmaW5lZChtYXRyaXgpKSB7XHJcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblx0XHR9XHJcblx0XHRpZiAoIWRlZmluZWQocmVzdWx0KSkge1xyXG5cdFx0XHRyZXR1cm4gbmV3IE1hdHJpeDMoXHJcblx0XHRcdFx0bWF0cml4WzBdLFxyXG5cdFx0XHRcdG1hdHJpeFszXSxcclxuXHRcdFx0XHRtYXRyaXhbNl0sXHJcblx0XHRcdFx0bWF0cml4WzFdLFxyXG5cdFx0XHRcdG1hdHJpeFs0XSxcclxuXHRcdFx0XHRtYXRyaXhbN10sXHJcblx0XHRcdFx0bWF0cml4WzJdLFxyXG5cdFx0XHRcdG1hdHJpeFs1XSxcclxuXHRcdFx0XHRtYXRyaXhbOF1cclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHRcdHJlc3VsdFswXSA9IG1hdHJpeFswXTtcclxuXHRcdHJlc3VsdFsxXSA9IG1hdHJpeFsxXTtcclxuXHRcdHJlc3VsdFsyXSA9IG1hdHJpeFsyXTtcclxuXHRcdHJlc3VsdFszXSA9IG1hdHJpeFszXTtcclxuXHRcdHJlc3VsdFs0XSA9IG1hdHJpeFs0XTtcclxuXHRcdHJlc3VsdFs1XSA9IG1hdHJpeFs1XTtcclxuXHRcdHJlc3VsdFs2XSA9IG1hdHJpeFs2XTtcclxuXHRcdHJlc3VsdFs3XSA9IG1hdHJpeFs3XTtcclxuXHRcdHJlc3VsdFs4XSA9IG1hdHJpeFs4XTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZnJvbUNvbHVtbk1ham9yQXJyYXkodmFsdWVzOiBBcnJheTxudW1iZXI+LCByZXN1bHQ/OiBNYXRyaXgzKTogTWF0cml4MyB7XHJcblx0XHRpZiAoIWRlZmluZWQocmVzdWx0KSkge1xyXG5cdFx0XHRyZXN1bHQgPSBuZXcgTWF0cml4MygpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIE1hdHJpeDMuY2xvbmUodmFsdWVzLCByZXN1bHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGZyb21Sb3dNYWpvckFycmF5KHZhbHVlczogQXJyYXk8bnVtYmVyPiwgcmVzdWx0PzogTWF0cml4Myk6IE1hdHJpeDMge1xyXG5cdFx0aWYgKCFkZWZpbmVkKHJlc3VsdCkpIHtcclxuXHRcdFx0cmV0dXJuIG5ldyBNYXRyaXgzKFxyXG5cdFx0XHRcdHZhbHVlc1swXSxcclxuXHRcdFx0XHR2YWx1ZXNbMV0sXHJcblx0XHRcdFx0dmFsdWVzWzJdLFxyXG5cdFx0XHRcdHZhbHVlc1szXSxcclxuXHRcdFx0XHR2YWx1ZXNbNF0sXHJcblx0XHRcdFx0dmFsdWVzWzVdLFxyXG5cdFx0XHRcdHZhbHVlc1s2XSxcclxuXHRcdFx0XHR2YWx1ZXNbN10sXHJcblx0XHRcdFx0dmFsdWVzWzhdXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblx0XHRyZXN1bHRbMF0gPSB2YWx1ZXNbMF07XHJcblx0XHRyZXN1bHRbMV0gPSB2YWx1ZXNbM107XHJcblx0XHRyZXN1bHRbMl0gPSB2YWx1ZXNbNl07XHJcblx0XHRyZXN1bHRbM10gPSB2YWx1ZXNbMV07XHJcblx0XHRyZXN1bHRbNF0gPSB2YWx1ZXNbNF07XHJcblx0XHRyZXN1bHRbNV0gPSB2YWx1ZXNbN107XHJcblx0XHRyZXN1bHRbNl0gPSB2YWx1ZXNbMl07XHJcblx0XHRyZXN1bHRbN10gPSB2YWx1ZXNbNV07XHJcblx0XHRyZXN1bHRbOF0gPSB2YWx1ZXNbOF07XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGZyb21RdWF0ZXJuaW9uKHF1YXRlcm5pb246IFF1YXRlcm5pb24sIHJlc3VsdD86IE1hdHJpeDMpOiBNYXRyaXgzIHtcclxuXHRcdGNvbnN0IHgyID0gcXVhdGVybmlvbi54ICogcXVhdGVybmlvbi54O1xyXG5cdFx0Y29uc3QgeHkgPSBxdWF0ZXJuaW9uLnggKiBxdWF0ZXJuaW9uLnk7XHJcblx0XHRjb25zdCB4eiA9IHF1YXRlcm5pb24ueCAqIHF1YXRlcm5pb24uejtcclxuXHRcdGNvbnN0IHh3ID0gcXVhdGVybmlvbi54ICogcXVhdGVybmlvbi53O1xyXG5cdFx0Y29uc3QgeTIgPSBxdWF0ZXJuaW9uLnkgKiBxdWF0ZXJuaW9uLnk7XHJcblx0XHRjb25zdCB5eiA9IHF1YXRlcm5pb24ueSAqIHF1YXRlcm5pb24uejtcclxuXHRcdGNvbnN0IHl3ID0gcXVhdGVybmlvbi55ICogcXVhdGVybmlvbi53O1xyXG5cdFx0Y29uc3QgejIgPSBxdWF0ZXJuaW9uLnogKiBxdWF0ZXJuaW9uLno7XHJcblx0XHRjb25zdCB6dyA9IHF1YXRlcm5pb24ueiAqIHF1YXRlcm5pb24udztcclxuXHRcdGNvbnN0IHcyID0gcXVhdGVybmlvbi53ICogcXVhdGVybmlvbi53O1xyXG5cclxuXHRcdGNvbnN0IG0wMCA9IHgyIC0geTIgLSB6MiArIHcyO1xyXG5cdFx0Y29uc3QgbTAxID0gMi4wICogKHh5IC0gencpO1xyXG5cdFx0Y29uc3QgbTAyID0gMi4wICogKHh6ICsgeXcpO1xyXG5cclxuXHRcdGNvbnN0IG0xMCA9IDIuMCAqICh4eSArIHp3KTtcclxuXHRcdGNvbnN0IG0xMSA9IC14MiArIHkyIC0gejIgKyB3MjtcclxuXHRcdGNvbnN0IG0xMiA9IDIuMCAqICh5eiAtIHh3KTtcclxuXHJcblx0XHRjb25zdCBtMjAgPSAyLjAgKiAoeHogLSB5dyk7XHJcblx0XHRjb25zdCBtMjEgPSAyLjAgKiAoeXogKyB4dyk7XHJcblx0XHRjb25zdCBtMjIgPSAteDIgLSB5MiArIHoyICsgdzI7XHJcblxyXG5cdFx0aWYgKCFkZWZpbmVkKHJlc3VsdCkpIHtcclxuXHRcdFx0cmV0dXJuIG5ldyBNYXRyaXgzKG0wMCwgbTAxLCBtMDIsIG0xMCwgbTExLCBtMTIsIG0yMCwgbTIxLCBtMjIpO1xyXG5cdFx0fVxyXG5cdFx0cmVzdWx0WzBdID0gbTAwO1xyXG5cdFx0cmVzdWx0WzFdID0gbTEwO1xyXG5cdFx0cmVzdWx0WzJdID0gbTIwO1xyXG5cdFx0cmVzdWx0WzNdID0gbTAxO1xyXG5cdFx0cmVzdWx0WzRdID0gbTExO1xyXG5cdFx0cmVzdWx0WzVdID0gbTIxO1xyXG5cdFx0cmVzdWx0WzZdID0gbTAyO1xyXG5cdFx0cmVzdWx0WzddID0gbTEyO1xyXG5cdFx0cmVzdWx0WzhdID0gbTIyO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBmcm9tU2NhbGUoc2NhbGU6IFZlY3RvcjMsIHJlc3VsdDogTWF0cml4Myk6IE1hdHJpeDMge1xyXG5cdFx0aWYgKCFkZWZpbmVkKHJlc3VsdCkpIHtcclxuXHRcdFx0cmV0dXJuIG5ldyBNYXRyaXgzKHNjYWxlLngsIDAuMCwgMC4wLCAwLjAsIHNjYWxlLnksIDAuMCwgMC4wLCAwLjAsIHNjYWxlLnopO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJlc3VsdFswXSA9IHNjYWxlLng7XHJcblx0XHRyZXN1bHRbMV0gPSAwLjA7XHJcblx0XHRyZXN1bHRbMl0gPSAwLjA7XHJcblx0XHRyZXN1bHRbM10gPSAwLjA7XHJcblx0XHRyZXN1bHRbNF0gPSBzY2FsZS55O1xyXG5cdFx0cmVzdWx0WzVdID0gMC4wO1xyXG5cdFx0cmVzdWx0WzZdID0gMC4wO1xyXG5cdFx0cmVzdWx0WzddID0gMC4wO1xyXG5cdFx0cmVzdWx0WzhdID0gc2NhbGUuejtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZnJvbVJvdGF0aW9uWChhbmdsZTogbnVtYmVyLCByZXN1bHQ6IE1hdHJpeDMpOiBNYXRyaXgzIHtcclxuXHRcdGNvbnN0IGNvc0FuZ2xlID0gTWF0aC5jb3MoYW5nbGUpO1xyXG5cdFx0Y29uc3Qgc2luQW5nbGUgPSBNYXRoLnNpbihhbmdsZSk7XHJcblxyXG5cdFx0aWYgKCFkZWZpbmVkKHJlc3VsdCkpIHtcclxuXHRcdFx0cmV0dXJuIG5ldyBNYXRyaXgzKDEuMCwgMC4wLCAwLjAsIDAuMCwgY29zQW5nbGUsIC1zaW5BbmdsZSwgMC4wLCBzaW5BbmdsZSwgY29zQW5nbGUpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJlc3VsdFswXSA9IDEuMDtcclxuXHRcdHJlc3VsdFsxXSA9IDAuMDtcclxuXHRcdHJlc3VsdFsyXSA9IDAuMDtcclxuXHRcdHJlc3VsdFszXSA9IDAuMDtcclxuXHRcdHJlc3VsdFs0XSA9IGNvc0FuZ2xlO1xyXG5cdFx0cmVzdWx0WzVdID0gc2luQW5nbGU7XHJcblx0XHRyZXN1bHRbNl0gPSAwLjA7XHJcblx0XHRyZXN1bHRbN10gPSAtc2luQW5nbGU7XHJcblx0XHRyZXN1bHRbOF0gPSBjb3NBbmdsZTtcclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGZyb21Sb3RhdGlvblkoYW5nbGU6IG51bWJlciwgcmVzdWx0OiBNYXRyaXgzKTogTWF0cml4MyB7XHJcblx0XHRjb25zdCBjb3NBbmdsZSA9IE1hdGguY29zKGFuZ2xlKTtcclxuXHRcdGNvbnN0IHNpbkFuZ2xlID0gTWF0aC5zaW4oYW5nbGUpO1xyXG5cclxuXHRcdGlmICghZGVmaW5lZChyZXN1bHQpKSB7XHJcblx0XHRcdHJldHVybiBuZXcgTWF0cml4Myhjb3NBbmdsZSwgMC4wLCBzaW5BbmdsZSwgMC4wLCAxLjAsIDAuMCwgLXNpbkFuZ2xlLCAwLjAsIGNvc0FuZ2xlKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXN1bHRbMF0gPSBjb3NBbmdsZTtcclxuXHRcdHJlc3VsdFsxXSA9IDAuMDtcclxuXHRcdHJlc3VsdFsyXSA9IC1zaW5BbmdsZTtcclxuXHRcdHJlc3VsdFszXSA9IDAuMDtcclxuXHRcdHJlc3VsdFs0XSA9IDEuMDtcclxuXHRcdHJlc3VsdFs1XSA9IDAuMDtcclxuXHRcdHJlc3VsdFs2XSA9IHNpbkFuZ2xlO1xyXG5cdFx0cmVzdWx0WzddID0gMC4wO1xyXG5cdFx0cmVzdWx0WzhdID0gY29zQW5nbGU7XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBmcm9tUm90YXRpb25ac3RhdGljKGFuZ2xlOiBudW1iZXIsIHJlc3VsdDogTWF0cml4Myk6IE1hdHJpeDMge1xyXG5cdFx0Y29uc3QgY29zQW5nbGUgPSBNYXRoLmNvcyhhbmdsZSk7XHJcblx0XHRjb25zdCBzaW5BbmdsZSA9IE1hdGguc2luKGFuZ2xlKTtcclxuXHJcblx0XHRpZiAoIWRlZmluZWQocmVzdWx0KSkge1xyXG5cdFx0XHRyZXR1cm4gbmV3IE1hdHJpeDMoY29zQW5nbGUsIC1zaW5BbmdsZSwgMC4wLCBzaW5BbmdsZSwgY29zQW5nbGUsIDAuMCwgMC4wLCAwLjAsIDEuMCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmVzdWx0WzBdID0gY29zQW5nbGU7XHJcblx0XHRyZXN1bHRbMV0gPSBzaW5BbmdsZTtcclxuXHRcdHJlc3VsdFsyXSA9IDAuMDtcclxuXHRcdHJlc3VsdFszXSA9IC1zaW5BbmdsZTtcclxuXHRcdHJlc3VsdFs0XSA9IGNvc0FuZ2xlO1xyXG5cdFx0cmVzdWx0WzVdID0gMC4wO1xyXG5cdFx0cmVzdWx0WzZdID0gMC4wO1xyXG5cdFx0cmVzdWx0WzddID0gMC4wO1xyXG5cdFx0cmVzdWx0WzhdID0gMS4wO1xyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cdHRvQXJyYXkoKSB7XHJcblx0XHRjb25zdCByZXN1bHQgPSBbXTtcclxuXHRcdE1hdHJpeDMudG9BcnJheSh0aGlzLCByZXN1bHQpO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyB0b0FycmF5KG1hdHJpeDogTWF0cml4MywgcmVzdWx0OiBudW1iZXJbXSk6IG51bWJlcltdIHtcclxuXHRcdGlmICghZGVmaW5lZChyZXN1bHQpKSB7XHJcblx0XHRcdHJldHVybiBbbWF0cml4WzBdLCBtYXRyaXhbMV0sIG1hdHJpeFsyXSwgbWF0cml4WzNdLCBtYXRyaXhbNF0sIG1hdHJpeFs1XSwgbWF0cml4WzZdLCBtYXRyaXhbN10sIG1hdHJpeFs4XV07XHJcblx0XHR9XHJcblx0XHRyZXN1bHRbMF0gPSBtYXRyaXhbMF07XHJcblx0XHRyZXN1bHRbMV0gPSBtYXRyaXhbMV07XHJcblx0XHRyZXN1bHRbMl0gPSBtYXRyaXhbMl07XHJcblx0XHRyZXN1bHRbM10gPSBtYXRyaXhbM107XHJcblx0XHRyZXN1bHRbNF0gPSBtYXRyaXhbNF07XHJcblx0XHRyZXN1bHRbNV0gPSBtYXRyaXhbNV07XHJcblx0XHRyZXN1bHRbNl0gPSBtYXRyaXhbNl07XHJcblx0XHRyZXN1bHRbN10gPSBtYXRyaXhbN107XHJcblx0XHRyZXN1bHRbOF0gPSBtYXRyaXhbOF07XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEVsZW1lbnRJbmRleChjb2x1bW46IG51bWJlciwgcm93OiBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIGNvbHVtbiAqIDMgKyByb3c7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0Q29sdW1uKG1hdHJpeDogTWF0cml4MywgaW5kZXg6IG51bWJlciwgcmVzdWx0OiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcblx0XHRjb25zdCBzdGFydEluZGV4ID0gaW5kZXggKiAzO1xyXG5cdFx0Y29uc3QgeCA9IG1hdHJpeFtzdGFydEluZGV4XTtcclxuXHRcdGNvbnN0IHkgPSBtYXRyaXhbc3RhcnRJbmRleCArIDFdO1xyXG5cdFx0Y29uc3QgeiA9IG1hdHJpeFtzdGFydEluZGV4ICsgMl07XHJcblxyXG5cdFx0cmVzdWx0LnggPSB4O1xyXG5cdFx0cmVzdWx0LnkgPSB5O1xyXG5cdFx0cmVzdWx0LnogPSB6O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBzZXRDb2x1bW4obWF0cml4OiBNYXRyaXgzLCBpbmRleDogbnVtYmVyLCBjYXJ0ZXNpYW46IFZlY3RvcjMsIHJlc3VsdDogTWF0cml4Myk6IE1hdHJpeDMge1xyXG5cdFx0cmVzdWx0ID0gTWF0cml4My5jbG9uZShtYXRyaXgsIHJlc3VsdCk7XHJcblx0XHRjb25zdCBzdGFydEluZGV4ID0gaW5kZXggKiAzO1xyXG5cdFx0cmVzdWx0W3N0YXJ0SW5kZXhdID0gY2FydGVzaWFuLng7XHJcblx0XHRyZXN1bHRbc3RhcnRJbmRleCArIDFdID0gY2FydGVzaWFuLnk7XHJcblx0XHRyZXN1bHRbc3RhcnRJbmRleCArIDJdID0gY2FydGVzaWFuLno7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldFJvdyhtYXRyaXg6IE1hdHJpeDMsIGluZGV4OiBudW1iZXIsIHJlc3VsdDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG5cdFx0Y29uc3QgeCA9IG1hdHJpeFtpbmRleF07XHJcblx0XHRjb25zdCB5ID0gbWF0cml4W2luZGV4ICsgM107XHJcblx0XHRjb25zdCB6ID0gbWF0cml4W2luZGV4ICsgNl07XHJcblxyXG5cdFx0cmVzdWx0LnggPSB4O1xyXG5cdFx0cmVzdWx0LnkgPSB5O1xyXG5cdFx0cmVzdWx0LnogPSB6O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBzZXRSb3cobWF0cml4OiBNYXRyaXgzLCBpbmRleDogbnVtYmVyLCBjYXJ0ZXNpYW46IFZlY3RvcjMsIHJlc3VsdDogTWF0cml4Myk6IE1hdHJpeDMge1xyXG5cdFx0cmVzdWx0ID0gTWF0cml4My5jbG9uZShtYXRyaXgsIHJlc3VsdCk7XHJcblx0XHRyZXN1bHRbaW5kZXhdID0gY2FydGVzaWFuLng7XHJcblx0XHRyZXN1bHRbaW5kZXggKyAzXSA9IGNhcnRlc2lhbi55O1xyXG5cdFx0cmVzdWx0W2luZGV4ICsgNl0gPSBjYXJ0ZXNpYW4uejtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgc2V0U2NhbGUobWF0cml4OiBNYXRyaXgzLCBzY2FsZTogVmVjdG9yMywgcmVzdWx0OiBNYXRyaXgzKTogTWF0cml4MyB7XHJcblx0XHRjb25zdCBleGlzdGluZ1NjYWxlID0gTWF0cml4My5nZXRTY2FsZShtYXRyaXgsIHNjYWxlU2NyYXRjaDEpO1xyXG5cdFx0Y29uc3Qgc2NhbGVSYXRpb1ggPSBzY2FsZS54IC8gZXhpc3RpbmdTY2FsZS54O1xyXG5cdFx0Y29uc3Qgc2NhbGVSYXRpb1kgPSBzY2FsZS55IC8gZXhpc3RpbmdTY2FsZS55O1xyXG5cdFx0Y29uc3Qgc2NhbGVSYXRpb1ogPSBzY2FsZS56IC8gZXhpc3RpbmdTY2FsZS56O1xyXG5cclxuXHRcdHJlc3VsdFswXSA9IG1hdHJpeFswXSAqIHNjYWxlUmF0aW9YO1xyXG5cdFx0cmVzdWx0WzFdID0gbWF0cml4WzFdICogc2NhbGVSYXRpb1g7XHJcblx0XHRyZXN1bHRbMl0gPSBtYXRyaXhbMl0gKiBzY2FsZVJhdGlvWDtcclxuXHRcdHJlc3VsdFszXSA9IG1hdHJpeFszXSAqIHNjYWxlUmF0aW9ZO1xyXG5cdFx0cmVzdWx0WzRdID0gbWF0cml4WzRdICogc2NhbGVSYXRpb1k7XHJcblx0XHRyZXN1bHRbNV0gPSBtYXRyaXhbNV0gKiBzY2FsZVJhdGlvWTtcclxuXHRcdHJlc3VsdFs2XSA9IG1hdHJpeFs2XSAqIHNjYWxlUmF0aW9aO1xyXG5cdFx0cmVzdWx0WzddID0gbWF0cml4WzddICogc2NhbGVSYXRpb1o7XHJcblx0XHRyZXN1bHRbOF0gPSBtYXRyaXhbOF0gKiBzY2FsZVJhdGlvWjtcclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldFNjYWxlKG1hdHJpeDogTWF0cml4MywgcmVzdWx0OiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcblx0XHRyZXN1bHQueCA9IFZlY3RvcjMubWFnbml0dWRlKFZlY3RvcjMuZnJvbUVsZW1lbnRzKG1hdHJpeFswXSwgbWF0cml4WzFdLCBtYXRyaXhbMl0sIHNjcmF0Y2hDb2x1bW4pKTtcclxuXHRcdHJlc3VsdC55ID0gVmVjdG9yMy5tYWduaXR1ZGUoVmVjdG9yMy5mcm9tRWxlbWVudHMobWF0cml4WzNdLCBtYXRyaXhbNF0sIG1hdHJpeFs1XSwgc2NyYXRjaENvbHVtbikpO1xyXG5cdFx0cmVzdWx0LnogPSBWZWN0b3IzLm1hZ25pdHVkZShWZWN0b3IzLmZyb21FbGVtZW50cyhtYXRyaXhbNl0sIG1hdHJpeFs3XSwgbWF0cml4WzhdLCBzY3JhdGNoQ29sdW1uKSk7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldE1heGltdW1TY2FsZShtYXRyaXg6IE1hdHJpeDMpOiBudW1iZXIge1xyXG5cdFx0TWF0cml4My5nZXRTY2FsZShtYXRyaXgsIHNjYWxlU2NyYXRjaDMpO1xyXG5cdFx0cmV0dXJuIFZlY3RvcjMubWF4aW11bUNvbXBvbmVudChzY2FsZVNjcmF0Y2gzKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBzZXRSb3RhdGlvbihtYXRyaXg6IE1hdHJpeDMsIHJvdGF0aW9uOiBNYXRyaXgzLCByZXN1bHQ6IE1hdHJpeDMpOiBNYXRyaXgzIHtcclxuXHRcdGNvbnN0IHNjYWxlID0gTWF0cml4My5nZXRTY2FsZShtYXRyaXgsIHNjYWxlU2NyYXRjaDQpO1xyXG5cclxuXHRcdHJlc3VsdFswXSA9IHJvdGF0aW9uWzBdICogc2NhbGUueDtcclxuXHRcdHJlc3VsdFsxXSA9IHJvdGF0aW9uWzFdICogc2NhbGUueDtcclxuXHRcdHJlc3VsdFsyXSA9IHJvdGF0aW9uWzJdICogc2NhbGUueDtcclxuXHRcdHJlc3VsdFszXSA9IHJvdGF0aW9uWzNdICogc2NhbGUueTtcclxuXHRcdHJlc3VsdFs0XSA9IHJvdGF0aW9uWzRdICogc2NhbGUueTtcclxuXHRcdHJlc3VsdFs1XSA9IHJvdGF0aW9uWzVdICogc2NhbGUueTtcclxuXHRcdHJlc3VsdFs2XSA9IHJvdGF0aW9uWzZdICogc2NhbGUuejtcclxuXHRcdHJlc3VsdFs3XSA9IHJvdGF0aW9uWzddICogc2NhbGUuejtcclxuXHRcdHJlc3VsdFs4XSA9IHJvdGF0aW9uWzhdICogc2NhbGUuejtcclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldFJvdGF0aW9uKG1hdHJpeDogTWF0cml4MywgcmVzdWx0OiBNYXRyaXgzKTogTWF0cml4MyB7XHJcblx0XHRjb25zdCBzY2FsZSA9IE1hdHJpeDMuZ2V0U2NhbGUobWF0cml4LCBzY2FsZVNjcmF0Y2g1KTtcclxuXHJcblx0XHRyZXN1bHRbMF0gPSBtYXRyaXhbMF0gLyBzY2FsZS54O1xyXG5cdFx0cmVzdWx0WzFdID0gbWF0cml4WzFdIC8gc2NhbGUueDtcclxuXHRcdHJlc3VsdFsyXSA9IG1hdHJpeFsyXSAvIHNjYWxlLng7XHJcblx0XHRyZXN1bHRbM10gPSBtYXRyaXhbM10gLyBzY2FsZS55O1xyXG5cdFx0cmVzdWx0WzRdID0gbWF0cml4WzRdIC8gc2NhbGUueTtcclxuXHRcdHJlc3VsdFs1XSA9IG1hdHJpeFs1XSAvIHNjYWxlLnk7XHJcblx0XHRyZXN1bHRbNl0gPSBtYXRyaXhbNl0gLyBzY2FsZS56O1xyXG5cdFx0cmVzdWx0WzddID0gbWF0cml4WzddIC8gc2NhbGUuejtcclxuXHRcdHJlc3VsdFs4XSA9IG1hdHJpeFs4XSAvIHNjYWxlLno7XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtdWx0aXBseShsZWZ0OiBNYXRyaXgzLCByaWdodDogTWF0cml4MywgcmVzdWx0OiBNYXRyaXgzKTogTWF0cml4MyB7XHJcblx0XHRjb25zdCBjb2x1bW4wUm93MCA9IGxlZnRbMF0gKiByaWdodFswXSArIGxlZnRbM10gKiByaWdodFsxXSArIGxlZnRbNl0gKiByaWdodFsyXTtcclxuXHRcdGNvbnN0IGNvbHVtbjBSb3cxID0gbGVmdFsxXSAqIHJpZ2h0WzBdICsgbGVmdFs0XSAqIHJpZ2h0WzFdICsgbGVmdFs3XSAqIHJpZ2h0WzJdO1xyXG5cdFx0Y29uc3QgY29sdW1uMFJvdzIgPSBsZWZ0WzJdICogcmlnaHRbMF0gKyBsZWZ0WzVdICogcmlnaHRbMV0gKyBsZWZ0WzhdICogcmlnaHRbMl07XHJcblxyXG5cdFx0Y29uc3QgY29sdW1uMVJvdzAgPSBsZWZ0WzBdICogcmlnaHRbM10gKyBsZWZ0WzNdICogcmlnaHRbNF0gKyBsZWZ0WzZdICogcmlnaHRbNV07XHJcblx0XHRjb25zdCBjb2x1bW4xUm93MSA9IGxlZnRbMV0gKiByaWdodFszXSArIGxlZnRbNF0gKiByaWdodFs0XSArIGxlZnRbN10gKiByaWdodFs1XTtcclxuXHRcdGNvbnN0IGNvbHVtbjFSb3cyID0gbGVmdFsyXSAqIHJpZ2h0WzNdICsgbGVmdFs1XSAqIHJpZ2h0WzRdICsgbGVmdFs4XSAqIHJpZ2h0WzVdO1xyXG5cclxuXHRcdGNvbnN0IGNvbHVtbjJSb3cwID0gbGVmdFswXSAqIHJpZ2h0WzZdICsgbGVmdFszXSAqIHJpZ2h0WzddICsgbGVmdFs2XSAqIHJpZ2h0WzhdO1xyXG5cdFx0Y29uc3QgY29sdW1uMlJvdzEgPSBsZWZ0WzFdICogcmlnaHRbNl0gKyBsZWZ0WzRdICogcmlnaHRbN10gKyBsZWZ0WzddICogcmlnaHRbOF07XHJcblx0XHRjb25zdCBjb2x1bW4yUm93MiA9IGxlZnRbMl0gKiByaWdodFs2XSArIGxlZnRbNV0gKiByaWdodFs3XSArIGxlZnRbOF0gKiByaWdodFs4XTtcclxuXHJcblx0XHRyZXN1bHRbMF0gPSBjb2x1bW4wUm93MDtcclxuXHRcdHJlc3VsdFsxXSA9IGNvbHVtbjBSb3cxO1xyXG5cdFx0cmVzdWx0WzJdID0gY29sdW1uMFJvdzI7XHJcblx0XHRyZXN1bHRbM10gPSBjb2x1bW4xUm93MDtcclxuXHRcdHJlc3VsdFs0XSA9IGNvbHVtbjFSb3cxO1xyXG5cdFx0cmVzdWx0WzVdID0gY29sdW1uMVJvdzI7XHJcblx0XHRyZXN1bHRbNl0gPSBjb2x1bW4yUm93MDtcclxuXHRcdHJlc3VsdFs3XSA9IGNvbHVtbjJSb3cxO1xyXG5cdFx0cmVzdWx0WzhdID0gY29sdW1uMlJvdzI7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGFkZChsZWZ0OiBNYXRyaXgzLCByaWdodDogTWF0cml4MywgcmVzdWx0OiBNYXRyaXgzKTogTWF0cml4MyB7XHJcblx0XHRyZXN1bHRbMF0gPSBsZWZ0WzBdICsgcmlnaHRbMF07XHJcblx0XHRyZXN1bHRbMV0gPSBsZWZ0WzFdICsgcmlnaHRbMV07XHJcblx0XHRyZXN1bHRbMl0gPSBsZWZ0WzJdICsgcmlnaHRbMl07XHJcblx0XHRyZXN1bHRbM10gPSBsZWZ0WzNdICsgcmlnaHRbM107XHJcblx0XHRyZXN1bHRbNF0gPSBsZWZ0WzRdICsgcmlnaHRbNF07XHJcblx0XHRyZXN1bHRbNV0gPSBsZWZ0WzVdICsgcmlnaHRbNV07XHJcblx0XHRyZXN1bHRbNl0gPSBsZWZ0WzZdICsgcmlnaHRbNl07XHJcblx0XHRyZXN1bHRbN10gPSBsZWZ0WzddICsgcmlnaHRbN107XHJcblx0XHRyZXN1bHRbOF0gPSBsZWZ0WzhdICsgcmlnaHRbOF07XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHN1YnRyYWN0KGxlZnQ6IE1hdHJpeDMsIHJpZ2h0OiBNYXRyaXgzLCByZXN1bHQ6IE1hdHJpeDMpIHtcclxuXHRcdHJlc3VsdFswXSA9IGxlZnRbMF0gLSByaWdodFswXTtcclxuXHRcdHJlc3VsdFsxXSA9IGxlZnRbMV0gLSByaWdodFsxXTtcclxuXHRcdHJlc3VsdFsyXSA9IGxlZnRbMl0gLSByaWdodFsyXTtcclxuXHRcdHJlc3VsdFszXSA9IGxlZnRbM10gLSByaWdodFszXTtcclxuXHRcdHJlc3VsdFs0XSA9IGxlZnRbNF0gLSByaWdodFs0XTtcclxuXHRcdHJlc3VsdFs1XSA9IGxlZnRbNV0gLSByaWdodFs1XTtcclxuXHRcdHJlc3VsdFs2XSA9IGxlZnRbNl0gLSByaWdodFs2XTtcclxuXHRcdHJlc3VsdFs3XSA9IGxlZnRbN10gLSByaWdodFs3XTtcclxuXHRcdHJlc3VsdFs4XSA9IGxlZnRbOF0gLSByaWdodFs4XTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbXVsdGlwbHlCeVZlY3RvcihtYXRyaXg6IE1hdHJpeDMsIGNhcnRlc2lhbjogVmVjdG9yMywgcmVzdWx0OiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcblx0XHRjb25zdCB2WCA9IGNhcnRlc2lhbi54O1xyXG5cdFx0Y29uc3QgdlkgPSBjYXJ0ZXNpYW4ueTtcclxuXHRcdGNvbnN0IHZaID0gY2FydGVzaWFuLno7XHJcblxyXG5cdFx0Y29uc3QgeCA9IG1hdHJpeFswXSAqIHZYICsgbWF0cml4WzNdICogdlkgKyBtYXRyaXhbNl0gKiB2WjtcclxuXHRcdGNvbnN0IHkgPSBtYXRyaXhbMV0gKiB2WCArIG1hdHJpeFs0XSAqIHZZICsgbWF0cml4WzddICogdlo7XHJcblx0XHRjb25zdCB6ID0gbWF0cml4WzJdICogdlggKyBtYXRyaXhbNV0gKiB2WSArIG1hdHJpeFs4XSAqIHZaO1xyXG5cclxuXHRcdHJlc3VsdC54ID0geDtcclxuXHRcdHJlc3VsdC55ID0geTtcclxuXHRcdHJlc3VsdC56ID0gejtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbXVsdGlwbHlCeVNjYWxhcihtYXRyaXg6IE1hdHJpeDMsIHNjYWxhcjogbnVtYmVyLCByZXN1bHQ6IE1hdHJpeDMpOiBNYXRyaXgzIHtcclxuXHRcdHJlc3VsdFswXSA9IG1hdHJpeFswXSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFsxXSA9IG1hdHJpeFsxXSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFsyXSA9IG1hdHJpeFsyXSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFszXSA9IG1hdHJpeFszXSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFs0XSA9IG1hdHJpeFs0XSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFs1XSA9IG1hdHJpeFs1XSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFs2XSA9IG1hdHJpeFs2XSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFs3XSA9IG1hdHJpeFs3XSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFs4XSA9IG1hdHJpeFs4XSAqIHNjYWxhcjtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbXVsdGlwbHlCeVNjYWxlKG1hdHJpeDogTWF0cml4Mywgc2NhbGU6IFZlY3RvcjMsIHJlc3VsdDogTWF0cml4Myk6IE1hdHJpeDMge1xyXG5cdFx0cmVzdWx0WzBdID0gbWF0cml4WzBdICogc2NhbGUueDtcclxuXHRcdHJlc3VsdFsxXSA9IG1hdHJpeFsxXSAqIHNjYWxlLng7XHJcblx0XHRyZXN1bHRbMl0gPSBtYXRyaXhbMl0gKiBzY2FsZS54O1xyXG5cdFx0cmVzdWx0WzNdID0gbWF0cml4WzNdICogc2NhbGUueTtcclxuXHRcdHJlc3VsdFs0XSA9IG1hdHJpeFs0XSAqIHNjYWxlLnk7XHJcblx0XHRyZXN1bHRbNV0gPSBtYXRyaXhbNV0gKiBzY2FsZS55O1xyXG5cdFx0cmVzdWx0WzZdID0gbWF0cml4WzZdICogc2NhbGUuejtcclxuXHRcdHJlc3VsdFs3XSA9IG1hdHJpeFs3XSAqIHNjYWxlLno7XHJcblx0XHRyZXN1bHRbOF0gPSBtYXRyaXhbOF0gKiBzY2FsZS56O1xyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbmVnYXRlKG1hdHJpeDogTWF0cml4MywgcmVzdWx0OiBNYXRyaXgzKTogTWF0cml4MyB7XHJcblx0XHRyZXN1bHRbMF0gPSAtbWF0cml4WzBdO1xyXG5cdFx0cmVzdWx0WzFdID0gLW1hdHJpeFsxXTtcclxuXHRcdHJlc3VsdFsyXSA9IC1tYXRyaXhbMl07XHJcblx0XHRyZXN1bHRbM10gPSAtbWF0cml4WzNdO1xyXG5cdFx0cmVzdWx0WzRdID0gLW1hdHJpeFs0XTtcclxuXHRcdHJlc3VsdFs1XSA9IC1tYXRyaXhbNV07XHJcblx0XHRyZXN1bHRbNl0gPSAtbWF0cml4WzZdO1xyXG5cdFx0cmVzdWx0WzddID0gLW1hdHJpeFs3XTtcclxuXHRcdHJlc3VsdFs4XSA9IC1tYXRyaXhbOF07XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHRyYW5zcG9zZShtYXRyaXg6IE1hdHJpeDMsIHJlc3VsdDogTWF0cml4Myk6IE1hdHJpeDMge1xyXG5cdFx0Y29uc3QgY29sdW1uMFJvdzAgPSBtYXRyaXhbMF07XHJcblx0XHRjb25zdCBjb2x1bW4wUm93MSA9IG1hdHJpeFszXTtcclxuXHRcdGNvbnN0IGNvbHVtbjBSb3cyID0gbWF0cml4WzZdO1xyXG5cdFx0Y29uc3QgY29sdW1uMVJvdzAgPSBtYXRyaXhbMV07XHJcblx0XHRjb25zdCBjb2x1bW4xUm93MSA9IG1hdHJpeFs0XTtcclxuXHRcdGNvbnN0IGNvbHVtbjFSb3cyID0gbWF0cml4WzddO1xyXG5cdFx0Y29uc3QgY29sdW1uMlJvdzAgPSBtYXRyaXhbMl07XHJcblx0XHRjb25zdCBjb2x1bW4yUm93MSA9IG1hdHJpeFs1XTtcclxuXHRcdGNvbnN0IGNvbHVtbjJSb3cyID0gbWF0cml4WzhdO1xyXG5cclxuXHRcdHJlc3VsdFswXSA9IGNvbHVtbjBSb3cwO1xyXG5cdFx0cmVzdWx0WzFdID0gY29sdW1uMFJvdzE7XHJcblx0XHRyZXN1bHRbMl0gPSBjb2x1bW4wUm93MjtcclxuXHRcdHJlc3VsdFszXSA9IGNvbHVtbjFSb3cwO1xyXG5cdFx0cmVzdWx0WzRdID0gY29sdW1uMVJvdzE7XHJcblx0XHRyZXN1bHRbNV0gPSBjb2x1bW4xUm93MjtcclxuXHRcdHJlc3VsdFs2XSA9IGNvbHVtbjJSb3cwO1xyXG5cdFx0cmVzdWx0WzddID0gY29sdW1uMlJvdzE7XHJcblx0XHRyZXN1bHRbOF0gPSBjb2x1bW4yUm93MjtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgYWJzKG1hdHJpeDogTWF0cml4MywgcmVzdWx0OiBNYXRyaXgzKTogTWF0cml4MyB7XHJcblx0XHRyZXN1bHRbMF0gPSBNYXRoLmFicyhtYXRyaXhbMF0pO1xyXG5cdFx0cmVzdWx0WzFdID0gTWF0aC5hYnMobWF0cml4WzFdKTtcclxuXHRcdHJlc3VsdFsyXSA9IE1hdGguYWJzKG1hdHJpeFsyXSk7XHJcblx0XHRyZXN1bHRbM10gPSBNYXRoLmFicyhtYXRyaXhbM10pO1xyXG5cdFx0cmVzdWx0WzRdID0gTWF0aC5hYnMobWF0cml4WzRdKTtcclxuXHRcdHJlc3VsdFs1XSA9IE1hdGguYWJzKG1hdHJpeFs1XSk7XHJcblx0XHRyZXN1bHRbNl0gPSBNYXRoLmFicyhtYXRyaXhbNl0pO1xyXG5cdFx0cmVzdWx0WzddID0gTWF0aC5hYnMobWF0cml4WzddKTtcclxuXHRcdHJlc3VsdFs4XSA9IE1hdGguYWJzKG1hdHJpeFs4XSk7XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBkZXRlcm1pbmFudChtYXRyaXg6IE1hdHJpeDMpOiBudW1iZXIge1xyXG5cdFx0Y29uc3QgbTExID0gbWF0cml4WzBdO1xyXG5cdFx0Y29uc3QgbTIxID0gbWF0cml4WzNdO1xyXG5cdFx0Y29uc3QgbTMxID0gbWF0cml4WzZdO1xyXG5cdFx0Y29uc3QgbTEyID0gbWF0cml4WzFdO1xyXG5cdFx0Y29uc3QgbTIyID0gbWF0cml4WzRdO1xyXG5cdFx0Y29uc3QgbTMyID0gbWF0cml4WzddO1xyXG5cdFx0Y29uc3QgbTEzID0gbWF0cml4WzJdO1xyXG5cdFx0Y29uc3QgbTIzID0gbWF0cml4WzVdO1xyXG5cdFx0Y29uc3QgbTMzID0gbWF0cml4WzhdO1xyXG5cclxuXHRcdHJldHVybiBtMTEgKiAobTIyICogbTMzIC0gbTIzICogbTMyKSArIG0xMiAqIChtMjMgKiBtMzEgLSBtMjEgKiBtMzMpICsgbTEzICogKG0yMSAqIG0zMiAtIG0yMiAqIG0zMSk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgaW52ZXJzZShtYXRyaXg6IE1hdHJpeDMsIHJlc3VsdDogTWF0cml4Myk6IE1hdHJpeDMge1xyXG5cdFx0Y29uc3QgbTExID0gbWF0cml4WzBdO1xyXG5cdFx0Y29uc3QgbTIxID0gbWF0cml4WzFdO1xyXG5cdFx0Y29uc3QgbTMxID0gbWF0cml4WzJdO1xyXG5cdFx0Y29uc3QgbTEyID0gbWF0cml4WzNdO1xyXG5cdFx0Y29uc3QgbTIyID0gbWF0cml4WzRdO1xyXG5cdFx0Y29uc3QgbTMyID0gbWF0cml4WzVdO1xyXG5cdFx0Y29uc3QgbTEzID0gbWF0cml4WzZdO1xyXG5cdFx0Y29uc3QgbTIzID0gbWF0cml4WzddO1xyXG5cdFx0Y29uc3QgbTMzID0gbWF0cml4WzhdO1xyXG5cclxuXHRcdGNvbnN0IGRldGVybWluYW50ID0gTWF0cml4My5kZXRlcm1pbmFudChtYXRyaXgpO1xyXG5cclxuXHRcdC8vID4+aW5jbHVkZVN0YXJ0KCdkZWJ1ZycsIHByYWdtYXMuZGVidWcpO1xyXG5cdFx0aWYgKE1hdGguYWJzKGRldGVybWluYW50KSA8PSBHTWF0aC5FUFNJTE9OMTUpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwibWF0cml4IGlzIG5vdCBpbnZlcnRpYmxlXCIpO1xyXG5cdFx0fVxyXG5cdFx0Ly8gPj5pbmNsdWRlRW5kKCdkZWJ1ZycpO1xyXG5cclxuXHRcdHJlc3VsdFswXSA9IG0yMiAqIG0zMyAtIG0yMyAqIG0zMjtcclxuXHRcdHJlc3VsdFsxXSA9IG0yMyAqIG0zMSAtIG0yMSAqIG0zMztcclxuXHRcdHJlc3VsdFsyXSA9IG0yMSAqIG0zMiAtIG0yMiAqIG0zMTtcclxuXHRcdHJlc3VsdFszXSA9IG0xMyAqIG0zMiAtIG0xMiAqIG0zMztcclxuXHRcdHJlc3VsdFs0XSA9IG0xMSAqIG0zMyAtIG0xMyAqIG0zMTtcclxuXHRcdHJlc3VsdFs1XSA9IG0xMiAqIG0zMSAtIG0xMSAqIG0zMjtcclxuXHRcdHJlc3VsdFs2XSA9IG0xMiAqIG0yMyAtIG0xMyAqIG0yMjtcclxuXHRcdHJlc3VsdFs3XSA9IG0xMyAqIG0yMSAtIG0xMSAqIG0yMztcclxuXHRcdHJlc3VsdFs4XSA9IG0xMSAqIG0yMiAtIG0xMiAqIG0yMTtcclxuXHJcblx0XHRjb25zdCBzY2FsZSA9IDEuMCAvIGRldGVybWluYW50O1xyXG5cdFx0cmV0dXJuIE1hdHJpeDMubXVsdGlwbHlCeVNjYWxhcihyZXN1bHQsIHNjYWxlLCByZXN1bHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGludmVyc2VUcmFuc3Bvc2UobWF0cml4OiBNYXRyaXgzLCByZXN1bHQ6IE1hdHJpeDMpIHtcclxuXHRcdHJldHVybiBNYXRyaXgzLmludmVyc2UoTWF0cml4My50cmFuc3Bvc2UobWF0cml4LCBzY3JhdGNoVHJhbnNwb3NlTWF0cml4KSwgcmVzdWx0KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBlcXVhbHMobGVmdDogTWF0cml4MywgcmlnaHQ6IE1hdHJpeDMpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdGxlZnQgPT09IHJpZ2h0IHx8XHJcblx0XHRcdChkZWZpbmVkKGxlZnQpICYmXHJcblx0XHRcdFx0ZGVmaW5lZChyaWdodCkgJiZcclxuXHRcdFx0XHRsZWZ0WzBdID09PSByaWdodFswXSAmJlxyXG5cdFx0XHRcdGxlZnRbMV0gPT09IHJpZ2h0WzFdICYmXHJcblx0XHRcdFx0bGVmdFsyXSA9PT0gcmlnaHRbMl0gJiZcclxuXHRcdFx0XHRsZWZ0WzNdID09PSByaWdodFszXSAmJlxyXG5cdFx0XHRcdGxlZnRbNF0gPT09IHJpZ2h0WzRdICYmXHJcblx0XHRcdFx0bGVmdFs1XSA9PT0gcmlnaHRbNV0gJiZcclxuXHRcdFx0XHRsZWZ0WzZdID09PSByaWdodFs2XSAmJlxyXG5cdFx0XHRcdGxlZnRbN10gPT09IHJpZ2h0WzddICYmXHJcblx0XHRcdFx0bGVmdFs4XSA9PT0gcmlnaHRbOF0pXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGVxdWFsc0Vwc2lsb24obGVmdDogTWF0cml4MywgcmlnaHQ6IE1hdHJpeDMsIGVwc2lsb24gPSAwKTogYm9vbGVhbiB7XHJcblx0XHRlcHNpbG9uID0gZGVmYXVsdFZhbHVlKGVwc2lsb24sIDApO1xyXG5cclxuXHRcdHJldHVybiAoXHJcblx0XHRcdGxlZnQgPT09IHJpZ2h0IHx8XHJcblx0XHRcdChkZWZpbmVkKGxlZnQpICYmXHJcblx0XHRcdFx0ZGVmaW5lZChyaWdodCkgJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzBdIC0gcmlnaHRbMF0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzFdIC0gcmlnaHRbMV0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzJdIC0gcmlnaHRbMl0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzNdIC0gcmlnaHRbM10pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzRdIC0gcmlnaHRbNF0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzVdIC0gcmlnaHRbNV0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzZdIC0gcmlnaHRbNl0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzddIC0gcmlnaHRbN10pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzhdIC0gcmlnaHRbOF0pIDw9IGVwc2lsb24pXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIElERU5USVRZID0gT2JqZWN0LmZyZWV6ZShuZXcgTWF0cml4MygxLjAsIDAuMCwgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjAsIDAuMCwgMS4wKSk7XHJcblxyXG5cdHN0YXRpYyBaRVJPID0gT2JqZWN0LmZyZWV6ZShuZXcgTWF0cml4MygwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wKSk7XHJcblxyXG5cdGNsb25lKHJlc3VsdDogTWF0cml4Myk6IE1hdHJpeDMge1xyXG5cdFx0cmV0dXJuIE1hdHJpeDMuY2xvbmUodGhpcywgcmVzdWx0KTtcclxuXHR9XHJcblxyXG5cdGVxdWFscyhyaWdodDogTWF0cml4Myk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIE1hdHJpeDMuZXF1YWxzKHRoaXMsIHJpZ2h0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICovXHJcblx0ZXF1YWxzQXJyYXkobWF0cml4OiBNYXRyaXgzIHwgbnVtYmVyW10sIGFycmF5OiBudW1iZXJbXSwgb2Zmc2V0OiBudW1iZXIpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdG1hdHJpeFswXSA9PT0gYXJyYXlbb2Zmc2V0XSAmJlxyXG5cdFx0XHRtYXRyaXhbMV0gPT09IGFycmF5W29mZnNldCArIDFdICYmXHJcblx0XHRcdG1hdHJpeFsyXSA9PT0gYXJyYXlbb2Zmc2V0ICsgMl0gJiZcclxuXHRcdFx0bWF0cml4WzNdID09PSBhcnJheVtvZmZzZXQgKyAzXSAmJlxyXG5cdFx0XHRtYXRyaXhbNF0gPT09IGFycmF5W29mZnNldCArIDRdICYmXHJcblx0XHRcdG1hdHJpeFs1XSA9PT0gYXJyYXlbb2Zmc2V0ICsgNV0gJiZcclxuXHRcdFx0bWF0cml4WzZdID09PSBhcnJheVtvZmZzZXQgKyA2XSAmJlxyXG5cdFx0XHRtYXRyaXhbN10gPT09IGFycmF5W29mZnNldCArIDddICYmXHJcblx0XHRcdG1hdHJpeFs4XSA9PT0gYXJyYXlbb2Zmc2V0ICsgOF1cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wYXJlcyB0aGlzIG1hdHJpeCB0byB0aGUgcHJvdmlkZWQgbWF0cml4IGNvbXBvbmVudHdpc2UgYW5kIHJldHVybnNcclxuXHQgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGV5IGFyZSB3aXRoaW4gdGhlIHByb3ZpZGVkIGVwc2lsb24sXHJcblx0ICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4M30gW3JpZ2h0XSBUaGUgcmlnaHQgaGFuZCBzaWRlIG1hdHJpeC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2Vwc2lsb249MF0gVGhlIGVwc2lsb24gdG8gdXNlIGZvciBlcXVhbGl0eSB0ZXN0aW5nLlxyXG5cdCAqIEByZXR1cm5zIHtCb29sZWFufSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGV5IGFyZSB3aXRoaW4gdGhlIHByb3ZpZGVkIGVwc2lsb24sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuXHJcblx0ICovXHJcblx0ZXF1YWxzRXBzaWxvbihyaWdodCwgZXBzaWxvbikge1xyXG5cdFx0cmV0dXJuIE1hdHJpeDMuZXF1YWxzRXBzaWxvbih0aGlzLCByaWdodCwgZXBzaWxvbik7XHJcblx0fVxyXG5cclxuXHR0b1N0cmluZygpIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdGAoJHt0aGlzWzBdfSwgJHt0aGlzWzNdfSwgJHt0aGlzWzZdfSlcXG5gICtcclxuXHRcdFx0YCgke3RoaXNbMV19LCAke3RoaXNbNF19LCAke3RoaXNbN119KVxcbmAgK1xyXG5cdFx0XHRgKCR7dGhpc1syXX0sICR7dGhpc1s1XX0sICR7dGhpc1s4XX0pYFxyXG5cdFx0KTtcclxuXHR9XHJcbn1cclxuXHJcbmNvbnN0IHNjYWxlU2NyYXRjaDEgPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBzY2FsZVNjcmF0Y2gyID0gbmV3IFZlY3RvcjMoKTtcclxuY29uc3Qgc2NyYXRjaENvbHVtbiA9IG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IHNjYWxlU2NyYXRjaDMgPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBzY2FsZVNjcmF0Y2g0ID0gbmV3IFZlY3RvcjMoKTtcclxuY29uc3Qgc2NhbGVTY3JhdGNoNSA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5mdW5jdGlvbiBjb21wdXRlRnJvYmVuaXVzTm9ybShtYXRyaXgpIHtcclxuXHRsZXQgbm9ybSA9IDAuMDtcclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IDk7ICsraSkge1xyXG5cdFx0Y29uc3QgdGVtcCA9IG1hdHJpeFtpXTtcclxuXHRcdG5vcm0gKz0gdGVtcCAqIHRlbXA7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gTWF0aC5zcXJ0KG5vcm0pO1xyXG59XHJcblxyXG5jb25zdCByb3dWYWwgPSBbMSwgMCwgMF07XHJcbmNvbnN0IGNvbFZhbCA9IFsyLCAyLCAxXTtcclxuXHJcbmZ1bmN0aW9uIG9mZkRpYWdvbmFsRnJvYmVuaXVzTm9ybShtYXRyaXgpIHtcclxuXHQvLyBDb21wdXRlcyB0aGUgXCJvZmYtZGlhZ29uYWxcIiBGcm9iZW5pdXMgbm9ybS5cclxuXHQvLyBBc3N1bWVzIG1hdHJpeCBpcyBzeW1tZXRyaWMuXHJcblxyXG5cdGxldCBub3JtID0gMC4wO1xyXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgMzsgKytpKSB7XHJcblx0XHRjb25zdCB0ZW1wID0gbWF0cml4W01hdHJpeDMuZ2V0RWxlbWVudEluZGV4KGNvbFZhbFtpXSwgcm93VmFsW2ldKV07XHJcblx0XHRub3JtICs9IDIuMCAqIHRlbXAgKiB0ZW1wO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIE1hdGguc3FydChub3JtKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2h1ckRlY29tcG9zaXRpb24obWF0cml4LCByZXN1bHQpIHtcclxuXHQvLyBUaGlzIHJvdXRpbmUgd2FzIGNyZWF0ZWQgYmFzZWQgdXBvbiBNYXRyaXggQ29tcHV0YXRpb25zLCAzcmQgZWQuLCBieSBHb2x1YiBhbmQgVmFuIExvYW4sXHJcblx0Ly8gc2VjdGlvbiA4LjQuMiBUaGUgMmJ5MiBTeW1tZXRyaWMgU2NodXIgRGVjb21wb3NpdGlvbi5cclxuXHQvL1xyXG5cdC8vIFRoZSByb3V0aW5lIHRha2VzIGEgbWF0cml4LCB3aGljaCBpcyBhc3N1bWVkIHRvIGJlIHN5bW1ldHJpYywgYW5kXHJcblx0Ly8gZmluZHMgdGhlIGxhcmdlc3Qgb2ZmLWRpYWdvbmFsIHRlcm0sIGFuZCB0aGVuIGNyZWF0ZXNcclxuXHQvLyBhIG1hdHJpeCAocmVzdWx0KSB3aGljaCBjYW4gYmUgdXNlZCB0byBoZWxwIHJlZHVjZSBpdFxyXG5cclxuXHRjb25zdCB0b2xlcmFuY2UgPSBHTWF0aC5FUFNJTE9OMTU7XHJcblxyXG5cdGxldCBtYXhEaWFnb25hbCA9IDAuMDtcclxuXHRsZXQgcm90QXhpcyA9IDE7XHJcblxyXG5cdC8vIGZpbmQgcGl2b3QgKHJvdEF4aXMpIGJhc2VkIG9uIG1heCBkaWFnb25hbCBvZiBtYXRyaXhcclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IDM7ICsraSkge1xyXG5cdFx0Y29uc3QgdGVtcCA9IE1hdGguYWJzKG1hdHJpeFtNYXRyaXgzLmdldEVsZW1lbnRJbmRleChjb2xWYWxbaV0sIHJvd1ZhbFtpXSldKTtcclxuXHRcdGlmICh0ZW1wID4gbWF4RGlhZ29uYWwpIHtcclxuXHRcdFx0cm90QXhpcyA9IGk7XHJcblx0XHRcdG1heERpYWdvbmFsID0gdGVtcDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGxldCBjID0gMS4wO1xyXG5cdGxldCBzID0gMC4wO1xyXG5cclxuXHRjb25zdCBwID0gcm93VmFsW3JvdEF4aXNdO1xyXG5cdGNvbnN0IHEgPSBjb2xWYWxbcm90QXhpc107XHJcblxyXG5cdGlmIChNYXRoLmFicyhtYXRyaXhbTWF0cml4My5nZXRFbGVtZW50SW5kZXgocSwgcCldKSA+IHRvbGVyYW5jZSkge1xyXG5cdFx0Y29uc3QgcXEgPSBtYXRyaXhbTWF0cml4My5nZXRFbGVtZW50SW5kZXgocSwgcSldO1xyXG5cdFx0Y29uc3QgcHAgPSBtYXRyaXhbTWF0cml4My5nZXRFbGVtZW50SW5kZXgocCwgcCldO1xyXG5cdFx0Y29uc3QgcXAgPSBtYXRyaXhbTWF0cml4My5nZXRFbGVtZW50SW5kZXgocSwgcCldO1xyXG5cclxuXHRcdGNvbnN0IHRhdSA9IChxcSAtIHBwKSAvIDIuMCAvIHFwO1xyXG5cdFx0bGV0IHQ7XHJcblxyXG5cdFx0aWYgKHRhdSA8IDAuMCkge1xyXG5cdFx0XHR0ID0gLTEuMCAvICgtdGF1ICsgTWF0aC5zcXJ0KDEuMCArIHRhdSAqIHRhdSkpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dCA9IDEuMCAvICh0YXUgKyBNYXRoLnNxcnQoMS4wICsgdGF1ICogdGF1KSk7XHJcblx0XHR9XHJcblxyXG5cdFx0YyA9IDEuMCAvIE1hdGguc3FydCgxLjAgKyB0ICogdCk7XHJcblx0XHRzID0gdCAqIGM7XHJcblx0fVxyXG5cclxuXHRyZXN1bHQgPSBNYXRyaXgzLmNsb25lKE1hdHJpeDMuSURFTlRJVFksIHJlc3VsdCk7XHJcblxyXG5cdHJlc3VsdFtNYXRyaXgzLmdldEVsZW1lbnRJbmRleChwLCBwKV0gPSByZXN1bHRbTWF0cml4My5nZXRFbGVtZW50SW5kZXgocSwgcSldID0gYztcclxuXHRyZXN1bHRbTWF0cml4My5nZXRFbGVtZW50SW5kZXgocSwgcCldID0gcztcclxuXHRyZXN1bHRbTWF0cml4My5nZXRFbGVtZW50SW5kZXgocCwgcSldID0gLXM7XHJcblxyXG5cdHJldHVybiByZXN1bHQ7XHJcbn1cclxuY29uc3Qgc2NyYXRjaFRyYW5zcG9zZU1hdHJpeCA9IG5ldyBNYXRyaXgzKCk7XHJcbmV4cG9ydCBkZWZhdWx0IE1hdHJpeDM7XHJcbiIsImltcG9ydCB7IEF0dHJpYnV0ZSB9IGZyb20gXCIuLi9yZW5kZXIvQXR0cmlidXRlXCI7XHJcbmltcG9ydCBkZWZpbmVkIGZyb20gXCIuLi91dGlscy9kZWZpbmVkXCI7XHJcbmltcG9ydCBHTWF0aCBmcm9tIFwiLi9NYXRoXCI7XHJcblxyXG5jbGFzcyBWZWN0b3I0IHtcclxuXHRwdWJsaWMgc3RhdGljIFpFUk8gPSBPYmplY3QuZnJlZXplKG5ldyBWZWN0b3I0KDAuMCwgMC4wLCAwLjAsIDAuMCkpO1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIE9ORSA9IE9iamVjdC5mcmVlemUobmV3IFZlY3RvcjQoMS4wLCAxLjAsIDEuMCwgMS4wKSk7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgVU5JVF9YID0gT2JqZWN0LmZyZWV6ZShuZXcgVmVjdG9yNCgxLjAsIDAuMCwgMC4wLCAwLjApKTtcclxuXHJcblx0cHVibGljIHN0YXRpYyBVTklUX1kgPSBPYmplY3QuZnJlZXplKG5ldyBWZWN0b3I0KDAuMCwgMS4wLCAwLjAsIDAuMCkpO1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIFVOSVRfWiA9IE9iamVjdC5mcmVlemUobmV3IFZlY3RvcjQoMC4wLCAwLjAsIDEuMCwgMC4wKSk7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgVU5JVF9XID0gT2JqZWN0LmZyZWV6ZShuZXcgVmVjdG9yNCgwLjAsIDAuMCwgMC4wLCAxLjApKTtcclxuXHR4OiBudW1iZXI7XHJcblx0eTogbnVtYmVyO1xyXG5cdHo6IG51bWJlcjtcclxuXHR3OiBudW1iZXI7XHJcblx0Y29uc3RydWN0b3IoeCA9IDAsIHkgPSAwLCB6ID0gMCwgdyA9IDApIHtcclxuXHRcdHRoaXMueCA9IHg7XHJcblx0XHR0aGlzLnkgPSB5O1xyXG5cdFx0dGhpcy56ID0gejtcclxuXHRcdHRoaXMudyA9IHc7XHJcblx0fVxyXG5cdHNldCh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyLCB3OiBudW1iZXIpOiB2b2lkIHtcclxuXHRcdHRoaXMueCA9IHg7XHJcblx0XHR0aGlzLnkgPSB5O1xyXG5cdFx0dGhpcy56ID0gejtcclxuXHRcdHRoaXMudyA9IHc7XHJcblx0fVxyXG5cdHRvQXJyYXkoKTogbnVtYmVyW10ge1xyXG5cdFx0cmV0dXJuIFt0aGlzLngsIHRoaXMueSwgdGhpcy56LCB0aGlzLnddO1xyXG5cdH1cclxuXHJcblx0Y2xvbmUocmVzdWx0OiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcblx0XHRyZXR1cm4gVmVjdG9yNC5jbG9uZSh0aGlzLCByZXN1bHQpO1xyXG5cdH1cclxuXHJcblx0ZXF1YWxzKHJpZ2h0OiBWZWN0b3I0KTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gVmVjdG9yNC5lcXVhbHModGhpcywgcmlnaHQpO1xyXG5cdH1cclxuXHJcblx0ZXF1YWxzRXBzaWxvbihyaWdodDogVmVjdG9yNCwgcmVsYXRpdmVFcHNpbG9uID0gMCwgYWJzb2x1dGVFcHNpbG9uID0gMCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIFZlY3RvcjQuZXF1YWxzRXBzaWxvbih0aGlzLCByaWdodCwgcmVsYXRpdmVFcHNpbG9uLCBhYnNvbHV0ZUVwc2lsb24pO1xyXG5cdH1cclxuXHJcblx0dG9TdHJpbmcoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBgKCR7dGhpcy54fSwgJHt0aGlzLnl9LCAke3RoaXMuen0sICR7dGhpcy53fSlgO1xyXG5cdH1cclxuXHRmcm9tQnVmZmVyQXR0cmlidXRlKGF0dHJpYnV0ZTogQXR0cmlidXRlLCBpbmRleDogbnVtYmVyKTogVmVjdG9yNCB7XHJcblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WChpbmRleCk7XHJcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WShpbmRleCk7XHJcblx0XHR0aGlzLnogPSBhdHRyaWJ1dGUuZ2V0WihpbmRleCk7XHJcblx0XHR0aGlzLncgPSBhdHRyaWJ1dGUuZ2V0VyhpbmRleCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZnJvbUVsZW1lbnRzKHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIsIHc6IG51bWJlciwgcmVzdWx0OiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcblx0XHRpZiAoIWRlZmluZWQocmVzdWx0KSkge1xyXG5cdFx0XHRyZXR1cm4gbmV3IFZlY3RvcjQoeCwgeSwgeiwgdyk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmVzdWx0LnggPSB4O1xyXG5cdFx0cmVzdWx0LnkgPSB5O1xyXG5cdFx0cmVzdWx0LnogPSB6O1xyXG5cdFx0cmVzdWx0LncgPSB3O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBjbG9uZShjYXJ0ZXNpYW46IFZlY3RvcjQsIHJlc3VsdDogVmVjdG9yNCk6IFZlY3RvcjQge1xyXG5cdFx0aWYgKCFkZWZpbmVkKGNhcnRlc2lhbikpIHtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIWRlZmluZWQocmVzdWx0KSkge1xyXG5cdFx0XHRyZXR1cm4gbmV3IFZlY3RvcjQoY2FydGVzaWFuLngsIGNhcnRlc2lhbi55LCBjYXJ0ZXNpYW4ueiwgY2FydGVzaWFuLncpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJlc3VsdC54ID0gY2FydGVzaWFuLng7XHJcblx0XHRyZXN1bHQueSA9IGNhcnRlc2lhbi55O1xyXG5cdFx0cmVzdWx0LnogPSBjYXJ0ZXNpYW4uejtcclxuXHRcdHJlc3VsdC53ID0gY2FydGVzaWFuLnc7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG1heGltdW1Db21wb25lbnQoY2FydGVzaWFuOiBWZWN0b3I0KTogbnVtYmVyIHtcclxuXHRcdHJldHVybiBNYXRoLm1heChjYXJ0ZXNpYW4ueCwgY2FydGVzaWFuLnksIGNhcnRlc2lhbi56LCBjYXJ0ZXNpYW4udyk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbWluaW11bUNvbXBvbmVudChjYXJ0ZXNpYW46IFZlY3RvcjQpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIE1hdGgubWluKGNhcnRlc2lhbi54LCBjYXJ0ZXNpYW4ueSwgY2FydGVzaWFuLnosIGNhcnRlc2lhbi53KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtaW5pbXVtQnlDb21wb25lbnQoZmlyc3Q6IFZlY3RvcjQsIHNlY29uZDogVmVjdG9yNCwgcmVzdWx0OiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcblx0XHRyZXN1bHQueCA9IE1hdGgubWluKGZpcnN0LngsIHNlY29uZC54KTtcclxuXHRcdHJlc3VsdC55ID0gTWF0aC5taW4oZmlyc3QueSwgc2Vjb25kLnkpO1xyXG5cdFx0cmVzdWx0LnogPSBNYXRoLm1pbihmaXJzdC56LCBzZWNvbmQueik7XHJcblx0XHRyZXN1bHQudyA9IE1hdGgubWluKGZpcnN0LncsIHNlY29uZC53KTtcclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG1heGltdW1CeUNvbXBvbmVudChmaXJzdDogVmVjdG9yNCwgc2Vjb25kOiBWZWN0b3I0LCByZXN1bHQ6IFZlY3RvcjQpOiBWZWN0b3I0IHtcclxuXHRcdHJlc3VsdC54ID0gTWF0aC5tYXgoZmlyc3QueCwgc2Vjb25kLngpO1xyXG5cdFx0cmVzdWx0LnkgPSBNYXRoLm1heChmaXJzdC55LCBzZWNvbmQueSk7XHJcblx0XHRyZXN1bHQueiA9IE1hdGgubWF4KGZpcnN0LnosIHNlY29uZC56KTtcclxuXHRcdHJlc3VsdC53ID0gTWF0aC5tYXgoZmlyc3Qudywgc2Vjb25kLncpO1xyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgY2xhbXAodmFsdWU6IFZlY3RvcjQsIG1pbjogVmVjdG9yNCwgbWF4OiBWZWN0b3I0LCByZXN1bHQ6IFZlY3RvcjQpOiBWZWN0b3I0IHtcclxuXHRcdGNvbnN0IHggPSBHTWF0aC5jbGFtcCh2YWx1ZS54LCBtaW4ueCwgbWF4LngpO1xyXG5cdFx0Y29uc3QgeSA9IEdNYXRoLmNsYW1wKHZhbHVlLnksIG1pbi55LCBtYXgueSk7XHJcblx0XHRjb25zdCB6ID0gR01hdGguY2xhbXAodmFsdWUueiwgbWluLnosIG1heC56KTtcclxuXHRcdGNvbnN0IHcgPSBHTWF0aC5jbGFtcCh2YWx1ZS53LCBtaW4udywgbWF4LncpO1xyXG5cclxuXHRcdHJlc3VsdC54ID0geDtcclxuXHRcdHJlc3VsdC55ID0geTtcclxuXHRcdHJlc3VsdC56ID0gejtcclxuXHRcdHJlc3VsdC53ID0gdztcclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG1hZ25pdHVkZVNxdWFyZWQoY2FydGVzaWFuOiBWZWN0b3I0KTogbnVtYmVyIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdGNhcnRlc2lhbi54ICogY2FydGVzaWFuLnggK1xyXG5cdFx0XHRjYXJ0ZXNpYW4ueSAqIGNhcnRlc2lhbi55ICtcclxuXHRcdFx0Y2FydGVzaWFuLnogKiBjYXJ0ZXNpYW4ueiArXHJcblx0XHRcdGNhcnRlc2lhbi53ICogY2FydGVzaWFuLndcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbWFnbml0dWRlKGNhcnRlc2lhbjogVmVjdG9yNCk6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KFZlY3RvcjQubWFnbml0dWRlU3F1YXJlZChjYXJ0ZXNpYW4pKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBkaXN0YW5jZShsZWZ0OiBWZWN0b3I0LCByaWdodDogVmVjdG9yNCk6IG51bWJlciB7XHJcblx0XHRWZWN0b3I0LnN1YnRyYWN0KGxlZnQsIHJpZ2h0LCBkaXN0YW5jZVNjcmF0Y2gpO1xyXG5cdFx0cmV0dXJuIFZlY3RvcjQubWFnbml0dWRlKGRpc3RhbmNlU2NyYXRjaCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZGlzdGFuY2VTcXVhcmVkKGxlZnQ6IFZlY3RvcjQsIHJpZ2h0OiBWZWN0b3I0KTogbnVtYmVyIHtcclxuXHRcdFZlY3RvcjQuc3VidHJhY3QobGVmdCwgcmlnaHQsIGRpc3RhbmNlU2NyYXRjaCk7XHJcblx0XHRyZXR1cm4gVmVjdG9yNC5tYWduaXR1ZGVTcXVhcmVkKGRpc3RhbmNlU2NyYXRjaCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbm9ybWFsaXplKGNhcnRlc2lhbjogVmVjdG9yNCwgcmVzdWx0OiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcblx0XHRjb25zdCBtYWduaXR1ZGUgPSBWZWN0b3I0Lm1hZ25pdHVkZShjYXJ0ZXNpYW4pO1xyXG5cclxuXHRcdHJlc3VsdC54ID0gY2FydGVzaWFuLnggLyBtYWduaXR1ZGU7XHJcblx0XHRyZXN1bHQueSA9IGNhcnRlc2lhbi55IC8gbWFnbml0dWRlO1xyXG5cdFx0cmVzdWx0LnogPSBjYXJ0ZXNpYW4ueiAvIG1hZ25pdHVkZTtcclxuXHRcdHJlc3VsdC53ID0gY2FydGVzaWFuLncgLyBtYWduaXR1ZGU7XHJcblxyXG5cdFx0Ly8gPj5pbmNsdWRlU3RhcnQoJ2RlYnVnJywgcHJhZ21hcy5kZWJ1Zyk7XHJcblx0XHRpZiAoaXNOYU4ocmVzdWx0LngpIHx8IGlzTmFOKHJlc3VsdC55KSB8fCBpc05hTihyZXN1bHQueikgfHwgaXNOYU4ocmVzdWx0LncpKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIm5vcm1hbGl6ZWQgcmVzdWx0IGlzIG5vdCBhIG51bWJlclwiKTtcclxuXHRcdH1cclxuXHRcdC8vID4+aW5jbHVkZUVuZCgnZGVidWcnKTtcclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGRvdChsZWZ0OiBWZWN0b3I0LCByaWdodDogVmVjdG9yNCk6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gbGVmdC54ICogcmlnaHQueCArIGxlZnQueSAqIHJpZ2h0LnkgKyBsZWZ0LnogKiByaWdodC56ICsgbGVmdC53ICogcmlnaHQudztcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtdWx0aXBseUNvbXBvbmVudHMobGVmdDogVmVjdG9yNCwgcmlnaHQ6IFZlY3RvcjQsIHJlc3VsdDogVmVjdG9yNCk6IFZlY3RvcjQge1xyXG5cdFx0cmVzdWx0LnggPSBsZWZ0LnggKiByaWdodC54O1xyXG5cdFx0cmVzdWx0LnkgPSBsZWZ0LnkgKiByaWdodC55O1xyXG5cdFx0cmVzdWx0LnogPSBsZWZ0LnogKiByaWdodC56O1xyXG5cdFx0cmVzdWx0LncgPSBsZWZ0LncgKiByaWdodC53O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBkaXZpZGVDb21wb25lbnRzKGxlZnQ6IFZlY3RvcjQsIHJpZ2h0OiBWZWN0b3I0LCByZXN1bHQ6IFZlY3RvcjQpOiBWZWN0b3I0IHtcclxuXHRcdHJlc3VsdC54ID0gbGVmdC54IC8gcmlnaHQueDtcclxuXHRcdHJlc3VsdC55ID0gbGVmdC55IC8gcmlnaHQueTtcclxuXHRcdHJlc3VsdC56ID0gbGVmdC56IC8gcmlnaHQuejtcclxuXHRcdHJlc3VsdC53ID0gbGVmdC53IC8gcmlnaHQudztcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgYWRkKGxlZnQ6IFZlY3RvcjQsIHJpZ2h0OiBWZWN0b3I0LCByZXN1bHQ6IFZlY3RvcjQpOiBWZWN0b3I0IHtcclxuXHRcdHJlc3VsdC54ID0gbGVmdC54ICsgcmlnaHQueDtcclxuXHRcdHJlc3VsdC55ID0gbGVmdC55ICsgcmlnaHQueTtcclxuXHRcdHJlc3VsdC56ID0gbGVmdC56ICsgcmlnaHQuejtcclxuXHRcdHJlc3VsdC53ID0gbGVmdC53ICsgcmlnaHQudztcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgc3VidHJhY3QobGVmdDogVmVjdG9yNCwgcmlnaHQ6IFZlY3RvcjQsIHJlc3VsdDogVmVjdG9yNCk6IFZlY3RvcjQge1xyXG5cdFx0cmVzdWx0LnggPSBsZWZ0LnggLSByaWdodC54O1xyXG5cdFx0cmVzdWx0LnkgPSBsZWZ0LnkgLSByaWdodC55O1xyXG5cdFx0cmVzdWx0LnogPSBsZWZ0LnogLSByaWdodC56O1xyXG5cdFx0cmVzdWx0LncgPSBsZWZ0LncgLSByaWdodC53O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtdWx0aXBseUJ5U2NhbGFyKGNhcnRlc2lhbjogVmVjdG9yNCwgc2NhbGFyOiBudW1iZXIsIHJlc3VsdDogVmVjdG9yNCk6IFZlY3RvcjQge1xyXG5cdFx0cmVzdWx0LnggPSBjYXJ0ZXNpYW4ueCAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdC55ID0gY2FydGVzaWFuLnkgKiBzY2FsYXI7XHJcblx0XHRyZXN1bHQueiA9IGNhcnRlc2lhbi56ICogc2NhbGFyO1xyXG5cdFx0cmVzdWx0LncgPSBjYXJ0ZXNpYW4udyAqIHNjYWxhcjtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZGl2aWRlQnlTY2FsYXIoY2FydGVzaWFuOiBWZWN0b3I0LCBzY2FsYXI6IG51bWJlciwgcmVzdWx0OiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcblx0XHRyZXN1bHQueCA9IGNhcnRlc2lhbi54IC8gc2NhbGFyO1xyXG5cdFx0cmVzdWx0LnkgPSBjYXJ0ZXNpYW4ueSAvIHNjYWxhcjtcclxuXHRcdHJlc3VsdC56ID0gY2FydGVzaWFuLnogLyBzY2FsYXI7XHJcblx0XHRyZXN1bHQudyA9IGNhcnRlc2lhbi53IC8gc2NhbGFyO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBuZWdhdGUoY2FydGVzaWFuOiBWZWN0b3I0LCByZXN1bHQ6IFZlY3RvcjQpOiBWZWN0b3I0IHtcclxuXHRcdHJlc3VsdC54ID0gLWNhcnRlc2lhbi54O1xyXG5cdFx0cmVzdWx0LnkgPSAtY2FydGVzaWFuLnk7XHJcblx0XHRyZXN1bHQueiA9IC1jYXJ0ZXNpYW4uejtcclxuXHRcdHJlc3VsdC53ID0gLWNhcnRlc2lhbi53O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBhYnMoY2FydGVzaWFuOiBWZWN0b3I0LCByZXN1bHQ6IFZlY3RvcjQpOiBWZWN0b3I0IHtcclxuXHRcdHJlc3VsdC54ID0gTWF0aC5hYnMoY2FydGVzaWFuLngpO1xyXG5cdFx0cmVzdWx0LnkgPSBNYXRoLmFicyhjYXJ0ZXNpYW4ueSk7XHJcblx0XHRyZXN1bHQueiA9IE1hdGguYWJzKGNhcnRlc2lhbi56KTtcclxuXHRcdHJlc3VsdC53ID0gTWF0aC5hYnMoY2FydGVzaWFuLncpO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBsZXJwKHN0YXJ0OiBWZWN0b3I0LCBlbmQ6IFZlY3RvcjQsIHQ6IG51bWJlciwgcmVzdWx0OiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcblx0XHRWZWN0b3I0Lm11bHRpcGx5QnlTY2FsYXIoZW5kLCB0LCBsZXJwU2NyYXRjaCk7XHJcblx0XHRyZXN1bHQgPSBWZWN0b3I0Lm11bHRpcGx5QnlTY2FsYXIoc3RhcnQsIDEuMCAtIHQsIHJlc3VsdCk7XHJcblx0XHRyZXR1cm4gVmVjdG9yNC5hZGQobGVycFNjcmF0Y2gsIHJlc3VsdCwgcmVzdWx0KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBlcXVhbHMobGVmdDogVmVjdG9yNCwgcmlnaHQ6IFZlY3RvcjQpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdGxlZnQgPT09IHJpZ2h0IHx8XHJcblx0XHRcdChkZWZpbmVkKGxlZnQpICYmXHJcblx0XHRcdFx0ZGVmaW5lZChyaWdodCkgJiZcclxuXHRcdFx0XHRsZWZ0LnggPT09IHJpZ2h0LnggJiZcclxuXHRcdFx0XHRsZWZ0LnkgPT09IHJpZ2h0LnkgJiZcclxuXHRcdFx0XHRsZWZ0LnogPT09IHJpZ2h0LnogJiZcclxuXHRcdFx0XHRsZWZ0LncgPT09IHJpZ2h0LncpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGVxdWFsc0FycmF5KGNhcnRlc2lhbjogVmVjdG9yNCwgYXJyYXk6IG51bWJlcltdLCBvZmZzZXQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIChcclxuXHRcdFx0Y2FydGVzaWFuLnggPT09IGFycmF5W29mZnNldF0gJiZcclxuXHRcdFx0Y2FydGVzaWFuLnkgPT09IGFycmF5W29mZnNldCArIDFdICYmXHJcblx0XHRcdGNhcnRlc2lhbi56ID09PSBhcnJheVtvZmZzZXQgKyAyXSAmJlxyXG5cdFx0XHRjYXJ0ZXNpYW4udyA9PT0gYXJyYXlbb2Zmc2V0ICsgM11cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZXF1YWxzRXBzaWxvbihsZWZ0OiBWZWN0b3I0LCByaWdodDogVmVjdG9yNCwgcmVsYXRpdmVFcHNpbG9uID0gMCwgYWJzb2x1dGVFcHNpbG9uID0gMCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIChcclxuXHRcdFx0bGVmdCA9PT0gcmlnaHQgfHxcclxuXHRcdFx0KGRlZmluZWQobGVmdCkgJiZcclxuXHRcdFx0XHRkZWZpbmVkKHJpZ2h0KSAmJlxyXG5cdFx0XHRcdEdNYXRoLmVxdWFsc0Vwc2lsb24obGVmdC54LCByaWdodC54LCByZWxhdGl2ZUVwc2lsb24sIGFic29sdXRlRXBzaWxvbikgJiZcclxuXHRcdFx0XHRHTWF0aC5lcXVhbHNFcHNpbG9uKGxlZnQueSwgcmlnaHQueSwgcmVsYXRpdmVFcHNpbG9uLCBhYnNvbHV0ZUVwc2lsb24pICYmXHJcblx0XHRcdFx0R01hdGguZXF1YWxzRXBzaWxvbihsZWZ0LnosIHJpZ2h0LnosIHJlbGF0aXZlRXBzaWxvbiwgYWJzb2x1dGVFcHNpbG9uKSAmJlxyXG5cdFx0XHRcdEdNYXRoLmVxdWFsc0Vwc2lsb24obGVmdC53LCByaWdodC53LCByZWxhdGl2ZUVwc2lsb24sIGFic29sdXRlRXBzaWxvbikpXHJcblx0XHQpO1xyXG5cdH1cclxufVxyXG5cclxuLy8gc2NyYXRjaFU4QXJyYXkgYW5kIHNjcmF0Y2hGMzJBcnJheSBhcmUgdmlld3MgaW50byB0aGUgc2FtZSBidWZmZXJcclxuY29uc3Qgc2NyYXRjaEYzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSgxKTtcclxuY29uc3Qgc2NyYXRjaFU4QXJyYXkgPSBuZXcgVWludDhBcnJheShzY3JhdGNoRjMyQXJyYXkuYnVmZmVyKTtcclxuXHJcbmNvbnN0IHRlc3RVMzIgPSBuZXcgVWludDMyQXJyYXkoWzB4MTEyMjMzNDRdKTtcclxuY29uc3QgdGVzdFU4ID0gbmV3IFVpbnQ4QXJyYXkodGVzdFUzMi5idWZmZXIpO1xyXG5jb25zdCBsaXR0bGVFbmRpYW4gPSB0ZXN0VThbMF0gPT09IDB4NDQ7XHJcbmNvbnN0IGRpc3RhbmNlU2NyYXRjaCA9IG5ldyBWZWN0b3I0KCk7XHJcbmNvbnN0IGxlcnBTY3JhdGNoID0gbmV3IFZlY3RvcjQoKTtcclxuY29uc3QgbW9zdE9ydGhvZ29uYWxBeGlzU2NyYXRjaCA9IG5ldyBWZWN0b3I0KCk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBWZWN0b3I0O1xyXG4iLCJpbXBvcnQgZGVmYXVsdFZhbHVlIGZyb20gXCIuLi91dGlscy9kZWZhdWx0VmFsdWVcIjtcclxuaW1wb3J0IGRlZmluZWQgZnJvbSBcIi4uL3V0aWxzL2RlZmluZWRcIjtcclxuaW1wb3J0IEdNYXRoIGZyb20gXCIuL01hdGhcIjtcclxuaW1wb3J0IE1hdHJpeDMgZnJvbSBcIi4vTWF0cml4M1wiO1xyXG5pbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSBcIi4vUXVhdGVybmlvblwiO1xyXG5pbXBvcnQgVmVjdG9yMyBmcm9tIFwiLi9WZWN0b3IzXCI7XHJcbmltcG9ydCBWZWN0b3I0IGZyb20gXCIuL1ZlY3RvcjRcIjtcclxuY2xhc3MgTWF0cml4NCB7XHJcblx0cHVibGljIHN0YXRpYyBJREVOVElUWSA9IE9iamVjdC5mcmVlemUoXHJcblx0XHRuZXcgTWF0cml4NCgxLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAxLjApXHJcblx0KTtcclxuXHRwdWJsaWMgc3RhdGljIFpFUk8gPSBPYmplY3QuZnJlZXplKFxyXG5cdFx0bmV3IE1hdHJpeDQoMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wKVxyXG5cdCk7XHJcblx0LyoqXHJcblx0ICogQSA0eDQgbWF0cml4LCBpbmRleGFibGUgYXMgYSBjb2x1bW4tbWFqb3Igb3JkZXIgYXJyYXkuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtjb2x1bW4wUm93MD0wLjBdIFRoZSB2YWx1ZSBmb3IgY29sdW1uIDAsIHJvdyAwLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbY29sdW1uMVJvdzA9MC4wXSBUaGUgdmFsdWUgZm9yIGNvbHVtbiAxLCByb3cgMC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2NvbHVtbjJSb3cwPTAuMF0gVGhlIHZhbHVlIGZvciBjb2x1bW4gMiwgcm93IDAuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtjb2x1bW4zUm93MD0wLjBdIFRoZSB2YWx1ZSBmb3IgY29sdW1uIDMsIHJvdyAwLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbY29sdW1uMFJvdzE9MC4wXSBUaGUgdmFsdWUgZm9yIGNvbHVtbiAwLCByb3cgMS5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2NvbHVtbjFSb3cxPTAuMF0gVGhlIHZhbHVlIGZvciBjb2x1bW4gMSwgcm93IDEuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtjb2x1bW4yUm93MT0wLjBdIFRoZSB2YWx1ZSBmb3IgY29sdW1uIDIsIHJvdyAxLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbY29sdW1uM1JvdzE9MC4wXSBUaGUgdmFsdWUgZm9yIGNvbHVtbiAzLCByb3cgMS5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2NvbHVtbjBSb3cyPTAuMF0gVGhlIHZhbHVlIGZvciBjb2x1bW4gMCwgcm93IDIuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtjb2x1bW4xUm93Mj0wLjBdIFRoZSB2YWx1ZSBmb3IgY29sdW1uIDEsIHJvdyAyLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbY29sdW1uMlJvdzI9MC4wXSBUaGUgdmFsdWUgZm9yIGNvbHVtbiAyLCByb3cgMi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2NvbHVtbjNSb3cyPTAuMF0gVGhlIHZhbHVlIGZvciBjb2x1bW4gMywgcm93IDIuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtjb2x1bW4wUm93Mz0wLjBdIFRoZSB2YWx1ZSBmb3IgY29sdW1uIDAsIHJvdyAzLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbY29sdW1uMVJvdzM9MC4wXSBUaGUgdmFsdWUgZm9yIGNvbHVtbiAxLCByb3cgMy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2NvbHVtbjJSb3czPTAuMF0gVGhlIHZhbHVlIGZvciBjb2x1bW4gMiwgcm93IDMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtjb2x1bW4zUm93Mz0wLjBdIFRoZSB2YWx1ZSBmb3IgY29sdW1uIDMsIHJvdyAzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0Y29sdW1uMFJvdzAgPSAwLFxyXG5cdFx0Y29sdW1uMVJvdzAgPSAwLFxyXG5cdFx0Y29sdW1uMlJvdzAgPSAwLFxyXG5cdFx0Y29sdW1uM1JvdzAgPSAwLFxyXG5cdFx0Y29sdW1uMFJvdzEgPSAwLFxyXG5cdFx0Y29sdW1uMVJvdzEgPSAwLFxyXG5cdFx0Y29sdW1uMlJvdzEgPSAwLFxyXG5cdFx0Y29sdW1uM1JvdzEgPSAwLFxyXG5cdFx0Y29sdW1uMFJvdzIgPSAwLFxyXG5cdFx0Y29sdW1uMVJvdzIgPSAwLFxyXG5cdFx0Y29sdW1uMlJvdzIgPSAwLFxyXG5cdFx0Y29sdW1uM1JvdzIgPSAwLFxyXG5cdFx0Y29sdW1uMFJvdzMgPSAwLFxyXG5cdFx0Y29sdW1uMVJvdzMgPSAwLFxyXG5cdFx0Y29sdW1uMlJvdzMgPSAwLFxyXG5cdFx0Y29sdW1uM1JvdzMgPSAwXHJcblx0KSB7XHJcblx0XHR0aGlzWzBdID0gY29sdW1uMFJvdzA7XHJcblx0XHR0aGlzWzFdID0gY29sdW1uMFJvdzE7XHJcblx0XHR0aGlzWzJdID0gY29sdW1uMFJvdzI7XHJcblx0XHR0aGlzWzNdID0gY29sdW1uMFJvdzM7XHJcblx0XHR0aGlzWzRdID0gY29sdW1uMVJvdzA7XHJcblx0XHR0aGlzWzVdID0gY29sdW1uMVJvdzE7XHJcblx0XHR0aGlzWzZdID0gY29sdW1uMVJvdzI7XHJcblx0XHR0aGlzWzddID0gY29sdW1uMVJvdzM7XHJcblx0XHR0aGlzWzhdID0gY29sdW1uMlJvdzA7XHJcblx0XHR0aGlzWzldID0gY29sdW1uMlJvdzE7XHJcblx0XHR0aGlzWzEwXSA9IGNvbHVtbjJSb3cyO1xyXG5cdFx0dGhpc1sxMV0gPSBjb2x1bW4yUm93MztcclxuXHRcdHRoaXNbMTJdID0gY29sdW1uM1JvdzA7XHJcblx0XHR0aGlzWzEzXSA9IGNvbHVtbjNSb3cxO1xyXG5cdFx0dGhpc1sxNF0gPSBjb2x1bW4zUm93MjtcclxuXHRcdHRoaXNbMTVdID0gY29sdW1uM1JvdzM7XHJcblx0fVxyXG5cdC8vID8/Pz9cclxuXHRjbG9uZShyZXN1bHQ6IE1hdHJpeDQgPSBuZXcgTWF0cml4NCgpKTogTWF0cml4NCB7XHJcblx0XHRyZXR1cm4gTWF0cml4NC5jbG9uZSh0aGlzLCByZXN1bHQpO1xyXG5cdH1cclxuXHRzZXQobWF0NDogTWF0cml4NCkge1xyXG5cdFx0TWF0cml4NC5jbG9uZShtYXQ0LCB0aGlzKTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHRlcXVhbHMocmlnaHQ6IE1hdHJpeDQpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiBNYXRyaXg0LmVxdWFscyh0aGlzLCByaWdodCk7XHJcblx0fVxyXG5cdGNvbXBvc2UocG9zaXRpb246IFZlY3RvcjMsIHF1YXRlcm5pb246IFF1YXRlcm5pb24sIHNjYWxlOiBWZWN0b3IzKTogTWF0cml4NCB7XHJcblx0XHRjb25zdCB0ZSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgeCA9IHF1YXRlcm5pb24ueCxcclxuXHRcdFx0eSA9IHF1YXRlcm5pb24ueSxcclxuXHRcdFx0eiA9IHF1YXRlcm5pb24ueixcclxuXHRcdFx0dyA9IHF1YXRlcm5pb24udztcclxuXHRcdGNvbnN0IHgyID0geCArIHgsXHJcblx0XHRcdHkyID0geSArIHksXHJcblx0XHRcdHoyID0geiArIHo7XHJcblx0XHRjb25zdCB4eCA9IHggKiB4MixcclxuXHRcdFx0eHkgPSB4ICogeTIsXHJcblx0XHRcdHh6ID0geCAqIHoyO1xyXG5cdFx0Y29uc3QgeXkgPSB5ICogeTIsXHJcblx0XHRcdHl6ID0geSAqIHoyLFxyXG5cdFx0XHR6eiA9IHogKiB6MjtcclxuXHRcdGNvbnN0IHd4ID0gdyAqIHgyLFxyXG5cdFx0XHR3eSA9IHcgKiB5MixcclxuXHRcdFx0d3ogPSB3ICogejI7XHJcblxyXG5cdFx0Y29uc3Qgc3ggPSBzY2FsZS54LFxyXG5cdFx0XHRzeSA9IHNjYWxlLnksXHJcblx0XHRcdHN6ID0gc2NhbGUuejtcclxuXHJcblx0XHR0ZVswXSA9ICgxIC0gKHl5ICsgenopKSAqIHN4O1xyXG5cdFx0dGVbMV0gPSAoeHkgKyB3eikgKiBzeDtcclxuXHRcdHRlWzJdID0gKHh6IC0gd3kpICogc3g7XHJcblx0XHR0ZVszXSA9IDA7XHJcblxyXG5cdFx0dGVbNF0gPSAoeHkgLSB3eikgKiBzeTtcclxuXHRcdHRlWzVdID0gKDEgLSAoeHggKyB6eikpICogc3k7XHJcblx0XHR0ZVs2XSA9ICh5eiArIHd4KSAqIHN5O1xyXG5cdFx0dGVbN10gPSAwO1xyXG5cclxuXHRcdHRlWzhdID0gKHh6ICsgd3kpICogc3o7XHJcblx0XHR0ZVs5XSA9ICh5eiAtIHd4KSAqIHN6O1xyXG5cdFx0dGVbMTBdID0gKDEgLSAoeHggKyB5eSkpICogc3o7XHJcblx0XHR0ZVsxMV0gPSAwO1xyXG5cclxuXHRcdHRlWzEyXSA9IHBvc2l0aW9uLng7XHJcblx0XHR0ZVsxM10gPSBwb3NpdGlvbi55O1xyXG5cdFx0dGVbMTRdID0gcG9zaXRpb24uejtcclxuXHRcdHRlWzE1XSA9IDE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cdGVxdWFsc0Vwc2lsb24ocmlnaHQ6IE1hdHJpeDQsIGVwc2lsb24gPSAwKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gTWF0cml4NC5lcXVhbHNFcHNpbG9uKHRoaXMsIHJpZ2h0LCBlcHNpbG9uKTtcclxuXHR9XHJcblx0bG9va0F0KGV5ZTogVmVjdG9yMywgdGFyZ2V0OiBWZWN0b3IzLCB1cDogVmVjdG9yMyk6IE1hdHJpeDQge1xyXG5cdFx0Y29uc3QgbWF0cml4ID0gdGhpcztcclxuXHRcdFZlY3RvcjMuc3VidHJhY3QoZXllLCB0YXJnZXQsIHopO1xyXG5cdFx0aWYgKHoubGVuZ3RoKCkgPT09IDApIHtcclxuXHRcdFx0Ly8gZXllIGFuZCB0YXJnZXQgYXJlIGluIHRoZSBzYW1lIHBvc2l0aW9uXHJcblx0XHRcdHoueiA9IDE7XHJcblx0XHR9XHJcblx0XHR6Lm5vcm1hbGl6ZSgpO1xyXG5cdFx0VmVjdG9yMy5jcm9zcyh1cCwgeiwgeCk7XHJcblx0XHRpZiAoeC5sZW5ndGgoKSA9PT0gMCkge1xyXG5cdFx0XHQvLyB1cCBhbmQgeiBhcmUgcGFyYWxsZWxcclxuXHJcblx0XHRcdGlmIChNYXRoLmFicyh1cC56KSA9PT0gMSkge1xyXG5cdFx0XHRcdHoueCArPSAwLjAwMDE7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0ei56ICs9IDAuMDAwMTtcclxuXHRcdFx0fVxyXG5cdFx0XHR6Lm5vcm1hbGl6ZSgpO1xyXG5cdFx0XHRWZWN0b3IzLmNyb3NzKHVwLCB6LCB4KTtcclxuXHRcdH1cclxuXHRcdHgubm9ybWFsaXplKCk7XHJcblx0XHRWZWN0b3IzLmNyb3NzKHosIHgsIHkpO1xyXG5cdFx0bWF0cml4WzBdID0geC54O1xyXG5cdFx0bWF0cml4WzRdID0geS54O1xyXG5cdFx0bWF0cml4WzhdID0gei54O1xyXG5cdFx0bWF0cml4WzFdID0geC55O1xyXG5cdFx0bWF0cml4WzVdID0geS55O1xyXG5cdFx0bWF0cml4WzldID0gei55O1xyXG5cdFx0bWF0cml4WzJdID0geC56O1xyXG5cdFx0bWF0cml4WzZdID0geS56O1xyXG5cdFx0bWF0cml4WzEwXSA9IHouejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9XHJcblx0dG9TdHJpbmcoKSB7XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHRgKCR7dGhpc1swXX0sICR7dGhpc1s0XX0sICR7dGhpc1s4XX0sICR7dGhpc1sxMl19KVxcbmAgK1xyXG5cdFx0XHRgKCR7dGhpc1sxXX0sICR7dGhpc1s1XX0sICR7dGhpc1s5XX0sICR7dGhpc1sxM119KVxcbmAgK1xyXG5cdFx0XHRgKCR7dGhpc1syXX0sICR7dGhpc1s2XX0sICR7dGhpc1sxMF19LCAke3RoaXNbMTRdfSlcXG5gICtcclxuXHRcdFx0YCgke3RoaXNbM119LCAke3RoaXNbN119LCAke3RoaXNbMTFdfSwgJHt0aGlzWzE1XX0pYFxyXG5cdFx0KTtcclxuXHR9XHJcblx0c3RhdGljIGNsb25lKG1hdHJpeDogTWF0cml4NCB8IG51bWJlcltdLCByZXN1bHQ6IE1hdHJpeDQpOiBNYXRyaXg0IHtcclxuXHRcdGlmICghZGVmaW5lZChtYXRyaXgpKSB7XHJcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblx0XHR9XHJcblx0XHRpZiAoIWRlZmluZWQocmVzdWx0KSkge1xyXG5cdFx0XHRyZXR1cm4gbmV3IE1hdHJpeDQoXHJcblx0XHRcdFx0bWF0cml4WzBdLFxyXG5cdFx0XHRcdG1hdHJpeFs0XSxcclxuXHRcdFx0XHRtYXRyaXhbOF0sXHJcblx0XHRcdFx0bWF0cml4WzEyXSxcclxuXHRcdFx0XHRtYXRyaXhbMV0sXHJcblx0XHRcdFx0bWF0cml4WzVdLFxyXG5cdFx0XHRcdG1hdHJpeFs5XSxcclxuXHRcdFx0XHRtYXRyaXhbMTNdLFxyXG5cdFx0XHRcdG1hdHJpeFsyXSxcclxuXHRcdFx0XHRtYXRyaXhbNl0sXHJcblx0XHRcdFx0bWF0cml4WzEwXSxcclxuXHRcdFx0XHRtYXRyaXhbMTRdLFxyXG5cdFx0XHRcdG1hdHJpeFszXSxcclxuXHRcdFx0XHRtYXRyaXhbN10sXHJcblx0XHRcdFx0bWF0cml4WzExXSxcclxuXHRcdFx0XHRtYXRyaXhbMTVdXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblx0XHRyZXN1bHRbMF0gPSBtYXRyaXhbMF07XHJcblx0XHRyZXN1bHRbMV0gPSBtYXRyaXhbMV07XHJcblx0XHRyZXN1bHRbMl0gPSBtYXRyaXhbMl07XHJcblx0XHRyZXN1bHRbM10gPSBtYXRyaXhbM107XHJcblx0XHRyZXN1bHRbNF0gPSBtYXRyaXhbNF07XHJcblx0XHRyZXN1bHRbNV0gPSBtYXRyaXhbNV07XHJcblx0XHRyZXN1bHRbNl0gPSBtYXRyaXhbNl07XHJcblx0XHRyZXN1bHRbN10gPSBtYXRyaXhbN107XHJcblx0XHRyZXN1bHRbOF0gPSBtYXRyaXhbOF07XHJcblx0XHRyZXN1bHRbOV0gPSBtYXRyaXhbOV07XHJcblx0XHRyZXN1bHRbMTBdID0gbWF0cml4WzEwXTtcclxuXHRcdHJlc3VsdFsxMV0gPSBtYXRyaXhbMTFdO1xyXG5cdFx0cmVzdWx0WzEyXSA9IG1hdHJpeFsxMl07XHJcblx0XHRyZXN1bHRbMTNdID0gbWF0cml4WzEzXTtcclxuXHRcdHJlc3VsdFsxNF0gPSBtYXRyaXhbMTRdO1xyXG5cdFx0cmVzdWx0WzE1XSA9IG1hdHJpeFsxNV07XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGZyb21Db2x1bW5NYWpvckFycmF5KHZhbHVlczogbnVtYmVyW10sIHJlc3VsdDogTWF0cml4NCk6IE1hdHJpeDQge1xyXG5cdFx0cmV0dXJuIE1hdHJpeDQuY2xvbmUodmFsdWVzLCByZXN1bHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGZyb21Sb3dNYWpvckFycmF5KHZhbHVlczogbnVtYmVyW10sIHJlc3VsdDogTWF0cml4NCk6IE1hdHJpeDQge1xyXG5cdFx0aWYgKCFkZWZpbmVkKHJlc3VsdCkpIHtcclxuXHRcdFx0cmV0dXJuIG5ldyBNYXRyaXg0KFxyXG5cdFx0XHRcdHZhbHVlc1swXSxcclxuXHRcdFx0XHR2YWx1ZXNbMV0sXHJcblx0XHRcdFx0dmFsdWVzWzJdLFxyXG5cdFx0XHRcdHZhbHVlc1szXSxcclxuXHRcdFx0XHR2YWx1ZXNbNF0sXHJcblx0XHRcdFx0dmFsdWVzWzVdLFxyXG5cdFx0XHRcdHZhbHVlc1s2XSxcclxuXHRcdFx0XHR2YWx1ZXNbN10sXHJcblx0XHRcdFx0dmFsdWVzWzhdLFxyXG5cdFx0XHRcdHZhbHVlc1s5XSxcclxuXHRcdFx0XHR2YWx1ZXNbMTBdLFxyXG5cdFx0XHRcdHZhbHVlc1sxMV0sXHJcblx0XHRcdFx0dmFsdWVzWzEyXSxcclxuXHRcdFx0XHR2YWx1ZXNbMTNdLFxyXG5cdFx0XHRcdHZhbHVlc1sxNF0sXHJcblx0XHRcdFx0dmFsdWVzWzE1XVxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdFx0cmVzdWx0WzBdID0gdmFsdWVzWzBdO1xyXG5cdFx0cmVzdWx0WzFdID0gdmFsdWVzWzRdO1xyXG5cdFx0cmVzdWx0WzJdID0gdmFsdWVzWzhdO1xyXG5cdFx0cmVzdWx0WzNdID0gdmFsdWVzWzEyXTtcclxuXHRcdHJlc3VsdFs0XSA9IHZhbHVlc1sxXTtcclxuXHRcdHJlc3VsdFs1XSA9IHZhbHVlc1s1XTtcclxuXHRcdHJlc3VsdFs2XSA9IHZhbHVlc1s5XTtcclxuXHRcdHJlc3VsdFs3XSA9IHZhbHVlc1sxM107XHJcblx0XHRyZXN1bHRbOF0gPSB2YWx1ZXNbMl07XHJcblx0XHRyZXN1bHRbOV0gPSB2YWx1ZXNbNl07XHJcblx0XHRyZXN1bHRbMTBdID0gdmFsdWVzWzEwXTtcclxuXHRcdHJlc3VsdFsxMV0gPSB2YWx1ZXNbMTRdO1xyXG5cdFx0cmVzdWx0WzEyXSA9IHZhbHVlc1szXTtcclxuXHRcdHJlc3VsdFsxM10gPSB2YWx1ZXNbN107XHJcblx0XHRyZXN1bHRbMTRdID0gdmFsdWVzWzExXTtcclxuXHRcdHJlc3VsdFsxNV0gPSB2YWx1ZXNbMTVdO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBmcm9tUm90YXRpb25UcmFuc2xhdGlvbihyb3RhdGlvbjogTWF0cml4MywgdHJhbnNsYXRpb246IFZlY3RvcjMsIHJlc3VsdDogTWF0cml4NCk6IE1hdHJpeDQge1xyXG5cdFx0dHJhbnNsYXRpb24gPSBkZWZhdWx0VmFsdWUodHJhbnNsYXRpb24sIFZlY3RvcjMuWkVSTyk7XHJcblxyXG5cdFx0aWYgKCFkZWZpbmVkKHJlc3VsdCkpIHtcclxuXHRcdFx0cmV0dXJuIG5ldyBNYXRyaXg0KFxyXG5cdFx0XHRcdHJvdGF0aW9uWzBdLFxyXG5cdFx0XHRcdHJvdGF0aW9uWzNdLFxyXG5cdFx0XHRcdHJvdGF0aW9uWzZdLFxyXG5cdFx0XHRcdHRyYW5zbGF0aW9uLngsXHJcblx0XHRcdFx0cm90YXRpb25bMV0sXHJcblx0XHRcdFx0cm90YXRpb25bNF0sXHJcblx0XHRcdFx0cm90YXRpb25bN10sXHJcblx0XHRcdFx0dHJhbnNsYXRpb24ueSxcclxuXHRcdFx0XHRyb3RhdGlvblsyXSxcclxuXHRcdFx0XHRyb3RhdGlvbls1XSxcclxuXHRcdFx0XHRyb3RhdGlvbls4XSxcclxuXHRcdFx0XHR0cmFuc2xhdGlvbi56LFxyXG5cdFx0XHRcdDAuMCxcclxuXHRcdFx0XHQwLjAsXHJcblx0XHRcdFx0MC4wLFxyXG5cdFx0XHRcdDEuMFxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJlc3VsdFswXSA9IHJvdGF0aW9uWzBdO1xyXG5cdFx0cmVzdWx0WzFdID0gcm90YXRpb25bMV07XHJcblx0XHRyZXN1bHRbMl0gPSByb3RhdGlvblsyXTtcclxuXHRcdHJlc3VsdFszXSA9IDAuMDtcclxuXHRcdHJlc3VsdFs0XSA9IHJvdGF0aW9uWzNdO1xyXG5cdFx0cmVzdWx0WzVdID0gcm90YXRpb25bNF07XHJcblx0XHRyZXN1bHRbNl0gPSByb3RhdGlvbls1XTtcclxuXHRcdHJlc3VsdFs3XSA9IDAuMDtcclxuXHRcdHJlc3VsdFs4XSA9IHJvdGF0aW9uWzZdO1xyXG5cdFx0cmVzdWx0WzldID0gcm90YXRpb25bN107XHJcblx0XHRyZXN1bHRbMTBdID0gcm90YXRpb25bOF07XHJcblx0XHRyZXN1bHRbMTFdID0gMC4wO1xyXG5cdFx0cmVzdWx0WzEyXSA9IHRyYW5zbGF0aW9uLng7XHJcblx0XHRyZXN1bHRbMTNdID0gdHJhbnNsYXRpb24ueTtcclxuXHRcdHJlc3VsdFsxNF0gPSB0cmFuc2xhdGlvbi56O1xyXG5cdFx0cmVzdWx0WzE1XSA9IDEuMDtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZnJvbVRyYW5zbGF0aW9uUXVhdGVybmlvblJvdGF0aW9uU2NhbGUoXHJcblx0XHR0cmFuc2xhdGlvbjogVmVjdG9yMyxcclxuXHRcdHJvdGF0aW9uOiBRdWF0ZXJuaW9uLFxyXG5cdFx0c2NhbGU6IFZlY3RvcjMsXHJcblx0XHRyZXN1bHQ6IE1hdHJpeDRcclxuXHQpOiBNYXRyaXg0IHtcclxuXHRcdGlmICghZGVmaW5lZChyZXN1bHQpKSB7XHJcblx0XHRcdHJlc3VsdCA9IG5ldyBNYXRyaXg0KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgc2NhbGVYID0gc2NhbGUueDtcclxuXHRcdGNvbnN0IHNjYWxlWSA9IHNjYWxlLnk7XHJcblx0XHRjb25zdCBzY2FsZVogPSBzY2FsZS56O1xyXG5cclxuXHRcdGNvbnN0IHgyID0gcm90YXRpb24ueCAqIHJvdGF0aW9uLng7XHJcblx0XHRjb25zdCB4eSA9IHJvdGF0aW9uLnggKiByb3RhdGlvbi55O1xyXG5cdFx0Y29uc3QgeHogPSByb3RhdGlvbi54ICogcm90YXRpb24uejtcclxuXHRcdGNvbnN0IHh3ID0gcm90YXRpb24ueCAqIHJvdGF0aW9uLnc7XHJcblx0XHRjb25zdCB5MiA9IHJvdGF0aW9uLnkgKiByb3RhdGlvbi55O1xyXG5cdFx0Y29uc3QgeXogPSByb3RhdGlvbi55ICogcm90YXRpb24uejtcclxuXHRcdGNvbnN0IHl3ID0gcm90YXRpb24ueSAqIHJvdGF0aW9uLnc7XHJcblx0XHRjb25zdCB6MiA9IHJvdGF0aW9uLnogKiByb3RhdGlvbi56O1xyXG5cdFx0Y29uc3QgencgPSByb3RhdGlvbi56ICogcm90YXRpb24udztcclxuXHRcdGNvbnN0IHcyID0gcm90YXRpb24udyAqIHJvdGF0aW9uLnc7XHJcblxyXG5cdFx0Y29uc3QgbTAwID0geDIgLSB5MiAtIHoyICsgdzI7XHJcblx0XHRjb25zdCBtMDEgPSAyLjAgKiAoeHkgLSB6dyk7XHJcblx0XHRjb25zdCBtMDIgPSAyLjAgKiAoeHogKyB5dyk7XHJcblxyXG5cdFx0Y29uc3QgbTEwID0gMi4wICogKHh5ICsgencpO1xyXG5cdFx0Y29uc3QgbTExID0gLXgyICsgeTIgLSB6MiArIHcyO1xyXG5cdFx0Y29uc3QgbTEyID0gMi4wICogKHl6IC0geHcpO1xyXG5cclxuXHRcdGNvbnN0IG0yMCA9IDIuMCAqICh4eiAtIHl3KTtcclxuXHRcdGNvbnN0IG0yMSA9IDIuMCAqICh5eiArIHh3KTtcclxuXHRcdGNvbnN0IG0yMiA9IC14MiAtIHkyICsgejIgKyB3MjtcclxuXHJcblx0XHRyZXN1bHRbMF0gPSBtMDAgKiBzY2FsZVg7XHJcblx0XHRyZXN1bHRbMV0gPSBtMTAgKiBzY2FsZVg7XHJcblx0XHRyZXN1bHRbMl0gPSBtMjAgKiBzY2FsZVg7XHJcblx0XHRyZXN1bHRbM10gPSAwLjA7XHJcblx0XHRyZXN1bHRbNF0gPSBtMDEgKiBzY2FsZVk7XHJcblx0XHRyZXN1bHRbNV0gPSBtMTEgKiBzY2FsZVk7XHJcblx0XHRyZXN1bHRbNl0gPSBtMjEgKiBzY2FsZVk7XHJcblx0XHRyZXN1bHRbN10gPSAwLjA7XHJcblx0XHRyZXN1bHRbOF0gPSBtMDIgKiBzY2FsZVo7XHJcblx0XHRyZXN1bHRbOV0gPSBtMTIgKiBzY2FsZVo7XHJcblx0XHRyZXN1bHRbMTBdID0gbTIyICogc2NhbGVaO1xyXG5cdFx0cmVzdWx0WzExXSA9IDAuMDtcclxuXHRcdHJlc3VsdFsxMl0gPSB0cmFuc2xhdGlvbi54O1xyXG5cdFx0cmVzdWx0WzEzXSA9IHRyYW5zbGF0aW9uLnk7XHJcblx0XHRyZXN1bHRbMTRdID0gdHJhbnNsYXRpb24uejtcclxuXHRcdHJlc3VsdFsxNV0gPSAxLjA7XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBmcm9tVHJhbnNsYXRpb25Sb3RhdGlvblNjYWxlKFxyXG5cdFx0dHJhbnNsYXRpb25Sb3RhdGlvblNjYWxlOiB7XHJcblx0XHRcdHRyYW5zbGF0aW9uOiBWZWN0b3IzO1xyXG5cdFx0XHRyb3RhdGlvbjogUXVhdGVybmlvbjtcclxuXHRcdFx0c2NhbGU6IFZlY3RvcjM7XHJcblx0XHR9LFxyXG5cdFx0cmVzdWx0OiBNYXRyaXg0XHJcblx0KTogTWF0cml4NCB7XHJcblx0XHRyZXR1cm4gTWF0cml4NC5mcm9tVHJhbnNsYXRpb25RdWF0ZXJuaW9uUm90YXRpb25TY2FsZShcclxuXHRcdFx0dHJhbnNsYXRpb25Sb3RhdGlvblNjYWxlLnRyYW5zbGF0aW9uLFxyXG5cdFx0XHR0cmFuc2xhdGlvblJvdGF0aW9uU2NhbGUucm90YXRpb24sXHJcblx0XHRcdHRyYW5zbGF0aW9uUm90YXRpb25TY2FsZS5zY2FsZSxcclxuXHRcdFx0cmVzdWx0XHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGZyb21UcmFuc2xhdGlvbih0cmFuc2xhdGlvbjogVmVjdG9yMywgcmVzdWx0OiBNYXRyaXg0KTogTWF0cml4NCB7XHJcblx0XHRyZXR1cm4gTWF0cml4NC5mcm9tUm90YXRpb25UcmFuc2xhdGlvbihNYXRyaXgzLklERU5USVRZLCB0cmFuc2xhdGlvbiwgcmVzdWx0KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBmcm9tU2NhbGUoc2NhbGU6IFZlY3RvcjMsIHJlc3VsdDogTWF0cml4NCk6IE1hdHJpeDQge1xyXG5cdFx0aWYgKCFkZWZpbmVkKHJlc3VsdCkpIHtcclxuXHRcdFx0cmV0dXJuIG5ldyBNYXRyaXg0KFxyXG5cdFx0XHRcdHNjYWxlLngsXHJcblx0XHRcdFx0MC4wLFxyXG5cdFx0XHRcdDAuMCxcclxuXHRcdFx0XHQwLjAsXHJcblx0XHRcdFx0MC4wLFxyXG5cdFx0XHRcdHNjYWxlLnksXHJcblx0XHRcdFx0MC4wLFxyXG5cdFx0XHRcdDAuMCxcclxuXHRcdFx0XHQwLjAsXHJcblx0XHRcdFx0MC4wLFxyXG5cdFx0XHRcdHNjYWxlLnosXHJcblx0XHRcdFx0MC4wLFxyXG5cdFx0XHRcdDAuMCxcclxuXHRcdFx0XHQwLjAsXHJcblx0XHRcdFx0MC4wLFxyXG5cdFx0XHRcdDEuMFxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJlc3VsdFswXSA9IHNjYWxlLng7XHJcblx0XHRyZXN1bHRbMV0gPSAwLjA7XHJcblx0XHRyZXN1bHRbMl0gPSAwLjA7XHJcblx0XHRyZXN1bHRbM10gPSAwLjA7XHJcblx0XHRyZXN1bHRbNF0gPSAwLjA7XHJcblx0XHRyZXN1bHRbNV0gPSBzY2FsZS55O1xyXG5cdFx0cmVzdWx0WzZdID0gMC4wO1xyXG5cdFx0cmVzdWx0WzddID0gMC4wO1xyXG5cdFx0cmVzdWx0WzhdID0gMC4wO1xyXG5cdFx0cmVzdWx0WzldID0gMC4wO1xyXG5cdFx0cmVzdWx0WzEwXSA9IHNjYWxlLno7XHJcblx0XHRyZXN1bHRbMTFdID0gMC4wO1xyXG5cdFx0cmVzdWx0WzEyXSA9IDAuMDtcclxuXHRcdHJlc3VsdFsxM10gPSAwLjA7XHJcblx0XHRyZXN1bHRbMTRdID0gMC4wO1xyXG5cdFx0cmVzdWx0WzE1XSA9IDEuMDtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZnJvbVJvdGF0aW9uKHJvdGF0aW9uOiBNYXRyaXgzLCByZXN1bHQ6IE1hdHJpeDQpOiBNYXRyaXg0IHtcclxuXHRcdGlmICghZGVmaW5lZChyZXN1bHQpKSB7XHJcblx0XHRcdHJlc3VsdCA9IG5ldyBNYXRyaXg0KCk7XHJcblx0XHR9XHJcblx0XHRyZXN1bHRbMF0gPSByb3RhdGlvblswXTtcclxuXHRcdHJlc3VsdFsxXSA9IHJvdGF0aW9uWzFdO1xyXG5cdFx0cmVzdWx0WzJdID0gcm90YXRpb25bMl07XHJcblx0XHRyZXN1bHRbM10gPSAwLjA7XHJcblxyXG5cdFx0cmVzdWx0WzRdID0gcm90YXRpb25bM107XHJcblx0XHRyZXN1bHRbNV0gPSByb3RhdGlvbls0XTtcclxuXHRcdHJlc3VsdFs2XSA9IHJvdGF0aW9uWzVdO1xyXG5cdFx0cmVzdWx0WzddID0gMC4wO1xyXG5cclxuXHRcdHJlc3VsdFs4XSA9IHJvdGF0aW9uWzZdO1xyXG5cdFx0cmVzdWx0WzldID0gcm90YXRpb25bN107XHJcblx0XHRyZXN1bHRbMTBdID0gcm90YXRpb25bOF07XHJcblx0XHRyZXN1bHRbMTFdID0gMC4wO1xyXG5cclxuXHRcdHJlc3VsdFsxMl0gPSAwLjA7XHJcblx0XHRyZXN1bHRbMTNdID0gMC4wO1xyXG5cdFx0cmVzdWx0WzE0XSA9IDAuMDtcclxuXHRcdHJlc3VsdFsxNV0gPSAxLjA7XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtYWtlUGVyc3BlY3RpdmUoXHJcblx0XHRsZWZ0OiBudW1iZXIsXHJcblx0XHRyaWdodDogbnVtYmVyLFxyXG5cdFx0dG9wOiBudW1iZXIsXHJcblx0XHRib3R0b206IG51bWJlcixcclxuXHRcdG5lYXI6IG51bWJlcixcclxuXHRcdGZhcjogbnVtYmVyXHJcblx0KTogTWF0cml4NCB7XHJcblx0XHQvLyBmcm9tIHRocmVlLmpzXHJcblx0XHRjb25zdCBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xyXG5cdFx0Y29uc3QgeCA9ICgyICogbmVhcikgLyAocmlnaHQgLSBsZWZ0KTtcclxuXHRcdGNvbnN0IHkgPSAoMiAqIG5lYXIpIC8gKHRvcCAtIGJvdHRvbSk7XHJcblxyXG5cdFx0Y29uc3QgYSA9IChyaWdodCArIGxlZnQpIC8gKHJpZ2h0IC0gbGVmdCk7XHJcblx0XHRjb25zdCBiID0gKHRvcCArIGJvdHRvbSkgLyAodG9wIC0gYm90dG9tKTtcclxuXHRcdGNvbnN0IGMgPSAtZmFyIC8gKGZhciAtIG5lYXIpO1xyXG5cdFx0Y29uc3QgZCA9ICgtZmFyICogbmVhcikgLyAoZmFyIC0gbmVhcik7XHJcblxyXG5cdFx0bWF0cml4WzBdID0geDtcclxuXHRcdG1hdHJpeFs0XSA9IDA7XHJcblx0XHRtYXRyaXhbOF0gPSBhO1xyXG5cdFx0bWF0cml4WzEyXSA9IDA7XHJcblx0XHRtYXRyaXhbMV0gPSAwO1xyXG5cdFx0bWF0cml4WzVdID0geTtcclxuXHRcdG1hdHJpeFs5XSA9IGI7XHJcblx0XHRtYXRyaXhbMTNdID0gMDtcclxuXHRcdG1hdHJpeFsyXSA9IDA7XHJcblx0XHRtYXRyaXhbNl0gPSAwO1xyXG5cdFx0bWF0cml4WzEwXSA9IGM7XHJcblx0XHRtYXRyaXhbMTRdID0gZDtcclxuXHRcdG1hdHJpeFszXSA9IDA7XHJcblx0XHRtYXRyaXhbN10gPSAwO1xyXG5cdFx0bWF0cml4WzExXSA9IC0xO1xyXG5cdFx0bWF0cml4WzE1XSA9IDA7XHJcblx0XHRyZXR1cm4gbWF0cml4O1xyXG5cdH1cclxuXHRzdGF0aWMgbWFrZU9ydGhvZ3JhcGhpYyhcclxuXHRcdGxlZnQ6IG51bWJlcixcclxuXHRcdHJpZ2h0OiBudW1iZXIsXHJcblx0XHR0b3A6IG51bWJlcixcclxuXHRcdGJvdHRvbTogbnVtYmVyLFxyXG5cdFx0bmVhcjogbnVtYmVyLFxyXG5cdFx0ZmFyOiBudW1iZXJcclxuXHQpOiBNYXRyaXg0IHtcclxuXHRcdGNvbnN0IG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XHJcblx0XHRjb25zdCB3ID0gMS4wIC8gKHJpZ2h0IC0gbGVmdCk7XHJcblx0XHRjb25zdCBoID0gMS4wIC8gKHRvcCAtIGJvdHRvbSk7XHJcblx0XHRjb25zdCBwID0gMS4wIC8gKGZhciAtIG5lYXIpO1xyXG5cclxuXHRcdGNvbnN0IHggPSAocmlnaHQgKyBsZWZ0KSAqIHc7XHJcblx0XHRjb25zdCB5ID0gKHRvcCArIGJvdHRvbSkgKiBoO1xyXG5cdFx0Y29uc3QgeiA9IG5lYXIgKiBwO1xyXG5cclxuXHRcdG1hdHJpeFswXSA9IDIgKiB3O1xyXG5cdFx0bWF0cml4WzRdID0gMDtcclxuXHRcdG1hdHJpeFs4XSA9IDA7XHJcblx0XHRtYXRyaXhbMTJdID0gLXg7XHJcblx0XHRtYXRyaXhbMV0gPSAwO1xyXG5cdFx0bWF0cml4WzVdID0gMiAqIGg7XHJcblx0XHRtYXRyaXhbOV0gPSAwO1xyXG5cdFx0bWF0cml4WzEzXSA9IC15O1xyXG5cdFx0bWF0cml4WzJdID0gMDtcclxuXHRcdG1hdHJpeFs2XSA9IDA7XHJcblx0XHRtYXRyaXhbMTBdID0gLTEgKiBwO1xyXG5cdFx0bWF0cml4WzE0XSA9IC16O1xyXG5cdFx0bWF0cml4WzNdID0gMDtcclxuXHRcdG1hdHJpeFs3XSA9IDA7XHJcblx0XHRtYXRyaXhbMTFdID0gMDtcclxuXHRcdG1hdHJpeFsxNV0gPSAxO1xyXG5cdFx0cmV0dXJuIG1hdHJpeDtcclxuXHR9XHJcblx0dG9BcnJheSgpIHtcclxuXHRcdGNvbnN0IHJlc3VsdCA9IFtdO1xyXG5cdFx0TWF0cml4NC50b0FycmF5KHRoaXMsIHJlc3VsdCk7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyBhbiBBcnJheSBmcm9tIHRoZSBwcm92aWRlZCBNYXRyaXg0IGluc3RhbmNlLlxyXG5cdCAqIFRoZSBhcnJheSB3aWxsIGJlIGluIGNvbHVtbi1tYWpvciBvcmRlci5cclxuXHQgKiBAZXhhbXBsZVxyXG5cdCAqIC8vY3JlYXRlIGFuIGFycmF5IGZyb20gYW4gaW5zdGFuY2Ugb2YgTWF0cml4NFxyXG5cdCAqIC8vIG0gPSBbMTAuMCwgMTQuMCwgMTguMCwgMjIuMF1cclxuXHQgKiAvLyAgICAgWzExLjAsIDE1LjAsIDE5LjAsIDIzLjBdXHJcblx0ICogLy8gICAgIFsxMi4wLCAxNi4wLCAyMC4wLCAyNC4wXVxyXG5cdCAqIC8vICAgICBbMTMuMCwgMTcuMCwgMjEuMCwgMjUuMF1cclxuXHQgKiBjb25zdCBhID0gTWF0cml4NC50b0FycmF5KG0pO1xyXG5cdCAqXHJcblx0ICogLy8gbSByZW1haW5zIHRoZSBzYW1lXHJcblx0ICogLy9jcmVhdGVzIGEgPSBbMTAuMCwgMTEuMCwgMTIuMCwgMTMuMCwgMTQuMCwgMTUuMCwgMTYuMCwgMTcuMCwgMTguMCwgMTkuMCwgMjAuMCwgMjEuMCwgMjIuMCwgMjMuMCwgMjQuMCwgMjUuMF1cclxuXHQgKi9cclxuXHRzdGF0aWMgdG9BcnJheShtYXRyaXg6IEFycmF5PG51bWJlcj4gfCBNYXRyaXg0LCByZXN1bHQ6IEFycmF5PG51bWJlcj4pOiBBcnJheTxudW1iZXI+IHtcclxuXHRcdGlmICghZGVmaW5lZChyZXN1bHQpKSB7XHJcblx0XHRcdHJldHVybiBbXHJcblx0XHRcdFx0bWF0cml4WzBdLFxyXG5cdFx0XHRcdG1hdHJpeFsxXSxcclxuXHRcdFx0XHRtYXRyaXhbMl0sXHJcblx0XHRcdFx0bWF0cml4WzNdLFxyXG5cdFx0XHRcdG1hdHJpeFs0XSxcclxuXHRcdFx0XHRtYXRyaXhbNV0sXHJcblx0XHRcdFx0bWF0cml4WzZdLFxyXG5cdFx0XHRcdG1hdHJpeFs3XSxcclxuXHRcdFx0XHRtYXRyaXhbOF0sXHJcblx0XHRcdFx0bWF0cml4WzldLFxyXG5cdFx0XHRcdG1hdHJpeFsxMF0sXHJcblx0XHRcdFx0bWF0cml4WzExXSxcclxuXHRcdFx0XHRtYXRyaXhbMTJdLFxyXG5cdFx0XHRcdG1hdHJpeFsxM10sXHJcblx0XHRcdFx0bWF0cml4WzE0XSxcclxuXHRcdFx0XHRtYXRyaXhbMTVdXHJcblx0XHRcdF07XHJcblx0XHR9XHJcblx0XHRyZXN1bHRbMF0gPSBtYXRyaXhbMF07XHJcblx0XHRyZXN1bHRbMV0gPSBtYXRyaXhbMV07XHJcblx0XHRyZXN1bHRbMl0gPSBtYXRyaXhbMl07XHJcblx0XHRyZXN1bHRbM10gPSBtYXRyaXhbM107XHJcblx0XHRyZXN1bHRbNF0gPSBtYXRyaXhbNF07XHJcblx0XHRyZXN1bHRbNV0gPSBtYXRyaXhbNV07XHJcblx0XHRyZXN1bHRbNl0gPSBtYXRyaXhbNl07XHJcblx0XHRyZXN1bHRbN10gPSBtYXRyaXhbN107XHJcblx0XHRyZXN1bHRbOF0gPSBtYXRyaXhbOF07XHJcblx0XHRyZXN1bHRbOV0gPSBtYXRyaXhbOV07XHJcblx0XHRyZXN1bHRbMTBdID0gbWF0cml4WzEwXTtcclxuXHRcdHJlc3VsdFsxMV0gPSBtYXRyaXhbMTFdO1xyXG5cdFx0cmVzdWx0WzEyXSA9IG1hdHJpeFsxMl07XHJcblx0XHRyZXN1bHRbMTNdID0gbWF0cml4WzEzXTtcclxuXHRcdHJlc3VsdFsxNF0gPSBtYXRyaXhbMTRdO1xyXG5cdFx0cmVzdWx0WzE1XSA9IG1hdHJpeFsxNV07XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEVsZW1lbnRJbmRleChjb2x1bW46IG51bWJlciwgcm93OiBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIGNvbHVtbiAqIDQgKyByb3c7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0Q29sdW1uKG1hdHJpeDogTWF0cml4NCwgaW5kZXg6IG51bWJlciwgcmVzdWx0OiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcblx0XHRjb25zdCBzdGFydEluZGV4ID0gaW5kZXggKiA0O1xyXG5cdFx0Y29uc3QgeCA9IG1hdHJpeFtzdGFydEluZGV4XTtcclxuXHRcdGNvbnN0IHkgPSBtYXRyaXhbc3RhcnRJbmRleCArIDFdO1xyXG5cdFx0Y29uc3QgeiA9IG1hdHJpeFtzdGFydEluZGV4ICsgMl07XHJcblx0XHRjb25zdCB3ID0gbWF0cml4W3N0YXJ0SW5kZXggKyAzXTtcclxuXHJcblx0XHRyZXN1bHQueCA9IHg7XHJcblx0XHRyZXN1bHQueSA9IHk7XHJcblx0XHRyZXN1bHQueiA9IHo7XHJcblx0XHRyZXN1bHQudyA9IHc7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHNldENvbHVtbihtYXRyaXg6IE1hdHJpeDQsIGluZGV4OiBudW1iZXIsIGNhcnRlc2lhbjogVmVjdG9yNCwgcmVzdWx0OiBNYXRyaXg0KTogTWF0cml4NCB7XHJcblx0XHRyZXN1bHQgPSBNYXRyaXg0LmNsb25lKG1hdHJpeCwgcmVzdWx0KTtcclxuXHRcdGNvbnN0IHN0YXJ0SW5kZXggPSBpbmRleCAqIDQ7XHJcblx0XHRyZXN1bHRbc3RhcnRJbmRleF0gPSBjYXJ0ZXNpYW4ueDtcclxuXHRcdHJlc3VsdFtzdGFydEluZGV4ICsgMV0gPSBjYXJ0ZXNpYW4ueTtcclxuXHRcdHJlc3VsdFtzdGFydEluZGV4ICsgMl0gPSBjYXJ0ZXNpYW4uejtcclxuXHRcdHJlc3VsdFtzdGFydEluZGV4ICsgM10gPSBjYXJ0ZXNpYW4udztcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0Um93KG1hdHJpeDogTWF0cml4NCwgaW5kZXg6IG51bWJlciwgcmVzdWx0OiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcblx0XHRjb25zdCB4ID0gbWF0cml4W2luZGV4XTtcclxuXHRcdGNvbnN0IHkgPSBtYXRyaXhbaW5kZXggKyA0XTtcclxuXHRcdGNvbnN0IHogPSBtYXRyaXhbaW5kZXggKyA4XTtcclxuXHRcdGNvbnN0IHcgPSBtYXRyaXhbaW5kZXggKyAxMl07XHJcblxyXG5cdFx0cmVzdWx0LnggPSB4O1xyXG5cdFx0cmVzdWx0LnkgPSB5O1xyXG5cdFx0cmVzdWx0LnogPSB6O1xyXG5cdFx0cmVzdWx0LncgPSB3O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBzZXRSb3cobWF0cml4OiBNYXRyaXg0LCBpbmRleDogbnVtYmVyLCBjYXJ0ZXNpYW46IFZlY3RvcjQsIHJlc3VsdDogTWF0cml4NCk6IE1hdHJpeDQge1xyXG5cdFx0cmVzdWx0ID0gTWF0cml4NC5jbG9uZShtYXRyaXgsIHJlc3VsdCk7XHJcblx0XHRyZXN1bHRbaW5kZXhdID0gY2FydGVzaWFuLng7XHJcblx0XHRyZXN1bHRbaW5kZXggKyA0XSA9IGNhcnRlc2lhbi55O1xyXG5cdFx0cmVzdWx0W2luZGV4ICsgOF0gPSBjYXJ0ZXNpYW4uejtcclxuXHRcdHJlc3VsdFtpbmRleCArIDEyXSA9IGNhcnRlc2lhbi53O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBzZXRUcmFuc2xhdGlvbihtYXRyaXg6IE1hdHJpeDQsIHRyYW5zbGF0aW9uOiBWZWN0b3IzLCByZXN1bHQ6IE1hdHJpeDQpOiBNYXRyaXg0IHtcclxuXHRcdHJlc3VsdFswXSA9IG1hdHJpeFswXTtcclxuXHRcdHJlc3VsdFsxXSA9IG1hdHJpeFsxXTtcclxuXHRcdHJlc3VsdFsyXSA9IG1hdHJpeFsyXTtcclxuXHRcdHJlc3VsdFszXSA9IG1hdHJpeFszXTtcclxuXHJcblx0XHRyZXN1bHRbNF0gPSBtYXRyaXhbNF07XHJcblx0XHRyZXN1bHRbNV0gPSBtYXRyaXhbNV07XHJcblx0XHRyZXN1bHRbNl0gPSBtYXRyaXhbNl07XHJcblx0XHRyZXN1bHRbN10gPSBtYXRyaXhbN107XHJcblxyXG5cdFx0cmVzdWx0WzhdID0gbWF0cml4WzhdO1xyXG5cdFx0cmVzdWx0WzldID0gbWF0cml4WzldO1xyXG5cdFx0cmVzdWx0WzEwXSA9IG1hdHJpeFsxMF07XHJcblx0XHRyZXN1bHRbMTFdID0gbWF0cml4WzExXTtcclxuXHJcblx0XHRyZXN1bHRbMTJdID0gdHJhbnNsYXRpb24ueDtcclxuXHRcdHJlc3VsdFsxM10gPSB0cmFuc2xhdGlvbi55O1xyXG5cdFx0cmVzdWx0WzE0XSA9IHRyYW5zbGF0aW9uLno7XHJcblx0XHRyZXN1bHRbMTVdID0gbWF0cml4WzE1XTtcclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHNldFNjYWxlKG1hdHJpeDogTWF0cml4NCwgc2NhbGU6IFZlY3RvcjMsIHJlc3VsdDogTWF0cml4NCk6IE1hdHJpeDQge1xyXG5cdFx0Y29uc3QgZXhpc3RpbmdTY2FsZSA9IE1hdHJpeDQuZ2V0U2NhbGUobWF0cml4LCBzY2FsZVNjcmF0Y2gxKTtcclxuXHRcdGNvbnN0IHNjYWxlUmF0aW9YID0gc2NhbGUueCAvIGV4aXN0aW5nU2NhbGUueDtcclxuXHRcdGNvbnN0IHNjYWxlUmF0aW9ZID0gc2NhbGUueSAvIGV4aXN0aW5nU2NhbGUueTtcclxuXHRcdGNvbnN0IHNjYWxlUmF0aW9aID0gc2NhbGUueiAvIGV4aXN0aW5nU2NhbGUuejtcclxuXHJcblx0XHRyZXN1bHRbMF0gPSBtYXRyaXhbMF0gKiBzY2FsZVJhdGlvWDtcclxuXHRcdHJlc3VsdFsxXSA9IG1hdHJpeFsxXSAqIHNjYWxlUmF0aW9YO1xyXG5cdFx0cmVzdWx0WzJdID0gbWF0cml4WzJdICogc2NhbGVSYXRpb1g7XHJcblx0XHRyZXN1bHRbM10gPSBtYXRyaXhbM107XHJcblxyXG5cdFx0cmVzdWx0WzRdID0gbWF0cml4WzRdICogc2NhbGVSYXRpb1k7XHJcblx0XHRyZXN1bHRbNV0gPSBtYXRyaXhbNV0gKiBzY2FsZVJhdGlvWTtcclxuXHRcdHJlc3VsdFs2XSA9IG1hdHJpeFs2XSAqIHNjYWxlUmF0aW9ZO1xyXG5cdFx0cmVzdWx0WzddID0gbWF0cml4WzddO1xyXG5cclxuXHRcdHJlc3VsdFs4XSA9IG1hdHJpeFs4XSAqIHNjYWxlUmF0aW9aO1xyXG5cdFx0cmVzdWx0WzldID0gbWF0cml4WzldICogc2NhbGVSYXRpb1o7XHJcblx0XHRyZXN1bHRbMTBdID0gbWF0cml4WzEwXSAqIHNjYWxlUmF0aW9aO1xyXG5cdFx0cmVzdWx0WzExXSA9IG1hdHJpeFsxMV07XHJcblxyXG5cdFx0cmVzdWx0WzEyXSA9IG1hdHJpeFsxMl07XHJcblx0XHRyZXN1bHRbMTNdID0gbWF0cml4WzEzXTtcclxuXHRcdHJlc3VsdFsxNF0gPSBtYXRyaXhbMTRdO1xyXG5cdFx0cmVzdWx0WzE1XSA9IG1hdHJpeFsxNV07XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRTY2FsZShtYXRyaXg6IE1hdHJpeDQsIHJlc3VsdDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG5cdFx0cmVzdWx0LnggPSBWZWN0b3IzLm1hZ25pdHVkZShWZWN0b3IzLmZyb21FbGVtZW50cyhtYXRyaXhbMF0sIG1hdHJpeFsxXSwgbWF0cml4WzJdLCBzY3JhdGNoQ29sdW1uKSk7XHJcblx0XHRyZXN1bHQueSA9IFZlY3RvcjMubWFnbml0dWRlKFZlY3RvcjMuZnJvbUVsZW1lbnRzKG1hdHJpeFs0XSwgbWF0cml4WzVdLCBtYXRyaXhbNl0sIHNjcmF0Y2hDb2x1bW4pKTtcclxuXHRcdHJlc3VsdC56ID0gVmVjdG9yMy5tYWduaXR1ZGUoVmVjdG9yMy5mcm9tRWxlbWVudHMobWF0cml4WzhdLCBtYXRyaXhbOV0sIG1hdHJpeFsxMF0sIHNjcmF0Y2hDb2x1bW4pKTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0TWF4aW11bVNjYWxlKG1hdHJpeDogTWF0cml4NCk6IG51bWJlciB7XHJcblx0XHRNYXRyaXg0LmdldFNjYWxlKG1hdHJpeCwgc2NhbGVTY3JhdGNoMyk7XHJcblx0XHRyZXR1cm4gVmVjdG9yMy5tYXhpbXVtQ29tcG9uZW50KHNjYWxlU2NyYXRjaDMpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHNldFJvdGF0aW9uKG1hdHJpeDogTWF0cml4NCwgcm90YXRpb246IE1hdHJpeDMsIHJlc3VsdDogTWF0cml4NCk6IE1hdHJpeDQge1xyXG5cdFx0Y29uc3Qgc2NhbGUgPSBNYXRyaXg0LmdldFNjYWxlKG1hdHJpeCwgc2NhbGVTY3JhdGNoNCk7XHJcblxyXG5cdFx0cmVzdWx0WzBdID0gcm90YXRpb25bMF0gKiBzY2FsZS54O1xyXG5cdFx0cmVzdWx0WzFdID0gcm90YXRpb25bMV0gKiBzY2FsZS54O1xyXG5cdFx0cmVzdWx0WzJdID0gcm90YXRpb25bMl0gKiBzY2FsZS54O1xyXG5cdFx0cmVzdWx0WzNdID0gbWF0cml4WzNdO1xyXG5cclxuXHRcdHJlc3VsdFs0XSA9IHJvdGF0aW9uWzNdICogc2NhbGUueTtcclxuXHRcdHJlc3VsdFs1XSA9IHJvdGF0aW9uWzRdICogc2NhbGUueTtcclxuXHRcdHJlc3VsdFs2XSA9IHJvdGF0aW9uWzVdICogc2NhbGUueTtcclxuXHRcdHJlc3VsdFs3XSA9IG1hdHJpeFs3XTtcclxuXHJcblx0XHRyZXN1bHRbOF0gPSByb3RhdGlvbls2XSAqIHNjYWxlLno7XHJcblx0XHRyZXN1bHRbOV0gPSByb3RhdGlvbls3XSAqIHNjYWxlLno7XHJcblx0XHRyZXN1bHRbMTBdID0gcm90YXRpb25bOF0gKiBzY2FsZS56O1xyXG5cdFx0cmVzdWx0WzExXSA9IG1hdHJpeFsxMV07XHJcblxyXG5cdFx0cmVzdWx0WzEyXSA9IG1hdHJpeFsxMl07XHJcblx0XHRyZXN1bHRbMTNdID0gbWF0cml4WzEzXTtcclxuXHRcdHJlc3VsdFsxNF0gPSBtYXRyaXhbMTRdO1xyXG5cdFx0cmVzdWx0WzE1XSA9IG1hdHJpeFsxNV07XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRSb3RhdGlvbihtYXRyaXg6IE1hdHJpeDQsIHJlc3VsdDogUXVhdGVybmlvbik6IFF1YXRlcm5pb24ge1xyXG5cdFx0Y29uc3Qgc2NhbGUgPSBNYXRyaXg0LmdldFNjYWxlKG1hdHJpeCwgc2NhbGVTY3JhdGNoNSk7XHJcblxyXG5cdFx0Y29uc3QgaXMxID0gMSAvIHNjYWxlLng7XHJcblx0XHRjb25zdCBpczIgPSAxIC8gc2NhbGUueTtcclxuXHRcdGNvbnN0IGlzMyA9IDEgLyBzY2FsZS56O1xyXG5cclxuXHRcdGNvbnN0IHNtMTEgPSBtYXRyaXhbMF0gKiBpczE7XHJcblx0XHRjb25zdCBzbTEyID0gbWF0cml4WzFdICogaXMyO1xyXG5cdFx0Y29uc3Qgc20xMyA9IG1hdHJpeFsyXSAqIGlzMztcclxuXHRcdGNvbnN0IHNtMjEgPSBtYXRyaXhbNF0gKiBpczE7XHJcblx0XHRjb25zdCBzbTIyID0gbWF0cml4WzVdICogaXMyO1xyXG5cdFx0Y29uc3Qgc20yMyA9IG1hdHJpeFs2XSAqIGlzMztcclxuXHRcdGNvbnN0IHNtMzEgPSBtYXRyaXhbOF0gKiBpczE7XHJcblx0XHRjb25zdCBzbTMyID0gbWF0cml4WzldICogaXMyO1xyXG5cdFx0Y29uc3Qgc20zMyA9IG1hdHJpeFsxMF0gKiBpczM7XHJcblxyXG5cdFx0Y29uc3QgdHJhY2UgPSBzbTExICsgc20yMiArIHNtMzM7XHJcblx0XHRsZXQgUyA9IDA7XHJcblxyXG5cdFx0aWYgKHRyYWNlID4gMCkge1xyXG5cdFx0XHRTID0gTWF0aC5zcXJ0KHRyYWNlICsgMS4wKSAqIDI7XHJcblx0XHRcdHJlc3VsdC53ID0gMC4yNSAqIFM7XHJcblx0XHRcdHJlc3VsdC54ID0gKHNtMjMgLSBzbTMyKSAvIFM7XHJcblx0XHRcdHJlc3VsdC55ID0gKHNtMzEgLSBzbTEzKSAvIFM7XHJcblx0XHRcdHJlc3VsdC56ID0gKHNtMTIgLSBzbTIxKSAvIFM7XHJcblx0XHR9IGVsc2UgaWYgKHNtMTEgPiBzbTIyICYmIHNtMTEgPiBzbTMzKSB7XHJcblx0XHRcdFMgPSBNYXRoLnNxcnQoMS4wICsgc20xMSAtIHNtMjIgLSBzbTMzKSAqIDI7XHJcblx0XHRcdHJlc3VsdC53ID0gKHNtMjMgLSBzbTMyKSAvIFM7XHJcblx0XHRcdHJlc3VsdC54ID0gMC4yNSAqIFM7XHJcblx0XHRcdHJlc3VsdC55ID0gKHNtMTIgKyBzbTIxKSAvIFM7XHJcblx0XHRcdHJlc3VsdC56ID0gKHNtMzEgKyBzbTEzKSAvIFM7XHJcblx0XHR9IGVsc2UgaWYgKHNtMjIgPiBzbTMzKSB7XHJcblx0XHRcdFMgPSBNYXRoLnNxcnQoMS4wICsgc20yMiAtIHNtMTEgLSBzbTMzKSAqIDI7XHJcblx0XHRcdHJlc3VsdC53ID0gKHNtMzEgLSBzbTEzKSAvIFM7XHJcblx0XHRcdHJlc3VsdC54ID0gKHNtMTIgKyBzbTIxKSAvIFM7XHJcblx0XHRcdHJlc3VsdC55ID0gMC4yNSAqIFM7XHJcblx0XHRcdHJlc3VsdC56ID0gKHNtMjMgKyBzbTMyKSAvIFM7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRTID0gTWF0aC5zcXJ0KDEuMCArIHNtMzMgLSBzbTExIC0gc20yMikgKiAyO1xyXG5cdFx0XHRyZXN1bHQudyA9IChzbTEyIC0gc20yMSkgLyBTO1xyXG5cdFx0XHRyZXN1bHQueCA9IChzbTMxICsgc20xMykgLyBTO1xyXG5cdFx0XHRyZXN1bHQueSA9IChzbTIzICsgc20zMikgLyBTO1xyXG5cdFx0XHRyZXN1bHQueiA9IDAuMjUgKiBTO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtdWx0aXBseShsZWZ0OiBNYXRyaXg0LCByaWdodDogTWF0cml4NCwgcmVzdWx0OiBNYXRyaXg0KTogTWF0cml4NCB7XHJcblx0XHRjb25zdCBsZWZ0MCA9IGxlZnRbMF07XHJcblx0XHRjb25zdCBsZWZ0MSA9IGxlZnRbMV07XHJcblx0XHRjb25zdCBsZWZ0MiA9IGxlZnRbMl07XHJcblx0XHRjb25zdCBsZWZ0MyA9IGxlZnRbM107XHJcblx0XHRjb25zdCBsZWZ0NCA9IGxlZnRbNF07XHJcblx0XHRjb25zdCBsZWZ0NSA9IGxlZnRbNV07XHJcblx0XHRjb25zdCBsZWZ0NiA9IGxlZnRbNl07XHJcblx0XHRjb25zdCBsZWZ0NyA9IGxlZnRbN107XHJcblx0XHRjb25zdCBsZWZ0OCA9IGxlZnRbOF07XHJcblx0XHRjb25zdCBsZWZ0OSA9IGxlZnRbOV07XHJcblx0XHRjb25zdCBsZWZ0MTAgPSBsZWZ0WzEwXTtcclxuXHRcdGNvbnN0IGxlZnQxMSA9IGxlZnRbMTFdO1xyXG5cdFx0Y29uc3QgbGVmdDEyID0gbGVmdFsxMl07XHJcblx0XHRjb25zdCBsZWZ0MTMgPSBsZWZ0WzEzXTtcclxuXHRcdGNvbnN0IGxlZnQxNCA9IGxlZnRbMTRdO1xyXG5cdFx0Y29uc3QgbGVmdDE1ID0gbGVmdFsxNV07XHJcblxyXG5cdFx0Y29uc3QgcmlnaHQwID0gcmlnaHRbMF07XHJcblx0XHRjb25zdCByaWdodDEgPSByaWdodFsxXTtcclxuXHRcdGNvbnN0IHJpZ2h0MiA9IHJpZ2h0WzJdO1xyXG5cdFx0Y29uc3QgcmlnaHQzID0gcmlnaHRbM107XHJcblx0XHRjb25zdCByaWdodDQgPSByaWdodFs0XTtcclxuXHRcdGNvbnN0IHJpZ2h0NSA9IHJpZ2h0WzVdO1xyXG5cdFx0Y29uc3QgcmlnaHQ2ID0gcmlnaHRbNl07XHJcblx0XHRjb25zdCByaWdodDcgPSByaWdodFs3XTtcclxuXHRcdGNvbnN0IHJpZ2h0OCA9IHJpZ2h0WzhdO1xyXG5cdFx0Y29uc3QgcmlnaHQ5ID0gcmlnaHRbOV07XHJcblx0XHRjb25zdCByaWdodDEwID0gcmlnaHRbMTBdO1xyXG5cdFx0Y29uc3QgcmlnaHQxMSA9IHJpZ2h0WzExXTtcclxuXHRcdGNvbnN0IHJpZ2h0MTIgPSByaWdodFsxMl07XHJcblx0XHRjb25zdCByaWdodDEzID0gcmlnaHRbMTNdO1xyXG5cdFx0Y29uc3QgcmlnaHQxNCA9IHJpZ2h0WzE0XTtcclxuXHRcdGNvbnN0IHJpZ2h0MTUgPSByaWdodFsxNV07XHJcblxyXG5cdFx0Y29uc3QgY29sdW1uMFJvdzAgPSBsZWZ0MCAqIHJpZ2h0MCArIGxlZnQ0ICogcmlnaHQxICsgbGVmdDggKiByaWdodDIgKyBsZWZ0MTIgKiByaWdodDM7XHJcblx0XHRjb25zdCBjb2x1bW4wUm93MSA9IGxlZnQxICogcmlnaHQwICsgbGVmdDUgKiByaWdodDEgKyBsZWZ0OSAqIHJpZ2h0MiArIGxlZnQxMyAqIHJpZ2h0MztcclxuXHRcdGNvbnN0IGNvbHVtbjBSb3cyID0gbGVmdDIgKiByaWdodDAgKyBsZWZ0NiAqIHJpZ2h0MSArIGxlZnQxMCAqIHJpZ2h0MiArIGxlZnQxNCAqIHJpZ2h0MztcclxuXHRcdGNvbnN0IGNvbHVtbjBSb3czID0gbGVmdDMgKiByaWdodDAgKyBsZWZ0NyAqIHJpZ2h0MSArIGxlZnQxMSAqIHJpZ2h0MiArIGxlZnQxNSAqIHJpZ2h0MztcclxuXHJcblx0XHRjb25zdCBjb2x1bW4xUm93MCA9IGxlZnQwICogcmlnaHQ0ICsgbGVmdDQgKiByaWdodDUgKyBsZWZ0OCAqIHJpZ2h0NiArIGxlZnQxMiAqIHJpZ2h0NztcclxuXHRcdGNvbnN0IGNvbHVtbjFSb3cxID0gbGVmdDEgKiByaWdodDQgKyBsZWZ0NSAqIHJpZ2h0NSArIGxlZnQ5ICogcmlnaHQ2ICsgbGVmdDEzICogcmlnaHQ3O1xyXG5cdFx0Y29uc3QgY29sdW1uMVJvdzIgPSBsZWZ0MiAqIHJpZ2h0NCArIGxlZnQ2ICogcmlnaHQ1ICsgbGVmdDEwICogcmlnaHQ2ICsgbGVmdDE0ICogcmlnaHQ3O1xyXG5cdFx0Y29uc3QgY29sdW1uMVJvdzMgPSBsZWZ0MyAqIHJpZ2h0NCArIGxlZnQ3ICogcmlnaHQ1ICsgbGVmdDExICogcmlnaHQ2ICsgbGVmdDE1ICogcmlnaHQ3O1xyXG5cclxuXHRcdGNvbnN0IGNvbHVtbjJSb3cwID0gbGVmdDAgKiByaWdodDggKyBsZWZ0NCAqIHJpZ2h0OSArIGxlZnQ4ICogcmlnaHQxMCArIGxlZnQxMiAqIHJpZ2h0MTE7XHJcblx0XHRjb25zdCBjb2x1bW4yUm93MSA9IGxlZnQxICogcmlnaHQ4ICsgbGVmdDUgKiByaWdodDkgKyBsZWZ0OSAqIHJpZ2h0MTAgKyBsZWZ0MTMgKiByaWdodDExO1xyXG5cdFx0Y29uc3QgY29sdW1uMlJvdzIgPSBsZWZ0MiAqIHJpZ2h0OCArIGxlZnQ2ICogcmlnaHQ5ICsgbGVmdDEwICogcmlnaHQxMCArIGxlZnQxNCAqIHJpZ2h0MTE7XHJcblx0XHRjb25zdCBjb2x1bW4yUm93MyA9IGxlZnQzICogcmlnaHQ4ICsgbGVmdDcgKiByaWdodDkgKyBsZWZ0MTEgKiByaWdodDEwICsgbGVmdDE1ICogcmlnaHQxMTtcclxuXHJcblx0XHRjb25zdCBjb2x1bW4zUm93MCA9IGxlZnQwICogcmlnaHQxMiArIGxlZnQ0ICogcmlnaHQxMyArIGxlZnQ4ICogcmlnaHQxNCArIGxlZnQxMiAqIHJpZ2h0MTU7XHJcblx0XHRjb25zdCBjb2x1bW4zUm93MSA9IGxlZnQxICogcmlnaHQxMiArIGxlZnQ1ICogcmlnaHQxMyArIGxlZnQ5ICogcmlnaHQxNCArIGxlZnQxMyAqIHJpZ2h0MTU7XHJcblx0XHRjb25zdCBjb2x1bW4zUm93MiA9IGxlZnQyICogcmlnaHQxMiArIGxlZnQ2ICogcmlnaHQxMyArIGxlZnQxMCAqIHJpZ2h0MTQgKyBsZWZ0MTQgKiByaWdodDE1O1xyXG5cdFx0Y29uc3QgY29sdW1uM1JvdzMgPSBsZWZ0MyAqIHJpZ2h0MTIgKyBsZWZ0NyAqIHJpZ2h0MTMgKyBsZWZ0MTEgKiByaWdodDE0ICsgbGVmdDE1ICogcmlnaHQxNTtcclxuXHJcblx0XHRyZXN1bHRbMF0gPSBjb2x1bW4wUm93MDtcclxuXHRcdHJlc3VsdFsxXSA9IGNvbHVtbjBSb3cxO1xyXG5cdFx0cmVzdWx0WzJdID0gY29sdW1uMFJvdzI7XHJcblx0XHRyZXN1bHRbM10gPSBjb2x1bW4wUm93MztcclxuXHRcdHJlc3VsdFs0XSA9IGNvbHVtbjFSb3cwO1xyXG5cdFx0cmVzdWx0WzVdID0gY29sdW1uMVJvdzE7XHJcblx0XHRyZXN1bHRbNl0gPSBjb2x1bW4xUm93MjtcclxuXHRcdHJlc3VsdFs3XSA9IGNvbHVtbjFSb3czO1xyXG5cdFx0cmVzdWx0WzhdID0gY29sdW1uMlJvdzA7XHJcblx0XHRyZXN1bHRbOV0gPSBjb2x1bW4yUm93MTtcclxuXHRcdHJlc3VsdFsxMF0gPSBjb2x1bW4yUm93MjtcclxuXHRcdHJlc3VsdFsxMV0gPSBjb2x1bW4yUm93MztcclxuXHRcdHJlc3VsdFsxMl0gPSBjb2x1bW4zUm93MDtcclxuXHRcdHJlc3VsdFsxM10gPSBjb2x1bW4zUm93MTtcclxuXHRcdHJlc3VsdFsxNF0gPSBjb2x1bW4zUm93MjtcclxuXHRcdHJlc3VsdFsxNV0gPSBjb2x1bW4zUm93MztcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgYWRkKGxlZnQ6IE1hdHJpeDQsIHJpZ2h0OiBNYXRyaXg0LCByZXN1bHQ6IE1hdHJpeDQpOiBNYXRyaXg0IHtcclxuXHRcdHJlc3VsdFswXSA9IGxlZnRbMF0gKyByaWdodFswXTtcclxuXHRcdHJlc3VsdFsxXSA9IGxlZnRbMV0gKyByaWdodFsxXTtcclxuXHRcdHJlc3VsdFsyXSA9IGxlZnRbMl0gKyByaWdodFsyXTtcclxuXHRcdHJlc3VsdFszXSA9IGxlZnRbM10gKyByaWdodFszXTtcclxuXHRcdHJlc3VsdFs0XSA9IGxlZnRbNF0gKyByaWdodFs0XTtcclxuXHRcdHJlc3VsdFs1XSA9IGxlZnRbNV0gKyByaWdodFs1XTtcclxuXHRcdHJlc3VsdFs2XSA9IGxlZnRbNl0gKyByaWdodFs2XTtcclxuXHRcdHJlc3VsdFs3XSA9IGxlZnRbN10gKyByaWdodFs3XTtcclxuXHRcdHJlc3VsdFs4XSA9IGxlZnRbOF0gKyByaWdodFs4XTtcclxuXHRcdHJlc3VsdFs5XSA9IGxlZnRbOV0gKyByaWdodFs5XTtcclxuXHRcdHJlc3VsdFsxMF0gPSBsZWZ0WzEwXSArIHJpZ2h0WzEwXTtcclxuXHRcdHJlc3VsdFsxMV0gPSBsZWZ0WzExXSArIHJpZ2h0WzExXTtcclxuXHRcdHJlc3VsdFsxMl0gPSBsZWZ0WzEyXSArIHJpZ2h0WzEyXTtcclxuXHRcdHJlc3VsdFsxM10gPSBsZWZ0WzEzXSArIHJpZ2h0WzEzXTtcclxuXHRcdHJlc3VsdFsxNF0gPSBsZWZ0WzE0XSArIHJpZ2h0WzE0XTtcclxuXHRcdHJlc3VsdFsxNV0gPSBsZWZ0WzE1XSArIHJpZ2h0WzE1XTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgc3VidHJhY3QobGVmdDogTWF0cml4NCwgcmlnaHQ6IE1hdHJpeDQsIHJlc3VsdDogTWF0cml4NCkge1xyXG5cdFx0cmVzdWx0WzBdID0gbGVmdFswXSAtIHJpZ2h0WzBdO1xyXG5cdFx0cmVzdWx0WzFdID0gbGVmdFsxXSAtIHJpZ2h0WzFdO1xyXG5cdFx0cmVzdWx0WzJdID0gbGVmdFsyXSAtIHJpZ2h0WzJdO1xyXG5cdFx0cmVzdWx0WzNdID0gbGVmdFszXSAtIHJpZ2h0WzNdO1xyXG5cdFx0cmVzdWx0WzRdID0gbGVmdFs0XSAtIHJpZ2h0WzRdO1xyXG5cdFx0cmVzdWx0WzVdID0gbGVmdFs1XSAtIHJpZ2h0WzVdO1xyXG5cdFx0cmVzdWx0WzZdID0gbGVmdFs2XSAtIHJpZ2h0WzZdO1xyXG5cdFx0cmVzdWx0WzddID0gbGVmdFs3XSAtIHJpZ2h0WzddO1xyXG5cdFx0cmVzdWx0WzhdID0gbGVmdFs4XSAtIHJpZ2h0WzhdO1xyXG5cdFx0cmVzdWx0WzldID0gbGVmdFs5XSAtIHJpZ2h0WzldO1xyXG5cdFx0cmVzdWx0WzEwXSA9IGxlZnRbMTBdIC0gcmlnaHRbMTBdO1xyXG5cdFx0cmVzdWx0WzExXSA9IGxlZnRbMTFdIC0gcmlnaHRbMTFdO1xyXG5cdFx0cmVzdWx0WzEyXSA9IGxlZnRbMTJdIC0gcmlnaHRbMTJdO1xyXG5cdFx0cmVzdWx0WzEzXSA9IGxlZnRbMTNdIC0gcmlnaHRbMTNdO1xyXG5cdFx0cmVzdWx0WzE0XSA9IGxlZnRbMTRdIC0gcmlnaHRbMTRdO1xyXG5cdFx0cmVzdWx0WzE1XSA9IGxlZnRbMTVdIC0gcmlnaHRbMTVdO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtdWx0aXBseVRyYW5zZm9ybWF0aW9uKGxlZnQ6IE1hdHJpeDQsIHJpZ2h0OiBNYXRyaXg0LCByZXN1bHQ6IE1hdHJpeDQpOiBNYXRyaXg0IHtcclxuXHRcdGNvbnN0IGxlZnQwID0gbGVmdFswXTtcclxuXHRcdGNvbnN0IGxlZnQxID0gbGVmdFsxXTtcclxuXHRcdGNvbnN0IGxlZnQyID0gbGVmdFsyXTtcclxuXHRcdGNvbnN0IGxlZnQ0ID0gbGVmdFs0XTtcclxuXHRcdGNvbnN0IGxlZnQ1ID0gbGVmdFs1XTtcclxuXHRcdGNvbnN0IGxlZnQ2ID0gbGVmdFs2XTtcclxuXHRcdGNvbnN0IGxlZnQ4ID0gbGVmdFs4XTtcclxuXHRcdGNvbnN0IGxlZnQ5ID0gbGVmdFs5XTtcclxuXHRcdGNvbnN0IGxlZnQxMCA9IGxlZnRbMTBdO1xyXG5cdFx0Y29uc3QgbGVmdDEyID0gbGVmdFsxMl07XHJcblx0XHRjb25zdCBsZWZ0MTMgPSBsZWZ0WzEzXTtcclxuXHRcdGNvbnN0IGxlZnQxNCA9IGxlZnRbMTRdO1xyXG5cclxuXHRcdGNvbnN0IHJpZ2h0MCA9IHJpZ2h0WzBdO1xyXG5cdFx0Y29uc3QgcmlnaHQxID0gcmlnaHRbMV07XHJcblx0XHRjb25zdCByaWdodDIgPSByaWdodFsyXTtcclxuXHRcdGNvbnN0IHJpZ2h0NCA9IHJpZ2h0WzRdO1xyXG5cdFx0Y29uc3QgcmlnaHQ1ID0gcmlnaHRbNV07XHJcblx0XHRjb25zdCByaWdodDYgPSByaWdodFs2XTtcclxuXHRcdGNvbnN0IHJpZ2h0OCA9IHJpZ2h0WzhdO1xyXG5cdFx0Y29uc3QgcmlnaHQ5ID0gcmlnaHRbOV07XHJcblx0XHRjb25zdCByaWdodDEwID0gcmlnaHRbMTBdO1xyXG5cdFx0Y29uc3QgcmlnaHQxMiA9IHJpZ2h0WzEyXTtcclxuXHRcdGNvbnN0IHJpZ2h0MTMgPSByaWdodFsxM107XHJcblx0XHRjb25zdCByaWdodDE0ID0gcmlnaHRbMTRdO1xyXG5cclxuXHRcdGNvbnN0IGNvbHVtbjBSb3cwID0gbGVmdDAgKiByaWdodDAgKyBsZWZ0NCAqIHJpZ2h0MSArIGxlZnQ4ICogcmlnaHQyO1xyXG5cdFx0Y29uc3QgY29sdW1uMFJvdzEgPSBsZWZ0MSAqIHJpZ2h0MCArIGxlZnQ1ICogcmlnaHQxICsgbGVmdDkgKiByaWdodDI7XHJcblx0XHRjb25zdCBjb2x1bW4wUm93MiA9IGxlZnQyICogcmlnaHQwICsgbGVmdDYgKiByaWdodDEgKyBsZWZ0MTAgKiByaWdodDI7XHJcblxyXG5cdFx0Y29uc3QgY29sdW1uMVJvdzAgPSBsZWZ0MCAqIHJpZ2h0NCArIGxlZnQ0ICogcmlnaHQ1ICsgbGVmdDggKiByaWdodDY7XHJcblx0XHRjb25zdCBjb2x1bW4xUm93MSA9IGxlZnQxICogcmlnaHQ0ICsgbGVmdDUgKiByaWdodDUgKyBsZWZ0OSAqIHJpZ2h0NjtcclxuXHRcdGNvbnN0IGNvbHVtbjFSb3cyID0gbGVmdDIgKiByaWdodDQgKyBsZWZ0NiAqIHJpZ2h0NSArIGxlZnQxMCAqIHJpZ2h0NjtcclxuXHJcblx0XHRjb25zdCBjb2x1bW4yUm93MCA9IGxlZnQwICogcmlnaHQ4ICsgbGVmdDQgKiByaWdodDkgKyBsZWZ0OCAqIHJpZ2h0MTA7XHJcblx0XHRjb25zdCBjb2x1bW4yUm93MSA9IGxlZnQxICogcmlnaHQ4ICsgbGVmdDUgKiByaWdodDkgKyBsZWZ0OSAqIHJpZ2h0MTA7XHJcblx0XHRjb25zdCBjb2x1bW4yUm93MiA9IGxlZnQyICogcmlnaHQ4ICsgbGVmdDYgKiByaWdodDkgKyBsZWZ0MTAgKiByaWdodDEwO1xyXG5cclxuXHRcdGNvbnN0IGNvbHVtbjNSb3cwID0gbGVmdDAgKiByaWdodDEyICsgbGVmdDQgKiByaWdodDEzICsgbGVmdDggKiByaWdodDE0ICsgbGVmdDEyO1xyXG5cdFx0Y29uc3QgY29sdW1uM1JvdzEgPSBsZWZ0MSAqIHJpZ2h0MTIgKyBsZWZ0NSAqIHJpZ2h0MTMgKyBsZWZ0OSAqIHJpZ2h0MTQgKyBsZWZ0MTM7XHJcblx0XHRjb25zdCBjb2x1bW4zUm93MiA9IGxlZnQyICogcmlnaHQxMiArIGxlZnQ2ICogcmlnaHQxMyArIGxlZnQxMCAqIHJpZ2h0MTQgKyBsZWZ0MTQ7XHJcblxyXG5cdFx0cmVzdWx0WzBdID0gY29sdW1uMFJvdzA7XHJcblx0XHRyZXN1bHRbMV0gPSBjb2x1bW4wUm93MTtcclxuXHRcdHJlc3VsdFsyXSA9IGNvbHVtbjBSb3cyO1xyXG5cdFx0cmVzdWx0WzNdID0gMC4wO1xyXG5cdFx0cmVzdWx0WzRdID0gY29sdW1uMVJvdzA7XHJcblx0XHRyZXN1bHRbNV0gPSBjb2x1bW4xUm93MTtcclxuXHRcdHJlc3VsdFs2XSA9IGNvbHVtbjFSb3cyO1xyXG5cdFx0cmVzdWx0WzddID0gMC4wO1xyXG5cdFx0cmVzdWx0WzhdID0gY29sdW1uMlJvdzA7XHJcblx0XHRyZXN1bHRbOV0gPSBjb2x1bW4yUm93MTtcclxuXHRcdHJlc3VsdFsxMF0gPSBjb2x1bW4yUm93MjtcclxuXHRcdHJlc3VsdFsxMV0gPSAwLjA7XHJcblx0XHRyZXN1bHRbMTJdID0gY29sdW1uM1JvdzA7XHJcblx0XHRyZXN1bHRbMTNdID0gY29sdW1uM1JvdzE7XHJcblx0XHRyZXN1bHRbMTRdID0gY29sdW1uM1JvdzI7XHJcblx0XHRyZXN1bHRbMTVdID0gMS4wO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtdWx0aXBseUJ5TWF0cml4MyhtYXRyaXg6IE1hdHJpeDQsIHJvdGF0aW9uOiBNYXRyaXgzLCByZXN1bHQ6IE1hdHJpeDQpOiBNYXRyaXg0IHtcclxuXHRcdGNvbnN0IGxlZnQwID0gbWF0cml4WzBdO1xyXG5cdFx0Y29uc3QgbGVmdDEgPSBtYXRyaXhbMV07XHJcblx0XHRjb25zdCBsZWZ0MiA9IG1hdHJpeFsyXTtcclxuXHRcdGNvbnN0IGxlZnQ0ID0gbWF0cml4WzRdO1xyXG5cdFx0Y29uc3QgbGVmdDUgPSBtYXRyaXhbNV07XHJcblx0XHRjb25zdCBsZWZ0NiA9IG1hdHJpeFs2XTtcclxuXHRcdGNvbnN0IGxlZnQ4ID0gbWF0cml4WzhdO1xyXG5cdFx0Y29uc3QgbGVmdDkgPSBtYXRyaXhbOV07XHJcblx0XHRjb25zdCBsZWZ0MTAgPSBtYXRyaXhbMTBdO1xyXG5cclxuXHRcdGNvbnN0IHJpZ2h0MCA9IHJvdGF0aW9uWzBdO1xyXG5cdFx0Y29uc3QgcmlnaHQxID0gcm90YXRpb25bMV07XHJcblx0XHRjb25zdCByaWdodDIgPSByb3RhdGlvblsyXTtcclxuXHRcdGNvbnN0IHJpZ2h0NCA9IHJvdGF0aW9uWzNdO1xyXG5cdFx0Y29uc3QgcmlnaHQ1ID0gcm90YXRpb25bNF07XHJcblx0XHRjb25zdCByaWdodDYgPSByb3RhdGlvbls1XTtcclxuXHRcdGNvbnN0IHJpZ2h0OCA9IHJvdGF0aW9uWzZdO1xyXG5cdFx0Y29uc3QgcmlnaHQ5ID0gcm90YXRpb25bN107XHJcblx0XHRjb25zdCByaWdodDEwID0gcm90YXRpb25bOF07XHJcblxyXG5cdFx0Y29uc3QgY29sdW1uMFJvdzAgPSBsZWZ0MCAqIHJpZ2h0MCArIGxlZnQ0ICogcmlnaHQxICsgbGVmdDggKiByaWdodDI7XHJcblx0XHRjb25zdCBjb2x1bW4wUm93MSA9IGxlZnQxICogcmlnaHQwICsgbGVmdDUgKiByaWdodDEgKyBsZWZ0OSAqIHJpZ2h0MjtcclxuXHRcdGNvbnN0IGNvbHVtbjBSb3cyID0gbGVmdDIgKiByaWdodDAgKyBsZWZ0NiAqIHJpZ2h0MSArIGxlZnQxMCAqIHJpZ2h0MjtcclxuXHJcblx0XHRjb25zdCBjb2x1bW4xUm93MCA9IGxlZnQwICogcmlnaHQ0ICsgbGVmdDQgKiByaWdodDUgKyBsZWZ0OCAqIHJpZ2h0NjtcclxuXHRcdGNvbnN0IGNvbHVtbjFSb3cxID0gbGVmdDEgKiByaWdodDQgKyBsZWZ0NSAqIHJpZ2h0NSArIGxlZnQ5ICogcmlnaHQ2O1xyXG5cdFx0Y29uc3QgY29sdW1uMVJvdzIgPSBsZWZ0MiAqIHJpZ2h0NCArIGxlZnQ2ICogcmlnaHQ1ICsgbGVmdDEwICogcmlnaHQ2O1xyXG5cclxuXHRcdGNvbnN0IGNvbHVtbjJSb3cwID0gbGVmdDAgKiByaWdodDggKyBsZWZ0NCAqIHJpZ2h0OSArIGxlZnQ4ICogcmlnaHQxMDtcclxuXHRcdGNvbnN0IGNvbHVtbjJSb3cxID0gbGVmdDEgKiByaWdodDggKyBsZWZ0NSAqIHJpZ2h0OSArIGxlZnQ5ICogcmlnaHQxMDtcclxuXHRcdGNvbnN0IGNvbHVtbjJSb3cyID0gbGVmdDIgKiByaWdodDggKyBsZWZ0NiAqIHJpZ2h0OSArIGxlZnQxMCAqIHJpZ2h0MTA7XHJcblxyXG5cdFx0cmVzdWx0WzBdID0gY29sdW1uMFJvdzA7XHJcblx0XHRyZXN1bHRbMV0gPSBjb2x1bW4wUm93MTtcclxuXHRcdHJlc3VsdFsyXSA9IGNvbHVtbjBSb3cyO1xyXG5cdFx0cmVzdWx0WzNdID0gMC4wO1xyXG5cdFx0cmVzdWx0WzRdID0gY29sdW1uMVJvdzA7XHJcblx0XHRyZXN1bHRbNV0gPSBjb2x1bW4xUm93MTtcclxuXHRcdHJlc3VsdFs2XSA9IGNvbHVtbjFSb3cyO1xyXG5cdFx0cmVzdWx0WzddID0gMC4wO1xyXG5cdFx0cmVzdWx0WzhdID0gY29sdW1uMlJvdzA7XHJcblx0XHRyZXN1bHRbOV0gPSBjb2x1bW4yUm93MTtcclxuXHRcdHJlc3VsdFsxMF0gPSBjb2x1bW4yUm93MjtcclxuXHRcdHJlc3VsdFsxMV0gPSAwLjA7XHJcblx0XHRyZXN1bHRbMTJdID0gbWF0cml4WzEyXTtcclxuXHRcdHJlc3VsdFsxM10gPSBtYXRyaXhbMTNdO1xyXG5cdFx0cmVzdWx0WzE0XSA9IG1hdHJpeFsxNF07XHJcblx0XHRyZXN1bHRbMTVdID0gbWF0cml4WzE1XTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbXVsdGlwbHlCeVRyYW5zbGF0aW9uKG1hdHJpeDogTWF0cml4NCwgdHJhbnNsYXRpb246IFZlY3RvcjMsIHJlc3VsdDogTWF0cml4NCk6IE1hdHJpeDQge1xyXG5cdFx0Y29uc3QgeCA9IHRyYW5zbGF0aW9uLng7XHJcblx0XHRjb25zdCB5ID0gdHJhbnNsYXRpb24ueTtcclxuXHRcdGNvbnN0IHogPSB0cmFuc2xhdGlvbi56O1xyXG5cclxuXHRcdGNvbnN0IHR4ID0geCAqIG1hdHJpeFswXSArIHkgKiBtYXRyaXhbNF0gKyB6ICogbWF0cml4WzhdICsgbWF0cml4WzEyXTtcclxuXHRcdGNvbnN0IHR5ID0geCAqIG1hdHJpeFsxXSArIHkgKiBtYXRyaXhbNV0gKyB6ICogbWF0cml4WzldICsgbWF0cml4WzEzXTtcclxuXHRcdGNvbnN0IHR6ID0geCAqIG1hdHJpeFsyXSArIHkgKiBtYXRyaXhbNl0gKyB6ICogbWF0cml4WzEwXSArIG1hdHJpeFsxNF07XHJcblxyXG5cdFx0cmVzdWx0WzBdID0gbWF0cml4WzBdO1xyXG5cdFx0cmVzdWx0WzFdID0gbWF0cml4WzFdO1xyXG5cdFx0cmVzdWx0WzJdID0gbWF0cml4WzJdO1xyXG5cdFx0cmVzdWx0WzNdID0gbWF0cml4WzNdO1xyXG5cdFx0cmVzdWx0WzRdID0gbWF0cml4WzRdO1xyXG5cdFx0cmVzdWx0WzVdID0gbWF0cml4WzVdO1xyXG5cdFx0cmVzdWx0WzZdID0gbWF0cml4WzZdO1xyXG5cdFx0cmVzdWx0WzddID0gbWF0cml4WzddO1xyXG5cdFx0cmVzdWx0WzhdID0gbWF0cml4WzhdO1xyXG5cdFx0cmVzdWx0WzldID0gbWF0cml4WzldO1xyXG5cdFx0cmVzdWx0WzEwXSA9IG1hdHJpeFsxMF07XHJcblx0XHRyZXN1bHRbMTFdID0gbWF0cml4WzExXTtcclxuXHRcdHJlc3VsdFsxMl0gPSB0eDtcclxuXHRcdHJlc3VsdFsxM10gPSB0eTtcclxuXHRcdHJlc3VsdFsxNF0gPSB0ejtcclxuXHRcdHJlc3VsdFsxNV0gPSBtYXRyaXhbMTVdO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtdWx0aXBseUJ5U2NhbGUobWF0cml4OiBNYXRyaXg0LCBzY2FsZTogVmVjdG9yMywgcmVzdWx0OiBNYXRyaXg0KTogTWF0cml4NCB7XHJcblx0XHRjb25zdCBzY2FsZVggPSBzY2FsZS54O1xyXG5cdFx0Y29uc3Qgc2NhbGVZID0gc2NhbGUueTtcclxuXHRcdGNvbnN0IHNjYWxlWiA9IHNjYWxlLno7XHJcblxyXG5cdFx0Ly8gRmFzdGVyIHRoYW4gVmVjdG9yMy5lcXVhbHNcclxuXHRcdGlmIChzY2FsZVggPT09IDEuMCAmJiBzY2FsZVkgPT09IDEuMCAmJiBzY2FsZVogPT09IDEuMCkge1xyXG5cdFx0XHRyZXR1cm4gTWF0cml4NC5jbG9uZShtYXRyaXgsIHJlc3VsdCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmVzdWx0WzBdID0gc2NhbGVYICogbWF0cml4WzBdO1xyXG5cdFx0cmVzdWx0WzFdID0gc2NhbGVYICogbWF0cml4WzFdO1xyXG5cdFx0cmVzdWx0WzJdID0gc2NhbGVYICogbWF0cml4WzJdO1xyXG5cdFx0cmVzdWx0WzNdID0gbWF0cml4WzNdO1xyXG5cclxuXHRcdHJlc3VsdFs0XSA9IHNjYWxlWSAqIG1hdHJpeFs0XTtcclxuXHRcdHJlc3VsdFs1XSA9IHNjYWxlWSAqIG1hdHJpeFs1XTtcclxuXHRcdHJlc3VsdFs2XSA9IHNjYWxlWSAqIG1hdHJpeFs2XTtcclxuXHRcdHJlc3VsdFs3XSA9IG1hdHJpeFs3XTtcclxuXHJcblx0XHRyZXN1bHRbOF0gPSBzY2FsZVogKiBtYXRyaXhbOF07XHJcblx0XHRyZXN1bHRbOV0gPSBzY2FsZVogKiBtYXRyaXhbOV07XHJcblx0XHRyZXN1bHRbMTBdID0gc2NhbGVaICogbWF0cml4WzEwXTtcclxuXHRcdHJlc3VsdFsxMV0gPSBtYXRyaXhbMTFdO1xyXG5cclxuXHRcdHJlc3VsdFsxMl0gPSBtYXRyaXhbMTJdO1xyXG5cdFx0cmVzdWx0WzEzXSA9IG1hdHJpeFsxM107XHJcblx0XHRyZXN1bHRbMTRdID0gbWF0cml4WzE0XTtcclxuXHRcdHJlc3VsdFsxNV0gPSBtYXRyaXhbMTVdO1xyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbXVsdGlwbHlCeVVuaWZvcm1TY2FsZShtYXRyaXg6IE1hdHJpeDQsIHNjYWxlOiBudW1iZXIsIHJlc3VsdDogTWF0cml4NCk6IE1hdHJpeDQge1xyXG5cdFx0cmVzdWx0WzBdID0gbWF0cml4WzBdICogc2NhbGU7XHJcblx0XHRyZXN1bHRbMV0gPSBtYXRyaXhbMV0gKiBzY2FsZTtcclxuXHRcdHJlc3VsdFsyXSA9IG1hdHJpeFsyXSAqIHNjYWxlO1xyXG5cdFx0cmVzdWx0WzNdID0gbWF0cml4WzNdO1xyXG5cclxuXHRcdHJlc3VsdFs0XSA9IG1hdHJpeFs0XSAqIHNjYWxlO1xyXG5cdFx0cmVzdWx0WzVdID0gbWF0cml4WzVdICogc2NhbGU7XHJcblx0XHRyZXN1bHRbNl0gPSBtYXRyaXhbNl0gKiBzY2FsZTtcclxuXHRcdHJlc3VsdFs3XSA9IG1hdHJpeFs3XTtcclxuXHJcblx0XHRyZXN1bHRbOF0gPSBtYXRyaXhbOF0gKiBzY2FsZTtcclxuXHRcdHJlc3VsdFs5XSA9IG1hdHJpeFs5XSAqIHNjYWxlO1xyXG5cdFx0cmVzdWx0WzEwXSA9IG1hdHJpeFsxMF0gKiBzY2FsZTtcclxuXHRcdHJlc3VsdFsxMV0gPSBtYXRyaXhbMTFdO1xyXG5cclxuXHRcdHJlc3VsdFsxMl0gPSBtYXRyaXhbMTJdO1xyXG5cdFx0cmVzdWx0WzEzXSA9IG1hdHJpeFsxM107XHJcblx0XHRyZXN1bHRbMTRdID0gbWF0cml4WzE0XTtcclxuXHRcdHJlc3VsdFsxNV0gPSBtYXRyaXhbMTVdO1xyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbXVsdGlwbHlCeVZlY3RvcihtYXRyaXg6IE1hdHJpeDQsIGNhcnRlc2lhbjogVmVjdG9yNCwgcmVzdWx0OiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcblx0XHRjb25zdCB2WCA9IGNhcnRlc2lhbi54O1xyXG5cdFx0Y29uc3QgdlkgPSBjYXJ0ZXNpYW4ueTtcclxuXHRcdGNvbnN0IHZaID0gY2FydGVzaWFuLno7XHJcblx0XHRjb25zdCB2VyA9IGNhcnRlc2lhbi53O1xyXG5cclxuXHRcdGNvbnN0IHggPSBtYXRyaXhbMF0gKiB2WCArIG1hdHJpeFs0XSAqIHZZICsgbWF0cml4WzhdICogdlogKyBtYXRyaXhbMTJdICogdlc7XHJcblx0XHRjb25zdCB5ID0gbWF0cml4WzFdICogdlggKyBtYXRyaXhbNV0gKiB2WSArIG1hdHJpeFs5XSAqIHZaICsgbWF0cml4WzEzXSAqIHZXO1xyXG5cdFx0Y29uc3QgeiA9IG1hdHJpeFsyXSAqIHZYICsgbWF0cml4WzZdICogdlkgKyBtYXRyaXhbMTBdICogdlogKyBtYXRyaXhbMTRdICogdlc7XHJcblx0XHRjb25zdCB3ID0gbWF0cml4WzNdICogdlggKyBtYXRyaXhbN10gKiB2WSArIG1hdHJpeFsxMV0gKiB2WiArIG1hdHJpeFsxNV0gKiB2VztcclxuXHJcblx0XHRyZXN1bHQueCA9IHg7XHJcblx0XHRyZXN1bHQueSA9IHk7XHJcblx0XHRyZXN1bHQueiA9IHo7XHJcblx0XHRyZXN1bHQudyA9IHc7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG11bHRpcGx5QnlQb2ludEFzVmVjdG9yKG1hdHJpeDogTWF0cml4NCwgY2FydGVzaWFuOiBWZWN0b3IzLCByZXN1bHQ6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuXHRcdGNvbnN0IHZYID0gY2FydGVzaWFuLng7XHJcblx0XHRjb25zdCB2WSA9IGNhcnRlc2lhbi55O1xyXG5cdFx0Y29uc3QgdlogPSBjYXJ0ZXNpYW4uejtcclxuXHJcblx0XHRjb25zdCB4ID0gbWF0cml4WzBdICogdlggKyBtYXRyaXhbNF0gKiB2WSArIG1hdHJpeFs4XSAqIHZaO1xyXG5cdFx0Y29uc3QgeSA9IG1hdHJpeFsxXSAqIHZYICsgbWF0cml4WzVdICogdlkgKyBtYXRyaXhbOV0gKiB2WjtcclxuXHRcdGNvbnN0IHogPSBtYXRyaXhbMl0gKiB2WCArIG1hdHJpeFs2XSAqIHZZICsgbWF0cml4WzEwXSAqIHZaO1xyXG5cclxuXHRcdHJlc3VsdC54ID0geDtcclxuXHRcdHJlc3VsdC55ID0geTtcclxuXHRcdHJlc3VsdC56ID0gejtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbXVsdGlwbHlCeVBvaW50KG1hdHJpeDogTWF0cml4NCwgY2FydGVzaWFuOiBWZWN0b3IzLCByZXN1bHQ6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuXHRcdGNvbnN0IHZYID0gY2FydGVzaWFuLng7XHJcblx0XHRjb25zdCB2WSA9IGNhcnRlc2lhbi55O1xyXG5cdFx0Y29uc3QgdlogPSBjYXJ0ZXNpYW4uejtcclxuXHJcblx0XHRjb25zdCB4ID0gbWF0cml4WzBdICogdlggKyBtYXRyaXhbNF0gKiB2WSArIG1hdHJpeFs4XSAqIHZaICsgbWF0cml4WzEyXTtcclxuXHRcdGNvbnN0IHkgPSBtYXRyaXhbMV0gKiB2WCArIG1hdHJpeFs1XSAqIHZZICsgbWF0cml4WzldICogdlogKyBtYXRyaXhbMTNdO1xyXG5cdFx0Y29uc3QgeiA9IG1hdHJpeFsyXSAqIHZYICsgbWF0cml4WzZdICogdlkgKyBtYXRyaXhbMTBdICogdlogKyBtYXRyaXhbMTRdO1xyXG5cclxuXHRcdHJlc3VsdC54ID0geDtcclxuXHRcdHJlc3VsdC55ID0geTtcclxuXHRcdHJlc3VsdC56ID0gejtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbXVsdGlwbHlCeVNjYWxhcihtYXRyaXg6IE1hdHJpeDQsIHNjYWxhcjogbnVtYmVyLCByZXN1bHQ6IE1hdHJpeDQpOiBNYXRyaXg0IHtcclxuXHRcdHJlc3VsdFswXSA9IG1hdHJpeFswXSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFsxXSA9IG1hdHJpeFsxXSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFsyXSA9IG1hdHJpeFsyXSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFszXSA9IG1hdHJpeFszXSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFs0XSA9IG1hdHJpeFs0XSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFs1XSA9IG1hdHJpeFs1XSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFs2XSA9IG1hdHJpeFs2XSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFs3XSA9IG1hdHJpeFs3XSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFs4XSA9IG1hdHJpeFs4XSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFs5XSA9IG1hdHJpeFs5XSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFsxMF0gPSBtYXRyaXhbMTBdICogc2NhbGFyO1xyXG5cdFx0cmVzdWx0WzExXSA9IG1hdHJpeFsxMV0gKiBzY2FsYXI7XHJcblx0XHRyZXN1bHRbMTJdID0gbWF0cml4WzEyXSAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdFsxM10gPSBtYXRyaXhbMTNdICogc2NhbGFyO1xyXG5cdFx0cmVzdWx0WzE0XSA9IG1hdHJpeFsxNF0gKiBzY2FsYXI7XHJcblx0XHRyZXN1bHRbMTVdID0gbWF0cml4WzE1XSAqIHNjYWxhcjtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbmVnYXRlKG1hdHJpeDogTWF0cml4NCwgcmVzdWx0OiBNYXRyaXg0KTogTWF0cml4NCB7XHJcblx0XHRyZXN1bHRbMF0gPSAtbWF0cml4WzBdO1xyXG5cdFx0cmVzdWx0WzFdID0gLW1hdHJpeFsxXTtcclxuXHRcdHJlc3VsdFsyXSA9IC1tYXRyaXhbMl07XHJcblx0XHRyZXN1bHRbM10gPSAtbWF0cml4WzNdO1xyXG5cdFx0cmVzdWx0WzRdID0gLW1hdHJpeFs0XTtcclxuXHRcdHJlc3VsdFs1XSA9IC1tYXRyaXhbNV07XHJcblx0XHRyZXN1bHRbNl0gPSAtbWF0cml4WzZdO1xyXG5cdFx0cmVzdWx0WzddID0gLW1hdHJpeFs3XTtcclxuXHRcdHJlc3VsdFs4XSA9IC1tYXRyaXhbOF07XHJcblx0XHRyZXN1bHRbOV0gPSAtbWF0cml4WzldO1xyXG5cdFx0cmVzdWx0WzEwXSA9IC1tYXRyaXhbMTBdO1xyXG5cdFx0cmVzdWx0WzExXSA9IC1tYXRyaXhbMTFdO1xyXG5cdFx0cmVzdWx0WzEyXSA9IC1tYXRyaXhbMTJdO1xyXG5cdFx0cmVzdWx0WzEzXSA9IC1tYXRyaXhbMTNdO1xyXG5cdFx0cmVzdWx0WzE0XSA9IC1tYXRyaXhbMTRdO1xyXG5cdFx0cmVzdWx0WzE1XSA9IC1tYXRyaXhbMTVdO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyB0cmFuc3Bvc2UobWF0cml4OiBNYXRyaXg0LCByZXN1bHQ6IE1hdHJpeDQpOiBNYXRyaXg0IHtcclxuXHRcdGNvbnN0IG1hdHJpeDEgPSBtYXRyaXhbMV07XHJcblx0XHRjb25zdCBtYXRyaXgyID0gbWF0cml4WzJdO1xyXG5cdFx0Y29uc3QgbWF0cml4MyA9IG1hdHJpeFszXTtcclxuXHRcdGNvbnN0IG1hdHJpeDYgPSBtYXRyaXhbNl07XHJcblx0XHRjb25zdCBtYXRyaXg3ID0gbWF0cml4WzddO1xyXG5cdFx0Y29uc3QgbWF0cml4MTEgPSBtYXRyaXhbMTFdO1xyXG5cclxuXHRcdHJlc3VsdFswXSA9IG1hdHJpeFswXTtcclxuXHRcdHJlc3VsdFsxXSA9IG1hdHJpeFs0XTtcclxuXHRcdHJlc3VsdFsyXSA9IG1hdHJpeFs4XTtcclxuXHRcdHJlc3VsdFszXSA9IG1hdHJpeFsxMl07XHJcblx0XHRyZXN1bHRbNF0gPSBtYXRyaXgxO1xyXG5cdFx0cmVzdWx0WzVdID0gbWF0cml4WzVdO1xyXG5cdFx0cmVzdWx0WzZdID0gbWF0cml4WzldO1xyXG5cdFx0cmVzdWx0WzddID0gbWF0cml4WzEzXTtcclxuXHRcdHJlc3VsdFs4XSA9IG1hdHJpeDI7XHJcblx0XHRyZXN1bHRbOV0gPSBtYXRyaXg2O1xyXG5cdFx0cmVzdWx0WzEwXSA9IG1hdHJpeFsxMF07XHJcblx0XHRyZXN1bHRbMTFdID0gbWF0cml4WzE0XTtcclxuXHRcdHJlc3VsdFsxMl0gPSBtYXRyaXgzO1xyXG5cdFx0cmVzdWx0WzEzXSA9IG1hdHJpeDc7XHJcblx0XHRyZXN1bHRbMTRdID0gbWF0cml4MTE7XHJcblx0XHRyZXN1bHRbMTVdID0gbWF0cml4WzE1XTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgYWJzKG1hdHJpeDogTWF0cml4NCwgcmVzdWx0OiBNYXRyaXg0KSB7XHJcblx0XHRyZXN1bHRbMF0gPSBNYXRoLmFicyhtYXRyaXhbMF0pO1xyXG5cdFx0cmVzdWx0WzFdID0gTWF0aC5hYnMobWF0cml4WzFdKTtcclxuXHRcdHJlc3VsdFsyXSA9IE1hdGguYWJzKG1hdHJpeFsyXSk7XHJcblx0XHRyZXN1bHRbM10gPSBNYXRoLmFicyhtYXRyaXhbM10pO1xyXG5cdFx0cmVzdWx0WzRdID0gTWF0aC5hYnMobWF0cml4WzRdKTtcclxuXHRcdHJlc3VsdFs1XSA9IE1hdGguYWJzKG1hdHJpeFs1XSk7XHJcblx0XHRyZXN1bHRbNl0gPSBNYXRoLmFicyhtYXRyaXhbNl0pO1xyXG5cdFx0cmVzdWx0WzddID0gTWF0aC5hYnMobWF0cml4WzddKTtcclxuXHRcdHJlc3VsdFs4XSA9IE1hdGguYWJzKG1hdHJpeFs4XSk7XHJcblx0XHRyZXN1bHRbOV0gPSBNYXRoLmFicyhtYXRyaXhbOV0pO1xyXG5cdFx0cmVzdWx0WzEwXSA9IE1hdGguYWJzKG1hdHJpeFsxMF0pO1xyXG5cdFx0cmVzdWx0WzExXSA9IE1hdGguYWJzKG1hdHJpeFsxMV0pO1xyXG5cdFx0cmVzdWx0WzEyXSA9IE1hdGguYWJzKG1hdHJpeFsxMl0pO1xyXG5cdFx0cmVzdWx0WzEzXSA9IE1hdGguYWJzKG1hdHJpeFsxM10pO1xyXG5cdFx0cmVzdWx0WzE0XSA9IE1hdGguYWJzKG1hdHJpeFsxNF0pO1xyXG5cdFx0cmVzdWx0WzE1XSA9IE1hdGguYWJzKG1hdHJpeFsxNV0pO1xyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZXF1YWxzKGxlZnQ6IE1hdHJpeDQsIHJpZ2h0OiBNYXRyaXg0KTogYm9vbGVhbiB7XHJcblx0XHQvLyBHaXZlbiB0aGF0IG1vc3QgbWF0cmljZXMgd2lsbCBiZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaWNlcywgdGhlIGVsZW1lbnRzXHJcblx0XHQvLyBhcmUgdGVzdGVkIGluIG9yZGVyIHN1Y2ggdGhhdCB0aGUgdGVzdCBpcyBsaWtlbHkgdG8gZmFpbCBhcyBlYXJseVxyXG5cdFx0Ly8gYXMgcG9zc2libGUuICBJIF90aGlua18gdGhpcyBpcyBqdXN0IGFzIGZyaWVuZGx5IHRvIHRoZSBMMSBjYWNoZVxyXG5cdFx0Ly8gYXMgdGVzdGluZyBpbiBpbmRleCBvcmRlci4gIEl0IGlzIGNlcnRhaW50eSBmYXN0ZXIgaW4gcHJhY3RpY2UuXHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHRsZWZ0ID09PSByaWdodCB8fFxyXG5cdFx0XHQoZGVmaW5lZChsZWZ0KSAmJlxyXG5cdFx0XHRcdGRlZmluZWQocmlnaHQpICYmXHJcblx0XHRcdFx0Ly8gVHJhbnNsYXRpb25cclxuXHRcdFx0XHRsZWZ0WzEyXSA9PT0gcmlnaHRbMTJdICYmXHJcblx0XHRcdFx0bGVmdFsxM10gPT09IHJpZ2h0WzEzXSAmJlxyXG5cdFx0XHRcdGxlZnRbMTRdID09PSByaWdodFsxNF0gJiZcclxuXHRcdFx0XHQvLyBSb3RhdGlvbi9zY2FsZVxyXG5cdFx0XHRcdGxlZnRbMF0gPT09IHJpZ2h0WzBdICYmXHJcblx0XHRcdFx0bGVmdFsxXSA9PT0gcmlnaHRbMV0gJiZcclxuXHRcdFx0XHRsZWZ0WzJdID09PSByaWdodFsyXSAmJlxyXG5cdFx0XHRcdGxlZnRbNF0gPT09IHJpZ2h0WzRdICYmXHJcblx0XHRcdFx0bGVmdFs1XSA9PT0gcmlnaHRbNV0gJiZcclxuXHRcdFx0XHRsZWZ0WzZdID09PSByaWdodFs2XSAmJlxyXG5cdFx0XHRcdGxlZnRbOF0gPT09IHJpZ2h0WzhdICYmXHJcblx0XHRcdFx0bGVmdFs5XSA9PT0gcmlnaHRbOV0gJiZcclxuXHRcdFx0XHRsZWZ0WzEwXSA9PT0gcmlnaHRbMTBdICYmXHJcblx0XHRcdFx0Ly8gQm90dG9tIHJvd1xyXG5cdFx0XHRcdGxlZnRbM10gPT09IHJpZ2h0WzNdICYmXHJcblx0XHRcdFx0bGVmdFs3XSA9PT0gcmlnaHRbN10gJiZcclxuXHRcdFx0XHRsZWZ0WzExXSA9PT0gcmlnaHRbMTFdICYmXHJcblx0XHRcdFx0bGVmdFsxNV0gPT09IHJpZ2h0WzE1XSlcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZXF1YWxzRXBzaWxvbihsZWZ0OiBNYXRyaXg0LCByaWdodDogTWF0cml4NCwgZXBzaWxvbjogbnVtYmVyKTogYm9vbGVhbiB7XHJcblx0XHRlcHNpbG9uID0gZGVmYXVsdFZhbHVlKGVwc2lsb24sIDApO1xyXG5cclxuXHRcdHJldHVybiAoXHJcblx0XHRcdGxlZnQgPT09IHJpZ2h0IHx8XHJcblx0XHRcdChkZWZpbmVkKGxlZnQpICYmXHJcblx0XHRcdFx0ZGVmaW5lZChyaWdodCkgJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzBdIC0gcmlnaHRbMF0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzFdIC0gcmlnaHRbMV0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzJdIC0gcmlnaHRbMl0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzNdIC0gcmlnaHRbM10pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzRdIC0gcmlnaHRbNF0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzVdIC0gcmlnaHRbNV0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzZdIC0gcmlnaHRbNl0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzddIC0gcmlnaHRbN10pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzhdIC0gcmlnaHRbOF0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzldIC0gcmlnaHRbOV0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzEwXSAtIHJpZ2h0WzEwXSkgPD0gZXBzaWxvbiAmJlxyXG5cdFx0XHRcdE1hdGguYWJzKGxlZnRbMTFdIC0gcmlnaHRbMTFdKSA8PSBlcHNpbG9uICYmXHJcblx0XHRcdFx0TWF0aC5hYnMobGVmdFsxMl0gLSByaWdodFsxMl0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzEzXSAtIHJpZ2h0WzEzXSkgPD0gZXBzaWxvbiAmJlxyXG5cdFx0XHRcdE1hdGguYWJzKGxlZnRbMTRdIC0gcmlnaHRbMTRdKSA8PSBlcHNpbG9uICYmXHJcblx0XHRcdFx0TWF0aC5hYnMobGVmdFsxNV0gLSByaWdodFsxNV0pIDw9IGVwc2lsb24pXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldFRyYW5zbGF0aW9uKG1hdHJpeDogTWF0cml4NCwgcmVzdWx0OiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcblx0XHRyZXN1bHQueCA9IG1hdHJpeFsxMl07XHJcblx0XHRyZXN1bHQueSA9IG1hdHJpeFsxM107XHJcblx0XHRyZXN1bHQueiA9IG1hdHJpeFsxNF07XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldE1hdHJpeDMobWF0cml4OiBNYXRyaXg0LCByZXN1bHQ6IE1hdHJpeDMpOiBNYXRyaXgzIHtcclxuXHRcdHJlc3VsdFswXSA9IG1hdHJpeFswXTtcclxuXHRcdHJlc3VsdFsxXSA9IG1hdHJpeFsxXTtcclxuXHRcdHJlc3VsdFsyXSA9IG1hdHJpeFsyXTtcclxuXHRcdHJlc3VsdFszXSA9IG1hdHJpeFs0XTtcclxuXHRcdHJlc3VsdFs0XSA9IG1hdHJpeFs1XTtcclxuXHRcdHJlc3VsdFs1XSA9IG1hdHJpeFs2XTtcclxuXHRcdHJlc3VsdFs2XSA9IG1hdHJpeFs4XTtcclxuXHRcdHJlc3VsdFs3XSA9IG1hdHJpeFs5XTtcclxuXHRcdHJlc3VsdFs4XSA9IG1hdHJpeFsxMF07XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGludmVyc2UobWF0cml4OiBNYXRyaXg0LCByZXN1bHQ6IE1hdHJpeDQpIHtcclxuXHRcdC8vXHJcblx0XHQvLyBQb3J0ZWQgZnJvbTpcclxuXHRcdC8vICAgZnRwOi8vZG93bmxvYWQuaW50ZWwuY29tL2Rlc2lnbi9QZW50aXVtSUlJL3NtbC8yNDUwNDMwMS5wZGZcclxuXHRcdC8vXHJcblx0XHRjb25zdCBzcmMwID0gbWF0cml4WzBdO1xyXG5cdFx0Y29uc3Qgc3JjMSA9IG1hdHJpeFs0XTtcclxuXHRcdGNvbnN0IHNyYzIgPSBtYXRyaXhbOF07XHJcblx0XHRjb25zdCBzcmMzID0gbWF0cml4WzEyXTtcclxuXHRcdGNvbnN0IHNyYzQgPSBtYXRyaXhbMV07XHJcblx0XHRjb25zdCBzcmM1ID0gbWF0cml4WzVdO1xyXG5cdFx0Y29uc3Qgc3JjNiA9IG1hdHJpeFs5XTtcclxuXHRcdGNvbnN0IHNyYzcgPSBtYXRyaXhbMTNdO1xyXG5cdFx0Y29uc3Qgc3JjOCA9IG1hdHJpeFsyXTtcclxuXHRcdGNvbnN0IHNyYzkgPSBtYXRyaXhbNl07XHJcblx0XHRjb25zdCBzcmMxMCA9IG1hdHJpeFsxMF07XHJcblx0XHRjb25zdCBzcmMxMSA9IG1hdHJpeFsxNF07XHJcblx0XHRjb25zdCBzcmMxMiA9IG1hdHJpeFszXTtcclxuXHRcdGNvbnN0IHNyYzEzID0gbWF0cml4WzddO1xyXG5cdFx0Y29uc3Qgc3JjMTQgPSBtYXRyaXhbMTFdO1xyXG5cdFx0Y29uc3Qgc3JjMTUgPSBtYXRyaXhbMTVdO1xyXG5cclxuXHRcdC8vIGNhbGN1bGF0ZSBwYWlycyBmb3IgZmlyc3QgOCBlbGVtZW50cyAoY29mYWN0b3JzKVxyXG5cdFx0bGV0IHRtcDAgPSBzcmMxMCAqIHNyYzE1O1xyXG5cdFx0bGV0IHRtcDEgPSBzcmMxMSAqIHNyYzE0O1xyXG5cdFx0bGV0IHRtcDIgPSBzcmM5ICogc3JjMTU7XHJcblx0XHRsZXQgdG1wMyA9IHNyYzExICogc3JjMTM7XHJcblx0XHRsZXQgdG1wNCA9IHNyYzkgKiBzcmMxNDtcclxuXHRcdGxldCB0bXA1ID0gc3JjMTAgKiBzcmMxMztcclxuXHRcdGxldCB0bXA2ID0gc3JjOCAqIHNyYzE1O1xyXG5cdFx0bGV0IHRtcDcgPSBzcmMxMSAqIHNyYzEyO1xyXG5cdFx0bGV0IHRtcDggPSBzcmM4ICogc3JjMTQ7XHJcblx0XHRsZXQgdG1wOSA9IHNyYzEwICogc3JjMTI7XHJcblx0XHRsZXQgdG1wMTAgPSBzcmM4ICogc3JjMTM7XHJcblx0XHRsZXQgdG1wMTEgPSBzcmM5ICogc3JjMTI7XHJcblxyXG5cdFx0Ly8gY2FsY3VsYXRlIGZpcnN0IDggZWxlbWVudHMgKGNvZmFjdG9ycylcclxuXHRcdGNvbnN0IGRzdDAgPSB0bXAwICogc3JjNSArIHRtcDMgKiBzcmM2ICsgdG1wNCAqIHNyYzcgLSAodG1wMSAqIHNyYzUgKyB0bXAyICogc3JjNiArIHRtcDUgKiBzcmM3KTtcclxuXHRcdGNvbnN0IGRzdDEgPSB0bXAxICogc3JjNCArIHRtcDYgKiBzcmM2ICsgdG1wOSAqIHNyYzcgLSAodG1wMCAqIHNyYzQgKyB0bXA3ICogc3JjNiArIHRtcDggKiBzcmM3KTtcclxuXHRcdGNvbnN0IGRzdDIgPSB0bXAyICogc3JjNCArIHRtcDcgKiBzcmM1ICsgdG1wMTAgKiBzcmM3IC0gKHRtcDMgKiBzcmM0ICsgdG1wNiAqIHNyYzUgKyB0bXAxMSAqIHNyYzcpO1xyXG5cdFx0Y29uc3QgZHN0MyA9IHRtcDUgKiBzcmM0ICsgdG1wOCAqIHNyYzUgKyB0bXAxMSAqIHNyYzYgLSAodG1wNCAqIHNyYzQgKyB0bXA5ICogc3JjNSArIHRtcDEwICogc3JjNik7XHJcblx0XHRjb25zdCBkc3Q0ID0gdG1wMSAqIHNyYzEgKyB0bXAyICogc3JjMiArIHRtcDUgKiBzcmMzIC0gKHRtcDAgKiBzcmMxICsgdG1wMyAqIHNyYzIgKyB0bXA0ICogc3JjMyk7XHJcblx0XHRjb25zdCBkc3Q1ID0gdG1wMCAqIHNyYzAgKyB0bXA3ICogc3JjMiArIHRtcDggKiBzcmMzIC0gKHRtcDEgKiBzcmMwICsgdG1wNiAqIHNyYzIgKyB0bXA5ICogc3JjMyk7XHJcblx0XHRjb25zdCBkc3Q2ID0gdG1wMyAqIHNyYzAgKyB0bXA2ICogc3JjMSArIHRtcDExICogc3JjMyAtICh0bXAyICogc3JjMCArIHRtcDcgKiBzcmMxICsgdG1wMTAgKiBzcmMzKTtcclxuXHRcdGNvbnN0IGRzdDcgPSB0bXA0ICogc3JjMCArIHRtcDkgKiBzcmMxICsgdG1wMTAgKiBzcmMyIC0gKHRtcDUgKiBzcmMwICsgdG1wOCAqIHNyYzEgKyB0bXAxMSAqIHNyYzIpO1xyXG5cclxuXHRcdC8vIGNhbGN1bGF0ZSBwYWlycyBmb3Igc2Vjb25kIDggZWxlbWVudHMgKGNvZmFjdG9ycylcclxuXHRcdHRtcDAgPSBzcmMyICogc3JjNztcclxuXHRcdHRtcDEgPSBzcmMzICogc3JjNjtcclxuXHRcdHRtcDIgPSBzcmMxICogc3JjNztcclxuXHRcdHRtcDMgPSBzcmMzICogc3JjNTtcclxuXHRcdHRtcDQgPSBzcmMxICogc3JjNjtcclxuXHRcdHRtcDUgPSBzcmMyICogc3JjNTtcclxuXHRcdHRtcDYgPSBzcmMwICogc3JjNztcclxuXHRcdHRtcDcgPSBzcmMzICogc3JjNDtcclxuXHRcdHRtcDggPSBzcmMwICogc3JjNjtcclxuXHRcdHRtcDkgPSBzcmMyICogc3JjNDtcclxuXHRcdHRtcDEwID0gc3JjMCAqIHNyYzU7XHJcblx0XHR0bXAxMSA9IHNyYzEgKiBzcmM0O1xyXG5cclxuXHRcdC8vIGNhbGN1bGF0ZSBzZWNvbmQgOCBlbGVtZW50cyAoY29mYWN0b3JzKVxyXG5cdFx0Y29uc3QgZHN0OCA9IHRtcDAgKiBzcmMxMyArIHRtcDMgKiBzcmMxNCArIHRtcDQgKiBzcmMxNSAtICh0bXAxICogc3JjMTMgKyB0bXAyICogc3JjMTQgKyB0bXA1ICogc3JjMTUpO1xyXG5cdFx0Y29uc3QgZHN0OSA9IHRtcDEgKiBzcmMxMiArIHRtcDYgKiBzcmMxNCArIHRtcDkgKiBzcmMxNSAtICh0bXAwICogc3JjMTIgKyB0bXA3ICogc3JjMTQgKyB0bXA4ICogc3JjMTUpO1xyXG5cdFx0Y29uc3QgZHN0MTAgPSB0bXAyICogc3JjMTIgKyB0bXA3ICogc3JjMTMgKyB0bXAxMCAqIHNyYzE1IC0gKHRtcDMgKiBzcmMxMiArIHRtcDYgKiBzcmMxMyArIHRtcDExICogc3JjMTUpO1xyXG5cdFx0Y29uc3QgZHN0MTEgPSB0bXA1ICogc3JjMTIgKyB0bXA4ICogc3JjMTMgKyB0bXAxMSAqIHNyYzE0IC0gKHRtcDQgKiBzcmMxMiArIHRtcDkgKiBzcmMxMyArIHRtcDEwICogc3JjMTQpO1xyXG5cdFx0Y29uc3QgZHN0MTIgPSB0bXAyICogc3JjMTAgKyB0bXA1ICogc3JjMTEgKyB0bXAxICogc3JjOSAtICh0bXA0ICogc3JjMTEgKyB0bXAwICogc3JjOSArIHRtcDMgKiBzcmMxMCk7XHJcblx0XHRjb25zdCBkc3QxMyA9IHRtcDggKiBzcmMxMSArIHRtcDAgKiBzcmM4ICsgdG1wNyAqIHNyYzEwIC0gKHRtcDYgKiBzcmMxMCArIHRtcDkgKiBzcmMxMSArIHRtcDEgKiBzcmM4KTtcclxuXHRcdGNvbnN0IGRzdDE0ID0gdG1wNiAqIHNyYzkgKyB0bXAxMSAqIHNyYzExICsgdG1wMyAqIHNyYzggLSAodG1wMTAgKiBzcmMxMSArIHRtcDIgKiBzcmM4ICsgdG1wNyAqIHNyYzkpO1xyXG5cdFx0Y29uc3QgZHN0MTUgPSB0bXAxMCAqIHNyYzEwICsgdG1wNCAqIHNyYzggKyB0bXA5ICogc3JjOSAtICh0bXA4ICogc3JjOSArIHRtcDExICogc3JjMTAgKyB0bXA1ICogc3JjOCk7XHJcblxyXG5cdFx0Ly8gY2FsY3VsYXRlIGRldGVybWluYW50XHJcblx0XHRsZXQgZGV0ID0gc3JjMCAqIGRzdDAgKyBzcmMxICogZHN0MSArIHNyYzIgKiBkc3QyICsgc3JjMyAqIGRzdDM7XHJcblxyXG5cdFx0aWYgKE1hdGguYWJzKGRldCkgPCBHTWF0aC5FUFNJTE9OMjEpIHtcclxuXHRcdFx0Ly8gU3BlY2lhbCBjYXNlIGZvciBhIHplcm8gc2NhbGUgbWF0cml4IHRoYXQgY2FuIG9jY3VyLCBmb3IgZXhhbXBsZSxcclxuXHRcdFx0Ly8gd2hlbiBhIG1vZGVsJ3Mgbm9kZSBoYXMgYSBbMCwgMCwgMF0gc2NhbGUuXHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRNYXRyaXgzLmVxdWFsc0Vwc2lsb24oXHJcblx0XHRcdFx0XHRNYXRyaXg0LmdldE1hdHJpeDMobWF0cml4LCBzY3JhdGNoSW52ZXJzZVJvdGF0aW9uKSxcclxuXHRcdFx0XHRcdHNjcmF0Y2hNYXRyaXgzWmVybyxcclxuXHRcdFx0XHRcdEdNYXRoLkVQU0lMT043XHJcblx0XHRcdFx0KSAmJlxyXG5cdFx0XHRcdFZlY3RvcjQuZXF1YWxzKE1hdHJpeDQuZ2V0Um93KG1hdHJpeCwgMywgc2NyYXRjaEJvdHRvbVJvdyksIHNjcmF0Y2hFeHBlY3RlZEJvdHRvbVJvdylcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0cmVzdWx0WzBdID0gMC4wO1xyXG5cdFx0XHRcdHJlc3VsdFsxXSA9IDAuMDtcclxuXHRcdFx0XHRyZXN1bHRbMl0gPSAwLjA7XHJcblx0XHRcdFx0cmVzdWx0WzNdID0gMC4wO1xyXG5cdFx0XHRcdHJlc3VsdFs0XSA9IDAuMDtcclxuXHRcdFx0XHRyZXN1bHRbNV0gPSAwLjA7XHJcblx0XHRcdFx0cmVzdWx0WzZdID0gMC4wO1xyXG5cdFx0XHRcdHJlc3VsdFs3XSA9IDAuMDtcclxuXHRcdFx0XHRyZXN1bHRbOF0gPSAwLjA7XHJcblx0XHRcdFx0cmVzdWx0WzldID0gMC4wO1xyXG5cdFx0XHRcdHJlc3VsdFsxMF0gPSAwLjA7XHJcblx0XHRcdFx0cmVzdWx0WzExXSA9IDAuMDtcclxuXHRcdFx0XHRyZXN1bHRbMTJdID0gLW1hdHJpeFsxMl07XHJcblx0XHRcdFx0cmVzdWx0WzEzXSA9IC1tYXRyaXhbMTNdO1xyXG5cdFx0XHRcdHJlc3VsdFsxNF0gPSAtbWF0cml4WzE0XTtcclxuXHRcdFx0XHRyZXN1bHRbMTVdID0gMS4wO1xyXG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIm1hdHJpeCBpcyBub3QgaW52ZXJ0aWJsZSBiZWNhdXNlIGl0cyBkZXRlcm1pbmF0ZSBpcyB6ZXJvLlwiKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBjYWxjdWxhdGUgbWF0cml4IGludmVyc2VcclxuXHRcdGRldCA9IDEuMCAvIGRldDtcclxuXHJcblx0XHRyZXN1bHRbMF0gPSBkc3QwICogZGV0O1xyXG5cdFx0cmVzdWx0WzFdID0gZHN0MSAqIGRldDtcclxuXHRcdHJlc3VsdFsyXSA9IGRzdDIgKiBkZXQ7XHJcblx0XHRyZXN1bHRbM10gPSBkc3QzICogZGV0O1xyXG5cdFx0cmVzdWx0WzRdID0gZHN0NCAqIGRldDtcclxuXHRcdHJlc3VsdFs1XSA9IGRzdDUgKiBkZXQ7XHJcblx0XHRyZXN1bHRbNl0gPSBkc3Q2ICogZGV0O1xyXG5cdFx0cmVzdWx0WzddID0gZHN0NyAqIGRldDtcclxuXHRcdHJlc3VsdFs4XSA9IGRzdDggKiBkZXQ7XHJcblx0XHRyZXN1bHRbOV0gPSBkc3Q5ICogZGV0O1xyXG5cdFx0cmVzdWx0WzEwXSA9IGRzdDEwICogZGV0O1xyXG5cdFx0cmVzdWx0WzExXSA9IGRzdDExICogZGV0O1xyXG5cdFx0cmVzdWx0WzEyXSA9IGRzdDEyICogZGV0O1xyXG5cdFx0cmVzdWx0WzEzXSA9IGRzdDEzICogZGV0O1xyXG5cdFx0cmVzdWx0WzE0XSA9IGRzdDE0ICogZGV0O1xyXG5cdFx0cmVzdWx0WzE1XSA9IGRzdDE1ICogZGV0O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBpbnZlcnNlVHJhbnNmb3JtYXRpb24obWF0cml4OiBNYXRyaXg0LCByZXN1bHQ6IE1hdHJpeDQpOiBNYXRyaXg0IHtcclxuXHRcdC8vIFRoaXMgZnVuY3Rpb24gaXMgYW4gb3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIGJlbG93IDQgbGluZXMuXHJcblx0XHQvLyBjb25zdCByVCA9IE1hdHJpeDMudHJhbnNwb3NlKE1hdHJpeDQuZ2V0TWF0cml4MyhtYXRyaXgpKTtcclxuXHRcdC8vIGNvbnN0IHJUTiA9IE1hdHJpeDMubmVnYXRlKHJUKTtcclxuXHRcdC8vIGNvbnN0IHJUVCA9IE1hdHJpeDMubXVsdGlwbHlCeVZlY3RvcihyVE4sIE1hdHJpeDQuZ2V0VHJhbnNsYXRpb24obWF0cml4KSk7XHJcblx0XHQvLyByZXR1cm4gTWF0cml4NC5mcm9tUm90YXRpb25UcmFuc2xhdGlvbihyVCwgclRULCByZXN1bHQpO1xyXG5cclxuXHRcdGNvbnN0IG1hdHJpeDAgPSBtYXRyaXhbMF07XHJcblx0XHRjb25zdCBtYXRyaXgxID0gbWF0cml4WzFdO1xyXG5cdFx0Y29uc3QgbWF0cml4MiA9IG1hdHJpeFsyXTtcclxuXHRcdGNvbnN0IG1hdHJpeDQgPSBtYXRyaXhbNF07XHJcblx0XHRjb25zdCBtYXRyaXg1ID0gbWF0cml4WzVdO1xyXG5cdFx0Y29uc3QgbWF0cml4NiA9IG1hdHJpeFs2XTtcclxuXHRcdGNvbnN0IG1hdHJpeDggPSBtYXRyaXhbOF07XHJcblx0XHRjb25zdCBtYXRyaXg5ID0gbWF0cml4WzldO1xyXG5cdFx0Y29uc3QgbWF0cml4MTAgPSBtYXRyaXhbMTBdO1xyXG5cclxuXHRcdGNvbnN0IHZYID0gbWF0cml4WzEyXTtcclxuXHRcdGNvbnN0IHZZID0gbWF0cml4WzEzXTtcclxuXHRcdGNvbnN0IHZaID0gbWF0cml4WzE0XTtcclxuXHJcblx0XHRjb25zdCB4ID0gLW1hdHJpeDAgKiB2WCAtIG1hdHJpeDEgKiB2WSAtIG1hdHJpeDIgKiB2WjtcclxuXHRcdGNvbnN0IHkgPSAtbWF0cml4NCAqIHZYIC0gbWF0cml4NSAqIHZZIC0gbWF0cml4NiAqIHZaO1xyXG5cdFx0Y29uc3QgeiA9IC1tYXRyaXg4ICogdlggLSBtYXRyaXg5ICogdlkgLSBtYXRyaXgxMCAqIHZaO1xyXG5cclxuXHRcdHJlc3VsdFswXSA9IG1hdHJpeDA7XHJcblx0XHRyZXN1bHRbMV0gPSBtYXRyaXg0O1xyXG5cdFx0cmVzdWx0WzJdID0gbWF0cml4ODtcclxuXHRcdHJlc3VsdFszXSA9IDAuMDtcclxuXHRcdHJlc3VsdFs0XSA9IG1hdHJpeDE7XHJcblx0XHRyZXN1bHRbNV0gPSBtYXRyaXg1O1xyXG5cdFx0cmVzdWx0WzZdID0gbWF0cml4OTtcclxuXHRcdHJlc3VsdFs3XSA9IDAuMDtcclxuXHRcdHJlc3VsdFs4XSA9IG1hdHJpeDI7XHJcblx0XHRyZXN1bHRbOV0gPSBtYXRyaXg2O1xyXG5cdFx0cmVzdWx0WzEwXSA9IG1hdHJpeDEwO1xyXG5cdFx0cmVzdWx0WzExXSA9IDAuMDtcclxuXHRcdHJlc3VsdFsxMl0gPSB4O1xyXG5cdFx0cmVzdWx0WzEzXSA9IHk7XHJcblx0XHRyZXN1bHRbMTRdID0gejtcclxuXHRcdHJlc3VsdFsxNV0gPSAxLjA7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGludmVyc2VUcmFuc3Bvc2UobWF0cml4OiBNYXRyaXg0LCByZXN1bHQ6IE1hdHJpeDQpOiBNYXRyaXg0IHtcclxuXHRcdHJldHVybiBNYXRyaXg0LmludmVyc2UoTWF0cml4NC50cmFuc3Bvc2UobWF0cml4LCBzY3JhdGNoVHJhbnNwb3NlTWF0cml4KSwgcmVzdWx0KTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKi9cclxuXHRzdGF0aWMgZXF1YWxzQXJyYXkobWF0cml4OiBNYXRyaXg0LCBhcnJheTogQXJyYXk8bnVtYmVyPiwgb2Zmc2V0OiBudW1iZXIpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdG1hdHJpeFswXSA9PT0gYXJyYXlbb2Zmc2V0XSAmJlxyXG5cdFx0XHRtYXRyaXhbMV0gPT09IGFycmF5W29mZnNldCArIDFdICYmXHJcblx0XHRcdG1hdHJpeFsyXSA9PT0gYXJyYXlbb2Zmc2V0ICsgMl0gJiZcclxuXHRcdFx0bWF0cml4WzNdID09PSBhcnJheVtvZmZzZXQgKyAzXSAmJlxyXG5cdFx0XHRtYXRyaXhbNF0gPT09IGFycmF5W29mZnNldCArIDRdICYmXHJcblx0XHRcdG1hdHJpeFs1XSA9PT0gYXJyYXlbb2Zmc2V0ICsgNV0gJiZcclxuXHRcdFx0bWF0cml4WzZdID09PSBhcnJheVtvZmZzZXQgKyA2XSAmJlxyXG5cdFx0XHRtYXRyaXhbN10gPT09IGFycmF5W29mZnNldCArIDddICYmXHJcblx0XHRcdG1hdHJpeFs4XSA9PT0gYXJyYXlbb2Zmc2V0ICsgOF0gJiZcclxuXHRcdFx0bWF0cml4WzldID09PSBhcnJheVtvZmZzZXQgKyA5XSAmJlxyXG5cdFx0XHRtYXRyaXhbMTBdID09PSBhcnJheVtvZmZzZXQgKyAxMF0gJiZcclxuXHRcdFx0bWF0cml4WzExXSA9PT0gYXJyYXlbb2Zmc2V0ICsgMTFdICYmXHJcblx0XHRcdG1hdHJpeFsxMl0gPT09IGFycmF5W29mZnNldCArIDEyXSAmJlxyXG5cdFx0XHRtYXRyaXhbMTNdID09PSBhcnJheVtvZmZzZXQgKyAxM10gJiZcclxuXHRcdFx0bWF0cml4WzE0XSA9PT0gYXJyYXlbb2Zmc2V0ICsgMTRdICYmXHJcblx0XHRcdG1hdHJpeFsxNV0gPT09IGFycmF5W29mZnNldCArIDE1XVxyXG5cdFx0KTtcclxuXHR9XHJcbn1cclxuXHJcbmNvbnN0IHNjcmF0Y2hUcmFuc3Bvc2VNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuY29uc3QgZnJvbUNhbWVyYUYgPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBmcm9tQ2FtZXJhUiA9IG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IGZyb21DYW1lcmFVID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmNvbnN0IHNjYWxlU2NyYXRjaDEgPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBzY2FsZVNjcmF0Y2gyID0gbmV3IFZlY3RvcjMoKTtcclxuY29uc3Qgc2NyYXRjaENvbHVtbiA9IG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IHNjYWxlU2NyYXRjaDMgPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBzY2FsZVNjcmF0Y2g0ID0gbmV3IFZlY3RvcjMoKTtcclxuY29uc3Qgc2NhbGVTY3JhdGNoNSA9IG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IHNjcmF0Y2hJbnZlcnNlUm90YXRpb24gPSBuZXcgTWF0cml4MygpO1xyXG5jb25zdCBzY3JhdGNoTWF0cml4M1plcm8gPSBuZXcgTWF0cml4MygpO1xyXG5jb25zdCBzY3JhdGNoQm90dG9tUm93ID0gbmV3IFZlY3RvcjQoKTtcclxuY29uc3Qgc2NyYXRjaEV4cGVjdGVkQm90dG9tUm93ID0gbmV3IFZlY3RvcjQoMC4wLCAwLjAsIDAuMCwgMS4wKTtcclxuY29uc3QgeCA9IG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IHkgPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCB6ID0gbmV3IFZlY3RvcjMoKTtcclxuZXhwb3J0IGRlZmF1bHQgTWF0cml4NDtcclxuIiwiaW1wb3J0IENhbWVyYSBmcm9tIFwiLi4vY2FtZXJhL0NhbWVyYVwiO1xyXG5pbXBvcnQgTWF0cml4NCBmcm9tIFwiLi4vbWF0aC9NYXRyaXg0XCI7XHJcbmltcG9ydCBQbGFuZSBmcm9tIFwiLi4vbWF0aC9QbGFuZVwiO1xyXG5pbXBvcnQgVmVjdG9yMyBmcm9tIFwiLi4vbWF0aC9WZWN0b3IzXCI7XHJcbmltcG9ydCBkZWZhdWx0VmFsdWUgZnJvbSBcIi4uL3V0aWxzL2RlZmF1bHRWYWx1ZVwiO1xyXG5pbXBvcnQgZGVmaW5lZCBmcm9tIFwiLi4vdXRpbHMvZGVmaW5lZFwiO1xyXG5pbXBvcnQgeyBJbnRlcnNlY3QgfSBmcm9tIFwiLi9XZWJHUFVDb25zdGFudFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQm91bmRpbmdTcGhlcmUge1xyXG5cdHJhZGl1czogbnVtYmVyO1xyXG5cdGNlbnRlcjogVmVjdG9yMztcclxuXHRvcmlnaW5SYWRpdXM6IG51bWJlcjtcclxuXHRvcmlnaW5DZW50ZXI6IFZlY3RvcjM7XHJcblx0Y29uc3RydWN0b3IoY2VudGVyOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCksIHJhZGl1cyA9IDApIHtcclxuXHRcdHRoaXMuY2VudGVyID0gY2VudGVyO1xyXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XHJcblx0XHR0aGlzLm9yaWdpbkNlbnRlciA9IHRoaXMuY2VudGVyLmNsb25lKCk7XHJcblx0XHR0aGlzLm9yaWdpblJhZGl1cyA9IHJhZGl1cztcclxuXHR9XHJcblx0LyoqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzW119IFtwb3NpdGlvbnNdIEFuIGFycmF5IG9mIHBvaW50cyB0aGF0IHRoZSBib3VuZGluZyBzcGhlcmUgd2lsbCBlbmNsb3NlLiAgRWFjaCBwb2ludCBtdXN0IGhhdmUgPGNvZGU+eDwvY29kZT4sIDxjb2RlPnk8L2NvZGU+LCBhbmQgPGNvZGU+ejwvY29kZT4gcHJvcGVydGllcy5cclxuXHQgKiBAcmV0dXJucyB7Qm91bmRpbmdTcGhlcmV9IFRoZSBtb2RpZmllZCByZXN1bHQgcGFyYW1ldGVyIG9yIGEgbmV3IEJvdW5kaW5nU3BoZXJlIGluc3RhbmNlIGlmIG9uZSB3YXMgbm90IHByb3ZpZGVkLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tUG9pbnRzKHBvc2l0aW9uczogVmVjdG9yM1tdKSB7XHJcblx0XHRjb25zdCByZXN1bHQgPSBuZXcgQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0XHRpZiAoIWRlZmluZWQocG9zaXRpb25zKSB8fCBwb3NpdGlvbnMubGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdHJlc3VsdC5jZW50ZXIgPSBWZWN0b3IzLmNsb25lKFZlY3RvcjMuWkVSTywgcmVzdWx0LmNlbnRlcik7XHJcblx0XHRcdHJlc3VsdC5yYWRpdXMgPSAwLjA7XHJcblx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudFBvcyA9IFZlY3RvcjMuY2xvbmUocG9zaXRpb25zWzBdLCBmcm9tUG9pbnRzQ3VycmVudFBvcyk7XHJcblxyXG5cdFx0Y29uc3QgeE1pbiA9IFZlY3RvcjMuY2xvbmUoY3VycmVudFBvcywgZnJvbVBvaW50c1hNaW4pO1xyXG5cdFx0Y29uc3QgeU1pbiA9IFZlY3RvcjMuY2xvbmUoY3VycmVudFBvcywgZnJvbVBvaW50c1lNaW4pO1xyXG5cdFx0Y29uc3Qgek1pbiA9IFZlY3RvcjMuY2xvbmUoY3VycmVudFBvcywgZnJvbVBvaW50c1pNaW4pO1xyXG5cclxuXHRcdGNvbnN0IHhNYXggPSBWZWN0b3IzLmNsb25lKGN1cnJlbnRQb3MsIGZyb21Qb2ludHNYTWF4KTtcclxuXHRcdGNvbnN0IHlNYXggPSBWZWN0b3IzLmNsb25lKGN1cnJlbnRQb3MsIGZyb21Qb2ludHNZTWF4KTtcclxuXHRcdGNvbnN0IHpNYXggPSBWZWN0b3IzLmNsb25lKGN1cnJlbnRQb3MsIGZyb21Qb2ludHNaTWF4KTtcclxuXHJcblx0XHRjb25zdCBudW1Qb3NpdGlvbnMgPSBwb3NpdGlvbnMubGVuZ3RoO1xyXG5cdFx0bGV0IGk7XHJcblx0XHRmb3IgKGkgPSAxOyBpIDwgbnVtUG9zaXRpb25zOyBpKyspIHtcclxuXHRcdFx0VmVjdG9yMy5jbG9uZShwb3NpdGlvbnNbaV0sIGN1cnJlbnRQb3MpO1xyXG5cclxuXHRcdFx0Y29uc3QgeCA9IGN1cnJlbnRQb3MueDtcclxuXHRcdFx0Y29uc3QgeSA9IGN1cnJlbnRQb3MueTtcclxuXHRcdFx0Y29uc3QgeiA9IGN1cnJlbnRQb3MuejtcclxuXHJcblx0XHRcdC8vIFN0b3JlIHBvaW50cyBjb250YWluaW5nIHRoZSB0aGUgc21hbGxlc3QgYW5kIGxhcmdlc3QgY29tcG9uZW50c1xyXG5cdFx0XHRpZiAoeCA8IHhNaW4ueCkge1xyXG5cdFx0XHRcdFZlY3RvcjMuY2xvbmUoY3VycmVudFBvcywgeE1pbik7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICh4ID4geE1heC54KSB7XHJcblx0XHRcdFx0VmVjdG9yMy5jbG9uZShjdXJyZW50UG9zLCB4TWF4KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHkgPCB5TWluLnkpIHtcclxuXHRcdFx0XHRWZWN0b3IzLmNsb25lKGN1cnJlbnRQb3MsIHlNaW4pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoeSA+IHlNYXgueSkge1xyXG5cdFx0XHRcdFZlY3RvcjMuY2xvbmUoY3VycmVudFBvcywgeU1heCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICh6IDwgek1pbi56KSB7XHJcblx0XHRcdFx0VmVjdG9yMy5jbG9uZShjdXJyZW50UG9zLCB6TWluKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHogPiB6TWF4LnopIHtcclxuXHRcdFx0XHRWZWN0b3IzLmNsb25lKGN1cnJlbnRQb3MsIHpNYXgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ29tcHV0ZSB4LSwgeS0sIGFuZCB6LXNwYW5zIChTcXVhcmVkIGRpc3RhbmNlcyBiL24gZWFjaCBjb21wb25lbnQncyBtaW4uIGFuZCBtYXguKS5cclxuXHRcdGNvbnN0IHhTcGFuID0gVmVjdG9yMy5tYWduaXR1ZGVTcXVhcmVkKFZlY3RvcjMuc3VidHJhY3QoeE1heCwgeE1pbiwgZnJvbVBvaW50c1NjcmF0Y2gpKTtcclxuXHRcdGNvbnN0IHlTcGFuID0gVmVjdG9yMy5tYWduaXR1ZGVTcXVhcmVkKFZlY3RvcjMuc3VidHJhY3QoeU1heCwgeU1pbiwgZnJvbVBvaW50c1NjcmF0Y2gpKTtcclxuXHRcdGNvbnN0IHpTcGFuID0gVmVjdG9yMy5tYWduaXR1ZGVTcXVhcmVkKFZlY3RvcjMuc3VidHJhY3Qoek1heCwgek1pbiwgZnJvbVBvaW50c1NjcmF0Y2gpKTtcclxuXHJcblx0XHQvLyBTZXQgdGhlIGRpYW1ldGVyIGVuZHBvaW50cyB0byB0aGUgbGFyZ2VzdCBzcGFuLlxyXG5cdFx0bGV0IGRpYW1ldGVyMSA9IHhNaW47XHJcblx0XHRsZXQgZGlhbWV0ZXIyID0geE1heDtcclxuXHRcdGxldCBtYXhTcGFuID0geFNwYW47XHJcblx0XHRpZiAoeVNwYW4gPiBtYXhTcGFuKSB7XHJcblx0XHRcdG1heFNwYW4gPSB5U3BhbjtcclxuXHRcdFx0ZGlhbWV0ZXIxID0geU1pbjtcclxuXHRcdFx0ZGlhbWV0ZXIyID0geU1heDtcclxuXHRcdH1cclxuXHRcdGlmICh6U3BhbiA+IG1heFNwYW4pIHtcclxuXHRcdFx0bWF4U3BhbiA9IHpTcGFuO1xyXG5cdFx0XHRkaWFtZXRlcjEgPSB6TWluO1xyXG5cdFx0XHRkaWFtZXRlcjIgPSB6TWF4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENhbGN1bGF0ZSB0aGUgY2VudGVyIG9mIHRoZSBpbml0aWFsIHNwaGVyZSBmb3VuZCBieSBSaXR0ZXIncyBhbGdvcml0aG1cclxuXHRcdGNvbnN0IHJpdHRlckNlbnRlciA9IGZyb21Qb2ludHNSaXR0ZXJDZW50ZXI7XHJcblx0XHRyaXR0ZXJDZW50ZXIueCA9IChkaWFtZXRlcjEueCArIGRpYW1ldGVyMi54KSAqIDAuNTtcclxuXHRcdHJpdHRlckNlbnRlci55ID0gKGRpYW1ldGVyMS55ICsgZGlhbWV0ZXIyLnkpICogMC41O1xyXG5cdFx0cml0dGVyQ2VudGVyLnogPSAoZGlhbWV0ZXIxLnogKyBkaWFtZXRlcjIueikgKiAwLjU7XHJcblxyXG5cdFx0Ly8gQ2FsY3VsYXRlIHRoZSByYWRpdXMgb2YgdGhlIGluaXRpYWwgc3BoZXJlIGZvdW5kIGJ5IFJpdHRlcidzIGFsZ29yaXRobVxyXG5cdFx0bGV0IHJhZGl1c1NxdWFyZWQgPSBWZWN0b3IzLm1hZ25pdHVkZVNxdWFyZWQoVmVjdG9yMy5zdWJ0cmFjdChkaWFtZXRlcjIsIHJpdHRlckNlbnRlciwgZnJvbVBvaW50c1NjcmF0Y2gpKTtcclxuXHRcdGxldCByaXR0ZXJSYWRpdXMgPSBNYXRoLnNxcnQocmFkaXVzU3F1YXJlZCk7XHJcblxyXG5cdFx0Ly8gRmluZCB0aGUgY2VudGVyIG9mIHRoZSBzcGhlcmUgZm91bmQgdXNpbmcgdGhlIE5haXZlIG1ldGhvZC5cclxuXHRcdGNvbnN0IG1pbkJveFB0ID0gZnJvbVBvaW50c01pbkJveFB0O1xyXG5cdFx0bWluQm94UHQueCA9IHhNaW4ueDtcclxuXHRcdG1pbkJveFB0LnkgPSB5TWluLnk7XHJcblx0XHRtaW5Cb3hQdC56ID0gek1pbi56O1xyXG5cclxuXHRcdGNvbnN0IG1heEJveFB0ID0gZnJvbVBvaW50c01heEJveFB0O1xyXG5cdFx0bWF4Qm94UHQueCA9IHhNYXgueDtcclxuXHRcdG1heEJveFB0LnkgPSB5TWF4Lnk7XHJcblx0XHRtYXhCb3hQdC56ID0gek1heC56O1xyXG5cclxuXHRcdGNvbnN0IG5haXZlQ2VudGVyID0gVmVjdG9yMy5taWRwb2ludChtaW5Cb3hQdCwgbWF4Qm94UHQsIGZyb21Qb2ludHNOYWl2ZUNlbnRlclNjcmF0Y2gpO1xyXG5cclxuXHRcdC8vIEJlZ2luIDJuZCBwYXNzIHRvIGZpbmQgbmFpdmUgcmFkaXVzIGFuZCBtb2RpZnkgdGhlIHJpdHRlciBzcGhlcmUuXHJcblx0XHRsZXQgbmFpdmVSYWRpdXMgPSAwO1xyXG5cdFx0Zm9yIChpID0gMDsgaSA8IG51bVBvc2l0aW9uczsgaSsrKSB7XHJcblx0XHRcdFZlY3RvcjMuY2xvbmUocG9zaXRpb25zW2ldLCBjdXJyZW50UG9zKTtcclxuXHJcblx0XHRcdC8vIEZpbmQgdGhlIGZ1cnRoZXN0IHBvaW50IGZyb20gdGhlIG5haXZlIGNlbnRlciB0byBjYWxjdWxhdGUgdGhlIG5haXZlIHJhZGl1cy5cclxuXHRcdFx0Y29uc3QgciA9IFZlY3RvcjMubWFnbml0dWRlKFZlY3RvcjMuc3VidHJhY3QoY3VycmVudFBvcywgbmFpdmVDZW50ZXIsIGZyb21Qb2ludHNTY3JhdGNoKSk7XHJcblx0XHRcdGlmIChyID4gbmFpdmVSYWRpdXMpIHtcclxuXHRcdFx0XHRuYWl2ZVJhZGl1cyA9IHI7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE1ha2UgYWRqdXN0bWVudHMgdG8gdGhlIFJpdHRlciBTcGhlcmUgdG8gaW5jbHVkZSBhbGwgcG9pbnRzLlxyXG5cdFx0XHRjb25zdCBvbGRDZW50ZXJUb1BvaW50U3F1YXJlZCA9IFZlY3RvcjMubWFnbml0dWRlU3F1YXJlZChcclxuXHRcdFx0XHRWZWN0b3IzLnN1YnRyYWN0KGN1cnJlbnRQb3MsIHJpdHRlckNlbnRlciwgZnJvbVBvaW50c1NjcmF0Y2gpXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmIChvbGRDZW50ZXJUb1BvaW50U3F1YXJlZCA+IHJhZGl1c1NxdWFyZWQpIHtcclxuXHRcdFx0XHRjb25zdCBvbGRDZW50ZXJUb1BvaW50ID0gTWF0aC5zcXJ0KG9sZENlbnRlclRvUG9pbnRTcXVhcmVkKTtcclxuXHRcdFx0XHQvLyBDYWxjdWxhdGUgbmV3IHJhZGl1cyB0byBpbmNsdWRlIHRoZSBwb2ludCB0aGF0IGxpZXMgb3V0c2lkZVxyXG5cdFx0XHRcdHJpdHRlclJhZGl1cyA9IChyaXR0ZXJSYWRpdXMgKyBvbGRDZW50ZXJUb1BvaW50KSAqIDAuNTtcclxuXHRcdFx0XHRyYWRpdXNTcXVhcmVkID0gcml0dGVyUmFkaXVzICogcml0dGVyUmFkaXVzO1xyXG5cdFx0XHRcdC8vIENhbGN1bGF0ZSBjZW50ZXIgb2YgbmV3IFJpdHRlciBzcGhlcmVcclxuXHRcdFx0XHRjb25zdCBvbGRUb05ldyA9IG9sZENlbnRlclRvUG9pbnQgLSByaXR0ZXJSYWRpdXM7XHJcblx0XHRcdFx0cml0dGVyQ2VudGVyLnggPSAocml0dGVyUmFkaXVzICogcml0dGVyQ2VudGVyLnggKyBvbGRUb05ldyAqIGN1cnJlbnRQb3MueCkgLyBvbGRDZW50ZXJUb1BvaW50O1xyXG5cdFx0XHRcdHJpdHRlckNlbnRlci55ID0gKHJpdHRlclJhZGl1cyAqIHJpdHRlckNlbnRlci55ICsgb2xkVG9OZXcgKiBjdXJyZW50UG9zLnkpIC8gb2xkQ2VudGVyVG9Qb2ludDtcclxuXHRcdFx0XHRyaXR0ZXJDZW50ZXIueiA9IChyaXR0ZXJSYWRpdXMgKiByaXR0ZXJDZW50ZXIueiArIG9sZFRvTmV3ICogY3VycmVudFBvcy56KSAvIG9sZENlbnRlclRvUG9pbnQ7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRpZiAocml0dGVyUmFkaXVzIDwgbmFpdmVSYWRpdXMpIHtcclxuXHRcdFx0VmVjdG9yMy5jbG9uZShyaXR0ZXJDZW50ZXIsIHJlc3VsdC5jZW50ZXIpO1xyXG5cdFx0XHRyZXN1bHQucmFkaXVzID0gcml0dGVyUmFkaXVzO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0VmVjdG9yMy5jbG9uZShuYWl2ZUNlbnRlciwgcmVzdWx0LmNlbnRlcik7XHJcblx0XHRcdHJlc3VsdC5yYWRpdXMgPSBuYWl2ZVJhZGl1cztcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyBhIHRpZ2h0LWZpdHRpbmcgYm91bmRpbmcgc3BoZXJlIGVuY2xvc2luZyBhIGxpc3Qgb2YgM0QgcG9pbnRzLCB3aGVyZSB0aGUgcG9pbnRzIGFyZVxyXG5cdCAqIHN0b3JlZCBpbiBhIGZsYXQgYXJyYXkgaW4gWCwgWSwgWiwgb3JkZXIuICBUaGUgYm91bmRpbmcgc3BoZXJlIGlzIGNvbXB1dGVkIGJ5IHJ1bm5pbmcgdHdvXHJcblx0ICogYWxnb3JpdGhtcywgYSBuYWl2ZSBhbGdvcml0aG0gYW5kIFJpdHRlcidzIGFsZ29yaXRobS4gVGhlIHNtYWxsZXIgb2YgdGhlIHR3byBzcGhlcmVzIGlzIHVzZWQgdG9cclxuXHQgKiBlbnN1cmUgYSB0aWdodCBmaXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcltdfSBbcG9zaXRpb25zXSBBbiBhcnJheSBvZiBwb2ludHMgdGhhdCB0aGUgYm91bmRpbmcgc3BoZXJlIHdpbGwgZW5jbG9zZS4gIEVhY2ggcG9pbnRcclxuXHQgKiAgICAgICAgaXMgZm9ybWVkIGZyb20gdGhyZWUgZWxlbWVudHMgaW4gdGhlIGFycmF5IGluIHRoZSBvcmRlciBYLCBZLCBaLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW2NlbnRlcj1WZWN0b3IzLlpFUk9dIFRoZSBwb3NpdGlvbiB0byB3aGljaCB0aGUgcG9zaXRpb25zIGFyZSByZWxhdGl2ZSwgd2hpY2ggbmVlZCBub3QgYmUgdGhlXHJcblx0ICogICAgICAgIG9yaWdpbiBvZiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0uICBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSBwb3NpdGlvbnMgYXJlIHRvIGJlIHVzZWQgZm9yXHJcblx0ICogICAgICAgIHJlbGF0aXZlLXRvLWNlbnRlciAoUlRDKSByZW5kZXJpbmcuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtzdHJpZGU9M10gVGhlIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyBwZXIgdmVydGV4LiAgSXQgbXVzdCBiZSBhdCBsZWFzdCAzLCBidXQgaXQgbWF5XHJcblx0ICogICAgICAgIGJlIGhpZ2hlci4gIFJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyLCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb3NpdGlvblxyXG5cdCAqICAgICAgICBpcyBhdCBhcnJheSBpbmRleCAwLCB0aGUgWSBjb29yZGluYXRlIGlzIGF0IGFycmF5IGluZGV4IDEsIGFuZCB0aGUgWiBjb29yZGluYXRlIGlzIGF0IGFycmF5IGluZGV4XHJcblx0ICogICAgICAgIDIuICBXaGVuIHN0cmlkZSBpcyAzLCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBuZXh0IHBvc2l0aW9uIHRoZW4gYmVnaW5zIGF0IGFycmF5IGluZGV4IDMuICBJZlxyXG5cdCAqICAgICAgICB0aGUgc3RyaWRlIGlzIDUsIGhvd2V2ZXIsIHR3byBhcnJheSBlbGVtZW50cyBhcmUgc2tpcHBlZCBhbmQgdGhlIG5leHQgcG9zaXRpb24gYmVnaW5zIGF0IGFycmF5XHJcblx0ICogICAgICAgIGluZGV4IDUuXHJcblx0ICogQHBhcmFtIHtCb3VuZGluZ1NwaGVyZX0gW3Jlc3VsdF0gVGhlIG9iamVjdCBvbnRvIHdoaWNoIHRvIHN0b3JlIHRoZSByZXN1bHQuXHJcblx0ICogQHJldHVybnMge0JvdW5kaW5nU3BoZXJlfSBUaGUgbW9kaWZpZWQgcmVzdWx0IHBhcmFtZXRlciBvciBhIG5ldyBCb3VuZGluZ1NwaGVyZSBpbnN0YW5jZSBpZiBvbmUgd2FzIG5vdCBwcm92aWRlZC5cclxuXHQgKlxyXG5cdCAqIEBleGFtcGxlXHJcblx0ICogLy8gQ29tcHV0ZSB0aGUgYm91bmRpbmcgc3BoZXJlIGZyb20gMyBwb3NpdGlvbnMsIGVhY2ggc3BlY2lmaWVkIHJlbGF0aXZlIHRvIGEgY2VudGVyLlxyXG5cdCAqIC8vIEluIGFkZGl0aW9uIHRvIHRoZSBYLCBZLCBhbmQgWiBjb29yZGluYXRlcywgdGhlIHBvaW50cyBhcnJheSBjb250YWlucyB0d28gYWRkaXRpb25hbFxyXG5cdCAqIC8vIGVsZW1lbnRzIHBlciBwb2ludCB3aGljaCBhcmUgaWdub3JlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgY29tcHV0aW5nIHRoZSBib3VuZGluZyBzcGhlcmUuXHJcblx0ICogY29uc3QgY2VudGVyID0gbmV3IFZlY3RvcjMoMS4wLCAyLjAsIDMuMCk7XHJcblx0ICogY29uc3QgcG9pbnRzID0gWzEuMCwgMi4wLCAzLjAsIDAuMSwgMC4yLFxyXG5cdCAqICAgICAgICAgICAgICAgNC4wLCA1LjAsIDYuMCwgMC4xLCAwLjIsXHJcblx0ICogICAgICAgICAgICAgICA3LjAsIDguMCwgOS4wLCAwLjEsIDAuMl07XHJcblx0ICogY29uc3Qgc3BoZXJlID0gQm91bmRpbmdTcGhlcmUuZnJvbVZlcnRpY2VzKHBvaW50cywgY2VudGVyLCA1KTtcclxuXHQgKlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tVmVydGljZXMocG9zaXRpb25zOiBudW1iZXJbXSwgY2VudGVyOiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPLCBzdHJpZGUgPSAzKSB7XHJcblx0XHRjb25zdCByZXN1bHQgPSBuZXcgQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0XHRpZiAoIWRlZmluZWQocG9zaXRpb25zKSB8fCBwb3NpdGlvbnMubGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdHJlc3VsdC5jZW50ZXIgPSBWZWN0b3IzLmNsb25lKFZlY3RvcjMuWkVSTywgcmVzdWx0LmNlbnRlcik7XHJcblx0XHRcdHJlc3VsdC5yYWRpdXMgPSAwLjA7XHJcblx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Y2VudGVyID0gZGVmYXVsdFZhbHVlKGNlbnRlciwgVmVjdG9yMy5aRVJPKTtcclxuXHJcblx0XHRzdHJpZGUgPSBkZWZhdWx0VmFsdWUoc3RyaWRlLCAzKTtcclxuXHJcblx0XHRjb25zdCBjdXJyZW50UG9zID0gZnJvbVBvaW50c0N1cnJlbnRQb3M7XHJcblx0XHRjdXJyZW50UG9zLnggPSBwb3NpdGlvbnNbMF0gKyBjZW50ZXIueDtcclxuXHRcdGN1cnJlbnRQb3MueSA9IHBvc2l0aW9uc1sxXSArIGNlbnRlci55O1xyXG5cdFx0Y3VycmVudFBvcy56ID0gcG9zaXRpb25zWzJdICsgY2VudGVyLno7XHJcblxyXG5cdFx0Y29uc3QgeE1pbiA9IFZlY3RvcjMuY2xvbmUoY3VycmVudFBvcywgZnJvbVBvaW50c1hNaW4pO1xyXG5cdFx0Y29uc3QgeU1pbiA9IFZlY3RvcjMuY2xvbmUoY3VycmVudFBvcywgZnJvbVBvaW50c1lNaW4pO1xyXG5cdFx0Y29uc3Qgek1pbiA9IFZlY3RvcjMuY2xvbmUoY3VycmVudFBvcywgZnJvbVBvaW50c1pNaW4pO1xyXG5cclxuXHRcdGNvbnN0IHhNYXggPSBWZWN0b3IzLmNsb25lKGN1cnJlbnRQb3MsIGZyb21Qb2ludHNYTWF4KTtcclxuXHRcdGNvbnN0IHlNYXggPSBWZWN0b3IzLmNsb25lKGN1cnJlbnRQb3MsIGZyb21Qb2ludHNZTWF4KTtcclxuXHRcdGNvbnN0IHpNYXggPSBWZWN0b3IzLmNsb25lKGN1cnJlbnRQb3MsIGZyb21Qb2ludHNaTWF4KTtcclxuXHJcblx0XHRjb25zdCBudW1FbGVtZW50cyA9IHBvc2l0aW9ucy5sZW5ndGg7XHJcblx0XHRsZXQgaTtcclxuXHRcdGZvciAoaSA9IDA7IGkgPCBudW1FbGVtZW50czsgaSArPSBzdHJpZGUpIHtcclxuXHRcdFx0Y29uc3QgeCA9IHBvc2l0aW9uc1tpXSArIGNlbnRlci54O1xyXG5cdFx0XHRjb25zdCB5ID0gcG9zaXRpb25zW2kgKyAxXSArIGNlbnRlci55O1xyXG5cdFx0XHRjb25zdCB6ID0gcG9zaXRpb25zW2kgKyAyXSArIGNlbnRlci56O1xyXG5cclxuXHRcdFx0Y3VycmVudFBvcy54ID0geDtcclxuXHRcdFx0Y3VycmVudFBvcy55ID0geTtcclxuXHRcdFx0Y3VycmVudFBvcy56ID0gejtcclxuXHJcblx0XHRcdC8vIFN0b3JlIHBvaW50cyBjb250YWluaW5nIHRoZSB0aGUgc21hbGxlc3QgYW5kIGxhcmdlc3QgY29tcG9uZW50c1xyXG5cdFx0XHRpZiAoeCA8IHhNaW4ueCkge1xyXG5cdFx0XHRcdFZlY3RvcjMuY2xvbmUoY3VycmVudFBvcywgeE1pbik7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICh4ID4geE1heC54KSB7XHJcblx0XHRcdFx0VmVjdG9yMy5jbG9uZShjdXJyZW50UG9zLCB4TWF4KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHkgPCB5TWluLnkpIHtcclxuXHRcdFx0XHRWZWN0b3IzLmNsb25lKGN1cnJlbnRQb3MsIHlNaW4pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoeSA+IHlNYXgueSkge1xyXG5cdFx0XHRcdFZlY3RvcjMuY2xvbmUoY3VycmVudFBvcywgeU1heCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICh6IDwgek1pbi56KSB7XHJcblx0XHRcdFx0VmVjdG9yMy5jbG9uZShjdXJyZW50UG9zLCB6TWluKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHogPiB6TWF4LnopIHtcclxuXHRcdFx0XHRWZWN0b3IzLmNsb25lKGN1cnJlbnRQb3MsIHpNYXgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ29tcHV0ZSB4LSwgeS0sIGFuZCB6LXNwYW5zIChTcXVhcmVkIGRpc3RhbmNlcyBiL24gZWFjaCBjb21wb25lbnQncyBtaW4uIGFuZCBtYXguKS5cclxuXHRcdGNvbnN0IHhTcGFuID0gVmVjdG9yMy5tYWduaXR1ZGVTcXVhcmVkKFZlY3RvcjMuc3VidHJhY3QoeE1heCwgeE1pbiwgZnJvbVBvaW50c1NjcmF0Y2gpKTtcclxuXHRcdGNvbnN0IHlTcGFuID0gVmVjdG9yMy5tYWduaXR1ZGVTcXVhcmVkKFZlY3RvcjMuc3VidHJhY3QoeU1heCwgeU1pbiwgZnJvbVBvaW50c1NjcmF0Y2gpKTtcclxuXHRcdGNvbnN0IHpTcGFuID0gVmVjdG9yMy5tYWduaXR1ZGVTcXVhcmVkKFZlY3RvcjMuc3VidHJhY3Qoek1heCwgek1pbiwgZnJvbVBvaW50c1NjcmF0Y2gpKTtcclxuXHJcblx0XHQvLyBTZXQgdGhlIGRpYW1ldGVyIGVuZHBvaW50cyB0byB0aGUgbGFyZ2VzdCBzcGFuLlxyXG5cdFx0bGV0IGRpYW1ldGVyMSA9IHhNaW47XHJcblx0XHRsZXQgZGlhbWV0ZXIyID0geE1heDtcclxuXHRcdGxldCBtYXhTcGFuID0geFNwYW47XHJcblx0XHRpZiAoeVNwYW4gPiBtYXhTcGFuKSB7XHJcblx0XHRcdG1heFNwYW4gPSB5U3BhbjtcclxuXHRcdFx0ZGlhbWV0ZXIxID0geU1pbjtcclxuXHRcdFx0ZGlhbWV0ZXIyID0geU1heDtcclxuXHRcdH1cclxuXHRcdGlmICh6U3BhbiA+IG1heFNwYW4pIHtcclxuXHRcdFx0bWF4U3BhbiA9IHpTcGFuO1xyXG5cdFx0XHRkaWFtZXRlcjEgPSB6TWluO1xyXG5cdFx0XHRkaWFtZXRlcjIgPSB6TWF4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENhbGN1bGF0ZSB0aGUgY2VudGVyIG9mIHRoZSBpbml0aWFsIHNwaGVyZSBmb3VuZCBieSBSaXR0ZXIncyBhbGdvcml0aG1cclxuXHRcdGNvbnN0IHJpdHRlckNlbnRlciA9IGZyb21Qb2ludHNSaXR0ZXJDZW50ZXI7XHJcblx0XHRyaXR0ZXJDZW50ZXIueCA9IChkaWFtZXRlcjEueCArIGRpYW1ldGVyMi54KSAqIDAuNTtcclxuXHRcdHJpdHRlckNlbnRlci55ID0gKGRpYW1ldGVyMS55ICsgZGlhbWV0ZXIyLnkpICogMC41O1xyXG5cdFx0cml0dGVyQ2VudGVyLnogPSAoZGlhbWV0ZXIxLnogKyBkaWFtZXRlcjIueikgKiAwLjU7XHJcblxyXG5cdFx0Ly8gQ2FsY3VsYXRlIHRoZSByYWRpdXMgb2YgdGhlIGluaXRpYWwgc3BoZXJlIGZvdW5kIGJ5IFJpdHRlcidzIGFsZ29yaXRobVxyXG5cdFx0bGV0IHJhZGl1c1NxdWFyZWQgPSBWZWN0b3IzLm1hZ25pdHVkZVNxdWFyZWQoVmVjdG9yMy5zdWJ0cmFjdChkaWFtZXRlcjIsIHJpdHRlckNlbnRlciwgZnJvbVBvaW50c1NjcmF0Y2gpKTtcclxuXHRcdGxldCByaXR0ZXJSYWRpdXMgPSBNYXRoLnNxcnQocmFkaXVzU3F1YXJlZCk7XHJcblxyXG5cdFx0Ly8gRmluZCB0aGUgY2VudGVyIG9mIHRoZSBzcGhlcmUgZm91bmQgdXNpbmcgdGhlIE5haXZlIG1ldGhvZC5cclxuXHRcdGNvbnN0IG1pbkJveFB0ID0gZnJvbVBvaW50c01pbkJveFB0O1xyXG5cdFx0bWluQm94UHQueCA9IHhNaW4ueDtcclxuXHRcdG1pbkJveFB0LnkgPSB5TWluLnk7XHJcblx0XHRtaW5Cb3hQdC56ID0gek1pbi56O1xyXG5cclxuXHRcdGNvbnN0IG1heEJveFB0ID0gZnJvbVBvaW50c01heEJveFB0O1xyXG5cdFx0bWF4Qm94UHQueCA9IHhNYXgueDtcclxuXHRcdG1heEJveFB0LnkgPSB5TWF4Lnk7XHJcblx0XHRtYXhCb3hQdC56ID0gek1heC56O1xyXG5cclxuXHRcdGNvbnN0IG5haXZlQ2VudGVyID0gVmVjdG9yMy5taWRwb2ludChtaW5Cb3hQdCwgbWF4Qm94UHQsIGZyb21Qb2ludHNOYWl2ZUNlbnRlclNjcmF0Y2gpO1xyXG5cclxuXHRcdC8vIEJlZ2luIDJuZCBwYXNzIHRvIGZpbmQgbmFpdmUgcmFkaXVzIGFuZCBtb2RpZnkgdGhlIHJpdHRlciBzcGhlcmUuXHJcblx0XHRsZXQgbmFpdmVSYWRpdXMgPSAwO1xyXG5cdFx0Zm9yIChpID0gMDsgaSA8IG51bUVsZW1lbnRzOyBpICs9IHN0cmlkZSkge1xyXG5cdFx0XHRjdXJyZW50UG9zLnggPSBwb3NpdGlvbnNbaV0gKyBjZW50ZXIueDtcclxuXHRcdFx0Y3VycmVudFBvcy55ID0gcG9zaXRpb25zW2kgKyAxXSArIGNlbnRlci55O1xyXG5cdFx0XHRjdXJyZW50UG9zLnogPSBwb3NpdGlvbnNbaSArIDJdICsgY2VudGVyLno7XHJcblxyXG5cdFx0XHQvLyBGaW5kIHRoZSBmdXJ0aGVzdCBwb2ludCBmcm9tIHRoZSBuYWl2ZSBjZW50ZXIgdG8gY2FsY3VsYXRlIHRoZSBuYWl2ZSByYWRpdXMuXHJcblx0XHRcdGNvbnN0IHIgPSBWZWN0b3IzLm1hZ25pdHVkZShWZWN0b3IzLnN1YnRyYWN0KGN1cnJlbnRQb3MsIG5haXZlQ2VudGVyLCBmcm9tUG9pbnRzU2NyYXRjaCkpO1xyXG5cdFx0XHRpZiAociA+IG5haXZlUmFkaXVzKSB7XHJcblx0XHRcdFx0bmFpdmVSYWRpdXMgPSByO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBNYWtlIGFkanVzdG1lbnRzIHRvIHRoZSBSaXR0ZXIgU3BoZXJlIHRvIGluY2x1ZGUgYWxsIHBvaW50cy5cclxuXHRcdFx0Y29uc3Qgb2xkQ2VudGVyVG9Qb2ludFNxdWFyZWQgPSBWZWN0b3IzLm1hZ25pdHVkZVNxdWFyZWQoXHJcblx0XHRcdFx0VmVjdG9yMy5zdWJ0cmFjdChjdXJyZW50UG9zLCByaXR0ZXJDZW50ZXIsIGZyb21Qb2ludHNTY3JhdGNoKVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRpZiAob2xkQ2VudGVyVG9Qb2ludFNxdWFyZWQgPiByYWRpdXNTcXVhcmVkKSB7XHJcblx0XHRcdFx0Y29uc3Qgb2xkQ2VudGVyVG9Qb2ludCA9IE1hdGguc3FydChvbGRDZW50ZXJUb1BvaW50U3F1YXJlZCk7XHJcblx0XHRcdFx0Ly8gQ2FsY3VsYXRlIG5ldyByYWRpdXMgdG8gaW5jbHVkZSB0aGUgcG9pbnQgdGhhdCBsaWVzIG91dHNpZGVcclxuXHRcdFx0XHRyaXR0ZXJSYWRpdXMgPSAocml0dGVyUmFkaXVzICsgb2xkQ2VudGVyVG9Qb2ludCkgKiAwLjU7XHJcblx0XHRcdFx0cmFkaXVzU3F1YXJlZCA9IHJpdHRlclJhZGl1cyAqIHJpdHRlclJhZGl1cztcclxuXHRcdFx0XHQvLyBDYWxjdWxhdGUgY2VudGVyIG9mIG5ldyBSaXR0ZXIgc3BoZXJlXHJcblx0XHRcdFx0Y29uc3Qgb2xkVG9OZXcgPSBvbGRDZW50ZXJUb1BvaW50IC0gcml0dGVyUmFkaXVzO1xyXG5cdFx0XHRcdHJpdHRlckNlbnRlci54ID0gKHJpdHRlclJhZGl1cyAqIHJpdHRlckNlbnRlci54ICsgb2xkVG9OZXcgKiBjdXJyZW50UG9zLngpIC8gb2xkQ2VudGVyVG9Qb2ludDtcclxuXHRcdFx0XHRyaXR0ZXJDZW50ZXIueSA9IChyaXR0ZXJSYWRpdXMgKiByaXR0ZXJDZW50ZXIueSArIG9sZFRvTmV3ICogY3VycmVudFBvcy55KSAvIG9sZENlbnRlclRvUG9pbnQ7XHJcblx0XHRcdFx0cml0dGVyQ2VudGVyLnogPSAocml0dGVyUmFkaXVzICogcml0dGVyQ2VudGVyLnogKyBvbGRUb05ldyAqIGN1cnJlbnRQb3MueikgLyBvbGRDZW50ZXJUb1BvaW50O1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHJpdHRlclJhZGl1cyA8IG5haXZlUmFkaXVzKSB7XHJcblx0XHRcdFZlY3RvcjMuY2xvbmUocml0dGVyQ2VudGVyLCByZXN1bHQuY2VudGVyKTtcclxuXHRcdFx0cmVzdWx0LnJhZGl1cyA9IHJpdHRlclJhZGl1cztcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdFZlY3RvcjMuY2xvbmUobmFpdmVDZW50ZXIsIHJlc3VsdC5jZW50ZXIpO1xyXG5cdFx0XHRyZXN1bHQucmFkaXVzID0gbmFpdmVSYWRpdXM7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdGludGVyc2VjdFBsYW5lKHBsYW5lOiBQbGFuZSkge1xyXG5cdFx0Y29uc3QgY2VudGVyID0gdGhpcy5jZW50ZXI7XHJcblx0XHRjb25zdCByYWRpdXMgPSB0aGlzLnJhZGl1cztcclxuXHRcdGNvbnN0IG5vcm1hbCA9IHBsYW5lLm5vcm1hbDtcclxuXHRcdGNvbnN0IGRpc3RhbmNlVG9QbGFuZSA9IFZlY3RvcjMuZG90KG5vcm1hbCwgY2VudGVyKSArIHBsYW5lLmRpc3RhbmNlO1xyXG5cclxuXHRcdGlmIChkaXN0YW5jZVRvUGxhbmUgPCAtcmFkaXVzKSB7XHJcblx0XHRcdC8vIFRoZSBjZW50ZXIgcG9pbnQgaXMgbmVnYXRpdmUgc2lkZSBvZiB0aGUgcGxhbmUgbm9ybWFsXHJcblx0XHRcdHJldHVybiBJbnRlcnNlY3QuT1VUU0lERTtcclxuXHRcdH0gZWxzZSBpZiAoZGlzdGFuY2VUb1BsYW5lIDwgcmFkaXVzKSB7XHJcblx0XHRcdC8vIFRoZSBjZW50ZXIgcG9pbnQgaXMgcG9zaXRpdmUgc2lkZSBvZiB0aGUgcGxhbmUsIGJ1dCByYWRpdXMgZXh0ZW5kcyBiZXlvbmQgaXQ7IHBhcnRpYWwgb3ZlcmxhcFxyXG5cdFx0XHRyZXR1cm4gSW50ZXJzZWN0LklOVEVSU0VDVElORztcclxuXHRcdH1cclxuXHRcdHJldHVybiBJbnRlcnNlY3QuSU5TSURFO1xyXG5cdH1cclxuXHR1cGRhdGUodHJhbnNmb3JtOiBNYXRyaXg0KSB7XHJcblx0XHRNYXRyaXg0Lm11bHRpcGx5QnlQb2ludCh0cmFuc2Zvcm0sIHRoaXMub3JpZ2luQ2VudGVyLCB0aGlzLmNlbnRlcik7XHJcblx0XHR0aGlzLnJhZGl1cyA9IE1hdHJpeDQuZ2V0TWF4aW11bVNjYWxlKHRyYW5zZm9ybSkgKiB0aGlzLm9yaWdpblJhZGl1cztcclxuXHR9XHJcblx0ZGlzdGFuY2VUb0NhbWVyYShjYW1lcmE6IENhbWVyYSkge1xyXG5cdFx0cmV0dXJuIE1hdGgubWF4KDAuMCwgVmVjdG9yMy5kaXN0YW5jZSh0aGlzLmNlbnRlciwgY2FtZXJhLnBvc2l0aW9uKSAtIHRoaXMucmFkaXVzKTtcclxuXHR9XHJcbn1cclxuY29uc3QgZnJvbVBvaW50c1hNaW4gPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBmcm9tUG9pbnRzWU1pbiA9IG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IGZyb21Qb2ludHNaTWluID0gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgZnJvbVBvaW50c1hNYXggPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBmcm9tUG9pbnRzWU1heCA9IG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IGZyb21Qb2ludHNaTWF4ID0gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgZnJvbVBvaW50c0N1cnJlbnRQb3MgPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBmcm9tUG9pbnRzU2NyYXRjaCA9IG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IGZyb21Qb2ludHNSaXR0ZXJDZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBmcm9tUG9pbnRzTWluQm94UHQgPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBmcm9tUG9pbnRzTWF4Qm94UHQgPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBmcm9tUG9pbnRzTmFpdmVDZW50ZXJTY3JhdGNoID0gbmV3IFZlY3RvcjMoKTtcclxuIiwiaW1wb3J0IHsgSW5kZXhGb3JtYXQgfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVDb25zdGFudFwiO1xyXG5pbXBvcnQgQnVmZmVyIGZyb20gXCIuL0J1ZmZlclwiO1xyXG5pbXBvcnQge1R5cGVkQXJyYXl9IGZyb20gXCIuLi91dGlscy9nbHRmVXRpbHNcIjtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW5kZXhCdWZmZXIge1xyXG5cdGJ1ZmZlcjogQnVmZmVyO1xyXG5cdGluZGljZXM6IFR5cGVkQXJyYXk7XHJcblx0aW5kZXhGb3JtYXQ6IEdQVUluZGV4Rm9ybWF0O1xyXG5cdGRpcnR5OiBib29sZWFuO1xyXG5cdHByaXZhdGUgbGFiZWw6IHN0cmluZztcclxuXHRjb25zdHJ1Y3RvcihsYWJlbDogc3RyaW5nLCBpbmRpY2VzPzogVHlwZWRBcnJheSkge1xyXG5cdFx0dGhpcy5sYWJlbCA9IGxhYmVsO1xyXG5cdFx0dGhpcy5pbmRpY2VzID0gaW5kaWNlcztcclxuXHRcdHRoaXMuaW5kZXhGb3JtYXQgPSBpbmRpY2VzIGluc3RhbmNlb2YgVWludDMyQXJyYXkgPyBJbmRleEZvcm1hdC5VaW50MzIgOiBJbmRleEZvcm1hdC5VaW50MTY7XHJcblx0XHR0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuXHR9XHJcblx0c2V0SW5kaWNlcyhpbmRpY2VzKSB7XHJcblx0XHR0aGlzLmluZGljZXMgPSBpbmRpY2VzO1xyXG5cdFx0dGhpcy5pbmRleEZvcm1hdCA9IGluZGljZXMgaW5zdGFuY2VvZiBVaW50MzJBcnJheSA/IEluZGV4Rm9ybWF0LlVpbnQzMiA6IEluZGV4Rm9ybWF0LlVpbnQxNjtcclxuXHRcdHRoaXMuZGlydHkgPSB0cnVlO1xyXG5cdH1cclxuXHRiaW5kKGRldmljZTogR1BVRGV2aWNlLCBwYXNzRW5jb2RlcjogR1BVUmVuZGVyUGFzc0VuY29kZXIpIHtcclxuXHRcdGlmICh0aGlzLmRpcnR5KSB7XHJcblx0XHRcdHRoaXMuZGlydHkgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5idWZmZXIgPSBCdWZmZXIuY3JlYXRlSW5kZXhCdWZmZXIoXHJcblx0XHRcdFx0dGhpcy5sYWJlbCxcclxuXHRcdFx0XHRkZXZpY2UsXHJcblx0XHRcdFx0dGhpcy5pbmRpY2VzIGluc3RhbmNlb2YgQXJyYXkgP1xyXG5cdFx0XHRcdFx0KEluZGV4Rm9ybWF0LlVpbnQxNiA/IG5ldyBVaW50MTZBcnJheSh0aGlzLmluZGljZXMpIDogbmV3IFVpbnQzMkFycmF5KHRoaXMuaW5kaWNlcykpOlxyXG5cdFx0XHRcdFx0dGhpcy5pbmRpY2VzKTtcclxuXHRcdH1cclxuXHRcdHBhc3NFbmNvZGVyLnNldEluZGV4QnVmZmVyKHRoaXMuYnVmZmVyLmdwdUJ1ZmZlciwgdGhpcy5pbmRleEZvcm1hdCk7XHJcblx0fVxyXG5cdGRlc3Ryb3koKSB7XHJcblx0XHR0aGlzLmJ1ZmZlci5kZXN0cm95KCk7XHJcblx0fVxyXG59XHJcbiIsImltcG9ydCB7IEF0dHJpYnV0ZSwgQXR0cmlidXRlVHlwZSwgQnVmZmVyRmxvYXQzMkF0dHJpYnV0ZSwgSW50ZXJsZWF2ZWRBdHRyaWJ1dGUgfSBmcm9tIFwiLi9BdHRyaWJ1dGVcIjtcclxuaW1wb3J0IEJ1ZmZlciBmcm9tIFwiLi9CdWZmZXJcIjtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXR0cmlidXRlcyB7XHJcblx0cHVibGljIGludGVybGVhdmU6IGJvb2xlYW47XHJcblx0cHJpdmF0ZSBfYXR0cmlidXRlczogTWFwPHN0cmluZywgQXR0cmlidXRlIHwgSW50ZXJsZWF2ZWRBdHRyaWJ1dGU+O1xyXG5cdHByaXZhdGUgc2hhZGVyTG9jYXRpb246IG51bWJlcjtcclxuXHRwcml2YXRlIG9mZnNldDogbnVtYmVyO1xyXG5cdGNvbnN0cnVjdG9yKHNoYWRlckxvY2F0aW9uID0gMCkge1xyXG5cdFx0dGhpcy5fYXR0cmlidXRlcyA9IG5ldyBNYXAoKTtcclxuXHRcdHRoaXMuc2hhZGVyTG9jYXRpb24gPSBzaGFkZXJMb2NhdGlvbjtcclxuXHRcdHRoaXMub2Zmc2V0ID0gMDtcclxuXHRcdHRoaXMuaW50ZXJsZWF2ZSA9IGZhbHNlO1xyXG5cdH1cclxuXHRnZXQgZGlydHkoKTogYm9vbGVhbiB7XHJcblx0XHRsZXQgcmVzdWx0ID0gZmFsc2U7XHJcblx0XHR0aGlzLl9hdHRyaWJ1dGVzLmZvckVhY2goKGF0dHJpYnV0ZSkgPT4gKCFyZXN1bHQgPyAocmVzdWx0ID0gYXR0cmlidXRlLmRpcnR5KSA6IGZhbHNlKSk7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHRzZXQgZGlydHkodmFsdWU6IGJvb2xlYW4pIHtcclxuXHRcdHRoaXMuX2F0dHJpYnV0ZXMuZm9yRWFjaCgoYXR0cmlidXRlKSA9PiAoYXR0cmlidXRlLmRpcnR5ID0gdmFsdWUpKTtcclxuXHR9XHJcblx0Z2V0IHZhbHVlcygpOiBNYXA8c3RyaW5nLCBBdHRyaWJ1dGUgfCBJbnRlcmxlYXZlZEF0dHJpYnV0ZT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2F0dHJpYnV0ZXM7XHJcblx0fVxyXG5cdGdldEF0dHJpYnV0ZShuYW1lKTogQXR0cmlidXRlIHwgSW50ZXJsZWF2ZWRBdHRyaWJ1dGUge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2F0dHJpYnV0ZXMuZ2V0KG5hbWUpO1xyXG5cdH1cclxuXHRzZXRBdHRyaWJ1dGUoYXR0cmlidXRlOiBBdHRyaWJ1dGUgfCBJbnRlcmxlYXZlZEF0dHJpYnV0ZSkge1xyXG5cdFx0aWYgKGF0dHJpYnV0ZS5hdHRyaWJ1dGVUeXBlID09PSBBdHRyaWJ1dGVUeXBlLmF0dHJpYnV0ZSkge1xyXG5cdFx0XHR0aGlzLnNldE5vdEludGVybGVhdmVkQXR0cmlidXRlKGF0dHJpYnV0ZSBhcyBBdHRyaWJ1dGUpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5zZXRJbnRlcmxlYXZlZEF0dHJpYnV0ZShhdHRyaWJ1dGUgYXMgSW50ZXJsZWF2ZWRBdHRyaWJ1dGUpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRwcml2YXRlIHNldE5vdEludGVybGVhdmVkQXR0cmlidXRlKGF0dHJpYnV0ZTogQXR0cmlidXRlKSB7XHJcblx0XHRpZiAodGhpcy5fYXR0cmlidXRlcy5oYXMoYXR0cmlidXRlLm5hbWUpKSByZXR1cm47XHJcblx0XHRhdHRyaWJ1dGUuc2hhZGVyTG9jYXRpb24gPSB0aGlzLnNoYWRlckxvY2F0aW9uO1xyXG5cdFx0dGhpcy5zaGFkZXJMb2NhdGlvbiArPSAxO1xyXG5cdFx0YXR0cmlidXRlLm9mZnNldCA9IHRoaXMub2Zmc2V0O1xyXG5cdFx0dGhpcy5vZmZzZXQgKz0gYXR0cmlidXRlLmF0dHJpYnV0ZUJ5dGVTaXplO1xyXG5cdFx0dGhpcy5fYXR0cmlidXRlcy5zZXQoYXR0cmlidXRlLm5hbWUsIGF0dHJpYnV0ZSk7XHJcblx0fVxyXG5cdHByaXZhdGUgc2V0SW50ZXJsZWF2ZWRBdHRyaWJ1dGUoYXR0cmlidXRlOiBJbnRlcmxlYXZlZEF0dHJpYnV0ZSkge1xyXG5cdFx0aWYgKHRoaXMuX2F0dHJpYnV0ZXMuaGFzKGF0dHJpYnV0ZS5uYW1lcy50b1N0cmluZygpKSkgcmV0dXJuO1xyXG5cdFx0dGhpcy5fYXR0cmlidXRlcy5zZXQoYXR0cmlidXRlLm5hbWVzLnRvU3RyaW5nKCksIGF0dHJpYnV0ZSk7XHJcblx0fVxyXG5cdGdldEdQVUF0dHJpYnV0ZXNEZXMoKSB7XHJcblx0XHRjb25zdCByZXN1bHQgPSBbXTtcclxuXHRcdHRoaXMuX2F0dHJpYnV0ZXMuZm9yRWFjaCgoYXR0cmlidXRlKSA9PiB7XHJcblx0XHRcdHJlc3VsdC5wdXNoKC4uLmF0dHJpYnV0ZS5nZXRHUFVBdHRyaWJ1dGUoKSk7XHJcblx0XHR9KTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cdGdldEF0cnJpYnV0ZVZhbHVlcygpOiB7XHJcblx0XHRhcnJheVN0cmlkZTogbnVtYmVyO1xyXG5cdFx0dHlwZUFycmF5OiBGbG9hdDMyQXJyYXk7XHJcblx0XHRidWZmZXI/OiBCdWZmZXI7XHJcblx0fSB7XHJcblx0XHRjb25zdCBhcnJheVN0cmlkZXMgPSBbXTtcclxuXHRcdGxldCBhcnJheVN0cmlkZSA9IDA7XHJcblx0XHRsZXQgYnVmZmVyID0gdW5kZWZpbmVkO1xyXG5cdFx0bGV0IHZhbHVlcyA9IG51bGw7XHJcblx0XHRjb25zdCBhcnJheXMgPSBbXTtcclxuXHRcdHRoaXMuX2F0dHJpYnV0ZXMuZm9yRWFjaCgoYXR0cmlidXRlOiBBdHRyaWJ1dGUgfCBJbnRlcmxlYXZlZEF0dHJpYnV0ZSkgPT4ge1xyXG5cdFx0XHRpZiAoYXR0cmlidXRlLmF0dHJpYnV0ZVR5cGUgPT09IEF0dHJpYnV0ZVR5cGUuYXR0cmlidXRlKSB7XHJcblx0XHRcdFx0YXJyYXlTdHJpZGVzLnB1c2goKGF0dHJpYnV0ZSBhcyBBdHRyaWJ1dGUpLml0ZW1TaXplKTtcclxuXHRcdFx0XHRhcnJheXMucHVzaChhdHRyaWJ1dGUudmFsdWUpO1xyXG5cdFx0XHRcdGFycmF5U3RyaWRlICs9IChhdHRyaWJ1dGUgYXMgQXR0cmlidXRlKS5pdGVtU2l6ZTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRpZiAoIXRoaXMuaW50ZXJsZWF2ZSkgdGhpcy5pbnRlcmxlYXZlID0gdHJ1ZTtcclxuXHRcdFx0XHR2YWx1ZXMgPSB2YWx1ZXMgPz8gYXR0cmlidXRlLnZhbHVlO1xyXG5cdFx0XHRcdGJ1ZmZlciA9IChhdHRyaWJ1dGUgYXMgQnVmZmVyRmxvYXQzMkF0dHJpYnV0ZSk/LmJ1ZmZlcjtcclxuXHRcdFx0XHRhcnJheVN0cmlkZSA9IChhdHRyaWJ1dGUgYXMgSW50ZXJsZWF2ZWRBdHRyaWJ1dGUpLml0ZW1TaXplcy5yZWR1Y2UoXHJcblx0XHRcdFx0XHQodG90YWwsIGN1cnJlbnQpID0+ICh0b3RhbCArPSBjdXJyZW50KSxcclxuXHRcdFx0XHRcdDBcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHRjb25zdCB0eXBlQXJyYXkgPSB0aGlzLmludGVybGVhdmVcclxuXHRcdFx0PyBuZXcgRmxvYXQzMkFycmF5KHZhbHVlcylcclxuXHRcdFx0OiB0aGlzLmludGVybGVhdmVUeXBlZEFycmF5KEZsb2F0MzJBcnJheSwgYXJyYXlTdHJpZGVzLCAuLi5hcnJheXMpO1xyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0YXJyYXlTdHJpZGU6IGFycmF5U3RyaWRlICogdHlwZUFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFxyXG5cdFx0XHR0eXBlQXJyYXksXHJcblx0XHRcdGJ1ZmZlclxyXG5cdFx0fTtcclxuXHR9XHJcblx0ZGVzdHJveSgpIHtcclxuXHRcdHRoaXMuX2F0dHJpYnV0ZXMuZm9yRWFjaCgoYXR0cmlidXRlKSA9PiB7XHJcblx0XHRcdGF0dHJpYnV0ZS5kZXN0cm95KCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogSW50ZXJsZWF2ZSBuIHR5cGVkIGFycmF5c1xyXG5cdCAqIEBhbGlhcyBtb2R1bGU6aW50ZXJsZWF2ZVR5cGVkQXJyYXlcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IFJlc3VsdENvbnN0cnVjdG9yIFJldHVybmVkIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yXHJcblx0ICogQHBhcmFtIHtBcnJheX0gZWxlbWVudHMgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGdyb3VwIGZvciBlYWNoIHR5cGVkIGFycmF5XHJcblx0ICogQHBhcmFtIHsuLi5UeXBlZEFycmF5fSBhcnJheXMgQXJyYXlzIHRvIGludGVybGVhdmVcclxuXHQgKiBAcmV0dXJucyB7VHlwZWRBcnJheX1cclxuXHQgKi9cclxuXHRpbnRlcmxlYXZlVHlwZWRBcnJheShSZXN1bHRDb25zdHJ1Y3RvciwgZWxlbWVudHMsIC4uLmFycmF5cykge1xyXG5cdFx0Y29uc3QgdG90YWxMZW5ndGggPSBhcnJheXMucmVkdWNlKCh0b3RhbCwgYXJyKSA9PiB0b3RhbCArIGFyci5sZW5ndGgsIDApO1xyXG5cdFx0Y29uc3QgcmVzdWx0ID0gbmV3IFJlc3VsdENvbnN0cnVjdG9yKHRvdGFsTGVuZ3RoKTtcclxuXHRcdGNvbnN0IHN0cmlkZSA9IGVsZW1lbnRzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIpO1xyXG5cclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWxMZW5ndGg7IGkrKykge1xyXG5cdFx0XHRsZXQgb2Zmc2V0ID0gMDtcclxuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykge1xyXG5cdFx0XHRcdGZvciAobGV0IGsgPSAwOyBrIDwgZWxlbWVudHNbal07IGsrKykge1xyXG5cdFx0XHRcdFx0cmVzdWx0W2kgKiBzdHJpZGUgKyBvZmZzZXRdID0gYXJyYXlzW2pdW2VsZW1lbnRzW2pdICogaSArIGtdO1xyXG5cdFx0XHRcdFx0b2Zmc2V0Kys7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxufVxyXG4iLCJpbXBvcnQgeyBJbnB1dFN0ZXBNb2RlIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVQ29uc3RhbnRcIjtcclxuaW1wb3J0IHsgVmVydGV4QnVmZmVyUGFyYW1zIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVVHlwZXNcIjtcclxuaW1wb3J0IHsgQXR0cmlidXRlLCBBdHRyaWJ1dGVUeXBlLCBJbnRlcmxlYXZlZEF0dHJpYnV0ZSwgSW50ZXJsZWF2ZWRGbG9hdDMyQXR0cmlidXRlIH0gZnJvbSBcIi4vQXR0cmlidXRlXCI7XHJcbmltcG9ydCBBdHRyaWJ1dGVzIGZyb20gXCIuL0F0dHJpYnV0ZXNcIjtcclxuaW1wb3J0IEJ1ZmZlciBmcm9tIFwiLi9CdWZmZXJcIjtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVydGV4QnVmZmVyIHtcclxuXHRwdWJsaWMgaW5kZXg6IG51bWJlcjtcclxuXHRwdWJsaWMgYXJyYXlTdHJpZGU6IG51bWJlcjtcclxuXHRwdWJsaWMgc3RlcE1vZGU6IHN0cmluZztcclxuXHRwdWJsaWMgYnVmZmVyOiBCdWZmZXI7XHJcblx0cHVibGljIGF0dHJpYnV0ZXM6IEF0dHJpYnV0ZXM7XHJcblx0cHVibGljIGRpcnR5OiBib29sZWFuO1xyXG5cdHB1YmxpYyBkZWZpbmVzOiB7IFtwcm9wOiBzdHJpbmddOiBib29sZWFuIHwgbnVtYmVyIH07XHJcblx0cHVibGljIGxvY2F0aW9uSW5kZXg6IG51bWJlcjtcclxuXHRwcml2YXRlIGxhYmVsOiBzdHJpbmc7XHJcblx0Ly9cclxuXHRjb25zdHJ1Y3RvcihwYXJhbXM6IFZlcnRleEJ1ZmZlclBhcmFtcykge1xyXG5cdFx0Y29uc3QgeyBsYWJlbCwgaW5kZXgsIGxvY2F0aW9uSW5kZXggPSAwLCBzdGVwTW9kZSA9IElucHV0U3RlcE1vZGUuVmVydGV4LCBhcnJheVN0cmlkZSB9ID0gcGFyYW1zO1xyXG5cdFx0dGhpcy5pbmRleCA9IGluZGV4IHx8IDA7XHJcblx0XHR0aGlzLmF0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlcyhsb2NhdGlvbkluZGV4KTtcclxuXHRcdHRoaXMuc3RlcE1vZGUgPSBzdGVwTW9kZTtcclxuXHRcdHRoaXMuZGlydHkgPSB0cnVlO1xyXG5cdFx0dGhpcy5sYWJlbCA9IGxhYmVsPy5jb25jYXQoYF8ke2luZGV4fV9WZXJ0ZXhCdWZmZXJgKTtcclxuXHRcdHRoaXMuYXJyYXlTdHJpZGUgPSBhcnJheVN0cmlkZTtcclxuXHRcdHRoaXMuZGVmaW5lcyA9IHt9O1xyXG5cdFx0dGhpcy5sb2NhdGlvbkluZGV4ID0gbG9jYXRpb25JbmRleDtcclxuXHR9XHJcblx0cHVibGljIGdldEJ1ZmZlckRlcygpIHtcclxuXHRcdGNvbnN0IHJlc3VsdCA9IHtcclxuXHRcdFx0YXJyYXlTdHJpZGU6IHRoaXMuYXJyYXlTdHJpZGUsXHJcblx0XHRcdHN0ZXBNb2RlOiB0aGlzLnN0ZXBNb2RlLFxyXG5cdFx0XHRhdHRyaWJ1dGVzOiB0aGlzLmF0dHJpYnV0ZXMuZ2V0R1BVQXR0cmlidXRlc0RlcygpXHJcblx0XHR9O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblx0cHVibGljIHNldEF0dHJpYnV0ZShhdHRyaWJ1dGU6IEF0dHJpYnV0ZSB8IEludGVybGVhdmVkQXR0cmlidXRlKSB7XHJcblx0XHRpZiAoYXR0cmlidXRlLmF0dHJpYnV0ZVR5cGUgPT09IEF0dHJpYnV0ZVR5cGUuYXR0cmlidXRlKSB7XHJcblx0XHRcdHRoaXMuc2V0TG9jYXRpb25JbmRleCgoYXR0cmlidXRlIGFzIEF0dHJpYnV0ZSkubmFtZSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQoYXR0cmlidXRlIGFzIEludGVybGVhdmVkRmxvYXQzMkF0dHJpYnV0ZSk/Lm5hbWVzLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4gdGhpcy5zZXRMb2NhdGlvbkluZGV4KG5hbWUpKTtcclxuXHRcdH1cclxuXHRcdHRoaXMuYXR0cmlidXRlcy5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcclxuXHRcdHRoaXMuZGlydHkgPSB0cnVlO1xyXG5cdH1cclxuXHRwdWJsaWMgZ2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZyk6IEF0dHJpYnV0ZSB8IEludGVybGVhdmVkQXR0cmlidXRlIHtcclxuXHRcdHJldHVybiB0aGlzLmF0dHJpYnV0ZXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xyXG5cdH1cclxuXHRwdWJsaWMgY29udGFpbkF0dHJpYnV0ZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLmRlZmluZXNbbmFtZT8uY29uY2F0KFwiTG9jYXRpb25cIildICE9IHVuZGVmaW5lZCA/IHRydWUgOiBmYWxzZTtcclxuXHR9XHJcblx0cHVibGljIGJpbmQoZGV2aWNlOiBHUFVEZXZpY2UsIHBhc3NFbmNvZGVyOiBHUFVSZW5kZXJQYXNzRW5jb2Rlcikge1xyXG5cdFx0aWYgKHRoaXMuYXR0cmlidXRlcy5kaXJ0eSkge1xyXG5cdFx0XHR0aGlzLmF0dHJpYnV0ZXMuZGlydHkgPSBmYWxzZTtcclxuXHRcdFx0Y29uc3QgeyBhcnJheVN0cmlkZSwgdHlwZUFycmF5LCBidWZmZXIgfSA9IHRoaXMuYXR0cmlidXRlcy5nZXRBdHJyaWJ1dGVWYWx1ZXMoKTtcclxuXHRcdFx0aWYgKHRoaXMuYXJyYXlTdHJpZGUgPT09IHVuZGVmaW5lZCkgdGhpcy5hcnJheVN0cmlkZSA9IGFycmF5U3RyaWRlO1xyXG5cdFx0XHRpZiAoIXRoaXMuYnVmZmVyKSB7XHJcblx0XHRcdFx0dGhpcy5idWZmZXIgPSBidWZmZXIgPz8gQnVmZmVyLmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxhYmVsLCBkZXZpY2UsIHR5cGVBcnJheSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gdXBkYXRlIEJ1ZmZlclxyXG5cdFx0XHRcdGlmICh0eXBlQXJyYXkpIHRoaXMuYnVmZmVyLnNldFN1YkRhdGEoMCwgdHlwZUFycmF5KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cGFzc0VuY29kZXIuc2V0VmVydGV4QnVmZmVyKHRoaXMuaW5kZXgsIHRoaXMuYnVmZmVyLmdwdUJ1ZmZlcik7XHJcblx0fVxyXG5cdHByaXZhdGUgc2V0TG9jYXRpb25JbmRleChuYW1lOiBzdHJpbmcpIHtcclxuXHRcdGlmICh0aGlzLmRlZmluZXNbbmFtZT8uY29uY2F0KFwiTG9jYXRpb25cIildIHx8ICFuYW1lKSByZXR1cm47XHJcblx0XHR0aGlzLmRlZmluZXNbbmFtZT8uY29uY2F0KFwiTG9jYXRpb25cIildID0gdGhpcy5sb2NhdGlvbkluZGV4O1xyXG5cdFx0dGhpcy5sb2NhdGlvbkluZGV4ICs9IDE7XHJcblx0fVxyXG5cdGRlc3Ryb3koKSB7XHJcblx0XHR0aGlzLmJ1ZmZlci5kZXN0cm95KCk7XHJcblx0XHR0aGlzLmF0dHJpYnV0ZXMuZGVzdHJveSgpO1xyXG5cdH1cclxufVxyXG4iLCJpbXBvcnQgZGVmYXVsdFZhbHVlIGZyb20gXCIuL2RlZmF1bHRWYWx1ZVwiO1xyXG5pbXBvcnQgZGVmaW5lZCBmcm9tIFwiLi9kZWZpbmVkXCI7XHJcblxyXG4vKipcclxuICogTWVyZ2VzIHR3byBvYmplY3RzLCBjb3B5aW5nIHRoZWlyIHByb3BlcnRpZXMgb250byBhIG5ldyBjb21iaW5lZCBvYmplY3QuIFdoZW4gdHdvIG9iamVjdHMgaGF2ZSB0aGUgc2FtZVxyXG4gKiBwcm9wZXJ0eSwgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvbiB0aGUgZmlyc3Qgb2JqZWN0IGlzIHVzZWQuICBJZiBlaXRoZXIgb2JqZWN0IGlzIHVuZGVmaW5lZCxcclxuICogaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGVtcHR5IG9iamVjdC5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogY29uc3Qgb2JqZWN0MSA9IHtcclxuICogICAgIHByb3BPbmUgOiAxLFxyXG4gKiAgICAgcHJvcFR3byA6IHtcclxuICogICAgICAgICB2YWx1ZTEgOiAxMFxyXG4gKiAgICAgfVxyXG4gKiB9XHJcbiAqIGNvbnN0IG9iamVjdDIgPSB7XHJcbiAqICAgICBwcm9wVHdvIDogMlxyXG4gKiB9XHJcbiAqIGNvbnN0IGZpbmFsID0gY29tYmluZShvYmplY3QxLCBvYmplY3QyKTtcclxuICpcclxuICogLy8gZmluYWwgPT09IHtcclxuICogLy8gICAgIHByb3BPbmUgOiAxLFxyXG4gKiAvLyAgICAgcHJvcFR3byA6IHtcclxuICogLy8gICAgICAgICB2YWx1ZTEgOiAxMFxyXG4gKiAvLyAgICAgfVxyXG4gKiAvLyB9XHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0MV0gVGhlIGZpcnN0IG9iamVjdCB0byBtZXJnZS5cclxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3QyXSBUaGUgc2Vjb25kIG9iamVjdCB0byBtZXJnZS5cclxuICogQHBhcmFtIHtCb29sZWFufSBbZGVlcD1mYWxzZV0gUGVyZm9ybSBhIHJlY3Vyc2l2ZSBtZXJnZS5cclxuICogQHJldHVybnMge09iamVjdH0gVGhlIGNvbWJpbmVkIG9iamVjdCBjb250YWluaW5nIGFsbCBwcm9wZXJ0aWVzIGZyb20gYm90aCBvYmplY3RzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb25cclxuICovXHJcbmZ1bmN0aW9uIGNvbWJpbmUob2JqZWN0MSwgb2JqZWN0MiwgZGVlcCkge1xyXG5cdGRlZXAgPSBkZWZhdWx0VmFsdWUoZGVlcCwgZmFsc2UpO1xyXG5cclxuXHRjb25zdCByZXN1bHQgPSB7fTtcclxuXHJcblx0Y29uc3Qgb2JqZWN0MURlZmluZWQgPSBkZWZpbmVkKG9iamVjdDEpO1xyXG5cdGNvbnN0IG9iamVjdDJEZWZpbmVkID0gZGVmaW5lZChvYmplY3QyKTtcclxuXHRsZXQgcHJvcGVydHk7XHJcblx0bGV0IG9iamVjdDFWYWx1ZTtcclxuXHRsZXQgb2JqZWN0MlZhbHVlO1xyXG5cdGlmIChvYmplY3QxRGVmaW5lZCkge1xyXG5cdFx0Zm9yIChwcm9wZXJ0eSBpbiBvYmplY3QxKSB7XHJcblx0XHRcdGlmIChvYmplY3QxLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xyXG5cdFx0XHRcdG9iamVjdDFWYWx1ZSA9IG9iamVjdDFbcHJvcGVydHldO1xyXG5cdFx0XHRcdGlmIChvYmplY3QyRGVmaW5lZCAmJiBkZWVwICYmIHR5cGVvZiBvYmplY3QxVmFsdWUgPT09IFwib2JqZWN0XCIgJiYgb2JqZWN0Mi5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdG9iamVjdDJWYWx1ZSA9IG9iamVjdDJbcHJvcGVydHldO1xyXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBvYmplY3QyVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcclxuXHRcdFx0XHRcdFx0cmVzdWx0W3Byb3BlcnR5XSA9IGNvbWJpbmUob2JqZWN0MVZhbHVlLCBvYmplY3QyVmFsdWUsIGRlZXApO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0cmVzdWx0W3Byb3BlcnR5XSA9IG9iamVjdDFWYWx1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0cmVzdWx0W3Byb3BlcnR5XSA9IG9iamVjdDFWYWx1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKG9iamVjdDJEZWZpbmVkKSB7XHJcblx0XHRmb3IgKHByb3BlcnR5IGluIG9iamVjdDIpIHtcclxuXHRcdFx0aWYgKG9iamVjdDIuaGFzT3duUHJvcGVydHkocHJvcGVydHkpICYmICFyZXN1bHQuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XHJcblx0XHRcdFx0b2JqZWN0MlZhbHVlID0gb2JqZWN0Mltwcm9wZXJ0eV07XHJcblx0XHRcdFx0cmVzdWx0W3Byb3BlcnR5XSA9IG9iamVjdDJWYWx1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gcmVzdWx0O1xyXG59XHJcbmV4cG9ydCBkZWZhdWx0IGNvbWJpbmU7XHJcbiIsImltcG9ydCBCb3VuZGluZ0JveCBmcm9tIFwiLi4vY29yZS9Cb3VuZGluZ0JveFwiO1xyXG5pbXBvcnQgQm91bmRpbmdTcGhlcmUgZnJvbSBcIi4uL2NvcmUvQm91bmRpbmdTcGhlcmVcIjtcclxuaW1wb3J0IHsgRnJhbWVTdGF0ZSB9IGZyb20gXCIuLi9jb3JlL0ZyYW1lU3RhdGVcIjtcclxuaW1wb3J0IFZlY3RvcjIgZnJvbSBcIi4uL21hdGgvVmVjdG9yMlwiO1xyXG5pbXBvcnQgVmVjdG9yMyBmcm9tIFwiLi4vbWF0aC9WZWN0b3IzXCI7XHJcbmltcG9ydCBWZWN0b3I0IGZyb20gXCIuLi9tYXRoL1ZlY3RvcjRcIjtcclxuaW1wb3J0IHsgQXR0cmlidXRlLCBJbnRlcmxlYXZlZEZsb2F0MzJBdHRyaWJ1dGUgfSBmcm9tIFwiLi4vcmVuZGVyL0F0dHJpYnV0ZVwiO1xyXG5pbXBvcnQgSW5kZXhCdWZmZXIgZnJvbSBcIi4uL3JlbmRlci9JbmRleEJ1ZmZlclwiO1xyXG5pbXBvcnQgVmVydGV4QnVmZmVyIGZyb20gXCIuLi9yZW5kZXIvVmVydGV4QnVmZmVyXCI7XHJcbmltcG9ydCBjb21iaW5lIGZyb20gXCIuLi91dGlscy9jb21iaW5lXCI7XHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdlb21ldHJ5IHtcclxuXHRub3JtYWxzOiBudW1iZXJbXTtcclxuXHR1dnM6IG51bWJlcltdO1xyXG5cdHBvc2l0aW9uczogbnVtYmVyW107XHJcblx0aW5kaWNlczogbnVtYmVyW107XHJcblx0dGFuZ2VudHM6IG51bWJlcltdO1xyXG5cdHR5cGU6IHN0cmluZztcclxuXHRkaXJ0eTogYm9vbGVhbjtcclxuXHRpbmRleEJ1ZmZlcj86IEluZGV4QnVmZmVyO1xyXG5cdGRlZmF1bHRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcclxuXHRjb3VudDogbnVtYmVyO1xyXG5cdGJvdW5kaW5nU3BoZXJlPzogQm91bmRpbmdTcGhlcmU7XHJcblx0Ym91bmRpbmdCb3g/OiBCb3VuZGluZ0JveDtcclxuXHRwcml2YXRlIF9kZWZpbmVzOiB7IFtwcm9wOiBzdHJpbmddOiBib29sZWFuIHwgbnVtYmVyIH07XHJcblx0cHVibGljIHZlcnRleEJ1ZmZlcnM6IEFycmF5PFZlcnRleEJ1ZmZlcj47XHJcblx0ZGVmaW5lc0RpcnR5OiBib29sZWFuO1xyXG5cdGdldCBkZWZpbmVzKCkge1xyXG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2RlZmluZXMsIC4uLnRoaXMudmVydGV4QnVmZmVycy5tYXAoKHZlcnRleEJ1ZmZlcikgPT4gdmVydGV4QnVmZmVyLmRlZmluZXMpKTtcclxuXHR9XHJcblx0c2V0IGRlZmluZXModmFsdWUpIHtcclxuXHRcdHRoaXMuZGVmaW5lc0RpcnR5ID0gdHJ1ZTtcclxuXHRcdHRoaXMuX2RlZmluZXMgPSBjb21iaW5lKHZhbHVlLCB0aGlzLl9kZWZpbmVzLCBmYWxzZSk7XHJcblx0fVxyXG5cdGdldCBjdXJyZW50TG9jYXRpb25JbmRleCgpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIHRoaXM/LnZlcnRleEJ1ZmZlcnM/LnJlZHVjZShcclxuXHRcdFx0KG1heCwgY3VycmVudCkgPT4gKGN1cnJlbnQubG9jYXRpb25JbmRleCA+IG1heCA/IChtYXggPSBjdXJyZW50LmxvY2F0aW9uSW5kZXgpIDogbWF4KSxcclxuXHRcdFx0MFxyXG5cdFx0KTtcclxuXHR9XHJcblx0Z2V0IHZlcnRleEJ1ZmZlckNvdW50KCk6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gdGhpcy52ZXJ0ZXhCdWZmZXJzLmxlbmd0aDtcclxuXHR9XHJcblx0Y29uc3RydWN0b3Iob3B0aW9ucz86IHsgdHlwZT86IHN0cmluZyB9KSB7XHJcblx0XHR0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGUgfHwgdW5kZWZpbmVkO1xyXG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IHVuZGVmaW5lZDtcclxuXHRcdHRoaXMuZGlydHkgPSBmYWxzZTtcclxuXHRcdHRoaXMuZGVmaW5lc0RpcnR5ID0gdHJ1ZTtcclxuXHRcdHRoaXMuZGVmYXVsdFZlcnRleEJ1ZmZlciA9IG5ldyBWZXJ0ZXhCdWZmZXIoe1xyXG5cdFx0XHRsYWJlbDogdGhpcy50eXBlLFxyXG5cdFx0XHRpbmRleDogMFxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLnZlcnRleEJ1ZmZlcnMgPSBbdGhpcy5kZWZhdWx0VmVydGV4QnVmZmVyXTtcclxuXHRcdHRoaXMuX2RlZmluZXMgPSB7fTtcclxuXHRcdHRoaXMubm9ybWFscyA9IFtdO1xyXG5cdFx0dGhpcy51dnMgPSBbXTtcclxuXHRcdHRoaXMucG9zaXRpb25zID0gW107XHJcblx0XHR0aGlzLmluZGljZXMgPSBbXTtcclxuXHRcdHRoaXMudGFuZ2VudHMgPSBbXTtcclxuXHR9XHJcblx0Z2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZykge1xyXG5cdFx0cmV0dXJuIHRoaXMuZGVmYXVsdFZlcnRleEJ1ZmZlci5nZXRBdHRyaWJ1dGUobmFtZSk7XHJcblx0fVxyXG5cdHNldEF0dHJpYnV0ZShhdHRyaWJ1dGU6IEF0dHJpYnV0ZSB8IEludGVybGVhdmVkRmxvYXQzMkF0dHJpYnV0ZSkge1xyXG5cdFx0dGhpcy5kZWZhdWx0VmVydGV4QnVmZmVyLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xyXG5cdH1cclxuXHRzZXRJbmRpY2UoaW5kaWNlczogQXJyYXk8bnVtYmVyPikge1xyXG5cdFx0dGhpcy5pbmRpY2VzID0gaW5kaWNlcztcclxuXHRcdGlmICghdGhpcy5pbmRleEJ1ZmZlcikgdGhpcy5pbmRleEJ1ZmZlciA9IG5ldyBJbmRleEJ1ZmZlcih0aGlzLnR5cGUgKyBcIkluZGV4QnVmZmVyXCIpO1xyXG5cdFx0dGhpcy5pbmRleEJ1ZmZlci5zZXRJbmRpY2VzKGluZGljZXMpO1xyXG5cdH1cclxuXHR1cGRhdGUoZnJhbWVTdGF0ZTogRnJhbWVTdGF0ZSkge1xyXG5cdFx0Ly8gdG9kb1xyXG5cdH1cclxuXHRjb21wdXRlQm91bmRpbmdTcGhlcmUocG9zaXRpb25zOiBudW1iZXJbXSwgc3RyaWRlID0gMykge1xyXG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IEJvdW5kaW5nU3BoZXJlLmZyb21WZXJ0aWNlcyhwb3NpdGlvbnMsIG5ldyBWZWN0b3IzKDAsIDAsIDApLCBzdHJpZGUpO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBDYWxjdWxhdGUgbWVzaCB0YW5nZW50LlxyXG5cdCAqIEByZW1hcmsgbmVlZCB0byBzZXQgcG9zaXRpb25zKHdpdGggb3Igbm90IHdpdGggaW5kaWNlcyksIG5vcm1hbHMsIHV2IGJlZm9yZSBjYWxjdWxhdGlvbi5cclxuXHQgKiBAcmVtYXJrIGJhc2VkIG9uIGh0dHA6Ly9mb3VuZGF0aW9uc29mZ2FtZWVuZ2luZWRldi5jb20vRkdFRDItc2FtcGxlLnBkZlxyXG5cdCAqL1xyXG5cdGNhbGN1bGF0ZVRhbmdlbnRzKCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLm5vcm1hbHMgfHwgIXRoaXMudXZzKSB7XHJcblx0XHRcdHRocm93IFwiU2V0IG5vcm1hbCBhbmQgdXYgYmVmb3JlIGNhbGN1bGF0aW9uLlwiO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgeyBpbmRpY2VzLCBwb3NpdGlvbnMsIG5vcm1hbHMsIHV2cyB9ID0gdGhpcztcclxuXHRcdGNvbnN0IHRlbXBQb3MwID0gbmV3IFZlY3RvcjMoKSxcclxuXHRcdFx0dGVtcFBvczEgPSBuZXcgVmVjdG9yMygpLFxyXG5cdFx0XHR0ZW1wUG9zMiA9IG5ldyBWZWN0b3IzKCksXHJcblx0XHRcdHRlbXBVVjAgPSBuZXcgVmVjdG9yMigpLFxyXG5cdFx0XHR0ZW1wVVYxID0gbmV3IFZlY3RvcjIoKSxcclxuXHRcdFx0dGVtcFVWMiA9IG5ldyBWZWN0b3IyKCk7XHJcblx0XHRjb25zdCBlMSA9IG5ldyBWZWN0b3IzKCksXHJcblx0XHRcdGUyID0gbmV3IFZlY3RvcjMoKSxcclxuXHRcdFx0dCA9IG5ldyBWZWN0b3IzKCksXHJcblx0XHRcdGIgPSBuZXcgVmVjdG9yMygpLFxyXG5cdFx0XHR0ZW1wID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IHZlcnRleENvdW50ID0gdGhpcy5pbmRpY2VzLmxlbmd0aDtcclxuXHRcdGNvbnN0IHRyaWFuZ2xlQ291bnQgPSBpbmRpY2VzID8gaW5kaWNlcy5sZW5ndGggLyAzIDogcG9zaXRpb25zLmxlbmd0aCAvIDM7XHJcblx0XHRjb25zdCB0YW5nZW50cyA9IG5ldyBBcnJheTxWZWN0b3I0Pih2ZXJ0ZXhDb3VudCk7XHJcblx0XHRjb25zdCBiaVRhbmdlbnRzID0gbmV3IEFycmF5PFZlY3RvcjM+KHZlcnRleENvdW50KTtcclxuXHRcdHRoaXMudGFuZ2VudHMgPSBbXTtcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKykge1xyXG5cdFx0XHR0YW5nZW50c1tpXSA9IG5ldyBWZWN0b3I0KCk7XHJcblx0XHRcdGJpVGFuZ2VudHNbaV0gPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENhbGN1bGF0ZSB0YW5nZW50IGFuZCBiaS10YW5nZW50IGZvciBlYWNoIHRyaWFuZ2xlIGFuZCBhZGQgdG8gYWxsIHRocmVlIHZlcnRpY2VzLlxyXG5cdFx0Zm9yIChsZXQgayA9IDA7IGsgPCB0cmlhbmdsZUNvdW50OyBrKyspIHtcclxuXHRcdFx0bGV0IGkwID0gMyAqIGs7XHJcblx0XHRcdGxldCBpMSA9IDMgKiBrICsgMTtcclxuXHRcdFx0bGV0IGkyID0gMyAqIGsgKyAyO1xyXG5cdFx0XHRpZiAoaW5kaWNlcykge1xyXG5cdFx0XHRcdGkwID0gaW5kaWNlc1tpMF07XHJcblx0XHRcdFx0aTEgPSBpbmRpY2VzW2kxXTtcclxuXHRcdFx0XHRpMiA9IGluZGljZXNbaTJdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBwMCA9IHRlbXBQb3MwLnNldChwb3NpdGlvbnNbaTBdLCBwb3NpdGlvbnNbaTAgKyAxXSwgcG9zaXRpb25zW2kwICsgMl0pO1xyXG5cdFx0XHRjb25zdCBwMSA9IHRlbXBQb3MxLnNldChwb3NpdGlvbnNbaTFdLCBwb3NpdGlvbnNbaTEgKyAxXSwgcG9zaXRpb25zW2kxICsgMl0pO1xyXG5cdFx0XHRjb25zdCBwMiA9IHRlbXBQb3MyLnNldChwb3NpdGlvbnNbaTJdLCBwb3NpdGlvbnNbaTIgKyAxXSwgcG9zaXRpb25zW2kyICsgMl0pO1xyXG5cdFx0XHRjb25zdCB3MCA9IHRlbXBVVjAuc2V0KHV2c1tpMF0sIHV2c1tpMCArIDFdKTtcclxuXHRcdFx0Y29uc3QgdzEgPSB0ZW1wVVYxLnNldCh1dnNbaTFdLCB1dnNbaTEgKyAxXSk7XHJcblx0XHRcdGNvbnN0IHcyID0gdGVtcFVWMi5zZXQodXZzW2kyXSwgdXZzW2kyICsgMV0pO1xyXG5cclxuXHRcdFx0VmVjdG9yMy5zdWJ0cmFjdChwMSwgcDAsIGUxKTtcclxuXHRcdFx0VmVjdG9yMy5zdWJ0cmFjdChwMiwgcDAsIGUyKTtcclxuXHRcdFx0Y29uc3QgeDEgPSB3MS54IC0gdzAueDtcclxuXHRcdFx0Y29uc3QgeDIgPSB3Mi54IC0gdzAueDtcclxuXHRcdFx0Y29uc3QgeTEgPSB3MS55IC0gdzAueTtcclxuXHRcdFx0Y29uc3QgeTIgPSB3Mi55IC0gdzAueTtcclxuXHRcdFx0Y29uc3QgciA9IDEuMCAvICh4MSAqIHkyIC0geDIgKiB5MSk7XHJcblxyXG5cdFx0XHRWZWN0b3IzLm11bHRpcGx5QnlTY2FsYXIoZTEsIHkyICogciwgdCk7XHJcblx0XHRcdFZlY3RvcjMubXVsdGlwbHlCeVNjYWxhcihlMiwgeTEgKiByLCB0ZW1wKTtcclxuXHRcdFx0VmVjdG9yMy5zdWJ0cmFjdCh0LCB0ZW1wLCB0KTtcclxuXHRcdFx0VmVjdG9yMy5tdWx0aXBseUJ5U2NhbGFyKGUyLCB4MSAqIHIsIGIpO1xyXG5cdFx0XHRWZWN0b3IzLm11bHRpcGx5QnlTY2FsYXIoZTEsIHgyICogciwgdGVtcCk7XHJcblx0XHRcdFZlY3RvcjMuc3VidHJhY3QoYiwgdGVtcCwgYik7XHJcblxyXG5cdFx0XHRsZXQgdGFuZ2VudCA9IHRhbmdlbnRzW2kwXTtcclxuXHRcdFx0dGFuZ2VudC5zZXQodGFuZ2VudC54ICsgdC54LCB0YW5nZW50LnkgKyB0LnksIHRhbmdlbnQueiArIHQueiwgMS4wKTtcclxuXHJcblx0XHRcdHRhbmdlbnQgPSB0YW5nZW50c1tpMV07XHJcblx0XHRcdHRhbmdlbnQuc2V0KHRhbmdlbnQueCArIHQueCwgdGFuZ2VudC55ICsgdC55LCB0YW5nZW50LnogKyB0LnosIDEuMCk7XHJcblxyXG5cdFx0XHR0YW5nZW50ID0gdGFuZ2VudHNbaTJdO1xyXG5cdFx0XHR0YW5nZW50LnNldCh0YW5nZW50LnggKyB0LngsIHRhbmdlbnQueSArIHQueSwgdGFuZ2VudC56ICsgdC56LCAxLjApO1xyXG5cdFx0XHRiaVRhbmdlbnRzW2kwXS5hZGQoYik7XHJcblx0XHRcdGJpVGFuZ2VudHNbaTFdLmFkZChiKTtcclxuXHRcdFx0YmlUYW5nZW50c1tpMl0uYWRkKGIpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE9ydGhvbm9ybWFsaXplIGVhY2ggdGFuZ2VudCBhbmQgY2FsY3VsYXRlIHRoZSBoYW5kZWRuZXNzLlxyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKSB7XHJcblx0XHRcdGNvbnN0IG4gPSBuZXcgVmVjdG9yMyhub3JtYWxzWzMgKiBpXSwgbm9ybWFsc1szICogaSArIDFdLCBub3JtYWxzWzMgKiBpICsgMl0pO1xyXG5cdFx0XHRjb25zdCBiID0gYmlUYW5nZW50c1tpXTtcclxuXHRcdFx0Y29uc3QgdGFuZ2VudCA9IHRhbmdlbnRzW2ldO1xyXG5cdFx0XHR0LnNldCh0YW5nZW50LngsIHRhbmdlbnQueSwgdGFuZ2VudC56KTtcclxuXHJcblx0XHRcdFZlY3RvcjMuY3Jvc3ModCwgYiwgdGVtcCk7XHJcblx0XHRcdGNvbnN0IHcgPSBWZWN0b3IzLmRvdCh0ZW1wLCBuKSA+IDAuMCA/IDEgOiAtMTtcclxuXHRcdFx0VmVjdG9yMy5tdWx0aXBseUJ5U2NhbGFyKG4sIFZlY3RvcjMuZG90KHQsIG4pLCB0ZW1wKTtcclxuXHRcdFx0VmVjdG9yMy5zdWJ0cmFjdCh0LCB0ZW1wLCB0KTtcclxuXHRcdFx0VmVjdG9yMy5ub3JtYWxpemUodCwgdCk7XHJcblx0XHRcdC8vIHQubm9ybWFsaXplKCk7XHJcblx0XHRcdHRhbmdlbnQuc2V0KHQueCwgdC55LCB0LnosIHcpO1xyXG5cdFx0XHR0aGlzLnRhbmdlbnRzLnB1c2godC54LCB0LnksIHQueiwgdyk7XHJcblx0XHR9XHJcblx0XHQvLyB0aGlzLnNldFRhbmdlbnRzKHRhbmdlbnRzKTtcclxuXHR9XHJcblx0ZGVzdHJveSgpIHtcclxuXHRcdHRoaXM/LmluZGV4QnVmZmVyLmRlc3Ryb3koKTtcclxuXHRcdHRoaXMuZGVmYXVsdFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XHJcblx0XHR0aGlzLm5vcm1hbHMgPSBudWxsO1xyXG5cdFx0dGhpcy51dnMgPSBudWxsO1xyXG5cdFx0dGhpcy5wb3NpdGlvbnMgPSBudWxsO1xyXG5cdFx0dGhpcy5pbmRpY2VzID0gbnVsbDtcclxuXHRcdHRoaXMudGFuZ2VudHMgPSBudWxsO1xyXG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IHVuZGVmaW5lZDtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IHsgRmxvYXQzMkF0dHJpYnV0ZSB9IGZyb20gXCIuLi9yZW5kZXIvQXR0cmlidXRlXCI7XHJcbmltcG9ydCBHZW9tZXRyeSBmcm9tIFwiLi9HZW9tZXRyeVwiO1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbGFuZUdlb21ldHJ5IGV4dGVuZHMgR2VvbWV0cnkge1xyXG5cdGNvbnN0cnVjdG9yKHB1YmxpYyB3aWR0aDogbnVtYmVyID0gMTAsIHB1YmxpYyBoZWlnaHQ6IG51bWJlciA9IDEwKSB7XHJcblx0XHRzdXBlcih7XHJcblx0XHRcdHR5cGU6IFwicGxhbmVHZW9tZXRyeVwiXHJcblx0XHR9KTtcclxuXHRcdHRoaXMuZGVmaW5lcyA9IHtcclxuXHRcdFx0SEFTX05PUk1BTDogdHJ1ZVxyXG5cdFx0fTtcclxuXHRcdHRoaXMuaW5pdCgpO1xyXG5cdH1cclxuXHRwcml2YXRlIGluaXQoKSB7XHJcblx0XHQvLyBnZW5lcmF0ZSBwb3MgdXYgbm9ybWFsIHNvIG9uXHJcblx0XHRjb25zdCB7IGluZGljZXMsIG5vcm1hbHMsIHV2cywgdmVydGljZXMgfSA9IHRoaXMuY3JlYXRlR3JpZCh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XHJcblx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSh2ZXJ0aWNlcyk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZShuZXcgRmxvYXQzMkF0dHJpYnV0ZShcInBvc2l0aW9uXCIsIHZlcnRpY2VzLCAzKSk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZShuZXcgRmxvYXQzMkF0dHJpYnV0ZShcIm5vcm1hbFwiLCBub3JtYWxzLCAzKSk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZShuZXcgRmxvYXQzMkF0dHJpYnV0ZShcInV2XCIsIHV2cywgMikpO1xyXG5cdFx0dGhpcy5zZXRJbmRpY2UoaW5kaWNlcyk7XHJcblx0XHR0aGlzLmNvdW50ID0gaW5kaWNlcy5sZW5ndGg7XHJcblx0fVxyXG5cdHByaXZhdGUgY3JlYXRlR3JpZCh3aWR0aCA9IDEsIGhlaWdodCA9IDEsIHdpZHRoU2VnbWVudHMgPSAxLCBoZWlnaHRTZWdtZW50cyA9IDEpIHtcclxuXHRcdGNvbnN0IHdpZHRoX2hhbGYgPSB3aWR0aCAvIDI7XHJcblx0XHRjb25zdCBoZWlnaHRfaGFsZiA9IGhlaWdodCAvIDI7XHJcblxyXG5cdFx0Y29uc3QgZ3JpZFggPSBNYXRoLmZsb29yKHdpZHRoU2VnbWVudHMpO1xyXG5cdFx0Y29uc3QgZ3JpZFkgPSBNYXRoLmZsb29yKGhlaWdodFNlZ21lbnRzKTtcclxuXHJcblx0XHRjb25zdCBncmlkWDEgPSBncmlkWCArIDE7XHJcblx0XHRjb25zdCBncmlkWTEgPSBncmlkWSArIDE7XHJcblxyXG5cdFx0Y29uc3Qgc2VnbWVudF93aWR0aCA9IHdpZHRoIC8gZ3JpZFg7XHJcblx0XHRjb25zdCBzZWdtZW50X2hlaWdodCA9IGhlaWdodCAvIGdyaWRZO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcclxuXHRcdGNvbnN0IHV2cyA9IFtdO1xyXG5cclxuXHRcdGZvciAobGV0IGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5KyspIHtcclxuXHRcdFx0Y29uc3QgeSA9IGl5ICogc2VnbWVudF9oZWlnaHQgLSBoZWlnaHRfaGFsZjtcclxuXHJcblx0XHRcdGZvciAobGV0IGl4ID0gMDsgaXggPCBncmlkWDE7IGl4KyspIHtcclxuXHRcdFx0XHRjb25zdCB4ID0gaXggKiBzZWdtZW50X3dpZHRoIC0gd2lkdGhfaGFsZjtcclxuXHJcblx0XHRcdFx0dmVydGljZXMucHVzaCh4LCAteSwgMCk7XHJcblxyXG5cdFx0XHRcdG5vcm1hbHMucHVzaCgwLCAwLCAxKTtcclxuXHJcblx0XHRcdFx0dXZzLnB1c2goaXggLyBncmlkWCk7XHJcblx0XHRcdFx0dXZzLnB1c2goMSAtIGl5IC8gZ3JpZFkpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yIChsZXQgaXkgPSAwOyBpeSA8IGdyaWRZOyBpeSsrKSB7XHJcblx0XHRcdGZvciAobGV0IGl4ID0gMDsgaXggPCBncmlkWDsgaXgrKykge1xyXG5cdFx0XHRcdGNvbnN0IGEgPSBpeCArIGdyaWRYMSAqIGl5O1xyXG5cdFx0XHRcdGNvbnN0IGIgPSBpeCArIGdyaWRYMSAqIChpeSArIDEpO1xyXG5cdFx0XHRcdGNvbnN0IGMgPSBpeCArIDEgKyBncmlkWDEgKiAoaXkgKyAxKTtcclxuXHRcdFx0XHRjb25zdCBkID0gaXggKyAxICsgZ3JpZFgxICogaXk7XHJcblxyXG5cdFx0XHRcdGluZGljZXMucHVzaChhLCBiLCBkKTtcclxuXHRcdFx0XHRpbmRpY2VzLnB1c2goYiwgYywgZCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiB7IGluZGljZXMsIG5vcm1hbHMsIHV2cywgdmVydGljZXMgfTtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IGRlZmF1bHRWYWx1ZSBmcm9tIFwiLi4vdXRpbHMvZGVmYXVsdFZhbHVlXCI7XHJcbmltcG9ydCBkZWZpbmVkIGZyb20gXCIuLi91dGlscy9kZWZpbmVkXCI7XHJcbmltcG9ydCBHTWF0aCBmcm9tIFwiLi9NYXRoXCI7XHJcbmltcG9ydCBNYXRyaXg0IGZyb20gXCIuL01hdHJpeDRcIjtcclxuaW1wb3J0IFZlY3RvcjMgZnJvbSBcIi4vVmVjdG9yM1wiO1xyXG4vKipcclxuICogQSBzZXQgb2YgNC1kaW1lbnNpb25hbCBjb29yZGluYXRlcyB1c2VkIHRvIHJlcHJlc2VudCByb3RhdGlvbiBpbiAzLWRpbWVuc2lvbmFsIHNwYWNlLlxyXG4gKiBAYWxpYXMgUXVhdGVybmlvblxyXG4gKiBAY29uc3RydWN0b3JcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IFt4PTAuMF0gVGhlIFggY29tcG9uZW50LlxyXG4gKiBAcGFyYW0ge051bWJlcn0gW3k9MC4wXSBUaGUgWSBjb21wb25lbnQuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBbej0wLjBdIFRoZSBaIGNvbXBvbmVudC5cclxuICogQHBhcmFtIHtOdW1iZXJ9IFt3PTAuMF0gVGhlIFcgY29tcG9uZW50LlxyXG4gKlxyXG4gKiBAc2VlIFBhY2thYmxlRm9ySW50ZXJwb2xhdGlvblxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFF1YXRlcm5pb24ge1xyXG5cdHB1YmxpYyBzdGF0aWMgWkVSTyA9IE9iamVjdC5mcmVlemUobmV3IFF1YXRlcm5pb24oMC4wLCAwLjAsIDAuMCwgMC4wKSk7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgSURFTlRJVFkgPSBPYmplY3QuZnJlZXplKG5ldyBRdWF0ZXJuaW9uKDAuMCwgMC4wLCAwLjAsIDEuMCkpO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihwdWJsaWMgeDogbnVtYmVyID0gMCwgcHVibGljIHk6IG51bWJlciA9IDAsIHB1YmxpYyB6OiBudW1iZXIgPSAwLCBwdWJsaWMgdzogbnVtYmVyID0gMSkge31cclxuXHRzZXQoeCwgeSwgeiwgdykge1xyXG5cdFx0dGhpcy54ID0geDtcclxuXHRcdHRoaXMueSA9IHk7XHJcblx0XHR0aGlzLnogPSB6O1xyXG5cdFx0dGhpcy53ID0gdztcclxuXHR9XHJcblx0bm9ybWFsaXplKCkge1xyXG5cdFx0Y29uc3QgaW52ZXJzZU1hZ25pdHVkZSA9IDEuMCAvIFF1YXRlcm5pb24ubWFnbml0dWRlKHRoaXMpO1xyXG5cdFx0Y29uc3QgeCA9IHRoaXMueCAqIGludmVyc2VNYWduaXR1ZGU7XHJcblx0XHRjb25zdCB5ID0gdGhpcy55ICogaW52ZXJzZU1hZ25pdHVkZTtcclxuXHRcdGNvbnN0IHogPSB0aGlzLnogKiBpbnZlcnNlTWFnbml0dWRlO1xyXG5cdFx0Y29uc3QgdyA9IHRoaXMudyAqIGludmVyc2VNYWduaXR1ZGU7XHJcblxyXG5cdFx0dGhpcy54ID0geDtcclxuXHRcdHRoaXMueSA9IHk7XHJcblx0XHR0aGlzLnogPSB6O1xyXG5cdFx0dGhpcy53ID0gdztcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHRpbnZlcnQoKSB7XHJcblx0XHR0aGlzLnggKj0gLTE7XHJcblx0XHR0aGlzLnkgKj0gLTE7XHJcblx0XHR0aGlzLnogKj0gLTE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cdGRvdCh2OiBRdWF0ZXJuaW9uKTogbnVtYmVyIHtcclxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2LnkgKyB0aGlzLnogKiB2LnogKyB0aGlzLncgKiB2Lnc7XHJcblx0fVxyXG5cdHNldEZyb21Vbml0VmVjdG9ycyh2RnJvbTogVmVjdG9yMywgdlRvOiBWZWN0b3IzKTogUXVhdGVybmlvbiB7XHJcblx0XHQvLyBhc3N1bWVzIGRpcmVjdGlvbiB2ZWN0b3JzIHZGcm9tIGFuZCB2VG8gYXJlIG5vcm1hbGl6ZWRcclxuXHRcdGxldCByID0gVmVjdG9yMy5kb3QodkZyb20sIHZUbykgKyAxO1xyXG5cdFx0aWYgKHIgPCBOdW1iZXIuRVBTSUxPTikge1xyXG5cdFx0XHQvLyB2RnJvbSBhbmQgdlRvIHBvaW50IGluIG9wcG9zaXRlIGRpcmVjdGlvbnNcclxuXHJcblx0XHRcdHIgPSAwO1xyXG5cclxuXHRcdFx0aWYgKE1hdGguYWJzKHZGcm9tLngpID4gTWF0aC5hYnModkZyb20ueikpIHtcclxuXHRcdFx0XHR0aGlzLnggPSAtdkZyb20ueTtcclxuXHRcdFx0XHR0aGlzLnkgPSB2RnJvbS54O1xyXG5cdFx0XHRcdHRoaXMueiA9IDA7XHJcblx0XHRcdFx0dGhpcy53ID0gcjtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnggPSAwO1xyXG5cdFx0XHRcdHRoaXMueSA9IC12RnJvbS56O1xyXG5cdFx0XHRcdHRoaXMueiA9IHZGcm9tLnk7XHJcblx0XHRcdFx0dGhpcy53ID0gcjtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gY3Jvc3NWZWN0b3JzKCB2RnJvbSwgdlRvICk7IC8vIGlubGluZWQgdG8gYXZvaWQgY3ljbGljIGRlcGVuZGVuY3kgb24gVmVjdG9yM1xyXG5cclxuXHRcdFx0dGhpcy54ID0gdkZyb20ueSAqIHZUby56IC0gdkZyb20ueiAqIHZUby55O1xyXG5cdFx0XHR0aGlzLnkgPSB2RnJvbS56ICogdlRvLnggLSB2RnJvbS54ICogdlRvLno7XHJcblx0XHRcdHRoaXMueiA9IHZGcm9tLnggKiB2VG8ueSAtIHZGcm9tLnkgKiB2VG8ueDtcclxuXHRcdFx0dGhpcy53ID0gcjtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcclxuXHR9XHJcblx0c2V0RnJvbVJvdGF0aW9uTWF0cml4KG1hdHJpeDogTWF0cml4NCk6IFF1YXRlcm5pb24ge1xyXG5cdFx0Y29uc3QgdGUgPSBtYXRyaXgsXHJcblx0XHRcdG0xMSA9IHRlWzBdLFxyXG5cdFx0XHRtMTIgPSB0ZVs0XSxcclxuXHRcdFx0bTEzID0gdGVbOF0sXHJcblx0XHRcdG0yMSA9IHRlWzFdLFxyXG5cdFx0XHRtMjIgPSB0ZVs1XSxcclxuXHRcdFx0bTIzID0gdGVbOV0sXHJcblx0XHRcdG0zMSA9IHRlWzJdLFxyXG5cdFx0XHRtMzIgPSB0ZVs2XSxcclxuXHRcdFx0bTMzID0gdGVbMTBdLFxyXG5cdFx0XHR0cmFjZSA9IG0xMSArIG0yMiArIG0zMztcclxuXHJcblx0XHRpZiAodHJhY2UgPiAwKSB7XHJcblx0XHRcdGNvbnN0IHMgPSAwLjUgLyBNYXRoLnNxcnQodHJhY2UgKyAxLjApO1xyXG5cclxuXHRcdFx0dGhpcy53ID0gMC4yNSAvIHM7XHJcblx0XHRcdHRoaXMueCA9IChtMzIgLSBtMjMpICogcztcclxuXHRcdFx0dGhpcy55ID0gKG0xMyAtIG0zMSkgKiBzO1xyXG5cdFx0XHR0aGlzLnogPSAobTIxIC0gbTEyKSAqIHM7XHJcblx0XHR9IGVsc2UgaWYgKG0xMSA+IG0yMiAmJiBtMTEgPiBtMzMpIHtcclxuXHRcdFx0Y29uc3QgcyA9IDIuMCAqIE1hdGguc3FydCgxLjAgKyBtMTEgLSBtMjIgLSBtMzMpO1xyXG5cclxuXHRcdFx0dGhpcy53ID0gKG0zMiAtIG0yMykgLyBzO1xyXG5cdFx0XHR0aGlzLnggPSAwLjI1ICogcztcclxuXHRcdFx0dGhpcy55ID0gKG0xMiArIG0yMSkgLyBzO1xyXG5cdFx0XHR0aGlzLnogPSAobTEzICsgbTMxKSAvIHM7XHJcblx0XHR9IGVsc2UgaWYgKG0yMiA+IG0zMykge1xyXG5cdFx0XHRjb25zdCBzID0gMi4wICogTWF0aC5zcXJ0KDEuMCArIG0yMiAtIG0xMSAtIG0zMyk7XHJcblxyXG5cdFx0XHR0aGlzLncgPSAobTEzIC0gbTMxKSAvIHM7XHJcblx0XHRcdHRoaXMueCA9IChtMTIgKyBtMjEpIC8gcztcclxuXHRcdFx0dGhpcy55ID0gMC4yNSAqIHM7XHJcblx0XHRcdHRoaXMueiA9IChtMjMgKyBtMzIpIC8gcztcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNvbnN0IHMgPSAyLjAgKiBNYXRoLnNxcnQoMS4wICsgbTMzIC0gbTExIC0gbTIyKTtcclxuXHJcblx0XHRcdHRoaXMudyA9IChtMjEgLSBtMTIpIC8gcztcclxuXHRcdFx0dGhpcy54ID0gKG0xMyArIG0zMSkgLyBzO1xyXG5cdFx0XHR0aGlzLnkgPSAobTIzICsgbTMyKSAvIHM7XHJcblx0XHRcdHRoaXMueiA9IDAuMjUgKiBzO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cdGNsb25lKCkge1xyXG5cdFx0cmV0dXJuIFF1YXRlcm5pb24uY2xvbmUodGhpcywgdGhpcyk7XHJcblx0fVxyXG5cclxuXHRlcXVhbHMocmlnaHQ6IFF1YXRlcm5pb24pOiBib29sZWFuIHtcclxuXHRcdHJldHVybiBRdWF0ZXJuaW9uLmVxdWFscyh0aGlzLCByaWdodCk7XHJcblx0fVxyXG5cclxuXHRlcXVhbHNFcHNpbG9uKHJpZ2h0OiBRdWF0ZXJuaW9uLCBlcHNpbG9uID0gMCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIFF1YXRlcm5pb24uZXF1YWxzRXBzaWxvbih0aGlzLCByaWdodCwgZXBzaWxvbik7XHJcblx0fVxyXG5cdHRvQXJyYXkoKTogbnVtYmVyW10ge1xyXG5cdFx0Y29uc3QgeyB4LCB5LCB6LCB3IH0gPSB0aGlzO1xyXG5cdFx0cmV0dXJuIFt4LCB5LCB6LCB3XTtcclxuXHR9XHJcblx0c3RhdGljIGZyb21BeGlzQW5nbGUoYXhpczogVmVjdG9yMywgYW5nbGU6IG51bWJlcik6IFF1YXRlcm5pb24ge1xyXG5cdFx0Y29uc3QgaGFsZkFuZ2xlID0gYW5nbGUgLyAyLjA7XHJcblx0XHRjb25zdCBzID0gTWF0aC5zaW4oaGFsZkFuZ2xlKTtcclxuXHRcdGZyb21BeGlzQW5nbGVTY3JhdGNoID0gVmVjdG9yMy5ub3JtYWxpemUoYXhpcywgZnJvbUF4aXNBbmdsZVNjcmF0Y2gpO1xyXG5cclxuXHRcdGNvbnN0IHggPSBmcm9tQXhpc0FuZ2xlU2NyYXRjaC54ICogcztcclxuXHRcdGNvbnN0IHkgPSBmcm9tQXhpc0FuZ2xlU2NyYXRjaC55ICogcztcclxuXHRcdGNvbnN0IHogPSBmcm9tQXhpc0FuZ2xlU2NyYXRjaC56ICogcztcclxuXHRcdGNvbnN0IHcgPSBNYXRoLmNvcyhoYWxmQW5nbGUpO1xyXG5cdFx0Ly8gaWYgKCFkZWZpbmVkKHJlc3VsdCkpIHtcclxuXHRcdC8vICAgcmV0dXJuXHJcblx0XHQvLyB9XHJcblx0XHRjb25zdCByZXN1bHQgPSBuZXcgUXVhdGVybmlvbih4LCB5LCB6LCB3KTtcclxuXHRcdHJlc3VsdC54ID0geDtcclxuXHRcdHJlc3VsdC55ID0geTtcclxuXHRcdHJlc3VsdC56ID0gejtcclxuXHRcdHJlc3VsdC53ID0gdztcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHQvLyBzdGF0aWMgZnJvbVJvdGF0aW9uTWF0cml4KG1hdHJpeDogTWF0cml4MywgcmVzdWx0OiBRdWF0ZXJuaW9uKTogUXVhdGVybmlvbiB7XHJcblx0Ly8gXHRsZXQgcm9vdDtcclxuXHQvLyBcdGxldCB4O1xyXG5cdC8vIFx0bGV0IHk7XHJcblx0Ly8gXHRsZXQgejtcclxuXHQvLyBcdGxldCB3O1xyXG5cclxuXHQvLyBcdGNvbnN0IG0wMCA9IG1hdHJpeFtNYXRyaXgzLkNPTFVNTjBST1cwXTtcclxuXHQvLyBcdGNvbnN0IG0xMSA9IG1hdHJpeFtNYXRyaXgzLkNPTFVNTjFST1cxXTtcclxuXHQvLyBcdGNvbnN0IG0yMiA9IG1hdHJpeFtNYXRyaXgzLkNPTFVNTjJST1cyXTtcclxuXHQvLyBcdGNvbnN0IHRyYWNlID0gbTAwICsgbTExICsgbTIyO1xyXG5cclxuXHQvLyBcdGlmICh0cmFjZSA+IDAuMCkge1xyXG5cdC8vIFx0XHQvLyB8d3wgPiAxLzIsIG1heSBhcyB3ZWxsIGNob29zZSB3ID4gMS8yXHJcblx0Ly8gXHRcdHJvb3QgPSBNYXRoLnNxcnQodHJhY2UgKyAxLjApOyAvLyAyd1xyXG5cdC8vIFx0XHR3ID0gMC41ICogcm9vdDtcclxuXHQvLyBcdFx0cm9vdCA9IDAuNSAvIHJvb3Q7IC8vIDEvKDR3KVxyXG5cclxuXHQvLyBcdFx0eCA9IChtYXRyaXhbTWF0cml4My5DT0xVTU4xUk9XMl0gLSBtYXRyaXhbTWF0cml4My5DT0xVTU4yUk9XMV0pICogcm9vdDtcclxuXHQvLyBcdFx0eSA9IChtYXRyaXhbTWF0cml4My5DT0xVTU4yUk9XMF0gLSBtYXRyaXhbTWF0cml4My5DT0xVTU4wUk9XMl0pICogcm9vdDtcclxuXHQvLyBcdFx0eiA9IChtYXRyaXhbTWF0cml4My5DT0xVTU4wUk9XMV0gLSBtYXRyaXhbTWF0cml4My5DT0xVTU4xUk9XMF0pICogcm9vdDtcclxuXHQvLyBcdH0gZWxzZSB7XHJcblx0Ly8gXHRcdC8vIHx3fCA8PSAxLzJcclxuXHQvLyBcdFx0Y29uc3QgbmV4dCA9IGZyb21Sb3RhdGlvbk1hdHJpeE5leHQ7XHJcblxyXG5cdC8vIFx0XHRsZXQgaSA9IDA7XHJcblx0Ly8gXHRcdGlmIChtMTEgPiBtMDApIHtcclxuXHQvLyBcdFx0XHRpID0gMTtcclxuXHQvLyBcdFx0fVxyXG5cdC8vIFx0XHRpZiAobTIyID4gbTAwICYmIG0yMiA+IG0xMSkge1xyXG5cdC8vIFx0XHRcdGkgPSAyO1xyXG5cdC8vIFx0XHR9XHJcblx0Ly8gXHRcdGNvbnN0IGogPSBuZXh0W2ldO1xyXG5cdC8vIFx0XHRjb25zdCBrID0gbmV4dFtqXTtcclxuXHJcblx0Ly8gXHRcdHJvb3QgPSBNYXRoLnNxcnQoXHJcblx0Ly8gXHRcdFx0bWF0cml4W01hdHJpeDMuZ2V0RWxlbWVudEluZGV4KGksIGkpXSAtXHJcblx0Ly8gXHRcdFx0XHRtYXRyaXhbTWF0cml4My5nZXRFbGVtZW50SW5kZXgoaiwgaildIC1cclxuXHQvLyBcdFx0XHRcdG1hdHJpeFtNYXRyaXgzLmdldEVsZW1lbnRJbmRleChrLCBrKV0gK1xyXG5cdC8vIFx0XHRcdFx0MS4wXHJcblx0Ly8gXHRcdCk7XHJcblxyXG5cdC8vIFx0XHRjb25zdCBxdWF0ID0gZnJvbVJvdGF0aW9uTWF0cml4UXVhdDtcclxuXHQvLyBcdFx0cXVhdFtpXSA9IDAuNSAqIHJvb3Q7XHJcblx0Ly8gXHRcdHJvb3QgPSAwLjUgLyByb290O1xyXG5cdC8vIFx0XHR3ID0gKG1hdHJpeFtNYXRyaXgzLmdldEVsZW1lbnRJbmRleChrLCBqKV0gLSBtYXRyaXhbTWF0cml4My5nZXRFbGVtZW50SW5kZXgoaiwgayldKSAqIHJvb3Q7XHJcblx0Ly8gXHRcdHF1YXRbal0gPSAobWF0cml4W01hdHJpeDMuZ2V0RWxlbWVudEluZGV4KGosIGkpXSArIG1hdHJpeFtNYXRyaXgzLmdldEVsZW1lbnRJbmRleChpLCBqKV0pICogcm9vdDtcclxuXHQvLyBcdFx0cXVhdFtrXSA9IChtYXRyaXhbTWF0cml4My5nZXRFbGVtZW50SW5kZXgoaywgaSldICsgbWF0cml4W01hdHJpeDMuZ2V0RWxlbWVudEluZGV4KGksIGspXSkgKiByb290O1xyXG5cclxuXHQvLyBcdFx0eCA9IC1xdWF0WzBdO1xyXG5cdC8vIFx0XHR5ID0gLXF1YXRbMV07XHJcblx0Ly8gXHRcdHogPSAtcXVhdFsyXTtcclxuXHQvLyBcdH1cclxuXHJcblx0Ly8gXHRpZiAoIWRlZmluZWQocmVzdWx0KSkge1xyXG5cdC8vIFx0XHRyZXR1cm4gbmV3IFF1YXRlcm5pb24oeCwgeSwgeiwgdyk7XHJcblx0Ly8gXHR9XHJcblx0Ly8gXHRyZXN1bHQueCA9IHg7XHJcblx0Ly8gXHRyZXN1bHQueSA9IHk7XHJcblx0Ly8gXHRyZXN1bHQueiA9IHo7XHJcblx0Ly8gXHRyZXN1bHQudyA9IHc7XHJcblx0Ly8gXHRyZXR1cm4gcmVzdWx0O1xyXG5cdC8vIH1cclxuXHJcblx0c3RhdGljIGNsb25lKHF1YXRlcm5pb246IFF1YXRlcm5pb24sIHJlc3VsdDogUXVhdGVybmlvbik6IFF1YXRlcm5pb24ge1xyXG5cdFx0aWYgKCFkZWZpbmVkKHF1YXRlcm5pb24pKSB7XHJcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCFkZWZpbmVkKHJlc3VsdCkpIHtcclxuXHRcdFx0cmV0dXJuIG5ldyBRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udyk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmVzdWx0LnggPSBxdWF0ZXJuaW9uLng7XHJcblx0XHRyZXN1bHQueSA9IHF1YXRlcm5pb24ueTtcclxuXHRcdHJlc3VsdC56ID0gcXVhdGVybmlvbi56O1xyXG5cdFx0cmVzdWx0LncgPSBxdWF0ZXJuaW9uLnc7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGNvbmp1Z2F0ZShxdWF0ZXJuaW9uOiBRdWF0ZXJuaW9uLCByZXN1bHQ6IFF1YXRlcm5pb24pOiBRdWF0ZXJuaW9uIHtcclxuXHRcdHJlc3VsdC54ID0gLXF1YXRlcm5pb24ueDtcclxuXHRcdHJlc3VsdC55ID0gLXF1YXRlcm5pb24ueTtcclxuXHRcdHJlc3VsdC56ID0gLXF1YXRlcm5pb24uejtcclxuXHRcdHJlc3VsdC53ID0gcXVhdGVybmlvbi53O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtYWduaXR1ZGVTcXVhcmVkKHF1YXRlcm5pb246IFF1YXRlcm5pb24pOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIChcclxuXHRcdFx0cXVhdGVybmlvbi54ICogcXVhdGVybmlvbi54ICtcclxuXHRcdFx0cXVhdGVybmlvbi55ICogcXVhdGVybmlvbi55ICtcclxuXHRcdFx0cXVhdGVybmlvbi56ICogcXVhdGVybmlvbi56ICtcclxuXHRcdFx0cXVhdGVybmlvbi53ICogcXVhdGVybmlvbi53XHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG1hZ25pdHVkZShxdWF0ZXJuaW9uOiBRdWF0ZXJuaW9uKTogbnVtYmVyIHtcclxuXHRcdHJldHVybiBNYXRoLnNxcnQoUXVhdGVybmlvbi5tYWduaXR1ZGVTcXVhcmVkKHF1YXRlcm5pb24pKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBub3JtYWxpemUocXVhdGVybmlvbjogUXVhdGVybmlvbiwgcmVzdWx0OiBRdWF0ZXJuaW9uKTogUXVhdGVybmlvbiB7XHJcblx0XHRjb25zdCBpbnZlcnNlTWFnbml0dWRlID0gMS4wIC8gUXVhdGVybmlvbi5tYWduaXR1ZGUocXVhdGVybmlvbik7XHJcblx0XHRjb25zdCB4ID0gcXVhdGVybmlvbi54ICogaW52ZXJzZU1hZ25pdHVkZTtcclxuXHRcdGNvbnN0IHkgPSBxdWF0ZXJuaW9uLnkgKiBpbnZlcnNlTWFnbml0dWRlO1xyXG5cdFx0Y29uc3QgeiA9IHF1YXRlcm5pb24ueiAqIGludmVyc2VNYWduaXR1ZGU7XHJcblx0XHRjb25zdCB3ID0gcXVhdGVybmlvbi53ICogaW52ZXJzZU1hZ25pdHVkZTtcclxuXHJcblx0XHRyZXN1bHQueCA9IHg7XHJcblx0XHRyZXN1bHQueSA9IHk7XHJcblx0XHRyZXN1bHQueiA9IHo7XHJcblx0XHRyZXN1bHQudyA9IHc7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGludmVyc2UocXVhdGVybmlvbjogUXVhdGVybmlvbiwgcmVzdWx0OiBRdWF0ZXJuaW9uKTogUXVhdGVybmlvbiB7XHJcblx0XHRjb25zdCBtYWduaXR1ZGVTcXVhcmVkID0gUXVhdGVybmlvbi5tYWduaXR1ZGVTcXVhcmVkKHF1YXRlcm5pb24pO1xyXG5cdFx0cmVzdWx0ID0gUXVhdGVybmlvbi5jb25qdWdhdGUocXVhdGVybmlvbiwgcmVzdWx0KTtcclxuXHRcdHJldHVybiBRdWF0ZXJuaW9uLm11bHRpcGx5QnlTY2FsYXIocmVzdWx0LCAxLjAgLyBtYWduaXR1ZGVTcXVhcmVkLCByZXN1bHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGFkZChsZWZ0OiBRdWF0ZXJuaW9uLCByaWdodDogUXVhdGVybmlvbiwgcmVzdWx0OiBRdWF0ZXJuaW9uKTogUXVhdGVybmlvbiB7XHJcblx0XHRyZXN1bHQueCA9IGxlZnQueCArIHJpZ2h0Lng7XHJcblx0XHRyZXN1bHQueSA9IGxlZnQueSArIHJpZ2h0Lnk7XHJcblx0XHRyZXN1bHQueiA9IGxlZnQueiArIHJpZ2h0Lno7XHJcblx0XHRyZXN1bHQudyA9IGxlZnQudyArIHJpZ2h0Lnc7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHN1YnRyYWN0KGxlZnQ6IFF1YXRlcm5pb24sIHJpZ2h0OiBRdWF0ZXJuaW9uLCByZXN1bHQ6IFF1YXRlcm5pb24pOiBRdWF0ZXJuaW9uIHtcclxuXHRcdHJlc3VsdC54ID0gbGVmdC54IC0gcmlnaHQueDtcclxuXHRcdHJlc3VsdC55ID0gbGVmdC55IC0gcmlnaHQueTtcclxuXHRcdHJlc3VsdC56ID0gbGVmdC56IC0gcmlnaHQuejtcclxuXHRcdHJlc3VsdC53ID0gbGVmdC53IC0gcmlnaHQudztcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbmVnYXRlKHF1YXRlcm5pb246IFF1YXRlcm5pb24sIHJlc3VsdDogUXVhdGVybmlvbik6IFF1YXRlcm5pb24ge1xyXG5cdFx0cmVzdWx0LnggPSAtcXVhdGVybmlvbi54O1xyXG5cdFx0cmVzdWx0LnkgPSAtcXVhdGVybmlvbi55O1xyXG5cdFx0cmVzdWx0LnogPSAtcXVhdGVybmlvbi56O1xyXG5cdFx0cmVzdWx0LncgPSAtcXVhdGVybmlvbi53O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBkb3QobGVmdDogUXVhdGVybmlvbiwgcmlnaHQ6IFF1YXRlcm5pb24pOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIGxlZnQueCAqIHJpZ2h0LnggKyBsZWZ0LnkgKiByaWdodC55ICsgbGVmdC56ICogcmlnaHQueiArIGxlZnQudyAqIHJpZ2h0Lnc7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbXVsdGlwbHkobGVmdDogUXVhdGVybmlvbiwgcmlnaHQ6IFF1YXRlcm5pb24sIHJlc3VsdDogUXVhdGVybmlvbik6IFF1YXRlcm5pb24ge1xyXG5cdFx0Y29uc3QgbGVmdFggPSBsZWZ0Lng7XHJcblx0XHRjb25zdCBsZWZ0WSA9IGxlZnQueTtcclxuXHRcdGNvbnN0IGxlZnRaID0gbGVmdC56O1xyXG5cdFx0Y29uc3QgbGVmdFcgPSBsZWZ0Lnc7XHJcblxyXG5cdFx0Y29uc3QgcmlnaHRYID0gcmlnaHQueDtcclxuXHRcdGNvbnN0IHJpZ2h0WSA9IHJpZ2h0Lnk7XHJcblx0XHRjb25zdCByaWdodFogPSByaWdodC56O1xyXG5cdFx0Y29uc3QgcmlnaHRXID0gcmlnaHQudztcclxuXHJcblx0XHRjb25zdCB4ID0gbGVmdFcgKiByaWdodFggKyBsZWZ0WCAqIHJpZ2h0VyArIGxlZnRZICogcmlnaHRaIC0gbGVmdFogKiByaWdodFk7XHJcblx0XHRjb25zdCB5ID0gbGVmdFcgKiByaWdodFkgLSBsZWZ0WCAqIHJpZ2h0WiArIGxlZnRZICogcmlnaHRXICsgbGVmdFogKiByaWdodFg7XHJcblx0XHRjb25zdCB6ID0gbGVmdFcgKiByaWdodFogKyBsZWZ0WCAqIHJpZ2h0WSAtIGxlZnRZICogcmlnaHRYICsgbGVmdFogKiByaWdodFc7XHJcblx0XHRjb25zdCB3ID0gbGVmdFcgKiByaWdodFcgLSBsZWZ0WCAqIHJpZ2h0WCAtIGxlZnRZICogcmlnaHRZIC0gbGVmdFogKiByaWdodFo7XHJcblxyXG5cdFx0cmVzdWx0LnggPSB4O1xyXG5cdFx0cmVzdWx0LnkgPSB5O1xyXG5cdFx0cmVzdWx0LnogPSB6O1xyXG5cdFx0cmVzdWx0LncgPSB3O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtdWx0aXBseUJ5U2NhbGFyKHF1YXRlcm5pb246IFF1YXRlcm5pb24sIHNjYWxhcjogbnVtYmVyLCByZXN1bHQ6IFF1YXRlcm5pb24pOiBRdWF0ZXJuaW9uIHtcclxuXHRcdHJlc3VsdC54ID0gcXVhdGVybmlvbi54ICogc2NhbGFyO1xyXG5cdFx0cmVzdWx0LnkgPSBxdWF0ZXJuaW9uLnkgKiBzY2FsYXI7XHJcblx0XHRyZXN1bHQueiA9IHF1YXRlcm5pb24ueiAqIHNjYWxhcjtcclxuXHRcdHJlc3VsdC53ID0gcXVhdGVybmlvbi53ICogc2NhbGFyO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBkaXZpZGVCeVNjYWxhcihxdWF0ZXJuaW9uOiBRdWF0ZXJuaW9uLCBzY2FsYXI6IG51bWJlciwgcmVzdWx0OiBRdWF0ZXJuaW9uKTogUXVhdGVybmlvbiB7XHJcblx0XHRyZXN1bHQueCA9IHF1YXRlcm5pb24ueCAvIHNjYWxhcjtcclxuXHRcdHJlc3VsdC55ID0gcXVhdGVybmlvbi55IC8gc2NhbGFyO1xyXG5cdFx0cmVzdWx0LnogPSBxdWF0ZXJuaW9uLnogLyBzY2FsYXI7XHJcblx0XHRyZXN1bHQudyA9IHF1YXRlcm5pb24udyAvIHNjYWxhcjtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgY29tcHV0ZUF4aXMocXVhdGVybmlvbjogUXVhdGVybmlvbiwgcmVzdWx0OiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcblx0XHRjb25zdCB3ID0gcXVhdGVybmlvbi53O1xyXG5cdFx0aWYgKE1hdGguYWJzKHcgLSAxLjApIDwgR01hdGguRVBTSUxPTjYpIHtcclxuXHRcdFx0cmVzdWx0LnggPSByZXN1bHQueSA9IHJlc3VsdC56ID0gMDtcclxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBzY2FsYXIgPSAxLjAgLyBNYXRoLnNxcnQoMS4wIC0gdyAqIHcpO1xyXG5cclxuXHRcdHJlc3VsdC54ID0gcXVhdGVybmlvbi54ICogc2NhbGFyO1xyXG5cdFx0cmVzdWx0LnkgPSBxdWF0ZXJuaW9uLnkgKiBzY2FsYXI7XHJcblx0XHRyZXN1bHQueiA9IHF1YXRlcm5pb24ueiAqIHNjYWxhcjtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgY29tcHV0ZUFuZ2xlKHF1YXRlcm5pb246IFF1YXRlcm5pb24pOiBudW1iZXIge1xyXG5cdFx0aWYgKE1hdGguYWJzKHF1YXRlcm5pb24udyAtIDEuMCkgPCBHTWF0aC5FUFNJTE9ONikge1xyXG5cdFx0XHRyZXR1cm4gMC4wO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIDIuMCAqIE1hdGguYWNvcyhxdWF0ZXJuaW9uLncpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGxlcnAoc3RhcnQ6IFF1YXRlcm5pb24sIGVuZDogUXVhdGVybmlvbiwgdDogbnVtYmVyLCByZXN1bHQ6IFF1YXRlcm5pb24pOiBRdWF0ZXJuaW9uIHtcclxuXHRcdGxlcnBTY3JhdGNoID0gUXVhdGVybmlvbi5tdWx0aXBseUJ5U2NhbGFyKGVuZCwgdCwgbGVycFNjcmF0Y2gpO1xyXG5cdFx0cmVzdWx0ID0gUXVhdGVybmlvbi5tdWx0aXBseUJ5U2NhbGFyKHN0YXJ0LCAxLjAgLSB0LCByZXN1bHQpO1xyXG5cdFx0cmV0dXJuIFF1YXRlcm5pb24uYWRkKGxlcnBTY3JhdGNoLCByZXN1bHQsIHJlc3VsdCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgc2xlcnAoc3RhcnQ6IFF1YXRlcm5pb24sIGVuZDogUXVhdGVybmlvbiwgdDogbnVtYmVyLCByZXN1bHQ6IFF1YXRlcm5pb24pOiBRdWF0ZXJuaW9uIHtcclxuXHRcdGxldCBkb3QgPSBRdWF0ZXJuaW9uLmRvdChzdGFydCwgZW5kKTtcclxuXHJcblx0XHQvLyBUaGUgYW5nbGUgYmV0d2VlbiBzdGFydCBtdXN0IGJlIGFjdXRlLiBTaW5jZSBxIGFuZCAtcSByZXByZXNlbnRcclxuXHRcdC8vIHRoZSBzYW1lIHJvdGF0aW9uLCBuZWdhdGUgcSB0byBnZXQgdGhlIGFjdXRlIGFuZ2xlLlxyXG5cdFx0bGV0IHIgPSBlbmQ7XHJcblx0XHRpZiAoZG90IDwgMC4wKSB7XHJcblx0XHRcdGRvdCA9IC1kb3Q7XHJcblx0XHRcdHIgPSBzbGVycEVuZE5lZ2F0ZWQgPSBRdWF0ZXJuaW9uLm5lZ2F0ZShlbmQsIHNsZXJwRW5kTmVnYXRlZCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZG90ID4gMCwgYXMgdGhlIGRvdCBwcm9kdWN0IGFwcHJvYWNoZXMgMSwgdGhlIGFuZ2xlIGJldHdlZW4gdGhlXHJcblx0XHQvLyBxdWF0ZXJuaW9ucyB2YW5pc2hlcy4gdXNlIGxpbmVhciBpbnRlcnBvbGF0aW9uLlxyXG5cdFx0aWYgKDEuMCAtIGRvdCA8IEdNYXRoLkVQU0lMT042KSB7XHJcblx0XHRcdHJldHVybiBRdWF0ZXJuaW9uLmxlcnAoc3RhcnQsIHIsIHQsIHJlc3VsdCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdGhldGEgPSBNYXRoLmFjb3MoZG90KTtcclxuXHRcdHNsZXJwU2NhbGVkUCA9IFF1YXRlcm5pb24ubXVsdGlwbHlCeVNjYWxhcihzdGFydCwgTWF0aC5zaW4oKDEgLSB0KSAqIHRoZXRhKSwgc2xlcnBTY2FsZWRQKTtcclxuXHRcdHNsZXJwU2NhbGVkUiA9IFF1YXRlcm5pb24ubXVsdGlwbHlCeVNjYWxhcihyLCBNYXRoLnNpbih0ICogdGhldGEpLCBzbGVycFNjYWxlZFIpO1xyXG5cdFx0cmVzdWx0ID0gUXVhdGVybmlvbi5hZGQoc2xlcnBTY2FsZWRQLCBzbGVycFNjYWxlZFIsIHJlc3VsdCk7XHJcblx0XHRyZXR1cm4gUXVhdGVybmlvbi5tdWx0aXBseUJ5U2NhbGFyKHJlc3VsdCwgMS4wIC8gTWF0aC5zaW4odGhldGEpLCByZXN1bHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHNxdWFkKFxyXG5cdFx0cTA6IFF1YXRlcm5pb24sXHJcblx0XHRxMTogUXVhdGVybmlvbixcclxuXHRcdHMwOiBRdWF0ZXJuaW9uLFxyXG5cdFx0czE6IFF1YXRlcm5pb24sXHJcblx0XHR0OiBudW1iZXIsXHJcblx0XHRyZXN1bHQ6IFF1YXRlcm5pb25cclxuXHQpOiBRdWF0ZXJuaW9uIHtcclxuXHRcdGNvbnN0IHNsZXJwMCA9IFF1YXRlcm5pb24uc2xlcnAocTAsIHExLCB0LCBzcXVhZFNjcmF0Y2hRdWF0ZXJuaW9uMCk7XHJcblx0XHRjb25zdCBzbGVycDEgPSBRdWF0ZXJuaW9uLnNsZXJwKHMwLCBzMSwgdCwgc3F1YWRTY3JhdGNoUXVhdGVybmlvbjEpO1xyXG5cdFx0cmV0dXJuIFF1YXRlcm5pb24uc2xlcnAoc2xlcnAwLCBzbGVycDEsIDIuMCAqIHQgKiAoMS4wIC0gdCksIHJlc3VsdCk7XHJcblx0fVxyXG5cdHN0YXRpYyBlcXVhbHMobGVmdDogUXVhdGVybmlvbiwgcmlnaHQ6IFF1YXRlcm5pb24pOiBib29sZWFuIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdGxlZnQgPT09IHJpZ2h0IHx8XHJcblx0XHRcdChkZWZpbmVkKGxlZnQpICYmXHJcblx0XHRcdFx0ZGVmaW5lZChyaWdodCkgJiZcclxuXHRcdFx0XHRsZWZ0LnggPT09IHJpZ2h0LnggJiZcclxuXHRcdFx0XHRsZWZ0LnkgPT09IHJpZ2h0LnkgJiZcclxuXHRcdFx0XHRsZWZ0LnogPT09IHJpZ2h0LnogJiZcclxuXHRcdFx0XHRsZWZ0LncgPT09IHJpZ2h0LncpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGVxdWFsc0Vwc2lsb24obGVmdDogUXVhdGVybmlvbiwgcmlnaHQ6IFF1YXRlcm5pb24sIGVwc2lsb24gPSAwKTogYm9vbGVhbiB7XHJcblx0XHRlcHNpbG9uID0gZGVmYXVsdFZhbHVlKGVwc2lsb24sIDApO1xyXG5cclxuXHRcdHJldHVybiAoXHJcblx0XHRcdGxlZnQgPT09IHJpZ2h0IHx8XHJcblx0XHRcdChkZWZpbmVkKGxlZnQpICYmXHJcblx0XHRcdFx0ZGVmaW5lZChyaWdodCkgJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0LnggLSByaWdodC54KSA8PSBlcHNpbG9uICYmXHJcblx0XHRcdFx0TWF0aC5hYnMobGVmdC55IC0gcmlnaHQueSkgPD0gZXBzaWxvbiAmJlxyXG5cdFx0XHRcdE1hdGguYWJzKGxlZnQueiAtIHJpZ2h0LnopIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0LncgLSByaWdodC53KSA8PSBlcHNpbG9uKVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBleHAoY2FydGVzaWFuOiBWZWN0b3IzLCByZXN1bHQ6IFF1YXRlcm5pb24pOiBRdWF0ZXJuaW9uIHtcclxuXHRcdGNvbnN0IHRoZXRhID0gVmVjdG9yMy5tYWduaXR1ZGUoY2FydGVzaWFuKTtcclxuXHRcdGxldCBzaW5UaGV0YU92ZXJUaGV0YSA9IDAuMDtcclxuXHJcblx0XHRpZiAodGhldGEgIT09IDAuMCkge1xyXG5cdFx0XHRzaW5UaGV0YU92ZXJUaGV0YSA9IE1hdGguc2luKHRoZXRhKSAvIHRoZXRhO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJlc3VsdC54ID0gY2FydGVzaWFuLnggKiBzaW5UaGV0YU92ZXJUaGV0YTtcclxuXHRcdHJlc3VsdC55ID0gY2FydGVzaWFuLnkgKiBzaW5UaGV0YU92ZXJUaGV0YTtcclxuXHRcdHJlc3VsdC56ID0gY2FydGVzaWFuLnogKiBzaW5UaGV0YU92ZXJUaGV0YTtcclxuXHRcdHJlc3VsdC53ID0gTWF0aC5jb3ModGhldGEpO1xyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG59XHJcblxyXG5sZXQgZnJvbUF4aXNBbmdsZVNjcmF0Y2ggPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuY29uc3QgZnJvbVJvdGF0aW9uTWF0cml4TmV4dCA9IFsxLCAyLCAwXTtcclxuY29uc3QgZnJvbVJvdGF0aW9uTWF0cml4UXVhdCA9IG5ldyBBcnJheSgzKTtcclxuXHJcbmxldCBsZXJwU2NyYXRjaCA9IG5ldyBRdWF0ZXJuaW9uKCk7XHJcblxyXG5sZXQgc2xlcnBFbmROZWdhdGVkID0gbmV3IFF1YXRlcm5pb24oKTtcclxubGV0IHNsZXJwU2NhbGVkUCA9IG5ldyBRdWF0ZXJuaW9uKCk7XHJcbmxldCBzbGVycFNjYWxlZFIgPSBuZXcgUXVhdGVybmlvbigpO1xyXG5cclxuY29uc3Qgc3F1YWRTY3JhdGNoQ2FydGVzaWFuMCA9IG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IHNxdWFkU2NyYXRjaENhcnRlc2lhbjEgPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBzcXVhZFNjcmF0Y2hRdWF0ZXJuaW9uMCA9IG5ldyBRdWF0ZXJuaW9uKCk7XHJcbmNvbnN0IHNxdWFkU2NyYXRjaFF1YXRlcm5pb24xID0gbmV3IFF1YXRlcm5pb24oKTtcclxuIiwiaW1wb3J0IE1hdHJpeDQgZnJvbSBcIi4uL21hdGgvTWF0cml4NFwiO1xyXG5pbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSBcIi4uL21hdGgvUXVhdGVybmlvblwiO1xyXG5pbXBvcnQgVmVjdG9yMyBmcm9tIFwiLi4vbWF0aC9WZWN0b3IzXCI7XHJcbmltcG9ydCBJQ2xvbmUgZnJvbSBcIi4vSUNsb25lXCI7XHJcbmltcG9ydCB7IFJlbmRlck9iamVjdFR5cGUgfSBmcm9tIFwiLi9XZWJHUFVUeXBlc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVuZGVyT2JqZWN0IGltcGxlbWVudHMgSUNsb25lIHtcclxuXHRwdWJsaWMgdXA6IFZlY3RvcjM7XHJcblx0cHJvdGVjdGVkIF9wb3NpdGlvbjogVmVjdG9yMztcclxuXHRwcm90ZWN0ZWQgX3NjYWxlOiBWZWN0b3IzO1xyXG5cdHByb3RlY3RlZCBfcXVhdGVybmlvbjogUXVhdGVybmlvbjtcclxuXHRwcm90ZWN0ZWQgX3RhcmdldDogVmVjdG9yMztcclxuXHRwcml2YXRlIF9ub3JtYWxNYXRyaXg6IE1hdHJpeDQ7XHJcblx0bW9kZWxNYXRyaXg6IE1hdHJpeDQ7XHJcblx0cGFyZW50OiBSZW5kZXJPYmplY3Q7XHJcblx0dHlwZTogUmVuZGVyT2JqZWN0VHlwZTtcclxuXHRuYW1lOiBzdHJpbmc7XHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblx0XHR0aGlzLl9wb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHR0aGlzLl9zY2FsZSA9IG5ldyBWZWN0b3IzKDEsIDEsIDEpO1xyXG5cdFx0dGhpcy5fcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XHJcblx0XHR0aGlzLm1vZGVsTWF0cml4ID0gTWF0cml4NC5jbG9uZShNYXRyaXg0LklERU5USVRZLCBuZXcgTWF0cml4NCgpKTtcclxuXHRcdHRoaXMuX25vcm1hbE1hdHJpeCA9IE1hdHJpeDQuY2xvbmUoTWF0cml4NC5JREVOVElUWSwgbmV3IE1hdHJpeDQoKSk7XHJcblx0XHR0aGlzLnVwID0gbmV3IFZlY3RvcjMoMCwgMSwgMCk7XHJcblx0XHR0aGlzLl90YXJnZXQgPSBuZXcgVmVjdG9yMygwLCAwLCAwKTtcclxuXHR9XHJcblx0cHVibGljIGdldCBub3JtYWxNYXRyaXgoKTogTWF0cml4NCB7XHJcblx0XHRyZXR1cm4gdGhpcy5fbm9ybWFsTWF0cml4O1xyXG5cdH1cclxuXHJcblx0cHVibGljIGdldCBwb3NpdGlvbigpOiBWZWN0b3IzIHtcclxuXHRcdHJldHVybiB0aGlzLl9wb3NpdGlvbjtcclxuXHR9XHJcblx0cHVibGljIGdldCBzY2FsZSgpOiBWZWN0b3IzIHtcclxuXHRcdHJldHVybiB0aGlzLl9zY2FsZTtcclxuXHR9XHJcblx0cHVibGljIGdldCBxdWF0ZXJuaW9uKCk6IFF1YXRlcm5pb24ge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3F1YXRlcm5pb247XHJcblx0fVxyXG5cdHByaXZhdGUgdXBkYXRlTm9ybWFsTWF0cml4KCkge1xyXG5cdFx0TWF0cml4NC5pbnZlcnNlKHRoaXMubW9kZWxNYXRyaXgsIHRoaXMuX25vcm1hbE1hdHJpeCk7XHJcblx0XHRNYXRyaXg0LnRyYW5zcG9zZSh0aGlzLl9ub3JtYWxNYXRyaXgsIHRoaXMuX25vcm1hbE1hdHJpeCk7XHJcblx0fVxyXG5cdHVwZGF0ZU1hdHJpeChtYXRyaXg/OiBNYXRyaXg0KSB7XHJcblx0XHR0aGlzLm1vZGVsTWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCB0aGlzLnNjYWxlKTtcclxuXHRcdGlmIChtYXRyaXgpIE1hdHJpeDQubXVsdGlwbHkobWF0cml4LCB0aGlzLm1vZGVsTWF0cml4LCB0aGlzLm1vZGVsTWF0cml4KTtcclxuXHRcdHRoaXMudXBkYXRlTm9ybWFsTWF0cml4KCk7XHJcblx0fVxyXG5cdGxvb2tBdCh4LCB5LCB6KSB7XHJcblx0XHR0aGlzLl90YXJnZXQuc2V0KHgsIHksIHopO1xyXG5cdFx0aWYgKHRoaXMudHlwZSA9PSBSZW5kZXJPYmplY3RUeXBlLkNhbWVyYSB8fCB0aGlzLnR5cGUgPT0gUmVuZGVyT2JqZWN0VHlwZS5MaWdodCkge1xyXG5cdFx0XHRfbTEubG9va0F0KHRoaXMucG9zaXRpb24sIHRoaXMuX3RhcmdldCwgdGhpcy51cCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRfbTEubG9va0F0KHRoaXMuX3RhcmdldCwgdGhpcy5wb3NpdGlvbiwgdGhpcy51cCk7XHJcblx0XHR9XHJcblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KF9tMSk7XHJcblx0fVxyXG5cdHJvdGF0ZU9uQXhpcyhheGlzLCBhbmdsZSkge1xyXG5cdFx0Y29uc3QgcXVhdCA9IFF1YXRlcm5pb24uZnJvbUF4aXNBbmdsZShheGlzLCBhbmdsZSk7XHJcblx0XHRRdWF0ZXJuaW9uLm11bHRpcGx5KHRoaXMucXVhdGVybmlvbiwgcXVhdCwgdGhpcy5xdWF0ZXJuaW9uKTtcclxuXHR9XHJcblx0cm90YXRlWChhbmdsZSkge1xyXG5cdFx0cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKF94QXhpcywgYW5nbGUpO1xyXG5cdH1cclxuXHRyb3RhdGVZKGFuZ2xlKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoX3lBeGlzLCBhbmdsZSk7XHJcblx0fVxyXG5cdHJvdGF0ZVooYW5nbGUpIHtcclxuXHRcdHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhfekF4aXMsIGFuZ2xlKTtcclxuXHR9XHJcbn1cclxuY29uc3QgX3hBeGlzID0gbmV3IFZlY3RvcjMoMSwgMCwgMCk7XHJcbmNvbnN0IF95QXhpcyA9IG5ldyBWZWN0b3IzKDAsIDEsIDApO1xyXG5jb25zdCBfekF4aXMgPSBuZXcgVmVjdG9yMygwLCAwLCAxKTtcclxuY29uc3QgX20xID0gbmV3IE1hdHJpeDQoKTtcclxuIiwiaW1wb3J0IFJlbmRlck9iamVjdCBmcm9tIFwiLi4vY29yZS9SZW5kZXJPYmplY3RcIjtcclxuaW1wb3J0IHsgTGlnaHRUeXBlLCBSZW5kZXJPYmplY3RUeXBlIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVVHlwZXNcIjtcclxuaW1wb3J0IFZlY3RvcjMgZnJvbSBcIi4uL21hdGgvVmVjdG9yM1wiO1xyXG5pbXBvcnQgeyBCYXNlU2hhZG93IH0gZnJvbSBcIi4vc2hhZG93cy9CYXNlU2hhZG93XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTGlnaHQgZXh0ZW5kcyBSZW5kZXJPYmplY3Qge1xyXG5cdHByaXZhdGUgX2NvbG9yOiBWZWN0b3IzO1xyXG5cdHR5cGU6IFJlbmRlck9iamVjdFR5cGU7XHJcblx0cHJpdmF0ZSBfaW50ZW5zaXR5OiBudW1iZXI7XHJcblx0ZGlydHk6IGJvb2xlYW47XHJcblx0Y29sb3JEaXJ0eTogYm9vbGVhbjtcclxuXHRzaGFkb3dEaXJ0eTogYm9vbGVhbjtcclxuXHRpbnRlbnNpdHlEaXJ0eTogYm9vbGVhbjtcclxuXHRwb3NpdGlvbkRpcnR5OiBib29sZWFuO1xyXG5cdHB1YmxpYyBfc2hhZG93OiBCYXNlU2hhZG93O1xyXG5cdHB1YmxpYyB0YXJnZXREaXJ0eTogYm9vbGVhbjtcclxuXHRwdWJsaWMgbGlnaHRUeXBlOiBMaWdodFR5cGU7XHJcblxyXG5cdGNvbnN0cnVjdG9yKGNvbG9yOiBWZWN0b3IzLCBpbnRlbnNpdHk6IG51bWJlcikge1xyXG5cdFx0c3VwZXIoKTtcclxuXHRcdHRoaXMudHlwZSA9IFJlbmRlck9iamVjdFR5cGUuTGlnaHQ7XHJcblx0XHR0aGlzLl9jb2xvciA9IFZlY3RvcjMubXVsdGlwbHlCeVNjYWxhcihjb2xvciwgaW50ZW5zaXR5LCBuZXcgVmVjdG9yMygpKTtcclxuXHRcdHRoaXMuX2ludGVuc2l0eSA9IGludGVuc2l0eTtcclxuXHRcdHRoaXMuX3Bvc2l0aW9uID0gbmV3IFZlY3RvcjMoMCwgMSwgMCk7XHJcblx0XHR0aGlzLl90YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0dGhpcy5wb3NpdGlvbkRpcnR5ID0gdHJ1ZTtcclxuXHRcdHRoaXMudGFyZ2V0RGlydHkgPSB0cnVlO1xyXG5cdFx0dGhpcy5jb2xvckRpcnR5ID0gdHJ1ZTtcclxuXHRcdHRoaXMuc2hhZG93RGlydHkgPSB0cnVlO1xyXG5cdFx0dGhpcy5pbnRlbnNpdHlEaXJ0eSA9IHRydWU7XHJcblx0XHR0aGlzLl9zaGFkb3cgPSBudWxsO1xyXG5cdH1cclxuXHJcblx0Z2V0IHBvc2l0aW9uKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3Bvc2l0aW9uO1xyXG5cdH1cclxuXHJcblx0c2V0IHBvc2l0aW9uKHZhbHVlKSB7XHJcblx0XHR0aGlzLnBvc2l0aW9uRGlydHkgPSB0cnVlO1xyXG5cdFx0dGhpcy5fcG9zaXRpb24gPSB2YWx1ZTtcclxuXHR9XHJcblxyXG5cdGdldCB0YXJnZXQoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fdGFyZ2V0O1xyXG5cdH1cclxuXHJcblx0c2V0IHRhcmdldCh2YWx1ZSkge1xyXG5cdFx0dGhpcy50YXJnZXREaXJ0eSA9IHRydWU7XHJcblx0XHR0aGlzLl90YXJnZXQgPSB2YWx1ZTtcclxuXHR9XHJcblxyXG5cdGdldCBjb2xvcigpIHtcclxuXHRcdHJldHVybiB0aGlzLl9jb2xvcjtcclxuXHR9XHJcblxyXG5cdHNldCBjb2xvcih2YWx1ZSkge1xyXG5cdFx0dGhpcy5jb2xvckRpcnR5ID0gdHJ1ZTtcclxuXHRcdHRoaXMuX2NvbG9yID0gdmFsdWU7XHJcblx0fVxyXG5cclxuXHRzZXQgaW50ZW5zaXR5KHZhbHVlKSB7XHJcblx0XHR0aGlzLmNvbG9yID0gVmVjdG9yMy5tdWx0aXBseUJ5U2NhbGFyKHRoaXMuY29sb3IsIHZhbHVlLCBuZXcgVmVjdG9yMygpKTtcclxuXHRcdHRoaXMuaW50ZW5zaXR5RGlydHkgPSB0cnVlO1xyXG5cdFx0dGhpcy5faW50ZW5zaXR5ID0gdmFsdWU7XHJcblx0fVxyXG5cclxuXHRnZXQgaW50ZW5zaXR5KCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2ludGVuc2l0eTtcclxuXHR9XHJcblxyXG5cdGdldCBzaGFkb3coKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fc2hhZG93O1xyXG5cdH1cclxuXHJcblx0c2V0IHNoYWRvdyh2YWx1ZSkge1xyXG5cdFx0dGhpcy5zaGFkb3dEaXJ0eSA9IHRydWU7XHJcblx0XHR0aGlzLl9zaGFkb3cgPSB2YWx1ZTtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IGRlZmF1bHRWYWx1ZSBmcm9tIFwiLi4vdXRpbHMvZGVmYXVsdFZhbHVlXCI7XHJcbmltcG9ydCBkZWZpbmVkIGZyb20gXCIuLi91dGlscy9kZWZpbmVkXCI7XHJcbmltcG9ydCBHTWF0aCBmcm9tIFwiLi9NYXRoXCI7XHJcbi8vICNyZ2JhXHJcbmNvbnN0IHJnYmFNYXRjaGVyID0gL14jKFswLTlhLWZdKShbMC05YS1mXSkoWzAtOWEtZl0pKFswLTlhLWZdKT8kL2k7XHJcbi8vICNycmdnYmJhYVxyXG5jb25zdCBycmdnYmJhYU1hdGNoZXIgPSAvXiMoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pPyQvaTtcclxuLy8gcmdiKCksIHJnYmEoKSwgb3IgcmdiJSgpXHJcbmNvbnN0IHJnYlBhcmVudGhlc2VzTWF0Y2hlciA9IC9ecmdiYT9cXChcXHMqKFswLTkuXSslPylcXHMqLFxccyooWzAtOS5dKyU/KVxccyosXFxzKihbMC05Ll0rJT8pKD86XFxzKixcXHMqKFswLTkuXSspKT9cXHMqXFwpJC9pO1xyXG4vLyBoc2woKSBvciBoc2xhKClcclxuY29uc3QgaHNsUGFyZW50aGVzZXNNYXRjaGVyID0gL15oc2xhP1xcKFxccyooWzAtOS5dKylcXHMqLFxccyooWzAtOS5dKyUpXFxzKixcXHMqKFswLTkuXSslKSg/OlxccyosXFxzKihbMC05Ll0rKSk/XFxzKlxcKSQvaTtcclxuZnVuY3Rpb24gaHVlMnJnYihtMSwgbTIsIGgpIHtcclxuXHRpZiAoaCA8IDApIHtcclxuXHRcdGggKz0gMTtcclxuXHR9XHJcblx0aWYgKGggPiAxKSB7XHJcblx0XHRoIC09IDE7XHJcblx0fVxyXG5cdGlmIChoICogNiA8IDEpIHtcclxuXHRcdHJldHVybiBtMSArIChtMiAtIG0xKSAqIDYgKiBoO1xyXG5cdH1cclxuXHRpZiAoaCAqIDIgPCAxKSB7XHJcblx0XHRyZXR1cm4gbTI7XHJcblx0fVxyXG5cdGlmIChoICogMyA8IDIpIHtcclxuXHRcdHJldHVybiBtMSArIChtMiAtIG0xKSAqICgyIC8gMyAtIGgpICogNjtcclxuXHR9XHJcblx0cmV0dXJuIG0xO1xyXG59XHJcblxyXG5jbGFzcyBDb2xvciB7XHJcblx0Z3JlZW46IG51bWJlcjtcclxuXHRyZWQ6IG51bWJlcjtcclxuXHRibHVlOiBudW1iZXI7XHJcblx0Y29uc3RydWN0b3IocmVkID0gMS4wLCBncmVlbiA9IDEuMCwgYmx1ZSA9IDEuMCkge1xyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVkIGNvbXBvbmVudC5cclxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxLjBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZWQgPSByZWQ7XHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBncmVlbiBjb21wb25lbnQuXHJcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMS4wXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ3JlZW4gPSBncmVlbjtcclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJsdWUgY29tcG9uZW50LlxyXG5cdFx0ICogQHR5cGUge051bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDEuMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJsdWUgPSBibHVlO1xyXG5cdH1cclxuXHRzZXQodmFsdWU6IHN0cmluZyk6IENvbG9yIHtcclxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0Q29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKHZhbHVlLCB0aGlzKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHR0b0FycmF5KCk6IG51bWJlcltdIHtcclxuXHRcdHJldHVybiBbdGhpcy5yZWQsIHRoaXMuZ3JlZW4sIHRoaXMuYmx1ZV07XHJcblx0fVxyXG5cclxuXHRjbG9uZShyZXN1bHQ6IENvbG9yKTogQ29sb3Ige1xyXG5cdFx0cmV0dXJuIENvbG9yLmNsb25lKHRoaXMsIHJlc3VsdCk7XHJcblx0fVxyXG5cclxuXHRlcXVhbHMob3RoZXI6IENvbG9yKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gQ29sb3IuZXF1YWxzKHRoaXMsIG90aGVyKTtcclxuXHR9XHJcblxyXG5cdHRvQ3NzSGV4U3RyaW5nKCk6IHN0cmluZyB7XHJcblx0XHRsZXQgciA9IENvbG9yLmZsb2F0VG9CeXRlKHRoaXMucmVkKS50b1N0cmluZygxNik7XHJcblx0XHRpZiAoci5sZW5ndGggPCAyKSB7XHJcblx0XHRcdHIgPSBgMCR7cn1gO1xyXG5cdFx0fVxyXG5cdFx0bGV0IGcgPSBDb2xvci5mbG9hdFRvQnl0ZSh0aGlzLmdyZWVuKS50b1N0cmluZygxNik7XHJcblx0XHRpZiAoZy5sZW5ndGggPCAyKSB7XHJcblx0XHRcdGcgPSBgMCR7Z31gO1xyXG5cdFx0fVxyXG5cdFx0bGV0IGIgPSBDb2xvci5mbG9hdFRvQnl0ZSh0aGlzLmJsdWUpLnRvU3RyaW5nKDE2KTtcclxuXHRcdGlmIChiLmxlbmd0aCA8IDIpIHtcclxuXHRcdFx0YiA9IGAwJHtifWA7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gYCMke3J9JHtnfSR7Yn1gO1xyXG5cdH1cclxuXHJcblx0dG9CeXRlcyhyZXN1bHQ6IG51bWJlcltdKTogbnVtYmVyW10ge1xyXG5cdFx0Y29uc3QgcmVkID0gQ29sb3IuZmxvYXRUb0J5dGUodGhpcy5yZWQpO1xyXG5cdFx0Y29uc3QgZ3JlZW4gPSBDb2xvci5mbG9hdFRvQnl0ZSh0aGlzLmdyZWVuKTtcclxuXHRcdGNvbnN0IGJsdWUgPSBDb2xvci5mbG9hdFRvQnl0ZSh0aGlzLmJsdWUpO1xyXG5cclxuXHRcdGlmICghZGVmaW5lZChyZXN1bHQpKSB7XHJcblx0XHRcdHJldHVybiBbcmVkLCBncmVlbiwgYmx1ZV07XHJcblx0XHR9XHJcblx0XHRyZXN1bHRbMF0gPSByZWQ7XHJcblx0XHRyZXN1bHRbMV0gPSBncmVlbjtcclxuXHRcdHJlc3VsdFsyXSA9IGJsdWU7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGZyb21CeXRlcyhyZWQ6IG51bWJlciwgZ3JlZW46IG51bWJlciwgYmx1ZTogbnVtYmVyLCByZXN1bHQ6IENvbG9yKTogQ29sb3Ige1xyXG5cdFx0cmVkID0gQ29sb3IuYnl0ZVRvRmxvYXQoZGVmYXVsdFZhbHVlKHJlZCwgMjU1LjApKTtcclxuXHRcdGdyZWVuID0gQ29sb3IuYnl0ZVRvRmxvYXQoZGVmYXVsdFZhbHVlKGdyZWVuLCAyNTUuMCkpO1xyXG5cdFx0Ymx1ZSA9IENvbG9yLmJ5dGVUb0Zsb2F0KGRlZmF1bHRWYWx1ZShibHVlLCAyNTUuMCkpO1xyXG5cclxuXHRcdGlmICghZGVmaW5lZChyZXN1bHQpKSB7XHJcblx0XHRcdHJldHVybiBuZXcgQ29sb3IocmVkLCBncmVlbiwgYmx1ZSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmVzdWx0LnJlZCA9IHJlZDtcclxuXHRcdHJlc3VsdC5ncmVlbiA9IGdyZWVuO1xyXG5cdFx0cmVzdWx0LmJsdWUgPSBibHVlO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBmcm9tSHNsKGh1ZTogbnVtYmVyLCBzYXR1cmF0aW9uOiBudW1iZXIsIGxpZ2h0bmVzczogbnVtYmVyLCByZXN1bHQ6IENvbG9yKTogQ29sb3Ige1xyXG5cdFx0aHVlID0gZGVmYXVsdFZhbHVlKGh1ZSwgMC4wKSAlIDEuMDtcclxuXHRcdHNhdHVyYXRpb24gPSBkZWZhdWx0VmFsdWUoc2F0dXJhdGlvbiwgMC4wKTtcclxuXHRcdGxpZ2h0bmVzcyA9IGRlZmF1bHRWYWx1ZShsaWdodG5lc3MsIDAuMCk7XHJcblx0XHRsZXQgcmVkID0gbGlnaHRuZXNzO1xyXG5cdFx0bGV0IGdyZWVuID0gbGlnaHRuZXNzO1xyXG5cdFx0bGV0IGJsdWUgPSBsaWdodG5lc3M7XHJcblxyXG5cdFx0aWYgKHNhdHVyYXRpb24gIT09IDApIHtcclxuXHRcdFx0bGV0IG0yO1xyXG5cdFx0XHRpZiAobGlnaHRuZXNzIDwgMC41KSB7XHJcblx0XHRcdFx0bTIgPSBsaWdodG5lc3MgKiAoMSArIHNhdHVyYXRpb24pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdG0yID0gbGlnaHRuZXNzICsgc2F0dXJhdGlvbiAtIGxpZ2h0bmVzcyAqIHNhdHVyYXRpb247XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IG0xID0gMi4wICogbGlnaHRuZXNzIC0gbTI7XHJcblx0XHRcdHJlZCA9IGh1ZTJyZ2IobTEsIG0yLCBodWUgKyAxIC8gMyk7XHJcblx0XHRcdGdyZWVuID0gaHVlMnJnYihtMSwgbTIsIGh1ZSk7XHJcblx0XHRcdGJsdWUgPSBodWUycmdiKG0xLCBtMiwgaHVlIC0gMSAvIDMpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghZGVmaW5lZChyZXN1bHQpKSB7XHJcblx0XHRcdHJldHVybiBuZXcgQ29sb3IocmVkLCBncmVlbiwgYmx1ZSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmVzdWx0LnJlZCA9IHJlZDtcclxuXHRcdHJlc3VsdC5ncmVlbiA9IGdyZWVuO1xyXG5cdFx0cmVzdWx0LmJsdWUgPSBibHVlO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSByYW5kb20gY29sb3IgdXNpbmcgdGhlIHByb3ZpZGVkIG9wdGlvbnMuIEZvciByZXByb2R1Y2libGUgcmFuZG9tIGNvbG9ycywgeW91IHNob3VsZFxyXG5cdCAqIGNhbGwge0BsaW5rIEdNYXRoI3NldFJhbmRvbU51bWJlclNlZWR9IG9uY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB5b3VyIGFwcGxpY2F0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnJlZF0gSWYgc3BlY2lmaWVkLCB0aGUgcmVkIGNvbXBvbmVudCB0byB1c2UgaW5zdGVhZCBvZiBhIHJhbmRvbWl6ZWQgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1pbmltdW1SZWQ9MC4wXSBUaGUgbWF4aW11bSByZWQgdmFsdWUgdG8gZ2VuZXJhdGUgaWYgbm9uZSB3YXMgc3BlY2lmaWVkLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhpbXVtUmVkPTEuMF0gVGhlIG1pbmltdW0gcmVkIHZhbHVlIHRvIGdlbmVyYXRlIGlmIG5vbmUgd2FzIHNwZWNpZmllZC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZ3JlZW5dIElmIHNwZWNpZmllZCwgdGhlIGdyZWVuIGNvbXBvbmVudCB0byB1c2UgaW5zdGVhZCBvZiBhIHJhbmRvbWl6ZWQgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1pbmltdW1HcmVlbj0wLjBdIFRoZSBtYXhpbXVtIGdyZWVuIHZhbHVlIHRvIGdlbmVyYXRlIGlmIG5vbmUgd2FzIHNwZWNpZmllZC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4aW11bUdyZWVuPTEuMF0gVGhlIG1pbmltdW0gZ3JlZW4gdmFsdWUgdG8gZ2VuZXJhdGUgaWYgbm9uZSB3YXMgc3BlY2lmaWVkLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5ibHVlXSBJZiBzcGVjaWZpZWQsIHRoZSBibHVlIGNvbXBvbmVudCB0byB1c2UgaW5zdGVhZCBvZiBhIHJhbmRvbWl6ZWQgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1pbmltdW1CbHVlPTAuMF0gVGhlIG1heGltdW0gYmx1ZSB2YWx1ZSB0byBnZW5lcmF0ZSBpZiBub25lIHdhcyBzcGVjaWZpZWQuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1heGltdW1CbHVlPTEuMF0gVGhlIG1pbmltdW0gYmx1ZSB2YWx1ZSB0byBnZW5lcmF0ZSBpZiBub25lIHdhcyBzcGVjaWZpZWQuXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gW3Jlc3VsdF0gVGhlIG9iamVjdCB0byBzdG9yZSB0aGUgcmVzdWx0IGluLCBpZiB1bmRlZmluZWQgYSBuZXcgaW5zdGFuY2Ugd2lsbCBiZSBjcmVhdGVkLlxyXG5cdCAqIEByZXR1cm5zIHtDb2xvcn0gVGhlIG1vZGlmaWVkIHJlc3VsdCBwYXJhbWV0ZXIgb3IgYSBuZXcgaW5zdGFuY2UgaWYgcmVzdWx0IHdhcyB1bmRlZmluZWQuXHJcblx0ICpcclxuXHQgKiBAZXhhbXBsZVxyXG5cdCAqIC8vQ3JlYXRlIGEgY29tcGxldGVseSByYW5kb20gY29sb3JcclxuXHQgKiBjb25zdCBjb2xvciA9IENvbG9yLmZyb21SYW5kb20oKTtcclxuXHQgKlxyXG5cdCAqIC8vQ3JlYXRlIGEgcmFuZG9tIHNoYWRlIG9mIHllbGxvdy5cclxuXHQgKiBjb25zdCBjb2xvcjEgPSBDb2xvci5mcm9tUmFuZG9tKHtcclxuXHQgKiAgICAgcmVkIDogMS4wLFxyXG5cdCAqICAgICBncmVlbiA6IDEuMCxcclxuXHQgKiB9KTtcclxuXHQgKlxyXG5cdCAqIC8vQ3JlYXRlIGEgcmFuZG9tIGJyaWdodCBjb2xvci5cclxuXHQgKiBjb25zdCBjb2xvcjIgPSBDb2xvci5mcm9tUmFuZG9tKHtcclxuXHQgKiAgICAgbWluaW11bVJlZCA6IDAuNzUsXHJcblx0ICogICAgIG1pbmltdW1HcmVlbiA6IDAuNzUsXHJcblx0ICogICAgIG1pbmltdW1CbHVlIDogMC43NSxcclxuXHQgKiB9KTtcclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbVJhbmRvbShvcHRpb25zLCByZXN1bHQ6IENvbG9yKTogQ29sb3Ige1xyXG5cdFx0b3B0aW9ucyA9IGRlZmF1bHRWYWx1ZShvcHRpb25zLCBkZWZhdWx0VmFsdWUuRU1QVFlfT0JKRUNUKTtcclxuXHJcblx0XHRsZXQgcmVkID0gb3B0aW9ucy5yZWQ7XHJcblx0XHRpZiAoIWRlZmluZWQocmVkKSkge1xyXG5cdFx0XHRjb25zdCBtaW5pbXVtUmVkID0gZGVmYXVsdFZhbHVlKG9wdGlvbnMubWluaW11bVJlZCwgMCk7XHJcblx0XHRcdGNvbnN0IG1heGltdW1SZWQgPSBkZWZhdWx0VmFsdWUob3B0aW9ucy5tYXhpbXVtUmVkLCAxLjApO1xyXG5cclxuXHRcdFx0cmVkID0gbWluaW11bVJlZCArIEdNYXRoLm5leHRSYW5kb21OdW1iZXIoKSAqIChtYXhpbXVtUmVkIC0gbWluaW11bVJlZCk7XHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGdyZWVuID0gb3B0aW9ucy5ncmVlbjtcclxuXHRcdGlmICghZGVmaW5lZChncmVlbikpIHtcclxuXHRcdFx0Y29uc3QgbWluaW11bUdyZWVuID0gZGVmYXVsdFZhbHVlKG9wdGlvbnMubWluaW11bUdyZWVuLCAwKTtcclxuXHRcdFx0Y29uc3QgbWF4aW11bUdyZWVuID0gZGVmYXVsdFZhbHVlKG9wdGlvbnMubWF4aW11bUdyZWVuLCAxLjApO1xyXG5cclxuXHRcdFx0Z3JlZW4gPSBtaW5pbXVtR3JlZW4gKyBHTWF0aC5uZXh0UmFuZG9tTnVtYmVyKCkgKiAobWF4aW11bUdyZWVuIC0gbWluaW11bUdyZWVuKTtcclxuXHRcdH1cclxuXHJcblx0XHRsZXQgYmx1ZSA9IG9wdGlvbnMuYmx1ZTtcclxuXHRcdGlmICghZGVmaW5lZChibHVlKSkge1xyXG5cdFx0XHRjb25zdCBtaW5pbXVtQmx1ZSA9IGRlZmF1bHRWYWx1ZShvcHRpb25zLm1pbmltdW1CbHVlLCAwKTtcclxuXHRcdFx0Y29uc3QgbWF4aW11bUJsdWUgPSBkZWZhdWx0VmFsdWUob3B0aW9ucy5tYXhpbXVtQmx1ZSwgMS4wKTtcclxuXHJcblx0XHRcdGJsdWUgPSBtaW5pbXVtQmx1ZSArIEdNYXRoLm5leHRSYW5kb21OdW1iZXIoKSAqIChtYXhpbXVtQmx1ZSAtIG1pbmltdW1CbHVlKTtcclxuXHRcdH1cclxuXHRcdGlmICghZGVmaW5lZChyZXN1bHQpKSB7XHJcblx0XHRcdHJldHVybiBuZXcgQ29sb3IocmVkLCBncmVlbiwgYmx1ZSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmVzdWx0LnJlZCA9IHJlZDtcclxuXHRcdHJlc3VsdC5ncmVlbiA9IGdyZWVuO1xyXG5cdFx0cmVzdWx0LmJsdWUgPSBibHVlO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBmcm9tQ3NzQ29sb3JTdHJpbmcoY29sb3I6IHN0cmluZywgcmVzdWx0OiBDb2xvciA9IG5ldyBDb2xvcigpKTogQ29sb3Ige1xyXG5cdFx0Ly8gUmVtb3ZlIGFsbCB3aGl0ZXNwYWNlcyBmcm9tIHRoZSBjb2xvciBzdHJpbmdcclxuXHRcdGNvbG9yID0gY29sb3IucmVwbGFjZSgvXFxzL2csIFwiXCIpO1xyXG5cclxuXHRcdGNvbnN0IG5hbWVkQ29sb3IgPSBDb2xvcltjb2xvci50b1VwcGVyQ2FzZSgpXTtcclxuXHRcdGlmIChkZWZpbmVkKG5hbWVkQ29sb3IpKSB7XHJcblx0XHRcdENvbG9yLmNsb25lKG5hbWVkQ29sb3IsIHJlc3VsdCk7XHJcblx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IG1hdGNoZXMgPSByZ2JhTWF0Y2hlci5leGVjKGNvbG9yKTtcclxuXHRcdGlmIChtYXRjaGVzICE9PSBudWxsKSB7XHJcblx0XHRcdHJlc3VsdC5yZWQgPSBwYXJzZUludChtYXRjaGVzWzFdLCAxNikgLyAxNTtcclxuXHRcdFx0cmVzdWx0LmdyZWVuID0gcGFyc2VJbnQobWF0Y2hlc1syXSwgMTYpIC8gMTUuMDtcclxuXHRcdFx0cmVzdWx0LmJsdWUgPSBwYXJzZUludChtYXRjaGVzWzNdLCAxNikgLyAxNS4wO1xyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fVxyXG5cclxuXHRcdG1hdGNoZXMgPSBycmdnYmJhYU1hdGNoZXIuZXhlYyhjb2xvcik7XHJcblx0XHRpZiAobWF0Y2hlcyAhPT0gbnVsbCkge1xyXG5cdFx0XHRyZXN1bHQucmVkID0gcGFyc2VJbnQobWF0Y2hlc1sxXSwgMTYpIC8gMjU1LjA7XHJcblx0XHRcdHJlc3VsdC5ncmVlbiA9IHBhcnNlSW50KG1hdGNoZXNbMl0sIDE2KSAvIDI1NS4wO1xyXG5cdFx0XHRyZXN1bHQuYmx1ZSA9IHBhcnNlSW50KG1hdGNoZXNbM10sIDE2KSAvIDI1NS4wO1xyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fVxyXG5cclxuXHRcdG1hdGNoZXMgPSByZ2JQYXJlbnRoZXNlc01hdGNoZXIuZXhlYyhjb2xvcik7XHJcblx0XHRpZiAobWF0Y2hlcyAhPT0gbnVsbCkge1xyXG5cdFx0XHRyZXN1bHQucmVkID0gcGFyc2VGbG9hdChtYXRjaGVzWzFdKSAvIChcIiVcIiA9PT0gbWF0Y2hlc1sxXS5zdWJzdHIoLTEpID8gMTAwLjAgOiAyNTUuMCk7XHJcblx0XHRcdHJlc3VsdC5ncmVlbiA9IHBhcnNlRmxvYXQobWF0Y2hlc1syXSkgLyAoXCIlXCIgPT09IG1hdGNoZXNbMl0uc3Vic3RyKC0xKSA/IDEwMC4wIDogMjU1LjApO1xyXG5cdFx0XHRyZXN1bHQuYmx1ZSA9IHBhcnNlRmxvYXQobWF0Y2hlc1szXSkgLyAoXCIlXCIgPT09IG1hdGNoZXNbM10uc3Vic3RyKC0xKSA/IDEwMC4wIDogMjU1LjApO1xyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fVxyXG5cclxuXHRcdG1hdGNoZXMgPSBoc2xQYXJlbnRoZXNlc01hdGNoZXIuZXhlYyhjb2xvcik7XHJcblx0XHRpZiAobWF0Y2hlcyAhPT0gbnVsbCkge1xyXG5cdFx0XHRyZXR1cm4gQ29sb3IuZnJvbUhzbChcclxuXHRcdFx0XHRwYXJzZUZsb2F0KG1hdGNoZXNbMV0pIC8gMzYwLjAsXHJcblx0XHRcdFx0cGFyc2VGbG9hdChtYXRjaGVzWzJdKSAvIDEwMC4wLFxyXG5cdFx0XHRcdHBhcnNlRmxvYXQobWF0Y2hlc1szXSkgLyAxMDAuMCxcclxuXHRcdFx0XHRyZXN1bHRcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXN1bHQgPSB1bmRlZmluZWQ7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGJ5dGVUb0Zsb2F0KHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIHZhbHVlIC8gMjU1LjA7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZmxvYXRUb0J5dGUodmFsdWU6IG51bWJlcik6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gdmFsdWUgPT09IDEuMCA/IDI1NS4wIDogKHZhbHVlICogMjU2LjApIHwgMDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBjbG9uZShjb2xvcjogQ29sb3IsIHJlc3VsdDogQ29sb3IpOiBDb2xvciB7XHJcblx0XHRpZiAoIWRlZmluZWQoY29sb3IpKSB7XHJcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblx0XHR9XHJcblx0XHRpZiAoIWRlZmluZWQocmVzdWx0KSkge1xyXG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKGNvbG9yLnJlZCwgY29sb3IuZ3JlZW4sIGNvbG9yLmJsdWUpO1xyXG5cdFx0fVxyXG5cdFx0cmVzdWx0LnJlZCA9IGNvbG9yLnJlZDtcclxuXHRcdHJlc3VsdC5ncmVlbiA9IGNvbG9yLmdyZWVuO1xyXG5cdFx0cmVzdWx0LmJsdWUgPSBjb2xvci5ibHVlO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBlcXVhbHMobGVmdDogQ29sb3IsIHJpZ2h0OiBDb2xvcik6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIChcclxuXHRcdFx0bGVmdCA9PT0gcmlnaHQgfHwgLy9cclxuXHRcdFx0KGRlZmluZWQobGVmdCkgJiYgLy9cclxuXHRcdFx0XHRkZWZpbmVkKHJpZ2h0KSAmJiAvL1xyXG5cdFx0XHRcdGxlZnQucmVkID09PSByaWdodC5yZWQgJiYgLy9cclxuXHRcdFx0XHRsZWZ0LmdyZWVuID09PSByaWdodC5ncmVlbiAmJiAvL1xyXG5cdFx0XHRcdGxlZnQuYmx1ZSA9PT0gcmlnaHQuYmx1ZSlcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqL1xyXG5cdHN0YXRpYyBlcXVhbHNBcnJheShjb2xvcjogQ29sb3IsIGFycmF5OiBudW1iZXJbXSwgb2Zmc2V0OiBudW1iZXIpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiBjb2xvci5yZWQgPT09IGFycmF5W29mZnNldF0gJiYgY29sb3IuZ3JlZW4gPT09IGFycmF5W29mZnNldCArIDFdICYmIGNvbG9yLmJsdWUgPT09IGFycmF5W29mZnNldCArIDJdO1xyXG5cdH1cclxufVxyXG5leHBvcnQgZGVmYXVsdCBDb2xvcjtcclxuIiwiaW1wb3J0IGRlZmF1bHRWYWx1ZSBmcm9tIFwiLi4vdXRpbHMvZGVmYXVsdFZhbHVlXCI7XHJcbmltcG9ydCBkZWZpbmVkIGZyb20gXCIuLi91dGlscy9kZWZpbmVkXCI7XHJcbmltcG9ydCBWZWN0b3IyIGZyb20gXCIuL1ZlY3RvcjJcIjtcclxuXHJcbi8qKlxyXG4gKiBBIDJ4MiBtYXRyaXgsIGluZGV4YWJsZSBhcyBhIGNvbHVtbi1tYWpvciBvcmRlciBhcnJheS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IFtjb2x1bW4wUm93MD0wLjBdIFRoZSB2YWx1ZSBmb3IgY29sdW1uIDAsIHJvdyAwLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gW2NvbHVtbjFSb3cwPTAuMF0gVGhlIHZhbHVlIGZvciBjb2x1bW4gMSwgcm93IDAuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBbY29sdW1uMFJvdzE9MC4wXSBUaGUgdmFsdWUgZm9yIGNvbHVtbiAwLCByb3cgMS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IFtjb2x1bW4xUm93MT0wLjBdIFRoZSB2YWx1ZSBmb3IgY29sdW1uIDEsIHJvdyAxLlxyXG4gKi9cclxuY2xhc3MgTWF0cml4MiB7XHJcblx0Y29uc3RydWN0b3IoY29sdW1uMFJvdzAgPSAwLCBjb2x1bW4xUm93MCA9IDAsIGNvbHVtbjBSb3cxID0gMCwgY29sdW1uMVJvdzEgPSAwKSB7XHJcblx0XHR0aGlzWzBdID0gY29sdW1uMFJvdzA7XHJcblx0XHR0aGlzWzFdID0gY29sdW1uMFJvdzE7XHJcblx0XHR0aGlzWzJdID0gY29sdW1uMVJvdzA7XHJcblx0XHR0aGlzWzNdID0gY29sdW1uMVJvdzE7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgY2xvbmUobWF0cml4OiBNYXRyaXgyIHwgbnVtYmVyW10sIHJlc3VsdDogTWF0cml4Mik6IE1hdHJpeDIge1xyXG5cdFx0aWYgKCFkZWZpbmVkKG1hdHJpeCkpIHtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHRcdGlmICghZGVmaW5lZChyZXN1bHQpKSB7XHJcblx0XHRcdHJldHVybiBuZXcgTWF0cml4MihtYXRyaXhbMF0sIG1hdHJpeFsyXSwgbWF0cml4WzFdLCBtYXRyaXhbM10pO1xyXG5cdFx0fVxyXG5cdFx0cmVzdWx0WzBdID0gbWF0cml4WzBdO1xyXG5cdFx0cmVzdWx0WzFdID0gbWF0cml4WzFdO1xyXG5cdFx0cmVzdWx0WzJdID0gbWF0cml4WzJdO1xyXG5cdFx0cmVzdWx0WzNdID0gbWF0cml4WzNdO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBmcm9tQ29sdW1uTWFqb3JBcnJheSh2YWx1ZXM6IG51bWJlcltdLCByZXN1bHQ6IE1hdHJpeDIpOiBNYXRyaXgyIHtcclxuXHRcdHJldHVybiBNYXRyaXgyLmNsb25lKHZhbHVlcywgcmVzdWx0KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBmcm9tUm93TWFqb3JBcnJheSh2YWx1ZXM6IG51bWJlciwgcmVzdWx0OiBNYXRyaXgyKTogTWF0cml4MiB7XHJcblx0XHRpZiAoIWRlZmluZWQocmVzdWx0KSkge1xyXG5cdFx0XHRyZXR1cm4gbmV3IE1hdHJpeDIodmFsdWVzWzBdLCB2YWx1ZXNbMV0sIHZhbHVlc1syXSwgdmFsdWVzWzNdKTtcclxuXHRcdH1cclxuXHRcdHJlc3VsdFswXSA9IHZhbHVlc1swXTtcclxuXHRcdHJlc3VsdFsxXSA9IHZhbHVlc1syXTtcclxuXHRcdHJlc3VsdFsyXSA9IHZhbHVlc1sxXTtcclxuXHRcdHJlc3VsdFszXSA9IHZhbHVlc1szXTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZnJvbVNjYWxlKHNjYWxlOiBWZWN0b3IyLCByZXN1bHQ6IE1hdHJpeDIpOiBNYXRyaXgyIHtcclxuXHRcdGlmICghZGVmaW5lZChyZXN1bHQpKSB7XHJcblx0XHRcdHJldHVybiBuZXcgTWF0cml4MihzY2FsZS54LCAwLjAsIDAuMCwgc2NhbGUueSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmVzdWx0WzBdID0gc2NhbGUueDtcclxuXHRcdHJlc3VsdFsxXSA9IDAuMDtcclxuXHRcdHJlc3VsdFsyXSA9IDAuMDtcclxuXHRcdHJlc3VsdFszXSA9IHNjYWxlLnk7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGZyb21Sb3RhdGlvbihhbmdsZTogbnVtYmVyLCByZXN1bHQ6IE1hdHJpeDIpOiBNYXRyaXgyIHtcclxuXHRcdGNvbnN0IGNvc0FuZ2xlID0gTWF0aC5jb3MoYW5nbGUpO1xyXG5cdFx0Y29uc3Qgc2luQW5nbGUgPSBNYXRoLnNpbihhbmdsZSk7XHJcblxyXG5cdFx0aWYgKCFkZWZpbmVkKHJlc3VsdCkpIHtcclxuXHRcdFx0cmV0dXJuIG5ldyBNYXRyaXgyKGNvc0FuZ2xlLCAtc2luQW5nbGUsIHNpbkFuZ2xlLCBjb3NBbmdsZSk7XHJcblx0XHR9XHJcblx0XHRyZXN1bHRbMF0gPSBjb3NBbmdsZTtcclxuXHRcdHJlc3VsdFsxXSA9IHNpbkFuZ2xlO1xyXG5cdFx0cmVzdWx0WzJdID0gLXNpbkFuZ2xlO1xyXG5cdFx0cmVzdWx0WzNdID0gY29zQW5nbGU7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHR0b0FycmF5KCkge1xyXG5cdFx0Y29uc3QgcmVzdWx0ID0gW107XHJcblx0XHRNYXRyaXgyLnRvQXJyYXkodGhpcywgcmVzdWx0KTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgdG9BcnJheShtYXRyaXg6IE1hdHJpeDIsIHJlc3VsdDogbnVtYmVyW10pOiBudW1iZXJbXSB7XHJcblx0XHRpZiAoIWRlZmluZWQocmVzdWx0KSkge1xyXG5cdFx0XHRyZXR1cm4gW21hdHJpeFswXSwgbWF0cml4WzFdLCBtYXRyaXhbMl0sIG1hdHJpeFszXV07XHJcblx0XHR9XHJcblx0XHRyZXN1bHRbMF0gPSBtYXRyaXhbMF07XHJcblx0XHRyZXN1bHRbMV0gPSBtYXRyaXhbMV07XHJcblx0XHRyZXN1bHRbMl0gPSBtYXRyaXhbMl07XHJcblx0XHRyZXN1bHRbM10gPSBtYXRyaXhbM107XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEVsZW1lbnRJbmRleChjb2x1bW46IG51bWJlciwgcm93OiBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIGNvbHVtbiAqIDIgKyByb3c7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0Q29sdW1uKG1hdHJpeDogTWF0cml4MiwgaW5kZXg6IG51bWJlciwgcmVzdWx0OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcblx0XHRjb25zdCBzdGFydEluZGV4ID0gaW5kZXggKiAyO1xyXG5cdFx0Y29uc3QgeCA9IG1hdHJpeFtzdGFydEluZGV4XTtcclxuXHRcdGNvbnN0IHkgPSBtYXRyaXhbc3RhcnRJbmRleCArIDFdO1xyXG5cclxuXHRcdHJlc3VsdC54ID0geDtcclxuXHRcdHJlc3VsdC55ID0geTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgc2V0Q29sdW1uKG1hdHJpeDogTWF0cml4MiwgaW5kZXg6IG51bWJlciwgY2FydGVzaWFuOiBWZWN0b3IyLCByZXN1bHQ6IE1hdHJpeDIpOiBNYXRyaXgyIHtcclxuXHRcdHJlc3VsdCA9IE1hdHJpeDIuY2xvbmUobWF0cml4LCByZXN1bHQpO1xyXG5cdFx0Y29uc3Qgc3RhcnRJbmRleCA9IGluZGV4ICogMjtcclxuXHRcdHJlc3VsdFtzdGFydEluZGV4XSA9IGNhcnRlc2lhbi54O1xyXG5cdFx0cmVzdWx0W3N0YXJ0SW5kZXggKyAxXSA9IGNhcnRlc2lhbi55O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRSb3cobWF0cml4OiBNYXRyaXgyLCBpbmRleDogbnVtYmVyLCByZXN1bHQ6IFZlY3RvcjIpOiBWZWN0b3IyIHtcclxuXHRcdGNvbnN0IHggPSBtYXRyaXhbaW5kZXhdO1xyXG5cdFx0Y29uc3QgeSA9IG1hdHJpeFtpbmRleCArIDJdO1xyXG5cclxuXHRcdHJlc3VsdC54ID0geDtcclxuXHRcdHJlc3VsdC55ID0geTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgc2V0Um93KG1hdHJpeDogTWF0cml4MiwgaW5kZXg6IG51bWJlciwgY2FydGVzaWFuOiBWZWN0b3IyLCByZXN1bHQ6IE1hdHJpeDIpOiBNYXRyaXgyIHtcclxuXHRcdHJlc3VsdCA9IE1hdHJpeDIuY2xvbmUobWF0cml4LCByZXN1bHQpO1xyXG5cdFx0cmVzdWx0W2luZGV4XSA9IGNhcnRlc2lhbi54O1xyXG5cdFx0cmVzdWx0W2luZGV4ICsgMl0gPSBjYXJ0ZXNpYW4ueTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgc2V0U2NhbGUobWF0cml4OiBNYXRyaXgyLCBzY2FsZTogVmVjdG9yMiwgcmVzdWx0OiBNYXRyaXgyKTogTWF0cml4MiB7XHJcblx0XHRjb25zdCBleGlzdGluZ1NjYWxlID0gTWF0cml4Mi5nZXRTY2FsZShtYXRyaXgsIHNjYWxlU2NyYXRjaDEpO1xyXG5cdFx0Y29uc3Qgc2NhbGVSYXRpb1ggPSBzY2FsZS54IC8gZXhpc3RpbmdTY2FsZS54O1xyXG5cdFx0Y29uc3Qgc2NhbGVSYXRpb1kgPSBzY2FsZS55IC8gZXhpc3RpbmdTY2FsZS55O1xyXG5cclxuXHRcdHJlc3VsdFswXSA9IG1hdHJpeFswXSAqIHNjYWxlUmF0aW9YO1xyXG5cdFx0cmVzdWx0WzFdID0gbWF0cml4WzFdICogc2NhbGVSYXRpb1g7XHJcblx0XHRyZXN1bHRbMl0gPSBtYXRyaXhbMl0gKiBzY2FsZVJhdGlvWTtcclxuXHRcdHJlc3VsdFszXSA9IG1hdHJpeFszXSAqIHNjYWxlUmF0aW9ZO1xyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0U2NhbGUobWF0cml4OiBNYXRyaXgyLCByZXN1bHQ6IFZlY3RvcjIpOiBWZWN0b3IyIHtcclxuXHRcdHJlc3VsdC54ID0gVmVjdG9yMi5tYWduaXR1ZGUoVmVjdG9yMi5mcm9tRWxlbWVudHMobWF0cml4WzBdLCBtYXRyaXhbMV0sIHNjcmF0Y2hDb2x1bW4pKTtcclxuXHRcdHJlc3VsdC55ID0gVmVjdG9yMi5tYWduaXR1ZGUoVmVjdG9yMi5mcm9tRWxlbWVudHMobWF0cml4WzJdLCBtYXRyaXhbM10sIHNjcmF0Y2hDb2x1bW4pKTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0TWF4aW11bVNjYWxlKG1hdHJpeDogTWF0cml4Mik6IG51bWJlciB7XHJcblx0XHRNYXRyaXgyLmdldFNjYWxlKG1hdHJpeCwgc2NhbGVTY3JhdGNoMyk7XHJcblx0XHRyZXR1cm4gVmVjdG9yMi5tYXhpbXVtQ29tcG9uZW50KHNjYWxlU2NyYXRjaDMpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHNldFJvdGF0aW9uKG1hdHJpeDogTWF0cml4Miwgcm90YXRpb246IE1hdHJpeDIsIHJlc3VsdDogTWF0cml4Mik6IE1hdHJpeDIge1xyXG5cdFx0Y29uc3Qgc2NhbGUgPSBNYXRyaXgyLmdldFNjYWxlKG1hdHJpeCwgc2NhbGVTY3JhdGNoNCk7XHJcblxyXG5cdFx0cmVzdWx0WzBdID0gcm90YXRpb25bMF0gKiBzY2FsZS54O1xyXG5cdFx0cmVzdWx0WzFdID0gcm90YXRpb25bMV0gKiBzY2FsZS54O1xyXG5cdFx0cmVzdWx0WzJdID0gcm90YXRpb25bMl0gKiBzY2FsZS55O1xyXG5cdFx0cmVzdWx0WzNdID0gcm90YXRpb25bM10gKiBzY2FsZS55O1xyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0Um90YXRpb24obWF0cml4OiBNYXRyaXgyLCByZXN1bHQ6IE1hdHJpeDIpOiBNYXRyaXgyIHtcclxuXHRcdGNvbnN0IHNjYWxlID0gTWF0cml4Mi5nZXRTY2FsZShtYXRyaXgsIHNjYWxlU2NyYXRjaDUpO1xyXG5cclxuXHRcdHJlc3VsdFswXSA9IG1hdHJpeFswXSAvIHNjYWxlLng7XHJcblx0XHRyZXN1bHRbMV0gPSBtYXRyaXhbMV0gLyBzY2FsZS54O1xyXG5cdFx0cmVzdWx0WzJdID0gbWF0cml4WzJdIC8gc2NhbGUueTtcclxuXHRcdHJlc3VsdFszXSA9IG1hdHJpeFszXSAvIHNjYWxlLnk7XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtdWx0aXBseShsZWZ0OiBNYXRyaXgyLCByaWdodDogTWF0cml4MiwgcmVzdWx0OiBNYXRyaXgyKTogTWF0cml4MiB7XHJcblx0XHRjb25zdCBjb2x1bW4wUm93MCA9IGxlZnRbMF0gKiByaWdodFswXSArIGxlZnRbMl0gKiByaWdodFsxXTtcclxuXHRcdGNvbnN0IGNvbHVtbjFSb3cwID0gbGVmdFswXSAqIHJpZ2h0WzJdICsgbGVmdFsyXSAqIHJpZ2h0WzNdO1xyXG5cdFx0Y29uc3QgY29sdW1uMFJvdzEgPSBsZWZ0WzFdICogcmlnaHRbMF0gKyBsZWZ0WzNdICogcmlnaHRbMV07XHJcblx0XHRjb25zdCBjb2x1bW4xUm93MSA9IGxlZnRbMV0gKiByaWdodFsyXSArIGxlZnRbM10gKiByaWdodFszXTtcclxuXHJcblx0XHRyZXN1bHRbMF0gPSBjb2x1bW4wUm93MDtcclxuXHRcdHJlc3VsdFsxXSA9IGNvbHVtbjBSb3cxO1xyXG5cdFx0cmVzdWx0WzJdID0gY29sdW1uMVJvdzA7XHJcblx0XHRyZXN1bHRbM10gPSBjb2x1bW4xUm93MTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgYWRkKGxlZnQ6IE1hdHJpeDIsIHJpZ2h0OiBNYXRyaXgyLCByZXN1bHQ6IE1hdHJpeDIpIHtcclxuXHRcdHJlc3VsdFswXSA9IGxlZnRbMF0gKyByaWdodFswXTtcclxuXHRcdHJlc3VsdFsxXSA9IGxlZnRbMV0gKyByaWdodFsxXTtcclxuXHRcdHJlc3VsdFsyXSA9IGxlZnRbMl0gKyByaWdodFsyXTtcclxuXHRcdHJlc3VsdFszXSA9IGxlZnRbM10gKyByaWdodFszXTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgc3VidHJhY3QobGVmdDogTWF0cml4MiwgcmlnaHQ6IE1hdHJpeDIsIHJlc3VsdDogTWF0cml4Mik6IE1hdHJpeDIge1xyXG5cdFx0cmVzdWx0WzBdID0gbGVmdFswXSAtIHJpZ2h0WzBdO1xyXG5cdFx0cmVzdWx0WzFdID0gbGVmdFsxXSAtIHJpZ2h0WzFdO1xyXG5cdFx0cmVzdWx0WzJdID0gbGVmdFsyXSAtIHJpZ2h0WzJdO1xyXG5cdFx0cmVzdWx0WzNdID0gbGVmdFszXSAtIHJpZ2h0WzNdO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtdWx0aXBseUJ5VmVjdG9yKG1hdHJpeDogTWF0cml4MiwgY2FydGVzaWFuOiBWZWN0b3IyLCByZXN1bHQ6IFZlY3RvcjIpOiBWZWN0b3IyIHtcclxuXHRcdGNvbnN0IHggPSBtYXRyaXhbMF0gKiBjYXJ0ZXNpYW4ueCArIG1hdHJpeFsyXSAqIGNhcnRlc2lhbi55O1xyXG5cdFx0Y29uc3QgeSA9IG1hdHJpeFsxXSAqIGNhcnRlc2lhbi54ICsgbWF0cml4WzNdICogY2FydGVzaWFuLnk7XHJcblxyXG5cdFx0cmVzdWx0LnggPSB4O1xyXG5cdFx0cmVzdWx0LnkgPSB5O1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtdWx0aXBseUJ5U2NhbGFyKG1hdHJpeDogTWF0cml4Miwgc2NhbGFyOiBudW1iZXIsIHJlc3VsdDogTWF0cml4Mik6IE1hdHJpeDIge1xyXG5cdFx0cmVzdWx0WzBdID0gbWF0cml4WzBdICogc2NhbGFyO1xyXG5cdFx0cmVzdWx0WzFdID0gbWF0cml4WzFdICogc2NhbGFyO1xyXG5cdFx0cmVzdWx0WzJdID0gbWF0cml4WzJdICogc2NhbGFyO1xyXG5cdFx0cmVzdWx0WzNdID0gbWF0cml4WzNdICogc2NhbGFyO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBtdWx0aXBseUJ5U2NhbGUobWF0cml4OiBNYXRyaXgyLCBzY2FsZTogVmVjdG9yMiwgcmVzdWx0OiBNYXRyaXgyKTogTWF0cml4MiB7XHJcblx0XHRyZXN1bHRbMF0gPSBtYXRyaXhbMF0gKiBzY2FsZS54O1xyXG5cdFx0cmVzdWx0WzFdID0gbWF0cml4WzFdICogc2NhbGUueDtcclxuXHRcdHJlc3VsdFsyXSA9IG1hdHJpeFsyXSAqIHNjYWxlLnk7XHJcblx0XHRyZXN1bHRbM10gPSBtYXRyaXhbM10gKiBzY2FsZS55O1xyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgbmVnYXRlKG1hdHJpeDogTWF0cml4MiwgcmVzdWx0OiBNYXRyaXgyKTogTWF0cml4MiB7XHJcblx0XHRyZXN1bHRbMF0gPSAtbWF0cml4WzBdO1xyXG5cdFx0cmVzdWx0WzFdID0gLW1hdHJpeFsxXTtcclxuXHRcdHJlc3VsdFsyXSA9IC1tYXRyaXhbMl07XHJcblx0XHRyZXN1bHRbM10gPSAtbWF0cml4WzNdO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyB0cmFuc3Bvc2UobWF0cml4OiBNYXRyaXgyLCByZXN1bHQ6IE1hdHJpeDIpOiBNYXRyaXgyIHtcclxuXHRcdGNvbnN0IGNvbHVtbjBSb3cwID0gbWF0cml4WzBdO1xyXG5cdFx0Y29uc3QgY29sdW1uMFJvdzEgPSBtYXRyaXhbMl07XHJcblx0XHRjb25zdCBjb2x1bW4xUm93MCA9IG1hdHJpeFsxXTtcclxuXHRcdGNvbnN0IGNvbHVtbjFSb3cxID0gbWF0cml4WzNdO1xyXG5cclxuXHRcdHJlc3VsdFswXSA9IGNvbHVtbjBSb3cwO1xyXG5cdFx0cmVzdWx0WzFdID0gY29sdW1uMFJvdzE7XHJcblx0XHRyZXN1bHRbMl0gPSBjb2x1bW4xUm93MDtcclxuXHRcdHJlc3VsdFszXSA9IGNvbHVtbjFSb3cxO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBhYnMobWF0cml4OiBNYXRyaXgyLCByZXN1bHQ6IE1hdHJpeDIpOiBNYXRyaXgyIHtcclxuXHRcdHJlc3VsdFswXSA9IE1hdGguYWJzKG1hdHJpeFswXSk7XHJcblx0XHRyZXN1bHRbMV0gPSBNYXRoLmFicyhtYXRyaXhbMV0pO1xyXG5cdFx0cmVzdWx0WzJdID0gTWF0aC5hYnMobWF0cml4WzJdKTtcclxuXHRcdHJlc3VsdFszXSA9IE1hdGguYWJzKG1hdHJpeFszXSk7XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBlcXVhbHMobGVmdDogTWF0cml4MiwgcmlnaHQ6IE1hdHJpeDIpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdGxlZnQgPT09IHJpZ2h0IHx8XHJcblx0XHRcdChkZWZpbmVkKGxlZnQpICYmXHJcblx0XHRcdFx0ZGVmaW5lZChyaWdodCkgJiZcclxuXHRcdFx0XHRsZWZ0WzBdID09PSByaWdodFswXSAmJlxyXG5cdFx0XHRcdGxlZnRbMV0gPT09IHJpZ2h0WzFdICYmXHJcblx0XHRcdFx0bGVmdFsyXSA9PT0gcmlnaHRbMl0gJiZcclxuXHRcdFx0XHRsZWZ0WzNdID09PSByaWdodFszXSlcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqL1xyXG5cdHN0YXRpYyBlcXVhbHNBcnJheShtYXRyaXg6IE1hdHJpeDIsIGFycmF5OiBudW1iZXJbXSwgb2Zmc2V0OiBudW1iZXIpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdG1hdHJpeFswXSA9PT0gYXJyYXlbb2Zmc2V0XSAmJlxyXG5cdFx0XHRtYXRyaXhbMV0gPT09IGFycmF5W29mZnNldCArIDFdICYmXHJcblx0XHRcdG1hdHJpeFsyXSA9PT0gYXJyYXlbb2Zmc2V0ICsgMl0gJiZcclxuXHRcdFx0bWF0cml4WzNdID09PSBhcnJheVtvZmZzZXQgKyAzXVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBlcXVhbHNFcHNpbG9uKGxlZnQ6IE1hdHJpeDIsIHJpZ2h0OiBNYXRyaXgyLCBlcHNpbG9uID0gMCk6IGJvb2xlYW4ge1xyXG5cdFx0ZXBzaWxvbiA9IGRlZmF1bHRWYWx1ZShlcHNpbG9uLCAwKTtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdGxlZnQgPT09IHJpZ2h0IHx8XHJcblx0XHRcdChkZWZpbmVkKGxlZnQpICYmXHJcblx0XHRcdFx0ZGVmaW5lZChyaWdodCkgJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzBdIC0gcmlnaHRbMF0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzFdIC0gcmlnaHRbMV0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzJdIC0gcmlnaHRbMl0pIDw9IGVwc2lsb24gJiZcclxuXHRcdFx0XHRNYXRoLmFicyhsZWZ0WzNdIC0gcmlnaHRbM10pIDw9IGVwc2lsb24pXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHN0YXRpYyBJREVOVElUWSA9IE9iamVjdC5mcmVlemUobmV3IE1hdHJpeDIoMS4wLCAwLjAsIDAuMCwgMS4wKSk7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgWkVSTyA9IE9iamVjdC5mcmVlemUobmV3IE1hdHJpeDIoMC4wLCAwLjAsIDAuMCwgMC4wKSk7XHJcblxyXG5cdGNsb25lKHJlc3VsdDogTWF0cml4Mik6IE1hdHJpeDIge1xyXG5cdFx0cmV0dXJuIE1hdHJpeDIuY2xvbmUodGhpcywgcmVzdWx0KTtcclxuXHR9XHJcblxyXG5cdGVxdWFscyhyaWdodDogTWF0cml4Mik6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIE1hdHJpeDIuZXF1YWxzKHRoaXMsIHJpZ2h0KTtcclxuXHR9XHJcblxyXG5cdGVxdWFsc0Vwc2lsb24ocmlnaHQ6IE1hdHJpeDIsIGVwc2lsb24gPSAwKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gTWF0cml4Mi5lcXVhbHNFcHNpbG9uKHRoaXMsIHJpZ2h0LCBlcHNpbG9uKTtcclxuXHR9XHJcblxyXG5cdHRvU3RyaW5nKCkge1xyXG5cdFx0cmV0dXJuIGAoJHt0aGlzWzBdfSwgJHt0aGlzWzJdfSlcXG5gICsgYCgke3RoaXNbMV19LCAke3RoaXNbM119KWA7XHJcblx0fVxyXG59XHJcbmNvbnN0IHNjYWxlU2NyYXRjaDEgPSBuZXcgVmVjdG9yMigpO1xyXG5jb25zdCBzY2FsZVNjcmF0Y2gyID0gbmV3IFZlY3RvcjIoKTtcclxuY29uc3Qgc2NhbGVTY3JhdGNoMyA9IG5ldyBWZWN0b3IyKCk7XHJcbmNvbnN0IHNjYWxlU2NyYXRjaDQgPSBuZXcgVmVjdG9yMigpO1xyXG5jb25zdCBzY3JhdGNoQ29sdW1uID0gbmV3IFZlY3RvcjIoKTtcclxuY29uc3Qgc2NhbGVTY3JhdGNoNSA9IG5ldyBWZWN0b3IyKCk7XHJcbmV4cG9ydCBkZWZhdWx0IE1hdHJpeDI7XHJcbiIsImltcG9ydCB7IFNoYWRlclN0YWdlIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVQ29uc3RhbnRcIjtcclxuaW1wb3J0IHsgVW5pZm9ybUZ1bmMsIFVuaWZvcm1FbnVtLCBVbmlmb3JtU3RydWN0IH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVVHlwZXNcIjtcclxuaW1wb3J0IHsgRGlyZWN0aW9uYWxMaWdodCB9IGZyb20gXCIuLi9saWdodC9EaXJlY3Rpb25hbExpZ2h0XCI7XHJcbmltcG9ydCB7IFBvaW50TGlnaHQgfSBmcm9tIFwiLi4vbGlnaHQvUG9pbnRMaWdodFwiO1xyXG5pbXBvcnQgeyBTcG90TGlnaHQgfSBmcm9tIFwiLi4vbGlnaHQvU3BvdExpZ2h0XCI7XHJcbmltcG9ydCBDb2xvciBmcm9tIFwiLi4vbWF0aC9Db2xvclwiO1xyXG5pbXBvcnQgTWF0cml4MiBmcm9tIFwiLi4vbWF0aC9NYXRyaXgyXCI7XHJcbmltcG9ydCBNYXRyaXgzIGZyb20gXCIuLi9tYXRoL01hdHJpeDNcIjtcclxuaW1wb3J0IE1hdHJpeDQgZnJvbSBcIi4uL21hdGgvTWF0cml4NFwiO1xyXG5pbXBvcnQgVmVjdG9yMiBmcm9tIFwiLi4vbWF0aC9WZWN0b3IyXCI7XHJcbmltcG9ydCBWZWN0b3IzIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjNcIjtcclxuaW1wb3J0IFZlY3RvcjQgZnJvbSBcIi4uL21hdGgvVmVjdG9yNFwiO1xyXG5pbXBvcnQgZGVmYXVsdFZhbHVlIGZyb20gXCIuLi91dGlscy9kZWZhdWx0VmFsdWVcIjtcclxuaW1wb3J0IFNhbXBsZXIgZnJvbSBcIi4vU2FtcGxlclwiO1xyXG5pbXBvcnQgVGV4dHVyZSBmcm9tIFwiLi9UZXh0dXJlXCI7XHJcbmltcG9ydCBVbmlmb3JtQnVmZmVyIGZyb20gXCIuL1VuaWZvcm1CdWZmZXJcIjtcclxuZXhwb3J0IGNsYXNzIFVuaWZvcm08VD4ge1xyXG5cdF92YWx1ZTogVDtcclxuXHRuYW1lOiBzdHJpbmc7XHJcblx0dmFsdWU6IFQ7XHJcblx0b2Zmc2V0OiBudW1iZXI7XHJcblx0YnVmZmVyOiBGbG9hdDMyQXJyYXkgfCBVaW50MTZBcnJheSB8IFVpbnQzMkFycmF5IHwgVWludDhBcnJheSB8IEZsb2F0NjRBcnJheTtcclxuXHRjYjogVW5pZm9ybUZ1bmMgfCBudW1iZXIgfCBvYmplY3Q7XHJcblx0Ynl0ZVNpemU6IG51bWJlcjtcclxuXHR0eXBlPzogc3RyaW5nO1xyXG5cdGRpcnR5PzogYm9vbGVhbjtcclxuXHJcblx0Y29uc3RydWN0b3IodW5pZm9ybU5hbWU6IHN0cmluZywgY2I/OiBVbmlmb3JtRnVuYyB8IG51bWJlciB8IG9iamVjdCwgb2Zmc2V0PzogbnVtYmVyKSB7XHJcblx0XHR0aGlzLm5hbWUgPSB1bmlmb3JtTmFtZTtcclxuXHRcdHRoaXMuY2IgPSBjYjtcclxuXHRcdHRoaXMub2Zmc2V0ID0gZGVmYXVsdFZhbHVlKG9mZnNldCwgMCk7XHJcblx0XHR0aGlzLnR5cGUgPSBcIm51bWJlclwiO1xyXG5cdH1cclxuXHRzZXRCdWZmZXIoYXJyYXk6IEFycmF5PG51bWJlcj4sIG9mZnNldCA9IDApIHtcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dGhpcy5idWZmZXJbaSArIG9mZnNldF0gPSBhcnJheVtpXTtcclxuXHRcdH1cclxuXHR9XHJcblx0c2V0KCkge1xyXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHR9XHJcblx0Z2V0VmFsdWUoKSB7XHJcblx0XHRsZXQgcmVzdWx0O1xyXG5cdFx0Y29uc3QgY2JUeXBlID0gdHlwZW9mIHRoaXMuY2I7XHJcblx0XHRzd2l0Y2ggKGNiVHlwZSkge1xyXG5cdFx0XHRjYXNlIFwib2JqZWN0XCI6XHJcblx0XHRcdFx0cmVzdWx0ID0gdGhpcy5jYlt0aGlzLm5hbWVdIHx8IHRoaXMuY2I7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgXCJmdW5jdGlvblwiOlxyXG5cdFx0XHRcdC8vIEB0cy1pZ25vcmVcclxuXHRcdFx0XHRyZXN1bHQgPSB0aGlzLmNiKCk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgXCJudW1iZXJcIjpcclxuXHRcdFx0XHRyZXN1bHQgPSB0aGlzLmNiO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInR5cGUgaXMgZXJyb3JcIik7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHQvLyBjb21wYXJlIGFycmF5XHJcblx0ZXF1YWxzKHYpIHtcclxuXHRcdGlmICgodGhpcy5fdmFsdWUgYXMgQXJyYXk8bnVtYmVyPikubGVuZ3RoICE9PSB2Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGlmICh2W2ldICE9PSB0aGlzLl92YWx1ZVtpXSkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVW5pZm9ybVVpbnQgZXh0ZW5kcyBVbmlmb3JtPG51bWJlcj4ge1xyXG5cdHN0YXRpYyBhbGlnbiA9IDQ7XHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHR1bmlmb3JtTmFtZTogc3RyaW5nLFxyXG5cdFx0YnVmZmVyOiBGbG9hdDMyQXJyYXksXHJcblx0XHRieXRlT2Zmc2V0OiBudW1iZXIsXHJcblx0XHRjYjogVW5pZm9ybUZ1bmMgfCBudW1iZXIgfCBvYmplY3QsXHJcblx0XHRvZmZzZXQ/OiBudW1iZXJcclxuXHQpIHtcclxuXHRcdHN1cGVyKHVuaWZvcm1OYW1lLCBjYiwgb2Zmc2V0KTtcclxuXHRcdHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XHJcblx0XHR0aGlzLl92YWx1ZSA9IDA7XHJcblx0XHR0aGlzLmJ5dGVTaXplID0gNDtcclxuXHRcdHRoaXMuYnVmZmVyID0gbmV3IFVpbnQzMkFycmF5KGJ1ZmZlci5idWZmZXIsIGJ5dGVPZmZzZXQsIDEpO1xyXG5cdFx0dGhpcy50eXBlID0gXCJ1aW50XCI7XHJcblx0fVxyXG5cdHNldCgpIHtcclxuXHRcdGlmICh0aGlzLmNiICE9IHVuZGVmaW5lZCkgdGhpcy52YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcclxuXHRcdGlmICh0aGlzLnZhbHVlICE9PSB0aGlzLl92YWx1ZSkge1xyXG5cdFx0XHR0aGlzLl92YWx1ZSA9IHRoaXMudmFsdWU7XHJcblx0XHRcdHRoaXMuYnVmZmVyWzBdID0gdGhpcy52YWx1ZTtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVW5pZm9ybUZsb2F0IGV4dGVuZHMgVW5pZm9ybTxudW1iZXI+IHtcclxuXHRzdGF0aWMgYWxpZ24gPSA0O1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0dW5pZm9ybU5hbWU6IHN0cmluZyxcclxuXHRcdGJ1ZmZlcjogRmxvYXQzMkFycmF5LFxyXG5cdFx0Ynl0ZU9mZnNldDogbnVtYmVyLFxyXG5cdFx0Y2I6IFVuaWZvcm1GdW5jIHwgbnVtYmVyIHwgb2JqZWN0LFxyXG5cdFx0b2Zmc2V0PzogbnVtYmVyXHJcblx0KSB7XHJcblx0XHRzdXBlcih1bmlmb3JtTmFtZSwgY2IsIG9mZnNldCk7XHJcblx0XHR0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xyXG5cdFx0dGhpcy5fdmFsdWUgPSAwO1xyXG5cdFx0dGhpcy5ieXRlU2l6ZSA9IDQ7XHJcblx0XHR0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyLmJ1ZmZlciwgYnl0ZU9mZnNldCwgMSk7XHJcblx0XHR0aGlzLnR5cGUgPSBcInZlYzFcIjtcclxuXHR9XHJcblx0c2V0KCkge1xyXG5cdFx0aWYgKHRoaXMuY2IgIT0gdW5kZWZpbmVkKSB0aGlzLnZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xyXG5cdFx0aWYgKHRoaXMudmFsdWUgIT09IHRoaXMuX3ZhbHVlKSB7XHJcblx0XHRcdHRoaXMuX3ZhbHVlID0gdGhpcy52YWx1ZTtcclxuXHRcdFx0dGhpcy5idWZmZXJbMF0gPSB0aGlzLnZhbHVlO1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFVuaWZvcm1GbG9hdFZlYzIgZXh0ZW5kcyBVbmlmb3JtPFZlY3RvcjI+IHtcclxuXHRzdGF0aWMgYWxpZ24gPSA4O1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0dW5pZm9ybU5hbWU6IHN0cmluZyxcclxuXHRcdGJ1ZmZlcjogRmxvYXQzMkFycmF5LFxyXG5cdFx0Ynl0ZU9mZnNldDogbnVtYmVyLFxyXG5cdFx0Y2I6IFVuaWZvcm1GdW5jIHwgbnVtYmVyIHwgb2JqZWN0LFxyXG5cdFx0b2Zmc2V0PzogbnVtYmVyXHJcblx0KSB7XHJcblx0XHRzdXBlcih1bmlmb3JtTmFtZSwgY2IsIG9mZnNldCk7XHJcblx0XHR0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xyXG5cdFx0dGhpcy5fdmFsdWUgPSBuZXcgVmVjdG9yMigpO1xyXG5cdFx0dGhpcy5idWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlci5idWZmZXIsIGJ5dGVPZmZzZXQsIDIpO1xyXG5cdFx0dGhpcy5ieXRlU2l6ZSA9IDg7XHJcblx0XHR0aGlzLnR5cGUgPSBcInZlYzJcIjtcclxuXHR9XHJcblx0c2V0KCk6IGJvb2xlYW4ge1xyXG5cdFx0aWYgKHRoaXMuY2IgIT0gdW5kZWZpbmVkKSB0aGlzLnZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xyXG5cdFx0Y29uc3QgdiA9IHRoaXMudmFsdWU7XHJcblx0XHRpZiAodiBpbnN0YW5jZW9mIFZlY3RvcjIpIHtcclxuXHRcdFx0aWYgKFZlY3RvcjIuZXF1YWxzKHYsIHRoaXMuX3ZhbHVlKSkgcmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRWZWN0b3IyLmNsb25lKHYsIHRoaXMuX3ZhbHVlKTtcclxuXHRcdFx0dGhpcy5zZXRCdWZmZXIodGhpcy5fdmFsdWUudG9BcnJheSgpKTtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpZiAodGhpcy5lcXVhbHModikpIHJldHVybiBmYWxzZTtcclxuXHRcdFx0dGhpcy5fdmFsdWUgPSB2O1xyXG5cdFx0XHR0aGlzLnNldEJ1ZmZlcih2KTtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbmV4cG9ydCBjbGFzcyBVbmlmb3JtRmxvYXRWZWMzIGV4dGVuZHMgVW5pZm9ybTxWZWN0b3IzPiB7XHJcblx0c3RhdGljIGFsaWduID0gMTY7XHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHR1bmlmb3JtTmFtZTogc3RyaW5nLFxyXG5cdFx0YnVmZmVyOiBGbG9hdDMyQXJyYXksXHJcblx0XHRieXRlT2Zmc2V0OiBudW1iZXIsXHJcblx0XHRjYjogVW5pZm9ybUZ1bmMgfCBudW1iZXIgfCBvYmplY3QsXHJcblx0XHRvZmZzZXQ/OiBudW1iZXJcclxuXHQpIHtcclxuXHRcdHN1cGVyKHVuaWZvcm1OYW1lLCBjYiwgb2Zmc2V0KTtcclxuXHRcdHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XHJcblx0XHR0aGlzLl92YWx1ZSA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHR0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyLmJ1ZmZlciwgYnl0ZU9mZnNldCwgMyk7XHJcblx0XHR0aGlzLmJ5dGVTaXplID0gMTI7XHJcblx0XHR0aGlzLnR5cGUgPSBcInZlYzNcIjtcclxuXHR9XHJcblx0c2V0KCk6IGJvb2xlYW4ge1xyXG5cdFx0aWYgKHRoaXMuY2IgIT0gdW5kZWZpbmVkKSB0aGlzLnZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xyXG5cdFx0Y29uc3QgdiA9IHRoaXMudmFsdWU7XHJcblx0XHRpZiAodiBpbnN0YW5jZW9mIFZlY3RvcjMpIHtcclxuXHRcdFx0aWYgKFZlY3RvcjMuZXF1YWxzKHYsIHRoaXMuX3ZhbHVlKSkgcmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRWZWN0b3IzLmNsb25lKHYsIHRoaXMuX3ZhbHVlKTtcclxuXHRcdFx0dGhpcy5zZXRCdWZmZXIodGhpcy5fdmFsdWUudG9BcnJheSgpKTtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpZiAodGhpcy5lcXVhbHModikpIHJldHVybiBmYWxzZTtcclxuXHRcdFx0dGhpcy5fdmFsdWUgPSB2O1xyXG5cdFx0XHR0aGlzLnNldEJ1ZmZlcih2KTtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbmV4cG9ydCBjbGFzcyBVbmlmb3JtRmxvYXRWZWM0IGV4dGVuZHMgVW5pZm9ybTxWZWN0b3I0PiB7XHJcblx0c3RhdGljIGFsaWduID0gMTY7XHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHR1bmlmb3JtTmFtZTogc3RyaW5nLFxyXG5cdFx0YnVmZmVyOiBGbG9hdDMyQXJyYXksXHJcblx0XHRieXRlT2Zmc2V0OiBudW1iZXIsXHJcblx0XHRjYjogVW5pZm9ybUZ1bmMgfCBudW1iZXIgfCBvYmplY3QsXHJcblx0XHRvZmZzZXQ/OiBudW1iZXJcclxuXHQpIHtcclxuXHRcdHN1cGVyKHVuaWZvcm1OYW1lLCBjYiwgb2Zmc2V0KTtcclxuXHRcdHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XHJcblx0XHR0aGlzLl92YWx1ZSA9IG5ldyBWZWN0b3I0KCk7XHJcblx0XHR0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyLmJ1ZmZlciwgYnl0ZU9mZnNldCwgNCk7XHJcblx0XHR0aGlzLmJ5dGVTaXplID0gMTY7XHJcblx0XHR0aGlzLnR5cGUgPSBcInZlYzRcIjtcclxuXHR9XHJcblx0c2V0KCk6IGJvb2xlYW4ge1xyXG5cdFx0aWYgKHRoaXMuY2IgIT0gdW5kZWZpbmVkKSB0aGlzLnZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xyXG5cdFx0Y29uc3QgdiA9IHRoaXMudmFsdWU7XHJcblx0XHRpZiAodiBpbnN0YW5jZW9mIFZlY3RvcjQpIHtcclxuXHRcdFx0aWYgKFZlY3RvcjQuZXF1YWxzKHYsIHRoaXMuX3ZhbHVlKSkgcmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRWZWN0b3I0LmNsb25lKHYsIHRoaXMuX3ZhbHVlKTtcclxuXHRcdFx0dGhpcy5zZXRCdWZmZXIodGhpcy5fdmFsdWUudG9BcnJheSgpKTtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpZiAodGhpcy5lcXVhbHModikpIHJldHVybiBmYWxzZTtcclxuXHRcdFx0dGhpcy5fdmFsdWUgPSB2O1xyXG5cdFx0XHR0aGlzLnNldEJ1ZmZlcih2KTtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbmV4cG9ydCBjbGFzcyBVbmlmb3JtQ29sb3IgZXh0ZW5kcyBVbmlmb3JtPENvbG9yPiB7XHJcblx0c3RhdGljIGFsaWduID0gMTY7XHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHR1bmlmb3JtTmFtZTogc3RyaW5nLFxyXG5cdFx0YnVmZmVyOiBGbG9hdDMyQXJyYXksXHJcblx0XHRieXRlT2Zmc2V0OiBudW1iZXIsXHJcblx0XHRjYjogVW5pZm9ybUZ1bmMgfCBudW1iZXIgfCBvYmplY3QsXHJcblx0XHRvZmZzZXQ/OiBudW1iZXJcclxuXHQpIHtcclxuXHRcdHN1cGVyKHVuaWZvcm1OYW1lLCBjYiwgb2Zmc2V0KTtcclxuXHRcdHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XHJcblx0XHR0aGlzLl92YWx1ZSA9IG5ldyBDb2xvcigpO1xyXG5cdFx0dGhpcy5idWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlci5idWZmZXIsIGJ5dGVPZmZzZXQsIDMpO1xyXG5cdFx0dGhpcy5ieXRlU2l6ZSA9IDEyO1xyXG5cdFx0dGhpcy50eXBlID0gXCJ2ZWMzXCI7XHJcblx0fVxyXG5cdHNldCgpOiBib29sZWFuIHtcclxuXHRcdGlmICh0aGlzLmNiICE9IHVuZGVmaW5lZCkgdGhpcy52YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcclxuXHRcdGNvbnN0IHYgPSB0aGlzLnZhbHVlO1xyXG5cdFx0aWYgKHYgaW5zdGFuY2VvZiBDb2xvcikge1xyXG5cdFx0XHRpZiAoQ29sb3IuZXF1YWxzKHYsIHRoaXMuX3ZhbHVlKSkgcmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRDb2xvci5jbG9uZSh2LCB0aGlzLl92YWx1ZSk7XHJcblx0XHRcdHRoaXMuc2V0QnVmZmVyKHRoaXMuX3ZhbHVlLnRvQXJyYXkoKSk7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0aWYgKHRoaXMuZXF1YWxzKHYpKSByZXR1cm4gZmFsc2U7XHJcblx0XHRcdHRoaXMuX3ZhbHVlID0gdjtcclxuXHRcdFx0dGhpcy5zZXRCdWZmZXIodik7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFVuaWZvcm1NYXQyIGV4dGVuZHMgVW5pZm9ybTxNYXRyaXgyPiB7XHJcblx0c3RhdGljIGFsaWduID0gODtcclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHVuaWZvcm1OYW1lOiBzdHJpbmcsXHJcblx0XHRidWZmZXI6IEZsb2F0MzJBcnJheSxcclxuXHRcdGJ5dGVPZmZzZXQ6IG51bWJlcixcclxuXHRcdGNiOiBVbmlmb3JtRnVuYyB8IG51bWJlciB8IG9iamVjdCxcclxuXHRcdG9mZnNldD86IG51bWJlclxyXG5cdCkge1xyXG5cdFx0c3VwZXIodW5pZm9ybU5hbWUsIGNiLCBvZmZzZXQpO1xyXG5cdFx0dGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcclxuXHRcdHRoaXMuX3ZhbHVlID0gbmV3IE1hdHJpeDIoKTtcclxuXHRcdHRoaXMuYnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheShidWZmZXIuYnVmZmVyLCBieXRlT2Zmc2V0LCA0KTtcclxuXHRcdHRoaXMuYnl0ZVNpemUgPSAxNjtcclxuXHRcdHRoaXMudHlwZSA9IFwibWF0MlwiO1xyXG5cdH1cclxuXHRzZXQoKTogYm9vbGVhbiB7XHJcblx0XHRpZiAodGhpcy5jYiAhPSB1bmRlZmluZWQpIHRoaXMudmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XHJcblx0XHRjb25zdCB2ID0gdGhpcy52YWx1ZTtcclxuXHRcdGlmICh2IGluc3RhbmNlb2YgTWF0cml4Mikge1xyXG5cdFx0XHRpZiAoTWF0cml4Mi5lcXVhbHModiwgdGhpcy5fdmFsdWUpKSByZXR1cm4gZmFsc2U7XHJcblx0XHRcdE1hdHJpeDIuY2xvbmUodiwgdGhpcy5fdmFsdWUpO1xyXG5cdFx0XHR0aGlzLnNldEJ1ZmZlcih0aGlzLl92YWx1ZS50b0FycmF5KCkpO1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGlmICh0aGlzLmVxdWFscyh2KSkgcmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR0aGlzLl92YWx1ZSA9IHY7XHJcblx0XHRcdHRoaXMuc2V0QnVmZmVyKHYpO1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFVuaWZvcm1NYXQzIGV4dGVuZHMgVW5pZm9ybTxNYXRyaXgzPiB7XHJcblx0c3RhdGljIGFsaWduID0gMTY7XHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHR1bmlmb3JtTmFtZTogc3RyaW5nLFxyXG5cdFx0YnVmZmVyOiBGbG9hdDMyQXJyYXksXHJcblx0XHRieXRlT2Zmc2V0OiBudW1iZXIsXHJcblx0XHRjYjogVW5pZm9ybUZ1bmMgfCBudW1iZXIgfCBvYmplY3QsXHJcblx0XHRvZmZzZXQ/OiBudW1iZXJcclxuXHQpIHtcclxuXHRcdHN1cGVyKHVuaWZvcm1OYW1lLCBjYiwgb2Zmc2V0KTtcclxuXHRcdHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XHJcblx0XHR0aGlzLl92YWx1ZSA9IG5ldyBNYXRyaXgzKCk7XHJcblx0XHR0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyLmJ1ZmZlciwgYnl0ZU9mZnNldCwgOSk7XHJcblx0XHR0aGlzLmJ5dGVTaXplID0gNDg7XHJcblx0XHR0aGlzLnR5cGUgPSBcIm1hdDNcIjtcclxuXHR9XHJcblx0c2V0KCk6IGJvb2xlYW4ge1xyXG5cdFx0aWYgKHRoaXMuY2IgIT0gdW5kZWZpbmVkKSB0aGlzLnZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xyXG5cdFx0Y29uc3QgdiA9IHRoaXMudmFsdWU7XHJcblx0XHRpZiAodiBpbnN0YW5jZW9mIE1hdHJpeDMpIHtcclxuXHRcdFx0aWYgKE1hdHJpeDMuZXF1YWxzKHYsIHRoaXMuX3ZhbHVlKSkgcmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRNYXRyaXgzLmNsb25lKHYsIHRoaXMuX3ZhbHVlKTtcclxuXHRcdFx0dGhpcy5zZXRCdWZmZXIodGhpcy5fdmFsdWUudG9BcnJheSgpKTtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpZiAodGhpcy5lcXVhbHModikpIHJldHVybiBmYWxzZTtcclxuXHRcdFx0dGhpcy5fdmFsdWUgPSB2O1xyXG5cdFx0XHR0aGlzLnNldEJ1ZmZlcih2KTtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbmV4cG9ydCBjbGFzcyBVbmlmb3JtTWF0NCBleHRlbmRzIFVuaWZvcm08TWF0cml4ND4ge1xyXG5cdHN0YXRpYyBhbGlnbiA9IDE2O1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0dW5pZm9ybU5hbWU6IHN0cmluZyxcclxuXHRcdGJ1ZmZlcjogRmxvYXQzMkFycmF5LFxyXG5cdFx0Ynl0ZU9mZnNldDogbnVtYmVyLFxyXG5cdFx0Y2I6IFVuaWZvcm1GdW5jIHwgbnVtYmVyIHwgb2JqZWN0LFxyXG5cdFx0b2Zmc2V0PzogbnVtYmVyXHJcblx0KSB7XHJcblx0XHRzdXBlcih1bmlmb3JtTmFtZSwgY2IsIG9mZnNldCk7XHJcblx0XHR0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xyXG5cdFx0dGhpcy5fdmFsdWUgPSBuZXcgTWF0cml4NCgpO1xyXG5cdFx0dGhpcy5idWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlci5idWZmZXIsIGJ5dGVPZmZzZXQsIDE2KTtcclxuXHRcdHRoaXMuYnl0ZVNpemUgPSA2NDtcclxuXHRcdHRoaXMudHlwZSA9IFwibWF0NFwiO1xyXG5cdH1cclxuXHRzZXQoKTogYm9vbGVhbiB7XHJcblx0XHRpZiAodGhpcy5jYiAhPSB1bmRlZmluZWQpIHRoaXMudmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XHJcblx0XHRjb25zdCB2ID0gdGhpcy52YWx1ZTtcclxuXHRcdGlmICh2IGluc3RhbmNlb2YgTWF0cml4NCkge1xyXG5cdFx0XHRpZiAoTWF0cml4NC5lcXVhbHModiwgdGhpcy5fdmFsdWUpKSByZXR1cm4gZmFsc2U7XHJcblx0XHRcdE1hdHJpeDQuY2xvbmUodiwgdGhpcy5fdmFsdWUpO1xyXG5cdFx0XHR0aGlzLnNldEJ1ZmZlcih0aGlzLl92YWx1ZS50b0FycmF5KCkpO1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIGlmKHRoaXMuZXF1YWxzKHYpKSByZXR1cm4gZmFsc2U7XHJcblx0XHRcdHRoaXMuX3ZhbHVlID0gdjtcclxuXHRcdFx0dGhpcy5zZXRCdWZmZXIodik7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5leHBvcnQgY2xhc3MgVW5pZm9ybU1hdHJpeDRBcnJheSBleHRlbmRzIFVuaWZvcm08QXJyYXk8TWF0cml4ND4+IHtcclxuXHRzdGF0aWMgYWxpZ24gPSAxNjtcclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHVuaWZvcm1OYW1lOiBzdHJpbmcsXHJcblx0XHRidWZmZXI6IEZsb2F0MzJBcnJheSxcclxuXHRcdGJ5dGVPZmZzZXQ6IG51bWJlcixcclxuXHRcdGNiOiBVbmlmb3JtRnVuYyB8IG51bWJlciB8IG9iamVjdCxcclxuXHRcdGNvdW50PzogbnVtYmVyXHJcblx0KSB7XHJcblx0XHRzdXBlcih1bmlmb3JtTmFtZSwgY2IsIDApO1xyXG5cdFx0dGhpcy5ieXRlU2l6ZSA9IGNvdW50ICogNjQ7XHJcblx0XHR0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyLmJ1ZmZlciwgYnl0ZU9mZnNldCwgdGhpcy5ieXRlU2l6ZSAvIDQpO1xyXG5cdFx0dGhpcy50eXBlID0gXCJtYXQ0LWFycmF5XCI7XHJcblx0fVxyXG5cdHNldCgpOiBib29sZWFuIHtcclxuXHRcdHRoaXMudmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XHJcblx0XHRpZiAoIXRoaXMudmFsdWUpIHJldHVybiBmYWxzZTtcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52YWx1ZS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR0aGlzLnNldEJ1ZmZlcih0aGlzLnZhbHVlW2ldLnRvQXJyYXkoKSwgaSAqIDE2KTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cdH1cclxufVxyXG5leHBvcnQgY2xhc3MgVW5pZm9ybUZsb2F0QXJyYXkgZXh0ZW5kcyBVbmlmb3JtPEFycmF5PG51bWJlcj4+IHtcclxuXHRzdGF0aWMgYWxpZ24gPSA0O1xyXG5cdC8vIGNiOiBGdW5jdGlvbjtcclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHVuaWZvcm1OYW1lOiBzdHJpbmcsXHJcblx0XHRidWZmZXI6IEZsb2F0MzJBcnJheSxcclxuXHRcdGJ5dGVPZmZzZXQ6IG51bWJlcixcclxuXHRcdGNiOiBVbmlmb3JtRnVuYyB8IG51bWJlciB8IG9iamVjdCxcclxuXHRcdGNvdW50PzogbnVtYmVyXHJcblx0KSB7XHJcblx0XHRzdXBlcih1bmlmb3JtTmFtZSwgY2IsIDApO1xyXG5cdFx0dGhpcy5idWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlci5idWZmZXIsIGJ5dGVPZmZzZXQsIGNvdW50KTtcclxuXHRcdHRoaXMuYnl0ZVNpemUgPSA0ICogY291bnQ7XHJcblx0XHR0aGlzLnR5cGUgPSBcImZsb2F0LWFycmF5XCI7XHJcblx0fVxyXG5cdHNldCgpOiBib29sZWFuIHtcclxuXHRcdHRoaXMudmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWUubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dGhpcy5idWZmZXJbaV0gPSB0aGlzLnZhbHVlW2ldO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG59XHJcbmV4cG9ydCBjbGFzcyBVbmlmb3JtVmVjMkFycmF5IGV4dGVuZHMgVW5pZm9ybTxBcnJheTxWZWN0b3IyPj4ge1xyXG5cdHN0YXRpYyBhbGlnbiA9IDg7XHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHR1bmlmb3JtTmFtZTogc3RyaW5nLFxyXG5cdFx0YnVmZmVyOiBGbG9hdDMyQXJyYXksXHJcblx0XHRieXRlT2Zmc2V0OiBudW1iZXIsXHJcblx0XHRjYjogVW5pZm9ybUZ1bmMgfCBudW1iZXIgfCBvYmplY3QsXHJcblx0XHRjb3VudD86IG51bWJlclxyXG5cdCkge1xyXG5cdFx0c3VwZXIodW5pZm9ybU5hbWUsIGNiLCAwKTtcclxuXHRcdHRoaXMuYnl0ZVNpemUgPSBjb3VudCAqIDg7XHJcblx0XHR0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyLmJ1ZmZlciwgYnl0ZU9mZnNldCwgdGhpcy5ieXRlU2l6ZSAvIDQpO1xyXG5cdFx0dGhpcy50eXBlID0gXCJ2ZWMyLWFycmF5XCI7XHJcblx0fVxyXG5cdHNldCgpOiBib29sZWFuIHtcclxuXHRcdC8vIHRoaXMudmFsdWUgPSB0aGlzLmNiKCk7XHJcblx0XHR0aGlzLnZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xyXG5cdFx0bGV0IGogPSAwO1xyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdHRoaXMuYnVmZmVyW2pdID0gdGhpcy52YWx1ZVtpXS54O1xyXG5cdFx0XHR0aGlzLmJ1ZmZlcltqICsgMV0gPSB0aGlzLnZhbHVlW2ldLnk7XHJcblx0XHRcdGogKz0gMjtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cdH1cclxufVxyXG5leHBvcnQgY2xhc3MgVW5pZm9ybVZlYzNBcnJheSBleHRlbmRzIFVuaWZvcm08QXJyYXk8VmVjdG9yMz4+IHtcclxuXHRzdGF0aWMgYWxpZ24gPSAxNjtcclxuXHQvLyBjYjogRnVuY3Rpb247XHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHR1bmlmb3JtTmFtZTogc3RyaW5nLFxyXG5cdFx0YnVmZmVyOiBGbG9hdDMyQXJyYXksXHJcblx0XHRieXRlT2Zmc2V0OiBudW1iZXIsXHJcblx0XHRjYjogVW5pZm9ybUZ1bmMgfCBudW1iZXIgfCBvYmplY3QsXHJcblx0XHRjb3VudD86IG51bWJlclxyXG5cdCkge1xyXG5cdFx0c3VwZXIodW5pZm9ybU5hbWUsIGNiLCAwKTtcclxuXHRcdHRoaXMuYnl0ZVNpemUgPSBjb3VudCAqIDE2O1xyXG5cdFx0dGhpcy5idWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlci5idWZmZXIsIGJ5dGVPZmZzZXQsIHRoaXMuYnl0ZVNpemUgLyA0KTtcclxuXHRcdHRoaXMudHlwZSA9IFwidmVjMy1hcnJheVwiO1xyXG5cdH1cclxuXHRzZXQoKTogYm9vbGVhbiB7XHJcblx0XHQvLyB0aGlzLnZhbHVlID0gdGhpcy5jYigpO1xyXG5cdFx0dGhpcy52YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcclxuXHRcdGxldCBqID0gMDtcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52YWx1ZS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR0aGlzLmJ1ZmZlcltqXSA9IHRoaXMudmFsdWVbaV0ueDtcclxuXHRcdFx0dGhpcy5idWZmZXJbaiArIDFdID0gdGhpcy52YWx1ZVtpXS55O1xyXG5cdFx0XHR0aGlzLmJ1ZmZlcltqICsgMl0gPSB0aGlzLnZhbHVlW2ldLno7XHJcblx0XHRcdHRoaXMuYnVmZmVyW2ogKyAzXSA9IDA7XHJcblx0XHRcdGogKz0gNDtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cdH1cclxufVxyXG5leHBvcnQgY2xhc3MgVW5pZm9ybVZlYzRBcnJheSBleHRlbmRzIFVuaWZvcm08QXJyYXk8VmVjdG9yND4+IHtcclxuXHRzdGF0aWMgYWxpZ24gPSAxNjtcclxuXHQvLyBjYjogRnVuY3Rpb247XHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHR1bmlmb3JtTmFtZTogc3RyaW5nLFxyXG5cdFx0YnVmZmVyOiBGbG9hdDMyQXJyYXksXHJcblx0XHRieXRlT2Zmc2V0OiBudW1iZXIsXHJcblx0XHRjYjogVW5pZm9ybUZ1bmMgfCBudW1iZXIgfCBvYmplY3QsXHJcblx0XHRjb3VudD86IG51bWJlclxyXG5cdCkge1xyXG5cdFx0c3VwZXIodW5pZm9ybU5hbWUsIGNiLCAwKTtcclxuXHRcdHRoaXMuYnl0ZVNpemUgPSBjb3VudCAqIDE2O1xyXG5cdFx0dGhpcy5idWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlci5idWZmZXIsIGJ5dGVPZmZzZXQsIHRoaXMuYnl0ZVNpemUgLyA0KTtcclxuXHRcdHRoaXMudHlwZSA9IFwidmVjNC1hcnJheVwiO1xyXG5cdH1cclxuXHRzZXQoKTogYm9vbGVhbiB7XHJcblx0XHR0aGlzLnZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xyXG5cdFx0bGV0IGogPSAwO1xyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdHRoaXMuYnVmZmVyW2pdID0gdGhpcy52YWx1ZVtpXS54O1xyXG5cdFx0XHR0aGlzLmJ1ZmZlcltqICsgMV0gPSB0aGlzLnZhbHVlW2ldLnk7XHJcblx0XHRcdHRoaXMuYnVmZmVyW2ogKyAyXSA9IHRoaXMudmFsdWVbaV0uejtcclxuXHRcdFx0dGhpcy5idWZmZXJbaiArIDNdID0gdGhpcy52YWx1ZVtpXS53O1xyXG5cdFx0XHRqICs9IDQ7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFVuaWZvcm1UZXh0dXJlIGV4dGVuZHMgVW5pZm9ybTxUZXh0dXJlPiB7XHJcblx0cHVibGljIGJpbmRpbmc6IG51bWJlcjtcclxuXHRwdWJsaWMgdHlwZTogc3RyaW5nO1xyXG5cdHB1YmxpYyB2aXNpYmlsaXR5OiBTaGFkZXJTdGFnZTtcclxuXHRwdWJsaWMgbmFtZTogc3RyaW5nO1xyXG5cdHB1YmxpYyB0ZXh0dXJlOiBUZXh0dXJlO1xyXG5cdHB1YmxpYyBpc1RleHR1cmU6IGJvb2xlYW47XHJcblx0cHVibGljIHRleHR1cmVWaWV3PzogR1BVVGV4dHVyZVZpZXc7XHJcblx0cHJpdmF0ZSBfdGV4dHVyZTogVW5pZm9ybUZ1bmMgfCBUZXh0dXJlO1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0dW5pZm9ybU5hbWU6IHN0cmluZyxcclxuXHRcdGJpbmRpbmc6IG51bWJlcixcclxuXHRcdHRleHR1cmU6IFVuaWZvcm1GdW5jIHwgVGV4dHVyZSxcclxuXHRcdHR5cGU/OiBzdHJpbmcsXHJcblx0XHR2aXNpYmlsaXR5PzogU2hhZGVyU3RhZ2UsXHJcblx0XHR0ZXh0dXJlVmlldz86IEdQVVRleHR1cmVWaWV3XHJcblx0KSB7XHJcblx0XHRzdXBlcih1bmlmb3JtTmFtZSwgdW5kZWZpbmVkLCAwKTtcclxuXHRcdHRoaXMuYmluZGluZyA9IGJpbmRpbmc7XHJcblx0XHR0aGlzLnZpc2liaWxpdHkgPSBkZWZhdWx0VmFsdWUodmlzaWJpbGl0eSwgU2hhZGVyU3RhZ2UuVmVydGV4IHwgU2hhZGVyU3RhZ2UuRnJhZ21lbnQpO1xyXG5cdFx0dGhpcy50ZXh0dXJlVmlldyA9IHRleHR1cmVWaWV3O1xyXG5cdFx0dGhpcy50eXBlID0gdHlwZSA/PyBcInRleHR1cmVcIjtcclxuXHRcdHRoaXMuaXNUZXh0dXJlID0gdHJ1ZTtcclxuXHRcdHRoaXMuX3RleHR1cmUgPSB0ZXh0dXJlO1xyXG5cdH1cclxuXHRnZXQgbGF5b3V0VHlwZSgpIHtcclxuXHRcdHJldHVybiB0aGlzLnRleHR1cmU/LmxheW91dFR5cGUgfHwgXCJub3QgeWV0IGJpbmRcIjtcclxuXHR9XHJcblx0Z2V0IHN0b3JhZ2VUZXh0dXJlTGF5b3V0VHlwZSgpIHtcclxuXHRcdHJldHVybiB0aGlzLnRleHR1cmU/LnN0b3JhZ2VUZXh0dXJlTGF5b3V0VHlwZSB8fCBcIm5vdCB5ZXQgYmluZFwiO1xyXG5cdH1cclxuXHRiaW5kKGRldmljZTogR1BVRGV2aWNlKSB7XHJcblx0XHRpZiAoIXRoaXMuX3RleHR1cmUpIHJldHVybjtcclxuXHRcdHRoaXMudGV4dHVyZSA9IHRoaXMuX3RleHR1cmUgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHRoaXMuX3RleHR1cmUoKSA6IHRoaXMuX3RleHR1cmU7XHJcblx0XHR0aGlzLnRleHR1cmUudXBkYXRlKGRldmljZSk7XHJcblx0fVxyXG59XHJcbmV4cG9ydCBjbGFzcyBVbmlmb3JtU2FtcGxlciBleHRlbmRzIFVuaWZvcm08U2FtcGxlcj4ge1xyXG5cdHB1YmxpYyBiaW5kaW5nOiBudW1iZXI7XHJcblx0cHVibGljIHR5cGU6IHN0cmluZztcclxuXHRwdWJsaWMgdmlzaWJpbGl0eTogU2hhZGVyU3RhZ2U7XHJcblx0cHVibGljIG5hbWU6IHN0cmluZztcclxuXHRwdWJsaWMgc2FtcGxlcjogU2FtcGxlcjtcclxuXHRwdWJsaWMgaXNTYW1wbGVyOiBib29sZWFuO1xyXG5cdHByaXZhdGUgX3NhbXBsZXI6IFVuaWZvcm1GdW5jIHwgU2FtcGxlcjtcclxuXHRjb25zdHJ1Y3Rvcih1bmlmb3JtTmFtZTogc3RyaW5nLCBiaW5kaW5nOiBudW1iZXIsIHNhbXBsZXI6IFVuaWZvcm1GdW5jIHwgU2FtcGxlciwgdmlzaWJpbGl0eT86IFNoYWRlclN0YWdlKSB7XHJcblx0XHRzdXBlcih1bmlmb3JtTmFtZSwgdW5kZWZpbmVkLCAwKTtcclxuXHRcdHRoaXMudmlzaWJpbGl0eSA9IGRlZmF1bHRWYWx1ZSh2aXNpYmlsaXR5LCBTaGFkZXJTdGFnZS5WZXJ0ZXggfCBTaGFkZXJTdGFnZS5GcmFnbWVudCk7XHJcblx0XHR0aGlzLm5hbWUgPSB1bmlmb3JtTmFtZTtcclxuXHRcdHRoaXMuYmluZGluZyA9IGJpbmRpbmc7XHJcblx0XHR0aGlzLnR5cGUgPSBcInNhbXBsZXJcIjtcclxuXHRcdHRoaXMuaXNTYW1wbGVyID0gdHJ1ZTtcclxuXHRcdHRoaXMuX3NhbXBsZXIgPSBzYW1wbGVyO1xyXG5cdH1cclxuXHRnZXQgbGF5b3V0VHlwZSgpIHtcclxuXHRcdHJldHVybiB0aGlzLnNhbXBsZXI/LmxheW91dFR5cGUgfHwgXCJub3QgeWV0IGJpbmRcIjtcclxuXHR9XHJcblx0YmluZChkZXZpY2U6IEdQVURldmljZSkge1xyXG5cdFx0dGhpcy5zYW1wbGVyID0gdGhpcy5fc2FtcGxlciBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gdGhpcy5fc2FtcGxlcigpIDogdGhpcy5fc2FtcGxlcjtcclxuXHRcdHRoaXMuc2FtcGxlci51cGRhdGUoZGV2aWNlKTtcclxuXHR9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFVuaWZvcm1TdHJ1Y3RBcnJheSBleHRlbmRzIFVuaWZvcm08VW5pZm9ybVN0cnVjdD4ge1xyXG5cdHN0YXRpYyBhbGlnbiA9IDE2O1xyXG5cdHN0YXRpYyBhbGlnbnMgPSB7XHJcblx0XHRbVW5pZm9ybUVudW0uVW5pZm9ybVVpbnRdOiA0LFxyXG5cdFx0W1VuaWZvcm1FbnVtLkZsb2F0XTogNCxcclxuXHRcdFtVbmlmb3JtRW51bS5GbG9hdFZlYzJdOiA4LFxyXG5cdFx0W1VuaWZvcm1FbnVtLkZsb2F0VmVjM106IDE2LFxyXG5cdFx0W1VuaWZvcm1FbnVtLkZsb2F0VmVjNF06IDE2LFxyXG5cdFx0W1VuaWZvcm1FbnVtLk1hdDJdOiA4LFxyXG5cdFx0W1VuaWZvcm1FbnVtLk1hdDNdOiAxNixcclxuXHRcdFtVbmlmb3JtRW51bS5NYXQ0XTogMTYsXHJcblx0XHRbVW5pZm9ybUVudW0uQ29sb3JdOiAxNlxyXG5cdH07XHJcblx0c3RhdGljIGJ5dGVTaXplcyA9IHtcclxuXHRcdFtVbmlmb3JtRW51bS5Vbmlmb3JtVWludF06IDQsXHJcblx0XHRbVW5pZm9ybUVudW0uRmxvYXRdOiA0LFxyXG5cdFx0W1VuaWZvcm1FbnVtLkZsb2F0VmVjMl06IDgsXHJcblx0XHRbVW5pZm9ybUVudW0uRmxvYXRWZWMzXTogMTIsXHJcblx0XHRbVW5pZm9ybUVudW0uRmxvYXRWZWM0XTogMTYsXHJcblx0XHRbVW5pZm9ybUVudW0uTWF0Ml06IDE2LFxyXG5cdFx0W1VuaWZvcm1FbnVtLk1hdDNdOiA0OCxcclxuXHRcdFtVbmlmb3JtRW51bS5NYXQ0XTogNjQsXHJcblx0XHRbVW5pZm9ybUVudW0uQ29sb3JdOiAxMlxyXG5cdH07XHJcblx0Ynl0ZU9mZnNldD86IG51bWJlcjtcclxuXHRzb3VyY2VCdWZmZXI/OiBGbG9hdDMyQXJyYXk7XHJcblx0c3RydWN0QXJyYXk/OiBBcnJheTxVbmlmb3JtU3RydWN0PjtcclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHVuaWZvcm1OYW1lOiBzdHJpbmcsXHJcblx0XHRidWZmZXI6IEZsb2F0MzJBcnJheSxcclxuXHRcdGJ5dGVPZmZzZXQ6IG51bWJlcixcclxuXHRcdGNiOiBVbmlmb3JtRnVuYyB8IG51bWJlciB8IG9iamVjdCxcclxuXHRcdG9mZnNldD86IG51bWJlclxyXG5cdCkge1xyXG5cdFx0c3VwZXIodW5pZm9ybU5hbWUsIGNiLCBvZmZzZXQpO1xyXG5cdFx0dGhpcy5jYiA9IGNiO1xyXG5cdFx0dGhpcy50eXBlID0gXCJzdHJ1Y3QtYXJyYXlcIjtcclxuXHRcdHRoaXMuZGlydHkgPSBmYWxzZTtcclxuXHRcdHRoaXMuYnl0ZU9mZnNldCA9IGJ5dGVPZmZzZXQ7XHJcblx0XHR0aGlzLnNvdXJjZUJ1ZmZlciA9IGJ1ZmZlcjtcclxuXHR9XHJcblx0c2V0KCkge1xyXG5cdFx0Ly9cclxuXHRcdHRoaXMuc3RydWN0QXJyYXkgPSB0aGlzLmdldFZhbHVlKCk7XHJcblx0XHR0aGlzLmJ5dGVTaXplID0gdGhpcy5nZXRTdHJ1Y3RTaXplKCk7XHJcblx0XHR0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5zb3VyY2VCdWZmZXIuYnVmZmVyLCB0aGlzLmJ5dGVPZmZzZXQsIHRoaXMuYnl0ZVNpemUgLyA0KTtcclxuXHRcdHRoaXMuc2V0U3ViRGF0YSgpO1xyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cdHByaXZhdGUgc2V0U3ViRGF0YSgpIHtcclxuXHRcdHRoaXMuc3RydWN0QXJyYXkuZm9yRWFjaCgoc3RydWN0KSA9PiB7XHJcblx0XHRcdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzdHJ1Y3QpO1xyXG5cdFx0XHRrZXlzLmZvckVhY2goKGtleSkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBBcnJheS5pc0FycmF5KHN0cnVjdFtrZXldPy52YWx1ZSlcclxuXHRcdFx0XHRcdD8gc3RydWN0W2tleV0/LnZhbHVlXHJcblx0XHRcdFx0XHQ6IChzdHJ1Y3Rba2V5XT8udmFsdWUgYXMgYW55KS50b0FycmF5KCk7XHJcblx0XHRcdFx0c2V0RGF0YVRvVHlwZUFycmF5KHRoaXMuYnVmZmVyLCBkYXRhLCBzdHJ1Y3Rba2V5XS5vZmZzZXQpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHRwcml2YXRlIGdldFN0cnVjdFNpemUoKSB7XHJcblx0XHRsZXQgYnl0ZU9mZnNldCA9IDA7XHJcblx0XHR0aGlzLnN0cnVjdEFycmF5LmZvckVhY2goKHN0cnVjdCkgPT4ge1xyXG5cdFx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc3RydWN0KTtcclxuXHRcdFx0a2V5cy5mb3JFYWNoKChrZXkpID0+IHtcclxuXHRcdFx0XHRieXRlT2Zmc2V0ICs9IFVuaWZvcm1CdWZmZXIuY2hlY2tVbmlmb3JtT2Zmc2V0KGJ5dGVPZmZzZXQsIFVuaWZvcm1TdHJ1Y3RBcnJheS5hbGlnbnNbc3RydWN0W2tleV0udHlwZV0pO1xyXG5cdFx0XHRcdHN0cnVjdFtrZXldLm9mZnNldCA9IGJ5dGVPZmZzZXQ7XHJcblx0XHRcdFx0dGhpcy5ieXRlT2Zmc2V0ICs9IFVuaWZvcm1TdHJ1Y3RBcnJheS5ieXRlU2l6ZXNbc3RydWN0W2tleV0udHlwZV07XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4gYnl0ZU9mZnNldDtcclxuXHR9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFVuaWZvcm1TcG90TGlnaHRzIGV4dGVuZHMgVW5pZm9ybTxTcG90TGlnaHQ+IHtcclxuXHRzdGF0aWMgYWxpZ24gPSAxNjtcclxuXHRsaWdodHM6IEFycmF5PFNwb3RMaWdodD47XHJcblx0Ly8gY2I6IEZ1bmN0aW9uO1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0dW5pZm9ybU5hbWU6IHN0cmluZyxcclxuXHRcdGJ1ZmZlcjogRmxvYXQzMkFycmF5LFxyXG5cdFx0Ynl0ZU9mZnNldDogbnVtYmVyLFxyXG5cdFx0Y2I6IFVuaWZvcm1GdW5jIHwgbnVtYmVyIHwgb2JqZWN0LFxyXG5cdFx0Y291bnQ/OiBudW1iZXJcclxuXHQpIHtcclxuXHRcdHN1cGVyKHVuaWZvcm1OYW1lLCBjYiwgMCk7XHJcblx0XHR0aGlzLmNiID0gY2I7XHJcblx0XHR0aGlzLmJ5dGVTaXplID0gY291bnQgKiA2NDtcclxuXHRcdHRoaXMuYnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheShidWZmZXIuYnVmZmVyLCBieXRlT2Zmc2V0LCB0aGlzLmJ5dGVTaXplIC8gNCk7XHJcblx0XHR0aGlzLnR5cGUgPSBcInNwb3RzTGlnaHRcIjtcclxuXHRcdHRoaXMuZGlydHkgPSBmYWxzZTtcclxuXHR9XHJcblx0c2V0KCkge1xyXG5cdFx0dGhpcy5saWdodHMgPSB0aGlzLmdldFZhbHVlKCk7XHJcblx0XHR0aGlzLmxpZ2h0cy5mb3JFYWNoKChzcG90TGlnaHQsIGluZGV4KSA9PiB7XHJcblx0XHRcdHRoaXMuc2V0U3ViRGF0YShzcG90TGlnaHQsIGluZGV4KTtcclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIHRoaXMuZGlydHk7XHJcblx0fVxyXG5cdHByaXZhdGUgc2V0U3ViRGF0YShzcG90TGlnaHQ6IFNwb3RMaWdodCwgaW5kZXg6IG51bWJlcikge1xyXG5cdFx0Y29uc3Qgb2Zmc2V0ID0gaW5kZXggKiAxNjtcclxuXHRcdGlmIChzcG90TGlnaHQucG9zaXRpb25EaXJ0eSkge1xyXG5cdFx0XHR0aGlzLmRpcnR5ID0gc2V0RGF0YVRvVHlwZUFycmF5KHRoaXMuYnVmZmVyLCBzcG90TGlnaHQucG9zaXRpb24udG9BcnJheSgpLCBvZmZzZXQgKyAwKTsgLy8gYnl0ZU9mZnNldD0wO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHNwb3RMaWdodC5kaXN0YW5jZURpcnR5KSB7XHJcblx0XHRcdHRoaXMuZGlydHkgPSBzZXREYXRhVG9UeXBlQXJyYXkodGhpcy5idWZmZXIsIHNwb3RMaWdodC5kaXN0YW5jZSwgb2Zmc2V0ICsgMyk7IC8vIGJ5dGVPZmZzZXQ9MTI7XHJcblx0XHR9XHJcblx0XHRpZiAoc3BvdExpZ2h0LmRpcnRlY3REaXJ0eSkge1xyXG5cdFx0XHR0aGlzLmRpcnR5ID0gc2V0RGF0YVRvVHlwZUFycmF5KHRoaXMuYnVmZmVyLCBzcG90TGlnaHQuZGlyZWN0aW9uYWwudG9BcnJheSgpLCBvZmZzZXQgKyA0KTsgLy8gYnl0ZU9mZnNldD0xNjtcclxuXHRcdH1cclxuXHRcdGlmIChzcG90TGlnaHQuY29uZUNvc0RpcnR5KSB7XHJcblx0XHRcdHRoaXMuZGlydHkgPSBzZXREYXRhVG9UeXBlQXJyYXkodGhpcy5idWZmZXIsIHNwb3RMaWdodC5jb25lQ29zLCBvZmZzZXQgKyA3KTsgLy8gYnl0ZU9mZnNldD0yODtcclxuXHRcdH1cclxuXHRcdGlmIChzcG90TGlnaHQuY29sb3JEaXJ0eSkge1xyXG5cdFx0XHR0aGlzLmRpcnR5ID0gc2V0RGF0YVRvVHlwZUFycmF5KHRoaXMuYnVmZmVyLCBzcG90TGlnaHQuY29sb3IudG9BcnJheSgpLCBvZmZzZXQgKyA4KTsgLy8gYnl0ZU9mZnNldD0zMjtcclxuXHRcdH1cclxuXHRcdGlmIChzcG90TGlnaHQucGVudW1icmFDb3NEaXJ0eSkge1xyXG5cdFx0XHR0aGlzLmRpcnR5ID0gc2V0RGF0YVRvVHlwZUFycmF5KHRoaXMuYnVmZmVyLCBzcG90TGlnaHQucGVudW1icmFDb3MsIG9mZnNldCArIDExKTsgLy8gYnl0ZU9mZnNldD00NDtcclxuXHRcdH1cclxuXHRcdGlmIChzcG90TGlnaHQuZGVjYXlEaXJ0eSkge1xyXG5cdFx0XHR0aGlzLmRpcnR5ID0gc2V0RGF0YVRvVHlwZUFycmF5KHRoaXMuYnVmZmVyLCBzcG90TGlnaHQuZGVjYXksIG9mZnNldCArIDEyKTsgLy8gYnl0ZU9mZnNldD00ODtcclxuXHRcdH1cclxuXHJcblx0XHRzcG90TGlnaHQucG9zaXRpb25EaXJ0eSA9IGZhbHNlO1xyXG5cdFx0c3BvdExpZ2h0LmRpc3RhbmNlRGlydHkgPSBmYWxzZTtcclxuXHRcdHNwb3RMaWdodC5kaXJ0ZWN0RGlydHkgPSBmYWxzZTtcclxuXHRcdHNwb3RMaWdodC5jb25lQ29zRGlydHkgPSBmYWxzZTtcclxuXHRcdHNwb3RMaWdodC5jb2xvckRpcnR5ID0gZmFsc2U7XHJcblx0XHRzcG90TGlnaHQucGVudW1icmFDb3NEaXJ0eSA9IGZhbHNlO1xyXG5cdFx0c3BvdExpZ2h0LmRlY2F5RGlydHkgPSBmYWxzZTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBVbmlmb3JtU3BvdExpZ2h0U2hhZG93cyBleHRlbmRzIFVuaWZvcm08U3BvdExpZ2h0PiB7XHJcblx0c3RhdGljIGFsaWduID0gMTY7XHJcblx0c3RhdGljIHVuaWZvcm1TaXplID0gMTg7XHJcblx0bGlnaHRzOiBBcnJheTxTcG90TGlnaHQ+O1xyXG5cdC8vIGNiOiBGdW5jdGlvbjtcclxuXHRwcml2YXRlIF9uZWFyVmFsdWU6IG51bWJlcjtcclxuXHRwcml2YXRlIF9mYXJWYWx1ZTogbnVtYmVyO1xyXG5cdHByaXZhdGUgX3N1YkRhdGFTaXplOiBudW1iZXI7XHJcblxyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0dW5pZm9ybU5hbWU6IHN0cmluZyxcclxuXHRcdGJ1ZmZlcjogRmxvYXQzMkFycmF5LFxyXG5cdFx0Ynl0ZU9mZnNldDogbnVtYmVyLFxyXG5cdFx0Y2I6IFVuaWZvcm1GdW5jIHwgbnVtYmVyIHwgb2JqZWN0LFxyXG5cdFx0Y291bnQ/OiBudW1iZXJcclxuXHQpIHtcclxuXHRcdHN1cGVyKHVuaWZvcm1OYW1lLCBjYiwgMCk7XHJcblx0XHRjb25zdCBieXRlc1BlckVsZW1lbnQgPSBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XHJcblx0XHR0aGlzLl9zdWJEYXRhU2l6ZSA9IFVuaWZvcm1TcG90TGlnaHRTaGFkb3dzLnVuaWZvcm1TaXplO1xyXG5cdFx0dGhpcy5ieXRlU2l6ZSA9IGNvdW50ICogdGhpcy5fc3ViRGF0YVNpemUgKiBieXRlc1BlckVsZW1lbnQ7XHJcblx0XHR0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyLmJ1ZmZlciwgYnl0ZU9mZnNldCwgdGhpcy5ieXRlU2l6ZSAvIDQpO1xyXG5cdFx0dGhpcy50eXBlID0gXCJzcG90TGlnaHRTaGFkb3dzXCI7XHJcblx0XHR0aGlzLl9uZWFyVmFsdWUgPSBudWxsO1xyXG5cdFx0dGhpcy5fZmFyVmFsdWUgPSBudWxsO1xyXG5cdH1cclxuXHRzZXQoKSB7XHJcblx0XHR0aGlzLmxpZ2h0cyA9IHRoaXMuZ2V0VmFsdWUoKTtcclxuXHRcdHRoaXMubGlnaHRzLmZvckVhY2goKHNwb3RMaWdodCwgaW5kZXgpID0+IHtcclxuXHRcdFx0dGhpcy5zZXRTdWJEYXRhKHNwb3RMaWdodCwgaW5kZXgpO1xyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4gdGhpcy5kaXJ0eTtcclxuXHR9XHJcblx0cHJpdmF0ZSBzZXRTdWJEYXRhKHNwb3RMaWdodDogU3BvdExpZ2h0LCBpbmRleDogbnVtYmVyKSB7XHJcblx0XHRjb25zdCBvZmZzZXQgPSBpbmRleCAqIHRoaXMuX3N1YkRhdGFTaXplO1xyXG5cdFx0aWYgKHNwb3RMaWdodC5zaGFkb3cudnBNYXRyaXhEaXJ0eSkge1xyXG5cdFx0XHRzcG90TGlnaHQuc2hhZG93LnZwTWF0cml4RGlydHkgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5kaXJ0eSA9IHNldERhdGFUb1R5cGVBcnJheSh0aGlzLmJ1ZmZlciwgc3BvdExpZ2h0LnNoYWRvdy5jYW1lcmEudnBNYXRyaXgudG9BcnJheSgpLCBvZmZzZXQgKyAwKTsgLy8gYnl0ZU9mZnNldD0wO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgbmVhclZhbHVlID0gc3BvdExpZ2h0LnNoYWRvdy5jYW1lcmEubmVhcjtcclxuXHRcdGlmIChuZWFyVmFsdWUgIT0gdGhpcy5fbmVhclZhbHVlKSB7XHJcblx0XHRcdHRoaXMuX25lYXJWYWx1ZSA9IG5lYXJWYWx1ZTtcclxuXHRcdFx0dGhpcy5kaXJ0eSA9IHNldERhdGFUb1R5cGVBcnJheSh0aGlzLmJ1ZmZlciwgdGhpcy5fbmVhclZhbHVlLCBvZmZzZXQgKyAxNik7IC8vIGJ5dGVPZmZzZXQ9MDtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGZhclZhbHVlID0gc3BvdExpZ2h0LnNoYWRvdy5jYW1lcmEuZmFyO1xyXG5cdFx0aWYgKGZhclZhbHVlICE9IHRoaXMuX2ZhclZhbHVlKSB7XHJcblx0XHRcdHRoaXMuX2ZhclZhbHVlID0gZmFyVmFsdWU7XHJcblx0XHRcdHRoaXMuZGlydHkgPSBzZXREYXRhVG9UeXBlQXJyYXkodGhpcy5idWZmZXIsIHRoaXMuX2ZhclZhbHVlLCBvZmZzZXQgKyAxNyk7IC8vIGJ5dGVPZmZzZXQ9MDtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFVuaWZvcm1Qb2ludExpZ2h0cyBleHRlbmRzIFVuaWZvcm08UG9pbnRMaWdodD4ge1xyXG5cdHN0YXRpYyBhbGlnbiA9IDE2O1xyXG5cdGxpZ2h0czogQXJyYXk8UG9pbnRMaWdodD47XHJcblx0Ly8gY2I6IEZ1bmN0aW9uO1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0dW5pZm9ybU5hbWU6IHN0cmluZyxcclxuXHRcdGJ1ZmZlcjogRmxvYXQzMkFycmF5LFxyXG5cdFx0Ynl0ZU9mZnNldDogbnVtYmVyLFxyXG5cdFx0Y2I6IFVuaWZvcm1GdW5jIHwgbnVtYmVyIHwgb2JqZWN0LFxyXG5cdFx0Y291bnQ/OiBudW1iZXJcclxuXHQpIHtcclxuXHRcdHN1cGVyKHVuaWZvcm1OYW1lLCBjYiwgMCk7XHJcblx0XHR0aGlzLmJ5dGVTaXplID0gY291bnQgKiAzMjtcclxuXHRcdHRoaXMuYnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheShidWZmZXIuYnVmZmVyLCBieXRlT2Zmc2V0LCB0aGlzLmJ5dGVTaXplIC8gNCk7XHJcblx0XHR0aGlzLnR5cGUgPSBcInBvaW50c0xpZ2h0XCI7XHJcblx0fVxyXG5cdHNldCgpIHtcclxuXHRcdHRoaXMubGlnaHRzID0gdGhpcy5nZXRWYWx1ZSgpO1xyXG5cdFx0dGhpcy5saWdodHMuZm9yRWFjaCgocG9pbnRMaWdodCwgaW5kZXgpID0+IHtcclxuXHRcdFx0dGhpcy5zZXRTdWJEYXRhKHBvaW50TGlnaHQsIGluZGV4KTtcclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIHRoaXMuZGlydHk7XHJcblx0fVxyXG5cdHByaXZhdGUgc2V0U3ViRGF0YShwb2ludExpZ2h0OiBQb2ludExpZ2h0LCBpbmRleDogbnVtYmVyKSB7XHJcblx0XHRjb25zdCBvZmZzZXQgPSBpbmRleCAqIDg7XHJcblx0XHRpZiAocG9pbnRMaWdodC5wb3NpdGlvbkRpcnR5KSB7XHJcblx0XHRcdHBvaW50TGlnaHQucG9zaXRpb25EaXJ0eSA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLmRpcnR5ID0gc2V0RGF0YVRvVHlwZUFycmF5KHRoaXMuYnVmZmVyLCBwb2ludExpZ2h0LnBvc2l0aW9uLnRvQXJyYXkoKSwgb2Zmc2V0ICsgMCk7IC8vIGJ5dGVPZmZzZXQ9MDtcclxuXHRcdH1cclxuXHRcdGlmIChwb2ludExpZ2h0LmRpc3RhbmNlRGlydHkpIHtcclxuXHRcdFx0cG9pbnRMaWdodC5kaXN0YW5jZURpcnR5ID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuZGlydHkgPSBzZXREYXRhVG9UeXBlQXJyYXkodGhpcy5idWZmZXIsIHBvaW50TGlnaHQuZGlzdGFuY2UsIG9mZnNldCArIDMpOyAvLyBieXRlT2Zmc2V0PTEyO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHBvaW50TGlnaHQuY29sb3JEaXJ0eSkge1xyXG5cdFx0XHRwb2ludExpZ2h0LmNvbG9yRGlydHkgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5kaXJ0eSA9IHNldERhdGFUb1R5cGVBcnJheSh0aGlzLmJ1ZmZlciwgcG9pbnRMaWdodC5jb2xvci50b0FycmF5KCksIG9mZnNldCArIDQpOyAvLyBieXRlT2Zmc2V0PTMyO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHBvaW50TGlnaHQuZGVjYXlEaXJ0eSkge1xyXG5cdFx0XHRwb2ludExpZ2h0LmRlY2F5RGlydHkgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5kaXJ0eSA9IHNldERhdGFUb1R5cGVBcnJheSh0aGlzLmJ1ZmZlciwgcG9pbnRMaWdodC5kZWNheSwgb2Zmc2V0ICsgNyk7IC8vIGJ5dGVPZmZzZXQ9MTI7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVW5pZm9ybVBvaW50TGlnaHRTaGFkb3dzIGV4dGVuZHMgVW5pZm9ybTxQb2ludExpZ2h0PiB7XHJcblx0c3RhdGljIGFsaWduID0gMTY7XHJcblx0c3RhdGljIHVuaWZvcm1TaXplID0gMTIyO1xyXG5cdGxpZ2h0czogQXJyYXk8UG9pbnRMaWdodD47XHJcblx0Ly8gY2I6IEZ1bmN0aW9uO1xyXG5cdHByaXZhdGUgX25lYXJWYWx1ZTogbnVtYmVyO1xyXG5cdHByaXZhdGUgX2ZhclZhbHVlOiBudW1iZXI7XHJcblx0cHJpdmF0ZSBfc3ViRGF0YVNpemU6IG51bWJlcjtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHR1bmlmb3JtTmFtZTogc3RyaW5nLFxyXG5cdFx0YnVmZmVyOiBGbG9hdDMyQXJyYXksXHJcblx0XHRieXRlT2Zmc2V0OiBudW1iZXIsXHJcblx0XHRjYjogVW5pZm9ybUZ1bmMgfCBudW1iZXIgfCBvYmplY3QsXHJcblx0XHRjb3VudD86IG51bWJlclxyXG5cdCkge1xyXG5cdFx0c3VwZXIodW5pZm9ybU5hbWUsIGNiLCAwKTtcclxuXHRcdGNvbnN0IGJ5dGVzUGVyRWxlbWVudCA9IEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcclxuXHRcdHRoaXMuX3N1YkRhdGFTaXplID0gVW5pZm9ybVBvaW50TGlnaHRTaGFkb3dzLnVuaWZvcm1TaXplO1xyXG5cdFx0dGhpcy5ieXRlU2l6ZSA9IGNvdW50ICogYnl0ZXNQZXJFbGVtZW50ICogdGhpcy5fc3ViRGF0YVNpemU7XHJcblx0XHR0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyLmJ1ZmZlciwgYnl0ZU9mZnNldCwgdGhpcy5ieXRlU2l6ZSAvIDQpO1xyXG5cdFx0dGhpcy50eXBlID0gXCJwb2ludExpZ2h0U2hhZG93c1wiO1xyXG5cdFx0dGhpcy5fbmVhclZhbHVlID0gbnVsbDtcclxuXHRcdHRoaXMuX2ZhclZhbHVlID0gbnVsbDtcclxuXHR9XHJcblx0c2V0KCkge1xyXG5cdFx0dGhpcy5saWdodHMgPSB0aGlzLmdldFZhbHVlKCk7XHJcblx0XHR0aGlzLmxpZ2h0cy5mb3JFYWNoKChwb2ludExpZ2h0LCBpbmRleCkgPT4ge1xyXG5cdFx0XHR0aGlzLnNldFN1YkRhdGEocG9pbnRMaWdodCwgaW5kZXgpO1xyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4gdGhpcy5kaXJ0eTtcclxuXHR9XHJcblx0cHJpdmF0ZSBzZXRTdWJEYXRhKHBvaW50TGlnaHQ6IFBvaW50TGlnaHQsIGluZGV4OiBudW1iZXIpIHtcclxuXHRcdGNvbnN0IG9mZnNldCA9IGluZGV4ICogdGhpcy5fc3ViRGF0YVNpemU7XHJcblxyXG5cdFx0aWYgKHBvaW50TGlnaHQuc2hhZG93LnZwTWF0cml4QXJyYXlEaXJ0eSkge1xyXG5cdFx0XHRwb2ludExpZ2h0LnNoYWRvdy52cE1hdHJpeEFycmF5RGlydHkgPSBmYWxzZTtcclxuXHRcdFx0Y29uc3QgdnBNYXRyaXhBcnJheSA9IHBvaW50TGlnaHQuc2hhZG93LmNhbWVyYS52cE1hdHJpeEFycmF5O1xyXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZwTWF0cml4QXJyYXkubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRjb25zdCB2cE1hdHJpeCA9IHZwTWF0cml4QXJyYXlbaV07XHJcblx0XHRcdFx0dGhpcy5kaXJ0eSA9IHNldERhdGFUb1R5cGVBcnJheSh0aGlzLmJ1ZmZlciwgdnBNYXRyaXgudG9BcnJheSgpLCBvZmZzZXQgKyAwICsgMTYgKiBpKTsgLy8gYnl0ZU9mZnNldD05OCAqIDQ7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRpZiAocG9pbnRMaWdodC5zaGFkb3cudmlld1BvcnREaXJ0eSkge1xyXG5cdFx0XHRwb2ludExpZ2h0LnNoYWRvdy52aWV3UG9ydERpcnR5ID0gZmFsc2U7XHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XHJcblx0XHRcdFx0dGhpcy5kaXJ0eSA9IHNldERhdGFUb1R5cGVBcnJheShcclxuXHRcdFx0XHRcdHRoaXMuYnVmZmVyLFxyXG5cdFx0XHRcdFx0cG9pbnRMaWdodC5zaGFkb3cudmlld3BvcnRzW2ldLnRvQXJyYXkoKSxcclxuXHRcdFx0XHRcdG9mZnNldCArIDk2ICsgNCAqIGlcclxuXHRcdFx0XHQpOyAvLyBieXRlT2Zmc2V0PTA7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBuZWFyVmFsdWUgPSBwb2ludExpZ2h0LnNoYWRvdy5jYW1lcmEubmVhcjtcclxuXHRcdGlmIChuZWFyVmFsdWUgIT0gdGhpcy5fbmVhclZhbHVlKSB7XHJcblx0XHRcdHRoaXMuX25lYXJWYWx1ZSA9IG5lYXJWYWx1ZTtcclxuXHRcdFx0dGhpcy5kaXJ0eSA9IHNldERhdGFUb1R5cGVBcnJheSh0aGlzLmJ1ZmZlciwgdGhpcy5fbmVhclZhbHVlLCBvZmZzZXQgKyAxMjApOyAvLyBieXRlT2Zmc2V0PTA7XHJcblx0XHR9XHJcblx0XHRjb25zdCBmYXJWYWx1ZSA9IHBvaW50TGlnaHQuc2hhZG93LmNhbWVyYS5mYXI7XHJcblx0XHRpZiAoZmFyVmFsdWUgIT0gdGhpcy5fZmFyVmFsdWUpIHtcclxuXHRcdFx0dGhpcy5fZmFyVmFsdWUgPSBmYXJWYWx1ZTtcclxuXHRcdFx0dGhpcy5kaXJ0eSA9IHNldERhdGFUb1R5cGVBcnJheSh0aGlzLmJ1ZmZlciwgdGhpcy5fZmFyVmFsdWUsIG9mZnNldCArIDEyMSk7IC8vIGJ5dGVPZmZzZXQ9MTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFVuaWZvcm1EaXJ0ZWN0TGlnaHRzIGV4dGVuZHMgVW5pZm9ybTxEaXJlY3Rpb25hbExpZ2h0PiB7XHJcblx0c3RhdGljIGFsaWduID0gMTY7XHJcblx0bGlnaHRzOiBBcnJheTxEaXJlY3Rpb25hbExpZ2h0PjtcclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHVuaWZvcm1OYW1lOiBzdHJpbmcsXHJcblx0XHRidWZmZXI6IEZsb2F0MzJBcnJheSxcclxuXHRcdGJ5dGVPZmZzZXQ6IG51bWJlcixcclxuXHRcdGNiOiBVbmlmb3JtRnVuYyB8IG51bWJlciB8IG9iamVjdCxcclxuXHRcdGNvdW50PzogbnVtYmVyXHJcblx0KSB7XHJcblx0XHRzdXBlcih1bmlmb3JtTmFtZSwgY2IsIDApO1xyXG5cdFx0dGhpcy5jYiA9IGNiO1xyXG5cdFx0dGhpcy5ieXRlU2l6ZSA9IGNvdW50ICogMzI7XHJcblx0XHR0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyLmJ1ZmZlciwgYnl0ZU9mZnNldCwgdGhpcy5ieXRlU2l6ZSAvIDQpO1xyXG5cdFx0dGhpcy50eXBlID0gXCJkaXJ0ZWN0TGlnaHRzXCI7XHJcblx0fVxyXG5cdHNldCgpIHtcclxuXHRcdHRoaXMubGlnaHRzID0gdGhpcy5nZXRWYWx1ZSgpO1xyXG5cdFx0dGhpcy5saWdodHMuZm9yRWFjaCgoZGlyZWN0aW9uYWxMaWdodCwgaW5kZXgpID0+IHtcclxuXHRcdFx0dGhpcy5zZXRTdWJEYXRhKGRpcmVjdGlvbmFsTGlnaHQsIGluZGV4KTtcclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIHRoaXMuZGlydHk7XHJcblx0fVxyXG5cdHByaXZhdGUgc2V0U3ViRGF0YShkaXJlY3Rpb25hbExpZ2h0OiBEaXJlY3Rpb25hbExpZ2h0LCBpbmRleDogbnVtYmVyKSB7XHJcblx0XHRjb25zdCBvZmZzZXQgPSBpbmRleCAqIDg7XHJcblx0XHRpZiAoZGlyZWN0aW9uYWxMaWdodC5kaXJ0ZWN0RGlydHkpIHtcclxuXHRcdFx0ZGlyZWN0aW9uYWxMaWdodC5kaXJ0ZWN0RGlydHkgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5kaXJ0eSA9IHNldERhdGFUb1R5cGVBcnJheSh0aGlzLmJ1ZmZlciwgZGlyZWN0aW9uYWxMaWdodC5kaXJlY3Rpb25hbC50b0FycmF5KCksIG9mZnNldCArIDApOyAvLyBieXRlT2Zmc2V0PTE2O1xyXG5cdFx0fVxyXG5cdFx0aWYgKGRpcmVjdGlvbmFsTGlnaHQuY29sb3JEaXJ0eSkge1xyXG5cdFx0XHRkaXJlY3Rpb25hbExpZ2h0LmNvbG9yRGlydHkgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5kaXJ0eSA9IHNldERhdGFUb1R5cGVBcnJheSh0aGlzLmJ1ZmZlciwgZGlyZWN0aW9uYWxMaWdodC5jb2xvci50b0FycmF5KCksIG9mZnNldCArIDQpOyAvLyBieXRlT2Zmc2V0PTMyO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFVuaWZvcm1EaXJ0ZWN0TGlnaHRTaGFkb3dzIGV4dGVuZHMgVW5pZm9ybTxEaXJlY3Rpb25hbExpZ2h0PiB7XHJcblx0c3RhdGljIGFsaWduID0gMTY7XHJcblx0c3RhdGljIHVuaWZvcm1TaXplID0gMTY7XHJcblx0bGlnaHRzOiBBcnJheTxEaXJlY3Rpb25hbExpZ2h0PjtcclxuXHRwcml2YXRlIF9zdWJEYXRhU2l6ZTogbnVtYmVyO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHVuaWZvcm1OYW1lOiBzdHJpbmcsXHJcblx0XHRidWZmZXI6IEZsb2F0MzJBcnJheSxcclxuXHRcdGJ5dGVPZmZzZXQ6IG51bWJlcixcclxuXHRcdGNiOiBVbmlmb3JtRnVuYyB8IG51bWJlciB8IG9iamVjdCxcclxuXHRcdGNvdW50PzogbnVtYmVyXHJcblx0KSB7XHJcblx0XHRzdXBlcih1bmlmb3JtTmFtZSwgY2IsIDApO1xyXG5cdFx0Y29uc3QgYnl0ZXNQZXJFbGVtZW50ID0gRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xyXG5cdFx0dGhpcy5fc3ViRGF0YVNpemUgPSBVbmlmb3JtRGlydGVjdExpZ2h0U2hhZG93cy51bmlmb3JtU2l6ZTtcclxuXHRcdHRoaXMuYnl0ZVNpemUgPSBjb3VudCAqIGJ5dGVzUGVyRWxlbWVudCAqIHRoaXMuX3N1YkRhdGFTaXplO1xyXG5cdFx0dGhpcy5idWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlci5idWZmZXIsIGJ5dGVPZmZzZXQsIHRoaXMuYnl0ZVNpemUgLyA0KTtcclxuXHRcdHRoaXMudHlwZSA9IFwiZGlydGVjdExpZ2h0U2hhZG93c1wiO1xyXG5cdH1cclxuXHRzZXQoKSB7XHJcblx0XHR0aGlzLmxpZ2h0cyA9IHRoaXMuZ2V0VmFsdWUoKTtcclxuXHRcdHRoaXMubGlnaHRzLmZvckVhY2goKGRpcmVjdGlvbmFsTGlnaHQsIGluZGV4KSA9PiB7XHJcblx0XHRcdHRoaXMuc2V0U3ViRGF0YShkaXJlY3Rpb25hbExpZ2h0LCBpbmRleCk7XHJcblx0XHR9KTtcclxuXHRcdHJldHVybiB0aGlzLmRpcnR5O1xyXG5cdH1cclxuXHRwcml2YXRlIHNldFN1YkRhdGEoZGlyZWN0aW9uYWxMaWdodDogRGlyZWN0aW9uYWxMaWdodCwgaW5kZXg6IG51bWJlcikge1xyXG5cdFx0Y29uc3Qgb2Zmc2V0ID0gaW5kZXggKiB0aGlzLl9zdWJEYXRhU2l6ZTtcclxuXHRcdGlmIChkaXJlY3Rpb25hbExpZ2h0LnNoYWRvdy52cE1hdHJpeERpcnR5KSB7XHJcblx0XHRcdGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93LnZwTWF0cml4RGlydHkgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5kaXJ0eSA9IHNldERhdGFUb1R5cGVBcnJheSh0aGlzLmJ1ZmZlciwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3cuY2FtZXJhLnZwTWF0cml4LnRvQXJyYXkoKSwgb2Zmc2V0ICsgMCk7IC8vIGJ5dGVPZmZzZXQ9MTY7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbmZ1bmN0aW9uIHNldERhdGFUb1R5cGVBcnJheShidWZmZXIsIGRhdGEsIG9mZnNldCkge1xyXG5cdGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcblx0XHRkYXRhLmZvckVhY2goKHZhbHVlLCBpbmRleCkgPT4ge1xyXG5cdFx0XHRidWZmZXJbaW5kZXggKyBvZmZzZXRdID0gdmFsdWU7XHJcblx0XHR9KTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0YnVmZmVyW29mZnNldF0gPSBkYXRhO1xyXG5cdH1cclxuXHRyZXR1cm4gdHJ1ZTtcclxufVxyXG4iLCJpbXBvcnQgeyBCdWZmZXJCaW5kaW5nVHlwZSwgQnVmZmVyVXNhZ2UsIFNoYWRlclN0YWdlIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVQ29uc3RhbnRcIjtcbmltcG9ydCB7IFVuaWZvcm1GdW5jLCBVbmlmb3JtRW51bSB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVVR5cGVzXCI7XG5pbXBvcnQgZGVmYXVsdFZhbHVlIGZyb20gXCIuLi91dGlscy9kZWZhdWx0VmFsdWVcIjtcbmltcG9ydCBCdWZmZXIgZnJvbSBcIi4vQnVmZmVyXCI7XG5cbmltcG9ydCB7XG5cdFVuaWZvcm0sXG5cdFVuaWZvcm1Db2xvcixcblx0VW5pZm9ybURpcnRlY3RMaWdodHMsXG5cdFVuaWZvcm1EaXJ0ZWN0TGlnaHRTaGFkb3dzLFxuXHRVbmlmb3JtRmxvYXQsXG5cdFVuaWZvcm1GbG9hdEFycmF5LFxuXHRVbmlmb3JtRmxvYXRWZWMyLFxuXHRVbmlmb3JtRmxvYXRWZWMzLFxuXHRVbmlmb3JtRmxvYXRWZWM0LFxuXHRVbmlmb3JtTWF0Mixcblx0VW5pZm9ybU1hdDMsXG5cdFVuaWZvcm1NYXQ0LFxuXHRVbmlmb3JtTWF0cml4NEFycmF5LFxuXHRVbmlmb3JtUG9pbnRMaWdodHMsXG5cdFVuaWZvcm1Qb2ludExpZ2h0U2hhZG93cyxcblx0VW5pZm9ybVNwb3RMaWdodHMsXG5cdFVuaWZvcm1TcG90TGlnaHRTaGFkb3dzLFxuXHRVbmlmb3JtVWludCxcblx0VW5pZm9ybVZlYzJBcnJheSxcblx0VW5pZm9ybVZlYzNBcnJheSxcblx0VW5pZm9ybVZlYzRBcnJheSxcblx0VW5pZm9ybVN0cnVjdEFycmF5XG59IGZyb20gXCIuL1VuaWZvcm1zXCI7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVbmlmb3JtQnVmZmVyIHtcblx0cHVibGljIHR5cGU6IHN0cmluZztcblx0cHVibGljIGhhc0R5bmFtaWNPZmZzZXQ6IGJvb2xlYW47XG5cdHB1YmxpYyBtaW5CaW5kaW5nU2l6ZTogbnVtYmVyO1xuXHRwcml2YXRlIF91bmlmb3JtU3RydWN0OiBNYXA8c3RyaW5nLCBVbmlmb3JtPGFueT4+O1xuXHRwcml2YXRlIF9idWZmZXJTaXplOiBudW1iZXI7XG5cdHByaXZhdGUgbGFiZWw6IHN0cmluZztcblx0cHVibGljIGJ5dGVPZmZzZXQ6IG51bWJlcjtcblx0cHVibGljIHVuaWZvcm1EaXJ0eTogYm9vbGVhbjtcblx0cHVibGljIGJpbmRpbmc6IG51bWJlcjtcblx0cHVibGljIHZpc2liaWxpdHk6IFNoYWRlclN0YWdlO1xuXHRwdWJsaWMgdXNhZ2U6IEJ1ZmZlclVzYWdlO1xuXHRwdWJsaWMgYnVmZmVyOiBCdWZmZXI7XG5cdHB1YmxpYyBkYXRhQnVmZmVyOiBGbG9hdDMyQXJyYXk7XG5cdHB1YmxpYyBvZmZzZXQ6IG51bWJlcjtcblx0cHVibGljIG1heE9mZnNldDogbnVtYmVyO1xuXHRwdWJsaWMgaXNVbmlmb3JtQnVmZmVyOiBib29sZWFuO1xuXHRwdWJsaWMgbmFtZTogc3RyaW5nO1xuXHRwcml2YXRlIHN0YXRpYyBVbmlmb3JtVHlwZSA9IHtcblx0XHRbVW5pZm9ybUVudW0uVW5pZm9ybVVpbnRdOiBVbmlmb3JtVWludCxcblx0XHRbVW5pZm9ybUVudW0uRmxvYXRdOiBVbmlmb3JtRmxvYXQsXG5cdFx0W1VuaWZvcm1FbnVtLkZsb2F0VmVjMl06IFVuaWZvcm1GbG9hdFZlYzIsXG5cdFx0W1VuaWZvcm1FbnVtLkZsb2F0VmVjM106IFVuaWZvcm1GbG9hdFZlYzMsXG5cdFx0W1VuaWZvcm1FbnVtLkZsb2F0VmVjNF06IFVuaWZvcm1GbG9hdFZlYzQsXG5cdFx0W1VuaWZvcm1FbnVtLk1hdDJdOiBVbmlmb3JtTWF0Mixcblx0XHRbVW5pZm9ybUVudW0uTWF0M106IFVuaWZvcm1NYXQzLFxuXHRcdFtVbmlmb3JtRW51bS5NYXQ0XTogVW5pZm9ybU1hdDQsXG5cdFx0W1VuaWZvcm1FbnVtLkNvbG9yXTogVW5pZm9ybUNvbG9yLFxuXHRcdFtVbmlmb3JtRW51bS5GbG9hdEFycmF5XTogVW5pZm9ybUZsb2F0QXJyYXksXG5cdFx0W1VuaWZvcm1FbnVtLlZlYzJBcnJheV06IFVuaWZvcm1WZWMyQXJyYXksXG5cdFx0W1VuaWZvcm1FbnVtLlZlYzNBcnJheV06IFVuaWZvcm1WZWMzQXJyYXksXG5cdFx0W1VuaWZvcm1FbnVtLlZlYzRBcnJheV06IFVuaWZvcm1WZWM0QXJyYXksXG5cdFx0W1VuaWZvcm1FbnVtLk1hdDRBcnJheV06IFVuaWZvcm1NYXRyaXg0QXJyYXksXG5cdFx0W1VuaWZvcm1FbnVtLlBvaW50TGlnaHRzXTogVW5pZm9ybVBvaW50TGlnaHRzLFxuXHRcdFtVbmlmb3JtRW51bS5TcG90TGlnaHRzXTogVW5pZm9ybVNwb3RMaWdodHMsXG5cdFx0W1VuaWZvcm1FbnVtLkRpcnRlY3RMaWdodHNdOiBVbmlmb3JtRGlydGVjdExpZ2h0cyxcblx0XHRbVW5pZm9ybUVudW0uUG9pbnRMaWdodFNoYWRvd3NdOiBVbmlmb3JtUG9pbnRMaWdodFNoYWRvd3MsXG5cdFx0W1VuaWZvcm1FbnVtLlNwb3RMaWdodFNoYWRvd3NdOiBVbmlmb3JtU3BvdExpZ2h0U2hhZG93cyxcblx0XHRbVW5pZm9ybUVudW0uRGlydGVjdExpZ2h0U2hhZG93c106IFVuaWZvcm1EaXJ0ZWN0TGlnaHRTaGFkb3dzLFxuXHRcdFtVbmlmb3JtRW51bS5Vbmlmb3JtU3RydWN0QXJyYXldOiBVbmlmb3JtU3RydWN0QXJyYXlcblx0fTtcblx0Y29uc3RydWN0b3Iob3B0aW9uczogVW5pZm9ybUJ1ZmZlclBhcmFtcykge1xuXHRcdHRoaXMudHlwZSA9IGRlZmF1bHRWYWx1ZShvcHRpb25zLnR5cGUsIFwidW5pZm9ybVwiKTtcblx0XHR0aGlzLmxhYmVsID0gZGVmYXVsdFZhbHVlKG9wdGlvbnMubGFiZWwsIFwiXCIpO1xuXHRcdHRoaXMubmFtZSA9IGRlZmF1bHRWYWx1ZShvcHRpb25zLmxhYmVsLCBcIlwiKTtcblx0XHR0aGlzLmhhc0R5bmFtaWNPZmZzZXQgPSBvcHRpb25zLmhhc0R5bmFtaWNPZmZzZXQgPz8gZmFsc2U7XG5cdFx0dGhpcy5taW5CaW5kaW5nU2l6ZSA9IG9wdGlvbnMubWluQmluZGluZ1NpemUgPz8gMDtcblx0XHR0aGlzLmJpbmRpbmcgPSBvcHRpb25zLmJpbmRpbmcgPz8gMDtcblx0XHR0aGlzLnZpc2liaWxpdHkgPSBkZWZhdWx0VmFsdWUob3B0aW9ucy52aXNpYmlsaXR5LCBTaGFkZXJTdGFnZS5GcmFnbWVudCB8IFNoYWRlclN0YWdlLlZlcnRleCk7XG5cdFx0dGhpcy51c2FnZSA9IGRlZmF1bHRWYWx1ZShvcHRpb25zLnVzYWdlLCBCdWZmZXJVc2FnZS5Vbmlmb3JtIHwgQnVmZmVyVXNhZ2UuQ29weURzdCk7XG5cdFx0dGhpcy5fdW5pZm9ybVN0cnVjdCA9IG5ldyBNYXAoKTtcblx0XHR0aGlzLnVuaWZvcm1EaXJ0eSA9IHRydWU7XG5cdFx0dGhpcy5fYnVmZmVyU2l6ZSA9IG9wdGlvbnMuc2l6ZTtcblx0XHR0aGlzLmJ1ZmZlciA9IG9wdGlvbnMuYnVmZmVyO1xuXHRcdHRoaXMub2Zmc2V0ID0gMDtcblx0XHR0aGlzLmRhdGFCdWZmZXIgPSBkZWZhdWx0VmFsdWUob3B0aW9ucy5kYXRhQnVmZmVyLCBuZXcgRmxvYXQzMkFycmF5KGRlZmF1bHRWYWx1ZSh0aGlzLl9idWZmZXJTaXplLCA0MDApKSk7XG5cdFx0dGhpcy5ieXRlT2Zmc2V0ID0gMDtcblx0XHR0aGlzLmlzVW5pZm9ybUJ1ZmZlciA9IHRydWU7XG5cdFx0dGhpcy5tYXhPZmZzZXQgPSBvcHRpb25zLm1heE9mZnNldCA/PyAwO1xuXHR9XG5cdGdldCBsYXlvdXRUeXBlKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0eXBlOiB0aGlzLnR5cGUsXG5cdFx0XHRoYXNEeW5hbWljT2Zmc2V0OiB0aGlzLmhhc0R5bmFtaWNPZmZzZXQsXG5cdFx0XHRtaW5CaW5kaW5nU2l6ZTogdGhpcy5taW5CaW5kaW5nU2l6ZVxuXHRcdH07XG5cdH1cblx0Z2V0IGJ1ZmZlclNpemUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2J1ZmZlclNpemUgPz8gdGhpcy51bmlmb3Jtc1NpemUgKiA0O1xuXHR9XG5cdGdldCB1bmlmb3Jtc1NpemUoKSB7XG5cdFx0Ly8gaHR0cHM6Ly9ncHV3ZWIuZ2l0aHViLmlvL2dwdXdlYi93Z3NsLyNhZGRyZXNzLXNwYWNlLWxheW91dC1jb25zdHJhaW50c1xuXHRcdHJldHVybiB0aGlzLl9idWZmZXJTaXplICE9IHVuZGVmaW5lZCA/IHRoaXMuX2J1ZmZlclNpemUgLyA0IDogTWF0aC5jZWlsKHRoaXMuYnl0ZU9mZnNldCAvIDE2KSAqIDE2O1xuXHR9XG5cdGJpbmQoZGV2aWNlOiBHUFVEZXZpY2UpIHtcblx0XHR0aGlzLl91bmlmb3JtU3RydWN0LmZvckVhY2goKHVuaWZvcm0pID0+IHtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IHVuaWZvcm0uc2V0KCk7XG5cdFx0XHRpZiAodW5pZm9ybT8uZGlydHkgIT0gdW5kZWZpbmVkKSB1bmlmb3JtLmRpcnR5ID0gZmFsc2U7XG5cdFx0XHRpZiAocmVzdWx0ICE9IHVuZGVmaW5lZCAmJiB0aGlzLnVuaWZvcm1EaXJ0eSA9PSBmYWxzZSkgdGhpcy51bmlmb3JtRGlydHkgPSByZXN1bHQ7XG5cdFx0fSk7XG5cdFx0aWYgKHRoaXMudW5pZm9ybURpcnR5KSB7XG5cdFx0XHR0aGlzLnVuaWZvcm1EaXJ0eSA9IGZhbHNlO1xuXHRcdFx0aWYgKCF0aGlzLmJ1ZmZlcikgdGhpcy5idWZmZXIgPSBCdWZmZXIuY3JlYXRlVW5pZm9ybUJ1ZmZlcih0aGlzLmxhYmVsLCBkZXZpY2UsIHRoaXMuYnVmZmVyU2l6ZSwgdGhpcy51c2FnZSk7XG5cdFx0XHRpZiAodGhpcy50eXBlICE9IEJ1ZmZlckJpbmRpbmdUeXBlLlN0b3JhZ2UpXG5cdFx0XHRcdHRoaXMuYnVmZmVyLnNldFN1YkRhdGEoXG5cdFx0XHRcdFx0MCxcblx0XHRcdFx0XHR0aGlzLmRhdGFCdWZmZXIuc2xpY2UoMCwgZGVmYXVsdFZhbHVlKHRoaXM/LmJ1ZmZlclNpemUgLyA0LCB0aGlzLnVuaWZvcm1zU2l6ZSkpXG5cdFx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cdHB1YmxpYyBnZXRVbmlmb3JtQnVmZmVyU3RydWN0KCkge1xuXHRcdGxldCB1bmlmb3JtU3RydWN0ID0gYHN0cnVjdCBNYXRlcmlhbFVuaWZvcm0ge1xcbiBgO1xuXHRcdHRoaXMuX3VuaWZvcm1TdHJ1Y3QuZm9yRWFjaCgodW5pZm9ybSkgPT4ge1xuXHRcdFx0dW5pZm9ybVN0cnVjdCArPSB0aGlzLmNyZWF0ZVVuaWZvcm1TdHJpbmcodW5pZm9ybSk7XG5cdFx0fSk7XG5cdFx0dW5pZm9ybVN0cnVjdCArPSBgfVxcbmA7XG5cdFx0cmV0dXJuIHVuaWZvcm1TdHJ1Y3Q7XG5cdH1cblx0cHJpdmF0ZSBjcmVhdGVVbmlmb3JtU3RyaW5nKHVuaWZvcm0pIHtcblx0XHRsZXQgcmVzdWx0ID0gYGA7XG5cdFx0c3dpdGNoICh1bmlmb3JtLnR5cGUpIHtcblx0XHRcdGNhc2UgXCJ2ZWMxXCI6XG5cdFx0XHRcdHJlc3VsdCA9IGAke3VuaWZvcm0ubmFtZX0gOmYzMixcXG5gO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJ2ZWMyXCI6XG5cdFx0XHRcdHJlc3VsdCA9IGAke3VuaWZvcm0ubmFtZX0gOnZlYzI8ZjMyPixcXG5gO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJ2ZWMzXCI6XG5cdFx0XHRcdHJlc3VsdCA9IGAke3VuaWZvcm0ubmFtZX0gOnZlYzM8ZjMyPixcXG5gO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJ2ZWM0XCI6XG5cdFx0XHRcdHJlc3VsdCA9IGAke3VuaWZvcm0ubmFtZX0gOnZlYzQ8ZjMyPixcXG5gO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJtYXQyXCI6XG5cdFx0XHRcdHJlc3VsdCA9IGAke3VuaWZvcm0ubmFtZX0gOm1hdDJ4MjxmMzI+LFxcbmA7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIm1hdDNcIjpcblx0XHRcdFx0cmVzdWx0ID0gYCR7dW5pZm9ybS5uYW1lfSA6bWF0M3gzPGYzMj4sXFxuYDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwibWF0NFwiOlxuXHRcdFx0XHRyZXN1bHQgPSBgJHt1bmlmb3JtLm5hbWV9IDptYXQ0eDQ8ZjMyPixcXG5gO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXHRjb250YWlucyhuYW1lOiBzdHJpbmcpOiBVbmlmb3JtPGFueT4ge1xuXHRcdHJldHVybiB0aGlzLl91bmlmb3JtU3RydWN0LmdldChuYW1lKTtcblx0fVxuXHRyZXBsYWNlVW5pZm9ybVZhbHVlKG5hbWU6IHN0cmluZywgdmFsdWU6IFVuaWZvcm1GdW5jIHwgbnVtYmVyIHwgb2JqZWN0KSB7XG5cdFx0Y29uc3QgdW5pZm9ybSA9IHRoaXMuX3VuaWZvcm1TdHJ1Y3QuZ2V0KG5hbWUpO1xuXHRcdGlmICghdW5pZm9ybSkgcmV0dXJuO1xuXHRcdHVuaWZvcm0uY2IgPSB2YWx1ZTtcblx0fVxuXHRnZXRVbmlmb3JtQnlOYW1lKG5hbWU6IHN0cmluZykge1xuXHRcdHJldHVybiB0aGlzLl91bmlmb3JtU3RydWN0LmdldChuYW1lKTtcblx0fVxuXHQvLyB1bmlmb3JtQnVmZmVyLnNldFZlYzNBcnJheSgndGVzdCcsKCk9PntyZXR1cm4gW25ldyBWZWN0b3IzKDEsMCwwKSxuZXcgVmVjdG9yMygxLDAuOCwwLjUpXX0sMik7XG5cdC8vIHVuaWZvcm1CdWZmZXIuc2V0RmxvYXRBcnJheSgndGVzdDEnLCgpPT57cmV0dXJuIFswLjUsMC41LDEuMF19LDMpO1xuXHQvLyB1bmlmb3JtQnVmZmVyLnNldFZlYzRBcnJheSgndGVzdDQnLCgpPT57cmV0dXJuIFtuZXcgVmVjdG9yNCgwLjUsMC42LDAuMiwxLjApLG5ldyBWZWN0b3I0KDAuNSwwLjgsMC44LDEuMCldfSwyKTtcblx0Ly8gdW5pZm9ybUJ1ZmZlci5zZXRWZWMyQXJyYXkoJ3Rlc3QyJywoKT0+e3JldHVybiBbbmV3IFZlY3RvcjIoMC41LDAuNiksbmV3IFZlY3RvcjIoMC41LDAuOCwpXX0sMik7XG5cdHNldFVuaWZvcm0obmFtZTogc3RyaW5nLCB2YWx1ZTogVW5pZm9ybUZ1bmMgfCBudW1iZXIgfCBvYmplY3QsIHVuaWZvcm1UeXBlOiBVbmlmb3JtRW51bSwgY291bnQ/OiBudW1iZXIpIHtcblx0XHRpZiAodGhpcy5fdW5pZm9ybVN0cnVjdC5nZXQobmFtZSkpIHJldHVybjtcblx0XHRjb25zdCBUeXBlVW5pZm9ybSA9IFVuaWZvcm1CdWZmZXIuVW5pZm9ybVR5cGVbdW5pZm9ybVR5cGVdO1xuXHRcdHRoaXMuYnl0ZU9mZnNldCArPSBVbmlmb3JtQnVmZmVyLmNoZWNrVW5pZm9ybU9mZnNldCh0aGlzLmJ5dGVPZmZzZXQsIFR5cGVVbmlmb3JtLmFsaWduKTtcblx0XHRjb25zdCB1bmlmb3JtID1cblx0XHRcdGNvdW50ICE9IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IG5ldyBUeXBlVW5pZm9ybShuYW1lLCB0aGlzLmRhdGFCdWZmZXIsIHRoaXMuYnl0ZU9mZnNldCwgdmFsdWUsIGNvdW50KVxuXHRcdFx0XHQ6IG5ldyBUeXBlVW5pZm9ybShuYW1lLCB0aGlzLmRhdGFCdWZmZXIsIHRoaXMuYnl0ZU9mZnNldCwgdmFsdWUpO1xuXHRcdHRoaXMuX3VuaWZvcm1TdHJ1Y3Quc2V0KG5hbWUsIHVuaWZvcm0pO1xuXHRcdHRoaXMuYnl0ZU9mZnNldCArPSB1bmlmb3JtLmJ5dGVTaXplO1xuXHR9XG5cdHNldFVuaWZvcm1zRnJvbVVuaWZvcm1CdWZmZXIodW5pZm9ybUJ1ZmZlcjogVW5pZm9ybUJ1ZmZlcikge1xuXHRcdHRoaXMuX3VuaWZvcm1TdHJ1Y3QuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuXHRcdFx0Y29uc3QgdW5pZm9ybSA9IHVuaWZvcm1CdWZmZXIuZ2V0VW5pZm9ybUJ5TmFtZShrZXkpO1xuXHRcdFx0aWYgKHVuaWZvcm0pIHRoaXMuX3VuaWZvcm1TdHJ1Y3Quc2V0KGtleSwgdW5pZm9ybSk7XG5cdFx0fSk7XG5cdH1cblx0c3RhdGljIGNoZWNrVW5pZm9ybU9mZnNldChieXRlU2l6ZTogbnVtYmVyLCBBbGlnbjogbnVtYmVyKTogbnVtYmVyIHtcblx0XHQvLyBmcm9tIGh0dHBzOi8vZ3B1d2ViLmdpdGh1Yi5pby9ncHV3ZWIvd2dzbC8jYWRkcmVzcy1zcGFjZS1sYXlvdXQtY29uc3RyYWludHNcblx0XHQvLyByZXR1cm4gdGhpcy5oYXNEeW5hbWljT2Zmc2V0XG5cdFx0Ly8gXHQ/IE1hdGguY2VpbChieXRlU2l6ZSAvIDI1NikgKiAyNTYgLSBieXRlU2l6ZVxuXHRcdC8vIFx0OiBNYXRoLmNlaWwoYnl0ZVNpemUgLyBBbGlnbikgKiBBbGlnbiAtIGJ5dGVTaXplO1xuXHRcdHJldHVybiBNYXRoLmNlaWwoYnl0ZVNpemUgLyBBbGlnbikgKiBBbGlnbiAtIGJ5dGVTaXplO1xuXHR9XG5cdGRlc3Ryb3koKSB7XG5cdFx0dGhpcz8uYnVmZmVyPy5kZXN0cm95KCk7XG5cdH1cbn1cbnR5cGUgVW5pZm9ybUJ1ZmZlclBhcmFtcyA9IHtcblx0bGFiZWw6IHN0cmluZztcblx0dHlwZT86IHN0cmluZztcblx0dXNhZ2U/OiBCdWZmZXJVc2FnZTtcblx0c2l6ZT86IG51bWJlcjtcblx0ZGF0YUJ1ZmZlcj86IEZsb2F0MzJBcnJheTtcblx0YmluZGluZz86IG51bWJlcjtcblx0aGFzRHluYW1pY09mZnNldD86IGJvb2xlYW47XG5cdG1pbkJpbmRpbmdTaXplPzogbnVtYmVyO1xuXHRtYXhPZmZzZXQ/OiBudW1iZXI7XG5cdGJ1ZmZlcj86IEJ1ZmZlcjtcblx0dmlzaWJpbGl0eT86IFNoYWRlclN0YWdlO1xufTtcbiIsImltcG9ydCB7IElVbmlmb3JtLCBVbmlmb3JtRW51bSB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVVR5cGVzXCI7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tIFwiLi4vbWVzaC9NZXNoXCI7XHJcbmltcG9ydCBTaGFkZXJEYXRhIGZyb20gXCIuLi9yZW5kZXIvU2hhZGVyRGF0YVwiO1xyXG5pbXBvcnQgVW5pZm9ybUJ1ZmZlciBmcm9tIFwiLi4vcmVuZGVyL1VuaWZvcm1CdWZmZXJcIjtcclxuY29uc3QgdW5pZm9ybUFycmF5TmFtZXMgPSBbXCJhcnJheTxmMzI+XCIsIFwiYXJyYXk8dmVjMjxmMzI+PlwiLCBcImFycmF5PHZlYzM8ZjMyPj5cIiwgXCJhcnJheTx2ZWM0PGYzMj4+XCJdO1xyXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tDb250YWluRmxvYXRUeXBlKHVuaWZvcm1zKSB7XHJcblx0bGV0IHJlc3VsdCA9IDA7XHJcblx0bGV0IGhhc0FycmF5dHlwZSA9IGZhbHNlO1xyXG5cdGNvbnN0IHVuaWZvcm1zTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh1bmlmb3Jtcyk7XHJcblx0dW5pZm9ybXNOYW1lcy5tYXAoKHVuaWZvcm1zTmFtZSkgPT4ge1xyXG5cdFx0aWYgKHVuaWZvcm1zW3VuaWZvcm1zTmFtZV0udHlwZSA9PSBcInRleHR1cmVcIiB8fCB1bmlmb3Jtc1t1bmlmb3Jtc05hbWVdLnR5cGUgPT0gXCJzYW1wbGVyXCIpIHtcclxuXHRcdFx0cmVzdWx0ICs9IDA7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0dW5pZm9ybUFycmF5TmFtZXMuZmluZCgobmFtZSkgPT4ge1xyXG5cdFx0XHRcdFx0cmV0dXJuIG5hbWUgPT09IHVuaWZvcm1zW3VuaWZvcm1zTmFtZV0udHlwZTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRoYXNBcnJheXR5cGUgPSB0cnVlO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHJlc3VsdCArPSAxO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSk7XHJcblx0cmV0dXJuIHtcclxuXHRcdGhhc0Zsb2F0OiByZXN1bHQsXHJcblx0XHRoYXNBcnJheXR5cGVcclxuXHR9O1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRVbmlmb3JtVG9TaGFkZXJEYXRhKFxyXG5cdG5hbWU6IHN0cmluZyxcclxuXHR1bmlmb3JtOiBJVW5pZm9ybSxcclxuXHRzaGFkZXJEYXRhOiBTaGFkZXJEYXRhLFxyXG5cdG1lc2g/OiBNZXNoLFxyXG5cdHVuaWZvcm1CdWZmZXI/OiBVbmlmb3JtQnVmZmVyXHJcbikge1xyXG5cdGNvbnN0IHZhbHVlSXNGdW5jID0gdW5pZm9ybT8udmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbjtcclxuXHRzd2l0Y2ggKHVuaWZvcm0udHlwZSkge1xyXG5cdFx0Y2FzZSBcImYzMlwiOlxyXG5cdFx0XHR1bmlmb3JtQnVmZmVyLnNldFVuaWZvcm0oXHJcblx0XHRcdFx0bmFtZSxcclxuXHRcdFx0XHR2YWx1ZUlzRnVuY1xyXG5cdFx0XHRcdFx0PyB1bmlmb3JtLnZhbHVlXHJcblx0XHRcdFx0XHQ6ICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5pZm9ybS52YWx1ZTtcclxuXHRcdFx0XHRcdCAgfSxcclxuXHRcdFx0XHRVbmlmb3JtRW51bS5GbG9hdFxyXG5cdFx0XHQpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgXCJ2ZWMyPGYzMj5cIjpcclxuXHRcdFx0dW5pZm9ybUJ1ZmZlci5zZXRVbmlmb3JtKFxyXG5cdFx0XHRcdG5hbWUsXHJcblx0XHRcdFx0dmFsdWVJc0Z1bmNcclxuXHRcdFx0XHRcdD8gdW5pZm9ybS52YWx1ZVxyXG5cdFx0XHRcdFx0OiAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHVuaWZvcm0udmFsdWU7XHJcblx0XHRcdFx0XHQgIH0sXHJcblx0XHRcdFx0VW5pZm9ybUVudW0uRmxvYXRWZWMyXHJcblx0XHRcdCk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSBcInZlYzM8ZjMyPlwiOlxyXG5cdFx0XHR1bmlmb3JtQnVmZmVyLnNldFVuaWZvcm0oXHJcblx0XHRcdFx0bmFtZSxcclxuXHRcdFx0XHR2YWx1ZUlzRnVuY1xyXG5cdFx0XHRcdFx0PyB1bmlmb3JtLnZhbHVlXHJcblx0XHRcdFx0XHQ6ICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5pZm9ybS52YWx1ZTtcclxuXHRcdFx0XHRcdCAgfSxcclxuXHRcdFx0XHRVbmlmb3JtRW51bS5GbG9hdFZlYzNcclxuXHRcdFx0KTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiY29sb3JcIjpcclxuXHRcdFx0dW5pZm9ybUJ1ZmZlci5zZXRVbmlmb3JtKFxyXG5cdFx0XHRcdG5hbWUsXHJcblx0XHRcdFx0dmFsdWVJc0Z1bmNcclxuXHRcdFx0XHRcdD8gdW5pZm9ybS52YWx1ZVxyXG5cdFx0XHRcdFx0OiAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHVuaWZvcm0udmFsdWU7XHJcblx0XHRcdFx0XHQgIH0sXHJcblx0XHRcdFx0VW5pZm9ybUVudW0uQ29sb3JcclxuXHRcdFx0KTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwidmVjNDxmMzI+XCI6XHJcblx0XHRcdHVuaWZvcm1CdWZmZXIuc2V0VW5pZm9ybShcclxuXHRcdFx0XHRuYW1lLFxyXG5cdFx0XHRcdHZhbHVlSXNGdW5jXHJcblx0XHRcdFx0XHQ/IHVuaWZvcm0udmFsdWVcclxuXHRcdFx0XHRcdDogKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB1bmlmb3JtLnZhbHVlO1xyXG5cdFx0XHRcdFx0ICB9LFxyXG5cdFx0XHRcdFVuaWZvcm1FbnVtLkZsb2F0VmVjNFxyXG5cdFx0XHQpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgXCJtYXQyeDI8ZjMyPlwiOlxyXG5cdFx0XHR1bmlmb3JtQnVmZmVyLnNldFVuaWZvcm0oXHJcblx0XHRcdFx0bmFtZSxcclxuXHRcdFx0XHR2YWx1ZUlzRnVuY1xyXG5cdFx0XHRcdFx0PyB1bmlmb3JtLnZhbHVlXHJcblx0XHRcdFx0XHQ6ICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5pZm9ybS52YWx1ZTtcclxuXHRcdFx0XHRcdCAgfSxcclxuXHRcdFx0XHRVbmlmb3JtRW51bS5NYXQyXHJcblx0XHRcdCk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSBcIm1hdDN4MzxmMzI+XCI6XHJcblx0XHRcdHVuaWZvcm1CdWZmZXIuc2V0VW5pZm9ybShcclxuXHRcdFx0XHRuYW1lLFxyXG5cdFx0XHRcdHZhbHVlSXNGdW5jXHJcblx0XHRcdFx0XHQ/IHVuaWZvcm0udmFsdWVcclxuXHRcdFx0XHRcdDogKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB1bmlmb3JtLnZhbHVlO1xyXG5cdFx0XHRcdFx0ICB9LFxyXG5cdFx0XHRcdFVuaWZvcm1FbnVtLk1hdDNcclxuXHRcdFx0KTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwibWF0NHg0PGYzMj5cIjpcclxuXHRcdFx0dW5pZm9ybUJ1ZmZlci5zZXRVbmlmb3JtKFxyXG5cdFx0XHRcdG5hbWUsXHJcblx0XHRcdFx0dmFsdWVJc0Z1bmNcclxuXHRcdFx0XHRcdD8gdW5pZm9ybS52YWx1ZVxyXG5cdFx0XHRcdFx0OiAoKSA9PlxyXG5cdFx0XHRcdFx0XHRcdG5hbWUgPT0gXCJtb2RlbE1hdHJpeFwiXHJcblx0XHRcdFx0XHRcdFx0XHQ/IG1lc2g/Lm1vZGVsTWF0cml4XHJcblx0XHRcdFx0XHRcdFx0XHQ6IG5hbWUgPT09IFwibm9ybWFsTWF0cml4XCJcclxuXHRcdFx0XHRcdFx0XHRcdD8gbWVzaD8ubm9ybWFsTWF0cml4XHJcblx0XHRcdFx0XHRcdFx0XHQ6IHVuaWZvcm0udmFsdWUsXHJcblx0XHRcdFx0VW5pZm9ybUVudW0uTWF0NFxyXG5cdFx0XHQpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgXCJhcnJheTxmMzI+XCI6XHJcblx0XHRcdHVuaWZvcm1CdWZmZXIuc2V0VW5pZm9ybShcclxuXHRcdFx0XHRuYW1lLFxyXG5cdFx0XHRcdHZhbHVlSXNGdW5jXHJcblx0XHRcdFx0XHQ/IHVuaWZvcm0udmFsdWVcclxuXHRcdFx0XHRcdDogKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB1bmlmb3JtLnZhbHVlO1xyXG5cdFx0XHRcdFx0ICB9LFxyXG5cdFx0XHRcdFVuaWZvcm1FbnVtLkZsb2F0QXJyYXksXHJcblx0XHRcdFx0dW5pZm9ybS52YWx1ZS5sZW5ndGhcclxuXHRcdFx0KTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiYXJyYXk8dmVjMjxmMzI+PlwiOlxyXG5cdFx0XHR1bmlmb3JtQnVmZmVyLnNldFVuaWZvcm0oXHJcblx0XHRcdFx0bmFtZSxcclxuXHRcdFx0XHR2YWx1ZUlzRnVuY1xyXG5cdFx0XHRcdFx0PyB1bmlmb3JtLnZhbHVlXHJcblx0XHRcdFx0XHQ6ICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5pZm9ybS52YWx1ZTtcclxuXHRcdFx0XHRcdCAgfSxcclxuXHRcdFx0XHRVbmlmb3JtRW51bS5WZWMyQXJyYXksXHJcblx0XHRcdFx0dW5pZm9ybS52YWx1ZS5sZW5ndGhcclxuXHRcdFx0KTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiYXJyYXk8dmVjMzxmMzI+PlwiOlxyXG5cdFx0XHR1bmlmb3JtQnVmZmVyLnNldFVuaWZvcm0oXHJcblx0XHRcdFx0bmFtZSxcclxuXHRcdFx0XHR2YWx1ZUlzRnVuY1xyXG5cdFx0XHRcdFx0PyB1bmlmb3JtLnZhbHVlXHJcblx0XHRcdFx0XHQ6ICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5pZm9ybS52YWx1ZTtcclxuXHRcdFx0XHRcdCAgfSxcclxuXHRcdFx0XHRVbmlmb3JtRW51bS5WZWMzQXJyYXksXHJcblx0XHRcdFx0dW5pZm9ybS52YWx1ZS5sZW5ndGhcclxuXHRcdFx0KTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiYXJyYXk8dmVjNDxmMzI+PlwiOlxyXG5cdFx0XHR1bmlmb3JtQnVmZmVyLnNldFVuaWZvcm0oXHJcblx0XHRcdFx0bmFtZSxcclxuXHRcdFx0XHR2YWx1ZUlzRnVuY1xyXG5cdFx0XHRcdFx0PyB1bmlmb3JtLnZhbHVlXHJcblx0XHRcdFx0XHQ6ICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5pZm9ybS52YWx1ZTtcclxuXHRcdFx0XHRcdCAgfSxcclxuXHRcdFx0XHRVbmlmb3JtRW51bS5WZWM0QXJyYXksXHJcblx0XHRcdFx0dW5pZm9ybS52YWx1ZS5sZW5ndGhcclxuXHRcdFx0KTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwidGV4dHVyZVwiOlxyXG5cdFx0Y2FzZSBcInN0b3JhZ2VUZXh0dXJlXCI6XHJcblx0XHRcdHNoYWRlckRhdGEuc2V0VGV4dHVyZShcclxuXHRcdFx0XHRuYW1lLFxyXG5cdFx0XHRcdHZhbHVlSXNGdW5jXHJcblx0XHRcdFx0XHQ/IHVuaWZvcm0udmFsdWVcclxuXHRcdFx0XHRcdDogKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB1bmlmb3JtLnZhbHVlO1xyXG5cdFx0XHRcdFx0ICB9LFxyXG5cdFx0XHRcdHVuaWZvcm0/LmJpbmRpbmcsXHJcblx0XHRcdFx0dW5pZm9ybT8udHlwZSxcclxuXHRcdFx0XHR1bmlmb3JtPy52aXNpYmlsaXR5LFxyXG5cdFx0XHRcdHVuaWZvcm0/LnRleHR1cmVWaWV3XHJcblx0XHRcdCk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSBcInNhbXBsZXJcIjpcclxuXHRcdFx0c2hhZGVyRGF0YS5zZXRTYW1wbGVyKFxyXG5cdFx0XHRcdG5hbWUsXHJcblx0XHRcdFx0dmFsdWVJc0Z1bmNcclxuXHRcdFx0XHRcdD8gdW5pZm9ybS52YWx1ZVxyXG5cdFx0XHRcdFx0OiAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHVuaWZvcm0udmFsdWU7XHJcblx0XHRcdFx0XHQgIH0sXHJcblx0XHRcdFx0dW5pZm9ybT8uYmluZGluZyxcclxuXHRcdFx0XHR1bmlmb3JtPy52aXNpYmlsaXR5XHJcblx0XHRcdCk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0ZGVmYXVsdDpcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwibm90IG1hdGNoIHVuaWZyb20gdHlwZVwiKTtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IEJpbmRHcm91cExheW91dEVudHJ5IGZyb20gXCIuL0JpbmRHcm91cExheW91dEVudHJ5XCI7XHJcbmNvbnN0IGxheW91dENhY2hlID0gbmV3IE1hcCgpO1xyXG5jbGFzcyBCaW5kR3JvdXBMYXlvdXQge1xyXG5cdHB1YmxpYyBncHVCaW5kR3JvdXBMYXlvdXQ6IEdQVUJpbmRHcm91cExheW91dDtcclxuXHRpbmRleDogbnVtYmVyO1xyXG5cdHByaXZhdGUgY29uc3RydWN0b3IoZGV2aWNlOiBHUFVEZXZpY2UsIGxhYmVsOiBzdHJpbmcsIHB1YmxpYyBlbnRyaWVzOiBCaW5kR3JvdXBMYXlvdXRFbnRyeVtdID0gW10sIGluZGV4ID0gMCkge1xyXG5cdFx0dGhpcy5pbmRleCA9IGluZGV4IHx8IDA7XHJcblx0XHR0aGlzLmdwdUJpbmRHcm91cExheW91dCA9IGRldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoe1xyXG5cdFx0XHRsYWJlbDogbGFiZWwsXHJcblx0XHRcdGVudHJpZXM6IGVudHJpZXMubWFwKCh7IHZpc2liaWxpdHksIGJ1ZmZlciwgc2FtcGxlciwgdGV4dHVyZSwgc3RvcmFnZVRleHR1cmUsIGJpbmRpbmcgfSkgPT4gKHtcclxuXHRcdFx0XHRiaW5kaW5nLFxyXG5cdFx0XHRcdHZpc2liaWxpdHksXHJcblx0XHRcdFx0YnVmZmVyLFxyXG5cdFx0XHRcdHNhbXBsZXIsXHJcblx0XHRcdFx0dGV4dHVyZSxcclxuXHRcdFx0XHRzdG9yYWdlVGV4dHVyZVxyXG5cdFx0XHR9KSlcclxuXHRcdH0pO1xyXG5cdH1cclxuXHRzdGF0aWMgZ2V0QmluZEdyb3VwTGF5b3V0RnJvbUNhY2hlKFxyXG5cdFx0ZGV2aWNlOiBHUFVEZXZpY2UsXHJcblx0XHRsYWJlbDogc3RyaW5nLFxyXG5cdFx0ZW50aXJlczogQmluZEdyb3VwTGF5b3V0RW50cnlbXSxcclxuXHRcdGluZGV4XHJcblx0KTogQmluZEdyb3VwTGF5b3V0IHtcclxuXHRcdGlmIChsYXlvdXRDYWNoZS5oYXMobGFiZWwpKSB7XHJcblx0XHRcdHJldHVybiBsYXlvdXRDYWNoZS5nZXQobGFiZWwpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y29uc3QgYmluZEdyb3VwTGF5b3V0ID0gbmV3IEJpbmRHcm91cExheW91dChkZXZpY2UsIGxhYmVsLCBlbnRpcmVzLCBpbmRleCk7XHJcblx0XHRcdGxheW91dENhY2hlLnNldChsYWJlbCwgYmluZEdyb3VwTGF5b3V0KTtcclxuXHRcdFx0cmV0dXJuIGJpbmRHcm91cExheW91dDtcclxuXHRcdH1cclxuXHR9XHJcblx0c3RhdGljIHJlbW92ZUJpbmRHcm91cExheW91dEZyb21DYWNoZShiaW5kR3JvdXBMYXlvdXQ6IEJpbmRHcm91cExheW91dCkge1xyXG5cdFx0bGF5b3V0Q2FjaGUuZGVsZXRlKGJpbmRHcm91cExheW91dCk7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCaW5kR3JvdXBMYXlvdXQ7XHJcbiIsImltcG9ydCB7IEJpbmRHcm91cExheW91dEVudHJ5VHlwZSB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVVR5cGVzXCI7XHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJpbmRHcm91cExheW91dEVudHJ5IHtcclxuXHRiaW5kaW5nOiBudW1iZXI7XHJcblx0dmlzaWJpbGl0eTogR1BVU2hhZGVyU3RhZ2VGbGFncztcclxuXHR1bmlmb3Jtcz86IGFueVtdO1xyXG5cdGJ1ZmZlcj86IEdQVUJ1ZmZlckJpbmRpbmdMYXlvdXQ7XHJcblx0c2FtcGxlcj86IEdQVVNhbXBsZXJCaW5kaW5nTGF5b3V0O1xyXG5cdHRleHR1cmU/OiBHUFVUZXh0dXJlQmluZGluZ0xheW91dDtcclxuXHRzdG9yYWdlVGV4dHVyZT86IEdQVVN0b3JhZ2VUZXh0dXJlQmluZGluZ0xheW91dDtcclxuXHRleHRlcm5hbFRleHR1cmU/OiBHUFVFeHRlcm5hbFRleHR1cmVCaW5kaW5nTGF5b3V0O1xyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnM6IEJpbmRHcm91cExheW91dEVudHJ5VHlwZSkge1xyXG5cdFx0dGhpcy5iaW5kaW5nID0gb3B0aW9ucy5iaW5kaW5nO1xyXG5cdFx0dGhpcy52aXNpYmlsaXR5ID0gb3B0aW9ucy52aXNpYmlsaXR5O1xyXG5cdFx0dGhpcy5idWZmZXIgPSBvcHRpb25zLmJ1ZmZlcjtcclxuXHRcdHRoaXMuc2FtcGxlciA9IG9wdGlvbnMuc2FtcGxlcjtcclxuXHRcdHRoaXMudGV4dHVyZSA9IG9wdGlvbnMudGV4dHVyZTtcclxuXHRcdHRoaXMuc3RvcmFnZVRleHR1cmUgPSBvcHRpb25zLnN0b3JhZ2VUZXh0dXJlO1xyXG5cdFx0dGhpcy5leHRlcm5hbFRleHR1cmUgPSBvcHRpb25zLmV4dGVybmFsVGV4dHVyZTtcclxuXHR9XHJcblx0Z2V0R1BVTGF5b3V0RW50aXR5KCkge1xyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0YmluZGluZzogdGhpcy5iaW5kaW5nLFxyXG5cdFx0XHR2aXNpYmlsaXR5OiB0aGlzLnZpc2liaWxpdHksXHJcblx0XHRcdGJ1ZmZlcjogdGhpcy5idWZmZXIsXHJcblx0XHRcdHNhbXBsZXI6IHRoaXMuc2FtcGxlcixcclxuXHRcdFx0dGV4dHVyZTogdGhpcy50ZXh0dXJlLFxyXG5cdFx0XHRleHRlcm5hbFRleHR1cmU6IHRoaXMuZXh0ZXJuYWxUZXh0dXJlLFxyXG5cdFx0XHRzdG9yYWdlVGV4dHVyZTogdGhpcy5zdG9yYWdlVGV4dHVyZVxyXG5cdFx0fTtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyU3RhZ2UgfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVDb25zdGFudFwiO1xuaW1wb3J0IHsgVW5pZm9ybUZ1bmMsIFNoYWRlckRlZmluZSB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVVR5cGVzXCI7XG5pbXBvcnQgZGVmYXVsdFZhbHVlIGZyb20gXCIuLi91dGlscy9kZWZhdWx0VmFsdWVcIjtcbmltcG9ydCBCaW5kR3JvdXAgZnJvbSBcIi4vQmluZEdyb3VwXCI7XG5pbXBvcnQgQmluZEdyb3VwRW50aXR5IGZyb20gXCIuL0JpbmRHcm91cEVudGl0eVwiO1xuaW1wb3J0IEJpbmRHcm91cExheW91dCBmcm9tIFwiLi9CaW5kR3JvdXBMYXlvdXRcIjtcbmltcG9ydCBCaW5kR3JvdXBMYXlvdXRFbnRyeSBmcm9tIFwiLi9CaW5kR3JvdXBMYXlvdXRFbnRyeVwiO1xuaW1wb3J0IFNhbXBsZXIgZnJvbSBcIi4vU2FtcGxlclwiO1xuaW1wb3J0IFRleHR1cmUgZnJvbSBcIi4vVGV4dHVyZVwiO1xuaW1wb3J0IFVuaWZvcm1CdWZmZXIgZnJvbSBcIi4vVW5pZm9ybUJ1ZmZlclwiO1xuaW1wb3J0IHsgVW5pZm9ybVNhbXBsZXIsIFVuaWZvcm1UZXh0dXJlIH0gZnJvbSBcIi4vVW5pZm9ybXNcIjtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoYWRlckRhdGEge1xuXHRjdXJyZW50QmluZGluZzogbnVtYmVyO1xuXG5cdGRlZmluZXM6IFNoYWRlckRlZmluZTtcblxuXHRkZWZpbmVEaXJ0eTogYm9vbGVhbjtcblxuXHRsYWJlbDogc3RyaW5nO1xuXG5cdGJpbmRHcm91cDogQmluZEdyb3VwO1xuXG5cdGdyb3VwTGF5b3V0OiBCaW5kR3JvdXBMYXlvdXQ7XG5cblx0bGF5b3V0SW5kZXg6IG51bWJlcjtcblxuXHRncm91cEluZGV4OiBudW1iZXI7XG5cblx0cHJvdGVjdGVkIF91bmlmb3JtczogTWFwPHN0cmluZywgYW55PjtcblxuXHRjb25zdHJ1Y3RvcihsYWJlbDogc3RyaW5nLCBzaXplPzogbnVtYmVyLCBsYXlvdXRJbmRleD86IG51bWJlciwgZ3JvdXBJbmRleD8pIHtcblx0XHR0aGlzLmxhYmVsID0gbGFiZWw7XG5cdFx0dGhpcy5jdXJyZW50QmluZGluZyA9IDA7XG5cdFx0dGhpcy5kZWZpbmVEaXJ0eSA9IHRydWU7XG5cdFx0dGhpcy5kZWZpbmVzID0ge307XG5cdFx0dGhpcy5fdW5pZm9ybXMgPSBuZXcgTWFwKCk7XG5cdFx0dGhpcy5ncm91cEluZGV4ID0gZGVmYXVsdFZhbHVlKGdyb3VwSW5kZXgsIDApO1xuXHRcdHRoaXMubGF5b3V0SW5kZXggPSBkZWZhdWx0VmFsdWUobGF5b3V0SW5kZXgsIDApO1xuXHR9XG5cdGdldFVuaWZvcm1CdWZmZXIobmFtZTogc3RyaW5nKTogVW5pZm9ybUJ1ZmZlciB7XG5cdFx0cmV0dXJuIHRoaXMuX3VuaWZvcm1zLmdldChuYW1lKTtcblx0fVxuXHRnZXRUZXh0dXJlKG5hbWU6IHN0cmluZyk6IFRleHR1cmUge1xuXHRcdHJldHVybiB0aGlzLl91bmlmb3Jtcy5nZXQobmFtZSk7XG5cdH1cblx0Z2V0U2FtcGxlcihuYW1lOiBzdHJpbmcpOiBTYW1wbGVyIHtcblx0XHRyZXR1cm4gdGhpcy5fdW5pZm9ybXMuZ2V0KG5hbWUpO1xuXHR9XG5cdHNldFVuaWZvcm1CdWZmZXIobmFtZTogc3RyaW5nLCB1bmlmb3JtQnVmZmVyOiBVbmlmb3JtQnVmZmVyLCBiaW5kaW5nPzogbnVtYmVyKSB7XG5cdFx0aWYgKHRoaXMuX3VuaWZvcm1zLmdldChuYW1lKSkgcmV0dXJuO1xuXHRcdHVuaWZvcm1CdWZmZXIuYmluZGluZyA9IHRoaXMuY3VycmVudEJpbmRpbmc7XG5cdFx0dGhpcy5zZXREZWZpbmUobmFtZS5jb25jYXQoXCJCaW5kaW5nXCIpLCBiaW5kaW5nID8/IHRoaXMuY3VycmVudEJpbmRpbmcpO1xuXHRcdHRoaXMuY3VycmVudEJpbmRpbmcgKz0gMTtcblx0XHR0aGlzLl91bmlmb3Jtcy5zZXQobmFtZSwgdW5pZm9ybUJ1ZmZlcik7XG5cdH1cblx0c2V0VGV4dHVyZShcblx0XHRuYW1lOiBzdHJpbmcsXG5cdFx0dmFsdWU6IFVuaWZvcm1GdW5jIHwgVGV4dHVyZSxcblx0XHRiaW5kaW5nPzogbnVtYmVyLFxuXHRcdHR5cGU/OiBzdHJpbmcsXG5cdFx0dmlzaWJpbGl0eT86IFNoYWRlclN0YWdlLFxuXHRcdHRleHR1cmVWaWV3PzogR1BVVGV4dHVyZVZpZXdcblx0KSB7XG5cdFx0aWYgKHRoaXMuX3VuaWZvcm1zLmdldChuYW1lKSkgcmV0dXJuO1xuXHRcdGNvbnN0IHVuaWZvcm0gPSBuZXcgVW5pZm9ybVRleHR1cmUobmFtZSwgYmluZGluZyA/PyB0aGlzLmN1cnJlbnRCaW5kaW5nLCB2YWx1ZSwgdHlwZSwgdmlzaWJpbGl0eSwgdGV4dHVyZVZpZXcpO1xuXHRcdHRoaXMuc2V0RGVmaW5lKG5hbWUuY29uY2F0KFwiQmluZGluZ1wiKSwgYmluZGluZyA/PyB0aGlzLmN1cnJlbnRCaW5kaW5nKTtcblx0XHR0aGlzLmN1cnJlbnRCaW5kaW5nICs9IDE7XG5cdFx0dGhpcy5fdW5pZm9ybXMuc2V0KG5hbWUsIHVuaWZvcm0pO1xuXHR9XG5cdHNldFNhbXBsZXIobmFtZTogc3RyaW5nLCB2YWx1ZTogVW5pZm9ybUZ1bmMgfCBTYW1wbGVyLCBiaW5kaW5nPzogbnVtYmVyLCB2aXNpYmlsaXR5PzogU2hhZGVyU3RhZ2UpIHtcblx0XHRpZiAodGhpcy5fdW5pZm9ybXMuZ2V0KG5hbWUpKSByZXR1cm47XG5cdFx0Y29uc3QgdW5pZm9ybSA9IG5ldyBVbmlmb3JtU2FtcGxlcihuYW1lLCBiaW5kaW5nID8/IHRoaXMuY3VycmVudEJpbmRpbmcsIHZhbHVlLCB2aXNpYmlsaXR5KTtcblx0XHR0aGlzLnNldERlZmluZShuYW1lLmNvbmNhdChcIkJpbmRpbmdcIiksIGJpbmRpbmcgPz8gdGhpcy5jdXJyZW50QmluZGluZyk7XG5cdFx0dGhpcy5jdXJyZW50QmluZGluZyArPSAxO1xuXHRcdHRoaXMuX3VuaWZvcm1zLnNldChuYW1lLCB1bmlmb3JtKTtcblx0fVxuXHRzZXREZWZpbmUobmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbiB8IG51bWJlcikge1xuXHRcdGlmICh0aGlzLmRlZmluZXNbbmFtZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5kZWZpbmVEaXJ0eSA9IHRydWU7XG5cdFx0XHR0aGlzLmRlZmluZXNbbmFtZV0gPSB2YWx1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMuZGVmaW5lc1tuYW1lXSA9PT0gdmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5kZWZpbmVEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdHRoaXMuZGVmaW5lc1tuYW1lXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRzZXRVbmlmb3JtQnVmZmVyVmFsdWUodW5pZm9ybUJ1ZmZlcjogVW5pZm9ybUJ1ZmZlcikge1xuXHRcdGNvbnN0IGRpc3RVYm8gPSB0aGlzLl91bmlmb3Jtcy5nZXQodW5pZm9ybUJ1ZmZlci5uYW1lKTtcblx0XHRkaXN0VWJvLnNldFVuaWZvcm1zRnJvbVVuaWZvcm1CdWZmZXIodW5pZm9ybUJ1ZmZlcik7XG5cdH1cblx0YmluZChkZXZpY2U6IEdQVURldmljZSwgcGFzc0VuY29kZXI6IEdQVVJlbmRlclBhc3NFbmNvZGVyIHwgR1BVQ29tcHV0ZVBhc3NFbmNvZGVyKSB7XG5cdFx0dGhpcy51cGxvYWRVbmlmb3JtKGRldmljZSk7XG5cdFx0aWYgKCF0aGlzLmdyb3VwTGF5b3V0KSB0aGlzLmdyb3VwTGF5b3V0ID0gdGhpcy5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoZGV2aWNlLCB0aGlzLmxhYmVsLCB0aGlzLmxheW91dEluZGV4KTtcblx0XHRpZiAoIXRoaXMuYmluZEdyb3VwKSB0aGlzLmJpbmRHcm91cCA9IHRoaXMuY3JlYXRlQmluZEdyb3VwKGRldmljZSwgdGhpcy5sYWJlbCwgdGhpcy5ncm91cEluZGV4KTtcblx0XHR0aGlzLmJpbmRHcm91cC5iaW5kKHBhc3NFbmNvZGVyKTtcblx0fVxuXHRkZXN0cm95KCkge1xuXHRcdHRoaXMuX3VuaWZvcm1zLmZvckVhY2goKHVuaWZvcm0pID0+IHtcblx0XHRcdGlmICh1bmlmb3JtLmRlc3Ryb3kpIHVuaWZvcm0/LmRlc3Ryb3koKTtcblx0XHR9KTtcblx0XHR0aGlzLmxhYmVsID0gdW5kZWZpbmVkO1xuXHRcdHRoaXMuY3VycmVudEJpbmRpbmcgPSAxO1xuXHRcdHRoaXMuZGVmaW5lRGlydHkgPSB0cnVlO1xuXHRcdHRoaXMuZGVmaW5lcyA9IHVuZGVmaW5lZDtcblx0XHR0aGlzLl91bmlmb3Jtcy5jbGVhcigpO1xuXHRcdEJpbmRHcm91cExheW91dC5yZW1vdmVCaW5kR3JvdXBMYXlvdXRGcm9tQ2FjaGUodGhpcy5ncm91cExheW91dCk7XG5cdFx0dGhpcy5iaW5kR3JvdXAgPSB1bmRlZmluZWQ7XG5cdH1cblx0cHJpdmF0ZSBjcmVhdGVCaW5kR3JvdXAoZGV2aWNlOiBHUFVEZXZpY2UsIGxhYmVsOiBzdHJpbmcsIGdyb3VwSW5kZXg/OiBudW1iZXIpIHtcblx0XHRjb25zdCB7IGVudGl0aWVzLCBkeW5hbWljLCBhbGlnbmVkU2l6ZSwgbWF4T2Zmc2V0IH0gPSB0aGlzLmNyZWF0ZUJpbmRHcm91cEVudGl0eSgpO1xuXHRcdGNvbnN0IGJpbmRHcm91cCA9IG5ldyBCaW5kR3JvdXAoe1xuXHRcdFx0bGFiZWw6IGxhYmVsLFxuXHRcdFx0ZW50aXJlczogZW50aXRpZXMsXG5cdFx0XHRkZXZpY2U6IGRldmljZSxcblx0XHRcdGxheW91dDogdGhpcy5ncm91cExheW91dCxcblx0XHRcdGluZGV4OiBncm91cEluZGV4IHx8IDAsIC8vIOWQjue7reaUueaIkGdyb3VwSW5kZXhcblx0XHRcdGR5bmFtaWMsXG5cdFx0XHRhbGlnbmVkU2l6ZSxcblx0XHRcdG1heE9mZnNldFxuXHRcdH0pO1xuXHRcdHJldHVybiBiaW5kR3JvdXA7XG5cdH1cblx0cHJpdmF0ZSBjcmVhdGVCaW5kR3JvdXBMYXlvdXQoZGV2aWNlOiBHUFVEZXZpY2UsIGxhYmVsOiBzdHJpbmcsIGxheW91dEluZGV4PzogbnVtYmVyKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gdGhpcy5jcmVhdGVCaW5kR3JvdXBMYXlvdXRFbnRyeSgpO1xuXHRcdGNvbnN0IGdyb3VwTGF5b3V0ID0gQmluZEdyb3VwTGF5b3V0LmdldEJpbmRHcm91cExheW91dEZyb21DYWNoZShcblx0XHRcdGRldmljZSxcblx0XHRcdGxhYmVsICsgXCItXCIgKyByZXN1bHQudWlkLFxuXHRcdFx0cmVzdWx0LmxheW91dHMsXG5cdFx0XHRsYXlvdXRJbmRleCB8fCAwXG5cdFx0KTtcblx0XHRyZXR1cm4gZ3JvdXBMYXlvdXQ7XG5cdH1cblx0cHJvdGVjdGVkIHVwbG9hZFVuaWZvcm0oZGV2aWNlOiBHUFVEZXZpY2UpIHtcblx0XHR0aGlzLl91bmlmb3Jtcy5mb3JFYWNoKCh1bmlmb3JtKSA9PiB7XG5cdFx0XHR1bmlmb3JtLmJpbmQoZGV2aWNlKTtcblx0XHR9KTtcblx0fVxuXHRwcml2YXRlIGNyZWF0ZUJpbmRHcm91cExheW91dEVudHJ5KCkge1xuXHRcdGxldCB1aWQgPSBcIlwiO1xuXHRcdGNvbnN0IHJlc3VsdCA9IG5ldyBNYXAoKTtcblx0XHR0aGlzLl91bmlmb3Jtcy5mb3JFYWNoKCh1bmlmb3JtKSA9PiB7XG5cdFx0XHRpZiAoIXJlc3VsdC5oYXModW5pZm9ybS5uYW1lKSkge1xuXHRcdFx0XHR1aWQgPSB1aWQgPT09IFwiXCIgPyB1aWQuY29uY2F0KHVuaWZvcm0ubmFtZSkgOiB1aWQuY29uY2F0KFwiLCBcIikuY29uY2F0KHVuaWZvcm0ubmFtZSk7XG5cdFx0XHRcdHJlc3VsdC5zZXQodW5pZm9ybS5uYW1lLCB0aGlzLmNyZWF0ZU9uZUxheW91dEVudHJ5KHVuaWZvcm0pKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHR1aWQgPSBgdW5pZm9ybXNbJHt1aWR9XWA7XG5cdFx0cmV0dXJuIHsgdWlkLCBsYXlvdXRzOiBbLi4ucmVzdWx0LnZhbHVlcygpXSB9O1xuXHR9XG5cdHByaXZhdGUgY3JlYXRlQmluZEdyb3VwRW50aXR5KCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IG5ldyBNYXAoKTtcblx0XHRsZXQgZHluYW1pYyA9IGZhbHNlLFxuXHRcdFx0YWxpZ25lZFNpemUgPSAwLFxuXHRcdFx0bWF4T2Zmc2V0ID0gMDtcblx0XHR0aGlzLl91bmlmb3Jtcy5mb3JFYWNoKCh1bmlmb3JtKSA9PiB7XG5cdFx0XHRpZiAoIXJlc3VsdC5oYXModW5pZm9ybS5uYW1lKSkge1xuXHRcdFx0XHRpZiAodW5pZm9ybT8uaGFzRHluYW1pY09mZnNldCkge1xuXHRcdFx0XHRcdGR5bmFtaWMgPSB0cnVlO1xuXHRcdFx0XHRcdG1heE9mZnNldCA9IHVuaWZvcm0ubWF4T2Zmc2V0O1xuXHRcdFx0XHRcdGFsaWduZWRTaXplID0gTWF0aC5jZWlsKHVuaWZvcm0udW5pZm9ybXNTaXplIC8gKDQgKiAyNTYpKSAqIDI1Njtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXN1bHQuc2V0KHVuaWZvcm0ubmFtZSwgdGhpcy5jcmVheWVPbmVHcm91cEVudGl0eSh1bmlmb3JtKSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGVudGl0aWVzOiBbLi4ucmVzdWx0LnZhbHVlcygpXSxcblx0XHRcdGR5bmFtaWMsXG5cdFx0XHRhbGlnbmVkU2l6ZSxcblx0XHRcdG1heE9mZnNldFxuXHRcdH07XG5cdH1cblx0cHJpdmF0ZSBjcmVhdGVPbmVMYXlvdXRFbnRyeSh1bmlmb3JtKSB7XG5cdFx0bGV0IGxheW91dEVudGl0eTtcblx0XHRpZiAodW5pZm9ybS5pc1VuaWZvcm1CdWZmZXIpIHtcblx0XHRcdGxheW91dEVudGl0eSA9IG5ldyBCaW5kR3JvdXBMYXlvdXRFbnRyeSh7XG5cdFx0XHRcdGJpbmRpbmc6IHVuaWZvcm0uYmluZGluZyxcblx0XHRcdFx0YnVmZmVyOiB1bmlmb3JtLmxheW91dFR5cGUsXG5cdFx0XHRcdHZpc2liaWxpdHk6IHVuaWZvcm0udmlzaWJpbGl0eVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmICh1bmlmb3JtLmlzVGV4dHVyZSkge1xuXHRcdFx0bGF5b3V0RW50aXR5ID0gbmV3IEJpbmRHcm91cExheW91dEVudHJ5KHtcblx0XHRcdFx0YmluZGluZzogdW5pZm9ybS5iaW5kaW5nLFxuXHRcdFx0XHR2aXNpYmlsaXR5OiB1bmlmb3JtLnZpc2liaWxpdHksXG5cdFx0XHRcdHRleHR1cmU6IHVuaWZvcm0udHlwZSA9PSBcInRleHR1cmVcIiA/IHVuaWZvcm0ubGF5b3V0VHlwZSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0c3RvcmFnZVRleHR1cmU6IHVuaWZvcm0udHlwZSA9PSBcInN0b3JhZ2VUZXh0dXJlXCIgPyB1bmlmb3JtLnN0b3JhZ2VUZXh0dXJlTGF5b3V0VHlwZSA6IHVuZGVmaW5lZFxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmICh1bmlmb3JtLmlzU2FtcGxlcikge1xuXHRcdFx0bGF5b3V0RW50aXR5ID0gbmV3IEJpbmRHcm91cExheW91dEVudHJ5KHtcblx0XHRcdFx0YmluZGluZzogdW5pZm9ybS5iaW5kaW5nLFxuXHRcdFx0XHR2aXNpYmlsaXR5OiB1bmlmb3JtLnZpc2liaWxpdHksXG5cdFx0XHRcdHNhbXBsZXI6IHVuaWZvcm0ubGF5b3V0VHlwZVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBsYXlvdXRFbnRpdHk7XG5cdH1cblx0cHJpdmF0ZSBjcmVheWVPbmVHcm91cEVudGl0eSh1bmlmb3JtKSB7XG5cdFx0bGV0IGdyb3VwRW50aXR5O1xuXHRcdGlmICh1bmlmb3JtLmlzVW5pZm9ybUJ1ZmZlcikge1xuXHRcdFx0Z3JvdXBFbnRpdHkgPSBuZXcgQmluZEdyb3VwRW50aXR5KHtcblx0XHRcdFx0YmluZGluZzogdW5pZm9ybS5iaW5kaW5nLFxuXHRcdFx0XHRyZXNvdXJjZToge1xuXHRcdFx0XHRcdGJ1ZmZlcjogdW5pZm9ybS5idWZmZXIuZ3B1QnVmZmVyLFxuXHRcdFx0XHRcdG9mZnNldDogdW5pZm9ybS5vZmZzZXQsXG5cdFx0XHRcdFx0c2l6ZTogdW5pZm9ybS5idWZmZXJTaXplXG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSBpZiAodW5pZm9ybS5pc1RleHR1cmUpIHtcblx0XHRcdGdyb3VwRW50aXR5ID0gbmV3IEJpbmRHcm91cEVudGl0eSh7XG5cdFx0XHRcdGJpbmRpbmc6IHVuaWZvcm0uYmluZGluZyxcblx0XHRcdFx0cmVzb3VyY2U6IHVuaWZvcm0/LnRleHR1cmVWaWV3ID8/IHVuaWZvcm0udGV4dHVyZS50ZXh0dXJlVmlld1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmICh1bmlmb3JtLmlzU2FtcGxlcikge1xuXHRcdFx0Z3JvdXBFbnRpdHkgPSBuZXcgQmluZEdyb3VwRW50aXR5KHtcblx0XHRcdFx0YmluZGluZzogdW5pZm9ybS5iaW5kaW5nLFxuXHRcdFx0XHRyZXNvdXJjZTogdW5pZm9ybS5zYW1wbGVyLmdwdVNhbXBsZXJcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gZ3JvdXBFbnRpdHk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEZyYW1lU3RhdGUgfSBmcm9tIFwiLi4vY29yZS9GcmFtZVN0YXRlXCI7XHJcbmltcG9ydCB7IEN1bGxNb2RlLCBQcmltaXRpdmVUb3BvbG9neSB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVUNvbnN0YW50XCI7XHJcbmltcG9ydCBDb2xvciBmcm9tIFwiLi4vbWF0aC9Db2xvclwiO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSBcIi4uL21lc2gvTWVzaFwiO1xyXG5pbXBvcnQgeyBEZXB0aFN0ZW5jaWwsIFJlbmRlclN0YXRlLCBUYXJnZXQsIFByaW1pdGl2ZSB9IGZyb20gXCIuLi9yZW5kZXIvUmVuZGVyU3RhdGVcIjtcclxuaW1wb3J0IFNhbXBsZXIgZnJvbSBcIi4uL3JlbmRlci9TYW1wbGVyXCI7XHJcbmltcG9ydCBTaGFkZXJEYXRhIGZyb20gXCIuLi9yZW5kZXIvU2hhZGVyRGF0YVwiO1xyXG5pbXBvcnQgVGV4dHVyZSBmcm9tIFwiLi4vcmVuZGVyL1RleHR1cmVcIjtcclxuaW1wb3J0IHsgU2hhZGVyU291cmNlIH0gZnJvbSBcIi4uL3NoYWRlci9TaGFkZXJTb3VyY2VcIjtcclxuZXhwb3J0IGNsYXNzIE1hdGVyaWFsIHtcclxuXHRwdWJsaWMgc2hhZGVyRGF0YTogU2hhZGVyRGF0YTtcclxuXHJcblx0Y29sb3I/OiBDb2xvcjtcclxuXHJcblx0YmFzZVNhbXBsZXI/OiBTYW1wbGVyO1xyXG5cclxuXHRiYXNlVGV4dHVyZT86IFRleHR1cmU7XHJcblxyXG5cdHR5cGU6IHN0cmluZztcclxuXHJcblx0bGFiZWw6IHN0cmluZztcclxuXHJcblx0c2hhZGVyU291cmNlOiBTaGFkZXJTb3VyY2U7XHJcblxyXG5cdHRyYW5zcGFyZW50OiBib29sZWFuO1xyXG5cclxuXHRkaXJ0eTogYm9vbGVhbjtcclxuXHJcblx0bGlnaHQ6IGJvb2xlYW47XHJcblxyXG5cdHJlYWR5OiBib29sZWFuO1xyXG5cclxuXHRwcml2YXRlIF9lbWlzc2l2ZTogQ29sb3I7XHJcblxyXG5cdHByaXZhdGUgX29wYWNpdHk6IG51bWJlcjtcclxuXHJcblx0cHJpdmF0ZSBfZW1pc3NpdmVJbnRlbnNpdHk6IG51bWJlcjtcclxuXHJcblx0cHJpdmF0ZSBfZGlmZnVzZTogQ29sb3I7XHJcblxyXG5cdHByaXZhdGUgX3JlbmRlclN0YXRlOiBSZW5kZXJTdGF0ZTtcclxuXHJcblx0cHJpdmF0ZSBfZG91YmxlU2lkZWQ6IGJvb2xlYW47XHJcblxyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0dGhpcy5sYWJlbCA9IHVuZGVmaW5lZDtcclxuXHRcdHRoaXMudHlwZSA9IHVuZGVmaW5lZDtcclxuXHRcdHRoaXMuYmFzZVRleHR1cmUgPSB1bmRlZmluZWQ7XHJcblx0XHR0aGlzLmJhc2VTYW1wbGVyID0gdW5kZWZpbmVkO1xyXG5cdFx0dGhpcy5fZGlmZnVzZSA9IG5ldyBDb2xvcigwLjAsIDAuMCwgMC4wKTtcclxuXHRcdHRoaXMuX29wYWNpdHkgPSAxLjA7XHJcblx0XHQvLyBCdWZmZXJcclxuXHRcdHRoaXMuc2hhZGVyRGF0YSA9IHVuZGVmaW5lZDtcclxuXHRcdHRoaXMuc2hhZGVyU291cmNlID0gdW5kZWZpbmVkO1xyXG5cdFx0dGhpcy5kaXJ0eSA9IHRydWU7XHJcblx0XHR0aGlzLl9lbWlzc2l2ZSA9IG5ldyBDb2xvcigwLjAsIDAuMCwgMCk7XHJcblx0XHR0aGlzLl9lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcclxuXHRcdHRoaXMuX2RvdWJsZVNpZGVkID0gdHJ1ZTtcclxuXHRcdHRoaXMubGlnaHQgPSBmYWxzZTtcclxuXHRcdHRoaXMucmVhZHkgPSBmYWxzZTtcclxuXHRcdHRoaXMuaW5pdCgpO1xyXG5cdH1cclxuXHRwdWJsaWMgc2V0IHdpcmVmcmFtZSh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5yZW5kZXJTdGF0ZS5wcmltaXRpdmUudG9wb2xvZ3kgPSB2YWx1ZSA/IFByaW1pdGl2ZVRvcG9sb2d5LkxpbmVMaXN0IDogUHJpbWl0aXZlVG9wb2xvZ3kuVHJpYW5nbGVMaXN0O1xyXG5cdH1cclxuXHRwdWJsaWMgc2V0IHRvcG9sb2d5KHZhbHVlOiBQcmltaXRpdmVUb3BvbG9neSkge1xyXG5cdFx0dGhpcy5yZW5kZXJTdGF0ZS5wcmltaXRpdmUudG9wb2xvZ3kgPSB2YWx1ZTtcclxuXHR9XHJcblx0cHVibGljIGdldCBkb3VibGVTaWRlZCgpIHtcclxuXHRcdHJldHVybiB0aGlzLl9kb3VibGVTaWRlZDtcclxuXHR9XHJcblx0cHVibGljIHNldCBkb3VibGVTaWRlZCh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5fcmVuZGVyU3RhdGUucHJpbWl0aXZlLmN1bGxNb2RlID0gdmFsdWUgPyBDdWxsTW9kZS5Ob25lIDogQ3VsbE1vZGUuQmFjaztcclxuXHRcdHRoaXMuX2RvdWJsZVNpZGVkID0gdmFsdWU7XHJcblx0fVxyXG5cdHB1YmxpYyBnZXQgcmVuZGVyU3RhdGUoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcmVuZGVyU3RhdGU7XHJcblx0fVxyXG5cdHB1YmxpYyBzZXQgcmVuZGVyU3RhdGUodmFsdWU6IFJlbmRlclN0YXRlKSB7XHJcblx0XHR0aGlzLl9yZW5kZXJTdGF0ZSA9IHZhbHVlO1xyXG5cdH1cclxuXHRwdWJsaWMgZ2V0IGRpZmZ1c2UoKTogQ29sb3Ige1xyXG5cdFx0cmV0dXJuIHRoaXMuX2RpZmZ1c2U7XHJcblx0fVxyXG5cdHB1YmxpYyBzZXQgZGlmZnVzZSh2OiBDb2xvcikge1xyXG5cdFx0dGhpcy5fZGlmZnVzZSA9IHY7XHJcblx0fVxyXG5cdHB1YmxpYyBnZXQgZW1pc3NpdmUoKTogQ29sb3Ige1xyXG5cdFx0cmV0dXJuIHRoaXMuX2VtaXNzaXZlO1xyXG5cdH1cclxuXHRwdWJsaWMgc2V0IGVtaXNzaXZlKHY6IENvbG9yKSB7XHJcblx0XHR0aGlzLl9lbWlzc2l2ZSA9IHY7XHJcblx0fVxyXG5cdHB1YmxpYyBnZXQgZW1pc3NpdmVJbnRlbnNpdHkoKTogbnVtYmVyIHtcclxuXHRcdHJldHVybiB0aGlzLl9lbWlzc2l2ZUludGVuc2l0eTtcclxuXHR9XHJcblx0cHVibGljIHNldCBlbWlzc2l2ZUludGVuc2l0eSh2OiBudW1iZXIpIHtcclxuXHRcdHRoaXMuX2VtaXNzaXZlSW50ZW5zaXR5ID0gdjtcclxuXHR9XHJcblx0cHVibGljIGdldCBvcGFjaXR5KCk6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gdGhpcy5fb3BhY2l0eTtcclxuXHR9XHJcblx0cHVibGljIHNldCBvcGFjaXR5KHY6IG51bWJlcikge1xyXG5cdFx0dGhpcy5fb3BhY2l0eSA9IHY7XHJcblx0fVxyXG5cdG9uQmVmb3JlUmVuZGVyKCkge1xyXG5cdFx0Ly8gY2FsbGJhY2tcclxuXHR9XHJcblxyXG5cdG9uQmVmb3JlQ29tcGlsZSgpIHtcclxuXHRcdC8vIGNhbGxiYWNrXHJcblx0fVxyXG5cdGNsb25lKCk6IE1hdGVyaWFsIHtcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHR1cGRhdGUoZnJhbWVTdGF0ZT86IEZyYW1lU3RhdGUsIG1lc2g/OiBNZXNoKSB7XHJcblx0XHQvLyB1cGRhdGUgbWF0ZXJpYWxcclxuXHR9XHJcblx0cHJvdGVjdGVkIGNyZWF0ZVNoYWRlckRhdGEoKSB7XHJcblx0XHRpZiAodGhpcy5zaGFkZXJEYXRhKSB0aGlzLnNoYWRlckRhdGEuZGVzdHJveSgpO1xyXG5cdFx0dGhpcy5zaGFkZXJEYXRhID0gbmV3IFNoYWRlckRhdGEodGhpcy50eXBlLCAwKTtcclxuXHRcdHRoaXMucmVhZHkgPSB0cnVlO1xyXG5cdH1cclxuXHRwcml2YXRlIGluaXQoKSB7XHJcblx0XHQvLyDpu5jorqTmuLLmn5PnirbmgIFcclxuXHRcdGNvbnN0IHByaW1pdGl2ZSA9IG5ldyBQcmltaXRpdmUoKTtcclxuXHRcdGNvbnN0IHRhcmdldCA9IG5ldyBUYXJnZXQoKTtcclxuXHRcdGNvbnN0IGRlcHRoU3RlbmNpbCA9IG5ldyBEZXB0aFN0ZW5jaWwoKTtcclxuXHRcdHRoaXMuX3JlbmRlclN0YXRlID0gbmV3IFJlbmRlclN0YXRlKCk7XHJcblx0XHR0aGlzLl9yZW5kZXJTdGF0ZS5wcmltaXRpdmUgPSBwcmltaXRpdmU7XHJcblx0XHR0aGlzLl9yZW5kZXJTdGF0ZS50YXJnZXRzID0gW3RhcmdldF07XHJcblx0XHR0aGlzLl9yZW5kZXJTdGF0ZS5kZXB0aFN0ZW5jaWwgPSBkZXB0aFN0ZW5jaWw7XHJcblx0fVxyXG5cdHB1YmxpYyBkZXN0cm95KCkge1xyXG5cdFx0dGhpcy5sYWJlbCA9IHVuZGVmaW5lZDtcclxuXHRcdHRoaXMudHlwZSA9IHVuZGVmaW5lZDtcclxuXHRcdHRoaXMuYmFzZVRleHR1cmUgPSB1bmRlZmluZWQ7XHJcblx0XHR0aGlzLmJhc2VTYW1wbGVyID0gdW5kZWZpbmVkO1xyXG5cdFx0dGhpcy5jb2xvciA9IHVuZGVmaW5lZDtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IHsgRnJhbWVTdGF0ZSB9IGZyb20gXCIuLi9jb3JlL0ZyYW1lU3RhdGVcIjtcbmltcG9ydCB7IEJ1ZmZlckJpbmRpbmdUeXBlLCBCdWZmZXJVc2FnZSB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVUNvbnN0YW50XCI7XG5pbXBvcnQgeyBTaGFkZXJNYXRlcmlhbFBhcm1zLCBVbmlmb3JtcyB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVVR5cGVzXCI7XG5pbXBvcnQgeyBNZXNoIH0gZnJvbSBcIi4uL21lc2gvTWVzaFwiO1xuaW1wb3J0IFVuaWZvcm1CdWZmZXIgZnJvbSBcIi4uL3JlbmRlci9Vbmlmb3JtQnVmZmVyXCI7XG5pbXBvcnQgeyBTaGFkZXJTb3VyY2UgfSBmcm9tIFwiLi4vc2hhZGVyL1NoYWRlclNvdXJjZVwiO1xuaW1wb3J0IGRlZmF1bHRWYWx1ZSBmcm9tIFwiLi4vdXRpbHMvZGVmYXVsdFZhbHVlXCI7XG5pbXBvcnQgeyBhZGRVbmlmb3JtVG9TaGFkZXJEYXRhIH0gZnJvbSBcIi4uL3V0aWxzL3VuaWZvcm1VdGlsc1wiO1xuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tIFwiLi9NYXRlcmlhbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGFkZXJNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcblx0dW5pZm9ybXM6IFVuaWZvcm1zO1xuXHRwdWJsaWMgc2hhZGVyTWF0ZXJpYWxQYXJtczogU2hhZGVyTWF0ZXJpYWxQYXJtcztcblx0Y29uc3RydWN0b3Iob3B0aW9uczogU2hhZGVyTWF0ZXJpYWxQYXJtcykge1xuXHRcdHN1cGVyKCk7XG5cdFx0Y29uc3QgeyB0eXBlLCBmcmFnLCB2ZXJ0LCBkZWZpbmVzLCBsaWdodCwgc2hhZGVySWQgfSA9IG9wdGlvbnM7XG5cdFx0dGhpcy50eXBlID0gc2hhZGVySWQgPz8gdHlwZTtcblx0XHR0aGlzLnNoYWRlck1hdGVyaWFsUGFybXMgPSBvcHRpb25zO1xuXHRcdHRoaXMuc2hhZGVyU291cmNlID0gbmV3IFNoYWRlclNvdXJjZSh7XG5cdFx0XHRzaGFkZXJJZDogc2hhZGVySWQgPz8gdHlwZSxcblx0XHRcdHJlbmRlcjoge1xuXHRcdFx0XHRmcmFnU2hhZGVyOiBmcmFnLFxuXHRcdFx0XHR2ZXJ0U2hhZGVyOiB2ZXJ0XG5cdFx0XHR9LFxuXHRcdFx0ZGVmaW5lczogZGVmYXVsdFZhbHVlKGRlZmluZXMsIHt9KVxuXHRcdH0pO1xuXHRcdHRoaXMudW5pZm9ybXMgPSBvcHRpb25zLnVuaWZvcm1zO1xuXHRcdHRoaXMubGlnaHQgPSBsaWdodCB8fCBmYWxzZTtcblx0fVxuXHR1cGRhdGUoZnJhbWVTdGF0ZT86IEZyYW1lU3RhdGUsIG1lc2g/OiBNZXNoKSB7XG5cdFx0aWYgKCF0aGlzLnNoYWRlckRhdGEgfHwgdGhpcy5kaXJ0eSkgdGhpcy5jcmVhdGVTaGFkZXJEYXRhKG1lc2gpO1xuXHR9XG5cdGNsb25lKCkge1xuXHRcdHJldHVybiBuZXcgU2hhZGVyTWF0ZXJpYWwodGhpcy5zaGFkZXJNYXRlcmlhbFBhcm1zKTtcblx0fVxuXHRwcm90ZWN0ZWQgY3JlYXRlU2hhZGVyRGF0YShtZXNoPzogTWVzaCkge1xuXHRcdGNvbnN0IHsgdW5pZm9ybUJ1ZmZlcnMsIHVuaWZvcm1UZXh0dXJlQW5kU2FtcGxlciB9ID0gdGhpcy5zaGFkZXJNYXRlcmlhbFBhcm1zO1xuXHRcdHN1cGVyLmNyZWF0ZVNoYWRlckRhdGEoKTtcblx0XHRjb25zdCBzaGFkZXJEYXRhID0gdGhpcy5zaGFkZXJEYXRhO1xuXHRcdC8vIGZpbGwgdW5pZm9ybUJ1ZmZlclxuXHRcdHVuaWZvcm1CdWZmZXJzPy5mb3JFYWNoPy4oKHVuaWZvcm1CdWZmZXIpID0+IHRoaXMuY3JlYXRlVW5pZm9ybUJ1ZmZlcih1bmlmb3JtQnVmZmVyLCBtZXNoKSk7XG5cdFx0Ly8gZmlsbCB0ZXh0dXJlIGFuZCBzYW1wbGVyXG5cdFx0aWYgKHVuaWZvcm1UZXh0dXJlQW5kU2FtcGxlcikgdGhpcy5hZGRVbmlmb3JtVG9TaGFkZXJEYXRhKHVuaWZvcm1UZXh0dXJlQW5kU2FtcGxlcik7XG5cdFx0cmV0dXJuIHNoYWRlckRhdGE7XG5cdH1cblx0cHJpdmF0ZSBjcmVhdGVVbmlmb3JtQnVmZmVyKHVuaWZvcm1CdWZmZXJQYXJhbXMsIG1lc2g6IE1lc2gpIHtcblx0XHRjb25zdCB7XG5cdFx0XHR0eXBlID0gXCJ1bmlmb3JtXCIsXG5cdFx0XHR1c2FnZSA9IEJ1ZmZlclVzYWdlLlVuaWZvcm0gfCBCdWZmZXJVc2FnZS5Db3B5RHN0LFxuXHRcdFx0dW5pZm9ybXMsXG5cdFx0XHR1aWQsXG5cdFx0XHRiaW5kaW5nLFxuXHRcdFx0YnVmZmVyLFxuXHRcdFx0YnVmZmVyU2l6ZSxcblx0XHRcdHZpc2liaWxpdHlcblx0XHR9ID0gdW5pZm9ybUJ1ZmZlclBhcmFtcztcblx0XHRjb25zdCB1bmlmb3JtQnVmZmVyID0gbmV3IFVuaWZvcm1CdWZmZXIoe1xuXHRcdFx0bGFiZWw6IHVpZCxcblx0XHRcdHR5cGU6IDxCdWZmZXJCaW5kaW5nVHlwZT50eXBlLFxuXHRcdFx0dXNhZ2U6IDxCdWZmZXJVc2FnZT51c2FnZSxcblx0XHRcdGJpbmRpbmcsXG5cdFx0XHRidWZmZXIsXG5cdFx0XHR2aXNpYmlsaXR5LFxuXHRcdFx0c2l6ZTogYnVmZmVyPy5zaXplID8/IGJ1ZmZlclNpemVcblx0XHR9KTtcblx0XHR0aGlzLnNoYWRlckRhdGEuc2V0VW5pZm9ybUJ1ZmZlcih1aWQsIHVuaWZvcm1CdWZmZXIpO1xuXHRcdGlmICghYnVmZmVyKSB0aGlzLmFkZFVuaWZvcm1Ub1NoYWRlckRhdGEodW5pZm9ybXMsIHVuaWZvcm1CdWZmZXIsIG1lc2gpO1xuXHR9XG5cdHByaXZhdGUgYWRkVW5pZm9ybVRvU2hhZGVyRGF0YSh1bmlmb3JtcywgdW5pZm9ybUJ1ZmZlcj86IFVuaWZvcm1CdWZmZXIsIG1lc2g/OiBNZXNoKSB7XG5cdFx0aWYgKCF1bmlmb3JtcykgcmV0dXJuO1xuXHRcdGNvbnN0IHVuaWZvcm1zTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh1bmlmb3Jtcyk7XG5cdFx0dW5pZm9ybXNOYW1lcy5tYXAoKHVuaWZvcm1zTmFtZSkgPT4ge1xuXHRcdFx0YWRkVW5pZm9ybVRvU2hhZGVyRGF0YSh1bmlmb3Jtc05hbWUsIHVuaWZvcm1zW3VuaWZvcm1zTmFtZV0sIHRoaXMuc2hhZGVyRGF0YSwgbWVzaCwgdW5pZm9ybUJ1ZmZlcik7XG5cdFx0fSk7XG5cdH1cbn1cbiIsImZ1bmN0aW9uIGNyZWF0ZUd1aWQoKSB7XHJcbiAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDUwMzQvaG93LXRvLWNyZWF0ZS1hLWd1aWQtdXVpZC1pbi1qYXZhc2NyaXB0XHJcbiAgcmV0dXJuIFwieHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4XCIucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xyXG4gICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDtcclxuICAgIGNvbnN0IHYgPSBjID09PSBcInhcIiA/IHIgOiAociAmIDB4MykgfCAweDg7XHJcbiAgICByZXR1cm4gdi50b1N0cmluZygxNik7XHJcbiAgfSk7XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlR3VpZDtcclxuIiwiaW1wb3J0IENhbWVyYSBmcm9tIFwiLi4vY2FtZXJhL0NhbWVyYVwiO1xyXG5pbXBvcnQgeyBGcmFtZVN0YXRlIH0gZnJvbSBcIi4uL2NvcmUvRnJhbWVTdGF0ZVwiO1xyXG5pbXBvcnQgTGlnaHRNYW5nZXIgZnJvbSBcIi4uL2NvcmUvTGlnaHRNYW5nZXJcIjtcclxuaW1wb3J0IFJlbmRlck9iamVjdCBmcm9tIFwiLi4vY29yZS9SZW5kZXJPYmplY3RcIjtcclxuaW1wb3J0IHsgQ29tbWFuZFN1YlR5cGUsIEludGVyc2VjdCB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVUNvbnN0YW50XCI7XHJcbmltcG9ydCB7IFJlbmRlck9iamVjdFR5cGUgfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVUeXBlc1wiO1xyXG5pbXBvcnQgR2VvbWV0cnkgZnJvbSBcIi4uL2dlb21ldHJ5L0dlb21ldHJ5XCI7XHJcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSBcIi4uL21hdGVyaWFsL01hdGVyaWFsXCI7XHJcbmltcG9ydCBEcmF3Q29tbWFuZCBmcm9tIFwiLi4vcmVuZGVyL0RyYXdDb21tYW5kXCI7XHJcbmltcG9ydCBjcmVhdGVHdWlkIGZyb20gXCIuLi91dGlscy9jcmVhdGVHdWlkXCI7XHJcbmV4cG9ydCBjbGFzcyBNZXNoIGV4dGVuZHMgUmVuZGVyT2JqZWN0IHtcclxuXHRbeDogc3RyaW5nXTogYW55O1xyXG5cdHVpZDogc3RyaW5nO1xyXG5cdGZydXN0dW1DdWxsOiBib29sZWFuO1xyXG5cdHN1YkNvbW1hbmRzOiB7IFtwcm9wOiBzdHJpbmddOiBEcmF3Q29tbWFuZCB9O1xyXG5cdGdlb21ldHJ5PzogR2VvbWV0cnk7XHJcblx0bWF0ZXJpYWw/OiBNYXRlcmlhbDtcclxuXHRpbnN0YW5jZUNvdW50PzogbnVtYmVyO1xyXG5cdHByaW9yaXR5PzogbnVtYmVyO1xyXG5cdGRyYXdDb21tYW5kPzogRHJhd0NvbW1hbmQ7XHJcblx0ZGlzdGFuY2VUb0NhbWVyYT86IG51bWJlcjtcclxuXHRjb25zdHJ1Y3RvcihnZW9tZXRyeT86IEdlb21ldHJ5LCBtYXRlcmlhbD86IE1hdGVyaWFsKSB7XHJcblx0XHRzdXBlcigpO1xyXG5cdFx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5O1xyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xyXG5cdFx0dGhpcy50eXBlID0gUmVuZGVyT2JqZWN0VHlwZS5NZXNoO1xyXG5cdFx0dGhpcy5mcnVzdHVtQ3VsbCA9IHRydWU7XHJcblx0XHR0aGlzLnVpZCA9IGNyZWF0ZUd1aWQoKTtcclxuXHRcdHRoaXMuc3ViQ29tbWFuZHMgPSB7fTtcclxuXHR9XHJcblx0Z2V0IHJlYWR5KCkge1xyXG5cdFx0cmV0dXJuIHRoaXMubWF0ZXJpYWwucmVhZHk7XHJcblx0fVxyXG5cdHVwZGF0ZShmcmFtZVN0YXRlOiBGcmFtZVN0YXRlLCBjYW1lcmE/OiBDYW1lcmEpIHtcclxuXHRcdC8vIHVwZGF0ZSBtYXRyaXhcclxuXHRcdHRoaXMudXBkYXRlTWF0cml4KHRoaXM/LnBhcmVudD8ubW9kZWxNYXRyaXgpO1xyXG5cdFx0Ly8gY3JlYXRlXHJcblx0XHR0aGlzLmdlb21ldHJ5LnVwZGF0ZShmcmFtZVN0YXRlKTtcclxuXHRcdHRoaXMubWF0ZXJpYWwudXBkYXRlKGZyYW1lU3RhdGUsIHRoaXMpO1xyXG5cdFx0Ly8gdXBkYXRlIGJvdW5kaW5nU3BoZXJlXHJcblx0XHR0aGlzLmdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLnVwZGF0ZSh0aGlzLm1vZGVsTWF0cml4KTtcclxuXHRcdHRoaXMubWF0ZXJpYWwuc2hhZGVyU291cmNlLnNldERlZmluZXMoZnJhbWVTdGF0ZS5kZWZpbmVzKTtcclxuXHRcdGlmICh0aGlzLnR5cGUgPT0gUmVuZGVyT2JqZWN0VHlwZS5EZWJ1Zykge1xyXG5cdFx0XHRmcmFtZVN0YXRlLnJlbmRlclF1ZXVlLmRlYnVnUXVldWUucHVzaCh0aGlzKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5kaXN0YW5jZVRvQ2FtZXJhID0gdGhpcy5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5kaXN0YW5jZVRvQ2FtZXJhKGNhbWVyYSk7XHJcblxyXG5cdFx0Y29uc3QgdmlzaWJpbGl0eSA9IGZyYW1lU3RhdGUuY3VsbGluZ1ZvbHVtZS5jb21wdXRlVmlzaWJpbGl0eSh0aGlzLmdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlKTtcclxuXHRcdC8vIOinhumUpeWJlOmZpFxyXG5cdFx0aWYgKHZpc2liaWxpdHkgPT09IEludGVyc2VjdC5PVVRTSURFIHx8ICF0aGlzLmZydXN0dW1DdWxsKSByZXR1cm47XHJcblx0XHRpZiAodGhpcy5tYXRlcmlhbC50cmFuc3BhcmVudCkge1xyXG5cdFx0XHRmcmFtZVN0YXRlLnJlbmRlclF1ZXVlLnRyYW5zcGFyZW50LnB1c2godGhpcyk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRmcmFtZVN0YXRlLnJlbmRlclF1ZXVlLm9wYXF1ZS5wdXNoKHRoaXMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRiZWZvcmVSZW5kZXIoKSB7XHJcblx0XHQvLyBiZWZvcmUgcmVuZGVyXHJcblx0fVxyXG5cdGFmdGVyUmVuZGVyKCkge1xyXG5cdFx0Ly8gYWZ0ZXIgcmVuZGVyXHJcblx0fVxyXG5cdHB1YmxpYyBnZXREcmF3Q29tbWFuZChvdmVycmlkZU1hdGVyaWFsPzogTWF0ZXJpYWwsIGNvbW1hbmRTdWJUeXBlPzogQ29tbWFuZFN1YlR5cGUsIGxpZ2h0TWFuZ2VyPzogTGlnaHRNYW5nZXIpIHtcclxuXHRcdGlmICghdGhpcy5kcmF3Q29tbWFuZCB8fCB0aGlzLm1hdGVyaWFsLmRpcnR5KSB7XHJcblx0XHRcdHRoaXMubWF0ZXJpYWwuc2hhZGVyU291cmNlLnNldERlZmluZXMoXHJcblx0XHRcdFx0T2JqZWN0LmFzc2lnbih7fSwgdGhpcy5tYXRlcmlhbC5zaGFkZXJEYXRhLmRlZmluZXMsIHRoaXMuZ2VvbWV0cnkuZGVmaW5lcylcclxuXHRcdFx0KTtcclxuXHRcdFx0aWYgKHRoaXMubWF0ZXJpYWwuZGlydHkpIHRoaXMubWF0ZXJpYWwuZGlydHkgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5kcmF3Q29tbWFuZCA9IG5ldyBEcmF3Q29tbWFuZCh7XHJcblx0XHRcdFx0dmVydGV4QnVmZmVyczogdGhpcy5nZW9tZXRyeS52ZXJ0ZXhCdWZmZXJzLFxyXG5cdFx0XHRcdGluZGV4QnVmZmVyOiB0aGlzLmdlb21ldHJ5LmluZGV4QnVmZmVyLFxyXG5cdFx0XHRcdHNoYWRlckRhdGE6IHRoaXMubWF0ZXJpYWwuc2hhZGVyRGF0YSxcclxuXHRcdFx0XHRpbnN0YW5jZXM6IHRoaXMuaW5zdGFuY2VDb3VudCxcclxuXHRcdFx0XHRjb3VudDogdGhpcy5nZW9tZXRyeS5jb3VudCxcclxuXHRcdFx0XHRyZW5kZXJTdGF0ZTogdGhpcy5tYXRlcmlhbC5yZW5kZXJTdGF0ZSxcclxuXHRcdFx0XHRzaGFkZXJTb3VyY2U6IHRoaXMubWF0ZXJpYWwuc2hhZGVyU291cmNlLFxyXG5cdFx0XHRcdGxpZ2h0U2hhZGVyRGF0YTogdGhpcy5tYXRlcmlhbC5saWdodCA/IGxpZ2h0TWFuZ2VyPy5saWdodFNoYWRlckRhdGEgOiB1bmRlZmluZWQsXHJcblx0XHRcdFx0dXNlTGlnaHQ6IHRoaXMubWF0ZXJpYWwubGlnaHRcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHRpZiAob3ZlcnJpZGVNYXRlcmlhbCkge1xyXG5cdFx0XHRpZiAoIXRoaXMuc3ViQ29tbWFuZHNbY29tbWFuZFN1YlR5cGVdKSB7XHJcblx0XHRcdFx0Y29uc3QgY29weU1hdCA9IG92ZXJyaWRlTWF0ZXJpYWwuY2xvbmUoKTtcclxuXHRcdFx0XHRjb3B5TWF0LnVwZGF0ZSh1bmRlZmluZWQsIHRoaXMpO1xyXG5cdFx0XHRcdGlmIChjb3B5TWF0LmRpcnR5KSBjb3B5TWF0LmRpcnR5ID0gZmFsc2U7XHJcblx0XHRcdFx0dGhpcy5zdWJDb21tYW5kc1tjb21tYW5kU3ViVHlwZV0gPSB0aGlzLmRyYXdDb21tYW5kLnNoYWxsb3dDbG9uZShjb3B5TWF0KTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdGhpcy5zdWJDb21tYW5kc1tjb21tYW5kU3ViVHlwZV07XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdGhpcy5kcmF3Q29tbWFuZDtcclxuXHR9XHJcblx0ZGVzdHJveSgpIHtcclxuXHRcdHRoaXMuZ2VvbWV0cnkuZGVzdHJveSgpO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC5kZXN0cm95KCk7XHJcblx0fVxyXG59XHJcbiIsImltcG9ydCB7IFJlbmRlck9iamVjdFR5cGUgfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVUeXBlc1wiO1xuaW1wb3J0IEdlb21ldHJ5IGZyb20gXCIuLi9nZW9tZXRyeS9HZW9tZXRyeVwiO1xuaW1wb3J0IFBsYW5lR2VvbWV0cnkgZnJvbSBcIi4uL2dlb21ldHJ5L1BsYW5lR2VvbWV0cnlcIjtcbmltcG9ydCB7IExpZ2h0IH0gZnJvbSBcIi4uL2xpZ2h0L0xpZ2h0XCI7XG5pbXBvcnQgU2hhZGVyTWF0ZXJpYWwgZnJvbSBcIi4uL21hdGVyaWFsL1NoYWRlck1hdGVyaWFsXCI7XG5pbXBvcnQgeyBNZXNoIH0gZnJvbSBcIi4uL21lc2gvTWVzaFwiO1xuaW1wb3J0IHsgVmlld1BvcnQgfSBmcm9tIFwiLi4vcmVuZGVyL1JlbmRlclN0YXRlXCI7XG5pbXBvcnQgU2FtcGxlciBmcm9tIFwiLi4vcmVuZGVyL1NhbXBsZXJcIjtcbmltcG9ydCB7IFNjZW5lIH0gZnJvbSBcIi4uL1NjZW5lXCI7XG5pbXBvcnQgZ2V0VmVydEZyYWcgZnJvbSBcIi4uL3NoYWRlci9TaGFkZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTaGFkb3dNYXBEZWJ1Z2dlciB7XG5cdHByaXZhdGUgbWVzaDogTWVzaDtcblx0cHJpdmF0ZSBkZWJ1Z2dlclNpemU6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfTtcblx0cHVibGljIGxpZ2h0OiBMaWdodDtcblx0cHJpdmF0ZSBnZW9tZXRyeTogR2VvbWV0cnk7XG5cdHByaXZhdGUgbWF0ZXJpYWw6IFNoYWRlck1hdGVyaWFsO1xuXHRwcml2YXRlIHNjZW5lOiBTY2VuZTtcblxuXHRjb25zdHJ1Y3RvcihsaWdodDogTGlnaHQsIHNjZW5lOiBTY2VuZSkge1xuXHRcdGlmICghbGlnaHQgfHwgIShsaWdodCBpbnN0YW5jZW9mIExpZ2h0KSkgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciBtdXN0IGJlIExpZ2h0IGluc3RhbmNlXCIpO1xuXG5cdFx0dGhpcy5saWdodCA9IGxpZ2h0O1xuXHRcdHRoaXMuc2NlbmUgPSBzY2VuZTtcblx0XHR0aGlzLmRlYnVnZ2VyU2l6ZSA9IHtcblx0XHRcdHdpZHRoOiAyNTYsXG5cdFx0XHRoZWlnaHQ6IDI1NlxuXHRcdH07XG5cblx0XHR0aGlzLm1lc2ggPSB0aGlzLl9jcmVhdGVTaGFkb3dNYXBNZXNoKCk7XG5cdFx0Y29uc3Qgc2hhZG93TWFwID0gdGhpcy5saWdodC5zaGFkb3cuZ2V0U2hhZG93TWFwVGV4dHVyZSgpO1xuXHRcdHRoaXMubWF0ZXJpYWwuc2hhZGVyTWF0ZXJpYWxQYXJtcy51bmlmb3JtVGV4dHVyZUFuZFNhbXBsZXIudGV4dHVyZS52YWx1ZSA9IHNoYWRvd01hcDtcblx0XHR0aGlzLm1lc2gudHlwZSA9IFJlbmRlck9iamVjdFR5cGUuRGVidWc7XG5cdFx0dGhpcy5zY2VuZS5hZGQodGhpcy5tZXNoKTtcblx0fVxuXG5cdF9jcmVhdGVTaGFkb3dNYXBNZXNoKCkge1xuXHRcdGNvbnN0IHNoYWRlciA9IGdldFZlcnRGcmFnKFwic2hhZG93TWFwRGVidWdnZXJcIiwge1xuXHRcdFx0cG9zaXRpb25Mb2NhdGlvbjogMFxuXHRcdH0pO1xuXHRcdHRoaXMuZ2VvbWV0cnkgPSBuZXcgUGxhbmVHZW9tZXRyeSgyLCAyKTtcblx0XHR0aGlzLm1hdGVyaWFsID0gbmV3IFNoYWRlck1hdGVyaWFsKHtcblx0XHRcdHNoYWRlcklkOiBcInNoYWRvd01hcERlYnVnZ2VyXCIsXG5cdFx0XHRmcmFnOiBzaGFkZXIuZnJhZyxcblx0XHRcdHZlcnQ6IHNoYWRlci52ZXJ0LFxuXHRcdFx0dW5pZm9ybVRleHR1cmVBbmRTYW1wbGVyOiB7XG5cdFx0XHRcdHRleHR1cmU6IHtcblx0XHRcdFx0XHR0eXBlOiBcInRleHR1cmVcIixcblx0XHRcdFx0XHR2YWx1ZTogdW5kZWZpbmVkXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNhbXBsZXI6IHtcblx0XHRcdFx0XHR0eXBlOiBcInNhbXBsZXJcIixcblx0XHRcdFx0XHR2YWx1ZTogbmV3IFNhbXBsZXIoe1xuXHRcdFx0XHRcdFx0bWFnRmlsdGVyOiBcImxpbmVhclwiLFxuXHRcdFx0XHRcdFx0bWluRmlsdGVyOiBcImxpbmVhclwiXG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHRoaXMubWF0ZXJpYWwucmVuZGVyU3RhdGUudmlld3BvcnQgPSBuZXcgVmlld1BvcnQoMCwgMCwgdGhpcy5kZWJ1Z2dlclNpemUud2lkdGgsIHRoaXMuZGVidWdnZXJTaXplLmhlaWdodCk7XG5cdFx0cmV0dXJuIG5ldyBNZXNoKHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwpO1xuXHR9XG5cblx0c2V0U2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuXHRcdGlmICghd2lkdGggfHwgIWhlaWdodCkgcmV0dXJuO1xuXHRcdHRoaXMuZGVidWdnZXJTaXplLndpZHRoID0gd2lkdGg7XG5cdFx0dGhpcy5kZWJ1Z2dlclNpemUuaGVpZ2h0ID0gaGVpZ2h0O1xuXHRcdHRoaXMudXBkYXRlKCk7XG5cdH1cblxuXHR1cGRhdGUoKSB7XG5cdFx0dGhpcy5tYXRlcmlhbC5yZW5kZXJTdGF0ZS52aWV3cG9ydCA9IG5ldyBWaWV3UG9ydCgwLCAwLCB0aGlzLmRlYnVnZ2VyU2l6ZS53aWR0aCwgdGhpcy5kZWJ1Z2dlclNpemUuaGVpZ2h0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgRnJhbWVTdGF0ZSB9IGZyb20gXCIuLi9jb3JlL0ZyYW1lU3RhdGVcIjtcclxuaW1wb3J0IHsgVW5pZm9ybUVudW0gfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVUeXBlc1wiO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSBcIi4uL21lc2gvTWVzaFwiO1xyXG5pbXBvcnQgVW5pZm9ybUJ1ZmZlciBmcm9tIFwiLi4vcmVuZGVyL1VuaWZvcm1CdWZmZXJcIjtcclxuaW1wb3J0IHsgU2hhZGVyU291cmNlIH0gZnJvbSBcIi4uL3NoYWRlci9TaGFkZXJTb3VyY2VcIjtcclxuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tIFwiLi9NYXRlcmlhbFwiO1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2xvck1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0c3VwZXIoKTtcclxuXHRcdHRoaXMudHlwZSA9IFwiY29sb3JcIjtcclxuXHRcdHRoaXMuc2hhZGVyU291cmNlID0gbmV3IFNoYWRlclNvdXJjZSh7XHJcblx0XHRcdHNoYWRlcklkOiB0aGlzLnR5cGUsXHJcblx0XHRcdGRlZmluZXM6IHt9XHJcblx0XHR9KTtcclxuXHR9XHJcblx0dXBkYXRlKGZyYW1lU3RhdGU/OiBGcmFtZVN0YXRlLCBtZXNoPzogTWVzaCkge1xyXG5cdFx0aWYgKCF0aGlzLnNoYWRlckRhdGEgfHwgdGhpcy5kaXJ0eSkgdGhpcy5jcmVhdGVTaGFkZXJEYXRhKCk7XHJcblx0XHRjb25zdCB1bmlmb3JtQnVmZmVyID0gbmV3IFVuaWZvcm1CdWZmZXIoeyBsYWJlbDogXCJjb2xvclwiIH0pO1xyXG5cdFx0dW5pZm9ybUJ1ZmZlci5zZXRVbmlmb3JtKFxyXG5cdFx0XHRcIm1vZGVsTWF0cml4XCIsXHJcblx0XHRcdCgpID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gbWVzaC5tb2RlbE1hdHJpeDtcclxuXHRcdFx0fSxcclxuXHRcdFx0VW5pZm9ybUVudW0uTWF0NFxyXG5cdFx0KTtcclxuXHRcdHRoaXMuc2hhZGVyRGF0YS5zZXRVbmlmb3JtQnVmZmVyKFwiY29sb3JcIiwgdW5pZm9ybUJ1ZmZlcik7XHJcblx0fVxyXG59XHJcbiIsImltcG9ydCB7IEZyYW1lU3RhdGUgfSBmcm9tIFwiLi4vY29yZS9GcmFtZVN0YXRlXCI7XHJcbmltcG9ydCB7IFJlbmRlck9iamVjdFR5cGUgfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVUeXBlc1wiO1xyXG5pbXBvcnQgR2VvbWV0cnkgZnJvbSBcIi4uL2dlb21ldHJ5L0dlb21ldHJ5XCI7XHJcbmltcG9ydCBDb2xvck1hdGVyaWFsIGZyb20gXCIuLi9tYXRlcmlhbC9Db2xvck1hdGVyaWFsXCI7XHJcbmltcG9ydCB7IEZsb2F0MzJBdHRyaWJ1dGUgfSBmcm9tIFwiLi4vcmVuZGVyL0F0dHJpYnV0ZVwiO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSBcIi4vTWVzaFwiO1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBeGVzIGV4dGVuZHMgTWVzaCB7XHJcblx0bWF0ZXJpYWw6IENvbG9yTWF0ZXJpYWw7XHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblx0XHRzdXBlcigpO1xyXG5cdFx0dGhpcy50eXBlID0gUmVuZGVyT2JqZWN0VHlwZS5BeGVzO1xyXG5cdFx0dGhpcy5kaXN0YW5jZVRvQ2FtZXJhID0gMTA7XHJcblx0XHR0aGlzLm1hdGVyaWFsID0gbmV3IENvbG9yTWF0ZXJpYWwoKTtcclxuXHRcdHRoaXMubWF0ZXJpYWwud2lyZWZyYW1lID0gdHJ1ZTtcclxuXHRcdHRoaXMuaW5pdCgpO1xyXG5cdH1cclxuXHR1cGRhdGUoZnJhbWVTdGF0ZTogRnJhbWVTdGF0ZSkge1xyXG5cdFx0dGhpcy51cGRhdGVNYXRyaXgoKTtcclxuXHRcdHRoaXMubWF0ZXJpYWwudXBkYXRlKGZyYW1lU3RhdGUsIHRoaXMpO1xyXG5cdFx0ZnJhbWVTdGF0ZS5yZW5kZXJRdWV1ZS5vcGFxdWUucHVzaCh0aGlzKTtcclxuXHR9XHJcblx0cHJpdmF0ZSBpbml0KCkge1xyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBbMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMV07XHJcblx0XHRjb25zdCBjb2xvcnMgPSBbMSwgMCwgMCwgMSwgMSwgMC41LCAwLjUsIDEsIDAsIDEsIDAsIDEsIDAuNSwgMSwgMC41LCAxLCAwLCAwLCAxLCAxLCAwLjUsIDAuNSwgMSwgMV07XHJcblx0XHRjb25zdCBpbmRpY2VzID0gWzAsIDEsIDIsIDMsIDQsIDVdO1xyXG5cdFx0dGhpcy5nZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSh7fSk7XHJcblx0XHR0aGlzLmdlb21ldHJ5LnNldEF0dHJpYnV0ZShuZXcgRmxvYXQzMkF0dHJpYnV0ZShcInBvc2l0aW9uXCIsIHBvc2l0aW9uLCAzKSk7XHJcblx0XHR0aGlzLmdlb21ldHJ5LnNldEF0dHJpYnV0ZShuZXcgRmxvYXQzMkF0dHJpYnV0ZShcImNvbG9yXCIsIGNvbG9ycywgNCkpO1xyXG5cdFx0dGhpcy5nZW9tZXRyeS5zZXRJbmRpY2UoaW5kaWNlcyk7XHJcblx0XHR0aGlzLmdlb21ldHJ5LmNvdW50ID0gaW5kaWNlcy5sZW5ndGg7XHJcblx0fVxyXG59XHJcbiIsImltcG9ydCB7IEZsb2F0MzJBdHRyaWJ1dGUgfSBmcm9tIFwiLi4vcmVuZGVyL0F0dHJpYnV0ZVwiO1xyXG5pbXBvcnQgR2VvbWV0cnkgZnJvbSBcIi4vR2VvbWV0cnlcIjtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2t5Qm94R2VvbWV0cnkgZXh0ZW5kcyBHZW9tZXRyeSB7XHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblx0XHRzdXBlcih7XHJcblx0XHRcdHR5cGU6IFwic2t5Qm94R2VvbWV0cnlcIlxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmluaXQoKTtcclxuXHR9XHJcblx0cHVibGljIGluaXQoKSB7XHJcblx0XHRjb25zdCBwb3NpdGlvbnMgPSBbXHJcblx0XHRcdDEuMCxcclxuXHRcdFx0MS4wLFxyXG5cdFx0XHQxLjAsIC8vIDBcclxuXHRcdFx0LTEuMCxcclxuXHRcdFx0MS4wLFxyXG5cdFx0XHQxLjAsIC8vIDFcclxuXHRcdFx0MS4wLFxyXG5cdFx0XHQtMS4wLFxyXG5cdFx0XHQxLjAsIC8vIDJcclxuXHRcdFx0LTEuMCxcclxuXHRcdFx0LTEuMCxcclxuXHRcdFx0MS4wLCAvLyAzXHJcblx0XHRcdDEuMCxcclxuXHRcdFx0MS4wLFxyXG5cdFx0XHQtMS4wLCAvLyA0XHJcblx0XHRcdC0xLjAsXHJcblx0XHRcdDEuMCxcclxuXHRcdFx0LTEuMCwgLy8gNVxyXG5cdFx0XHQxLjAsXHJcblx0XHRcdC0xLjAsXHJcblx0XHRcdC0xLjAsIC8vIDZcclxuXHRcdFx0LTEuMCxcclxuXHRcdFx0LTEuMCxcclxuXHRcdFx0LTEuMCAvLyA3XHJcblx0XHRdO1xyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtcclxuXHRcdFx0Ly8gUG9zWCAoUmlnaHQpXHJcblx0XHRcdDAsIDIsIDQsIDYsIDQsIDIsXHJcblxyXG5cdFx0XHQvLyBOZWdYIChMZWZ0KVxyXG5cdFx0XHQ1LCAzLCAxLCAzLCA1LCA3LFxyXG5cclxuXHRcdFx0Ly8gUG9zWSAoVG9wKVxyXG5cdFx0XHQ0LCAxLCAwLCAxLCA0LCA1LFxyXG5cclxuXHRcdFx0Ly8gTmVnWSAoQm90dG9tKVxyXG5cdFx0XHQyLCAzLCA2LCA3LCA2LCAzLFxyXG5cclxuXHRcdFx0Ly8gUG9zWiAoRnJvbnQpXHJcblx0XHRcdDAsIDEsIDIsIDMsIDIsIDEsXHJcblxyXG5cdFx0XHQvLyBOZWdaIChCYWNrKVxyXG5cdFx0XHQ2LCA1LCA0LCA1LCA2LCA3XHJcblx0XHRdO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUobmV3IEZsb2F0MzJBdHRyaWJ1dGUoXCJwb3NpdGlvblwiLCBwb3NpdGlvbnMsIDMpKTtcclxuXHRcdHRoaXMuc2V0SW5kaWNlKGluZGljZXMpO1xyXG5cdFx0dGhpcy5jb3VudCA9IGluZGljZXMubGVuZ3RoO1xyXG5cdH1cclxufVxyXG4iLCJmdW5jdGlvbiByZXR1cm5UcnVlKCkge1xyXG5cdHJldHVybiB0cnVlO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95T2JqZWN0KG9iamVjdCkge1xyXG5cdC8vIG1lc3NhZ2UgPW1lc3NhZ2V8fFwiVGhpcyBvYmplY3Qgd2FzIGRlc3Ryb3llZCwgaS5lLiwgZGVzdHJveSgpIHdhcyBjYWxsZWQuXCI7XHJcblxyXG5cdGZ1bmN0aW9uIHRocm93T25EZXN0cm95ZWQoKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG9iamVjdCB3YXMgZGVzdHJveWVkLCBpLmUuLCBkZXN0cm95KCkgd2FzIGNhbGxlZC5cIik7XHJcblx0fVxyXG5cclxuXHRmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcclxuXHRcdGlmICh0eXBlb2Ygb2JqZWN0W2tleV0gPT09IFwiZnVuY3Rpb25cIikge1xyXG5cdFx0XHRvYmplY3Rba2V5XSA9IHRocm93T25EZXN0cm95ZWQ7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRvYmplY3QuaXNEZXN0cm95ZWQgPSByZXR1cm5UcnVlO1xyXG5cclxuXHRyZXR1cm4gdW5kZWZpbmVkO1xyXG59XHJcbiIsImltcG9ydCBTYW1wbGVyIGZyb20gXCIuLi9yZW5kZXIvU2FtcGxlclwiO1xuaW1wb3J0IFRleHR1cmUgZnJvbSBcIi4uL3JlbmRlci9UZXh0dXJlXCI7XG5pbXBvcnQgZGVmaW5lZCBmcm9tIFwiLi4vdXRpbHMvZGVmaW5lZFwiO1xuaW1wb3J0IHsgZGVzdHJveU9iamVjdCB9IGZyb20gXCIuLi91dGlscy9kZXN0cm95T2JqZWN0XCI7XG50eXBlIFRleHR1cmVDYWNoZVByb3AgPSB7XG5cdHRleHR1cmU6IFRleHR1cmU7XG5cdGNvdW50OiBudW1iZXI7XG59O1xuY2xhc3MgVGV4dHVyZUNhY2hlIHtcblx0cHVibGljIGRlZmF1bHRTYW1wbGVyOiBTYW1wbGVyO1xuXHRwcml2YXRlIF9udW1iZXJPZlRleHR1cmVzOiBudW1iZXI7XG5cdHByaXZhdGUgX3RleHR1cmVzOiBNYXA8c3RyaW5nLCBUZXh0dXJlQ2FjaGVQcm9wPjtcblx0cHJpdmF0ZSBfdGV4dHVyZXNUb1JlbGVhc2U6IE1hcDxzdHJpbmcsIFRleHR1cmVDYWNoZVByb3A+O1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLl9udW1iZXJPZlRleHR1cmVzID0gMDtcblx0XHR0aGlzLl90ZXh0dXJlcyA9IG5ldyBNYXAoKTtcblx0XHR0aGlzLl9udW1iZXJPZlRleHR1cmVzID0gMDtcblx0XHR0aGlzLl90ZXh0dXJlc1RvUmVsZWFzZSA9IG5ldyBNYXAoKTtcblx0XHR0aGlzLmRlZmF1bHRTYW1wbGVyID0gbmV3IFNhbXBsZXIoe1xuXHRcdFx0bWFnRmlsdGVyOiBcImxpbmVhclwiLFxuXHRcdFx0bWluRmlsdGVyOiBcImxpbmVhclwiLFxuXHRcdFx0YWRkcmVzc01vZGVVOiBcInJlcGVhdFwiLFxuXHRcdFx0YWRkcmVzc01vZGVWOiBcInJlcGVhdFwiXG5cdFx0fSk7XG5cdH1cblx0Z2V0IG51bWJlck9mVGV4dHVyZXMoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5fbnVtYmVyT2ZUZXh0dXJlcztcblx0fVxuXHRnZXRUZXh0dXJlKGtleXdvcmQpIHtcblx0XHRjb25zdCBjYWNoZWRUZXh0dXJlID0gdGhpcy5fdGV4dHVyZXMuZ2V0KGtleXdvcmQpO1xuXHRcdGlmICghZGVmaW5lZChjYWNoZWRUZXh0dXJlKSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Ly8gTm8gbG9uZ2VyIHdhbnQgdG8gcmVsZWFzZSB0aGlzIGlmIGl0IHdhcyBwcmV2aW91c2x5IHJlbGVhc2VkLlxuXHRcdGRlbGV0ZSB0aGlzLl90ZXh0dXJlc1RvUmVsZWFzZVtrZXl3b3JkXTtcblxuXHRcdCsrY2FjaGVkVGV4dHVyZS5jb3VudDtcblx0XHRyZXR1cm4gY2FjaGVkVGV4dHVyZS50ZXh0dXJlO1xuXHR9XG5cdGFkZFRleHR1cmUoa2V5d29yZCwgdGV4dHVyZSkge1xuXHRcdGNvbnN0IGNhY2hlZFRleHR1cmUgPSB7XG5cdFx0XHR0ZXh0dXJlOiB0ZXh0dXJlLFxuXHRcdFx0Y291bnQ6IDFcblx0XHR9O1xuXG5cdFx0dGV4dHVyZS5maW5hbERlc3Ryb3kgPSB0ZXh0dXJlLmRlc3Ryb3k7XG5cblx0XHQvLyBjb25zdCB0aGF0ID0gdGhpcztcblx0XHR0ZXh0dXJlLmRlc3Ryb3kgPSAoKSA9PiB7XG5cdFx0XHRpZiAoLS1jYWNoZWRUZXh0dXJlLmNvdW50ID09PSAwKSB7XG5cdFx0XHRcdHRoaXMuX3RleHR1cmVzVG9SZWxlYXNlLnNldChrZXl3b3JkLCBjYWNoZWRUZXh0dXJlKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGhpcy5fdGV4dHVyZXMuc2V0KGtleXdvcmQsIGNhY2hlZFRleHR1cmUpO1xuXHRcdCsrdGhpcy5fbnVtYmVyT2ZUZXh0dXJlcztcblx0fVxuXHRyZWxlYXNlZFRleHR1cmVzKCkge1xuXHRcdHRoaXMuX3RleHR1cmVzVG9SZWxlYXNlLmZvckVhY2goKGNhY2hlVGV4dHVyZSkgPT4ge1xuXHRcdFx0Y2FjaGVUZXh0dXJlLnRleHR1cmU/LmZpbmFsRGVzdHJveSgpO1xuXHRcdFx0LS10aGlzLl9udW1iZXJPZlRleHR1cmVzO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5fdGV4dHVyZXNUb1JlbGVhc2UuY2xlYXIoKTtcblx0fVxuXHRkZXN0cm95KCkge1xuXHRcdHRoaXMuX3RleHR1cmVzLmZvckVhY2goKGNhY2hlZFRleHR1cmUpID0+IHtcblx0XHRcdGNhY2hlZFRleHR1cmUudGV4dHVyZT8uZmluYWxEZXN0cm95KCk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGRlc3Ryb3lPYmplY3QodGhpcyk7XG5cdH1cbn1cbmNvbnN0IHRleHR1cmVDYWNoZSA9IG5ldyBUZXh0dXJlQ2FjaGUoKTtcbmV4cG9ydCBkZWZhdWx0IHRleHR1cmVDYWNoZTtcbiIsImltcG9ydCBTYW1wbGVyIGZyb20gXCIuLi9yZW5kZXIvU2FtcGxlclwiO1xyXG5pbXBvcnQgVGV4dHVyZSBmcm9tIFwiLi4vcmVuZGVyL1RleHR1cmVcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIEN1YmVUZXh0dXJlTG9hZGVyKHVybHMpIHtcclxuXHRjb25zdCBwcm9taXNlcyA9IHVybHMubWFwKChzcmMpID0+IHtcclxuXHRcdGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XHJcblx0XHRpbWcuc3JjID0gc3JjO1xyXG5cdFx0cmV0dXJuIGltZy5kZWNvZGUoKS50aGVuKCgpID0+IGNyZWF0ZUltYWdlQml0bWFwKGltZykpO1xyXG5cdH0pO1xyXG5cdGNvbnN0IGltYWdlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcclxuXHRhd2FpdCBQcm9taXNlLmFsbChpbWFnZXMpO1xyXG5cdGNvbnN0IGJhc2VTYW1wbGVyID0gbmV3IFNhbXBsZXIoe1xyXG5cdFx0bWFnRmlsdGVyOiBcImxpbmVhclwiLFxyXG5cdFx0bWluRmlsdGVyOiBcImxpbmVhclwiXHJcblx0fSk7XHJcblx0Y29uc3QgZGF0YSA9IGltYWdlcy5tYXAoKGltYWdlLCBpKSA9PiB7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRzb3VyY2U6IGltYWdlLFxyXG5cdFx0XHR3aWR0aDogaW1hZ2Uud2lkdGgsXHJcblx0XHRcdGhlaWdodDogaW1hZ2UuaGVpZ2h0LFxyXG5cdFx0XHRkZXB0aDogMSxcclxuXHRcdFx0eDogMCxcclxuXHRcdFx0eTogMCxcclxuXHRcdFx0ejogaVxyXG5cdFx0fTtcclxuXHR9KTtcclxuXHRjb25zdCBiYXNlVGV4dHVyZSA9IG5ldyBUZXh0dXJlKHtcclxuXHRcdHNpemU6IHtcclxuXHRcdFx0d2lkdGg6IGltYWdlc1swXS53aWR0aCxcclxuXHRcdFx0aGVpZ2h0OiBpbWFnZXNbMF0uaGVpZ2h0LFxyXG5cdFx0XHRkZXB0aDogNlxyXG5cdFx0fSxcclxuXHRcdGZvcm1hdDogXCJyZ2JhOHVub3JtXCIsXHJcblx0XHR1c2FnZTogR1BVVGV4dHVyZVVzYWdlLlRFWFRVUkVfQklORElORyB8IEdQVVRleHR1cmVVc2FnZS5DT1BZX0RTVCB8IEdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVCxcclxuXHRcdGRhdGEsXHJcblx0XHR2aWV3Rm9ybWF0czogXCJjdWJlXCIsXHJcblx0XHRtaXBMZXZlbENvdW50OiA2LFxyXG5cdFx0bmVlZE1pcE1hcDogdHJ1ZVxyXG5cdH0pO1xyXG5cdHJldHVybiB7XHJcblx0XHR0ZXh0dXJlOiBiYXNlVGV4dHVyZSxcclxuXHRcdHNhbXBsZXI6IGJhc2VTYW1wbGVyXHJcblx0fTtcclxufVxyXG4iLCJpbXBvcnQgeyBGcmFtZVN0YXRlIH0gZnJvbSBcIi4uL2NvcmUvRnJhbWVTdGF0ZVwiO1xyXG5pbXBvcnQgdGV4dHVyZUNhY2hlIGZyb20gXCIuLi9jb3JlL1RleHR1cmVDYWNoZVwiO1xyXG5pbXBvcnQgeyBDb21wYXJlRnVuY3Rpb24gfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVDb25zdGFudFwiO1xyXG5pbXBvcnQgeyBVbmlmb3JtRW51bSB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVVR5cGVzXCI7XHJcbmltcG9ydCBDdWJlVGV4dHVyZUxvYWRlciBmcm9tIFwiLi4vbG9hZGVyL0N1YmVUZXh0dXJlTG9hZGVyXCI7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tIFwiLi4vbWVzaC9NZXNoXCI7XHJcbmltcG9ydCBVbmlmb3JtQnVmZmVyIGZyb20gXCIuLi9yZW5kZXIvVW5pZm9ybUJ1ZmZlclwiO1xyXG5pbXBvcnQgeyBTaGFkZXJTb3VyY2UgfSBmcm9tIFwiLi4vc2hhZGVyL1NoYWRlclNvdXJjZVwiO1xyXG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gXCIuL01hdGVyaWFsXCI7XHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNreUJveE1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cdGxvYWRGaXNoOiBib29sZWFuO1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0c3VwZXIoKTtcclxuXHRcdHRoaXMudHlwZSA9IFwic2t5Ym94XCI7XHJcblx0XHR0aGlzLnNoYWRlclNvdXJjZSA9IG5ldyBTaGFkZXJTb3VyY2Uoe1xyXG5cdFx0XHRzaGFkZXJJZDogdGhpcy50eXBlLFxyXG5cdFx0XHRkZWZpbmVzOiB7fVxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmxvYWRGaXNoID0gZmFsc2U7XHJcblx0XHR0aGlzLnJlbmRlclN0YXRlLmRlcHRoU3RlbmNpbC5kZXB0aFdyaXRlRW5hYmxlZCA9IGZhbHNlO1xyXG5cdFx0dGhpcy5yZW5kZXJTdGF0ZS5kZXB0aFN0ZW5jaWwuZGVwdGhDb21wYXJlID0gQ29tcGFyZUZ1bmN0aW9uLkxlc3NFcXVhbDtcclxuXHR9XHJcblx0YXN5bmMgbG9hZFRleHR1cmUodXJscykge1xyXG5cdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgQ3ViZVRleHR1cmVMb2FkZXIodXJscyk7XHJcblx0XHR0aGlzLmxvYWRGaXNoID0gdHJ1ZTtcclxuXHRcdHRleHR1cmVDYWNoZS5hZGRUZXh0dXJlKFwic3BlY3VsYXJcIiwgcmVzdWx0LnRleHR1cmUpO1xyXG5cdFx0dGhpcy5iYXNlVGV4dHVyZSA9IHJlc3VsdC50ZXh0dXJlO1xyXG5cdFx0dGhpcy5iYXNlU2FtcGxlciA9IHJlc3VsdC5zYW1wbGVyO1xyXG5cdH1cclxuXHR1cGRhdGUoZnJhbWVTdGF0ZT86IEZyYW1lU3RhdGUsIG1lc2g/OiBNZXNoKSB7XHJcblx0XHRpZiAoIXRoaXMubG9hZEZpc2gpIHJldHVybjtcclxuXHRcdGlmICghdGhpcy5zaGFkZXJEYXRhKSB7XHJcblx0XHRcdHRoaXMuY3JlYXRlU2hhZGVyRGF0YShtZXNoKTtcclxuXHRcdH1cclxuXHR9XHJcblx0cHJvdGVjdGVkIGNyZWF0ZVNoYWRlckRhdGEobWVzaD86IE1lc2gpIHtcclxuXHRcdHN1cGVyLmNyZWF0ZVNoYWRlckRhdGEoKTtcclxuXHRcdGNvbnN0IHVuaWZvcm1CdWZmZXIgPSBuZXcgVW5pZm9ybUJ1ZmZlcih7IGxhYmVsOiBcInNreWJveFwiIH0pO1xyXG5cdFx0dW5pZm9ybUJ1ZmZlci5zZXRVbmlmb3JtKFxyXG5cdFx0XHRcIm1vZGVsTWF0cml4XCIsXHJcblx0XHRcdCgpID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gbWVzaC5tb2RlbE1hdHJpeDtcclxuXHRcdFx0fSxcclxuXHRcdFx0VW5pZm9ybUVudW0uTWF0NFxyXG5cdFx0KTtcclxuXHRcdHRoaXMuc2hhZGVyRGF0YS5zZXRVbmlmb3JtQnVmZmVyKFwic2t5Ym94XCIsIHVuaWZvcm1CdWZmZXIpO1xyXG5cdFx0dGhpcy5zaGFkZXJEYXRhLnNldFRleHR1cmUoXCJiYXNlVGV4dHVyZVwiLCB0aGlzLmJhc2VUZXh0dXJlKTtcclxuXHRcdHRoaXMuc2hhZGVyRGF0YS5zZXRTYW1wbGVyKFwiYmFzZVNhbXBsZXJcIiwgdGhpcy5iYXNlU2FtcGxlcik7XHJcblx0fVxyXG59XHJcbiIsImltcG9ydCB7IEZyYW1lU3RhdGUgfSBmcm9tIFwiLi4vY29yZS9GcmFtZVN0YXRlXCI7XHJcbmltcG9ydCB7IFJlbmRlck9iamVjdFR5cGUgfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVUeXBlc1wiO1xyXG5pbXBvcnQgU2t5Qm94R2VvbWV0cnkgZnJvbSBcIi4uL2dlb21ldHJ5L1NreUJveEdlb21ldHJ5XCI7XHJcbmltcG9ydCBTa3lCb3hNYXRlcmlhbCBmcm9tIFwiLi4vbWF0ZXJpYWwvU2t5Qm94TWF0ZXJpYWxcIjtcclxuaW1wb3J0IHsgTWVzaCB9IGZyb20gXCIuL01lc2hcIjtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2t5Qm94IGV4dGVuZHMgTWVzaCB7XHJcblx0bWF0ZXJpYWw6IFNreUJveE1hdGVyaWFsO1xyXG5cdHB1YmxpYyB2aXNpYmlsaXR5OiBib29sZWFuO1xyXG5cdGNvbnN0cnVjdG9yKHVybHM/OiBBcnJheTxzdHJpbmc+KSB7XHJcblx0XHRzdXBlcigpO1xyXG5cdFx0dGhpcy50eXBlID0gUmVuZGVyT2JqZWN0VHlwZS5Ta3lib3g7XHJcblx0XHR0aGlzLnZpc2liaWxpdHkgPSB0cnVlO1xyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG5ldyBTa3lCb3hNYXRlcmlhbCgpO1xyXG5cdFx0aWYgKHVybHMpIHRoaXMubWF0ZXJpYWwubG9hZFRleHR1cmUodXJscyk7XHJcblx0XHR0aGlzLmdlb21ldHJ5ID0gbmV3IFNreUJveEdlb21ldHJ5KCk7XHJcblx0XHR0aGlzLmlzU2t5Qm94ID0gdHJ1ZTtcclxuXHR9XHJcblx0dXBkYXRlKGZyYW1lU3RhdGU6IEZyYW1lU3RhdGUpIHtcclxuXHRcdHRoaXMudXBkYXRlTWF0cml4KCk7XHJcblx0XHR0aGlzLmdlb21ldHJ5LnVwZGF0ZShmcmFtZVN0YXRlKTtcclxuXHRcdHRoaXMubWF0ZXJpYWwudXBkYXRlKGZyYW1lU3RhdGUsIHRoaXMpO1xyXG5cdFx0aWYgKHRoaXMudmlzaWJpbGl0eSkgZnJhbWVTdGF0ZS5yZW5kZXJRdWV1ZS5wcmUucHVzaCh0aGlzKTtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IFJlbmRlck9iamVjdCBmcm9tIFwiLi4vY29yZS9SZW5kZXJPYmplY3RcIjtcclxuaW1wb3J0IE1hdHJpeDQgZnJvbSBcIi4uL21hdGgvTWF0cml4NFwiO1xyXG5pbXBvcnQgY3JlYXRlR3VpZCBmcm9tIFwiLi4vdXRpbHMvY3JlYXRlR3VpZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEluc3RhbmNlIGV4dGVuZHMgUmVuZGVyT2JqZWN0IHtcclxuXHRwdWJsaWMgaWQ6IHN0cmluZyB8IG51bWJlcjtcclxuXHRwdWJsaWMgdmlzaWJsaXR5OiBib29sZWFuO1xyXG5cdHByaXZhdGUgX25vdFVwZGF0ZU1hdHJpeDogYm9vbGVhbjtcclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHRcdHN1cGVyKCk7XHJcblx0XHR0aGlzLl9ub3RVcGRhdGVNYXRyaXggPSBmYWxzZTtcclxuXHRcdHRoaXMudmlzaWJsaXR5ID0gZmFsc2U7XHJcblx0XHR0aGlzLmlkID0gY3JlYXRlR3VpZCgpO1xyXG5cdH1cclxuXHRzZXRNYXRyaXg0KG1hdDQ6IE1hdHJpeDQpIHtcclxuXHRcdHRoaXMubW9kZWxNYXRyaXguc2V0KG1hdDQpO1xyXG5cdFx0dGhpcy5fbm90VXBkYXRlTWF0cml4ID0gdHJ1ZTtcclxuXHR9XHJcblx0dXBkYXRlTWF0cml4KG1hdHJpeD86IE1hdHJpeDQpIHtcclxuXHRcdGlmICh0aGlzLl9ub3RVcGRhdGVNYXRyaXgpIHJldHVybjtcclxuXHRcdHN1cGVyLnVwZGF0ZU1hdHJpeChtYXRyaXgpO1xyXG5cdH1cclxufVxyXG4iLCJpbXBvcnQgQ2FtZXJhIGZyb20gXCIuLi9jYW1lcmEvQ2FtZXJhXCI7XHJcbmltcG9ydCB7IEZyYW1lU3RhdGUgfSBmcm9tIFwiLi4vY29yZS9GcmFtZVN0YXRlXCI7XHJcbmltcG9ydCB7IEJ1ZmZlckJpbmRpbmdUeXBlLCBCdWZmZXJVc2FnZSwgSW50ZXJzZWN0IH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVQ29uc3RhbnRcIjtcclxuaW1wb3J0IHsgVW5pZm9ybUVudW0gfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVUeXBlc1wiO1xyXG5pbXBvcnQgR2VvbWV0cnkgZnJvbSBcIi4uL2dlb21ldHJ5L0dlb21ldHJ5XCI7XHJcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSBcIi4uL21hdGVyaWFsL01hdGVyaWFsXCI7XHJcbmltcG9ydCBVbmlmb3JtQnVmZmVyIGZyb20gXCIuLi9yZW5kZXIvVW5pZm9ybUJ1ZmZlclwiO1xyXG5pbXBvcnQgeyBJbnN0YW5jZSB9IGZyb20gXCIuL0luc3RhbmNlXCI7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tIFwiLi9NZXNoXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSW5zdGFuY2VNZXNoIGV4dGVuZHMgTWVzaCB7XHJcblx0cHJpdmF0ZSBpbnN0YW5jZXM6IE1hcDxzdHJpbmcgfCBudW1iZXIsIEluc3RhbmNlPjtcclxuXHRwcml2YXRlIHJlbmRlckluc3RhbmNlczogQXJyYXk8SW5zdGFuY2U+O1xyXG5cdHByaXZhdGUgaGFzQWRkSW5zdGFuY2VzOiBib29sZWFuO1xyXG5cdGNvbnN0cnVjdG9yKGdlbzogR2VvbWV0cnksIG1hdDogTWF0ZXJpYWwpIHtcclxuXHRcdHN1cGVyKGdlbywgbWF0KTtcclxuXHRcdHRoaXMuaW5zdGFuY2VzID0gbmV3IE1hcCgpO1xyXG5cdFx0dGhpcy5yZW5kZXJJbnN0YW5jZXMgPSBbXTtcclxuXHRcdHRoaXMuaGFzQWRkSW5zdGFuY2VzID0gZmFsc2U7XHJcblx0fVxyXG5cdHVwZGF0ZShmcmFtZVN0YXRlOiBGcmFtZVN0YXRlLCBjYW1lcmE/OiBDYW1lcmEpIHtcclxuXHRcdC8vIHVwZGF0ZSBpbnN0YW5jZXMgdmlzaWJsaXR5XHJcblx0XHR0aGlzLmNoZWNrSW5zdGFuY2VzVmlzaWJsaXR5KHsgZnJhbWVTdGF0ZSwgY2FtZXJhIH0pO1xyXG5cdFx0dGhpcy5nZW9tZXRyeS51cGRhdGUoZnJhbWVTdGF0ZSk7XHJcblx0XHR0aGlzLm1hdGVyaWFsLnVwZGF0ZShmcmFtZVN0YXRlLCB0aGlzKTtcclxuXHRcdGlmICghdGhpcy5oYXNBZGRJbnN0YW5jZXMpIHRoaXMuYWRkVW5pZm9ybXNUb01hdGVyaWFsKCk7XHJcblx0XHR0aGlzLmluc3RhbmNlQ291bnQgPSB0aGlzLnJlbmRlckluc3RhbmNlcy5sZW5ndGg7XHJcblx0XHRpZiAodGhpcy5yZW5kZXJJbnN0YW5jZXMubGVuZ3RoIDwgMSkgcmV0dXJuO1xyXG5cdFx0aWYgKHRoaXMubWF0ZXJpYWwudHJhbnNwYXJlbnQpIHtcclxuXHRcdFx0ZnJhbWVTdGF0ZS5yZW5kZXJRdWV1ZS50cmFuc3BhcmVudC5wdXNoKHRoaXMpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZnJhbWVTdGF0ZS5yZW5kZXJRdWV1ZS5vcGFxdWUucHVzaCh0aGlzKTtcclxuXHRcdH1cclxuXHR9XHJcblx0YWRkSW5zdGFuY2UoaW5zdGFuY2U6IEluc3RhbmNlKSB7XHJcblx0XHRpZiAodGhpcy5pbnN0YW5jZXMuZ2V0KGluc3RhbmNlLmlkKSkgcmV0dXJuO1xyXG5cdFx0dGhpcy5pbnN0YW5jZXMuc2V0KGluc3RhbmNlLmlkLCBpbnN0YW5jZSk7XHJcblx0fVxyXG5cdHJlbW92ZUluc3RhbmNlKGtleTogbnVtYmVyIHwgc3RyaW5nKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5pbnN0YW5jZXMuZGVsZXRlKGtleSk7XHJcblx0fVxyXG5cdGdldEluc3RhbmNlKGtleTogbnVtYmVyIHwgc3RyaW5nKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5pbnN0YW5jZXMuZ2V0KGtleSk7XHJcblx0fVxyXG5cdHByaXZhdGUgY2hlY2tJbnN0YW5jZXNWaXNpYmxpdHkob3B0aW9uczogeyBmcmFtZVN0YXRlOiBGcmFtZVN0YXRlOyBjYW1lcmE6IENhbWVyYSB9KSB7XHJcblx0XHRjb25zdCB7IGZyYW1lU3RhdGUsIGNhbWVyYSB9ID0gb3B0aW9ucztcclxuXHRcdGNvbnN0IHByZUZyYW1lSW5zdGFuY2VDb3VudCA9IHRoaXMucmVuZGVySW5zdGFuY2VzLmxlbmd0aDtcclxuXHRcdHRoaXMucmVuZGVySW5zdGFuY2VzID0gW107XHJcblx0XHR0aGlzLmluc3RhbmNlcy5mb3JFYWNoKChpbnN0YW5jZTogSW5zdGFuY2UpID0+IHtcclxuXHRcdFx0aW5zdGFuY2UudXBkYXRlTWF0cml4KHRoaXM/LnBhcmVudD8ubW9kZWxNYXRyaXgpO1xyXG5cdFx0XHRpbnN0YW5jZS52aXNpYmxpdHkgPSB0aGlzLmdldEluc3RhbmNlVmlzaWJsaXR5KHsgaW5zdGFuY2UsIGZyYW1lU3RhdGUsIGNhbWVyYSB9KTtcclxuXHRcdFx0aWYgKGluc3RhbmNlLnZpc2libGl0eSkgdGhpcy5yZW5kZXJJbnN0YW5jZXMucHVzaChpbnN0YW5jZSk7XHJcblx0XHR9KTtcclxuXHRcdHRoaXMubWF0ZXJpYWwuZGlydHkgPSB0aGlzLnJlbmRlckluc3RhbmNlcy5sZW5ndGggPT09IHByZUZyYW1lSW5zdGFuY2VDb3VudDtcclxuXHRcdC8vIHJlYnVpbGQgaW5zdGFuY2VNYXRyaXhzQnVmZmVyXHJcblx0XHRpZiAodGhpcy5tYXRlcmlhbC5kaXJ0eSkgdGhpcy5oYXNBZGRJbnN0YW5jZXMgPSBmYWxzZTtcclxuXHR9XHJcblx0cHJpdmF0ZSBnZXRJbnN0YW5jZVZpc2libGl0eShvcHRpb25zOiB7IGluc3RhbmNlOiBJbnN0YW5jZTsgZnJhbWVTdGF0ZTogRnJhbWVTdGF0ZTsgY2FtZXJhOiBDYW1lcmEgfSk6IGJvb2xlYW4ge1xyXG5cdFx0Y29uc3QgeyBpbnN0YW5jZSwgZnJhbWVTdGF0ZSwgY2FtZXJhIH0gPSBvcHRpb25zO1xyXG5cdFx0dGhpcy5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS51cGRhdGUoaW5zdGFuY2UubW9kZWxNYXRyaXgpO1xyXG5cdFx0dGhpcy5kaXN0YW5jZVRvQ2FtZXJhID0gdGhpcy5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5kaXN0YW5jZVRvQ2FtZXJhKGNhbWVyYSk7XHJcblx0XHRjb25zdCB2aXNpYmlsaXR5ID0gZnJhbWVTdGF0ZS5jdWxsaW5nVm9sdW1lLmNvbXB1dGVWaXNpYmlsaXR5KHRoaXMuZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUpO1xyXG5cdFx0cmV0dXJuIHZpc2liaWxpdHkgPT09IEludGVyc2VjdC5JTlRFUlNFQ1RJTkcgfHwgdmlzaWJpbGl0eSA9PT0gSW50ZXJzZWN0LklOU0lERTtcclxuXHR9XHJcblx0cHJpdmF0ZSBhZGRVbmlmb3Jtc1RvTWF0ZXJpYWwoKSB7XHJcblx0XHRpZiAoIXRoaXMubWF0ZXJpYWwuc2hhZGVyRGF0YSkgcmV0dXJuO1xyXG5cdFx0dGhpcy5oYXNBZGRJbnN0YW5jZXMgPSB0cnVlO1xyXG5cdFx0Y29uc3QgaW5zdGFuY2VNYXRyaXhzQnVmZmVyID0gbmV3IFVuaWZvcm1CdWZmZXIoe1xyXG5cdFx0XHRsYWJlbDogXCJpbnN0YW5jZU1hdHJpeHNCdWZmZXJcIixcclxuXHRcdFx0dHlwZTogQnVmZmVyQmluZGluZ1R5cGUuUmVhZE9ubHlTdG9yYWdlLFxyXG5cdFx0XHR1c2FnZTogQnVmZmVyVXNhZ2UuU3RvcmFnZSB8IEJ1ZmZlclVzYWdlLkNvcHlEc3QsXHJcblx0XHRcdHNpemU6IHRoaXMuaW5zdGFuY2VzLnNpemUgKiA2NFxyXG5cdFx0fSk7XHJcblx0XHRpbnN0YW5jZU1hdHJpeHNCdWZmZXIuc2V0VW5pZm9ybShcclxuXHRcdFx0XCJpbnN0YW5jZU1hdHJpeHNcIixcclxuXHRcdFx0KCkgPT4ge1xyXG5cdFx0XHRcdHJldHVybiB0aGlzPy5yZW5kZXJJbnN0YW5jZXM/Lm1hcCgocmVuZGVySW5zdGFuY2U6IEluc3RhbmNlKSA9PiByZW5kZXJJbnN0YW5jZS5tb2RlbE1hdHJpeCk7XHJcblx0XHRcdH0sXHJcblx0XHRcdFVuaWZvcm1FbnVtLk1hdDRBcnJheSxcclxuXHRcdFx0dGhpcz8ucmVuZGVySW5zdGFuY2VzPy5sZW5ndGhcclxuXHRcdCk7XHJcblx0XHR0aGlzLm1hdGVyaWFsLnNoYWRlckRhdGEuc2V0VW5pZm9ybUJ1ZmZlcihcImluc3RhbmNlTWF0cml4c0J1ZmZlclwiLCBpbnN0YW5jZU1hdHJpeHNCdWZmZXIpO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC5zaGFkZXJEYXRhLnNldERlZmluZShcIlVTRV9JTlNUQU5DRVwiLCB0cnVlKTtcclxuXHRcdHRoaXMubWF0ZXJpYWwuc2hhZGVyRGF0YS5zZXREZWZpbmUoXCJpbnN0YW5jZUNvdW50XCIsIHRoaXM/LnJlbmRlckluc3RhbmNlcz8ubGVuZ3RoKTtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyU291cmNlIH0gZnJvbSBcIi4uL3NoYWRlci9TaGFkZXJTb3VyY2VcIjtcclxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCIuL0NvbW1hbmRcIjtcclxuaW1wb3J0IFBpcGVsaW5lIGZyb20gXCIuL1BpcGVsaW5lXCI7XHJcbmltcG9ydCBTaGFkZXJEYXRhIGZyb20gXCIuL1NoYWRlckRhdGFcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDb21wdXRlQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQge1xyXG5cdHB1YmxpYyBkaXNwYXRjaD86IHsgeD86IG51bWJlcjsgeT86IG51bWJlcjsgej86IG51bWJlciB9O1xyXG5cdHB1YmxpYyBzaGFkZXJTb3VyY2U/OiBTaGFkZXJTb3VyY2U7XHJcblx0cHVibGljIHNoYWRlckRhdGE/OiBTaGFkZXJEYXRhO1xyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnM6IENvbXB1dGVDb21tYW5kVHlwZSkge1xyXG5cdFx0dGhpcy5kaXNwYXRjaCA9IG9wdGlvbnMuZGlzcGF0Y2g7XHJcblx0XHR0aGlzLnNoYWRlckRhdGEgPSBvcHRpb25zLnNoYWRlckRhdGE7XHJcblx0XHR0aGlzLnNoYWRlclNvdXJjZSA9IG9wdGlvbnMuc2hhZGVyU291cmNlO1xyXG5cdH1cclxuXHRyZW5kZXIocGFyYW1zPzogQ29tcHV0ZVBhcmFtcyk6IHZvaWQge1xyXG5cdFx0Y29uc3QgeyBkZXZpY2UsIHBhc3NFbmNvZGVyIH0gPSBwYXJhbXM7XHJcblx0XHR0aGlzLnNoYWRlckRhdGE/LmJpbmQ/LihkZXZpY2UsIHBhc3NFbmNvZGVyKTtcclxuXHRcdGNvbnN0IHBpcGVsaW5lID0gUGlwZWxpbmUuZ2V0Q29tcHV0ZVBpcGVsaW5lRnJvbUNhY2hlKGRldmljZSwgdGhpcywgW3RoaXMuc2hhZGVyRGF0YS5ncm91cExheW91dF0pO1xyXG5cdFx0cGlwZWxpbmUuYmluZChwYXNzRW5jb2Rlcik7XHJcblx0XHRjb25zdCB7IHgsIHksIHogfSA9IHRoaXMuZGlzcGF0Y2g7XHJcblx0XHRwYXNzRW5jb2Rlci5kaXNwYXRjaFdvcmtncm91cHMoeCwgeSwgeik7XHJcblx0fVxyXG59XHJcbnR5cGUgQ29tcHV0ZUNvbW1hbmRUeXBlID0ge1xyXG5cdGRpc3BhdGNoPzogeyB4PzogbnVtYmVyOyB5PzogbnVtYmVyOyB6PzogbnVtYmVyIH07XHJcblxyXG5cdHNoYWRlclNvdXJjZT86IFNoYWRlclNvdXJjZTtcclxuXHJcblx0c2hhZGVyRGF0YT86IFNoYWRlckRhdGE7XHJcbn07XHJcbnR5cGUgQ29tcHV0ZVBhcmFtcyA9IHtcclxuXHRkZXZpY2U/OiBHUFVEZXZpY2U7XHJcblx0cGFzc0VuY29kZXI/OiBHUFVDb21wdXRlUGFzc0VuY29kZXI7XHJcbn07XHJcbiIsImltcG9ydCB7XG5cdEJ1ZmZlckJpbmRpbmdUeXBlLFxuXHRCdWZmZXJVc2FnZSxcblx0Q3VsbE1vZGUsXG5cdEZyb250RmFjZSxcblx0SW5wdXRTdGVwTW9kZSxcblx0UHJpbWl0aXZlVG9wb2xvZ3lcbn0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVQ29uc3RhbnRcIjtcbmltcG9ydCB7IE1vZGVsUGFyYW1zIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVVHlwZXNcIjtcbmltcG9ydCB7IEJ1ZmZlckZsb2F0MzJBdHRyaWJ1dGUsIEZsb2F0MzJBdHRyaWJ1dGUsIEludGVybGVhdmVkRmxvYXQzMkF0dHJpYnV0ZSB9IGZyb20gXCIuLi9yZW5kZXIvQXR0cmlidXRlXCI7XG5pbXBvcnQgeyBDb21wdXRlQ29tbWFuZCB9IGZyb20gXCIuLi9yZW5kZXIvQ29tcHV0ZUNvbW1hbmRcIjtcbmltcG9ydCBEcmF3Q29tbWFuZCBmcm9tIFwiLi4vcmVuZGVyL0RyYXdDb21tYW5kXCI7XG5pbXBvcnQgSW5kZXhCdWZmZXIgZnJvbSBcIi4uL3JlbmRlci9JbmRleEJ1ZmZlclwiO1xuaW1wb3J0IHtcblx0QmxlbmRDb25zdGFudCxcblx0RGVwdGhTdGVuY2lsLFxuXHREZXB0aFN0ZW5jaWxQcm9wcyxcblx0TXVsdGlTYW1wbGUsXG5cdFByaW1pdGl2ZSxcblx0UmVuZGVyU3RhdGUsXG5cdFNjaXNzb3JUZXN0LFxuXHRUYXJnZXQsXG5cdFZpZXdQb3J0XG59IGZyb20gXCIuLi9yZW5kZXIvUmVuZGVyU3RhdGVcIjtcbmltcG9ydCBTaGFkZXJEYXRhIGZyb20gXCIuLi9yZW5kZXIvU2hhZGVyRGF0YVwiO1xuaW1wb3J0IFRleHR1cmUgZnJvbSBcIi4uL3JlbmRlci9UZXh0dXJlXCI7XG5pbXBvcnQgVW5pZm9ybUJ1ZmZlciBmcm9tIFwiLi4vcmVuZGVyL1VuaWZvcm1CdWZmZXJcIjtcbmltcG9ydCBWZXJ0ZXhCdWZmZXIgZnJvbSBcIi4uL3JlbmRlci9WZXJ0ZXhCdWZmZXJcIjtcbmltcG9ydCB7IFNoYWRlclNvdXJjZSB9IGZyb20gXCIuLi9zaGFkZXIvU2hhZGVyU291cmNlXCI7XG5pbXBvcnQgeyBhZGRVbmlmb3JtVG9TaGFkZXJEYXRhIH0gZnJvbSBcIi4uL3V0aWxzL3VuaWZvcm1VdGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgTW9kZWwge1xuXHRwdWJsaWMgbW9kZWxQYXJhbXM6IE1vZGVsUGFyYW1zO1xuXHRwdWJsaWMgY29tbWFuZDogRHJhd0NvbW1hbmQgfCBDb21wdXRlQ29tbWFuZDtcblx0cHVibGljIHJlbmRlclR5cGU6IHN0cmluZztcblx0cHJpdmF0ZSB2ZXJ0ZXhCdWZmZXJzOiBNYXA8c3RyaW5nLCBWZXJ0ZXhCdWZmZXI+O1xuXHRwcml2YXRlIHNoYWRlckRhdGE6IFNoYWRlckRhdGE7XG5cdGNvbnN0cnVjdG9yKHBhcmFtczogTW9kZWxQYXJhbXMpIHtcblx0XHR0aGlzLm1vZGVsUGFyYW1zID0gcGFyYW1zO1xuXHRcdHRoaXMucmVuZGVyVHlwZSA9IHRoaXMubW9kZWxQYXJhbXMuY29tcHV0ZSAhPSB1bmRlZmluZWQgPyBcImNvbXB1dGVcIiA6IFwicmVuZGVyXCI7XG5cdFx0dGhpcy52ZXJ0ZXhCdWZmZXJzID0gbmV3IE1hcCgpO1xuXHR9XG5cdHJlbmRlcihwYXJhbXM6IFJlbmRlck1vZGVsUGFyYW1zKSB7XG5cdFx0Y29uc3QgeyBkZXZpY2UsIHBhc3NFbmNvZGVyIH0gPSBwYXJhbXM7XG5cdFx0aWYgKCF0aGlzLmNvbW1hbmQpIHRoaXMuY29tbWFuZCA9IHRoaXMuY3JlYXRlRHJhd0NvbW1hbmQoKTtcblx0XHQodGhpcy5jb21tYW5kIGFzIERyYXdDb21tYW5kKS5yZW5kZXIoe1xuXHRcdFx0ZGV2aWNlLFxuXHRcdFx0cGFzc0VuY29kZXI6IDxHUFVSZW5kZXJQYXNzRW5jb2Rlcj5wYXNzRW5jb2RlclxuXHRcdH0pO1xuXHR9XG5cdGNvbXB1dGUocGFyYW1zOiBDb21wdXRlTW9kZWxQYXJhbXMpIHtcblx0XHRjb25zdCB7IGRldmljZSwgcGFzc0VuY29kZXIgfSA9IHBhcmFtcztcblx0XHRpZiAoIXRoaXMuY29tbWFuZCkgdGhpcy5jb21tYW5kID0gdGhpcy5jcmVhdGVDb21wdXRlQ29tbWFuZCgpO1xuXHRcdCh0aGlzLmNvbW1hbmQgYXMgQ29tcHV0ZUNvbW1hbmQpLnJlbmRlcih7XG5cdFx0XHRkZXZpY2UsXG5cdFx0XHRwYXNzRW5jb2RlcjogPEdQVUNvbXB1dGVQYXNzRW5jb2Rlcj5wYXNzRW5jb2RlclxuXHRcdH0pO1xuXHR9XG5cdHB1YmxpYyBnZXRWZXJ0ZXhCdWZmZXJCeVVpZCh1aWQ6IHN0cmluZyk6IFZlcnRleEJ1ZmZlciB7XG5cdFx0cmV0dXJuIHRoaXMudmVydGV4QnVmZmVycy5nZXQodWlkKTtcblx0fVxuXHRwdWJsaWMgZ2V0VW5pZm9ybUJ1ZmZlckJ5VWlkKHVpZDogc3RyaW5nKTogVW5pZm9ybUJ1ZmZlciB7XG5cdFx0cmV0dXJuIHRoaXMuc2hhZGVyRGF0YS5nZXRVbmlmb3JtQnVmZmVyKHVpZCk7XG5cdH1cblx0cHVibGljIGdldFRleHR1cmVCeU5hbWUobmFtZTogc3RyaW5nKTogVGV4dHVyZSB7XG5cdFx0cmV0dXJuIHRoaXMuc2hhZGVyRGF0YS5nZXRUZXh0dXJlKG5hbWUpO1xuXHR9XG5cdHB1YmxpYyBnZXRTYW1wbGVyQnlOYW1lKG5hbWU6IHN0cmluZykge1xuXHRcdHJldHVybiB0aGlzLnNoYWRlckRhdGEuZ2V0U2FtcGxlcihuYW1lKTtcblx0fVxuXHRwdWJsaWMgZGVzdHJveSgpIHtcblx0XHR0aGlzPy52ZXJ0ZXhCdWZmZXJzLmNsZWFyKCk7XG5cdFx0dGhpcz8uc2hhZGVyRGF0YS5kZXN0cm95KCk7XG5cdFx0dGhpcy5jb21tYW5kID0gbnVsbDtcblx0XHR0aGlzLm1vZGVsUGFyYW1zID0gbnVsbDtcblx0fVxuXHRwcml2YXRlIGNyZWF0ZURyYXdDb21tYW5kKCkge1xuXHRcdGNvbnN0IHsgY291bnQsIGluc3RhbmNlcyB9ID0gdGhpcy5tb2RlbFBhcmFtcztcblx0XHRjb25zdCB2ZXJ0ZXhCdWZmZXJzID0gdGhpcy5jcmVhdGVWZXJ0ZXhCdWZmZXIoKTtcblx0XHR0aGlzLnNoYWRlckRhdGEgPSB0aGlzLmNyZWF0ZVNoYWRlckRhdGEoKTtcblx0XHRjb25zdCBpbmRleEJ1ZmZlciA9IHRoaXMuY3JlYXRlSW5kZXhCdWZmZXIoKTtcblx0XHRjb25zdCBzaGFkZXJTb3VyY2UgPSB0aGlzLmNyZWF0ZVNoYWRlclNvdXJjZSgpO1xuXHRcdGNvbnN0IHJlbmRlclN0YXRlID0gdGhpcy5jcmVhdGVSZW5kZXJTdGF0ZSgpO1xuXHRcdHJldHVybiBuZXcgRHJhd0NvbW1hbmQoe1xuXHRcdFx0dmVydGV4QnVmZmVycyxcblx0XHRcdHNoYWRlckRhdGE6IHRoaXMuc2hhZGVyRGF0YSxcblx0XHRcdGluZGV4QnVmZmVyLFxuXHRcdFx0c2hhZGVyU291cmNlLFxuXHRcdFx0cmVuZGVyU3RhdGUsXG5cdFx0XHRjb3VudCxcblx0XHRcdGluc3RhbmNlc1xuXHRcdH0pO1xuXHR9XG5cdHByaXZhdGUgY3JlYXRlQ29tcHV0ZUNvbW1hbmQoKSB7XG5cdFx0Y29uc3QgeyBkaXNwYXRjaCB9ID0gdGhpcy5tb2RlbFBhcmFtcztcblx0XHRjb25zdCBzaGFkZXJEYXRhID0gdGhpcy5jcmVhdGVTaGFkZXJEYXRhKCk7XG5cdFx0Y29uc3Qgc2hhZGVyU291cmNlID0gdGhpcy5jcmVhdGVTaGFkZXJTb3VyY2UoKTtcblx0XHRyZXR1cm4gbmV3IENvbXB1dGVDb21tYW5kKHtcblx0XHRcdGRpc3BhdGNoLFxuXHRcdFx0c2hhZGVyRGF0YSxcblx0XHRcdHNoYWRlclNvdXJjZVxuXHRcdH0pO1xuXHR9XG5cdHByaXZhdGUgY3JlYXRlVmVydGV4QnVmZmVyKCkge1xuXHRcdGNvbnN0IHsgdmVydGV4QnVmZmVycywgc2hhZGVySWQgfSA9IHRoaXMubW9kZWxQYXJhbXM7XG5cdFx0bGV0IGxvY2F0aW9uSW5kZXggPSAwO1xuXHRcdHJldHVybiAoXG5cdFx0XHR2ZXJ0ZXhCdWZmZXJzPy5tYXAoKHZlcnRleEJ1ZmZlck9iamVjdCwgaW5kZXgpID0+IHtcblx0XHRcdFx0Y29uc3QgeyBhdHRyaWJ1dGVzLCBzdGVwTW9kZSwgdWlkLCBhcnJheVN0cmlkZSB9ID0gdmVydGV4QnVmZmVyT2JqZWN0O1xuXHRcdFx0XHRjb25zdCB2ZXJ0ZXhCdWZmZXIgPSBuZXcgVmVydGV4QnVmZmVyKHtcblx0XHRcdFx0XHRsYWJlbDogc2hhZGVySWQsXG5cdFx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdFx0bG9jYXRpb25JbmRleCxcblx0XHRcdFx0XHRzdGVwTW9kZTogPElucHV0U3RlcE1vZGU+c3RlcE1vZGUsXG5cdFx0XHRcdFx0YXJyYXlTdHJpZGVcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZUtleXMgPSBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKTtcblx0XHRcdFx0YXR0cmlidXRlS2V5cy5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHsgc2l6ZSwgdmFsdWUsIG5hbWVzLCBpdGVtU2l6ZXMsIGJ1ZmZlciB9ID0gYXR0cmlidXRlc1trZXldO1xuXHRcdFx0XHRcdHZlcnRleEJ1ZmZlci5zZXRBdHRyaWJ1dGUoXG5cdFx0XHRcdFx0XHRuYW1lcz8ubGVuZ3RoID4gMFxuXHRcdFx0XHRcdFx0XHQ/IGJ1ZmZlclxuXHRcdFx0XHRcdFx0XHRcdD8gbmV3IEJ1ZmZlckZsb2F0MzJBdHRyaWJ1dGUobmFtZXMsIGJ1ZmZlciwgaXRlbVNpemVzKVxuXHRcdFx0XHRcdFx0XHRcdDogbmV3IEludGVybGVhdmVkRmxvYXQzMkF0dHJpYnV0ZShuYW1lcywgdmFsdWUsIGl0ZW1TaXplcylcblx0XHRcdFx0XHRcdFx0OiBuZXcgRmxvYXQzMkF0dHJpYnV0ZShrZXksIHZhbHVlLCBzaXplKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Y29uc3QgY291bnQgPSBuYW1lcz8ubGVuZ3RoID4gMCA/IG5hbWVzPy5sZW5ndGggOiAxO1xuXHRcdFx0XHRcdGxvY2F0aW9uSW5kZXggKz0gY291bnQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLnZlcnRleEJ1ZmZlcnMuc2V0KHVpZCwgdmVydGV4QnVmZmVyKTtcblx0XHRcdFx0cmV0dXJuIHZlcnRleEJ1ZmZlcjtcblx0XHRcdH0pIHx8IFtdXG5cdFx0KTtcblx0fVxuXHRwcml2YXRlIGNyZWF0ZVNoYWRlclNvdXJjZSgpIHtcblx0XHRjb25zdCB7IHZlcnQsIGZyYWcsIGNvbXB1dGUsIHNoYWRlcklkIH0gPSB0aGlzLm1vZGVsUGFyYW1zO1xuXHRcdHJldHVybiBuZXcgU2hhZGVyU291cmNlKHtcblx0XHRcdHNoYWRlcklkLFxuXHRcdFx0cmVuZGVyOiB7XG5cdFx0XHRcdHZlcnRTaGFkZXI6IHZlcnQsXG5cdFx0XHRcdGZyYWdTaGFkZXI6IGZyYWdcblx0XHRcdH0sXG5cdFx0XHRjb21wdXRlOiB7XG5cdFx0XHRcdGNvbXB1dGVTaGFkZXI6IGNvbXB1dGVcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRwcml2YXRlIGNyZWF0ZVNoYWRlckRhdGEoKSB7XG5cdFx0Y29uc3QgeyBzaGFkZXJJZCwgdW5pZm9ybUJ1ZmZlcnMsIHVuaWZvcm1UZXh0dXJlQW5kU2FtcGxlciB9ID0gdGhpcy5tb2RlbFBhcmFtcztcblx0XHRjb25zdCBzaGFkZXJEYXRhID0gbmV3IFNoYWRlckRhdGEoc2hhZGVySWQpO1xuXHRcdC8vIGZpbGwgdW5pZm9ybUJ1ZmZlclxuXHRcdHVuaWZvcm1CdWZmZXJzLmZvckVhY2goKHVuaWZvcm1CdWZmZXIpID0+IHRoaXMuY3JlYXRlVW5pZm9ybUJ1ZmZlcih1bmlmb3JtQnVmZmVyLCBzaGFkZXJEYXRhLCBzaGFkZXJJZCkpO1xuXHRcdC8vIGZpbGwgdGV4dHVyZSBhbmQgc2FtcGxlclxuXHRcdHRoaXMuYWRkVW5pZm9ybVRvU2hhZGVyRGF0YSh1bmlmb3JtVGV4dHVyZUFuZFNhbXBsZXIsIHNoYWRlckRhdGEsIHVuZGVmaW5lZCk7XG5cdFx0cmV0dXJuIHNoYWRlckRhdGE7XG5cdH1cblx0cHJpdmF0ZSBjcmVhdGVSZW5kZXJTdGF0ZSgpIHtcblx0XHRjb25zdCB7XG5cdFx0XHRibGVuZENvbnN0YW50LFxuXHRcdFx0ZGVwdGhTdGVuY2lsLFxuXHRcdFx0dmlld1BvcnQsXG5cdFx0XHRzY2lzc29yVGVzdCxcblx0XHRcdHRhcmdldHMsXG5cdFx0XHRtdWx0aVNhbXBsZSxcblx0XHRcdHByaW1pdGl2ZSxcblx0XHRcdHN0ZW5jaWxSZWZlcmVuY2Vcblx0XHR9ID0gdGhpcy5tb2RlbFBhcmFtcy5yZW5kZXJTdGF0ZTtcblx0XHRyZXR1cm4gbmV3IFJlbmRlclN0YXRlKHtcblx0XHRcdHNjaXNzb3JUZXN0OiBzY2lzc29yVGVzdFxuXHRcdFx0XHQ/IG5ldyBTY2lzc29yVGVzdChzY2lzc29yVGVzdC54LCBzY2lzc29yVGVzdC55LCBzY2lzc29yVGVzdC53aWR0aCwgc2Npc3NvclRlc3QuaGVpZ2h0KVxuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdHZpZXdwb3J0OiB2aWV3UG9ydCA/IG5ldyBWaWV3UG9ydCh2aWV3UG9ydC54LCB2aWV3UG9ydC55LCB2aWV3UG9ydC53aWR0aCwgdmlld1BvcnQuaGVpZ2h0KSA6IHVuZGVmaW5lZCxcblx0XHRcdHRhcmdldHM6IHRhcmdldHM/Lm1hcCgodGFyZ2V0KSA9PiB7XG5cdFx0XHRcdHJldHVybiBuZXcgVGFyZ2V0KHRhcmdldCBhcyBhbnkpO1xuXHRcdFx0fSksXG5cdFx0XHRkZXB0aFN0ZW5jaWw6IGRlcHRoU3RlbmNpbCA/IG5ldyBEZXB0aFN0ZW5jaWwoPERlcHRoU3RlbmNpbFByb3BzPmRlcHRoU3RlbmNpbCkgOiB1bmRlZmluZWQsXG5cdFx0XHRibGVuZENvbnN0YW50OiBibGVuZENvbnN0YW50XG5cdFx0XHRcdD8gbmV3IEJsZW5kQ29uc3RhbnQoYmxlbmRDb25zdGFudC5yLCBibGVuZENvbnN0YW50LmcsIGJsZW5kQ29uc3RhbnQuYiwgYmxlbmRDb25zdGFudC5hKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdHN0ZW5jaWxSZWZlcmVuY2U6IHN0ZW5jaWxSZWZlcmVuY2UgfHwgMCxcblx0XHRcdG11bHRpc2FtcGxlOiBtdWx0aVNhbXBsZVxuXHRcdFx0XHQ/IG5ldyBNdWx0aVNhbXBsZShtdWx0aVNhbXBsZS5jb3VudCwgbXVsdGlTYW1wbGUubWFzaywgbXVsdGlTYW1wbGUuYWxwaGFUb0NvdmVyYWdlRW5hYmxlZClcblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRwcmltaXRpdmU6IHByaW1pdGl2ZVxuXHRcdFx0XHQ/IG5ldyBQcmltaXRpdmUoXG5cdFx0XHRcdFx0XHQ8UHJpbWl0aXZlVG9wb2xvZ3k+cHJpbWl0aXZlLnRvcG9sb2d5LFxuXHRcdFx0XHRcdFx0PEN1bGxNb2RlPnByaW1pdGl2ZS5jdWxsTW9kZSxcblx0XHRcdFx0XHRcdDxGcm9udEZhY2U+cHJpbWl0aXZlLmZyb250RmFjZSxcblx0XHRcdFx0XHRcdHByaW1pdGl2ZS51bmNsaXBwZWREZXB0aFxuXHRcdFx0XHQgIClcblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRzdGVuY2lsRW5hYmxlZDogZmFsc2UsXG5cdFx0XHRzY2lzc29yVGVzdEVuYWJsZWQ6IGZhbHNlXG5cdFx0fSk7XG5cdH1cblx0cHJpdmF0ZSBjcmVhdGVJbmRleEJ1ZmZlcigpIHtcblx0XHRjb25zdCB7IGluZGljZXMsIHNoYWRlcklkIH0gPSB0aGlzLm1vZGVsUGFyYW1zO1xuXHRcdGxldCBpbmRleEJ1ZmZlciA9IHVuZGVmaW5lZDtcblx0XHRpZiAoaW5kaWNlcykge1xuXHRcdFx0aW5kZXhCdWZmZXIgPSBuZXcgSW5kZXhCdWZmZXIoc2hhZGVySWQgKyBcIkluZGV4QnVmZmVyXCIpO1xuXHRcdFx0aW5kZXhCdWZmZXIuc2V0SW5kaWNlcyhpbmRpY2VzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaW5kZXhCdWZmZXI7XG5cdH1cblx0cHJpdmF0ZSBjcmVhdGVVbmlmb3JtQnVmZmVyKHVuaWZvcm1CdWZmZXJQYXJhbXMsIHNoYWRlckRhdGE6IFNoYWRlckRhdGEsIHNoYWRlcklkOiBzdHJpbmcpIHtcblx0XHRjb25zdCB7XG5cdFx0XHR0eXBlID0gXCJ1bmlmb3JtXCIsXG5cdFx0XHR1c2FnZSA9IEJ1ZmZlclVzYWdlLlVuaWZvcm0gfCBCdWZmZXJVc2FnZS5Db3B5RHN0LFxuXHRcdFx0dW5pZm9ybXMsXG5cdFx0XHR1aWQsXG5cdFx0XHRiaW5kaW5nLFxuXHRcdFx0YnVmZmVyLFxuXHRcdFx0YnVmZmVyU2l6ZSxcblx0XHRcdHZpc2liaWxpdHlcblx0XHR9ID0gdW5pZm9ybUJ1ZmZlclBhcmFtcztcblx0XHRjb25zdCB1bmlmb3JtQnVmZmVyID0gbmV3IFVuaWZvcm1CdWZmZXIoe1xuXHRcdFx0bGFiZWw6IHVpZCArIFwiX1VuaWZvcm1CdWZmZXJcIixcblx0XHRcdHR5cGU6IDxCdWZmZXJCaW5kaW5nVHlwZT50eXBlLFxuXHRcdFx0dXNhZ2U6IDxCdWZmZXJVc2FnZT51c2FnZSxcblx0XHRcdGJpbmRpbmcsXG5cdFx0XHRidWZmZXIsXG5cdFx0XHR2aXNpYmlsaXR5LFxuXHRcdFx0c2l6ZTogYnVmZmVyPy5zaXplID8/IGJ1ZmZlclNpemVcblx0XHR9KTtcblx0XHRzaGFkZXJEYXRhLnNldFVuaWZvcm1CdWZmZXIodWlkLCB1bmlmb3JtQnVmZmVyKTtcblx0XHRpZiAoIWJ1ZmZlcikgdGhpcy5hZGRVbmlmb3JtVG9TaGFkZXJEYXRhKHVuaWZvcm1zLCBzaGFkZXJEYXRhLCB1bmlmb3JtQnVmZmVyKTtcblx0fVxuXHRwcml2YXRlIGFkZFVuaWZvcm1Ub1NoYWRlckRhdGEodW5pZm9ybXMsIHNoYWRlckRhdGE6IFNoYWRlckRhdGEsIHVuaWZvcm1CdWZmZXI6IFVuaWZvcm1CdWZmZXIpIHtcblx0XHRpZiAoIXVuaWZvcm1zKSByZXR1cm47XG5cdFx0Y29uc3QgdW5pZm9ybXNOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHVuaWZvcm1zKTtcblx0XHR1bmlmb3Jtc05hbWVzLm1hcCgodW5pZm9ybXNOYW1lKSA9PiB7XG5cdFx0XHRhZGRVbmlmb3JtVG9TaGFkZXJEYXRhKHVuaWZvcm1zTmFtZSwgdW5pZm9ybXNbdW5pZm9ybXNOYW1lXSwgc2hhZGVyRGF0YSwgdW5kZWZpbmVkLCB1bmlmb3JtQnVmZmVyKTtcblx0XHR9KTtcblx0fVxufVxuXG5leHBvcnQgdHlwZSBSZW5kZXJNb2RlbFBhcmFtcyA9IHtcblx0ZGV2aWNlOiBHUFVEZXZpY2U7XG5cdHBhc3NFbmNvZGVyOiBHUFVSZW5kZXJQYXNzRW5jb2Rlcjtcbn07XG5leHBvcnQgdHlwZSBDb21wdXRlTW9kZWxQYXJhbXMgPSB7XG5cdGRldmljZTogR1BVRGV2aWNlO1xuXHRwYXNzRW5jb2RlcjogR1BVQ29tcHV0ZVBhc3NFbmNvZGVyO1xufTtcbiIsImltcG9ydCB7IEludGVybGVhdmVkRmxvYXQzMkF0dHJpYnV0ZSB9IGZyb20gXCIuLi9yZW5kZXIvQXR0cmlidXRlXCI7XHJcbmltcG9ydCBHZW9tZXRyeSBmcm9tIFwiLi9HZW9tZXRyeVwiO1xyXG5leHBvcnQgY2xhc3MgU3ByaXRlR2VvbWV0cnkgZXh0ZW5kcyBHZW9tZXRyeSB7XHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblx0XHRzdXBlcih7XHJcblx0XHRcdHR5cGU6IFwic3ByaXRlR2VvbWV0cnlcIlxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmluaXQoKTtcclxuXHR9XHJcblx0cHJpdmF0ZSBpbml0KCkge1xyXG5cdFx0Ly8geHl644CBdXZcclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gWy0wLjUsIC0wLjUsIDAsIDAsIDAsIDAuNSwgLTAuNSwgMCwgMSwgMCwgMC41LCAwLjUsIDAsIDEsIDEsIC0wLjUsIDAuNSwgMCwgMCwgMV07XHJcblx0XHRjb25zdCBpbmRpY2VzID0gWzAsIDEsIDIsIDAsIDIsIDNdO1xyXG5cdFx0dGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUodmVydGljZXMsIDUpO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUobmV3IEludGVybGVhdmVkRmxvYXQzMkF0dHJpYnV0ZShbXCJwb3NpdGlvblwiLCBcInV2XCJdLCB2ZXJ0aWNlcywgWzMsIDJdKSk7XHJcblx0XHR0aGlzLnNldEluZGljZShpbmRpY2VzKTtcclxuXHRcdHRoaXMuY291bnQgPSBpbmRpY2VzLmxlbmd0aDtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IHsgRnJhbWVTdGF0ZSB9IGZyb20gXCIuLi9jb3JlL0ZyYW1lU3RhdGVcIjtcbmltcG9ydCB0ZXh0dXJlQ2FjaGUgZnJvbSBcIi4uL2NvcmUvVGV4dHVyZUNhY2hlXCI7XG5pbXBvcnQgeyBVbmlmb3JtRW51bSB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVVR5cGVzXCI7XG5pbXBvcnQgeyBNZXNoIH0gZnJvbSBcIi4uL21lc2gvTWVzaFwiO1xuaW1wb3J0IFVuaWZvcm1CdWZmZXIgZnJvbSBcIi4uL3JlbmRlci9Vbmlmb3JtQnVmZmVyXCI7XG5pbXBvcnQgeyBTaGFkZXJTb3VyY2UgfSBmcm9tIFwiLi4vc2hhZGVyL1NoYWRlclNvdXJjZVwiO1xuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tIFwiLi9NYXRlcmlhbFwiO1xuXG5leHBvcnQgY2xhc3MgU3ByaXRlTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy50eXBlID0gXCJzcHJpdGVcIjtcblx0XHR0aGlzLnNoYWRlclNvdXJjZSA9IG5ldyBTaGFkZXJTb3VyY2Uoe1xuXHRcdFx0c2hhZGVySWQ6IHRoaXMudHlwZSxcblx0XHRcdGRlZmluZXM6IHtcblx0XHRcdFx0SEFTX1VWOiB0cnVlXG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0dXBkYXRlKGZyYW1lU3RhdGU/OiBGcmFtZVN0YXRlLCBtZXNoPzogTWVzaCkge1xuXHRcdGlmICghdGhpcy5zaGFkZXJEYXRhIHx8IHRoaXMuZGlydHkpIHRoaXMuY3JlYXRlU2hhZGVyRGF0YShtZXNoKTtcblx0fVxuXHRwcm90ZWN0ZWQgY3JlYXRlU2hhZGVyRGF0YShtZXNoPzogTWVzaCkge1xuXHRcdHN1cGVyLmNyZWF0ZVNoYWRlckRhdGEoKTtcblx0XHRjb25zdCB1bmlmb3JtQnVmZmVyID0gbmV3IFVuaWZvcm1CdWZmZXIoeyBsYWJlbDogXCJzcHJpdGVcIiB9KTtcblx0XHR1bmlmb3JtQnVmZmVyLnNldFVuaWZvcm0oXG5cdFx0XHRcIm1vZGVsTWF0cml4XCIsXG5cdFx0XHQoKSA9PiB7XG5cdFx0XHRcdHJldHVybiBtZXNoLm1vZGVsTWF0cml4O1xuXHRcdFx0fSxcblx0XHRcdFVuaWZvcm1FbnVtLk1hdDRcblx0XHQpO1xuXHRcdHVuaWZvcm1CdWZmZXIuc2V0VW5pZm9ybShcImNvbG9yXCIsIG1lc2gsIFVuaWZvcm1FbnVtLkNvbG9yKTtcblx0XHR1bmlmb3JtQnVmZmVyLnNldFVuaWZvcm0oXCJyb3RhdGlvblwiLCBtZXNoLCBVbmlmb3JtRW51bS5GbG9hdCk7XG5cdFx0dW5pZm9ybUJ1ZmZlci5zZXRVbmlmb3JtKFwiY2VudGVyXCIsIG1lc2gsIFVuaWZvcm1FbnVtLkZsb2F0VmVjMik7XG5cdFx0dW5pZm9ybUJ1ZmZlci5zZXRVbmlmb3JtKFwib3BhY2l0eVwiLCBtZXNoLCBVbmlmb3JtRW51bS5GbG9hdCk7XG5cdFx0dGhpcy5zaGFkZXJEYXRhLnNldFVuaWZvcm1CdWZmZXIoXCJzcHJpdGVcIiwgdW5pZm9ybUJ1ZmZlcik7XG5cdFx0aWYgKHRoaXMuYmFzZVRleHR1cmUpIHtcblx0XHRcdHRoaXMuc2hhZGVyRGF0YS5zZXREZWZpbmUoXCJVU0VfQ09MT1JURVhUVVJFXCIsIHRydWUpO1xuXHRcdFx0dGhpcy5zaGFkZXJEYXRhLnNldFRleHR1cmUoXCJiYXNlQ29sb3JUZXh0dXJlXCIsIHRoaXMuYmFzZVRleHR1cmUpO1xuXHRcdFx0dGhpcy5zaGFkZXJEYXRhLnNldFNhbXBsZXIoXCJiYXNlQ29sb3JTYW1wbGVyXCIsIHRoaXMuYmFzZVNhbXBsZXIgfHwgdGV4dHVyZUNhY2hlLmRlZmF1bHRTYW1wbGVyKTtcblx0XHR9XG5cdH1cblx0ZGVzdHJveSgpIHtcblx0XHR0aGlzPy5iYXNlVGV4dHVyZT8uZGVzdHJveSgpO1xuXHRcdHN1cGVyLmRlc3Ryb3koKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgU3ByaXRlR2VvbWV0cnkgfSBmcm9tIFwiLi4vZ2VvbWV0cnkvU3ByaXRlR2VvbWV0cnlcIjtcbmltcG9ydCB7IFNwcml0ZU1hdGVyaWFsIH0gZnJvbSBcIi4uL21hdGVyaWFsL1Nwcml0ZU1hdGVyaWFsXCI7XG5pbXBvcnQgQ29sb3IgZnJvbSBcIi4uL21hdGgvQ29sb3JcIjtcbmltcG9ydCBWZWN0b3IyIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJcIjtcbmltcG9ydCBTYW1wbGVyIGZyb20gXCIuLi9yZW5kZXIvU2FtcGxlclwiO1xuaW1wb3J0IFRleHR1cmUgZnJvbSBcIi4uL3JlbmRlci9UZXh0dXJlXCI7XG5pbXBvcnQgeyBNZXNoIH0gZnJvbSBcIi4vTWVzaFwiO1xuXG5leHBvcnQgY2xhc3MgU3ByaXRlIGV4dGVuZHMgTWVzaCB7XG5cdHB1YmxpYyByb3RhdGlvbjogbnVtYmVyO1xuXHRwdWJsaWMgY2VudGVyOiBWZWN0b3IyO1xuXHRwdWJsaWMgY29sb3I6IENvbG9yO1xuXHRwdWJsaWMgb3BhY2l0eTogbnVtYmVyO1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMubWF0ZXJpYWwgPSBuZXcgU3ByaXRlTWF0ZXJpYWwoKTtcblx0XHR0aGlzLmdlb21ldHJ5ID0gbmV3IFNwcml0ZUdlb21ldHJ5KCk7XG5cdFx0dGhpcy5yb3RhdGlvbiA9IE1hdGguUEk7XG5cdFx0dGhpcy5vcGFjaXR5ID0gMTtcblx0XHR0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKDAsIDApO1xuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoMSwgMCwgMCk7XG5cdH1cblx0c2V0VGV4dHVyZSh0ZXh0dXJlOiBUZXh0dXJlKSB7XG5cdFx0dGhpcy5tYXRlcmlhbC5iYXNlVGV4dHVyZSA9IHRleHR1cmU7XG5cdH1cblx0c2V0U2FtcGxlcihzYW1wbGVyOiBTYW1wbGVyKSB7XG5cdFx0dGhpcy5tYXRlcmlhbC5iYXNlU2FtcGxlciA9IHNhbXBsZXI7XG5cdH1cbn1cbiIsIi8qKlxyXG4gKiBFbnN1cmUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIHRvIHRoZSBwcmltaXRpdmUgZnVuY3Rpb25zIGlzIGFuIG9iamVjdFxyXG4gKiBAcGFyYW0gey4uLip9IGFyZ3NcclxuICovXHJcbmZ1bmN0aW9uIGNoZWNrQXJndW1lbnRzKGFyZ3MpIHtcclxuXHRjb25zdCBhcmd1bWVudFR5cGUgPSB0eXBlb2YgYXJnc1swXTtcclxuXHRpZiAoYXJndW1lbnRUeXBlICE9PSBcIm9iamVjdFwiICYmIGFyZ3VtZW50VHlwZSAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG5cdFx0Y29uc29sZS5lcnJvcihcIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYW4gb2JqZWN0LlwiKTtcclxuXHR9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxubGV0IFRZUEVEX0FSUkFZX1RZUEU7XHJcblxyXG4vKipcclxuICogU2VsZWN0IGNlbGxzIHR5cGVkIGFycmF5IGZyb20gYSBzaXplIGRldGVybWluZWQgYnkgYW1vdW50IG9mIHZlcnRpY2VzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBUaGUgbWF4IHZhbHVlIGV4cGVjdGVkXHJcbiAqIEByZXR1cm5zIHsoVWludDhBcnJheXxVaW50MTZBcnJheXxVaW50MzJBcnJheSl9XHJcbiAqIEBzZWUgW01ETiBUeXBlZEFycmF5IG9iamVjdHNde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1R5cGVkQXJyYXkjdHlwZWRhcnJheV9vYmplY3RzfVxyXG4gKi9cclxuY29uc3QgZ2V0Q2VsbHNUeXBlZEFycmF5ID0gKHNpemUpID0+XHJcblx0VFlQRURfQVJSQVlfVFlQRSB8fCAoc2l6ZSA8PSAyNTUgPyBVaW50OEFycmF5IDogc2l6ZSA8PSA2NTUzNSA/IFVpbnQxNkFycmF5IDogVWludDMyQXJyYXkpO1xyXG5cclxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jb25zdCBQTEFORV9ESVJFQ1RJT05TID0ge1xyXG5cdHo6IFswLCAxLCAyLCAxLCAtMSwgMV0sXHJcblx0XCItelwiOiBbMCwgMSwgMiwgLTEsIC0xLCAtMV0sXHJcblx0XCIteFwiOiBbMiwgMSwgMCwgMSwgLTEsIC0xXSxcclxuXHR4OiBbMiwgMSwgMCwgLTEsIC0xLCAxXSxcclxuXHR5OiBbMCwgMiwgMSwgMSwgMSwgMV0sXHJcblx0XCIteVwiOiBbMCwgMiwgMSwgMSwgLTEsIC0xXVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBjb21wdXRlUGxhbmUoXHJcblx0Z2VvbWV0cnksXHJcblx0aW5kaWNlcyxcclxuXHRzdSxcclxuXHRzdixcclxuXHRudSxcclxuXHRudixcclxuXHRkaXJlY3Rpb24gPSBcInpcIixcclxuXHRwdyA9IDAsXHJcblx0cXVhZHMgPSBmYWxzZSxcclxuXHR1dlNjYWxlID0gWzEsIDFdLFxyXG5cdHV2T2Zmc2V0ID0gWzAsIDBdLFxyXG5cdGNlbnRlciA9IFswLCAwLCAwXSxcclxuXHRjY3cgPSB0cnVlXHJcbikge1xyXG5cdGNvbnN0IHsgcG9zaXRpb25zLCBub3JtYWxzLCB1dnMsIGNlbGxzIH0gPSBnZW9tZXRyeTtcclxuXHRjb25zdCBbdSwgdiwgdywgZmxpcFUsIGZsaXBWLCBub3JtYWxdID0gUExBTkVfRElSRUNUSU9OU1tkaXJlY3Rpb25dO1xyXG5cclxuXHRjb25zdCB2ZXJ0ZXhPZmZzZXQgPSBpbmRpY2VzLnZlcnRleDtcclxuXHJcblx0Zm9yIChsZXQgaiA9IDA7IGogPD0gbnY7IGorKykge1xyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPD0gbnU7IGkrKykge1xyXG5cdFx0XHRwb3NpdGlvbnNbaW5kaWNlcy52ZXJ0ZXggKiAzICsgdV0gPSAoLXN1IC8gMiArIChpICogc3UpIC8gbnUpICogZmxpcFUgKyBjZW50ZXJbdV07XHJcblx0XHRcdHBvc2l0aW9uc1tpbmRpY2VzLnZlcnRleCAqIDMgKyB2XSA9ICgtc3YgLyAyICsgKGogKiBzdikgLyBudikgKiBmbGlwViArIGNlbnRlclt2XTtcclxuXHRcdFx0cG9zaXRpb25zW2luZGljZXMudmVydGV4ICogMyArIHddID0gcHcgKyBjZW50ZXJbd107XHJcblxyXG5cdFx0XHRub3JtYWxzW2luZGljZXMudmVydGV4ICogMyArIHddID0gbm9ybWFsO1xyXG5cclxuXHRcdFx0dXZzW2luZGljZXMudmVydGV4ICogMl0gPSAoaSAvIG51KSAqIHV2U2NhbGVbMF0gKyB1dk9mZnNldFswXTtcclxuXHRcdFx0dXZzW2luZGljZXMudmVydGV4ICogMiArIDFdID0gKDEgLSBqIC8gbnYpICogdXZTY2FsZVsxXSArIHV2T2Zmc2V0WzFdO1xyXG5cclxuXHRcdFx0aW5kaWNlcy52ZXJ0ZXgrKztcclxuXHJcblx0XHRcdGlmIChqIDwgbnYgJiYgaSA8IG51KSB7XHJcblx0XHRcdFx0Y29uc3QgbiA9IHZlcnRleE9mZnNldCArIGogKiAobnUgKyAxKSArIGk7XHJcblx0XHRcdFx0aWYgKHF1YWRzKSB7XHJcblx0XHRcdFx0XHRjb25zdCBvID0gdmVydGV4T2Zmc2V0ICsgKGogKyAxKSAqIChudSArIDEpICsgaTtcclxuXHRcdFx0XHRcdGNlbGxzW2luZGljZXMuY2VsbF0gPSBuO1xyXG5cdFx0XHRcdFx0Y2VsbHNbaW5kaWNlcy5jZWxsICsgMV0gPSBvO1xyXG5cdFx0XHRcdFx0Y2VsbHNbaW5kaWNlcy5jZWxsICsgMl0gPSBvICsgMTtcclxuXHRcdFx0XHRcdGNlbGxzW2luZGljZXMuY2VsbCArIDNdID0gbiArIDE7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGNlbGxzW2luZGljZXMuY2VsbF0gPSBuO1xyXG5cdFx0XHRcdFx0Y2VsbHNbaW5kaWNlcy5jZWxsICsgKGNjdyA/IDEgOiAyKV0gPSBuICsgbnUgKyAxO1xyXG5cdFx0XHRcdFx0Y2VsbHNbaW5kaWNlcy5jZWxsICsgKGNjdyA/IDIgOiAxKV0gPSBuICsgbnUgKyAyO1xyXG5cclxuXHRcdFx0XHRcdGNlbGxzW2luZGljZXMuY2VsbCArIDNdID0gbjtcclxuXHRcdFx0XHRcdGNlbGxzW2luZGljZXMuY2VsbCArIChjY3cgPyA0IDogNSldID0gbiArIG51ICsgMjtcclxuXHRcdFx0XHRcdGNlbGxzW2luZGljZXMuY2VsbCArIChjY3cgPyA1IDogNCldID0gbiArIDE7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGluZGljZXMuY2VsbCArPSBxdWFkcyA/IDQgOiA2O1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZ2VvbWV0cnk7XHJcbn1cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEN1YmVPcHRpb25zXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbc3g9MV1cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzeT1zeF1cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzej1zeF1cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtueD0xXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW255PW54XVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW256PW54XVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUN1YmUoeyBzeCA9IDEsIHN5ID0gMSwgc3ogPSAxLCBueCA9IDEsIG55ID0gMSwgbnogPSAxIH0gPSB7fSkge1xyXG5cdGNoZWNrQXJndW1lbnRzKGFyZ3VtZW50cyk7XHJcblxyXG5cdGNvbnN0IHNpemUgPSAobnggKyAxKSAqIChueSArIDEpICogMiArIChueCArIDEpICogKG56ICsgMSkgKiAyICsgKG56ICsgMSkgKiAobnkgKyAxKSAqIDI7XHJcblxyXG5cdGNvbnN0IGdlb21ldHJ5ID0ge1xyXG5cdFx0cG9zaXRpb25zOiBuZXcgRmxvYXQzMkFycmF5KHNpemUgKiAzKSxcclxuXHRcdG5vcm1hbHM6IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSAqIDMpLFxyXG5cdFx0dXZzOiBuZXcgRmxvYXQzMkFycmF5KHNpemUgKiAyKSxcclxuXHRcdGNlbGxzOiBuZXcgKGdldENlbGxzVHlwZWRBcnJheShzaXplKSkoKG54ICogbnkgKiAyICsgbnggKiBueiAqIDIgKyBueiAqIG55ICogMikgKiA2KVxyXG5cdH07XHJcblxyXG5cdGNvbnN0IGhhbGZTWCA9IHN4ICogMC41O1xyXG5cdGNvbnN0IGhhbGZTWSA9IHN5ICogMC41O1xyXG5cdGNvbnN0IGhhbGZTWiA9IHN6ICogMC41O1xyXG5cclxuXHRjb25zdCBpbmRpY2VzID0geyB2ZXJ0ZXg6IDAsIGNlbGw6IDAgfTtcclxuXHJcblx0Y29tcHV0ZVBsYW5lKGdlb21ldHJ5LCBpbmRpY2VzLCBzeCwgc3ksIG54LCBueSwgXCJ6XCIsIGhhbGZTWik7XHJcblx0Y29tcHV0ZVBsYW5lKGdlb21ldHJ5LCBpbmRpY2VzLCBzeCwgc3ksIG54LCBueSwgXCItelwiLCAtaGFsZlNaKTtcclxuXHRjb21wdXRlUGxhbmUoZ2VvbWV0cnksIGluZGljZXMsIHN6LCBzeSwgbnosIG55LCBcIi14XCIsIC1oYWxmU1gpO1xyXG5cdGNvbXB1dGVQbGFuZShnZW9tZXRyeSwgaW5kaWNlcywgc3osIHN5LCBueiwgbnksIFwieFwiLCBoYWxmU1gpO1xyXG5cdGNvbXB1dGVQbGFuZShnZW9tZXRyeSwgaW5kaWNlcywgc3gsIHN6LCBueCwgbnosIFwieVwiLCBoYWxmU1kpO1xyXG5cdGNvbXB1dGVQbGFuZShnZW9tZXRyeSwgaW5kaWNlcywgc3gsIHN6LCBueCwgbnosIFwiLXlcIiwgLWhhbGZTWSk7XHJcblxyXG5cdHJldHVybiBnZW9tZXRyeTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJveChvcHRpb25zKSB7XHJcblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XHJcblxyXG5cdGNvbnN0IGRpbWVuc2lvbnMgPSBvcHRpb25zLmRpbWVuc2lvbnMgfHwgWzEsIDEsIDFdO1xyXG5cdGNvbnN0IHBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiB8fCBbLWRpbWVuc2lvbnNbMF0gLyAyLCAtZGltZW5zaW9uc1sxXSAvIDIsIC1kaW1lbnNpb25zWzJdIC8gMl07XHJcblx0Y29uc3QgeCA9IHBvc2l0aW9uWzBdO1xyXG5cdGNvbnN0IHkgPSBwb3NpdGlvblsxXTtcclxuXHRjb25zdCB6ID0gcG9zaXRpb25bMl07XHJcblx0Y29uc3Qgd2lkdGggPSBkaW1lbnNpb25zWzBdO1xyXG5cdGNvbnN0IGhlaWdodCA9IGRpbWVuc2lvbnNbMV07XHJcblx0Y29uc3QgZGVwdGggPSBkaW1lbnNpb25zWzJdO1xyXG5cclxuXHRjb25zdCBmYmwgPSB7IHg6IHgsIHk6IHksIHo6IHogKyBkZXB0aCB9O1xyXG5cdGNvbnN0IGZiciA9IHsgeDogeCArIHdpZHRoLCB5OiB5LCB6OiB6ICsgZGVwdGggfTtcclxuXHRjb25zdCBmdGwgPSB7IHg6IHgsIHk6IHkgKyBoZWlnaHQsIHo6IHogKyBkZXB0aCB9O1xyXG5cdGNvbnN0IGZ0ciA9IHsgeDogeCArIHdpZHRoLCB5OiB5ICsgaGVpZ2h0LCB6OiB6ICsgZGVwdGggfTtcclxuXHRjb25zdCBiYmwgPSB7IHg6IHgsIHk6IHksIHo6IHogfTtcclxuXHRjb25zdCBiYnIgPSB7IHg6IHggKyB3aWR0aCwgeTogeSwgejogeiB9O1xyXG5cdGNvbnN0IGJ0bCA9IHsgeDogeCwgeTogeSArIGhlaWdodCwgejogeiB9O1xyXG5cdGNvbnN0IGJ0ciA9IHsgeDogeCArIHdpZHRoLCB5OiB5ICsgaGVpZ2h0LCB6OiB6IH07XHJcblxyXG5cdGNvbnN0IHBvc2l0aW9ucyA9IFtcclxuXHRcdC8vIGZyb250XHJcblx0XHRmYmwueCxcclxuXHRcdGZibC55LFxyXG5cdFx0ZmJsLnosXHJcblx0XHRmYnIueCxcclxuXHRcdGZici55LFxyXG5cdFx0ZmJyLnosXHJcblx0XHRmdGwueCxcclxuXHRcdGZ0bC55LFxyXG5cdFx0ZnRsLnosXHJcblx0XHRmdGwueCxcclxuXHRcdGZ0bC55LFxyXG5cdFx0ZnRsLnosXHJcblx0XHRmYnIueCxcclxuXHRcdGZici55LFxyXG5cdFx0ZmJyLnosXHJcblx0XHRmdHIueCxcclxuXHRcdGZ0ci55LFxyXG5cdFx0ZnRyLnosXHJcblxyXG5cdFx0Ly8gcmlnaHRcclxuXHRcdGZici54LFxyXG5cdFx0ZmJyLnksXHJcblx0XHRmYnIueixcclxuXHRcdGJici54LFxyXG5cdFx0YmJyLnksXHJcblx0XHRiYnIueixcclxuXHRcdGZ0ci54LFxyXG5cdFx0ZnRyLnksXHJcblx0XHRmdHIueixcclxuXHRcdGZ0ci54LFxyXG5cdFx0ZnRyLnksXHJcblx0XHRmdHIueixcclxuXHRcdGJici54LFxyXG5cdFx0YmJyLnksXHJcblx0XHRiYnIueixcclxuXHRcdGJ0ci54LFxyXG5cdFx0YnRyLnksXHJcblx0XHRidHIueixcclxuXHJcblx0XHQvLyBiYWNrXHJcblx0XHRmYnIueCxcclxuXHRcdGJici55LFxyXG5cdFx0YmJyLnosXHJcblx0XHRiYmwueCxcclxuXHRcdGJibC55LFxyXG5cdFx0YmJsLnosXHJcblx0XHRidHIueCxcclxuXHRcdGJ0ci55LFxyXG5cdFx0YnRyLnosXHJcblx0XHRidHIueCxcclxuXHRcdGJ0ci55LFxyXG5cdFx0YnRyLnosXHJcblx0XHRiYmwueCxcclxuXHRcdGJibC55LFxyXG5cdFx0YmJsLnosXHJcblx0XHRidGwueCxcclxuXHRcdGJ0bC55LFxyXG5cdFx0YnRsLnosXHJcblxyXG5cdFx0Ly8gbGVmdFxyXG5cdFx0YmJsLngsXHJcblx0XHRiYmwueSxcclxuXHRcdGJibC56LFxyXG5cdFx0ZmJsLngsXHJcblx0XHRmYmwueSxcclxuXHRcdGZibC56LFxyXG5cdFx0YnRsLngsXHJcblx0XHRidGwueSxcclxuXHRcdGJ0bC56LFxyXG5cdFx0YnRsLngsXHJcblx0XHRidGwueSxcclxuXHRcdGJ0bC56LFxyXG5cdFx0ZmJsLngsXHJcblx0XHRmYmwueSxcclxuXHRcdGZibC56LFxyXG5cdFx0ZnRsLngsXHJcblx0XHRmdGwueSxcclxuXHRcdGZ0bC56LFxyXG5cclxuXHRcdC8vIHRvcFxyXG5cdFx0ZnRsLngsXHJcblx0XHRmdGwueSxcclxuXHRcdGZ0bC56LFxyXG5cdFx0ZnRyLngsXHJcblx0XHRmdHIueSxcclxuXHRcdGZ0ci56LFxyXG5cdFx0YnRsLngsXHJcblx0XHRidGwueSxcclxuXHRcdGJ0bC56LFxyXG5cdFx0YnRsLngsXHJcblx0XHRidGwueSxcclxuXHRcdGJ0bC56LFxyXG5cdFx0ZnRyLngsXHJcblx0XHRmdHIueSxcclxuXHRcdGZ0ci56LFxyXG5cdFx0YnRyLngsXHJcblx0XHRidHIueSxcclxuXHRcdGJ0ci56LFxyXG5cclxuXHRcdC8vIGJvdHRvbVxyXG5cdFx0YmJsLngsXHJcblx0XHRiYmwueSxcclxuXHRcdGJibC56LFxyXG5cdFx0YmJyLngsXHJcblx0XHRiYnIueSxcclxuXHRcdGJici56LFxyXG5cdFx0ZmJsLngsXHJcblx0XHRmYmwueSxcclxuXHRcdGZibC56LFxyXG5cdFx0ZmJsLngsXHJcblx0XHRmYmwueSxcclxuXHRcdGZibC56LFxyXG5cdFx0YmJyLngsXHJcblx0XHRiYnIueSxcclxuXHRcdGJici56LFxyXG5cdFx0ZmJyLngsXHJcblx0XHRmYnIueSxcclxuXHRcdGZici56XHJcblx0XTtcclxuXHJcblx0Y29uc3QgdXZzID0gW1xyXG5cdFx0Ly8gZnJvbnRcclxuXHRcdDAsIDAsIDEsIDAsIDAsIDEsIDAsIDEsIDEsIDAsIDEsIDEsXHJcblxyXG5cdFx0Ly8gcmlnaHRcclxuXHRcdDAsIDAsIDEsIDAsIDAsIDEsIDAsIDEsIDEsIDAsIDEsIDEsXHJcblxyXG5cdFx0Ly8gYmFja1xyXG5cdFx0MCwgMCwgMSwgMCwgMCwgMSwgMCwgMSwgMSwgMCwgMSwgMSxcclxuXHJcblx0XHQvLyBsZWZ0XHJcblx0XHQwLCAwLCAxLCAwLCAwLCAxLCAwLCAxLCAxLCAwLCAxLCAxLFxyXG5cclxuXHRcdC8vIHRvcFxyXG5cdFx0MCwgMCwgMSwgMCwgMCwgMSwgMCwgMSwgMSwgMCwgMSwgMSxcclxuXHJcblx0XHQvLyBib3R0b21cclxuXHRcdDAsIDAsIDEsIDAsIDAsIDEsIDAsIDEsIDEsIDAsIDEsIDFcclxuXHRdO1xyXG5cclxuXHRjb25zdCBub3JtYWxzID0gW1xyXG5cdFx0Ly8gZnJvbnRcclxuXHRcdDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDEsXHJcblxyXG5cdFx0Ly8gcmlnaHRcclxuXHRcdDEsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsXHJcblxyXG5cdFx0Ly8gYmFja1xyXG5cdFx0MCwgMCwgLTEsIDAsIDAsIC0xLCAwLCAwLCAtMSwgMCwgMCwgLTEsIDAsIDAsIC0xLCAwLCAwLCAtMSxcclxuXHJcblx0XHQvLyBsZWZ0XHJcblx0XHQtMSwgMCwgMCwgLTEsIDAsIDAsIC0xLCAwLCAwLCAtMSwgMCwgMCwgLTEsIDAsIDAsIC0xLCAwLCAwLFxyXG5cclxuXHRcdC8vIHRvcFxyXG5cdFx0MCwgMSwgMCwgMCwgMSwgMCwgMCwgMSwgMCwgMCwgMSwgMCwgMCwgMSwgMCwgMCwgMSwgMCxcclxuXHJcblx0XHQvLyBib3R0b21cclxuXHRcdDAsIC0xLCAwLCAwLCAtMSwgMCwgMCwgLTEsIDAsIDAsIC0xLCAwLCAwLCAtMSwgMCwgMCwgLTEsIDBcclxuXHRdO1xyXG5cdHJldHVybiB7XHJcblx0XHRwb3NpdGlvbnM6IHBvc2l0aW9ucyxcclxuXHRcdG5vcm1hbHM6IG5vcm1hbHMsXHJcblx0XHR1dnM6IHV2c1xyXG5cdH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTcGhlcmUob3B0aW9ucykge1xyXG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xyXG5cclxuXHRjb25zdCBsb25nQmFuZHMgPSBvcHRpb25zLmxvbmdCYW5kcyB8fCAzMjtcclxuXHRjb25zdCBsYXRCYW5kcyA9IG9wdGlvbnMubGF0QmFuZHMgfHwgMzI7XHJcblx0Y29uc3QgcmFkaXVzID0gb3B0aW9ucy5yYWRpdXMgfHwgMTtcclxuXHRjb25zdCBsYXRfc3RlcCA9IE1hdGguUEkgLyBsYXRCYW5kcztcclxuXHRjb25zdCBsb25nX3N0ZXAgPSAoMiAqIE1hdGguUEkpIC8gbG9uZ0JhbmRzO1xyXG5cdGNvbnN0IG51bV9wb3NpdGlvbnMgPSBsb25nQmFuZHMgKiBsYXRCYW5kcyAqIDQ7XHJcblx0Y29uc3QgbnVtX2luZGljZXMgPSBsb25nQmFuZHMgKiBsYXRCYW5kcyAqIDY7XHJcblx0bGV0IGxhdF9hbmdsZSwgbG9uZ19hbmdsZTtcclxuXHRjb25zdCBwb3NpdGlvbnMgPSBuZXcgQXJyYXkobnVtX3Bvc2l0aW9ucyAqIDMpO1xyXG5cdGNvbnN0IG5vcm1hbHMgPSBuZXcgQXJyYXkobnVtX3Bvc2l0aW9ucyAqIDMpO1xyXG5cdGNvbnN0IHV2cyA9IG5ldyBBcnJheShudW1fcG9zaXRpb25zICogMik7XHJcblx0Y29uc3QgaW5kaWNlcyA9IG5ldyBBcnJheShudW1faW5kaWNlcyk7XHJcblx0bGV0IHgxLCB4MiwgeDMsIHg0LCB5MSwgeTIsIHoxLCB6MiwgejMsIHo0LCB1MSwgdTIsIHYxLCB2MjtcclxuXHRsZXQgaSwgajtcclxuXHRsZXQgayA9IDAsXHJcblx0XHRsID0gMDtcclxuXHRsZXQgdmksIHRpO1xyXG5cclxuXHRmb3IgKGkgPSAwOyBpIDwgbGF0QmFuZHM7IGkrKykge1xyXG5cdFx0bGF0X2FuZ2xlID0gaSAqIGxhdF9zdGVwO1xyXG5cdFx0eTEgPSBNYXRoLmNvcyhsYXRfYW5nbGUpO1xyXG5cdFx0eTIgPSBNYXRoLmNvcyhsYXRfYW5nbGUgKyBsYXRfc3RlcCk7XHJcblx0XHRmb3IgKGogPSAwOyBqIDwgbG9uZ0JhbmRzOyBqKyspIHtcclxuXHRcdFx0bG9uZ19hbmdsZSA9IGogKiBsb25nX3N0ZXA7XHJcblx0XHRcdHgxID0gTWF0aC5zaW4obGF0X2FuZ2xlKSAqIE1hdGguY29zKGxvbmdfYW5nbGUpO1xyXG5cdFx0XHR4MiA9IE1hdGguc2luKGxhdF9hbmdsZSkgKiBNYXRoLmNvcyhsb25nX2FuZ2xlICsgbG9uZ19zdGVwKTtcclxuXHRcdFx0eDMgPSBNYXRoLnNpbihsYXRfYW5nbGUgKyBsYXRfc3RlcCkgKiBNYXRoLmNvcyhsb25nX2FuZ2xlKTtcclxuXHRcdFx0eDQgPSBNYXRoLnNpbihsYXRfYW5nbGUgKyBsYXRfc3RlcCkgKiBNYXRoLmNvcyhsb25nX2FuZ2xlICsgbG9uZ19zdGVwKTtcclxuXHRcdFx0ejEgPSBNYXRoLnNpbihsYXRfYW5nbGUpICogTWF0aC5zaW4obG9uZ19hbmdsZSk7XHJcblx0XHRcdHoyID0gTWF0aC5zaW4obGF0X2FuZ2xlKSAqIE1hdGguc2luKGxvbmdfYW5nbGUgKyBsb25nX3N0ZXApO1xyXG5cdFx0XHR6MyA9IE1hdGguc2luKGxhdF9hbmdsZSArIGxhdF9zdGVwKSAqIE1hdGguc2luKGxvbmdfYW5nbGUpO1xyXG5cdFx0XHR6NCA9IE1hdGguc2luKGxhdF9hbmdsZSArIGxhdF9zdGVwKSAqIE1hdGguc2luKGxvbmdfYW5nbGUgKyBsb25nX3N0ZXApO1xyXG5cdFx0XHR1MSA9IDEgLSBqIC8gbG9uZ0JhbmRzO1xyXG5cdFx0XHR1MiA9IDEgLSAoaiArIDEpIC8gbG9uZ0JhbmRzO1xyXG5cdFx0XHR2MSA9IDEgLSBpIC8gbGF0QmFuZHM7XHJcblx0XHRcdHYyID0gMSAtIChpICsgMSkgLyBsYXRCYW5kcztcclxuXHRcdFx0dmkgPSBrICogMztcclxuXHRcdFx0dGkgPSBrICogMjtcclxuXHJcblx0XHRcdHBvc2l0aW9uc1t2aV0gPSB4MSAqIHJhZGl1cztcclxuXHRcdFx0cG9zaXRpb25zW3ZpICsgMV0gPSB5MSAqIHJhZGl1cztcclxuXHRcdFx0cG9zaXRpb25zW3ZpICsgMl0gPSB6MSAqIHJhZGl1czsgLy8gdjBcclxuXHJcblx0XHRcdHBvc2l0aW9uc1t2aSArIDNdID0geDIgKiByYWRpdXM7XHJcblx0XHRcdHBvc2l0aW9uc1t2aSArIDRdID0geTEgKiByYWRpdXM7XHJcblx0XHRcdHBvc2l0aW9uc1t2aSArIDVdID0gejIgKiByYWRpdXM7IC8vIHYxXHJcblxyXG5cdFx0XHRwb3NpdGlvbnNbdmkgKyA2XSA9IHgzICogcmFkaXVzO1xyXG5cdFx0XHRwb3NpdGlvbnNbdmkgKyA3XSA9IHkyICogcmFkaXVzO1xyXG5cdFx0XHRwb3NpdGlvbnNbdmkgKyA4XSA9IHozICogcmFkaXVzOyAvLyB2MlxyXG5cclxuXHRcdFx0cG9zaXRpb25zW3ZpICsgOV0gPSB4NCAqIHJhZGl1cztcclxuXHRcdFx0cG9zaXRpb25zW3ZpICsgMTBdID0geTIgKiByYWRpdXM7XHJcblx0XHRcdHBvc2l0aW9uc1t2aSArIDExXSA9IHo0ICogcmFkaXVzOyAvLyB2M1xyXG5cclxuXHRcdFx0bm9ybWFsc1t2aV0gPSB4MTtcclxuXHRcdFx0bm9ybWFsc1t2aSArIDFdID0geTE7XHJcblx0XHRcdG5vcm1hbHNbdmkgKyAyXSA9IHoxO1xyXG5cclxuXHRcdFx0bm9ybWFsc1t2aSArIDNdID0geDI7XHJcblx0XHRcdG5vcm1hbHNbdmkgKyA0XSA9IHkxO1xyXG5cdFx0XHRub3JtYWxzW3ZpICsgNV0gPSB6MjtcclxuXHJcblx0XHRcdG5vcm1hbHNbdmkgKyA2XSA9IHgzO1xyXG5cdFx0XHRub3JtYWxzW3ZpICsgN10gPSB5MjtcclxuXHRcdFx0bm9ybWFsc1t2aSArIDhdID0gejM7XHJcblxyXG5cdFx0XHRub3JtYWxzW3ZpICsgOV0gPSB4NDtcclxuXHRcdFx0bm9ybWFsc1t2aSArIDEwXSA9IHkyO1xyXG5cdFx0XHRub3JtYWxzW3ZpICsgMTFdID0gejQ7XHJcblxyXG5cdFx0XHR1dnNbdGldID0gdTE7XHJcblx0XHRcdHV2c1t0aSArIDFdID0gdjE7XHJcblxyXG5cdFx0XHR1dnNbdGkgKyAyXSA9IHUyO1xyXG5cdFx0XHR1dnNbdGkgKyAzXSA9IHYxO1xyXG5cclxuXHRcdFx0dXZzW3RpICsgNF0gPSB1MTtcclxuXHRcdFx0dXZzW3RpICsgNV0gPSB2MjtcclxuXHJcblx0XHRcdHV2c1t0aSArIDZdID0gdTI7XHJcblx0XHRcdHV2c1t0aSArIDddID0gdjI7XHJcblxyXG5cdFx0XHRpbmRpY2VzW2xdID0gaztcclxuXHRcdFx0aW5kaWNlc1tsICsgMV0gPSBrICsgMTtcclxuXHRcdFx0aW5kaWNlc1tsICsgMl0gPSBrICsgMjtcclxuXHRcdFx0aW5kaWNlc1tsICsgM10gPSBrICsgMjtcclxuXHRcdFx0aW5kaWNlc1tsICsgNF0gPSBrICsgMTtcclxuXHRcdFx0aW5kaWNlc1tsICsgNV0gPSBrICsgMztcclxuXHJcblx0XHRcdGsgKz0gNDtcclxuXHRcdFx0bCArPSA2O1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHRcdHBvc2l0aW9uczogcG9zaXRpb25zLFxyXG5cdFx0bm9ybWFsczogbm9ybWFscyxcclxuXHRcdHV2czogdXZzLFxyXG5cdFx0aW5kaWNlczogaW5kaWNlc1xyXG5cdH07XHJcbn1cclxuIiwiaW1wb3J0IHsgRmxvYXQzMkF0dHJpYnV0ZSB9IGZyb20gXCIuLi9yZW5kZXIvQXR0cmlidXRlXCI7XHJcbmltcG9ydCB7IGNyZWF0ZVNwaGVyZSB9IGZyb20gXCIuLi91dGlscy9HZW9tZXRyeVV0aWxzXCI7XHJcbmltcG9ydCBHZW9tZXRyeSBmcm9tIFwiLi9HZW9tZXRyeVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3BoZXJlR2VvbWV0cnkgZXh0ZW5kcyBHZW9tZXRyeSB7XHJcblx0cmFkaXVzOiBudW1iZXI7XHJcblx0Y29uc3RydWN0b3IocmFkaXVzOiBudW1iZXIpIHtcclxuXHRcdHN1cGVyKHtcclxuXHRcdFx0dHlwZTogXCJzcGhlcmVHZW9tZXRyeVwiXHJcblx0XHR9KTtcclxuXHRcdHRoaXMuZGVmaW5lcyA9IHtcclxuXHRcdFx0SEFTX05PUk1BTDogdHJ1ZVxyXG5cdFx0fTtcclxuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xyXG5cdFx0dGhpcy5pbml0KCk7XHJcblx0fVxyXG5cdHByaXZhdGUgaW5pdCgpIHtcclxuXHRcdGNvbnN0IHsgcG9zaXRpb25zLCBub3JtYWxzLCB1dnMsIGluZGljZXMgfSA9IGNyZWF0ZVNwaGVyZSh7IHJhZGl1czogdGhpcy5yYWRpdXMgfSk7XHJcblx0XHQvLyB0aGlzLnBvc2l0aW9ucyA9IHBvc2l0aW9ucztcclxuXHRcdC8vIHRoaXMubm9ybWFscyA9IG5vcm1hbHM7XHJcblx0XHQvLyB0aGlzLnV2cyA9IHV2cztcclxuXHRcdC8vIHRoaXMuaW5kaWNlcyA9IGluZGljZXM7XHJcblx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZShwb3NpdGlvbnMpO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUobmV3IEZsb2F0MzJBdHRyaWJ1dGUoXCJwb3NpdGlvblwiLCBwb3NpdGlvbnMsIDMpKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKG5ldyBGbG9hdDMyQXR0cmlidXRlKFwibm9ybWFsXCIsIG5vcm1hbHMsIDMpKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKG5ldyBGbG9hdDMyQXR0cmlidXRlKFwidXZcIiwgdXZzLCAyKSk7XHJcblxyXG5cdFx0dGhpcy5zZXRJbmRpY2UoaW5kaWNlcyk7XHJcblx0XHR0aGlzLmNvdW50ID0gaW5kaWNlcy5sZW5ndGg7XHJcblx0fVxyXG59XHJcbiIsImltcG9ydCB7IEZsb2F0MzJBdHRyaWJ1dGUgfSBmcm9tIFwiLi4vcmVuZGVyL0F0dHJpYnV0ZVwiO1xyXG5pbXBvcnQgeyBjcmVhdGVCb3ggfSBmcm9tIFwiLi4vdXRpbHMvR2VvbWV0cnlVdGlsc1wiO1xyXG5pbXBvcnQgR2VvbWV0cnkgZnJvbSBcIi4vR2VvbWV0cnlcIjtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQm94R2VvbWV0cnkgZXh0ZW5kcyBHZW9tZXRyeSB7XHJcblx0Y29uc3RydWN0b3IocHVibGljIHdpZHRoOiBudW1iZXIgPSAxMCwgcHVibGljIGhlaWdodDogbnVtYmVyID0gMTAsIHB1YmxpYyBkZXB0aDogbnVtYmVyID0gMTApIHtcclxuXHRcdHN1cGVyKHtcclxuXHRcdFx0dHlwZTogXCJib3hHZW9tZXRyeVwiXHJcblx0XHR9KTtcclxuXHRcdHRoaXMuZGVmaW5lcyA9IHtcclxuXHRcdFx0SEFTX05PUk1BTDogdHJ1ZVxyXG5cdFx0fTtcclxuXHRcdHRoaXMuaW5pdCgpO1xyXG5cdH1cclxuXHRwcml2YXRlIGluaXQoKSB7XHJcblx0XHQvLyBnZW5lcmF0ZSBwb3MgdXYgbm9ybWFsIHNvIG9uXHJcblx0XHRjb25zdCB7IHBvc2l0aW9ucywgbm9ybWFscywgdXZzIH0gPSBjcmVhdGVCb3goe1xyXG5cdFx0XHRkaW1lbnNpb25zOiBbdGhpcy5kZXB0aCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHRdXHJcblx0XHR9KTtcclxuXHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKHBvc2l0aW9ucyk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZShuZXcgRmxvYXQzMkF0dHJpYnV0ZShcInBvc2l0aW9uXCIsIHBvc2l0aW9ucywgMykpO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUobmV3IEZsb2F0MzJBdHRyaWJ1dGUoXCJub3JtYWxcIiwgbm9ybWFscywgMykpO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUobmV3IEZsb2F0MzJBdHRyaWJ1dGUoXCJ1dlwiLCB1dnMsIDIpKTtcclxuXHRcdHRoaXMuY291bnQgPSAzNjtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IFZlY3RvcjMgZnJvbSBcIi4uL21hdGgvVmVjdG9yM1wiO1xyXG5pbXBvcnQgeyBGbG9hdDMyQXR0cmlidXRlIH0gZnJvbSBcIi4uL3JlbmRlci9BdHRyaWJ1dGVcIjtcclxuaW1wb3J0IEdlb21ldHJ5IGZyb20gXCIuL0dlb21ldHJ5XCI7XHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvcnVzS25vdEdlb21ldHJ5IGV4dGVuZHMgR2VvbWV0cnkge1xyXG5cdHJhZGl1czogbnVtYmVyO1xyXG5cdHR1YmU6IG51bWJlcjtcclxuXHR0dWJ1bGFyU2VnbWVudHM6IG51bWJlcjtcclxuXHRyYWRpYWxTZWdtZW50czogbnVtYmVyO1xyXG5cdHA6IG51bWJlcjtcclxuXHRxOiBudW1iZXI7XHJcblx0Y29uc3RydWN0b3IocmFkaXVzID0gMSwgdHViZSA9IDAuNCwgdHVidWxhclNlZ21lbnRzID0gNjQsIHJhZGlhbFNlZ21lbnRzID0gOCwgcCA9IDIsIHEgPSAzKSB7XHJcblx0XHRzdXBlcih7XHJcblx0XHRcdHR5cGU6IFwidG9ydXNLbm90R2VvbWV0cnlcIlxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmRlZmluZXMgPSB7XHJcblx0XHRcdEhBU19OT1JNQUw6IHRydWVcclxuXHRcdH07XHJcblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcclxuXHRcdHRoaXMudHViZSA9IHR1YmU7XHJcblx0XHR0aGlzLnR1YnVsYXJTZWdtZW50cyA9IHR1YnVsYXJTZWdtZW50cztcclxuXHRcdHRoaXMucmFkaWFsU2VnbWVudHMgPSByYWRpYWxTZWdtZW50cztcclxuXHRcdHRoaXMucCA9IHA7XHJcblx0XHR0aGlzLnEgPSBxO1xyXG5cdFx0dGhpcy5pbml0KCk7XHJcblx0fVxyXG5cdHByaXZhdGUgaW5pdCgpIHtcclxuXHRcdGNvbnN0IHsgbm9ybWFscywgdXZzLCBwb3NpdGlvbnMsIGluZGljZXMgfSA9IHRoaXMuY3JlYXRlR2VvbWV0cnkoKTtcclxuXHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKHBvc2l0aW9ucyk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZShuZXcgRmxvYXQzMkF0dHJpYnV0ZShcInBvc2l0aW9uXCIsIHBvc2l0aW9ucywgMykpO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUobmV3IEZsb2F0MzJBdHRyaWJ1dGUoXCJub3JtYWxcIiwgbm9ybWFscywgMykpO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUobmV3IEZsb2F0MzJBdHRyaWJ1dGUoXCJ1dlwiLCB1dnMsIDIpKTtcclxuXHRcdHRoaXMuc2V0SW5kaWNlKGluZGljZXMpO1xyXG5cdFx0dGhpcy5jb3VudCA9IGluZGljZXMubGVuZ3RoO1xyXG5cdH1cclxuXHRwcml2YXRlIGNyZWF0ZUdlb21ldHJ5KCkge1xyXG5cdFx0Y29uc3QgcG9zaXRpb25zID0gW10sXHJcblx0XHRcdG5vcm1hbHMgPSBbXSxcclxuXHRcdFx0dXZzID0gW10sXHJcblx0XHRcdGluZGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IHR1YnVsYXJTZWdtZW50cyA9IE1hdGguZmxvb3IodGhpcy50dWJ1bGFyU2VnbWVudHMpO1xyXG5cdFx0Y29uc3QgcmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKHRoaXMucmFkaWFsU2VnbWVudHMpO1xyXG5cdFx0Ly8gaGVscGVyIHZhcmlhYmxlc1xyXG5cclxuXHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdGNvbnN0IFAxID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IFAyID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRjb25zdCBCID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IFQgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3QgTiA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xyXG5cclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgKytpKSB7XHJcblx0XHRcdC8vIHRoZSByYWRpYW4gXCJ1XCIgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9uIHRoZSB0b3J1cyBjdXJ2ZSBvZiB0aGUgY3VycmVudCB0dWJ1bGFyIHNlZ21lbnRcclxuXHJcblx0XHRcdGNvbnN0IHUgPSAoaSAvIHR1YnVsYXJTZWdtZW50cykgKiB0aGlzLnAgKiBNYXRoLlBJICogMjtcclxuXHJcblx0XHRcdC8vIG5vdyB3ZSBjYWxjdWxhdGUgdHdvIHBvaW50cy4gUDEgaXMgb3VyIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIGN1cnZlLCBQMiBpcyBhIGxpdHRsZSBmYXJ0aGVyIGFoZWFkLlxyXG5cdFx0XHQvLyB0aGVzZSBwb2ludHMgYXJlIHVzZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBcImNvb3JkaW5hdGUgc3BhY2VcIiwgd2hpY2ggaXMgbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCB2ZXJ0ZXggcG9zaXRpb25zXHJcblxyXG5cdFx0XHRjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUodSwgdGhpcy5wLCB0aGlzLnEsIHRoaXMucmFkaXVzLCBQMSk7XHJcblx0XHRcdGNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSh1ICsgMC4wMSwgdGhpcy5wLCB0aGlzLnEsIHRoaXMucmFkaXVzLCBQMik7XHJcblxyXG5cdFx0XHQvLyBjYWxjdWxhdGUgb3J0aG9ub3JtYWwgYmFzaXNcclxuXHJcblx0XHRcdFZlY3RvcjMuc3VidHJhY3QoUDIsIFAxLCBUKTtcclxuXHRcdFx0Ly8gVC5zdWJWZWN0b3JzKCBQMiwgUDEgKTtcclxuXHRcdFx0VmVjdG9yMy5hZGQoUDIsIFAxLCBOKTtcclxuXHRcdFx0Ly8gTi5hZGRWZWN0b3JzKCBQMiwgUDEgKTtcclxuXHRcdFx0VmVjdG9yMy5jcm9zcyhULCBOLCBCKTtcclxuXHRcdFx0Ly8gQi5jcm9zc1ZlY3RvcnMoIFQsIE4gKTtcclxuXHRcdFx0VmVjdG9yMy5jcm9zcyhCLCBULCBOKTtcclxuXHRcdFx0Ly8gTi5jcm9zc1ZlY3RvcnMoIEIsIFQgKTtcclxuXHJcblx0XHRcdC8vIG5vcm1hbGl6ZSBCLCBOLiBUIGNhbiBiZSBpZ25vcmVkLCB3ZSBkb24ndCB1c2UgaXRcclxuXHJcblx0XHRcdEIubm9ybWFsaXplKCk7XHJcblx0XHRcdE4ubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgKytqKSB7XHJcblx0XHRcdFx0Ly8gbm93IGNhbGN1bGF0ZSB0aGUgdmVydGljZXMuIHRoZXkgYXJlIG5vdGhpbmcgbW9yZSB0aGFuIGFuIGV4dHJ1c2lvbiBvZiB0aGUgdG9ydXMgY3VydmUuXHJcblx0XHRcdFx0Ly8gYmVjYXVzZSB3ZSBleHRydWRlIGEgc2hhcGUgaW4gdGhlIHh5LXBsYW5lLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGN1bGF0ZSBhIHotdmFsdWUuXHJcblxyXG5cdFx0XHRcdGNvbnN0IHYgPSAoaiAvIHJhZGlhbFNlZ21lbnRzKSAqIE1hdGguUEkgKiAyO1xyXG5cdFx0XHRcdGNvbnN0IGN4ID0gLXRoaXMudHViZSAqIE1hdGguY29zKHYpO1xyXG5cdFx0XHRcdGNvbnN0IGN5ID0gdGhpcy50dWJlICogTWF0aC5zaW4odik7XHJcblxyXG5cdFx0XHRcdC8vIG5vdyBjYWxjdWxhdGUgdGhlIGZpbmFsIHZlcnRleCBwb3NpdGlvbi5cclxuXHRcdFx0XHQvLyBmaXJzdCB3ZSBvcmllbnQgdGhlIGV4dHJ1c2lvbiB3aXRoIG91ciBiYXNpcyB2ZWN0b3JzLCB0aGVuIHdlIGFkZCBpdCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgY3VydmVcclxuXHJcblx0XHRcdFx0dmVydGV4LnggPSBQMS54ICsgKGN4ICogTi54ICsgY3kgKiBCLngpO1xyXG5cdFx0XHRcdHZlcnRleC55ID0gUDEueSArIChjeCAqIE4ueSArIGN5ICogQi55KTtcclxuXHRcdFx0XHR2ZXJ0ZXgueiA9IFAxLnogKyAoY3ggKiBOLnogKyBjeSAqIEIueik7XHJcblxyXG5cdFx0XHRcdHBvc2l0aW9ucy5wdXNoKHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnopO1xyXG5cclxuXHRcdFx0XHQvLyBub3JtYWwgKFAxIGlzIGFsd2F5cyB0aGUgY2VudGVyL29yaWdpbiBvZiB0aGUgZXh0cnVzaW9uLCB0aHVzIHdlIGNhbiB1c2UgaXQgdG8gY2FsY3VsYXRlIHRoZSBub3JtYWwpXHJcblx0XHRcdFx0VmVjdG9yMy5zdWJ0cmFjdCh2ZXJ0ZXgsIFAxLCBub3JtYWwpO1xyXG5cdFx0XHRcdG5vcm1hbC5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRcdFx0bm9ybWFscy5wdXNoKG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnopO1xyXG5cclxuXHRcdFx0XHQvLyB1dlxyXG5cclxuXHRcdFx0XHR1dnMucHVzaChpIC8gdHVidWxhclNlZ21lbnRzKTtcclxuXHRcdFx0XHR1dnMucHVzaChqIC8gcmFkaWFsU2VnbWVudHMpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xyXG5cclxuXHRcdGZvciAobGV0IGogPSAxOyBqIDw9IHR1YnVsYXJTZWdtZW50czsgaisrKSB7XHJcblx0XHRcdGZvciAobGV0IGkgPSAxOyBpIDw9IHJhZGlhbFNlZ21lbnRzOyBpKyspIHtcclxuXHRcdFx0XHQvLyBpbmRpY2VzXHJcblxyXG5cdFx0XHRcdGNvbnN0IGEgPSAocmFkaWFsU2VnbWVudHMgKyAxKSAqIChqIC0gMSkgKyAoaSAtIDEpO1xyXG5cdFx0XHRcdGNvbnN0IGIgPSAocmFkaWFsU2VnbWVudHMgKyAxKSAqIGogKyAoaSAtIDEpO1xyXG5cdFx0XHRcdGNvbnN0IGMgPSAocmFkaWFsU2VnbWVudHMgKyAxKSAqIGogKyBpO1xyXG5cdFx0XHRcdGNvbnN0IGQgPSAocmFkaWFsU2VnbWVudHMgKyAxKSAqIChqIC0gMSkgKyBpO1xyXG5cclxuXHRcdFx0XHQvLyBmYWNlc1xyXG5cclxuXHRcdFx0XHRpbmRpY2VzLnB1c2goYSwgYiwgZCk7XHJcblx0XHRcdFx0aW5kaWNlcy5wdXNoKGIsIGMsIGQpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRub3JtYWxzLFxyXG5cdFx0XHR1dnMsXHJcblx0XHRcdHBvc2l0aW9ucyxcclxuXHRcdFx0aW5kaWNlc1xyXG5cdFx0fTtcclxuXHR9XHJcbn1cclxuZnVuY3Rpb24gY2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKHUsIHAsIHEsIHJhZGl1cywgcG9zaXRpb24pIHtcclxuXHRjb25zdCBjdSA9IE1hdGguY29zKHUpO1xyXG5cdGNvbnN0IHN1ID0gTWF0aC5zaW4odSk7XHJcblx0Y29uc3QgcXVPdmVyUCA9IChxIC8gcCkgKiB1O1xyXG5cdGNvbnN0IGNzID0gTWF0aC5jb3MocXVPdmVyUCk7XHJcblxyXG5cdHBvc2l0aW9uLnggPSByYWRpdXMgKiAoMiArIGNzKSAqIDAuNSAqIGN1O1xyXG5cdHBvc2l0aW9uLnkgPSByYWRpdXMgKiAoMiArIGNzKSAqIHN1ICogMC41O1xyXG5cdHBvc2l0aW9uLnogPSByYWRpdXMgKiBNYXRoLnNpbihxdU92ZXJQKSAqIDAuNTtcclxufVxyXG4iLCJpbXBvcnQgeyBGcmFtZVN0YXRlIH0gZnJvbSBcIi4uL2NvcmUvRnJhbWVTdGF0ZVwiO1xuaW1wb3J0IHRleHR1cmVDYWNoZSBmcm9tIFwiLi4vY29yZS9UZXh0dXJlQ2FjaGVcIjtcbmltcG9ydCB7IFVuaWZvcm1FbnVtIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVVHlwZXNcIjtcbmltcG9ydCBDb2xvciBmcm9tIFwiLi4vbWF0aC9Db2xvclwiO1xuaW1wb3J0IHsgTWVzaCB9IGZyb20gXCIuLi9tZXNoL01lc2hcIjtcbmltcG9ydCBTYW1wbGVyIGZyb20gXCIuLi9yZW5kZXIvU2FtcGxlclwiO1xuaW1wb3J0IFRleHR1cmUgZnJvbSBcIi4uL3JlbmRlci9UZXh0dXJlXCI7XG5pbXBvcnQgVW5pZm9ybUJ1ZmZlciBmcm9tIFwiLi4vcmVuZGVyL1VuaWZvcm1CdWZmZXJcIjtcbmltcG9ydCB7IFNoYWRlclNvdXJjZSB9IGZyb20gXCIuLi9zaGFkZXIvU2hhZGVyU291cmNlXCI7XG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gXCIuL01hdGVyaWFsXCI7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCbGlublBob25nTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XG5cdHB1YmxpYyBzcGVjdWxhcjogQ29sb3I7XG5cdHB1YmxpYyBzaGluaW5lc3M6IG51bWJlcjtcblx0cHVibGljIG5vcm1hbFRleHR1cmU6IFRleHR1cmU7XG5cdHB1YmxpYyBub3JtYWxTYW1wbGVyOiBTYW1wbGVyO1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMudHlwZSA9IFwicGhvbmdcIjtcblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKDEuMCwgMC4wLCAwLjApO1xuXHRcdHRoaXMuc2hhZGVyU291cmNlID0gbmV3IFNoYWRlclNvdXJjZSh7XG5cdFx0XHRzaGFkZXJJZDogdGhpcy50eXBlLFxuXHRcdFx0ZGVmaW5lczoge1xuXHRcdFx0XHRtYXRlcmlhbFBob25nOiB0cnVlLFxuXHRcdFx0XHRNQVRFUklBTF9QSE9ORzogdHJ1ZVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHRoaXMubGlnaHQgPSB0cnVlO1xuXHRcdHRoaXMuc3BlY3VsYXIgPSBuZXcgQ29sb3IoMS4wLCAxLjAsIDEuMCk7XG5cdFx0dGhpcy5zaGluaW5lc3MgPSAzMC4wO1xuXHRcdHRoaXMuYmFzZVRleHR1cmUgPSB1bmRlZmluZWQ7XG5cdFx0dGhpcy5iYXNlU2FtcGxlciA9IHVuZGVmaW5lZDtcblx0fVxuXHR1cGRhdGUoZnJhbWVTdGF0ZT86IEZyYW1lU3RhdGUsIG1lc2g/OiBNZXNoKSB7XG5cdFx0aWYgKCF0aGlzLnNoYWRlckRhdGEgfHwgdGhpcy5kaXJ0eSkgdGhpcy5jcmVhdGVTaGFkZXJEYXRhKG1lc2gpO1xuXHR9XG5cdHByb3RlY3RlZCBjcmVhdGVTaGFkZXJEYXRhKG1lc2g/OiBNZXNoKSB7XG5cdFx0c3VwZXIuY3JlYXRlU2hhZGVyRGF0YSgpO1xuXHRcdGNvbnN0IHVuaWZvcm1CdWZmZXIgPSBuZXcgVW5pZm9ybUJ1ZmZlcih7IGxhYmVsOiBcInBob25nXCIgfSk7XG5cdFx0dW5pZm9ybUJ1ZmZlci5zZXRVbmlmb3JtKFxuXHRcdFx0XCJtb2RlbE1hdHJpeFwiLFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gbWVzaC5tb2RlbE1hdHJpeDtcblx0XHRcdH0sXG5cdFx0XHRVbmlmb3JtRW51bS5NYXQ0XG5cdFx0KTtcblx0XHR1bmlmb3JtQnVmZmVyLnNldFVuaWZvcm0oXCJjb2xvclwiLCB0aGlzLCBVbmlmb3JtRW51bS5Db2xvcik7XG5cdFx0dW5pZm9ybUJ1ZmZlci5zZXRVbmlmb3JtKFwib3BhY2l0eVwiLCB0aGlzLCBVbmlmb3JtRW51bS5GbG9hdCk7XG5cdFx0dW5pZm9ybUJ1ZmZlci5zZXRVbmlmb3JtKFxuXHRcdFx0XCJub3JtYWxNdHJpeFwiLFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gbWVzaC5ub3JtYWxNYXRyaXg7XG5cdFx0XHR9LFxuXHRcdFx0VW5pZm9ybUVudW0uTWF0NFxuXHRcdCk7XG5cdFx0dW5pZm9ybUJ1ZmZlci5zZXRVbmlmb3JtKFwiZW1pc3NpdmVcIiwgdGhpcywgVW5pZm9ybUVudW0uQ29sb3IpO1xuXHRcdHVuaWZvcm1CdWZmZXIuc2V0VW5pZm9ybShcInNoaW5pbmVzc1wiLCB0aGlzLCBVbmlmb3JtRW51bS5GbG9hdCk7XG5cdFx0dW5pZm9ybUJ1ZmZlci5zZXRVbmlmb3JtKFwic3BlY3VsYXJcIiwgdGhpcywgVW5pZm9ybUVudW0uQ29sb3IpO1xuXHRcdHRoaXMuc2hhZGVyRGF0YS5zZXRVbmlmb3JtQnVmZmVyKFwicGhvbmdcIiwgdW5pZm9ybUJ1ZmZlcik7XG5cdFx0aWYgKHRoaXMuYmFzZVRleHR1cmUpIHtcblx0XHRcdHRoaXMuc2hhZGVyRGF0YS5zZXREZWZpbmUoXCJVU0VfQ09MT1JURVhUVVJFXCIsIHRydWUpO1xuXHRcdFx0dGhpcy5zaGFkZXJEYXRhLnNldFRleHR1cmUoXCJiYXNlQ29sb3JUZXh0dXJlXCIsIHRoaXMuYmFzZVRleHR1cmUpO1xuXHRcdFx0dGhpcy5zaGFkZXJEYXRhLnNldFNhbXBsZXIoXCJiYXNlQ29sb3JTYW1wbGVyXCIsIHRoaXMuYmFzZVNhbXBsZXIgfHwgdGV4dHVyZUNhY2hlLmRlZmF1bHRTYW1wbGVyKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMubm9ybWFsVGV4dHVyZSkge1xuXHRcdFx0dGhpcy5zaGFkZXJEYXRhLnNldERlZmluZShcIlVTRV9OT1JNQUxURVhUVVJFXCIsIHRydWUpO1xuXHRcdFx0dGhpcy5zaGFkZXJEYXRhLnNldFRleHR1cmUoXCJub3JtYWxUZXh0dXJlXCIsIHRoaXMubm9ybWFsVGV4dHVyZSk7XG5cdFx0XHR0aGlzLnNoYWRlckRhdGEuc2V0U2FtcGxlcihcIm5vcm1hbFNhbXBsZXJcIiwgdGhpcy5ub3JtYWxTYW1wbGVyIHx8IHRleHR1cmVDYWNoZS5kZWZhdWx0U2FtcGxlcik7XG5cdFx0fVxuXHR9XG5cdGRlc3Ryb3koKSB7XG5cdFx0dGhpcz8uYmFzZVRleHR1cmU/LmRlc3Ryb3koKTtcblx0XHRzdXBlci5kZXN0cm95KCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEZyYW1lU3RhdGUgfSBmcm9tIFwiLi4vY29yZS9GcmFtZVN0YXRlXCI7XG5pbXBvcnQgdGV4dHVyZUNhY2hlIGZyb20gXCIuLi9jb3JlL1RleHR1cmVDYWNoZVwiO1xuaW1wb3J0IHsgQ3VsbE1vZGUgfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVDb25zdGFudFwiO1xuaW1wb3J0IHsgVW5pZm9ybUVudW0gfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVUeXBlc1wiO1xuaW1wb3J0IFZlY3RvcjIgZnJvbSBcIi4uL21hdGgvVmVjdG9yMlwiO1xuaW1wb3J0IHsgTWVzaCB9IGZyb20gXCIuLi9tZXNoL01lc2hcIjtcbmltcG9ydCBTYW1wbGVyIGZyb20gXCIuLi9yZW5kZXIvU2FtcGxlclwiO1xuaW1wb3J0IFRleHR1cmUgZnJvbSBcIi4uL3JlbmRlci9UZXh0dXJlXCI7XG5pbXBvcnQgVW5pZm9ybUJ1ZmZlciBmcm9tIFwiLi4vcmVuZGVyL1VuaWZvcm1CdWZmZXJcIjtcbmltcG9ydCB7IFNoYWRlclNvdXJjZSB9IGZyb20gXCIuLi9zaGFkZXIvU2hhZGVyU291cmNlXCI7XG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gXCIuL01hdGVyaWFsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBick1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xuXHRwdWJsaWMgc3BlY3VsYXJFbnZUZXh0dXJlOiBUZXh0dXJlO1xuXG5cdHB1YmxpYyBzcGVjdWxhckVudlNhbXBsZXI6IFNhbXBsZXI7XG5cblx0cHVibGljIGVtaXNzaXZlVGV4dHVyZTogVGV4dHVyZTtcblxuXHRwdWJsaWMgZW1pc3NpdmVTYW1wbGVyOiBTYW1wbGVyO1xuXG5cdHB1YmxpYyBub3JtYWxUZXh0dXJlOiBUZXh0dXJlO1xuXG5cdHB1YmxpYyBub3JtYWxTYW1wbGVyOiBTYW1wbGVyO1xuXG5cdHB1YmxpYyBhb1RleHR1cmU6IFRleHR1cmU7XG5cblx0cHVibGljIGFvU2FtcGxlcjogU2FtcGxlcjtcblxuXHRwdWJsaWMgbWV0YWxuZXNzUm91Z2huZXNzVGV4dHVyZTogVGV4dHVyZTtcblxuXHRwdWJsaWMgbWV0YWxuZXNzUm91Z2huZXNzU2FtcGxlcjogU2FtcGxlcjtcblxuXHRwcml2YXRlIF9yb3VnaG5lc3M6IG51bWJlcjtcblxuXHRwcml2YXRlIF9tZXRhbG5lc3M6IG51bWJlcjtcblxuXHRwcml2YXRlIF9hb1RleHR1cmVJbnRlbnNpdHk6IG51bWJlcjtcblxuXHRwcml2YXRlIF9ub3JtYWxTY2FsZTogVmVjdG9yMjtcblxuXHRwcml2YXRlIF9JQkxSZW5kZXI6IGJvb2xlYW47XG5cblx0cHVibGljIGdldCByb3VnaG5lc3MoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5fcm91Z2huZXNzO1xuXHR9XG5cdHB1YmxpYyBzZXQgcm91Z2huZXNzKHZhbHVlKSB7XG5cdFx0dGhpcy5fcm91Z2huZXNzID0gdmFsdWU7XG5cdH1cblx0cHVibGljIGdldCBtZXRhbG5lc3MoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5fbWV0YWxuZXNzO1xuXHR9XG5cdHB1YmxpYyBzZXQgbWV0YWxuZXNzKHY6IG51bWJlcikge1xuXHRcdHRoaXMuX21ldGFsbmVzcyA9IHY7XG5cdH1cblx0cHVibGljIGdldCBhb1RleHR1cmVJbnRlbnNpdHkoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5fYW9UZXh0dXJlSW50ZW5zaXR5O1xuXHR9XG5cdHB1YmxpYyBzZXQgYW9UZXh0dXJlSW50ZW5zaXR5KHY6IG51bWJlcikge1xuXHRcdHRoaXMuX2FvVGV4dHVyZUludGVuc2l0eSA9IHY7XG5cdH1cblx0cHVibGljIGdldCBub3JtYWxTY2FsZSgpOiBWZWN0b3IyIHtcblx0XHRpZiAodGhpcy5yZW5kZXJTdGF0ZSAmJiB0aGlzLnJlbmRlclN0YXRlLnByaW1pdGl2ZSkge1xuXHRcdFx0aWYgKHRoaXMucmVuZGVyU3RhdGUucHJpbWl0aXZlLmN1bGxNb2RlID09IEN1bGxNb2RlLkJhY2spIHtcblx0XHRcdFx0cmV0dXJuIFZlY3RvcjIubmVnYXRlKHRoaXMuX25vcm1hbFNjYWxlLCBuZXcgVmVjdG9yMigpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuX25vcm1hbFNjYWxlO1xuXHR9XG5cdHB1YmxpYyBzZXQgbm9ybWFsU2NhbGUodjogVmVjdG9yMikge1xuXHRcdHRoaXMuX25vcm1hbFNjYWxlID0gdjtcblx0fVxuXHRwdWJsaWMgc2V0IElCTFJlbmRlcih2YWx1ZSkge1xuXHRcdHRoaXMuX0lCTFJlbmRlciA9IHZhbHVlO1xuXHRcdHRoaXMuc2hhZGVyU291cmNlLnNldERlZmluZXMoe1xuXHRcdFx0VVNFX0lCTDogdGhpcy5fSUJMUmVuZGVyXG5cdFx0fSk7XG5cdFx0dGhpcy5kaXJ0eSA9IHRydWU7XG5cdH1cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLnR5cGUgPSBcInBicl9tYXRcIjtcblxuXHRcdHRoaXMuX3JvdWdobmVzcyA9IDAuMTtcblxuXHRcdHRoaXMuX21ldGFsbmVzcyA9IDAuMTtcblxuXHRcdHRoaXMuX2FvVGV4dHVyZUludGVuc2l0eSA9IDEuMDtcblx0XHR0aGlzLmxpZ2h0ID0gdHJ1ZTtcblx0XHR0aGlzLl9ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKDEsIDEpO1xuXHRcdHRoaXMuX0lCTFJlbmRlciA9IHRydWU7XG5cdFx0dGhpcy5zaGFkZXJTb3VyY2UgPSBuZXcgU2hhZGVyU291cmNlKHtcblx0XHRcdHNoYWRlcklkOiB0aGlzLnR5cGUsXG5cdFx0XHRkZWZpbmVzOiB7XG5cdFx0XHRcdG1hdGVyaWFsUGJyOiB0cnVlLFxuXHRcdFx0XHRVU0VfSUJMOiB0aGlzLl9JQkxSZW5kZXIsXG5cdFx0XHRcdE1BVEVSSUFMX1BCUjogdHJ1ZVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHVwZGF0ZShmcmFtZVN0YXRlPzogRnJhbWVTdGF0ZSwgbWVzaD86IE1lc2gpIHtcblx0XHRpZiAoIXRleHR1cmVDYWNoZS5nZXRUZXh0dXJlKFwic3BlY3VsYXJcIikpIHJldHVybjtcblx0XHRpZiAoIXRoaXMuc2hhZGVyRGF0YSB8fCB0aGlzLmRpcnR5KSB7XG5cdFx0XHR0aGlzLmNyZWF0ZVNoYWRlckRhdGEobWVzaCk7XG5cdFx0fVxuXHR9XG5cdHByb3RlY3RlZCBjcmVhdGVTaGFkZXJEYXRhKG1lc2g/OiBNZXNoKSB7XG5cdFx0c3VwZXIuY3JlYXRlU2hhZGVyRGF0YSgpO1xuXHRcdGNvbnN0IHVuaWZvcm1CdWZmZXIgPSBuZXcgVW5pZm9ybUJ1ZmZlcih7IGxhYmVsOiBcInBiclwiIH0pO1xuXHRcdHVuaWZvcm1CdWZmZXIuc2V0VW5pZm9ybShcblx0XHRcdFwibW9kZWxNYXRyaXhcIixcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0cmV0dXJuIG1lc2gubW9kZWxNYXRyaXg7XG5cdFx0XHR9LFxuXHRcdFx0VW5pZm9ybUVudW0uTWF0NFxuXHRcdCk7XG5cdFx0dW5pZm9ybUJ1ZmZlci5zZXRVbmlmb3JtKFwiY29sb3JcIiwgdGhpcywgVW5pZm9ybUVudW0uQ29sb3IpO1xuXHRcdHVuaWZvcm1CdWZmZXIuc2V0VW5pZm9ybShcIm9wYWNpdHlcIiwgdGhpcywgVW5pZm9ybUVudW0uRmxvYXQpO1xuXHRcdHVuaWZvcm1CdWZmZXIuc2V0VW5pZm9ybShcblx0XHRcdFwibm9ybWFsTXRyaXhcIixcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0cmV0dXJuIG1lc2gubm9ybWFsTWF0cml4O1xuXHRcdFx0fSxcblx0XHRcdFVuaWZvcm1FbnVtLk1hdDRcblx0XHQpO1xuXHRcdHVuaWZvcm1CdWZmZXIuc2V0VW5pZm9ybShcImVtaXNzaXZlXCIsIHRoaXMsIFVuaWZvcm1FbnVtLkNvbG9yKTtcblx0XHR1bmlmb3JtQnVmZmVyLnNldFVuaWZvcm0oXCJtZXRhbG5lc3NcIiwgdGhpcywgVW5pZm9ybUVudW0uRmxvYXQpO1xuXHRcdHVuaWZvcm1CdWZmZXIuc2V0VW5pZm9ybShcInJvdWdobmVzc1wiLCB0aGlzLCBVbmlmb3JtRW51bS5GbG9hdCk7XG5cdFx0dGhpcy5zaGFkZXJEYXRhLnNldFVuaWZvcm1CdWZmZXIoXCJwYnJcIiwgdW5pZm9ybUJ1ZmZlcik7XG5cdFx0dGhpcy5zcGVjdWxhckVudlRleHR1cmUgPSB0ZXh0dXJlQ2FjaGUuZ2V0VGV4dHVyZShcInNwZWN1bGFyXCIpO1xuXHRcdGlmICh0aGlzLmJhc2VUZXh0dXJlKSB7XG5cdFx0XHR0aGlzLnNoYWRlckRhdGEuc2V0RGVmaW5lKFwiVVNFX1RFWFRVUkVcIiwgdHJ1ZSk7XG5cdFx0XHR0aGlzLnNoYWRlckRhdGEuc2V0VGV4dHVyZShcImJhc2VDb2xvclRleHR1cmVcIiwgdGhpcy5iYXNlVGV4dHVyZSk7XG5cdFx0XHR0aGlzLnNoYWRlckRhdGEuc2V0U2FtcGxlcihcImJhc2VDb2xvclNhbXBsZXJcIiwgdGhpcy5iYXNlU2FtcGxlciB8fCB0ZXh0dXJlQ2FjaGUuZGVmYXVsdFNhbXBsZXIpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5tZXRhbG5lc3NSb3VnaG5lc3NUZXh0dXJlKSB7XG5cdFx0XHR0aGlzLnNoYWRlckRhdGEuc2V0RGVmaW5lKFwiVVNFX01FVEFMTkVTU1RFWFRVUkVcIiwgdHJ1ZSk7XG5cdFx0XHR0aGlzLnNoYWRlckRhdGEuc2V0VGV4dHVyZShcIm1ldGFsbmVzc1JvdWdobmVzc1RleHR1cmVcIiwgdGhpcy5tZXRhbG5lc3NSb3VnaG5lc3NUZXh0dXJlKTtcblx0XHRcdHRoaXMuc2hhZGVyRGF0YS5zZXRTYW1wbGVyKFxuXHRcdFx0XHRcIm1ldGFsbmVzc1JvdWdobmVzc1NhbXBsZXJcIixcblx0XHRcdFx0dGhpcy5tZXRhbG5lc3NSb3VnaG5lc3NTYW1wbGVyIHx8IHRleHR1cmVDYWNoZS5kZWZhdWx0U2FtcGxlclxuXHRcdFx0KTtcblx0XHR9XG5cdFx0aWYgKHRoaXMubm9ybWFsVGV4dHVyZSkge1xuXHRcdFx0dW5pZm9ybUJ1ZmZlci5zZXRVbmlmb3JtKFwibm9ybWFsU2NhbGVcIiwgdGhpcywgVW5pZm9ybUVudW0uRmxvYXRWZWMyKTtcblx0XHRcdHRoaXMuc2hhZGVyRGF0YS5zZXREZWZpbmUoXCJVU0VfTk9STUFMVEVYVFVSRVwiLCB0cnVlKTtcblx0XHRcdHRoaXMuc2hhZGVyRGF0YS5zZXRUZXh0dXJlKFwibm9ybWFsVGV4dHVyZVwiLCB0aGlzLm5vcm1hbFRleHR1cmUpO1xuXHRcdFx0dGhpcy5zaGFkZXJEYXRhLnNldFNhbXBsZXIoXCJub3JtYWxTYW1wbGVyXCIsIHRoaXMubm9ybWFsU2FtcGxlciB8fCB0ZXh0dXJlQ2FjaGUuZGVmYXVsdFNhbXBsZXIpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5hb1RleHR1cmUpIHtcblx0XHRcdHRoaXMuc2hhZGVyRGF0YS5zZXREZWZpbmUoXCJVU0VfQU9URVhUVVJFXCIsIHRydWUpO1xuXHRcdFx0dGhpcy5zaGFkZXJEYXRhLnNldFRleHR1cmUoXCJhb1RleHR1cmVcIiwgdGhpcy5hb1RleHR1cmUpO1xuXHRcdFx0dGhpcy5zaGFkZXJEYXRhLnNldFNhbXBsZXIoXCJhb1NhbXBsZXJcIiwgdGhpcy5hb1NhbXBsZXIgfHwgdGV4dHVyZUNhY2hlLmRlZmF1bHRTYW1wbGVyKTtcblx0XHRcdHVuaWZvcm1CdWZmZXIuc2V0VW5pZm9ybShcImFvVGV4dHVyZUludGVuc2l0eVwiLCB0aGlzLCBVbmlmb3JtRW51bS5GbG9hdCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmVtaXNzaXZlVGV4dHVyZSkge1xuXHRcdFx0dGhpcy5zaGFkZXJEYXRhLnNldERlZmluZShcIlVTRV9FTUlTU0lWRVRFWFRVUkVcIiwgdHJ1ZSk7XG5cdFx0XHR0aGlzLnNoYWRlckRhdGEuc2V0VGV4dHVyZShcImVtaXNzaXZlVGV4dHVyZVwiLCB0aGlzLmVtaXNzaXZlVGV4dHVyZSk7XG5cdFx0XHR0aGlzLnNoYWRlckRhdGEuc2V0U2FtcGxlcihcImVtaXNzaXZlU2FtcGxlclwiLCB0aGlzLmVtaXNzaXZlU2FtcGxlciB8fCB0ZXh0dXJlQ2FjaGUuZGVmYXVsdFNhbXBsZXIpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5zcGVjdWxhckVudlRleHR1cmUgJiYgdGhpcy5fSUJMUmVuZGVyKSB7XG5cdFx0XHR0aGlzLnNoYWRlckRhdGEuc2V0VGV4dHVyZShcInNwZWN1bGFyRW52VGV4dHVyZVwiLCB0aGlzLnNwZWN1bGFyRW52VGV4dHVyZSk7XG5cdFx0XHR0aGlzLnNoYWRlckRhdGEuc2V0U2FtcGxlcihcInNwZWN1bGFyRW52U2FtcGxlclwiLCB0aGlzLnNwZWN1bGFyRW52U2FtcGxlciB8fCB0ZXh0dXJlQ2FjaGUuZGVmYXVsdFNhbXBsZXIpO1xuXHRcdH1cblx0fVxuXHRkZXN0cm95KCkge1xuXHRcdHRoaXM/LmFvVGV4dHVyZT8uZGVzdHJveSgpO1xuXHRcdHRoaXM/LmJhc2VUZXh0dXJlPy5kZXN0cm95KCk7XG5cdFx0dGhpcz8uZW1pc3NpdmVUZXh0dXJlPy5kZXN0cm95KCk7XG5cdFx0dGhpcz8ubm9ybWFsVGV4dHVyZT8uZGVzdHJveSgpO1xuXHRcdHRoaXMuc3BlY3VsYXJFbnZUZXh0dXJlID0gdW5kZWZpbmVkO1xuXHR9XG59XG4iLCJleHBvcnQgY2xhc3MgRXZlbnREaXNwYXRjaGVyIHtcclxuXHRwcml2YXRlIF9saXN0ZW5lcnM6IG9iamVjdDtcclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHRcdHRoaXMuX2xpc3RlbmVycyA9IHt9O1xyXG5cdH1cclxuXHJcblx0YWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xyXG5cdFx0aWYgKHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkKSB0aGlzLl9saXN0ZW5lcnMgPSB7fTtcclxuXHJcblx0XHRjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XHJcblxyXG5cdFx0aWYgKGxpc3RlbmVyc1t0eXBlXSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGxpc3RlbmVyc1t0eXBlXSA9IFtdO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChsaXN0ZW5lcnNbdHlwZV0uaW5kZXhPZihsaXN0ZW5lcikgPT09IC0xKSB7XHJcblx0XHRcdGxpc3RlbmVyc1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGhhc0V2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcclxuXHRcdGlmICh0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcclxuXHJcblx0XHRyZXR1cm4gbGlzdGVuZXJzW3R5cGVdICE9PSB1bmRlZmluZWQgJiYgbGlzdGVuZXJzW3R5cGVdLmluZGV4T2YobGlzdGVuZXIpICE9PSAtMTtcclxuXHR9XHJcblxyXG5cdHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcclxuXHRcdGlmICh0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcclxuXHRcdGNvbnN0IGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnNbdHlwZV07XHJcblxyXG5cdFx0aWYgKGxpc3RlbmVyQXJyYXkgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRjb25zdCBpbmRleCA9IGxpc3RlbmVyQXJyYXkuaW5kZXhPZihsaXN0ZW5lcik7XHJcblxyXG5cdFx0XHRpZiAoaW5kZXggIT09IC0xKSB7XHJcblx0XHRcdFx0bGlzdGVuZXJBcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRkaXNwYXRjaEV2ZW50KGV2ZW50KSB7XHJcblx0XHRpZiAodGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XHJcblx0XHRjb25zdCBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzW2V2ZW50LnR5cGVdO1xyXG5cclxuXHRcdGlmIChsaXN0ZW5lckFycmF5ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gdGhpcztcclxuXHJcblx0XHRcdGNvbnN0IGFycmF5ID0gbGlzdGVuZXJBcnJheS5zbGljZSgwKTtcclxuXHJcblx0XHRcdGZvciAobGV0IGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcblx0XHRcdFx0YXJyYXlbaV0uY2FsbCh0aGlzLCBldmVudCk7XHJcblx0XHRcdH1cclxuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gbnVsbDtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IENhbWVyYSBmcm9tIFwiLi4vY2FtZXJhL0NhbWVyYVwiO1xyXG5pbXBvcnQgeyBDb21wdXRlIH0gZnJvbSBcIi4uL2NvbXB1dGUvQ29tcHV0ZVwiO1xyXG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gXCIuLi9tYXRlcmlhbC9NYXRlcmlhbFwiO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSBcIi4uL21lc2gvTWVzaFwiO1xyXG5pbXBvcnQgeyBDb21wdXRlQ29tbWFuZCB9IGZyb20gXCIuLi9yZW5kZXIvQ29tcHV0ZUNvbW1hbmRcIjtcclxuaW1wb3J0IENvbnRleHQgZnJvbSBcIi4uL3JlbmRlci9Db250ZXh0XCI7XHJcbmltcG9ydCBEcmF3Q29tbWFuZCBmcm9tIFwiLi4vcmVuZGVyL0RyYXdDb21tYW5kXCI7XHJcbmltcG9ydCBMaWdodE1hbmdlciBmcm9tIFwiLi9MaWdodE1hbmdlclwiO1xyXG5pbXBvcnQgeyBDb21tYW5kU3ViVHlwZSB9IGZyb20gXCIuL1dlYkdQVUNvbnN0YW50XCI7XHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlbmRlclF1ZXVlIHtcclxuXHRwdWJsaWMgcHJlOiBBcnJheTxNZXNoPjtcclxuXHRwdWJsaWMgb3BhcXVlOiBBcnJheTxNZXNoPjtcclxuXHRwdWJsaWMgdHJhbnNwYXJlbnQ6IEFycmF5PE1lc2g+O1xyXG5cdHB1YmxpYyBkZWJ1Z1F1ZXVlOiBBcnJheTxNZXNoPjtcclxuXHRwdWJsaWMgY29tcHV0ZXM6IEFycmF5PENvbXB1dGU+O1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0dGhpcy5wcmUgPSBbXTtcclxuXHRcdHRoaXMub3BhcXVlID0gW107XHJcblx0XHR0aGlzLnRyYW5zcGFyZW50ID0gW107XHJcblx0XHR0aGlzLmNvbXB1dGVzID0gW107XHJcblx0XHR0aGlzLmRlYnVnUXVldWUgPSBbXTtcclxuXHR9XHJcblx0c29ydCgpIHtcclxuXHRcdFJlbmRlclF1ZXVlLnNvcnQodGhpcy5vcGFxdWUsIDAsIHRoaXMub3BhcXVlLmxlbmd0aCwgUmVuZGVyUXVldWUuX2NvbXBhcmVGcm9tTmVhclRvRmFyKTtcclxuXHRcdFJlbmRlclF1ZXVlLnNvcnQodGhpcy50cmFuc3BhcmVudCwgMCwgdGhpcy50cmFuc3BhcmVudC5sZW5ndGgsIFJlbmRlclF1ZXVlLl9jb21wYXJlRnJvbUZhclRvTmVhcik7XHJcblx0fVxyXG5cdG9wYXF1ZVJlbmRlcihcclxuXHRcdGNhbWVyYTogQ2FtZXJhLFxyXG5cdFx0Y29udGV4dDogQ29udGV4dCxcclxuXHRcdHBhc3NFbmNvZGVyPzogR1BVUmVuZGVyUGFzc0VuY29kZXIsXHJcblx0XHRyZXBsYWNlTWF0ZXJpYWw/OiBNYXRlcmlhbCxcclxuXHRcdGNvbW1hbmRTdWJUeXBlPzogQ29tbWFuZFN1YlR5cGUsXHJcblx0XHRsaWdodE1hbmdlcj86IExpZ2h0TWFuZ2VyXHJcblx0KSB7XHJcblx0XHR0aGlzLm9wYXF1ZS5tYXAoKG1lc2gpID0+IHtcclxuXHRcdFx0aWYgKCFtZXNoLnJlYWR5KSByZXR1cm47XHJcblx0XHRcdG1lc2guYmVmb3JlUmVuZGVyKCk7XHJcblx0XHRcdFJlbmRlclF1ZXVlLmV4Y3V0ZUNvbW1hbmQoXHJcblx0XHRcdFx0bWVzaC5nZXREcmF3Q29tbWFuZChyZXBsYWNlTWF0ZXJpYWwsIGNvbW1hbmRTdWJUeXBlLCBsaWdodE1hbmdlciksXHJcblx0XHRcdFx0Y29udGV4dCxcclxuXHRcdFx0XHRwYXNzRW5jb2RlcixcclxuXHRcdFx0XHRjYW1lcmFcclxuXHRcdFx0KTtcclxuXHRcdFx0bWVzaC5hZnRlclJlbmRlcigpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdHRyYW5zcGFyZW50UmVuZGVyKFxyXG5cdFx0Y2FtZXJhOiBDYW1lcmEsXHJcblx0XHRjb250ZXh0OiBDb250ZXh0LFxyXG5cdFx0cGFzc0VuY29kZXI/OiBHUFVSZW5kZXJQYXNzRW5jb2RlcixcclxuXHRcdHJlcGxhY2VNYXRlcmlhbD86IE1hdGVyaWFsLFxyXG5cdFx0Y29tbWFuZFN1YlR5cGU/OiBDb21tYW5kU3ViVHlwZSxcclxuXHRcdGxpZ2h0TWFuZ2VyPzogTGlnaHRNYW5nZXJcclxuXHQpIHtcclxuXHRcdHRoaXMudHJhbnNwYXJlbnQubWFwKChtZXNoKSA9PiB7XHJcblx0XHRcdGlmICghbWVzaC5yZWFkeSkgcmV0dXJuO1xyXG5cdFx0XHRtZXNoLmJlZm9yZVJlbmRlcigpO1xyXG5cdFx0XHRSZW5kZXJRdWV1ZS5leGN1dGVDb21tYW5kKFxyXG5cdFx0XHRcdG1lc2guZ2V0RHJhd0NvbW1hbmQocmVwbGFjZU1hdGVyaWFsLCBjb21tYW5kU3ViVHlwZSwgbGlnaHRNYW5nZXIpLFxyXG5cdFx0XHRcdGNvbnRleHQsXHJcblx0XHRcdFx0cGFzc0VuY29kZXIsXHJcblx0XHRcdFx0Y2FtZXJhXHJcblx0XHRcdCk7XHJcblx0XHRcdG1lc2guYWZ0ZXJSZW5kZXIoKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHRjb21wdXRlUmVuZGVyKGNvbnRleHQ6IENvbnRleHQsIHBhc3NFbmNvZGVyPzogR1BVQ29tcHV0ZVBhc3NFbmNvZGVyKSB7XHJcblx0XHR0aGlzLmNvbXB1dGVzLm1hcCgoY29tcHV0ZSkgPT4ge1xyXG5cdFx0XHRSZW5kZXJRdWV1ZS5leGN1dGVDb21wdXRlKGNvbXB1dGUuZ2V0Q29tbWFuZCgpLCBjb250ZXh0LCBwYXNzRW5jb2Rlcik7XHJcblx0XHR9KTtcclxuXHR9XHJcblx0ZGVidWdRdWV1ZVJlbmRlcihcclxuXHRcdGNhbWVyYTogQ2FtZXJhLFxyXG5cdFx0Y29udGV4dDogQ29udGV4dCxcclxuXHRcdHBhc3NFbmNvZGVyPzogR1BVUmVuZGVyUGFzc0VuY29kZXIsXHJcblx0XHRyZXBsYWNlTWF0ZXJpYWw/OiBNYXRlcmlhbCxcclxuXHRcdGNvbW1hbmRTdWJUeXBlPzogQ29tbWFuZFN1YlR5cGVcclxuXHQpIHtcclxuXHRcdHRoaXMuZGVidWdRdWV1ZS5tYXAoKG1lc2gpID0+IHtcclxuXHRcdFx0aWYgKCFtZXNoLnJlYWR5KSByZXR1cm47XHJcblx0XHRcdG1lc2guYmVmb3JlUmVuZGVyKCk7XHJcblx0XHRcdFJlbmRlclF1ZXVlLmV4Y3V0ZUNvbW1hbmQoXHJcblx0XHRcdFx0bWVzaC5nZXREcmF3Q29tbWFuZChyZXBsYWNlTWF0ZXJpYWwsIGNvbW1hbmRTdWJUeXBlKSxcclxuXHRcdFx0XHRjb250ZXh0LFxyXG5cdFx0XHRcdHBhc3NFbmNvZGVyLFxyXG5cdFx0XHRcdGNhbWVyYVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRtZXNoLmFmdGVyUmVuZGVyKCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblx0cHJlUmVuZGVyKGNhbWVyYTogQ2FtZXJhLCBjb250ZXh0OiBDb250ZXh0LCBwYXNzRW5jb2Rlcj86IEdQVVJlbmRlclBhc3NFbmNvZGVyLCByZXBsYWNlTWF0ZXJpYWw/OiBNYXRlcmlhbCkge1xyXG5cdFx0dGhpcy5wcmUubWFwKChtZXNoKSA9PiB7XHJcblx0XHRcdGlmICghbWVzaC5yZWFkeSkgcmV0dXJuO1xyXG5cdFx0XHRtZXNoLmJlZm9yZVJlbmRlcigpO1xyXG5cdFx0XHRSZW5kZXJRdWV1ZS5leGN1dGVDb21tYW5kKG1lc2guZ2V0RHJhd0NvbW1hbmQoKSwgY29udGV4dCwgcGFzc0VuY29kZXIsIGNhbWVyYSk7XHJcblx0XHRcdG1lc2guYWZ0ZXJSZW5kZXIoKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHRzdGF0aWMgZXhjdXRlQ29tbWFuZChjb21tYW5kOiBEcmF3Q29tbWFuZCwgY29udGV4dD86IENvbnRleHQsIHBhc3NFbmNvZGVyPzogR1BVUmVuZGVyUGFzc0VuY29kZXIsIGNhbWVyYT86IENhbWVyYSkge1xyXG5cdFx0Y29tbWFuZC5yZW5kZXIoe1xyXG5cdFx0XHRkZXZpY2U6IGNvbnRleHQuZGV2aWNlLFxyXG5cdFx0XHRwYXNzRW5jb2RlcixcclxuXHRcdFx0Y2FtZXJhLFxyXG5cdFx0XHR2aWV3UG9ydDogY29udGV4dD8udmlld1BvcnQsXHJcblx0XHRcdHNjaXNzb3JUZXN0OiBjb250ZXh0Py5zY2lzc29yVGVzdFxyXG5cdFx0fSk7XHJcblx0fVxyXG5cdHN0YXRpYyBleGN1dGVDb21wdXRlKGNvbW1hbmQ6IENvbXB1dGVDb21tYW5kLCBjb250ZXh0PzogQ29udGV4dCwgcGFzc0VuY29kZXI/OiBHUFVDb21wdXRlUGFzc0VuY29kZXIpIHtcclxuXHRcdGNvbW1hbmQucmVuZGVyKHsgZGV2aWNlOiBjb250ZXh0LmRldmljZSwgcGFzc0VuY29kZXIgfSk7XHJcblx0fVxyXG5cdHJlc2V0KCkge1xyXG5cdFx0dGhpcy5wcmUgPSBbXTtcclxuXHRcdHRoaXMub3BhcXVlID0gW107XHJcblx0XHR0aGlzLnRyYW5zcGFyZW50ID0gW107XHJcblx0XHR0aGlzLmNvbXB1dGVzID0gW107XHJcblx0XHR0aGlzLmRlYnVnUXVldWUgPSBbXTtcclxuXHR9XHJcblx0c3RhdGljIF9jb21wYXJlRnJvbU5lYXJUb0ZhcihhOiBNZXNoLCBiOiBNZXNoKTogbnVtYmVyIHtcclxuXHRcdHJldHVybiBhLnByaW9yaXR5IC0gYi5wcmlvcml0eSB8fCBhLmRpc3RhbmNlVG9DYW1lcmEgLSBiLmRpc3RhbmNlVG9DYW1lcmE7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgX2NvbXBhcmVGcm9tRmFyVG9OZWFyKGE6IE1lc2gsIGI6IE1lc2gpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5IHx8IGIuZGlzdGFuY2VUb0NhbWVyYSAtIGEuZGlzdGFuY2VUb0NhbWVyYTtcclxuXHR9XHJcblx0Ly8gYWNjb3JkaW5nIHRvIGNhbWVyYSBkaXN0YW5jZVxyXG5cdHN0YXRpYyBzb3J0PFQ+KGluc2F0bmNlOiBUW10sIGZyb206IG51bWJlciwgdG86IG51bWJlciwgY29tcGFyZUZ1bmM6IEZ1bmN0aW9uKTogdm9pZCB7XHJcblx0XHRSZW5kZXJRdWV1ZS5fcXVpY2tTb3J0KGluc2F0bmNlLCBmcm9tLCB0bywgY29tcGFyZUZ1bmMpO1xyXG5cdH1cclxuXHQvLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9vYXNpcy1lbmdpbmUvZW5naW5lL2Jsb2IvbWFpbi9wYWNrYWdlcy9jb3JlL3NyYy9SZW5kZXJQaXBlbGluZS9SZW5kZXJRdWV1ZS50c1xyXG5cdHByaXZhdGUgc3RhdGljIF9xdWlja1NvcnQ8VD4oYTogVFtdLCBmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIsIGNvbXBhcmVGdW5jOiBGdW5jdGlvbik6IHZvaWQge1xyXG5cdFx0d2hpbGUgKHRydWUpIHtcclxuXHRcdFx0Ly8gSW5zZXJ0aW9uIHNvcnQgaXMgZmFzdGVyIGZvciBzaG9ydCBhcnJheXMuXHJcblx0XHRcdGlmICh0byAtIGZyb20gPD0gMTApIHtcclxuXHRcdFx0XHRSZW5kZXJRdWV1ZS5faW5zZXJ0aW9uU29ydChhLCBmcm9tLCB0bywgY29tcGFyZUZ1bmMpO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCB0aGlyZF9pbmRleCA9IChmcm9tICsgdG8pID4+IDE7XHJcblx0XHRcdC8vIEZpbmQgYSBwaXZvdCBhcyB0aGUgbWVkaWFuIG9mIGZpcnN0LCBsYXN0IGFuZCBtaWRkbGUgZWxlbWVudC5cclxuXHRcdFx0bGV0IHYwID0gYVtmcm9tXTtcclxuXHRcdFx0bGV0IHYxID0gYVt0byAtIDFdO1xyXG5cdFx0XHRsZXQgdjIgPSBhW3RoaXJkX2luZGV4XTtcclxuXHRcdFx0Y29uc3QgYzAxID0gY29tcGFyZUZ1bmModjAsIHYxKTtcclxuXHRcdFx0aWYgKGMwMSA+IDApIHtcclxuXHRcdFx0XHQvLyB2MSA8IHYwLCBzbyBzd2FwIHRoZW0uXHJcblx0XHRcdFx0Y29uc3QgdG1wID0gdjA7XHJcblx0XHRcdFx0djAgPSB2MTtcclxuXHRcdFx0XHR2MSA9IHRtcDtcclxuXHRcdFx0fSAvLyB2MCA8PSB2MS5cclxuXHRcdFx0Y29uc3QgYzAyID0gY29tcGFyZUZ1bmModjAsIHYyKTtcclxuXHRcdFx0aWYgKGMwMiA+PSAwKSB7XHJcblx0XHRcdFx0Ly8gdjIgPD0gdjAgPD0gdjEuXHJcblx0XHRcdFx0Y29uc3QgdG1wID0gdjA7XHJcblx0XHRcdFx0djAgPSB2MjtcclxuXHRcdFx0XHR2MiA9IHYxO1xyXG5cdFx0XHRcdHYxID0gdG1wO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIHYwIDw9IHYxICYmIHYwIDwgdjJcclxuXHRcdFx0XHRjb25zdCBjMTIgPSBjb21wYXJlRnVuYyh2MSwgdjIpO1xyXG5cdFx0XHRcdGlmIChjMTIgPiAwKSB7XHJcblx0XHRcdFx0XHQvLyB2MCA8PSB2MiA8IHYxXHJcblx0XHRcdFx0XHRjb25zdCB0bXAgPSB2MTtcclxuXHRcdFx0XHRcdHYxID0gdjI7XHJcblx0XHRcdFx0XHR2MiA9IHRtcDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gdjAgPD0gdjEgPD0gdjJcclxuXHRcdFx0YVtmcm9tXSA9IHYwO1xyXG5cdFx0XHRhW3RvIC0gMV0gPSB2MjtcclxuXHRcdFx0Y29uc3QgcGl2b3QgPSB2MTtcclxuXHRcdFx0bGV0IGxvd19lbmQgPSBmcm9tICsgMTsgLy8gVXBwZXIgYm91bmQgb2YgZWxlbWVudHMgbG93ZXIgdGhhbiBwaXZvdC5cclxuXHRcdFx0bGV0IGhpZ2hfc3RhcnQgPSB0byAtIDE7IC8vIExvd2VyIGJvdW5kIG9mIGVsZW1lbnRzIGdyZWF0ZXIgdGhhbiBwaXZvdC5cclxuXHRcdFx0YVt0aGlyZF9pbmRleF0gPSBhW2xvd19lbmRdO1xyXG5cdFx0XHRhW2xvd19lbmRdID0gcGl2b3Q7XHJcblxyXG5cdFx0XHQvLyBGcm9tIGxvd19lbmQgdG8gaSBhcmUgZWxlbWVudHMgZXF1YWwgdG8gcGl2b3QuXHJcblx0XHRcdC8vIEZyb20gaSB0byBoaWdoX3N0YXJ0IGFyZSBlbGVtZW50cyB0aGF0IGhhdmVuJ3QgYmVlbiBjb21wYXJlZCB5ZXQuXHJcblx0XHRcdHBhcnRpdGlvbjogZm9yIChsZXQgaSA9IGxvd19lbmQgKyAxOyBpIDwgaGlnaF9zdGFydDsgaSsrKSB7XHJcblx0XHRcdFx0bGV0IGVsZW1lbnQgPSBhW2ldO1xyXG5cdFx0XHRcdGxldCBvcmRlciA9IGNvbXBhcmVGdW5jKGVsZW1lbnQsIHBpdm90KTtcclxuXHRcdFx0XHRpZiAob3JkZXIgPCAwKSB7XHJcblx0XHRcdFx0XHRhW2ldID0gYVtsb3dfZW5kXTtcclxuXHRcdFx0XHRcdGFbbG93X2VuZF0gPSBlbGVtZW50O1xyXG5cdFx0XHRcdFx0bG93X2VuZCsrO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAob3JkZXIgPiAwKSB7XHJcblx0XHRcdFx0XHRkbyB7XHJcblx0XHRcdFx0XHRcdGhpZ2hfc3RhcnQtLTtcclxuXHRcdFx0XHRcdFx0aWYgKGhpZ2hfc3RhcnQgPT0gaSkgYnJlYWsgcGFydGl0aW9uO1xyXG5cdFx0XHRcdFx0XHRjb25zdCB0b3BfZWxlbSA9IGFbaGlnaF9zdGFydF07XHJcblx0XHRcdFx0XHRcdG9yZGVyID0gY29tcGFyZUZ1bmModG9wX2VsZW0sIHBpdm90KTtcclxuXHRcdFx0XHRcdH0gd2hpbGUgKG9yZGVyID4gMCk7XHJcblx0XHRcdFx0XHRhW2ldID0gYVtoaWdoX3N0YXJ0XTtcclxuXHRcdFx0XHRcdGFbaGlnaF9zdGFydF0gPSBlbGVtZW50O1xyXG5cdFx0XHRcdFx0aWYgKG9yZGVyIDwgMCkge1xyXG5cdFx0XHRcdFx0XHRlbGVtZW50ID0gYVtpXTtcclxuXHRcdFx0XHRcdFx0YVtpXSA9IGFbbG93X2VuZF07XHJcblx0XHRcdFx0XHRcdGFbbG93X2VuZF0gPSBlbGVtZW50O1xyXG5cdFx0XHRcdFx0XHRsb3dfZW5kKys7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0byAtIGhpZ2hfc3RhcnQgPCBsb3dfZW5kIC0gZnJvbSkge1xyXG5cdFx0XHRcdHRoaXMuX3F1aWNrU29ydChhLCBoaWdoX3N0YXJ0LCB0bywgY29tcGFyZUZ1bmMpO1xyXG5cdFx0XHRcdHRvID0gbG93X2VuZDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLl9xdWlja1NvcnQoYSwgZnJvbSwgbG93X2VuZCwgY29tcGFyZUZ1bmMpO1xyXG5cdFx0XHRcdGZyb20gPSBoaWdoX3N0YXJ0O1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHByaXZhdGUgc3RhdGljIF9pbnNlcnRpb25Tb3J0PFQ+KGE6IFRbXSwgZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCBjb21wYXJlRnVuYzogRnVuY3Rpb24pOiB2b2lkIHtcclxuXHRcdGZvciAobGV0IGkgPSBmcm9tICsgMTsgaSA8IHRvOyBpKyspIHtcclxuXHRcdFx0bGV0IGo7XHJcblx0XHRcdGNvbnN0IGVsZW1lbnQgPSBhW2ldO1xyXG5cdFx0XHRmb3IgKGogPSBpIC0gMTsgaiA+PSBmcm9tOyBqLS0pIHtcclxuXHRcdFx0XHRjb25zdCB0bXAgPSBhW2pdO1xyXG5cdFx0XHRcdGNvbnN0IG9yZGVyID0gY29tcGFyZUZ1bmModG1wLCBlbGVtZW50KTtcclxuXHRcdFx0XHRpZiAob3JkZXIgPiAwKSB7XHJcblx0XHRcdFx0XHRhW2ogKyAxXSA9IHRtcDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGFbaiArIDFdID0gZWxlbWVudDtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IHsgU2NlbmUgfSBmcm9tIFwiLi4vU2NlbmVcIjtcclxuaW1wb3J0IENhbWVyYSBmcm9tIFwiLi4vY2FtZXJhL0NhbWVyYVwiO1xyXG5pbXBvcnQgQ29sb3IgZnJvbSBcIi4uL21hdGgvQ29sb3JcIjtcclxuaW1wb3J0IFBhc3MgZnJvbSBcIi4uL3Bhc3MvUGFzc1wiO1xyXG5pbXBvcnQgQ29udGV4dCBmcm9tIFwiLi4vcmVuZGVyL0NvbnRleHRcIjtcclxuaW1wb3J0IFRleHR1cmUgZnJvbSBcIi4uL3JlbmRlci9UZXh0dXJlXCI7XHJcbmltcG9ydCBjb21iaW5lIGZyb20gXCIuLi91dGlscy9jb21iaW5lXCI7XHJcbmltcG9ydCBDdWxsaW5nVm9sdW1lIGZyb20gXCIuL0N1bGxpbmdWb2x1bWVcIjtcclxuaW1wb3J0IExpZ2h0TWFuZ2VyIGZyb20gXCIuL0xpZ2h0TWFuZ2VyXCI7XHJcbmltcG9ydCBSZW5kZXJRdWV1ZSBmcm9tIFwiLi9SZW5kZXJRdWV1ZVwiO1xyXG5cclxuaW50ZXJmYWNlIEZyYW1lU3RhdGVPcHRpb25zIHtcclxuXHRiYWNrZ3JvdW5kPzogQmFja2dyb3VuZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBCYWNrZ3JvdW5kIHtcclxuXHR2YWx1ZTogQ29sb3IgfCBUZXh0dXJlO1xyXG5cdG9wYWNpdHk6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEZyYW1lU3RhdGUge1xyXG5cdHB1YmxpYyBiYWNrZ3JvdW5kOiBCYWNrZ3JvdW5kO1xyXG5cdHB1YmxpYyBwYXNzOiBQYXNzO1xyXG5cdHB1YmxpYyByZW5kZXJRdWV1ZTogUmVuZGVyUXVldWU7XHJcblx0cHVibGljIGRyYXdDYWxsbnVtczogbnVtYmVyO1xyXG5cdHB1YmxpYyBnZW9tZXRyeU1lbW9yeTogbnVtYmVyO1xyXG5cdHB1YmxpYyB0ZXh0dXJlTWVtb3J5OiBudW1iZXI7XHJcblx0cHVibGljIGZyYW1lTnVtYmVyOiBudW1iZXI7XHJcblx0cHVibGljIGN1bGxpbmdWb2x1bWU6IEN1bGxpbmdWb2x1bWU7XHJcblx0cHVibGljIGRlZmluZXNEaXJ0eTogYm9vbGVhbjtcclxuXHRwcml2YXRlIF9kZWZpbmVzOiBvYmplY3Q7XHJcblx0Y29uc3RydWN0b3IocHVibGljIGNvbnRleHQ6IENvbnRleHQsIHB1YmxpYyBsaWdodE1hbmdlcj86IExpZ2h0TWFuZ2VyLCBvcHRpb25zOiBGcmFtZVN0YXRlT3B0aW9ucyA9IHt9KSB7XHJcblx0XHR0aGlzLmJhY2tncm91bmQgPSBvcHRpb25zLmJhY2tncm91bmQ7XHJcblx0XHR0aGlzLnJlbmRlclF1ZXVlID0gbmV3IFJlbmRlclF1ZXVlKCk7XHJcblx0XHR0aGlzLmdlb21ldHJ5TWVtb3J5ID0gMDtcclxuXHRcdHRoaXMudGV4dHVyZU1lbW9yeSA9IDA7XHJcblx0XHR0aGlzLmZyYW1lTnVtYmVyID0gMDtcclxuXHRcdHRoaXMuX2RlZmluZXMgPSB7fTtcclxuXHRcdHRoaXMuZGVmaW5lc0RpcnR5ID0gdHJ1ZTtcclxuXHR9XHJcblx0Z2V0IGRlZmluZXMoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fZGVmaW5lcztcclxuXHR9XHJcblx0c2V0IGRlZmluZXModmFsdWUpIHtcclxuXHRcdHRoaXMuZGVmaW5lc0RpcnR5ID0gdHJ1ZTtcclxuXHRcdHRoaXMuX2RlZmluZXMgPSBjb21iaW5lKHZhbHVlLCB0aGlzLl9kZWZpbmVzLCBmYWxzZSk7XHJcblx0fVxyXG5cdHVwZGF0ZShjYW1lcmE6IENhbWVyYSwgb3B0aW9uczogRnJhbWVTdGF0ZU9wdGlvbnMgPSB7fSkge1xyXG5cdFx0dGhpcy5iYWNrZ3JvdW5kID0gb3B0aW9ucy5iYWNrZ3JvdW5kO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyUXVldWUucmVzZXQoKTtcclxuXHRcdHRoaXM/LmxpZ2h0TWFuZ2VyPy51cGRhdGU/Lih0aGlzLCBjYW1lcmEpO1xyXG5cdFx0dGhpcy5jdWxsaW5nVm9sdW1lID0gY2FtZXJhLmdldEN1bGxpbmdWb2x1bWUoKTtcclxuXHRcdHRoaXMuZnJhbWVOdW1iZXIgKz0gMTtcclxuXHR9XHJcblxyXG5cdHJlc2V0Q3VsbGluZ1ZvbHVtZShjYW1lcmE6IENhbWVyYSkge1xyXG5cdFx0dGhpcy5jdWxsaW5nVm9sdW1lID0gY2FtZXJhLmdldEN1bGxpbmdWb2x1bWUoKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRGcmFtZVN0YXRlT3B0aW9uc0J5U2NlbmUoc2NlbmVJbnN0YW5jZTogU2NlbmUpIHtcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdGJhY2tncm91bmQ6IHNjZW5lSW5zdGFuY2UuYmFja2dyb3VuZFxyXG5cdFx0fTtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IHsgTGlnaHRUeXBlIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVVHlwZXNcIjtcclxuaW1wb3J0IFZlY3RvcjMgZnJvbSBcIi4uL21hdGgvVmVjdG9yM1wiO1xyXG5pbXBvcnQgVmVjdG9yNCBmcm9tIFwiLi4vbWF0aC9WZWN0b3I0XCI7XHJcbmltcG9ydCB7IExpZ2h0IH0gZnJvbSBcIi4vTGlnaHRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBbWJpZW50TGlnaHQgZXh0ZW5kcyBMaWdodCB7XHJcblx0cHJpdmF0ZSBfY29sb3JBbmRJbnRlbnNpdHk6IFZlY3RvcjQ7XHJcblx0Y29uc3RydWN0b3IoY29sb3I6IFZlY3RvcjMsIGludGVuc2l0eTogbnVtYmVyKSB7XHJcblx0XHRzdXBlcihjb2xvciwgaW50ZW5zaXR5KTtcclxuXHRcdHRoaXMubGlnaHRUeXBlID0gTGlnaHRUeXBlLkFtYmllbnRMaWdodDtcclxuXHRcdHRoaXMuX2NvbG9yQW5kSW50ZW5zaXR5ID0gbmV3IFZlY3RvcjQoY29sb3IueCwgY29sb3IueSwgY29sb3IueiwgaW50ZW5zaXR5KTtcclxuXHR9XHJcblx0Z2V0IENvbG9yQW5kSW50ZW5zaXR5KCkge1xyXG5cdFx0dGhpcy5fY29sb3JBbmRJbnRlbnNpdHkuc2V0KHRoaXMuY29sb3IueCwgdGhpcy5jb2xvci55LCB0aGlzLmNvbG9yLnosIHRoaXMuaW50ZW5zaXR5KTtcclxuXHRcdHJldHVybiB0aGlzLl9jb2xvckFuZEludGVuc2l0eTtcclxuXHR9XHJcbn1cclxuLy8gbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICogc2NhbGVGYWN0b3IgKTtcclxuIiwiaW1wb3J0IENhbWVyYSBmcm9tIFwiLi4vY2FtZXJhL0NhbWVyYVwiO1xuaW1wb3J0IHsgTGlnaHRNYW5nZXJPcHRpb25zLCBMaWdodFR5cGUsIFVuaWZvcm1FbnVtIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVVHlwZXNcIjtcbmltcG9ydCB7IEFtYmllbnRMaWdodCB9IGZyb20gXCIuLi9saWdodC9BbWJpZW50TGlnaHRcIjtcbmltcG9ydCB7IERpcmVjdGlvbmFsTGlnaHQgfSBmcm9tIFwiLi4vbGlnaHQvRGlyZWN0aW9uYWxMaWdodFwiO1xuaW1wb3J0IHsgTGlnaHQgfSBmcm9tIFwiLi4vbGlnaHQvTGlnaHRcIjtcbmltcG9ydCB7IFBvaW50TGlnaHQgfSBmcm9tIFwiLi4vbGlnaHQvUG9pbnRMaWdodFwiO1xuaW1wb3J0IHsgU3BvdExpZ2h0IH0gZnJvbSBcIi4uL2xpZ2h0L1Nwb3RMaWdodFwiO1xuaW1wb3J0IFZlY3RvcjMgZnJvbSBcIi4uL21hdGgvVmVjdG9yM1wiO1xuaW1wb3J0IFNhbXBsZXIgZnJvbSBcIi4uL3JlbmRlci9TYW1wbGVyXCI7XG5pbXBvcnQgU2hhZGVyRGF0YSBmcm9tIFwiLi4vcmVuZGVyL1NoYWRlckRhdGFcIjtcbmltcG9ydCBUZXh0dXJlIGZyb20gXCIuLi9yZW5kZXIvVGV4dHVyZVwiO1xuaW1wb3J0IFVuaWZvcm1CdWZmZXIgZnJvbSBcIi4uL3JlbmRlci9Vbmlmb3JtQnVmZmVyXCI7XG5pbXBvcnQgeyBGcmFtZVN0YXRlIH0gZnJvbSBcIi4vRnJhbWVTdGF0ZVwiO1xuaW1wb3J0IHtcblx0VGV4dHVyZVVzYWdlLFxuXHRCdWZmZXJVc2FnZSxcblx0VGV4dHVyZUZvcm1hdCxcblx0Q29tcGFyZUZ1bmN0aW9uLFxuXHRTYW1wbGVyQmluZGluZ1R5cGUsXG5cdFRleHR1cmVTYW1wbGVUeXBlLFxuXHRUZXh0dXJlVmlld0RpbWVuc2lvbixcblx0QnVmZmVyQmluZGluZ1R5cGVcbn0gZnJvbSBcIi4vV2ViR1BVQ29uc3RhbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlnaHRNYW5nZXIge1xuXHRsaWdodFVuaWZvcm1CdWZmZXI6IFVuaWZvcm1CdWZmZXI7XG5cdHNoYWRvd1VuaWZvcm1CdWZmZXI6IFVuaWZvcm1CdWZmZXI7XG5cdHBvaW50TGlnaHRzOiBQb2ludExpZ2h0W107XG5cblx0c3BvdExpZ2h0czogU3BvdExpZ2h0W107XG5cblx0ZGlyZWN0TGlnaHRzOiBEaXJlY3Rpb25hbExpZ2h0W107XG5cblx0YW1iaWVudExpZ2h0OiBBbWJpZW50TGlnaHQ7XG5cblx0bGlnaHRTaGFkZXJEYXRhOiBTaGFkZXJEYXRhO1xuXG5cdGxpZ2h0Q291bnREaXJ0eTogYm9vbGVhbjtcblxuXHRwcml2YXRlIG9wZW5TaGFkb3c6IGJvb2xlYW47XG5cdHNwb3RMaWdodFNoYWRvd01hcFRleHR1cmVBcnJheTogVGV4dHVyZTtcblx0cG9pbnRMaWdodFNoYWRvd01hcFRleHR1cmVBcnJheTogVGV4dHVyZTtcblx0ZGlyZWN0TGlnaHRTaGFkb3dNYXBUZXh0dXJlQXJyYXk6IFRleHR1cmU7XG5cdF90ZXN0VGV4dHVyZTogVGV4dHVyZTtcblxuXHRjb25zdHJ1Y3RvcihvcHRpb25zOiBMaWdodE1hbmdlck9wdGlvbnMpIHtcblx0XHR0aGlzLnNwb3RMaWdodHMgPSBbXTtcblx0XHR0aGlzLnBvaW50TGlnaHRzID0gW107XG5cdFx0dGhpcy5kaXJlY3RMaWdodHMgPSBbXTtcblx0XHR0aGlzLmFtYmllbnRMaWdodCA9IG5ldyBBbWJpZW50TGlnaHQobmV3IFZlY3RvcjMoMS4wLCAxLjAsIDEuMCksIDAuMik7XG5cdFx0dGhpcy5saWdodENvdW50RGlydHkgPSB0cnVlO1xuXHRcdHRoaXMub3BlblNoYWRvdyA9IG9wdGlvbnMub3BlblNoYWRvdztcblx0fVxuXHR1cGRhdGUoZnJhbWVTdGF0ZTogRnJhbWVTdGF0ZSwgY2FtZXJhOiBDYW1lcmEpIHtcblx0XHR0aGlzLmNoZWNrTGlnaHRTaGFkb3dTdGF0ZSgpO1xuXHRcdHRoaXMudXBkYXRlTGlnaHQoY2FtZXJhKTtcblx0fVxuXHRhZGQobGlnaHQ6IExpZ2h0KSB7XG5cdFx0dGhpcy5saWdodENvdW50RGlydHkgPSB0cnVlO1xuXHRcdGlmIChsaWdodC5saWdodFR5cGUgPT0gTGlnaHRUeXBlLkFtYmllbnRMaWdodCkge1xuXHRcdFx0dGhpcy5hbWJpZW50TGlnaHQgPSA8QW1iaWVudExpZ2h0PmxpZ2h0O1xuXHRcdH0gZWxzZSBpZiAobGlnaHQubGlnaHRUeXBlID09IExpZ2h0VHlwZS5EaXJlY3Rpb25hbExpZ2h0KSB7XG5cdFx0XHR0aGlzLmRpcmVjdExpZ2h0cy5wdXNoKDxEaXJlY3Rpb25hbExpZ2h0PmxpZ2h0KTtcblx0XHR9IGVsc2UgaWYgKGxpZ2h0LmxpZ2h0VHlwZSA9PSBMaWdodFR5cGUuUG9pbnRMaWdodCkge1xuXHRcdFx0dGhpcy5wb2ludExpZ2h0cy5wdXNoKDxQb2ludExpZ2h0PmxpZ2h0KTtcblx0XHR9IGVsc2UgaWYgKGxpZ2h0LmxpZ2h0VHlwZSA9PSBMaWdodFR5cGUuU3BvdExpZ2h0KSB7XG5cdFx0XHR0aGlzLnNwb3RMaWdodHMucHVzaCg8U3BvdExpZ2h0PmxpZ2h0KTtcblx0XHR9XG5cdH1cblx0cmVtb3ZlKGxpZ2h0OiBMaWdodCkge1xuXHRcdHRoaXMubGlnaHRDb3VudERpcnR5ID0gdHJ1ZTtcblx0XHRpZiAobGlnaHQubGlnaHRUeXBlID09IExpZ2h0VHlwZS5BbWJpZW50TGlnaHQpIHtcblx0XHRcdHRoaXMuYW1iaWVudExpZ2h0ID0gbmV3IEFtYmllbnRMaWdodChuZXcgVmVjdG9yMygxLjAsIDEuMCwgMS4wKSwgMS4wKTtcblx0XHR9IGVsc2UgaWYgKGxpZ2h0LmxpZ2h0VHlwZSA9PSBMaWdodFR5cGUuRGlyZWN0aW9uYWxMaWdodCkge1xuXHRcdFx0dGhpcy5kaXJlY3RMaWdodHMuc3BsaWNlKHRoaXMuZGlyZWN0TGlnaHRzLmluZGV4T2YoPERpcmVjdGlvbmFsTGlnaHQ+bGlnaHQpLCAxKTtcblx0XHR9IGVsc2UgaWYgKGxpZ2h0LmxpZ2h0VHlwZSA9PSBMaWdodFR5cGUuUG9pbnRMaWdodCkge1xuXHRcdFx0dGhpcy5wb2ludExpZ2h0cy5zcGxpY2UodGhpcy5wb2ludExpZ2h0cy5pbmRleE9mKDxQb2ludExpZ2h0PmxpZ2h0KSwgMSk7XG5cdFx0fSBlbHNlIGlmIChsaWdodC5saWdodFR5cGUgPT0gTGlnaHRUeXBlLlNwb3RMaWdodCkge1xuXHRcdFx0dGhpcy5zcG90TGlnaHRzLnNwbGljZSh0aGlzLnNwb3RMaWdodHMuaW5kZXhPZig8U3BvdExpZ2h0PmxpZ2h0KSwgMSk7XG5cdFx0fVxuXHR9XG5cdGNoZWNrTGlnaHRTaGFkb3dTdGF0ZSgpIHtcblx0XHRjb25zdCBsaWdodHMgPSB0aGlzLmdldEFsbExpZ2h0cygpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGlnaHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBsaWdodCA9IGxpZ2h0c1tpXTtcblx0XHRcdGlmIChsaWdodC5zaGFkb3dEaXJ0eSkge1xuXHRcdFx0XHRsaWdodC5zaGFkb3dEaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHR0aGlzLmxpZ2h0Q291bnREaXJ0eSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0dXBkYXRlTGlnaHRTaGFkb3coKSB7XG5cdFx0aWYgKHRoaXMuc3BvdExpZ2h0U2hhZG93TWFwVGV4dHVyZUFycmF5KSB0aGlzLnNwb3RMaWdodFNoYWRvd01hcFRleHR1cmVBcnJheS5kaXJ0eSA9IHRydWU7XG5cblx0XHRpZiAodGhpcy5wb2ludExpZ2h0U2hhZG93TWFwVGV4dHVyZUFycmF5KSB0aGlzLnBvaW50TGlnaHRTaGFkb3dNYXBUZXh0dXJlQXJyYXkuZGlydHkgPSB0cnVlO1xuXG5cdFx0aWYgKHRoaXMuZGlyZWN0TGlnaHRTaGFkb3dNYXBUZXh0dXJlQXJyYXkpIHRoaXMuZGlyZWN0TGlnaHRTaGFkb3dNYXBUZXh0dXJlQXJyYXkuZGlydHkgPSB0cnVlO1xuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVMaWdodChjYW1lcmE6IENhbWVyYSkge1xuXHRcdGlmICh0aGlzLmxpZ2h0Q291bnREaXJ0eSkge1xuXHRcdFx0dGhpcy5saWdodENvdW50RGlydHkgPSBmYWxzZTtcblx0XHRcdGlmICh0aGlzLmxpZ2h0U2hhZGVyRGF0YSkgdGhpcy5saWdodFNoYWRlckRhdGEuZGVzdHJveSgpO1xuXHRcdFx0dGhpcy5jcmVhdGVMaWdodFNoYWRlckRhdGEoKTtcblx0XHR9XG5cdH1cblx0cHJpdmF0ZSBjcmVhdGVMaWdodFNoYWRlckRhdGEoKSB7XG5cdFx0dGhpcy5saWdodFNoYWRlckRhdGEgPSBuZXcgU2hhZGVyRGF0YShcImxpZ2h0XCIsIDAsIDIsIDIpO1xuXHRcdHRoaXMubGlnaHRVbmlmb3JtQnVmZmVyID0gbmV3IFVuaWZvcm1CdWZmZXIoe1xuXHRcdFx0bGFiZWw6IFwibGlnaHRcIixcblx0XHRcdHR5cGU6IEJ1ZmZlckJpbmRpbmdUeXBlLlJlYWRPbmx5U3RvcmFnZSxcblx0XHRcdHVzYWdlOiBCdWZmZXJVc2FnZS5TdG9yYWdlIHwgQnVmZmVyVXNhZ2UuQ29weURzdFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5saWdodFNoYWRlckRhdGEuc2V0RGVmaW5lKFwic3BvdExpZ2h0c0NvdW50XCIsIHRoaXMuc3BvdExpZ2h0cy5sZW5ndGgpO1xuXHRcdHRoaXMubGlnaHRTaGFkZXJEYXRhLnNldERlZmluZShcInBvaW50TGlnaHRzQ291bnRcIiwgdGhpcy5wb2ludExpZ2h0cy5sZW5ndGgpO1xuXHRcdHRoaXMubGlnaHRTaGFkZXJEYXRhLnNldERlZmluZShcImRpcnRlY3RMaWdodHNDb3VudFwiLCB0aGlzLmRpcmVjdExpZ2h0cy5sZW5ndGgpO1xuXHRcdHRoaXMubGlnaHRTaGFkZXJEYXRhLnNldERlZmluZShcImFtYmllbnRMaWdodENvdW50XCIsIDEpO1xuXG5cdFx0dGhpcy5saWdodFNoYWRlckRhdGEuc2V0RGVmaW5lKFwiVVNFX1NQT1RMSUdIVFwiLCB0aGlzLnNwb3RMaWdodHMubGVuZ3RoKTtcblx0XHR0aGlzLmxpZ2h0U2hhZGVyRGF0YS5zZXREZWZpbmUoXCJVU0VfUE9JTlRMSUdIVFwiLCB0aGlzLnBvaW50TGlnaHRzLmxlbmd0aCk7XG5cdFx0dGhpcy5saWdodFNoYWRlckRhdGEuc2V0RGVmaW5lKFwiVVNFX0RJUlRFQ1RMSUdIVFwiLCB0aGlzLmRpcmVjdExpZ2h0cy5sZW5ndGgpO1xuXHRcdHRoaXMubGlnaHRTaGFkZXJEYXRhLnNldERlZmluZShcIlVTRV9BTUJJRU5UTElHSFRcIiwgMSk7XG5cdFx0aWYgKHRoaXMuYW1iaWVudExpZ2h0KVxuXHRcdFx0dGhpcy5saWdodFVuaWZvcm1CdWZmZXIuc2V0VW5pZm9ybShcblx0XHRcdFx0XCJhbWJpZW50TGlnaHRcIixcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmFtYmllbnRMaWdodC5Db2xvckFuZEludGVuc2l0eTtcblx0XHRcdFx0fSxcblx0XHRcdFx0VW5pZm9ybUVudW0uRmxvYXRWZWM0XG5cdFx0XHQpO1xuXHRcdGlmICh0aGlzLnNwb3RMaWdodHMubGVuZ3RoKSB7XG5cdFx0XHQvLyDliJ3lp4vljJbogZrlhYnnga9cblx0XHRcdHRoaXMubGlnaHRVbmlmb3JtQnVmZmVyLnNldFVuaWZvcm0oXG5cdFx0XHRcdFwic3BvdExpZ2h0c1wiLFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuc3BvdExpZ2h0cztcblx0XHRcdFx0fSxcblx0XHRcdFx0VW5pZm9ybUVudW0uU3BvdExpZ2h0cyxcblx0XHRcdFx0dGhpcy5zcG90TGlnaHRzLmxlbmd0aFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0aWYgKHRoaXMucG9pbnRMaWdodHMubGVuZ3RoKSB7XG5cdFx0XHQvLyDngrnlhYnmupBcblx0XHRcdHRoaXMubGlnaHRVbmlmb3JtQnVmZmVyLnNldFVuaWZvcm0oXG5cdFx0XHRcdFwicG9pbnRMaWdodHNcIixcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLnBvaW50TGlnaHRzO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRVbmlmb3JtRW51bS5Qb2ludExpZ2h0cyxcblx0XHRcdFx0dGhpcy5wb2ludExpZ2h0cy5sZW5ndGhcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmRpcmVjdExpZ2h0cy5sZW5ndGgpIHtcblx0XHRcdC8vIOaWueWQkeWFiVxuXHRcdFx0dGhpcy5saWdodFVuaWZvcm1CdWZmZXIuc2V0VW5pZm9ybShcblx0XHRcdFx0XCJkaXJlY3RMaWdodHNcIixcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmRpcmVjdExpZ2h0cztcblx0XHRcdFx0fSxcblx0XHRcdFx0VW5pZm9ybUVudW0uRGlydGVjdExpZ2h0cyxcblx0XHRcdFx0dGhpcy5kaXJlY3RMaWdodHMubGVuZ3RoXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHNoYWRvd1NoYWRlckRhdGE6IHtcblx0XHRcdGlmICh0aGlzLm9wZW5TaGFkb3cpIHtcblx0XHRcdFx0Y29uc3Qgc3BvdExpZ2h0U2hhZG93TWFwVGV4dHVyZUFycmF5ID0gKHRoaXMuc3BvdExpZ2h0U2hhZG93TWFwVGV4dHVyZUFycmF5ID1cblx0XHRcdFx0XHR0aGlzLmNyZWF0ZVNoYWRvd01hcFRleHR1cmVBcnJheSh0aGlzLnNwb3RMaWdodHMpKTtcblx0XHRcdFx0Y29uc3QgcG9pbnRMaWdodFNoYWRvd01hcFRleHR1cmVBcnJheSA9ICh0aGlzLnBvaW50TGlnaHRTaGFkb3dNYXBUZXh0dXJlQXJyYXkgPVxuXHRcdFx0XHRcdHRoaXMuY3JlYXRlU2hhZG93TWFwVGV4dHVyZUFycmF5KHRoaXMucG9pbnRMaWdodHMpKTtcblx0XHRcdFx0Y29uc3QgZGlyZWN0TGlnaHRTaGFkb3dNYXBUZXh0dXJlQXJyYXkgPSAodGhpcy5kaXJlY3RMaWdodFNoYWRvd01hcFRleHR1cmVBcnJheSA9XG5cdFx0XHRcdFx0dGhpcy5jcmVhdGVTaGFkb3dNYXBUZXh0dXJlQXJyYXkodGhpcy5kaXJlY3RMaWdodHMpKTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdCFzcG90TGlnaHRTaGFkb3dNYXBUZXh0dXJlQXJyYXkgJiZcblx0XHRcdFx0XHQhcG9pbnRMaWdodFNoYWRvd01hcFRleHR1cmVBcnJheSAmJlxuXHRcdFx0XHRcdCFkaXJlY3RMaWdodFNoYWRvd01hcFRleHR1cmVBcnJheVxuXHRcdFx0XHQpXG5cdFx0XHRcdFx0YnJlYWsgc2hhZG93U2hhZGVyRGF0YTtcblxuXHRcdFx0XHQvLyBkZWZpbmVcblx0XHRcdFx0dGhpcy5saWdodFNoYWRlckRhdGEuc2V0RGVmaW5lKFwib3BlblNoYWRvd1wiLCB0aGlzLm9wZW5TaGFkb3cpO1xuXHRcdFx0XHR0aGlzLmxpZ2h0U2hhZGVyRGF0YS5zZXREZWZpbmUoXCJPUEVOX1NIQURPV1wiLCB0aGlzLm9wZW5TaGFkb3cpO1xuXG5cdFx0XHRcdC8vIHNoYWRvd1VuaWZvcm1CdWZmZXJcblx0XHRcdFx0dGhpcy5zaGFkb3dVbmlmb3JtQnVmZmVyID0gbmV3IFVuaWZvcm1CdWZmZXIoe1xuXHRcdFx0XHRcdGxhYmVsOiBcInNoYWRvd1wiLFxuXHRcdFx0XHRcdHR5cGU6IEJ1ZmZlckJpbmRpbmdUeXBlLlJlYWRPbmx5U3RvcmFnZSxcblx0XHRcdFx0XHR1c2FnZTogQnVmZmVyVXNhZ2UuU3RvcmFnZSB8IEJ1ZmZlclVzYWdlLkNvcHlEc3Rcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gbWF0cml4LG5lYXIsZmFyLi4uXG5cdFx0XHRcdGNvbnN0IHNwb3RMaWdodFdpdGhTaGFkb3dDb3VudCA9IHRoaXMuc2V0U2hhZG93VW5pZm9ybShcblx0XHRcdFx0XHRcInNwb3RMaWdodFNoYWRvd3NcIixcblx0XHRcdFx0XHR0aGlzLnNwb3RMaWdodHMsXG5cdFx0XHRcdFx0VW5pZm9ybUVudW0uU3BvdExpZ2h0U2hhZG93c1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBwb2ludExpZ2h0V2l0aFNoYWRvd0NvdW50ID0gdGhpcy5zZXRTaGFkb3dVbmlmb3JtKFxuXHRcdFx0XHRcdFwicG9pbnRMaWdodFNoYWRvd3NcIixcblx0XHRcdFx0XHR0aGlzLnBvaW50TGlnaHRzLFxuXHRcdFx0XHRcdFVuaWZvcm1FbnVtLlBvaW50TGlnaHRTaGFkb3dzXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IGRpcmVjdExpZ2h0V2l0aFNoYWRvd0NvdW50ID0gdGhpcy5zZXRTaGFkb3dVbmlmb3JtKFxuXHRcdFx0XHRcdFwiZGlyZWN0TGlnaHRTaGFkb3dzXCIsXG5cdFx0XHRcdFx0dGhpcy5kaXJlY3RMaWdodHMsXG5cdFx0XHRcdFx0VW5pZm9ybUVudW0uRGlydGVjdExpZ2h0U2hhZG93c1xuXHRcdFx0XHQpO1xuXHRcdFx0XHR0aGlzLmxpZ2h0U2hhZGVyRGF0YS5zZXRVbmlmb3JtQnVmZmVyKFwic2hhZG93XCIsIHRoaXMuc2hhZG93VW5pZm9ybUJ1ZmZlcik7XG5cblx0XHRcdFx0dGhpcy5saWdodFNoYWRlckRhdGEuc2V0RGVmaW5lKFwic3BvdExpZ2h0U2hhZG93TWFwc0NvdW50XCIsIHNwb3RMaWdodFdpdGhTaGFkb3dDb3VudCk7XG5cdFx0XHRcdHRoaXMubGlnaHRTaGFkZXJEYXRhLnNldERlZmluZShcInBvaW50TGlnaHRTaGFkb3dNYXBzQ291bnRcIiwgcG9pbnRMaWdodFdpdGhTaGFkb3dDb3VudCk7XG5cdFx0XHRcdHRoaXMubGlnaHRTaGFkZXJEYXRhLnNldERlZmluZShcImRpcmVjdExpZ2h0U2hhZG93TWFwc0NvdW50XCIsIGRpcmVjdExpZ2h0V2l0aFNoYWRvd0NvdW50KTtcblxuXHRcdFx0XHR0aGlzLmxpZ2h0U2hhZGVyRGF0YS5zZXREZWZpbmUoXCJVU0VfU1BPVExJR0hUX1NIQURPV01BUFwiLCBzcG90TGlnaHRXaXRoU2hhZG93Q291bnQpO1xuXHRcdFx0XHR0aGlzLmxpZ2h0U2hhZGVyRGF0YS5zZXREZWZpbmUoXCJVU0VfUE9JTlRMSUdIVF9TSEFET1dNQVBcIiwgcG9pbnRMaWdodFdpdGhTaGFkb3dDb3VudCk7XG5cdFx0XHRcdHRoaXMubGlnaHRTaGFkZXJEYXRhLnNldERlZmluZShcIlVTRV9ESVJFQ1RMSUdIVF9TSEFET1dNQVBcIiwgZGlyZWN0TGlnaHRXaXRoU2hhZG93Q291bnQpO1xuXHRcdFx0XHQvLyB0ZXh0dXJlLHNhbXBsZVxuXHRcdFx0XHRpZiAoc3BvdExpZ2h0U2hhZG93TWFwVGV4dHVyZUFycmF5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpZiAoc3BvdExpZ2h0U2hhZG93TWFwVGV4dHVyZUFycmF5LnRleHR1cmVQcm9wLnNpemUuZGVwdGggIT0gc3BvdExpZ2h0V2l0aFNoYWRvd0NvdW50KVxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKFwic3BvdExpZ2h0U2hhZG93TWFwIGFsaWduIGhhcyBwcm9ibGVtXCIpO1xuXHRcdFx0XHRcdHRoaXMubGlnaHRTaGFkZXJEYXRhLnNldFRleHR1cmUoXCJzcG90TGlnaHRTaGFkb3dNYXBUZXh0dXJlQXJyYXlcIiwgc3BvdExpZ2h0U2hhZG93TWFwVGV4dHVyZUFycmF5KTtcblx0XHRcdFx0XHR0aGlzLmxpZ2h0U2hhZGVyRGF0YS5zZXREZWZpbmUoXCJTUE9UTElHSFRfU0hBRE9XTUFQX1RFWFRVUkVBUlJBWVwiLCB0cnVlKTtcblx0XHRcdFx0XHQvLyB0aGlzLl90ZXN0VGV4dHVyZSA9IHNwb3RMaWdodFNoYWRvd01hcFRleHR1cmVBcnJheVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwb2ludExpZ2h0U2hhZG93TWFwVGV4dHVyZUFycmF5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpZiAocG9pbnRMaWdodFNoYWRvd01hcFRleHR1cmVBcnJheS50ZXh0dXJlUHJvcC5zaXplLmRlcHRoICE9IHBvaW50TGlnaHRXaXRoU2hhZG93Q291bnQpXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oXCJwb2ludExpZ2h0U2hhZG93TWFwIGFsaWduIGhhcyBwcm9ibGVtXCIpO1xuXHRcdFx0XHRcdHRoaXMubGlnaHRTaGFkZXJEYXRhLnNldFRleHR1cmUoXCJwb2ludExpZ2h0U2hhZG93TWFwVGV4dHVyZUFycmF5XCIsIHBvaW50TGlnaHRTaGFkb3dNYXBUZXh0dXJlQXJyYXkpO1xuXHRcdFx0XHRcdHRoaXMubGlnaHRTaGFkZXJEYXRhLnNldERlZmluZShcIlBPSU5UTElHSFRfU0hBRE9XTUFQX1RFWFRVUkVBUlJBWVwiLCB0cnVlKTtcblx0XHRcdFx0XHQvLyB0aGlzLl90ZXN0VGV4dHVyZSA9IHBvaW50TGlnaHRTaGFkb3dNYXBUZXh0dXJlQXJyYXk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGRpcmVjdExpZ2h0U2hhZG93TWFwVGV4dHVyZUFycmF5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpZiAoZGlyZWN0TGlnaHRTaGFkb3dNYXBUZXh0dXJlQXJyYXkudGV4dHVyZVByb3Auc2l6ZS5kZXB0aCAhPSBkaXJlY3RMaWdodFdpdGhTaGFkb3dDb3VudClcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybihcImRpcmVjdExpZ2h0U2hhZG93TWFwIGFsaWduIGhhcyBwcm9ibGVtXCIpO1xuXHRcdFx0XHRcdHRoaXMubGlnaHRTaGFkZXJEYXRhLnNldFRleHR1cmUoXG5cdFx0XHRcdFx0XHRcImRpcmVjdExpZ2h0U2hhZG93TWFwVGV4dHVyZUFycmF5XCIsXG5cdFx0XHRcdFx0XHRkaXJlY3RMaWdodFNoYWRvd01hcFRleHR1cmVBcnJheVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0dGhpcy5saWdodFNoYWRlckRhdGEuc2V0RGVmaW5lKFwiRElSRUNUTElHSFRfU0hBRE9XTUFQX1RFWFRVUkVBUlJBWVwiLCB0cnVlKTtcblx0XHRcdFx0XHQvLyB0aGlzLl90ZXN0VGV4dHVyZSA9IGRpcmVjdExpZ2h0U2hhZG93TWFwVGV4dHVyZUFycmF5XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5saWdodFNoYWRlckRhdGEuc2V0U2FtcGxlcihcblx0XHRcdFx0XHRcInNoYWRvd1NhbXBsZXJcIixcblx0XHRcdFx0XHRuZXcgU2FtcGxlcih7IGNvbXBhcmU6IENvbXBhcmVGdW5jdGlvbi5MZXNzIH0sIHsgdHlwZTogU2FtcGxlckJpbmRpbmdUeXBlLkNvbXBhcmlzb24gfSlcblx0XHRcdFx0KTtcblx0XHRcdFx0Ly8gdGhpcy5saWdodFNoYWRlckRhdGEuc2V0U2FtcGxlcihcInNoYWRvd1NhbXBsZXJcIiwgbmV3IFNhbXBsZXIoKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5saWdodFNoYWRlckRhdGEuc2V0VW5pZm9ybUJ1ZmZlcihcImxpZ2h0XCIsIHRoaXMubGlnaHRVbmlmb3JtQnVmZmVyKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRBbGxMaWdodHMoKTogQXJyYXk8TGlnaHQ+IHtcblx0XHRjb25zdCByZXN1bHQgPSBbXTtcblx0XHRyZXR1cm4gcmVzdWx0LmNvbmNhdCh0aGlzLnNwb3RMaWdodHMsIHRoaXMucG9pbnRMaWdodHMsIHRoaXMuZGlyZWN0TGlnaHRzKTtcblx0fVxuXG5cdGRlc3Ryb3koKSB7XG5cdFx0dGhpcy5saWdodFNoYWRlckRhdGEuZGVzdHJveSgpO1xuXHRcdHRoaXMubGlnaHRVbmlmb3JtQnVmZmVyLmRlc3Ryb3koKTtcblx0fVxuXG5cdGNyZWF0ZVNoYWRvd01hcFRleHR1cmVBcnJheShsaWdodHM6IEFycmF5PExpZ2h0Pikge1xuXHRcdGlmIChsaWdodHMubGVuZ3RoIDw9IDApIHJldHVybiB1bmRlZmluZWQ7XG5cdFx0Y29uc3Qgc2hhZG93TWFwU291cmNlcyA9IFtdO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGlnaHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBsaWdodCA9IGxpZ2h0c1tpXTtcblx0XHRcdGlmIChsaWdodC5zaGFkb3cpIHtcblx0XHRcdFx0Y29uc3Qgc2hhZG93TWFwVGV4dHVyZSA9IGxpZ2h0LnNoYWRvdy5nZXRTaGFkb3dNYXBUZXh0dXJlKCk7XG5cdFx0XHRcdGNvbnN0IHNoYWRvd01hcFNvdXJjZSA9IHtcblx0XHRcdFx0XHRzb3VyY2U6IHNoYWRvd01hcFRleHR1cmUsXG5cdFx0XHRcdFx0d2lkdGg6IHNoYWRvd01hcFRleHR1cmUudGV4dHVyZVByb3Auc2l6ZS53aWR0aCxcblx0XHRcdFx0XHRoZWlnaHQ6IHNoYWRvd01hcFRleHR1cmUudGV4dHVyZVByb3Auc2l6ZS5oZWlnaHQsXG5cdFx0XHRcdFx0ZGVwdGg6IDEsXG5cdFx0XHRcdFx0eDogMCxcblx0XHRcdFx0XHR5OiAwLFxuXHRcdFx0XHRcdHo6IGlcblx0XHRcdFx0fTtcblx0XHRcdFx0c2hhZG93TWFwU291cmNlcy5wdXNoKHNoYWRvd01hcFNvdXJjZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNoYWRvd01hcFNvdXJjZXMubGVuZ3RoIDw9IDApIHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBzaGFkb3dNYXBUZXh0dXJlQXJyYXkgPSBuZXcgVGV4dHVyZSh7XG5cdFx0XHRzaXplOiB7XG5cdFx0XHRcdHdpZHRoOiBzaGFkb3dNYXBTb3VyY2VzWzBdLndpZHRoLFxuXHRcdFx0XHRoZWlnaHQ6IHNoYWRvd01hcFNvdXJjZXNbMF0uaGVpZ2h0LFxuXHRcdFx0XHRkZXB0aDogc2hhZG93TWFwU291cmNlcy5sZW5ndGhcblx0XHRcdH0sXG5cdFx0XHRmaXhlZFNpemU6IHRydWUsXG5cdFx0XHRzYW1wbGVUeXBlOiBUZXh0dXJlU2FtcGxlVHlwZS5EZXB0aCxcblx0XHRcdGZvcm1hdDogVGV4dHVyZUZvcm1hdC5EZXB0aDI0UGx1cyxcblx0XHRcdHVzYWdlOiBUZXh0dXJlVXNhZ2UuVGV4dHVyZUJpbmRpbmcgfCBUZXh0dXJlVXNhZ2UuQ29weURzdCxcblx0XHRcdGRhdGE6IHNoYWRvd01hcFNvdXJjZXMsXG5cdFx0XHR2aWV3Rm9ybWF0czogVGV4dHVyZVZpZXdEaW1lbnNpb24uRTJkQXJyYXlcblx0XHR9KTtcblxuXHRcdHJldHVybiBzaGFkb3dNYXBUZXh0dXJlQXJyYXk7XG5cdH1cblxuXHRzZXRTaGFkb3dVbmlmb3JtKHVuaWZvcm1OYW1lOiBzdHJpbmcsIGxpZ2h0czogQXJyYXk8TGlnaHQ+LCB1bmlmb3JtVHlwZTogVW5pZm9ybUVudW0pIHtcblx0XHRpZiAobGlnaHRzLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgbGlnaHRXaXRoU2hhZG93QXJyYXkgPSBbXTtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGlnaHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IGxpZ2h0ID0gbGlnaHRzW2ldO1xuXHRcdFx0XHRpZiAoIWxpZ2h0LnNoYWRvdykgY29udGludWU7XG5cdFx0XHRcdGxpZ2h0V2l0aFNoYWRvd0FycmF5LnB1c2gobGlnaHQpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNoYWRvd1VuaWZvcm1CdWZmZXIuc2V0VW5pZm9ybShcblx0XHRcdFx0dW5pZm9ybU5hbWUsXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gbGlnaHRXaXRoU2hhZG93QXJyYXk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHVuaWZvcm1UeXBlLFxuXHRcdFx0XHRsaWdodFdpdGhTaGFkb3dBcnJheS5sZW5ndGhcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybiBsaWdodFdpdGhTaGFkb3dBcnJheS5sZW5ndGg7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQgQ2FtZXJhIGZyb20gXCIuLi9jYW1lcmEvQ2FtZXJhXCI7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tIFwiLi4vbWVzaC9NZXNoXCI7XHJcbmltcG9ydCB7IEZyYW1lU3RhdGUgfSBmcm9tIFwiLi9GcmFtZVN0YXRlXCI7XHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lc2hNYW5nZXIge1xyXG5cdHByaXZhdGUgX2xpc3Q6IE1hcDxzdHJpbmcgfCBudW1iZXIsIE1lc2g+O1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0dGhpcy5fbGlzdCA9IG5ldyBNYXAoKTtcclxuXHR9XHJcblx0Z2V0IGxlbmd0aCgpIHtcclxuXHRcdHJldHVybiB0aGlzLl9saXN0LnNpemU7XHJcblx0fVxyXG5cdHVwZGF0ZShmcmFtZVN0YXRlOiBGcmFtZVN0YXRlLCBjYW1lcmE6IENhbWVyYSk6IHZvaWQge1xyXG5cdFx0dGhpcy5fbGlzdC5mb3JFYWNoKChpbnN0YW5jZSkgPT4ge1xyXG5cdFx0XHRpbnN0YW5jZS51cGRhdGUoZnJhbWVTdGF0ZSwgY2FtZXJhKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHRhZGQoaW5zdGFuY2U6IE1lc2gpOiBNZXNoIHtcclxuXHRcdGlmICh0aGlzLl9saXN0LmdldChpbnN0YW5jZS51aWQpKSByZXR1cm4gdGhpcy5fbGlzdC5nZXQoaW5zdGFuY2UudWlkKTtcclxuXHRcdHRoaXMuX2xpc3Quc2V0KGluc3RhbmNlLnVpZCwgaW5zdGFuY2UpO1xyXG5cdFx0cmV0dXJuIGluc3RhbmNlO1xyXG5cdH1cclxuXHRyZW1vdmUoaW5zdGFuY2U6IE1lc2gpOiBib29sZWFuIHtcclxuXHRcdGlmICh0aGlzLl9saXN0LmdldChpbnN0YW5jZS51aWQpKSB7XHJcblx0XHRcdGluc3RhbmNlLmRlc3Ryb3koKTtcclxuXHRcdFx0dGhpcy5fbGlzdC5kZWxldGUoaW5zdGFuY2UudWlkKTtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG5cdGNvbnRhaW5zKGluc3RhbmNlOiBNZXNoKSB7XHJcblx0XHRyZXR1cm4gISF0aGlzLl9saXN0LmdldChpbnN0YW5jZS51aWQpO1xyXG5cdH1cclxufVxyXG4iLCJpbXBvcnQgeyBUZXh0dXJlRm9ybWF0LCBUZXh0dXJlVXNhZ2UgfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVDb25zdGFudFwiO1xuaW1wb3J0IEdlb21ldHJ5IGZyb20gXCIuLi9nZW9tZXRyeS9HZW9tZXRyeVwiO1xuaW1wb3J0IFNoYWRlck1hdGVyaWFsIGZyb20gXCIuLi9tYXRlcmlhbC9TaGFkZXJNYXRlcmlhbFwiO1xuaW1wb3J0IHsgTWVzaCB9IGZyb20gXCIuLi9tZXNoL01lc2hcIjtcbmltcG9ydCBBdHRhY2htZW50IGZyb20gXCIuLi9yZW5kZXIvQXR0YWNobWVudFwiO1xuaW1wb3J0IHsgRmxvYXQzMkF0dHJpYnV0ZSB9IGZyb20gXCIuLi9yZW5kZXIvQXR0cmlidXRlXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwiLi4vcmVuZGVyL0NvbnRleHRcIjtcbmltcG9ydCBSZW5kZXJUYXJnZXQgZnJvbSBcIi4uL3JlbmRlci9SZW5kZXJUYXJnZXRcIjtcbmltcG9ydCBTYW1wbGVyIGZyb20gXCIuLi9yZW5kZXIvU2FtcGxlclwiO1xuaW1wb3J0IFRleHR1cmUgZnJvbSBcIi4uL3JlbmRlci9UZXh0dXJlXCI7XG5pbXBvcnQgZ2V0VmVydEZyYWcgZnJvbSBcIi4uL3NoYWRlci9TaGFkZXJzXCI7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXNvbHZlRnJhbWUge1xuXHRjYW52YXNSZW5kZXJUYXJnZXQ6IFJlbmRlclRhcmdldDtcblx0bWF0ZXJpYWw6IFNoYWRlck1hdGVyaWFsO1xuXHRnZW9tZXRyeTogR2VvbWV0cnk7XG5cdHF1YWRNZXNoOiBNZXNoO1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLmdlb21ldHJ5ID0gbmV3IEdlb21ldHJ5KHt9KTtcblx0XHR0aGlzLmdlb21ldHJ5LnNldEF0dHJpYnV0ZShcblx0XHRcdG5ldyBGbG9hdDMyQXR0cmlidXRlKFwicG9zaXRpb25cIiwgWy0xLjAsIDEuMCwgLTEuMCwgLTEuMCwgMS4wLCAtMS4wLCAxLjAsIC0xLjAsIDEuMCwgMS4wLCAtMS4wLCAxLjBdLCAyKVxuXHRcdCk7XG5cdFx0dGhpcy5nZW9tZXRyeS5jb3VudCA9IDY7XG5cdFx0Y29uc3Qgc2hhZGVyID0gZ2V0VmVydEZyYWcoXCJyZXNvbHZlXCIsIHsgcG9zaXRpb25Mb2NhdGlvbjogMCB9KTtcblx0XHR0aGlzLm1hdGVyaWFsID0gbmV3IFNoYWRlck1hdGVyaWFsKHtcblx0XHRcdHNoYWRlcklkOiBcInJlc29sdmVcIixcblx0XHRcdGZyYWc6IHNoYWRlci5mcmFnLFxuXHRcdFx0dmVydDogc2hhZGVyLnZlcnQsXG5cdFx0XHR1bmlmb3JtVGV4dHVyZUFuZFNhbXBsZXI6IHtcblx0XHRcdFx0dGV4dHVyZToge1xuXHRcdFx0XHRcdHR5cGU6IFwidGV4dHVyZVwiLFxuXHRcdFx0XHRcdHZhbHVlOiB1bmRlZmluZWRcblx0XHRcdFx0fSxcblx0XHRcdFx0c2FtcGxlcjoge1xuXHRcdFx0XHRcdHR5cGU6IFwic2FtcGxlclwiLFxuXHRcdFx0XHRcdHZhbHVlOiBuZXcgU2FtcGxlcih7XG5cdFx0XHRcdFx0XHRtYWdGaWx0ZXI6IFwibGluZWFyXCIsXG5cdFx0XHRcdFx0XHRtaW5GaWx0ZXI6IFwibGluZWFyXCJcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0dGhpcy5xdWFkTWVzaCA9IG5ldyBNZXNoKHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwpO1xuXHR9XG5cdHNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcblx0XHR0aGlzLmNhbnZhc1JlbmRlclRhcmdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuXHRcdHRoaXMubWF0ZXJpYWwuZGlydHkgPSB0cnVlO1xuXHR9XG5cdHJlbmRlcihjb250ZXh0OiBDb250ZXh0LCBjb2xvclRleHR1cmU/OiBUZXh0dXJlKSB7XG5cdFx0aWYgKCF0aGlzLmNhbnZhc1JlbmRlclRhcmdldCkgdGhpcy5pbml0UmVuZGVyVGFyZ2V0KGNvbnRleHQpO1xuXHRcdC8vIHRoaXMubWF0ZXJpYWxcblx0XHR0aGlzLm1hdGVyaWFsLnNoYWRlck1hdGVyaWFsUGFybXMudW5pZm9ybVRleHR1cmVBbmRTYW1wbGVyLnRleHR1cmUudmFsdWUgPSBjb2xvclRleHR1cmU7XG5cblx0XHR0aGlzLm1hdGVyaWFsLnVwZGF0ZSh1bmRlZmluZWQsIHRoaXMucXVhZE1lc2gpO1xuXG5cdFx0Y29uc3QgZHJhd0NvbWFuZCA9IHRoaXMucXVhZE1lc2guZ2V0RHJhd0NvbW1hbmQoKTtcblxuXHRcdGNvbnN0IGN1cnJlbnRSZW5kZXJQYXNzRW5jb2RlciA9IHRoaXMuY2FudmFzUmVuZGVyVGFyZ2V0LmJlZ2luUmVuZGVyUGFzcyhjb250ZXh0LmRldmljZSk7XG5cblx0XHRkcmF3Q29tYW5kLnJlbmRlcih7IGRldmljZTogY29udGV4dC5kZXZpY2UsIHBhc3NFbmNvZGVyOiBjdXJyZW50UmVuZGVyUGFzc0VuY29kZXIgfSk7XG5cblx0XHR0aGlzLmNhbnZhc1JlbmRlclRhcmdldC5lbmRSZW5kZXJQYXNzKCk7XG5cdH1cblx0cHJpdmF0ZSBpbml0UmVuZGVyVGFyZ2V0KGNvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCB7IHdpZHRoLCBoZWlnaHQsIGRlcHRoIH0gPSBjb250ZXh0LnByZXNlbnRhdGlvblNpemU7XG5cdFx0Y29uc3QgY29sb3JBdHRhY2htZW50ID0gbmV3IEF0dGFjaG1lbnQoXG5cdFx0XHR7IHI6IDAuMCwgZzogMC4wLCBiOiAwLjAsIGE6IDAgfSxcblx0XHRcdHtcblx0XHRcdFx0dGV4dHVyZVZpZXc6ICgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gY29udGV4dC5jb250ZXh0LmdldEN1cnJlbnRUZXh0dXJlKCkuY3JlYXRlVmlldygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0KTtcblx0XHRjb25zdCBkZXB0aFRleHR1cmUgPSBuZXcgVGV4dHVyZSh7XG5cdFx0XHRsYWJlbDogXCJyZXNvbHZlRGVwdGhcIixcblx0XHRcdHNpemU6IHsgd2lkdGgsIGhlaWdodCwgZGVwdGggfSxcblx0XHRcdGZvcm1hdDogVGV4dHVyZUZvcm1hdC5EZXB0aDI0UGx1cyxcblx0XHRcdHVzYWdlOiBUZXh0dXJlVXNhZ2UuUmVuZGVyQXR0YWNobWVudFxuXHRcdH0pO1xuXHRcdGNvbnN0IGRlcHRoQXR0YWNobWVudCA9IG5ldyBBdHRhY2htZW50KDEuMCwgeyB0ZXh0dXJlOiBkZXB0aFRleHR1cmUgfSk7XG5cdFx0dGhpcy5jYW52YXNSZW5kZXJUYXJnZXQgPSBuZXcgUmVuZGVyVGFyZ2V0KFwicmVuZGVyXCIsIFtjb2xvckF0dGFjaG1lbnRdLCBkZXB0aEF0dGFjaG1lbnQpO1xuXHR9XG59XG4iLCJpbXBvcnQgQ29udGV4dCBmcm9tIFwiLi4vcmVuZGVyL0NvbnRleHRcIjtcclxuaW1wb3J0IFRleHR1cmUgZnJvbSBcIi4uL3JlbmRlci9UZXh0dXJlXCI7XHJcbmltcG9ydCBQb3N0RWZmZWN0IGZyb20gXCIuL1Bvc3RFZmZlY3RcIjtcclxuaW1wb3J0IFJlc29sdmVGcmFtZSBmcm9tIFwiLi9SZXNvbHZlRnJhbWVcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvc3RFZmZlY3RDb2xsZWN0aW9uIHtcclxuXHRwcml2YXRlIF9wb3N0RWZmZWN0czogTWFwPHN0cmluZywgUG9zdEVmZmVjdD47XHJcblx0cHVibGljIGN1cnJlbnRDb2xvclRleHR1cmU6IFRleHR1cmU7XHJcblx0cHJpdmF0ZSByZXNvbHZlRnJhbWU6IFJlc29sdmVGcmFtZTtcclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHRcdHRoaXMuX3Bvc3RFZmZlY3RzID0gbmV3IE1hcCgpO1xyXG5cdFx0dGhpcy5jdXJyZW50Q29sb3JUZXh0dXJlID0gdW5kZWZpbmVkO1xyXG5cdFx0dGhpcy5yZXNvbHZlRnJhbWUgPSBuZXcgUmVzb2x2ZUZyYW1lKCk7XHJcblx0fVxyXG5cdGFkZChwb3N0RWZmZWN0OiBQb3N0RWZmZWN0KSB7XHJcblx0XHR0aGlzLl9wb3N0RWZmZWN0cy5zZXQocG9zdEVmZmVjdC5pZCwgcG9zdEVmZmVjdCk7XHJcblx0fVxyXG5cdHJlbW92ZShwb3N0RWZmZWN0OiBQb3N0RWZmZWN0KSB7XHJcblx0XHR0aGlzLl9wb3N0RWZmZWN0cy5kZWxldGUocG9zdEVmZmVjdC5pZCk7XHJcblx0XHRwb3N0RWZmZWN0LmRlc3Ryb3koKTtcclxuXHR9XHJcblx0cmVuZGVyKGNvbnRleHQ6IENvbnRleHQsIGNvbG9yVGV4dHVyZTogVGV4dHVyZSk6IHZvaWQge1xyXG5cdFx0dGhpcy5jdXJyZW50Q29sb3JUZXh0dXJlID0gY29sb3JUZXh0dXJlO1xyXG5cdFx0dGhpcy5fcG9zdEVmZmVjdHMuZm9yRWFjaCgocG9zdEVmZmVjdCkgPT4ge1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRDb2xvclRleHR1cmUgPSBwb3N0RWZmZWN0LnJlbmRlcihjb250ZXh0LCB0aGlzLmN1cnJlbnRDb2xvclRleHR1cmUpO1xyXG5cdFx0fSk7XHJcblx0XHR0aGlzLnJlc29sdmVGcmFtZS5yZW5kZXIoY29udGV4dCwgdGhpcy5jdXJyZW50Q29sb3JUZXh0dXJlKTtcclxuXHR9XHJcblx0c2V0U2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG5cdFx0dGhpcy5fcG9zdEVmZmVjdHMuZm9yRWFjaCgocG9zdEVmZmVjdCkgPT4gcG9zdEVmZmVjdC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpKTtcclxuXHRcdHRoaXMucmVzb2x2ZUZyYW1lLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0fVxyXG5cdHByaXZhdGUgcG9zdEVmZmVjdHNTb3J0KCkge1xyXG5cdFx0Ly8gdGhpcy5fcG9zdEVmZmVjdHMuc29ydCgpXHJcblx0fVxyXG59XHJcbiIsImltcG9ydCB7IEZyYW1lU3RhdGUgfSBmcm9tIFwiLi4vY29yZS9GcmFtZVN0YXRlLmpzXCI7XHJcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSBcIi4uL21hdGVyaWFsL01hdGVyaWFsLmpzXCI7XHJcbmltcG9ydCBDb250ZXh0IGZyb20gXCIuLi9yZW5kZXIvQ29udGV4dC5qc1wiO1xyXG5pbXBvcnQgeyBUYXJnZXQgfSBmcm9tIFwiLi4vcmVuZGVyL1JlbmRlclN0YXRlXCI7XHJcbmltcG9ydCBSZW5kZXJUYXJnZXQgZnJvbSBcIi4uL3JlbmRlci9SZW5kZXJUYXJnZXQuanNcIjtcclxuaW1wb3J0IFRleHR1cmUgZnJvbSBcIi4uL3JlbmRlci9UZXh0dXJlLmpzXCI7XHJcblxyXG5jbGFzcyBQYXNzIHtcclxuXHRwdWJsaWMgcmVuZGVyVGFyZ2V0OiBSZW5kZXJUYXJnZXQ7XHJcblx0cHVibGljIGNvbXB1dGVUYXJnZXQ6IFJlbmRlclRhcmdldDtcclxuXHRwdWJsaWMgY29udGV4dDogQ29udGV4dDtcclxuXHRwdWJsaWMgb3ZlcnJpZGVNYXRlcmlhbD86IE1hdGVyaWFsO1xyXG5cdHB1YmxpYyBjb2xvclRhcmdldHM/OiBBcnJheTxUYXJnZXQ+O1xyXG5cdHB1YmxpYyBwYXNzUmVuZGVyRW5jb2RlcjogR1BVUmVuZGVyUGFzc0VuY29kZXIgfCBudWxsO1xyXG5cdHB1YmxpYyBwYXNzQ29tcHV0ZUVuY29kZXI6IEdQVUNvbXB1dGVQYXNzRW5jb2RlcjtcclxuXHRjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0KSB7XHJcblx0XHR0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xyXG5cdH1cclxuXHR1cGRhdGUoZnJhbWVTdGF0ZTogRnJhbWVTdGF0ZSk6IHZvaWQge1xyXG5cdFx0Ly8gdG9kbztcclxuXHR9XHJcblx0c2V0U2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG5cdFx0Ly8gdG9kbyA7XHJcblx0fVxyXG5cdGJlZm9yZVJlbmRlcihvcHRpb25zPzogYW55KSB7XHJcblx0XHR0aGlzLnBhc3NSZW5kZXJFbmNvZGVyID0gdGhpcy5yZW5kZXJUYXJnZXQuYmVnaW5SZW5kZXJQYXNzKHRoaXMuY29udGV4dC5kZXZpY2UpO1xyXG5cdFx0aWYgKHRoaXMuY29tcHV0ZVRhcmdldClcclxuXHRcdFx0dGhpcy5wYXNzQ29tcHV0ZUVuY29kZXIgPSB0aGlzLmNvbXB1dGVUYXJnZXQuYmVnaW5Db21wdXRlUGFzc0VuY29kZXIodGhpcy5jb250ZXh0LmRldmljZSk7XHJcblx0fVxyXG5cdGdldENvbG9yVGV4dHVyZShpbmRleCA9IDApOiBUZXh0dXJlIHtcclxuXHRcdHJldHVybiB0aGlzLnJlbmRlclRhcmdldC5nZXRDb2xvclRleHR1cmUoaW5kZXgpIGFzIFRleHR1cmU7XHJcblx0fVxyXG5cdGdldERlcHRoVGV4dHVyZSgpOiBUZXh0dXJlIHwgeyBncHVUZXh0dXJlOiBHUFVUZXh0dXJlIH0ge1xyXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0LmdldERlcHRoVGV4dHVyZSgpO1xyXG5cdH1cclxuXHRhZnRlclJlbmRlcigpIHtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0LmVuZFJlbmRlclBhc3MoKTtcclxuXHRcdGlmICh0aGlzLmNvbXB1dGVUYXJnZXQpIHRoaXMuY29tcHV0ZVRhcmdldC5lbmRDb21wdXRlUGFzc0VuY29kZXIoKTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBhc3M7XHJcbiIsImltcG9ydCBDYW1lcmEgZnJvbSBcIi4uL2NhbWVyYS9DYW1lcmFcIjtcclxuaW1wb3J0IHsgRnJhbWVTdGF0ZSB9IGZyb20gXCIuLi9jb3JlL0ZyYW1lU3RhdGVcIjtcclxuaW1wb3J0IHsgVGV4dHVyZUZvcm1hdCwgVGV4dHVyZVVzYWdlIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVQ29uc3RhbnRcIjtcclxuaW1wb3J0IENvbG9yIGZyb20gXCIuLi9tYXRoL0NvbG9yXCI7XHJcbmltcG9ydCBBdHRhY2htZW50IGZyb20gXCIuLi9yZW5kZXIvQXR0YWNobWVudFwiO1xyXG5pbXBvcnQgQ29udGV4dCBmcm9tIFwiLi4vcmVuZGVyL0NvbnRleHRcIjtcclxuaW1wb3J0IERyYXdDb21tYW5kIGZyb20gXCIuLi9yZW5kZXIvRHJhd0NvbW1hbmRcIjtcclxuaW1wb3J0IFJlbmRlclRhcmdldCBmcm9tIFwiLi4vcmVuZGVyL1JlbmRlclRhcmdldFwiO1xyXG5pbXBvcnQgVGV4dHVyZSBmcm9tIFwiLi4vcmVuZGVyL1RleHR1cmVcIjtcclxuaW1wb3J0IFBhc3MgZnJvbSBcIi4vUGFzc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJhc2ljUGFzcyBleHRlbmRzIFBhc3Mge1xyXG5cdHNreWJveERyYXdDb21hbmQ6IERyYXdDb21tYW5kO1xyXG5cdGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQpIHtcclxuXHRcdHN1cGVyKGNvbnRleHQpO1xyXG5cdFx0dGhpcy5pbml0KGNvbnRleHQpO1xyXG5cdH1cclxuXHJcblx0YmVmb3JlUmVuZGVyKGZyYW1lU3RhdGU6IEZyYW1lU3RhdGUpIHtcclxuXHRcdHRoaXMudXBkYXRlUmVuZGVyVGFyZ2V0KGZyYW1lU3RhdGUpO1xyXG5cclxuXHRcdHN1cGVyLmJlZm9yZVJlbmRlcigpO1xyXG5cdH1cclxuXHJcblx0cmVuZGVyKGZyYW1lU3RhdGU6IEZyYW1lU3RhdGUsIGNhbWVyYT86IENhbWVyYSkge1xyXG5cdFx0Y29uc3QgeyByZW5kZXJRdWV1ZSwgbGlnaHRNYW5nZXIgfSA9IGZyYW1lU3RhdGU7XHJcblxyXG5cdFx0cmVuZGVyUXVldWUuc29ydCgpO1xyXG5cdFx0cmVuZGVyUXVldWUucHJlUmVuZGVyKGNhbWVyYSwgdGhpcy5jb250ZXh0LCB0aGlzLnBhc3NSZW5kZXJFbmNvZGVyKTtcclxuXHRcdHJlbmRlclF1ZXVlLnRyYW5zcGFyZW50UmVuZGVyKGNhbWVyYSwgdGhpcy5jb250ZXh0LCB0aGlzLnBhc3NSZW5kZXJFbmNvZGVyLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbGlnaHRNYW5nZXIpO1xyXG5cdFx0cmVuZGVyUXVldWUub3BhcXVlUmVuZGVyKGNhbWVyYSwgdGhpcy5jb250ZXh0LCB0aGlzLnBhc3NSZW5kZXJFbmNvZGVyLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbGlnaHRNYW5nZXIpO1xyXG5cdFx0cmVuZGVyUXVldWUuZGVidWdRdWV1ZVJlbmRlcihjYW1lcmEsIHRoaXMuY29udGV4dCwgdGhpcy5wYXNzUmVuZGVyRW5jb2Rlcik7XHJcblx0fVxyXG5cdHByaXZhdGUgaW5pdChjb250ZXh0OiBDb250ZXh0KSB7XHJcblx0XHR0aGlzLmNyZWF0ZVJlbmRlclRhcmdldChjb250ZXh0KTtcclxuXHR9XHJcblx0cHJpdmF0ZSBjcmVhdGVSZW5kZXJUYXJnZXQoY29udGV4dDogQ29udGV4dCkge1xyXG5cdFx0Y29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9ID0gY29udGV4dC5wcmVzZW50YXRpb25TaXplO1xyXG5cdFx0Y29uc3QgY29sb3JUZXh0dXJlID0gbmV3IFRleHR1cmUoe1xyXG5cdFx0XHRsYWJlbDogXCJiYXNpY1Bhc3NDb2xvclwiLFxyXG5cdFx0XHRzaXplOiB7IHdpZHRoLCBoZWlnaHQsIGRlcHRoIH0sXHJcblx0XHRcdGZvcm1hdDogdGhpcy5jb250ZXh0LnByZXNlbnRhdGlvbkZvcm1hdCxcclxuXHRcdFx0dXNhZ2U6IFRleHR1cmVVc2FnZS5SZW5kZXJBdHRhY2htZW50IHwgVGV4dHVyZVVzYWdlLlRleHR1cmVCaW5kaW5nXHJcblx0XHR9KTtcclxuXHRcdGNvbnN0IGRlcHRoVGV4dHVyZSA9IG5ldyBUZXh0dXJlKHtcclxuXHRcdFx0bGFiZWw6IFwiYmFzaWNQYXNzRGVwdGhcIixcclxuXHRcdFx0c2l6ZTogeyB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9LFxyXG5cdFx0XHRmb3JtYXQ6IFRleHR1cmVGb3JtYXQuRGVwdGgyNFBsdXMsXHJcblx0XHRcdHVzYWdlOiBUZXh0dXJlVXNhZ2UuUmVuZGVyQXR0YWNobWVudFxyXG5cdFx0fSk7XHJcblx0XHRjb25zdCBjb2xvckF0dGFjaG1lbnQgPSBuZXcgQXR0YWNobWVudCh7IHI6IDAuMCwgZzogMC4wLCBiOiAwLjAsIGE6IDAuMCB9LCB7IHRleHR1cmU6IGNvbG9yVGV4dHVyZSB9KTtcclxuXHRcdGNvbnN0IGRlcHRoQXR0YWNobWVudCA9IG5ldyBBdHRhY2htZW50KDEuMCwgeyB0ZXh0dXJlOiBkZXB0aFRleHR1cmUgfSk7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldCA9IG5ldyBSZW5kZXJUYXJnZXQoXCJyZW5kZXJcIiwgW2NvbG9yQXR0YWNobWVudF0sIGRlcHRoQXR0YWNobWVudCk7XHJcblx0fVxyXG5cdHB1YmxpYyBzZXRTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQsIDEpO1xyXG5cdH1cclxuXHRwcml2YXRlIHVwZGF0ZVJlbmRlclRhcmdldChmcmFtZVN0YXRlOiBGcmFtZVN0YXRlKSB7XHJcblx0XHRpZiAoZnJhbWVTdGF0ZT8uYmFja2dyb3VuZD8udmFsdWUgaW5zdGFuY2VvZiBDb2xvcikge1xyXG5cdFx0XHRjb25zdCB7IHJlZCwgZ3JlZW4sIGJsdWUgfSA9IGZyYW1lU3RhdGUuYmFja2dyb3VuZC52YWx1ZTtcclxuXHRcdFx0Y29uc3Qgb3BhY2l0eSA9IGZyYW1lU3RhdGUuYmFja2dyb3VuZD8ub3BhY2l0eTtcclxuXHRcdFx0Y29uc3QgY2xlYXJWYWx1ZSA9IHtcclxuXHRcdFx0XHRyOiByZWQsXHJcblx0XHRcdFx0ZzogZ3JlZW4sXHJcblx0XHRcdFx0YjogYmx1ZSxcclxuXHRcdFx0XHRhOiBvcGFjaXR5ID8/IDEuMFxyXG5cdFx0XHR9O1xyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldC5jb2xvckF0dGFjaG1lbnRzWzBdLnZhbHVlID0gY2xlYXJWYWx1ZTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IGRlZmluZWQgZnJvbSBcIi4uL3V0aWxzL2RlZmluZWRcIjtcclxuaW1wb3J0IEdNYXRoIGZyb20gXCIuL01hdGhcIjtcclxuaW1wb3J0IE1hdHJpeDQgZnJvbSBcIi4vTWF0cml4NFwiO1xyXG5pbXBvcnQgVmVjdG9yMyBmcm9tIFwiLi9WZWN0b3IzXCI7XHJcbmltcG9ydCBWZWN0b3I0IGZyb20gXCIuL1ZlY3RvcjRcIjtcclxuXHJcbi8qKlxyXG4gKiBBIHBsYW5lIGluIEhlc3NpYW4gTm9ybWFsIEZvcm0gZGVmaW5lZCBieVxyXG4gKiA8cHJlPlxyXG4gKiBheCArIGJ5ICsgY3ogKyBkID0gMFxyXG4gKiA8L3ByZT5cclxuICogd2hlcmUgKGEsIGIsIGMpIGlzIHRoZSBwbGFuZSdzIDxjb2RlPm5vcm1hbDwvY29kZT4sIGQgaXMgdGhlIHNpZ25lZFxyXG4gKiA8Y29kZT5kaXN0YW5jZTwvY29kZT4gdG8gdGhlIHBsYW5lLCBhbmQgKHgsIHksIHopIGlzIGFueSBwb2ludCBvblxyXG4gKiB0aGUgcGxhbmUuXHJcbiAqXHJcbiAqIEBhbGlhcyBQbGFuZVxyXG4gKiBAY29uc3RydWN0b3JcclxuICpcclxuICogQHBhcmFtIHtWZWN0b3IzfSBub3JtYWwgVGhlIHBsYW5lJ3Mgbm9ybWFsIChub3JtYWxpemVkKS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IGRpc3RhbmNlIFRoZSBzaG9ydGVzdCBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4gdG8gdGhlIHBsYW5lLiAgVGhlIHNpZ24gb2ZcclxuICogQGV4YW1wbGVcclxuICogLy8gVGhlIHBsYW5lIHg9MFxyXG4gKiBjb25zdCBwbGFuZSA9IG5ldyBQbGFuZShWZWN0b3IzLlVOSVRfWCwgMC4wKTtcclxuICpcclxuICogQGV4Y2VwdGlvbiB7RGV2ZWxvcGVyRXJyb3J9IE5vcm1hbCBtdXN0IGJlIG5vcm1hbGl6ZWRcclxuICovXHJcbmNsYXNzIFBsYW5lIHtcclxuXHRub3JtYWw6IFZlY3RvcjM7XHJcblx0ZGlzdGFuY2U6IG51bWJlcjtcclxuXHRwdWJsaWMgc3RhdGljIE9SSUdJTl9YWV9QTEFORSA9IE9iamVjdC5mcmVlemUobmV3IFBsYW5lKFZlY3RvcjMuVU5JVF9aLCAwLjApKTtcclxuXHJcblx0cHVibGljIHN0YXRpYyBPUklHSU5fWVpfUExBTkUgPSBPYmplY3QuZnJlZXplKG5ldyBQbGFuZShWZWN0b3IzLlVOSVRfWCwgMC4wKSk7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgT1JJR0lOX1pYX1BMQU5FID0gT2JqZWN0LmZyZWV6ZShuZXcgUGxhbmUoVmVjdG9yMy5VTklUX1ksIDAuMCkpO1xyXG5cdGNvbnN0cnVjdG9yKG5vcm1hbDogVmVjdG9yMywgZGlzdGFuY2U6IG51bWJlcikge1xyXG5cdFx0dGhpcy5ub3JtYWwgPSBWZWN0b3IzLmNsb25lKG5vcm1hbCk7XHJcblxyXG5cdFx0dGhpcy5kaXN0YW5jZSA9IGRpc3RhbmNlO1xyXG5cdH1cclxuXHRub3JtYWxpemUoKSB7XHJcblx0XHRjb25zdCBpbnZlcnNlTm9ybWFsTGVuZ3RoID0gMS4wIC8gdGhpcy5ub3JtYWwubGVuZ3RoKCk7XHJcblx0XHR0aGlzLm5vcm1hbCA9IFZlY3RvcjMubXVsdGlwbHlCeVNjYWxhcih0aGlzLm5vcm1hbCwgaW52ZXJzZU5vcm1hbExlbmd0aCwgdGhpcy5ub3JtYWwpO1xyXG5cdFx0dGhpcy5kaXN0YW5jZSAqPSBpbnZlcnNlTm9ybWFsTGVuZ3RoO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZnJvbVBvaW50Tm9ybWFsKHBvaW50OiBWZWN0b3IzLCBub3JtYWw6IFZlY3RvcjMsIHJlc3VsdDogUGxhbmUpOiBQbGFuZSB7XHJcblx0XHRpZiAoIUdNYXRoLmVxdWFsc0Vwc2lsb24oVmVjdG9yMy5tYWduaXR1ZGUobm9ybWFsKSwgMS4wLCBHTWF0aC5FUFNJTE9ONikpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwibm9ybWFsIG11c3QgYmUgbm9ybWFsaXplZC5cIik7XHJcblx0XHR9XHJcblx0XHQvLyA+PmluY2x1ZGVFbmQoJ2RlYnVnJyk7XHJcblxyXG5cdFx0Y29uc3QgZGlzdGFuY2UgPSAtVmVjdG9yMy5kb3Qobm9ybWFsLCBwb2ludCk7XHJcblxyXG5cdFx0aWYgKCFkZWZpbmVkKHJlc3VsdCkpIHtcclxuXHRcdFx0cmV0dXJuIG5ldyBQbGFuZShub3JtYWwsIGRpc3RhbmNlKTtcclxuXHRcdH1cclxuXHJcblx0XHRWZWN0b3IzLmNsb25lKG5vcm1hbCwgcmVzdWx0Lm5vcm1hbCk7XHJcblx0XHRyZXN1bHQuZGlzdGFuY2UgPSBkaXN0YW5jZTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZnJvbVZlY3RvcjQoY29lZmZpY2llbnRzOiBWZWN0b3I0LCByZXN1bHQ6IFBsYW5lKTogUGxhbmUge1xyXG5cdFx0Y29uc3Qgbm9ybWFsID0gVmVjdG9yMy5mcm9tVmVjdG9yNChjb2VmZmljaWVudHMsIHNjcmF0Y2hOb3JtYWwpO1xyXG5cdFx0Y29uc3QgZGlzdGFuY2UgPSBjb2VmZmljaWVudHMudztcclxuXHJcblx0XHQvLyA+PmluY2x1ZGVTdGFydCgnZGVidWcnLCBwcmFnbWFzLmRlYnVnKTtcclxuXHRcdGlmICghR01hdGguZXF1YWxzRXBzaWxvbihWZWN0b3IzLm1hZ25pdHVkZShub3JtYWwpLCAxLjAsIEdNYXRoLkVQU0lMT042KSkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJub3JtYWwgbXVzdCBiZSBub3JtYWxpemVkLlwiKTtcclxuXHRcdH1cclxuXHRcdC8vID4+aW5jbHVkZUVuZCgnZGVidWcnKTtcclxuXHJcblx0XHRpZiAoIWRlZmluZWQocmVzdWx0KSkge1xyXG5cdFx0XHRyZXR1cm4gbmV3IFBsYW5lKG5vcm1hbCwgZGlzdGFuY2UpO1xyXG5cdFx0fVxyXG5cdFx0VmVjdG9yMy5jbG9uZShub3JtYWwsIHJlc3VsdC5ub3JtYWwpO1xyXG5cdFx0cmVzdWx0LmRpc3RhbmNlID0gZGlzdGFuY2U7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldFBvaW50RGlzdGFuY2UocGxhbmU6IFBsYW5lLCBwb2ludDogVmVjdG9yMyk6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gVmVjdG9yMy5kb3QocGxhbmUubm9ybWFsLCBwb2ludCkgKyBwbGFuZS5kaXN0YW5jZTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBwcm9qZWN0UG9pbnRPbnRvUGxhbmUocGxhbmU6IFBsYW5lLCBwb2ludDogVmVjdG9yMywgcmVzdWx0OiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcblx0XHRpZiAoIWRlZmluZWQocmVzdWx0KSkge1xyXG5cdFx0XHRyZXN1bHQgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHByb2plY3RlZFBvaW50ID0gcG9pbnQgLSAobm9ybWFsLnBvaW50ICsgc2NhbGUpICogbm9ybWFsXHJcblx0XHRjb25zdCBwb2ludERpc3RhbmNlID0gUGxhbmUuZ2V0UG9pbnREaXN0YW5jZShwbGFuZSwgcG9pbnQpO1xyXG5cdFx0Y29uc3Qgc2NhbGVkTm9ybWFsID0gVmVjdG9yMy5tdWx0aXBseUJ5U2NhbGFyKHBsYW5lLm5vcm1hbCwgcG9pbnREaXN0YW5jZSwgc2NyYXRjaENhcnRlc2lhbik7XHJcblxyXG5cdFx0cmV0dXJuIFZlY3RvcjMuc3VidHJhY3QocG9pbnQsIHNjYWxlZE5vcm1hbCwgcmVzdWx0KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyB0cmFuc2Zvcm0ocGxhbmU6IFBsYW5lLCB0cmFuc2Zvcm06IE1hdHJpeDQsIHJlc3VsdDogUGxhbmUpOiBQbGFuZSB7XHJcblx0XHRjb25zdCBub3JtYWwgPSBwbGFuZS5ub3JtYWw7XHJcblx0XHRjb25zdCBkaXN0YW5jZSA9IHBsYW5lLmRpc3RhbmNlO1xyXG5cdFx0Y29uc3QgaW52ZXJzZVRyYW5zcG9zZSA9IE1hdHJpeDQuaW52ZXJzZVRyYW5zcG9zZSh0cmFuc2Zvcm0sIHNjcmF0Y2hJbnZlcnNlVHJhbnNwb3NlKTtcclxuXHRcdGxldCBwbGFuZUFzQ2FydGVzaWFuNCA9IFZlY3RvcjQuZnJvbUVsZW1lbnRzKG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnosIGRpc3RhbmNlLCBzY3JhdGNoUGxhbmVDYXJ0ZXNpYW40KTtcclxuXHRcdHBsYW5lQXNDYXJ0ZXNpYW40ID0gTWF0cml4NC5tdWx0aXBseUJ5VmVjdG9yKGludmVyc2VUcmFuc3Bvc2UsIHBsYW5lQXNDYXJ0ZXNpYW40LCBwbGFuZUFzQ2FydGVzaWFuNCk7XHJcblxyXG5cdFx0Ly8gQ29udmVydCB0aGUgdHJhbnNmb3JtZWQgcGxhbmUgdG8gSGVzc2lhbiBOb3JtYWwgRm9ybVxyXG5cdFx0Y29uc3QgdHJhbnNmb3JtZWROb3JtYWwgPSBWZWN0b3IzLmZyb21WZWN0b3I0KHBsYW5lQXNDYXJ0ZXNpYW40LCBzY3JhdGNoVHJhbnNmb3JtTm9ybWFsKTtcclxuXHJcblx0XHRwbGFuZUFzQ2FydGVzaWFuNCA9IFZlY3RvcjQuZGl2aWRlQnlTY2FsYXIoXHJcblx0XHRcdHBsYW5lQXNDYXJ0ZXNpYW40LFxyXG5cdFx0XHRWZWN0b3IzLm1hZ25pdHVkZSh0cmFuc2Zvcm1lZE5vcm1hbCksXHJcblx0XHRcdHBsYW5lQXNDYXJ0ZXNpYW40XHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiBQbGFuZS5mcm9tVmVjdG9yNChwbGFuZUFzQ2FydGVzaWFuNCwgcmVzdWx0KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBjbG9uZShwbGFuZTogUGxhbmUsIHJlc3VsdDogUGxhbmUpOiBQbGFuZSB7XHJcblx0XHRpZiAoIWRlZmluZWQocmVzdWx0KSkge1xyXG5cdFx0XHRyZXR1cm4gbmV3IFBsYW5lKHBsYW5lLm5vcm1hbCwgcGxhbmUuZGlzdGFuY2UpO1xyXG5cdFx0fVxyXG5cclxuXHRcdFZlY3RvcjMuY2xvbmUocGxhbmUubm9ybWFsLCByZXN1bHQubm9ybWFsKTtcclxuXHRcdHJlc3VsdC5kaXN0YW5jZSA9IHBsYW5lLmRpc3RhbmNlO1xyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZXF1YWxzKGxlZnQ6IFBsYW5lLCByaWdodDogUGxhbmUpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiBsZWZ0LmRpc3RhbmNlID09PSByaWdodC5kaXN0YW5jZSAmJiBWZWN0b3IzLmVxdWFscyhsZWZ0Lm5vcm1hbCwgcmlnaHQubm9ybWFsKTtcclxuXHR9XHJcbn1cclxuY29uc3Qgc2NyYXRjaE5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IHNjcmF0Y2hDYXJ0ZXNpYW4gPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBzY3JhdGNoSW52ZXJzZVRyYW5zcG9zZSA9IG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IHNjcmF0Y2hQbGFuZUNhcnRlc2lhbjQgPSBuZXcgVmVjdG9yNCgpO1xyXG5jb25zdCBzY3JhdGNoVHJhbnNmb3JtTm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBsYW5lO1xyXG4iLCJpbXBvcnQgVmVjdG9yMyBmcm9tIFwiLi4vbWF0aC9WZWN0b3IzXCI7XHJcbmltcG9ydCBWZWN0b3I0IGZyb20gXCIuLi9tYXRoL1ZlY3RvcjRcIjtcclxuaW1wb3J0IGRlZmF1bHRWYWx1ZSBmcm9tIFwiLi4vdXRpbHMvZGVmYXVsdFZhbHVlXCI7XHJcbmltcG9ydCBkZWZpbmVkIGZyb20gXCIuLi91dGlscy9kZWZpbmVkXCI7XHJcbmltcG9ydCB7IEludGVyc2VjdCB9IGZyb20gXCIuL1dlYkdQVUNvbnN0YW50XCI7XHJcbmltcG9ydCBQbGFuZSBmcm9tIFwiLi4vbWF0aC9QbGFuZVwiO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBjdWxsaW5nIHZvbHVtZSBkZWZpbmVkIGJ5IHBsYW5lcy5cclxuICpcclxuICogQGFsaWFzIEN1bGxpbmdWb2x1bWVcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7VmVjdG9yNFtdfSBbcGxhbmVzXSBBbiBhcnJheSBvZiBjbGlwcGluZyBwbGFuZXMuXHJcbiAqL1xyXG5jbGFzcyBDdWxsaW5nVm9sdW1lIHtcclxuXHRwbGFuZXM6IFBsYW5lW107XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgTUFTS19PVVRTSURFID0gMHhmZmZmZmZmZjtcclxuXHJcblx0cHVibGljIHN0YXRpYyBNQVNLX0lOU0lERSA9IDB4MDAwMDAwMDA7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgTUFTS19JTkRFVEVSTUlOQVRFID0gMHg3ZmZmZmZmZjtcclxuXHJcblx0Y29uc3RydWN0b3IocGxhbmVzPzogUGxhbmVbXSkge1xyXG5cdFx0dGhpcy5wbGFuZXMgPSBkZWZhdWx0VmFsdWUocGxhbmVzLCBbXHJcblx0XHRcdG5ldyBQbGFuZShWZWN0b3IzLlVOSVRfWiwgMC4wKSxcclxuXHRcdFx0bmV3IFBsYW5lKFZlY3RvcjMuVU5JVF9aLCAwLjApLFxyXG5cdFx0XHRuZXcgUGxhbmUoVmVjdG9yMy5VTklUX1osIDAuMCksXHJcblx0XHRcdG5ldyBQbGFuZShWZWN0b3IzLlVOSVRfWiwgMC4wKSxcclxuXHRcdFx0bmV3IFBsYW5lKFZlY3RvcjMuVU5JVF9aLCAwLjApLFxyXG5cdFx0XHRuZXcgUGxhbmUoVmVjdG9yMy5VTklUX1osIDAuMClcclxuXHRcdF0pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgY3VsbGluZyB2b2x1bWUgZnJvbSBhIGJvdW5kaW5nIHNwaGVyZS4gQ3JlYXRlcyBzaXggcGxhbmVzIHRoYXQgY3JlYXRlIGEgYm94IGNvbnRhaW5pbmcgdGhlIHNwaGVyZS5cclxuXHQgKiBUaGUgcGxhbmVzIGFyZSBhbGlnbmVkIHRvIHRoZSB4LCB5LCBhbmQgeiBheGVzIGluIHdvcmxkIGNvb3JkaW5hdGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3VuZGluZ1NwaGVyZX0gYm91bmRpbmdTcGhlcmUgVGhlIGJvdW5kaW5nIHNwaGVyZSB1c2VkIHRvIGNyZWF0ZSB0aGUgY3VsbGluZyB2b2x1bWUuXHJcblx0ICogQHBhcmFtIHtDdWxsaW5nVm9sdW1lfSBbcmVzdWx0XSBUaGUgb2JqZWN0IG9udG8gd2hpY2ggdG8gc3RvcmUgdGhlIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJucyB7Q3VsbGluZ1ZvbHVtZX0gVGhlIGN1bGxpbmcgdm9sdW1lIGNyZWF0ZWQgZnJvbSB0aGUgYm91bmRpbmcgc3BoZXJlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tQm91bmRpbmdTcGhlcmUoYm91bmRpbmdTcGhlcmUsIHJlc3VsdCkge1xyXG5cdFx0aWYgKCFkZWZpbmVkKGJvdW5kaW5nU3BoZXJlKSkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJib3VuZGluZ1NwaGVyZSBpcyByZXF1aXJlZC5cIik7XHJcblx0XHR9XHJcblx0XHRpZiAoIWRlZmluZWQocmVzdWx0KSkge1xyXG5cdFx0XHRyZXN1bHQgPSBuZXcgQ3VsbGluZ1ZvbHVtZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGxlbmd0aCA9IGZhY2VzLmxlbmd0aDtcclxuXHRcdGNvbnN0IHBsYW5lcyA9IHJlc3VsdC5wbGFuZXM7XHJcblx0XHRwbGFuZXMubGVuZ3RoID0gMiAqIGxlbmd0aDtcclxuXHJcblx0XHRjb25zdCBjZW50ZXIgPSBib3VuZGluZ1NwaGVyZS5jZW50ZXI7XHJcblx0XHRjb25zdCByYWRpdXMgPSBib3VuZGluZ1NwaGVyZS5yYWRpdXM7XHJcblxyXG5cdFx0bGV0IHBsYW5lSW5kZXggPSAwO1xyXG5cclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcclxuXHRcdFx0Y29uc3QgZmFjZU5vcm1hbCA9IGZhY2VzW2ldO1xyXG5cclxuXHRcdFx0bGV0IHBsYW5lMCA9IHBsYW5lc1twbGFuZUluZGV4XTtcclxuXHRcdFx0bGV0IHBsYW5lMSA9IHBsYW5lc1twbGFuZUluZGV4ICsgMV07XHJcblxyXG5cdFx0XHRpZiAoIWRlZmluZWQocGxhbmUwKSkge1xyXG5cdFx0XHRcdHBsYW5lMCA9IHBsYW5lc1twbGFuZUluZGV4XSA9IG5ldyBWZWN0b3I0KCk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCFkZWZpbmVkKHBsYW5lMSkpIHtcclxuXHRcdFx0XHRwbGFuZTEgPSBwbGFuZXNbcGxhbmVJbmRleCArIDFdID0gbmV3IFZlY3RvcjQoKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0VmVjdG9yMy5tdWx0aXBseUJ5U2NhbGFyKGZhY2VOb3JtYWwsIC1yYWRpdXMsIHNjcmF0Y2hQbGFuZUNlbnRlcik7XHJcblx0XHRcdFZlY3RvcjMuYWRkKGNlbnRlciwgc2NyYXRjaFBsYW5lQ2VudGVyLCBzY3JhdGNoUGxhbmVDZW50ZXIpO1xyXG5cclxuXHRcdFx0cGxhbmUwLnggPSBmYWNlTm9ybWFsLng7XHJcblx0XHRcdHBsYW5lMC55ID0gZmFjZU5vcm1hbC55O1xyXG5cdFx0XHRwbGFuZTAueiA9IGZhY2VOb3JtYWwuejtcclxuXHRcdFx0cGxhbmUwLncgPSAtVmVjdG9yMy5kb3QoZmFjZU5vcm1hbCwgc2NyYXRjaFBsYW5lQ2VudGVyKTtcclxuXHJcblx0XHRcdFZlY3RvcjMubXVsdGlwbHlCeVNjYWxhcihmYWNlTm9ybWFsLCByYWRpdXMsIHNjcmF0Y2hQbGFuZUNlbnRlcik7XHJcblx0XHRcdFZlY3RvcjMuYWRkKGNlbnRlciwgc2NyYXRjaFBsYW5lQ2VudGVyLCBzY3JhdGNoUGxhbmVDZW50ZXIpO1xyXG5cclxuXHRcdFx0cGxhbmUxLnggPSAtZmFjZU5vcm1hbC54O1xyXG5cdFx0XHRwbGFuZTEueSA9IC1mYWNlTm9ybWFsLnk7XHJcblx0XHRcdHBsYW5lMS56ID0gLWZhY2VOb3JtYWwuejtcclxuXHRcdFx0cGxhbmUxLncgPSAtVmVjdG9yMy5kb3QoVmVjdG9yMy5uZWdhdGUoZmFjZU5vcm1hbCwgc2NyYXRjaFBsYW5lTm9ybWFsKSwgc2NyYXRjaFBsYW5lQ2VudGVyKTtcclxuXHJcblx0XHRcdHBsYW5lSW5kZXggKz0gMjtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBib3VuZGluZyB2b2x1bWUgaW50ZXJzZWN0cyB0aGUgY3VsbGluZyB2b2x1bWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gYm91bmRpbmdWb2x1bWUgVGhlIGJvdW5kaW5nIHZvbHVtZSB3aG9zZSBpbnRlcnNlY3Rpb24gd2l0aCB0aGUgY3VsbGluZyB2b2x1bWUgaXMgdG8gYmUgdGVzdGVkLlxyXG5cdCAqIEByZXR1cm5zIHtJbnRlcnNlY3R9ICBJbnRlcnNlY3QuT1VUU0lERSwgSW50ZXJzZWN0LklOVEVSU0VDVElORywgb3IgSW50ZXJzZWN0LklOU0lERS5cclxuXHQgKi9cclxuXHRjb21wdXRlVmlzaWJpbGl0eShib3VuZGluZ1ZvbHVtZSkge1xyXG5cdFx0aWYgKCFkZWZpbmVkKGJvdW5kaW5nVm9sdW1lKSkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJib3VuZGluZ1ZvbHVtZSBpcyByZXF1aXJlZC5cIik7XHJcblx0XHR9XHJcblx0XHRjb25zdCBwbGFuZXMgPSB0aGlzLnBsYW5lcztcclxuXHRcdGxldCBpbnRlcnNlY3RpbmcgPSBmYWxzZTtcclxuXHRcdGZvciAobGV0IGsgPSAwLCBsZW4gPSBwbGFuZXMubGVuZ3RoOyBrIDwgbGVuOyArK2spIHtcclxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYm91bmRpbmdWb2x1bWUuaW50ZXJzZWN0UGxhbmUocGxhbmVzW2tdKTtcclxuXHRcdFx0aWYgKHJlc3VsdCA9PT0gSW50ZXJzZWN0Lk9VVFNJREUpIHtcclxuXHRcdFx0XHRyZXR1cm4gSW50ZXJzZWN0Lk9VVFNJREU7XHJcblx0XHRcdH0gZWxzZSBpZiAocmVzdWx0ID09PSBJbnRlcnNlY3QuSU5URVJTRUNUSU5HKSB7XHJcblx0XHRcdFx0aW50ZXJzZWN0aW5nID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBpbnRlcnNlY3RpbmcgPyBJbnRlcnNlY3QuSU5URVJTRUNUSU5HIDogSW50ZXJzZWN0LklOU0lERTtcclxuXHR9XHJcbn1cclxuXHJcbmNvbnN0IGZhY2VzID0gW25ldyBWZWN0b3IzKCksIG5ldyBWZWN0b3IzKCksIG5ldyBWZWN0b3IzKCldO1xyXG5WZWN0b3IzLmNsb25lKFZlY3RvcjMuVU5JVF9YLCBmYWNlc1swXSk7XHJcblZlY3RvcjMuY2xvbmUoVmVjdG9yMy5VTklUX1ksIGZhY2VzWzFdKTtcclxuVmVjdG9yMy5jbG9uZShWZWN0b3IzLlVOSVRfWiwgZmFjZXNbMl0pO1xyXG5cclxuY29uc3Qgc2NyYXRjaFBsYW5lQ2VudGVyID0gbmV3IFZlY3RvcjMoKTtcclxuY29uc3Qgc2NyYXRjaFBsYW5lTm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcclxuY29uc3Qgc2NyYXRjaFBsYW5lcyA9IG5ldyBWZWN0b3I0KCk7XHJcbmNvbnN0IHNjcmF0Y2hQbGFuZSA9IG5ldyBQbGFuZShuZXcgVmVjdG9yMygxLjAsIDAuMCwgMC4wKSwgMC4wKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEN1bGxpbmdWb2x1bWU7XHJcbiIsImltcG9ydCBDdWxsaW5nVm9sdW1lIGZyb20gXCIuLi9jb3JlL0N1bGxpbmdWb2x1bWVcIjtcclxuaW1wb3J0IFJlbmRlck9iamVjdCBmcm9tIFwiLi4vY29yZS9SZW5kZXJPYmplY3RcIjtcclxuaW1wb3J0IHsgUmVuZGVyT2JqZWN0VHlwZSwgVW5pZm9ybUVudW0gfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVUeXBlc1wiO1xyXG5pbXBvcnQgTWF0cml4NCBmcm9tIFwiLi4vbWF0aC9NYXRyaXg0XCI7XHJcbmltcG9ydCBQbGFuZSBmcm9tIFwiLi4vbWF0aC9QbGFuZVwiO1xyXG5pbXBvcnQgVmVjdG9yMyBmcm9tIFwiLi4vbWF0aC9WZWN0b3IzXCI7XHJcbmltcG9ydCBTaGFkZXJEYXRhIGZyb20gXCIuLi9yZW5kZXIvU2hhZGVyRGF0YVwiO1xyXG5pbXBvcnQgVW5pZm9ybUJ1ZmZlciBmcm9tIFwiLi4vcmVuZGVyL1VuaWZvcm1CdWZmZXJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhbWVyYSBleHRlbmRzIFJlbmRlck9iamVjdCB7XHJcblx0cHJpdmF0ZSBfdmlld01hdHJpeDogTWF0cml4NDtcclxuXHRwcm90ZWN0ZWQgX3Byb2plY3Rpb25NYXRyaXg6IE1hdHJpeDQ7XHJcblx0cHJpdmF0ZSBfdnBNYXRyaXg6IE1hdHJpeDQ7XHJcblx0Y3VsbGluZ1ZvbHVtZTogQ3VsbGluZ1ZvbHVtZTtcclxuXHRwcm9qZWN0TWF0cml4RGlydHk6IGJvb2xlYW47XHJcblx0c2hhZGVyRGF0YTogU2hhZGVyRGF0YTtcclxuXHRuZWFyOiBudW1iZXI7XHJcblx0ZmFyOiBudW1iZXI7XHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblx0XHRzdXBlcigpO1xyXG5cdFx0dGhpcy5fdmlld01hdHJpeCA9IHVuZGVmaW5lZDtcclxuXHRcdHRoaXMudHlwZSA9IFJlbmRlck9iamVjdFR5cGUuQ2FtZXJhO1xyXG5cdFx0dGhpcy5jdWxsaW5nVm9sdW1lID0gbmV3IEN1bGxpbmdWb2x1bWUoKTtcclxuXHRcdHRoaXMuX3ZpZXdNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xyXG5cdFx0dGhpcy5fdnBNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xyXG5cdFx0dGhpcy5wcm9qZWN0TWF0cml4RGlydHkgPSB0cnVlO1xyXG5cdFx0dGhpcy5jcmVhdGVTaGFkZXJEYXRhKCk7XHJcblx0fVxyXG5cdGdldCB2aWV3TWF0cml4KCkge1xyXG5cdFx0dGhpcy51cGRhdGVNYXRyaXgoKTtcclxuXHRcdE1hdHJpeDQuaW52ZXJzZSh0aGlzLm1vZGVsTWF0cml4LCB0aGlzLl92aWV3TWF0cml4KTtcclxuXHRcdHJldHVybiB0aGlzLl92aWV3TWF0cml4O1xyXG5cdH1cclxuXHRnZXQgcHJvamVjdGlvbk1hdHJpeCgpIHtcclxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cdFx0cmV0dXJuIHRoaXMuX3Byb2plY3Rpb25NYXRyaXg7XHJcblx0fVxyXG5cclxuXHRnZXQgdnBNYXRyaXgoKSB7XHJcblx0XHRNYXRyaXg0Lm11bHRpcGx5KHRoaXMucHJvamVjdGlvbk1hdHJpeCwgdGhpcy52aWV3TWF0cml4LCB0aGlzLl92cE1hdHJpeCk7XHJcblx0XHRyZXR1cm4gdGhpcy5fdnBNYXRyaXg7XHJcblx0fVxyXG5cclxuXHRnZXQgaW52ZXJzZVZpZXdNYXRyaXgoKSB7XHJcblx0XHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xyXG5cdFx0cmV0dXJuIHRoaXMubW9kZWxNYXRyaXg7XHJcblx0fVxyXG5cdHB1YmxpYyB1cGRhdGVQcm9qZWN0aW9uTWF0cml4KCkge31cclxuXHQvKipcclxuXHQgKiBnZXQgYSBjdWxsaW5nIHZvbHVtZSBmb3IgdGhpcyBmcnVzdHVtLlxyXG5cdCAqL1xyXG5cdGdldEN1bGxpbmdWb2x1bWUoKSB7XHJcblx0XHRjb25zdCBjbG9uZVZpZXdNYXRyaXggPSB0aGlzLnZpZXdNYXRyaXguY2xvbmUobmV3IE1hdHJpeDQoKSk7XHJcblx0XHRjb25zdCB2cE1hdHJpeCA9IE1hdHJpeDQubXVsdGlwbHkodGhpcy5wcm9qZWN0aW9uTWF0cml4LCBjbG9uZVZpZXdNYXRyaXgsIG5ldyBNYXRyaXg0KCkpO1xyXG5cdFx0Y29uc3QgcGxhbmVzID0gdGhpcy5jdWxsaW5nVm9sdW1lLnBsYW5lcztcclxuXHRcdGNvbnN0IG1lID0gdnBNYXRyaXg7XHJcblx0XHRjb25zdCBtZTAgPSBtZVswXSxcclxuXHRcdFx0bWUxID0gbWVbMV0sXHJcblx0XHRcdG1lMiA9IG1lWzJdLFxyXG5cdFx0XHRtZTMgPSBtZVszXTtcclxuXHRcdGNvbnN0IG1lNCA9IG1lWzRdLFxyXG5cdFx0XHRtZTUgPSBtZVs1XSxcclxuXHRcdFx0bWU2ID0gbWVbNl0sXHJcblx0XHRcdG1lNyA9IG1lWzddO1xyXG5cdFx0Y29uc3QgbWU4ID0gbWVbOF0sXHJcblx0XHRcdG1lOSA9IG1lWzldLFxyXG5cdFx0XHRtZTEwID0gbWVbMTBdLFxyXG5cdFx0XHRtZTExID0gbWVbMTFdO1xyXG5cdFx0Y29uc3QgbWUxMiA9IG1lWzEyXSxcclxuXHRcdFx0bWUxMyA9IG1lWzEzXSxcclxuXHRcdFx0bWUxNCA9IG1lWzE0XSxcclxuXHRcdFx0bWUxNSA9IG1lWzE1XTtcclxuXHRcdHBsYW5lc1swXSA9IG5ldyBQbGFuZShuZXcgVmVjdG9yMyhtZTMgLSBtZTAsIG1lNyAtIG1lNCwgbWUxMSAtIG1lOCksIG1lMTUgLSBtZTEyKTtcclxuXHRcdHBsYW5lc1swXS5ub3JtYWxpemUoKTtcclxuXHRcdHBsYW5lc1sxXSA9IG5ldyBQbGFuZShuZXcgVmVjdG9yMyhtZTMgKyBtZTAsIG1lNyArIG1lNCwgbWUxMSArIG1lOCksIG1lMTUgKyBtZTEyKTtcclxuXHRcdHBsYW5lc1sxXS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRwbGFuZXNbMl0gPSBuZXcgUGxhbmUobmV3IFZlY3RvcjMobWUzICsgbWUxLCBtZTcgKyBtZTUsIG1lMTEgKyBtZTkpLCBtZTE1ICsgbWUxMyk7XHJcblx0XHRwbGFuZXNbMl0ubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0cGxhbmVzWzNdID0gbmV3IFBsYW5lKG5ldyBWZWN0b3IzKG1lMyAtIG1lMSwgbWU3IC0gbWU1LCBtZTExIC0gbWU5KSwgbWUxNSAtIG1lMTMpO1xyXG5cdFx0cGxhbmVzWzNdLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdHBsYW5lc1s0XSA9IG5ldyBQbGFuZShuZXcgVmVjdG9yMyhtZTMgLSBtZTIsIG1lNyAtIG1lNiwgbWUxMSAtIG1lMTApLCBtZTE1IC0gbWUxNCk7XHJcblx0XHRwbGFuZXNbNF0ubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0cGxhbmVzWzVdID0gbmV3IFBsYW5lKG5ldyBWZWN0b3IzKG1lMyArIG1lMiwgbWU3ICsgbWU2LCBtZTExICsgbWUxMCksIG1lMTUgKyBtZTE0KTtcclxuXHRcdHBsYW5lc1s1XS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jdWxsaW5nVm9sdW1lO1xyXG5cdH1cclxuXHJcblx0Y3JlYXRlU2hhZGVyRGF0YSgpIHtcclxuXHRcdHRoaXMuc2hhZGVyRGF0YSA9IG5ldyBTaGFkZXJEYXRhKFwiY2FtZXJhXCIsIDAsIDEsIDEpO1xyXG5cdFx0Y29uc3QgdW5pZm9ybUJ1ZmZlciA9IG5ldyBVbmlmb3JtQnVmZmVyKHsgbGFiZWw6IFwiY2FtZXJhXCIgfSk7XHJcblx0XHR1bmlmb3JtQnVmZmVyLnNldFVuaWZvcm0oXHJcblx0XHRcdFwicHJvamVjdGlvbk1hdHJpeFwiLFxyXG5cdFx0XHQoKSA9PiB7XHJcblx0XHRcdFx0cmV0dXJuIHRoaXMucHJvamVjdGlvbk1hdHJpeDtcclxuXHRcdFx0fSxcclxuXHRcdFx0VW5pZm9ybUVudW0uTWF0NFxyXG5cdFx0KTtcclxuXHRcdHVuaWZvcm1CdWZmZXIuc2V0VW5pZm9ybShcclxuXHRcdFx0XCJ2aWV3TWF0cml4XCIsXHJcblx0XHRcdCgpID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy52aWV3TWF0cml4O1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRVbmlmb3JtRW51bS5NYXQ0XHJcblx0XHQpO1xyXG5cdFx0dW5pZm9ybUJ1ZmZlci5zZXRVbmlmb3JtKFxyXG5cdFx0XHRcImludmVyc2VWaWV3TWF0cml4XCIsXHJcblx0XHRcdCgpID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5pbnZlcnNlVmlld01hdHJpeDtcclxuXHRcdFx0fSxcclxuXHRcdFx0VW5pZm9ybUVudW0uTWF0NFxyXG5cdFx0KTtcclxuXHRcdHVuaWZvcm1CdWZmZXIuc2V0VW5pZm9ybShcclxuXHRcdFx0XCJwb3NpdGlvblwiLFxyXG5cdFx0XHQoKSA9PiB7XHJcblx0XHRcdFx0cmV0dXJuIHRoaXMucG9zaXRpb247XHJcblx0XHRcdH0sXHJcblx0XHRcdFVuaWZvcm1FbnVtLkZsb2F0VmVjM1xyXG5cdFx0KTtcclxuXHRcdHRoaXMuc2hhZGVyRGF0YS5zZXRVbmlmb3JtQnVmZmVyKFwiY2FtZXJhXCIsIHVuaWZvcm1CdWZmZXIpO1xyXG5cdH1cclxufVxyXG4iLCJpbXBvcnQgQ3VsbGluZ1ZvbHVtZSBmcm9tIFwiLi4vY29yZS9DdWxsaW5nVm9sdW1lXCI7XHJcbmltcG9ydCBHTWF0aCBmcm9tIFwiLi4vbWF0aC9NYXRoXCI7XHJcbmltcG9ydCBNYXRyaXg0IGZyb20gXCIuLi9tYXRoL01hdHJpeDRcIjtcclxuaW1wb3J0IENhbWVyYSBmcm9tIFwiLi9DYW1lcmFcIjtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVyc3BlY3RpdmVDYW1lcmEgZXh0ZW5kcyBDYW1lcmEge1xyXG5cdHhPZmZzZXQ6IG51bWJlcjtcclxuXHR5T2Zmc2V0OiBudW1iZXI7XHJcblx0Y3VsbGluZ1ZvbHVtZTogQ3VsbGluZ1ZvbHVtZTtcclxuXHRwcml2YXRlIF9hc3BlY3Q6IG51bWJlcjtcclxuXHRwcml2YXRlIF9mb3Y6IG51bWJlcjtcclxuXHRoZWlnaHQ6IG51bWJlcjtcclxuXHR3aWR0aDogbnVtYmVyO1xyXG5cdGlzUGVyc3BlY3RpdmVDYW1lcmE6IGJvb2xlYW47XHJcblx0bmVhcjogbnVtYmVyO1xyXG5cdGZhcjogbnVtYmVyO1xyXG5cdHRvcDogbnVtYmVyO1xyXG5cdGxlZnQ6IG51bWJlcjtcclxuXHRjb25zdHJ1Y3Rvcihmb3YgPSA1MCwgYXNwZWN0ID0gMSwgbmVhciA9IDAuMSwgZmFyID0gMjAwMCkge1xyXG5cdFx0c3VwZXIoKTtcclxuXHRcdHRoaXMuX2FzcGVjdCA9IGFzcGVjdDtcclxuXHRcdHRoaXMuZm92ID0gZm92O1xyXG5cdFx0dGhpcy5uZWFyID0gbmVhcjtcclxuXHRcdHRoaXMuZmFyID0gZmFyO1xyXG5cdFx0dGhpcy54T2Zmc2V0ID0gMDtcclxuXHRcdHRoaXMueU9mZnNldCA9IDA7XHJcblx0XHR0aGlzLnByb2plY3RNYXRyaXhEaXJ0eSA9IHRydWU7XHJcblx0XHR0aGlzLnVwZGF0ZUNhbWVyYVBhcm1zKCk7XHJcblx0XHR0aGlzLmN1bGxpbmdWb2x1bWUgPSBuZXcgQ3VsbGluZ1ZvbHVtZSgpO1xyXG5cdFx0dGhpcy5pc1BlcnNwZWN0aXZlQ2FtZXJhID0gdHJ1ZTtcclxuXHR9XHJcblx0Z2V0IGFzcGVjdCgpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2FzcGVjdDtcclxuXHR9XHJcblxyXG5cdHNldCBhc3BlY3QodjogbnVtYmVyKSB7XHJcblx0XHR0aGlzLnByb2plY3RNYXRyaXhEaXJ0eSA9IHRydWU7XHJcblx0XHR0aGlzLl9hc3BlY3QgPSB2O1xyXG5cdH1cclxuXHRnZXQgZm92KCk6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gdGhpcy5fZm92O1xyXG5cdH1cclxuXHJcblx0c2V0IGZvdih2OiBudW1iZXIpIHtcclxuXHRcdHRoaXMucHJvamVjdE1hdHJpeERpcnR5ID0gdHJ1ZTtcclxuXHRcdHRoaXMuX2ZvdiA9IHY7XHJcblx0fVxyXG5cdHByaXZhdGUgdXBkYXRlQ2FtZXJhUGFybXMoKSB7XHJcblx0XHR0aGlzLnRvcCA9IHRoaXMubmVhciAqIE1hdGgudGFuKDAuNSAqIEdNYXRoLlJBRElBTlNfUEVSX0RFR1JFRSAqIHRoaXMuZm92KTtcclxuXHRcdHRoaXMuaGVpZ2h0ID0gMiAqIHRoaXMudG9wO1xyXG5cdFx0dGhpcy53aWR0aCA9IHRoaXMuYXNwZWN0ICogdGhpcy5oZWlnaHQ7XHJcblx0XHR0aGlzLmxlZnQgPSAtMC41ICogdGhpcy53aWR0aDtcclxuXHR9XHJcblx0cHVibGljIHVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSB7XHJcblx0XHRpZiAodGhpcy5wcm9qZWN0TWF0cml4RGlydHkpIHtcclxuXHRcdFx0dGhpcy51cGRhdGVDYW1lcmFQYXJtcygpO1xyXG5cdFx0XHR0aGlzLl9wcm9qZWN0aW9uTWF0cml4ID0gTWF0cml4NC5tYWtlUGVyc3BlY3RpdmUoXHJcblx0XHRcdFx0dGhpcy5sZWZ0LFxyXG5cdFx0XHRcdHRoaXMubGVmdCArIHRoaXMud2lkdGgsXHJcblx0XHRcdFx0dGhpcy50b3AsXHJcblx0XHRcdFx0dGhpcy50b3AgLSB0aGlzLmhlaWdodCxcclxuXHRcdFx0XHR0aGlzLm5lYXIsXHJcblx0XHRcdFx0dGhpcy5mYXJcclxuXHRcdFx0KTtcclxuXHRcdFx0dGhpcy5wcm9qZWN0TWF0cml4RGlydHkgPSBmYWxzZTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IHsgQnVmZmVyVXNhZ2UgfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVDb25zdGFudFwiO1xuaW1wb3J0IHsgVW5pZm9ybUVudW0gfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVUeXBlc1wiO1xuaW1wb3J0IE1hdHJpeDQgZnJvbSBcIi4uL21hdGgvTWF0cml4NFwiO1xuaW1wb3J0IFNoYWRlckRhdGEgZnJvbSBcIi4uL3JlbmRlci9TaGFkZXJEYXRhXCI7XG5pbXBvcnQgVW5pZm9ybUJ1ZmZlciBmcm9tIFwiLi4vcmVuZGVyL1VuaWZvcm1CdWZmZXJcIjtcbmltcG9ydCBQZXJzcGVjdGl2ZUNhbWVyYSBmcm9tIFwiLi9QZXJzcGVjdGl2ZUNhbWVyYVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb2ludExpZ2h0U2hhZG93Q2FtZXJhIGV4dGVuZHMgUGVyc3BlY3RpdmVDYW1lcmEge1xuXHRwdWJsaWMgdnBNYXRyaXhBcnJheTogQXJyYXk8TWF0cml4ND47XG5cdHB1YmxpYyB2cE1hdHJpeEluZGV4QXJyYXk6IEFycmF5PG51bWJlcj47XG5cblx0Y29uc3RydWN0b3IoZm92ID0gNTAsIGFzcGVjdCA9IDEsIG5lYXIgPSAwLjEsIGZhciA9IDIwMDApIHtcblx0XHRzdXBlcihmb3YsIGFzcGVjdCwgbmVhciwgZmFyKTtcblx0XHR0aGlzLnZwTWF0cml4QXJyYXkgPSBbbmV3IE1hdHJpeDQoKSwgbmV3IE1hdHJpeDQoKSwgbmV3IE1hdHJpeDQoKSwgbmV3IE1hdHJpeDQoKSwgbmV3IE1hdHJpeDQoKSwgbmV3IE1hdHJpeDQoKV07XG5cdH1cblxuXHQvLyBjcmVhdGVTaGFkZXJEYXRhKCkge1xuXHQvLyBcdHRoaXMuc2hhZGVyRGF0YSA9IG5ldyBTaGFkZXJEYXRhKFwiY2FtZXJhXCIsIDAsIDEsIDEpO1xuXG5cdC8vIFx0Y29uc3QgdW5pZm9ybUJ1ZmZlciA9IG5ldyBVbmlmb3JtQnVmZmVyKHtcblx0Ly8gXHRcdGxhYmVsOiBcInBvaW50TGlnaHRTaGFkb3dDYW1lcmFcIixcblx0Ly8gXHRcdHR5cGU6IFwicmVhZC1vbmx5LXN0b3JhZ2VcIixcblx0Ly8gXHRcdHVzYWdlOiBCdWZmZXJVc2FnZS5TdG9yYWdlIHwgQnVmZmVyVXNhZ2UuQ29weURzdCxcblx0Ly8gXHRcdGhhc0R5bmFtaWNPZmZzZXQ6IHRydWUsXG5cdC8vIFx0XHRtaW5CaW5kaW5nU2l6ZTogNjQsXG5cdC8vIFx0XHRtYXhPZmZzZXQ6IDYsXG5cdC8vIFx0XHRzaXplOiAyNTYgKiA2XG5cdC8vIFx0fSk7XG5cdC8vIFx0dW5pZm9ybUJ1ZmZlci5zZXRNYXRyaXg0QXJyYXkoXG5cdC8vIFx0XHRcInZwTWF0cml4QXJyYXlcIixcblx0Ly8gXHRcdCgpID0+IHtcblx0Ly8gXHRcdFx0aWYgKHRoaXMudnBNYXRyaXhBcnJheS5sZW5ndGggIT0gNikgdGhyb3cgbmV3IEVycm9yKFwicG9pbnRMaWdodFNoYWRvd0NhbWVyYSB1bmlmb3JtQnVmZmVyIGhhcyBFcnJvclwiKTtcblxuXHQvLyBcdFx0XHRyZXR1cm4gdGhpcy52cE1hdHJpeEFycmF5O1xuXHQvLyBcdFx0fSxcblx0Ly8gXHRcdDYsXG5cdC8vIFx0XHQyNTZcblx0Ly8gXHQpO1xuXG5cdC8vIFx0dGhpcy5zaGFkZXJEYXRhLnNldFVuaWZvcm1CdWZmZXIoXCJwb2ludExpZ2h0U2hhZG93Q2FtZXJhXCIsIHVuaWZvcm1CdWZmZXIpO1xuXHQvLyBcdHRoaXMuc2hhZGVyRGF0YS5zZXREZWZpbmUoXCJpc1BvaW50TGlnaHRTaGFkb3dNYXBcIiwgdHJ1ZSk7XG5cdC8vIH1cblxuXHRjcmVhdGVTaGFkZXJEYXRhKCkge1xuXHRcdHRoaXMuc2hhZGVyRGF0YSA9IG5ldyBTaGFkZXJEYXRhKFwiY2FtZXJhXCIsIDAsIDEsIDEpO1xuXG5cdFx0Y29uc3QgdW5pZm9ybUJ1ZmZlciA9IG5ldyBVbmlmb3JtQnVmZmVyKHtcblx0XHRcdGxhYmVsOiBcInBvaW50TGlnaHRTaGFkb3dDYW1lcmFcIixcblx0XHRcdHR5cGU6IFwicmVhZC1vbmx5LXN0b3JhZ2VcIixcblx0XHRcdHVzYWdlOiBCdWZmZXJVc2FnZS5TdG9yYWdlIHwgQnVmZmVyVXNhZ2UuQ29weURzdFxuXHRcdH0pO1xuXHRcdHVuaWZvcm1CdWZmZXIuc2V0VW5pZm9ybShcblx0XHRcdFwidnBNYXRyaXhcIixcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMudnBNYXRyaXg7XG5cdFx0XHR9LFxuXHRcdFx0VW5pZm9ybUVudW0uTWF0NFxuXHRcdCk7XG5cblx0XHR0aGlzLnNoYWRlckRhdGEuc2V0VW5pZm9ybUJ1ZmZlcihcInBvaW50TGlnaHRTaGFkb3dDYW1lcmFcIiwgdW5pZm9ybUJ1ZmZlcik7XG5cdFx0dGhpcy5zaGFkZXJEYXRhLnNldERlZmluZShcImlzUG9pbnRMaWdodFNoYWRvd01hcFwiLCB0cnVlKTtcblx0XHR0aGlzLnNoYWRlckRhdGEuc2V0RGVmaW5lKFwiSVNfUE9JTlRMSUdIVF9TSEFET1dNQVBcIiwgdHJ1ZSk7XG5cdH1cblxuXHR1cGRhdGVWcE1hdHJpeEFycmF5QW5kSW5kZXgoaW5kZXg6IG51bWJlcikge1xuXHRcdE1hdHJpeDQuY2xvbmUodGhpcy52cE1hdHJpeCwgdGhpcy52cE1hdHJpeEFycmF5W2luZGV4XSk7XG5cdH1cbn1cbiIsImltcG9ydCBDYW1lcmEgZnJvbSBcIi4uLy4uL2NhbWVyYS9DYW1lcmFcIjtcclxuaW1wb3J0IHsgVGV4dHVyZUZvcm1hdCwgVGV4dHVyZVNhbXBsZVR5cGUsIFRleHR1cmVVc2FnZSB9IGZyb20gXCIuLi8uLi9jb3JlL1dlYkdQVUNvbnN0YW50XCI7XHJcbmltcG9ydCBWZWN0b3IyIGZyb20gXCIuLi8uLi9tYXRoL1ZlY3RvcjJcIjtcclxuaW1wb3J0IFZlY3RvcjQgZnJvbSBcIi4uLy4uL21hdGgvVmVjdG9yNFwiO1xyXG5pbXBvcnQgVGV4dHVyZSBmcm9tIFwiLi4vLi4vcmVuZGVyL1RleHR1cmVcIjtcclxuaW1wb3J0IHsgTGlnaHQgfSBmcm9tIFwiLi4vTGlnaHRcIjtcclxuZXhwb3J0IGNsYXNzIEJhc2VTaGFkb3cge1xyXG5cdHByb3RlY3RlZCBfc2hhZG93TWFwU2l6ZTogVmVjdG9yMjtcclxuXHRwcm90ZWN0ZWQgX2NhbWVyYTogQ2FtZXJhO1xyXG5cdHByb3RlY3RlZCBfc2hhZG93TWFwOiBUZXh0dXJlO1xyXG5cdHB1YmxpYyB0eXBlOiBzdHJpbmc7XHJcblx0cHVibGljIF92aWV3cG9ydHM6IEFycmF5PFZlY3RvcjQ+O1xyXG5cdHB1YmxpYyB2aWV3cG9ydFNpemU6IFZlY3RvcjI7XHJcblx0cHVibGljIGN1cnJlbnRWaWV3cG9ydEluZGV4OiBudW1iZXI7XHJcblx0cHVibGljIHZpZXdQb3J0RGlydHk6IGJvb2xlYW47XHJcblx0cHVibGljIHZwTWF0cml4RGlydHk6IGJvb2xlYW47XHJcblxyXG5cdGNvbnN0cnVjdG9yKHNoYWRvd01hcFNpemU6IFZlY3RvcjIsIGNhbWVyYTogQ2FtZXJhKSB7XHJcblx0XHR0aGlzLl9zaGFkb3dNYXBTaXplID0gc2hhZG93TWFwU2l6ZTtcclxuXHRcdHRoaXMuX2NhbWVyYSA9IGNhbWVyYTtcclxuXHRcdHRoaXMudmlld1BvcnREaXJ0eSA9IHRydWU7XHJcblx0XHR0aGlzLnZwTWF0cml4RGlydHkgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuX2luaXQoKTtcclxuXHR9XHJcblxyXG5cdGdldCBjYW1lcmEoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fY2FtZXJhO1xyXG5cdH1cclxuXHJcblx0Z2V0IHNoYWRvd01hcFNpemUoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fc2hhZG93TWFwU2l6ZTtcclxuXHR9XHJcblxyXG5cdGdldCB2aWV3cG9ydHMoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fdmlld3BvcnRzO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGdldFNoYWRvd01hcFRleHR1cmUoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fc2hhZG93TWFwO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIF9pbml0KCkge1xyXG5cdFx0dGhpcy5faW5pdFNoYWRvd01hcFRleHR1cmUoKTtcclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBfaW5pdFNoYWRvd01hcFRleHR1cmUoKSB7XHJcblx0XHR0aGlzLl9jcmVhdGVTaGFkb3dNYXBUZXh0dXJlKCk7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgX2NyZWF0ZVNoYWRvd01hcFRleHR1cmUoKSB7XHJcblx0XHR0aGlzLl9zaGFkb3dNYXAgPSBuZXcgVGV4dHVyZSh7XHJcblx0XHRcdHNpemU6IHtcclxuXHRcdFx0XHR3aWR0aDogdGhpcy5fc2hhZG93TWFwU2l6ZS54LFxyXG5cdFx0XHRcdGhlaWdodDogdGhpcy5fc2hhZG93TWFwU2l6ZS55LFxyXG5cdFx0XHRcdGRlcHRoOiAxXHJcblx0XHRcdH0sXHJcblx0XHRcdGZpeGVkU2l6ZTogdHJ1ZSxcclxuXHRcdFx0c2FtcGxlVHlwZTogVGV4dHVyZVNhbXBsZVR5cGUuRGVwdGgsXHJcblx0XHRcdGZvcm1hdDogVGV4dHVyZUZvcm1hdC5EZXB0aDI0UGx1cyxcclxuXHRcdFx0dXNhZ2U6IFRleHR1cmVVc2FnZS5SZW5kZXJBdHRhY2htZW50IHwgVGV4dHVyZVVzYWdlLlRleHR1cmVCaW5kaW5nIHwgVGV4dHVyZVVzYWdlLkNvcHlTcmNcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHVwZGF0ZShsaWdodDogTGlnaHQpIHt9XHJcbn1cclxuIiwiaW1wb3J0IFBvaW50TGlnaHRTaGFkb3dDYW1lcmEgZnJvbSBcIi4uLy4uL2NhbWVyYS9Qb2ludExpZ2h0U2hhZG93Q2FtZXJhXCI7XHJcbmltcG9ydCBWZWN0b3IyIGZyb20gXCIuLi8uLi9tYXRoL1ZlY3RvcjJcIjtcclxuaW1wb3J0IFZlY3RvcjMgZnJvbSBcIi4uLy4uL21hdGgvVmVjdG9yM1wiO1xyXG5pbXBvcnQgVmVjdG9yNCBmcm9tIFwiLi4vLi4vbWF0aC9WZWN0b3I0XCI7XHJcbmltcG9ydCB7IFBvaW50TGlnaHQgfSBmcm9tIFwiLi4vUG9pbnRMaWdodFwiO1xyXG5pbXBvcnQgeyBCYXNlU2hhZG93IH0gZnJvbSBcIi4vQmFzZVNoYWRvd1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBvaW50TGlnaHRTaGFkb3cgZXh0ZW5kcyBCYXNlU2hhZG93IHtcclxuXHRwdWJsaWMgdHlwZTogc3RyaW5nO1xyXG5cdHByaXZhdGUgX3BvaW50TGlnaHRTaGFkb3dMb29rRGlyZWN0aW9uczogQXJyYXk8VmVjdG9yMz47XHJcblx0cHJpdmF0ZSBfcG9pbnRMaWdodFNoYWRvd1VwczogQXJyYXk8VmVjdG9yMz47XHJcblx0dnBNYXRyaXhBcnJheURpcnR5OiBib29sZWFuO1xyXG5cclxuXHRnZXQgY2FtZXJhKCk6IFBvaW50TGlnaHRTaGFkb3dDYW1lcmEge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2NhbWVyYSBhcyBQb2ludExpZ2h0U2hhZG93Q2FtZXJhO1xyXG5cdH1cclxuXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblx0XHRjb25zdCBjYW1lcmEgPSBuZXcgUG9pbnRMaWdodFNoYWRvd0NhbWVyYSg5MCwgMSwgMC4xLCA1MDApO1xyXG5cdFx0c3VwZXIobmV3IFZlY3RvcjIoMTUzNiwgMTAyNCksIGNhbWVyYSk7XHJcblx0XHR0aGlzLnZpZXdwb3J0U2l6ZSA9IG5ldyBWZWN0b3IyKDUxMiwgNTEyKTtcclxuXHRcdHRoaXMuY3VycmVudFZpZXdwb3J0SW5kZXggPSAwO1xyXG5cdFx0dGhpcy50eXBlID0gXCJwb2ludExpZ2h0U2hhZG93XCI7XHJcblx0XHR0aGlzLnZwTWF0cml4QXJyYXlEaXJ0eSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5fdmlld3BvcnRzID0gW1xyXG5cdFx0XHQvLyBwb3NpdGl2ZSBYIDBcclxuXHRcdFx0bmV3IFZlY3RvcjQoMCwgMCwgMSAvIDMsIDEgLyAyKSxcclxuXHRcdFx0Ly8gbmVnYXRpdmUgWCAxXHJcblx0XHRcdG5ldyBWZWN0b3I0KDEsIDAsIDEgLyAzLCAxIC8gMiksXHJcblx0XHRcdC8vIHBvc2l0aXZlIFogMlxyXG5cdFx0XHRuZXcgVmVjdG9yNCgyLCAwLCAxIC8gMywgMSAvIDIpLFxyXG5cdFx0XHQvLyBuZWdhdGl2ZSBaIDNcclxuXHRcdFx0bmV3IFZlY3RvcjQoMCwgMSwgMSAvIDMsIDEgLyAyKSxcclxuXHRcdFx0Ly8gcG9zaXRpdmUgWSA0XHJcblx0XHRcdG5ldyBWZWN0b3I0KDEsIDEsIDEgLyAzLCAxIC8gMiksXHJcblx0XHRcdC8vIG5lZ2F0aXZlIFkgNVxyXG5cdFx0XHRuZXcgVmVjdG9yNCgyLCAxLCAxIC8gMywgMSAvIDIpXHJcblx0XHRdO1xyXG5cclxuXHRcdHRoaXMuX3BvaW50TGlnaHRTaGFkb3dMb29rRGlyZWN0aW9ucyA9IFtcclxuXHRcdFx0bmV3IFZlY3RvcjMoMSwgMCwgMCksXHJcblx0XHRcdG5ldyBWZWN0b3IzKC0xLCAwLCAwKSxcclxuXHRcdFx0bmV3IFZlY3RvcjMoMCwgMCwgMSksXHJcblx0XHRcdG5ldyBWZWN0b3IzKDAsIDAsIC0xKSxcclxuXHRcdFx0bmV3IFZlY3RvcjMoMCwgMSwgMCksXHJcblx0XHRcdG5ldyBWZWN0b3IzKDAsIC0xLCAwKVxyXG5cdFx0XTtcclxuXHJcblx0XHR0aGlzLl9wb2ludExpZ2h0U2hhZG93VXBzID0gW1xyXG5cdFx0XHRuZXcgVmVjdG9yMygwLCAxLCAwKSxcclxuXHRcdFx0bmV3IFZlY3RvcjMoMCwgMSwgMCksXHJcblx0XHRcdG5ldyBWZWN0b3IzKDAsIDEsIDApLFxyXG5cdFx0XHRuZXcgVmVjdG9yMygwLCAxLCAwKSxcclxuXHRcdFx0bmV3IFZlY3RvcjMoMCwgMCwgMSksXHJcblx0XHRcdG5ldyBWZWN0b3IzKDAsIDAsIC0xKVxyXG5cdFx0XTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyB1cGRhdGUobGlnaHQ6IFBvaW50TGlnaHQpIHtcclxuXHRcdHRoaXMudXBkYXRlTWF0cmljZXMobGlnaHQpO1xyXG5cdH1cclxuXHJcblx0dXBkYXRlTWF0cmljZXMobGlnaHQ6IFBvaW50TGlnaHQpIHtcclxuXHRcdGlmICh0aGlzLmNhbWVyYSBpbnN0YW5jZW9mIFBvaW50TGlnaHRTaGFkb3dDYW1lcmEpIHtcclxuXHRcdFx0dGhpcy5jYW1lcmEucG9zaXRpb24uY29weShsaWdodC5wb3NpdGlvbik7XHJcblx0XHRcdGNvbnN0IHRhcmdldCA9IFZlY3RvcjMuY2xvbmUobGlnaHQucG9zaXRpb24pO1xyXG5cdFx0XHR0YXJnZXQuYWRkKHRoaXMuX3BvaW50TGlnaHRTaGFkb3dMb29rRGlyZWN0aW9uc1t0aGlzLmN1cnJlbnRWaWV3cG9ydEluZGV4XSk7XHJcblx0XHRcdHRoaXMuY2FtZXJhLnVwLmNvcHkodGhpcy5fcG9pbnRMaWdodFNoYWRvd1Vwc1t0aGlzLmN1cnJlbnRWaWV3cG9ydEluZGV4XSk7XHJcblx0XHRcdGNvbnN0IHsgeCwgeSwgeiB9ID0gdGFyZ2V0O1xyXG5cdFx0XHR0aGlzLmNhbWVyYS5sb29rQXQoeCwgeSwgeik7XHJcblx0XHRcdHRoaXMuY2FtZXJhLnVwZGF0ZU1hdHJpeCgpO1xyXG5cdFx0XHR0aGlzLmNhbWVyYS51cGRhdGVWcE1hdHJpeEFycmF5QW5kSW5kZXgodGhpcy5jdXJyZW50Vmlld3BvcnRJbmRleCk7XHJcblx0XHRcdGlmICh0aGlzLmN1cnJlbnRWaWV3cG9ydEluZGV4ID09IDUpIHRoaXMudnBNYXRyaXhBcnJheURpcnR5ID0gdHJ1ZTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IHsgTGlnaHRUeXBlIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVVHlwZXNcIjtcclxuaW1wb3J0IFZlY3RvcjMgZnJvbSBcIi4uL21hdGgvVmVjdG9yM1wiO1xyXG5pbXBvcnQgeyBMaWdodCB9IGZyb20gXCIuL0xpZ2h0XCI7XHJcbmltcG9ydCB7IFBvaW50TGlnaHRTaGFkb3cgfSBmcm9tIFwiLi9zaGFkb3dzL1BvaW50TGlnaHRTaGFkb3dcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBQb2ludExpZ2h0IGV4dGVuZHMgTGlnaHQge1xyXG5cdHByaXZhdGUgX2Rpc3RhbmNlOiBudW1iZXI7XHJcblx0cHJpdmF0ZSBfZGVjYXk6IG51bWJlcjtcclxuXHRkaXN0YW5jZURpcnR5OiBib29sZWFuO1xyXG5cdGRlY2F5RGlydHk6IGJvb2xlYW47XHJcblxyXG5cdGdldCBzaGFkb3coKTogUG9pbnRMaWdodFNoYWRvdyB7XHJcblx0XHRyZXR1cm4gdGhpcy5fc2hhZG93IGFzIFBvaW50TGlnaHRTaGFkb3c7XHJcblx0fVxyXG5cclxuXHRzZXQgc2hhZG93KHZhbHVlOiBQb2ludExpZ2h0U2hhZG93KSB7XHJcblx0XHR0aGlzLnNoYWRvd0RpcnR5ID0gdHJ1ZTtcclxuXHRcdHRoaXMuX3NoYWRvdyA9IHZhbHVlO1xyXG5cdH1cclxuXHJcblx0Y29uc3RydWN0b3IoY29sb3I6IFZlY3RvcjMsIGludGVuc2l0eTogbnVtYmVyLCBkaXN0YW5jZSA9IDAsIGRlY2F5ID0gNCwgb3BlblNoYWRvdyA9IHRydWUpIHtcclxuXHRcdHN1cGVyKGNvbG9yLCBpbnRlbnNpdHkpO1xyXG5cdFx0dGhpcy5fZGlzdGFuY2UgPSBkaXN0YW5jZTtcclxuXHRcdHRoaXMuX2RlY2F5ID0gZGVjYXk7XHJcblx0XHR0aGlzLmRpc3RhbmNlRGlydHkgPSB0cnVlO1xyXG5cdFx0dGhpcy5kZWNheURpcnR5ID0gdHJ1ZTtcclxuXHRcdHRoaXMubGlnaHRUeXBlID0gTGlnaHRUeXBlLlBvaW50TGlnaHQ7XHJcblx0XHRpZiAob3BlblNoYWRvdykgdGhpcy5zaGFkb3cgPSBuZXcgUG9pbnRMaWdodFNoYWRvdygpO1xyXG5cdH1cclxuXHRzZXQgZGlzdGFuY2UodmFsdWUpIHtcclxuXHRcdHRoaXMuZGlzdGFuY2VEaXJ0eSA9IHRydWU7XHJcblx0XHR0aGlzLl9kaXN0YW5jZSA9IHZhbHVlO1xyXG5cdH1cclxuXHRnZXQgZGlzdGFuY2UoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fZGlzdGFuY2U7XHJcblx0fVxyXG5cdHNldCBkZWNheSh2YWx1ZSkge1xyXG5cdFx0dGhpcy5kZWNheURpcnR5ID0gdHJ1ZTtcclxuXHRcdHRoaXMuX2RlY2F5ID0gdmFsdWU7XHJcblx0fVxyXG5cdGdldCBkZWNheSgpIHtcclxuXHRcdHJldHVybiB0aGlzLl9kZWNheTtcclxuXHR9XHJcbn1cclxuLy8gdW5pZm9ybVxyXG4vLyBjb2xvcjoge30sXHJcbi8vIHBvc2l0aW9uOiB7fSxcclxuLy8gZGVjYXk6IHt9LFxyXG4vLyBkaXN0YW5jZToge31cclxuIiwiaW1wb3J0IENhbWVyYSBmcm9tIFwiLi4vY2FtZXJhL0NhbWVyYVwiO1xuaW1wb3J0IHsgRnJhbWVTdGF0ZSB9IGZyb20gXCIuLi9jb3JlL0ZyYW1lU3RhdGVcIjtcbmltcG9ydCBMaWdodE1hbmdlciBmcm9tIFwiLi4vY29yZS9MaWdodE1hbmdlclwiO1xuaW1wb3J0IFJlbmRlclF1ZXVlIGZyb20gXCIuLi9jb3JlL1JlbmRlclF1ZXVlXCI7XG5pbXBvcnQgeyBDb21tYW5kU3ViVHlwZSB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVUNvbnN0YW50XCI7XG5pbXBvcnQgeyBMaWdodCB9IGZyb20gXCIuLi9saWdodC9MaWdodFwiO1xuaW1wb3J0IHsgUG9pbnRMaWdodCB9IGZyb20gXCIuLi9saWdodC9Qb2ludExpZ2h0XCI7XG5pbXBvcnQgeyBCYXNlU2hhZG93IH0gZnJvbSBcIi4uL2xpZ2h0L3NoYWRvd3MvQmFzZVNoYWRvd1wiO1xuaW1wb3J0IHsgUG9pbnRMaWdodFNoYWRvdyB9IGZyb20gXCIuLi9saWdodC9zaGFkb3dzL1BvaW50TGlnaHRTaGFkb3dcIjtcbmltcG9ydCBTaGFkZXJNYXRlcmlhbCBmcm9tIFwiLi4vbWF0ZXJpYWwvU2hhZGVyTWF0ZXJpYWxcIjtcbmltcG9ydCBBdHRhY2htZW50IGZyb20gXCIuLi9yZW5kZXIvQXR0YWNobWVudFwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcIi4uL3JlbmRlci9Db250ZXh0XCI7XG5pbXBvcnQgUmVuZGVyVGFyZ2V0IGZyb20gXCIuLi9yZW5kZXIvUmVuZGVyVGFyZ2V0XCI7XG5pbXBvcnQgVGV4dHVyZSBmcm9tIFwiLi4vcmVuZGVyL1RleHR1cmVcIjtcbmltcG9ydCBnZXRWZXJ0RnJhZyBmcm9tIFwiLi4vc2hhZGVyL1NoYWRlcnNcIjtcbmltcG9ydCBQYXNzIGZyb20gXCIuL1Bhc3NcIjtcbmV4cG9ydCBjbGFzcyBTaGFkb3dQYXNzIGV4dGVuZHMgUGFzcyB7XG5cdHB1YmxpYyBzaGFkb3dNYXRlcmlhbDogU2hhZGVyTWF0ZXJpYWw7XG5cdF90ZXN0VGV4dHVyZTogVGV4dHVyZTtcblx0Y29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCkge1xuXHRcdHN1cGVyKGNvbnRleHQpO1xuXHRcdHRoaXMuaW5pdChjb250ZXh0KTtcblx0fVxuXHRyZW5kZXIoZnJhbWVTdGF0ZTogRnJhbWVTdGF0ZSwgY2FtZXJhPzogQ2FtZXJhKSB7XG5cdFx0Y29uc3QgeyByZW5kZXJRdWV1ZSwgY29udGV4dCwgbGlnaHRNYW5nZXIgfSA9IGZyYW1lU3RhdGU7XG5cdFx0Y29uc3QgbGlnaHRzID0gbGlnaHRNYW5nZXIuZ2V0QWxsTGlnaHRzKCk7XG5cdFx0aWYgKGxpZ2h0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGlnaHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBsaWdodDogUG9pbnRMaWdodCB8IExpZ2h0ID0gbGlnaHRzW2ldO1xuXHRcdFx0Y29uc3Qgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXHRcdFx0aWYgKCFzaGFkb3cpIGNvbnRpbnVlO1xuXHRcdFx0Ly8gdGhpcy5fdGVzdFRleHR1cmUgPSBjb250ZXh0LmxpZ2h0TWFuZ2VyLl90ZXN0VGV4dHVyZVxuXHRcdFx0Ly8gdGhpcy5iZWZvcmVSZW5kZXIoeyBzaGFkb3cgfSk7XG5cdFx0XHRpZiAoc2hhZG93IGluc3RhbmNlb2YgUG9pbnRMaWdodFNoYWRvdyAmJiBsaWdodCBpbnN0YW5jZW9mIFBvaW50TGlnaHQpIHtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzaGFkb3cudmlld3BvcnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0Ly8g5Yqo5oCBYnVmZmVy5pqC5pyq6LCD6YCa77yM5YWI5Lul5q2k56eN5pa55byP6Kej5YazXG5cdFx0XHRcdFx0c3dpdGNoIChpKSB7XG5cdFx0XHRcdFx0XHRjYXNlIDA6XG5cdFx0XHRcdFx0XHRcdHRoaXMucmVuZGVyVGFyZ2V0LmRlcHRoQXR0YWNobWVudC5vcCA9IFwiY2xlYXJcIjtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdHRoaXMucmVuZGVyVGFyZ2V0LmRlcHRoQXR0YWNobWVudC5vcCA9IFwibG9hZFwiO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5iZWZvcmVSZW5kZXIoeyBzaGFkb3cgfSk7XG5cblx0XHRcdFx0XHRjb25zdCB2aWV3cG9ydCA9IHNoYWRvdy52aWV3cG9ydHNbaV07XG5cdFx0XHRcdFx0Y29uc3Qgdmlld3BvcnRTaXplID0gc2hhZG93LnZpZXdwb3J0U2l6ZTtcblx0XHRcdFx0XHRzaGFkb3cuY3VycmVudFZpZXdwb3J0SW5kZXggPSBpO1xuXHRcdFx0XHRcdHNoYWRvdy51cGRhdGUobGlnaHQpO1xuXHRcdFx0XHRcdC8vIGxpZ2h0LmZvcmNlVXBkYXRlID0gdHJ1ZTtcblx0XHRcdFx0XHRjb250ZXh0LnNldFZpZXdQb3J0KFxuXHRcdFx0XHRcdFx0dmlld3BvcnQueCAqIHZpZXdwb3J0U2l6ZS54LFxuXHRcdFx0XHRcdFx0dmlld3BvcnQueSAqIHZpZXdwb3J0U2l6ZS55LFxuXHRcdFx0XHRcdFx0dmlld3BvcnRTaXplLngsXG5cdFx0XHRcdFx0XHR2aWV3cG9ydFNpemUueVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Y29udGV4dC5zZXRTY2lzc29yVGVzdChcblx0XHRcdFx0XHRcdHZpZXdwb3J0LnggKiB2aWV3cG9ydFNpemUueCxcblx0XHRcdFx0XHRcdHZpZXdwb3J0LnkgKiB2aWV3cG9ydFNpemUueSxcblx0XHRcdFx0XHRcdHZpZXdwb3J0U2l6ZS54LFxuXHRcdFx0XHRcdFx0dmlld3BvcnRTaXplLnlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHRoaXMuc3ViUmVuZGVyKHJlbmRlclF1ZXVlLCBzaGFkb3csIGxpZ2h0TWFuZ2VyKTtcblx0XHRcdFx0XHRzdXBlci5hZnRlclJlbmRlcigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnJlbmRlclRhcmdldC5kZXB0aEF0dGFjaG1lbnQub3AgPSBcImNsZWFyXCI7XG5cdFx0XHRcdHRoaXMuYmVmb3JlUmVuZGVyKHsgc2hhZG93IH0pO1xuXHRcdFx0XHRzaGFkb3cudXBkYXRlKGxpZ2h0KTtcblx0XHRcdFx0Y29udGV4dC5zZXRWaWV3UG9ydCgwLCAwLCBzaGFkb3cuc2hhZG93TWFwU2l6ZS54LCBzaGFkb3cuc2hhZG93TWFwU2l6ZS55KTtcblx0XHRcdFx0Y29udGV4dC5zZXRTY2lzc29yVGVzdCgwLCAwLCBzaGFkb3cuc2hhZG93TWFwU2l6ZS54LCBzaGFkb3cuc2hhZG93TWFwU2l6ZS55KTtcblx0XHRcdFx0dGhpcy5zdWJSZW5kZXIocmVuZGVyUXVldWUsIHNoYWRvdywgbGlnaHRNYW5nZXIpO1xuXHRcdFx0XHRzdXBlci5hZnRlclJlbmRlcigpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBzdXBlci5hZnRlclJlbmRlcigpO1xuXHRcdGxpZ2h0TWFuZ2VyLnVwZGF0ZUxpZ2h0U2hhZG93KCk7XG5cdFx0Y29udGV4dC5yZXNldFZpZXdQb3J0VG9GdWxsQ2FudmFzKCk7XG5cdH1cblxuXHRzdWJSZW5kZXIocmVuZGVyUXVldWU6IFJlbmRlclF1ZXVlLCBzaGFkb3c6IEJhc2VTaGFkb3csIGxpZ2h0TWFuZ2VyOiBMaWdodE1hbmdlcikge1xuXHRcdHJlbmRlclF1ZXVlLnNvcnQoKTtcblx0XHQvLyByZW5kZXJRdWV1ZS5wcmVSZW5kZXIoc2hhZG93LmNhbWVyYSwgdGhpcy5jb250ZXh0LCB0aGlzLnBhc3NSZW5kZXJFbmNvZGVyKTtcblx0XHRyZW5kZXJRdWV1ZS50cmFuc3BhcmVudFJlbmRlcihcblx0XHRcdHNoYWRvdy5jYW1lcmEsXG5cdFx0XHR0aGlzLmNvbnRleHQsXG5cdFx0XHR0aGlzLnBhc3NSZW5kZXJFbmNvZGVyLFxuXHRcdFx0dGhpcy5zaGFkb3dNYXRlcmlhbCxcblx0XHRcdENvbW1hbmRTdWJUeXBlLlNoYWRvdyxcblx0XHRcdGxpZ2h0TWFuZ2VyXG5cdFx0KTtcblx0XHRyZW5kZXJRdWV1ZS5vcGFxdWVSZW5kZXIoXG5cdFx0XHRzaGFkb3cuY2FtZXJhLFxuXHRcdFx0dGhpcy5jb250ZXh0LFxuXHRcdFx0dGhpcy5wYXNzUmVuZGVyRW5jb2Rlcixcblx0XHRcdHRoaXMuc2hhZG93TWF0ZXJpYWwsXG5cdFx0XHRDb21tYW5kU3ViVHlwZS5TaGFkb3csXG5cdFx0XHRsaWdodE1hbmdlclxuXHRcdCk7XG5cdH1cblxuXHQvLyBnZXREZXB0aFRleHR1cmUoKTogVGV4dHVyZSB7XG5cdC8vIFx0cmV0dXJuIHRoaXMuX3Rlc3RUZXh0dXJlO1xuXHQvLyB9XG5cdGJlZm9yZVJlbmRlcihvcHRpb25zOiB7IHNoYWRvdzogQmFzZVNoYWRvdyB9KSB7XG5cdFx0Y29uc3QgeyBzaGFkb3cgfSA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zZXRSZW5kZXJUYXJnZXQoc2hhZG93KTtcblx0XHRzdXBlci5iZWZvcmVSZW5kZXIoKTtcblx0fVxuXHRwdWJsaWMgc2V0U2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuXHRcdHRoaXMucmVuZGVyVGFyZ2V0LnNldFNpemUod2lkdGgsIGhlaWdodCwgMSk7XG5cdH1cblx0cHJpdmF0ZSBzZXRSZW5kZXJUYXJnZXQoc2hhZG93OiBCYXNlU2hhZG93KSB7XG5cdFx0dGhpcy5yZW5kZXJUYXJnZXQuZGVwdGhBdHRhY2htZW50LnRleHR1cmUgPSBzaGFkb3cuZ2V0U2hhZG93TWFwVGV4dHVyZSgpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbml0KGNvbnRleHQ6IENvbnRleHQpIHtcblx0XHR0aGlzLmNyZWF0ZVJlbmRlclRhcmdldChjb250ZXh0KTtcblx0XHR0aGlzLmNyZWF0ZVNoYWRvd01hdGVyaWFsKCk7XG5cdH1cblx0cHJpdmF0ZSBjcmVhdGVSZW5kZXJUYXJnZXQoY29udGV4dDogQ29udGV4dCkge1xuXHRcdGNvbnN0IGRlcHRoQXR0YWNobWVudCA9IG5ldyBBdHRhY2htZW50KDEuMCwgeyB0ZXh0dXJlOiB1bmRlZmluZWQgfSk7XG5cdFx0dGhpcy5yZW5kZXJUYXJnZXQgPSBuZXcgUmVuZGVyVGFyZ2V0KFwicmVuZGVyXCIsIFtdLCBkZXB0aEF0dGFjaG1lbnQpO1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVTaGFkb3dNYXRlcmlhbCgpIHtcblx0XHRjb25zdCBzaGFkb3dNYXBTaGFkZXJGdW5jdGlvbiA9IChkZWZpbmVzID0ge30pID0+IHtcblx0XHRcdGNvbnN0IGZpbmFsRGVmaW5lcyA9IE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzZWxmQmluZGluZzogMCxcblx0XHRcdFx0XHRjYW1lcmFCaW5kaW5nOiAwLFxuXHRcdFx0XHRcdHBvc2l0aW9uTG9jYXRpb246IDBcblx0XHRcdFx0fSxcblx0XHRcdFx0ZGVmaW5lc1xuXHRcdFx0KTtcblx0XHRcdHJldHVybiBnZXRWZXJ0RnJhZyhcInNoYWRvd01hcFwiLCBmaW5hbERlZmluZXMpLnZlcnQ7XG5cdFx0fTtcblxuXHRcdHRoaXMuc2hhZG93TWF0ZXJpYWwgPSBuZXcgU2hhZGVyTWF0ZXJpYWwoe1xuXHRcdFx0c2hhZGVySWQ6IFwic2hhZG93TWF0ZXJpYWxcIixcblx0XHRcdHVuaWZvcm1CdWZmZXJzOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR1aWQ6IFwic2hhZG93XCIsXG5cdFx0XHRcdFx0dW5pZm9ybXM6IHtcblx0XHRcdFx0XHRcdG1vZGVsTWF0cml4OiB7IHR5cGU6IFwibWF0NHg0PGYzMj5cIiwgdmFsdWU6IG51bGwgfVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XSxcblx0XHRcdHZlcnQ6IHNoYWRvd01hcFNoYWRlckZ1bmN0aW9uLFxuXHRcdFx0ZnJhZzogdW5kZWZpbmVkLFxuXHRcdFx0bGlnaHQ6IGZhbHNlIC8vIFRPRE865YWIdHJ1Ze+8jGZhbHNl5pyJ5pi+56S6YnVnXG5cdFx0fSk7XG5cdH1cbn1cbiIsImltcG9ydCBDYW1lcmEgZnJvbSBcIi4uL2NhbWVyYS9DYW1lcmFcIjtcclxuaW1wb3J0IHsgRnJhbWVTdGF0ZSB9IGZyb20gXCIuLi9jb3JlL0ZyYW1lU3RhdGVcIjtcclxuaW1wb3J0IHsgQmFzaWNQYXNzIH0gZnJvbSBcIi4uL3Bhc3MvQmFzaWNQYXNzXCI7XHJcbmltcG9ydCB7IFNoYWRvd1Bhc3MgfSBmcm9tIFwiLi4vcGFzcy9TaGFkb3dQYXNzXCI7XHJcbmltcG9ydCBDb250ZXh0IGZyb20gXCIuLi9yZW5kZXIvQ29udGV4dFwiO1xyXG5pbXBvcnQgVGV4dHVyZSBmcm9tIFwiLi4vcmVuZGVyL1RleHR1cmVcIjtcclxuaW1wb3J0IElCYXNlUmVuZGVyTGluZSBmcm9tIFwiLi9JQmFzZVJlbmRlckxpbmVcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcndhcmRSZW5kZXJMaW5lIGltcGxlbWVudHMgSUJhc2VSZW5kZXJMaW5lIHtcclxuXHRwcml2YXRlIGJhc2ljUGFzczogQmFzaWNQYXNzO1xyXG5cdHByb3RlY3RlZCBzaGFkb3dQYXNzOiBTaGFkb3dQYXNzO1xyXG5cdGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZXh0OiBDb250ZXh0KSB7XHJcblx0XHR0aGlzLmJhc2ljUGFzcyA9IG5ldyBCYXNpY1Bhc3MoY29udGV4dCk7XHJcblx0XHR0aGlzLnNoYWRvd1Bhc3MgPSBuZXcgU2hhZG93UGFzcyhjb250ZXh0KTtcclxuXHR9XHJcblx0Z2V0T3V0cHV0VGV4dHVyZSgpOiBUZXh0dXJlIHtcclxuXHRcdHJldHVybiB0aGlzLmJhc2ljUGFzcy5nZXRDb2xvclRleHR1cmUoMCk7XHJcblx0XHQvLyByZXR1cm4gdGhpcy5zaGFkb3dQYXNzLmdldERlcHRoVGV4dHVyZSgpXHJcblx0fVxyXG5cdHJlbmRlcihmcmFtZVN0YXRlOiBGcmFtZVN0YXRlLCBjYW1lcmE/OiBDYW1lcmEpIHtcclxuXHRcdHRoaXMuc2hhZG93UGFzcy5yZW5kZXIoZnJhbWVTdGF0ZSwgY2FtZXJhKTtcclxuXHJcblx0XHR0aGlzLmJhc2ljUGFzcy5iZWZvcmVSZW5kZXIoZnJhbWVTdGF0ZSk7XHJcblx0XHR0aGlzLmJhc2ljUGFzcy5yZW5kZXIoZnJhbWVTdGF0ZSwgY2FtZXJhKTtcclxuXHRcdHRoaXMuYmFzaWNQYXNzLmFmdGVyUmVuZGVyKCk7XHJcblx0fVxyXG5cdHNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuXHRcdHRoaXMuYmFzaWNQYXNzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLnNoYWRvd1Bhc3Muc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHR9XHJcblx0ZGVzdHJveSgpIHtcclxuXHRcdHRoaXMuYmFzaWNQYXNzID0gdW5kZWZpbmVkO1xyXG5cdH1cclxufVxyXG4iLCJpbXBvcnQgQ2FtZXJhIGZyb20gXCIuL2NhbWVyYS9DYW1lcmFcIjtcclxuaW1wb3J0IFBlcnNwZWN0aXZlQ2FtZXJhIGZyb20gXCIuL2NhbWVyYS9QZXJzcGVjdGl2ZUNhbWVyYVwiO1xyXG5pbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tIFwiLi9jb3JlL0V2ZW50RGlzcGF0Y2hlclwiO1xyXG5pbXBvcnQgeyBGcmFtZVN0YXRlLCBCYWNrZ3JvdW5kIH0gZnJvbSBcIi4vY29yZS9GcmFtZVN0YXRlXCI7XHJcbmltcG9ydCBMaWdodE1hbmdlciBmcm9tIFwiLi9jb3JlL0xpZ2h0TWFuZ2VyXCI7XHJcbmltcG9ydCBNZXNoTWFuZ2VyIGZyb20gXCIuL2NvcmUvTWVzaE1hbmdlclwiO1xyXG5pbXBvcnQgdGV4dHVyZUNhY2hlIGZyb20gXCIuL2NvcmUvVGV4dHVyZUNhY2hlXCI7XHJcbmltcG9ydCB7IEluc3RhbmNlLCBSZW5kZXJPYmplY3RUeXBlIH0gZnJvbSBcIi4vY29yZS9XZWJHUFVUeXBlc1wiO1xyXG5pbXBvcnQgeyBMaWdodCB9IGZyb20gXCIuL2xpZ2h0L0xpZ2h0XCI7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tIFwiLi9tZXNoL01lc2hcIjtcclxuaW1wb3J0IE5vZGUgZnJvbSBcIi4vbWVzaC9Ob2RlXCI7XHJcbmltcG9ydCBQb3N0RWZmZWN0IGZyb20gXCIuL3Bvc3QtcHJvY2Vzcy9Qb3N0RWZmZWN0XCI7XHJcbmltcG9ydCBQb3N0RWZmZWN0Q29sbGVjdGlvbiBmcm9tIFwiLi9wb3N0LXByb2Nlc3MvUG9zdEVmZmVjdENvbGxlY3Rpb25cIjtcclxuaW1wb3J0IENvbnRleHQgZnJvbSBcIi4vcmVuZGVyL0NvbnRleHRcIjtcclxuaW1wb3J0IHsgVmlld1BvcnQgfSBmcm9tIFwiLi9yZW5kZXIvUmVuZGVyU3RhdGVcIjtcclxuaW1wb3J0IEZvcndhcmRSZW5kZXJMaW5lIGZyb20gXCIuL3JlbmRlcnBpcGVsaW5lL0ZvcndhcmRSZW5kZXJMaW5lXCI7XHJcbmltcG9ydCBJQmFzZVJlbmRlckxpbmUgZnJvbSBcIi4vcmVuZGVycGlwZWxpbmUvSUJhc2VSZW5kZXJMaW5lXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2NlbmUgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIge1xyXG5cdGNhbWVyYTogUGVyc3BlY3RpdmVDYW1lcmE7XHJcblx0Y29udGV4dDogQ29udGV4dDtcclxuXHRyZXF1ZXN0QWRhcHRlcjogb2JqZWN0O1xyXG5cdGRldmljZURlc2NyaXB0b3I6IG9iamVjdDtcclxuXHRwcmVzZW50YXRpb25Db250ZXh0RGVzY3JpcHRvcjogb2JqZWN0O1xyXG5cdGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQ7XHJcblx0ZnJhbWVTdGF0ZTogRnJhbWVTdGF0ZTtcclxuXHRjdXJyZW50UmVuZGVyUGlwZWxpbmU6IElCYXNlUmVuZGVyTGluZTtcclxuXHR2aWV3cG9ydDogVmlld1BvcnQ7XHJcblx0YmFja2dyb3VuZDogQmFja2dyb3VuZDtcclxuXHRwcml2YXRlIHJlYWR5OiBib29sZWFuO1xyXG5cdHByaXZhdGUgaW5pdGVkOiBib29sZWFuO1xyXG5cdHByaXZhdGUgbWVzaE1hbmdlcjogTWVzaE1hbmdlcjtcclxuXHRwcml2YXRlIHBvc3RFZmZlY3RDb2xsZWN0aW9uOiBQb3N0RWZmZWN0Q29sbGVjdGlvbjtcclxuXHRwcml2YXRlIGxpZ2h0TWFuZ2VyOiBMaWdodE1hbmdlcjtcclxuXHRjb25zdHJ1Y3RvcihvcHRpb25zKSB7XHJcblx0XHRzdXBlcigpO1xyXG5cdFx0dGhpcy5jb250YWluZXIgPVxyXG5cdFx0XHRvcHRpb25zLmNvbnRhaW5lciBpbnN0YW5jZW9mIEhUTUxEaXZFbGVtZW50XHJcblx0XHRcdFx0PyBvcHRpb25zLmNvbnRhaW5lclxyXG5cdFx0XHRcdDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3B0aW9ucy5jb250YWluZXIpO1xyXG5cdFx0dGhpcy5tZXNoTWFuZ2VyID0gbmV3IE1lc2hNYW5nZXIoKTtcclxuXHRcdHRoaXMucG9zdEVmZmVjdENvbGxlY3Rpb24gPSBuZXcgUG9zdEVmZmVjdENvbGxlY3Rpb24oKTtcclxuXHRcdHRoaXMuY29udGV4dCA9IG5ldyBDb250ZXh0KHtcclxuXHRcdFx0Y2FudmFzOiBudWxsLFxyXG5cdFx0XHRjb250YWluZXI6IHRoaXMuY29udGFpbmVyLFxyXG5cdFx0XHRwaXhlbFJhdGlvOiAxXHJcblx0XHR9KTtcclxuXHRcdHRoaXMucmVxdWVzdEFkYXB0ZXIgPSBvcHRpb25zLnJlcXVlc3RBZGFwdGVyIHx8IHt9O1xyXG5cdFx0dGhpcy5kZXZpY2VEZXNjcmlwdG9yID0gb3B0aW9ucy5kZXZpY2VEZXNjcmlwdG9yIHx8IHt9O1xyXG5cdFx0dGhpcy5wcmVzZW50YXRpb25Db250ZXh0RGVzY3JpcHRvciA9IG9wdGlvbnMucHJlc2VudGF0aW9uQ29udGV4dERlc2NyaXB0b3I7XHJcblx0XHR0aGlzLnJlYWR5ID0gZmFsc2U7XHJcblx0XHR0aGlzLmluaXRlZCA9IGZhbHNlO1xyXG5cdFx0dGhpcy5saWdodE1hbmdlciA9IG5ldyBMaWdodE1hbmdlcih7IG9wZW5TaGFkb3c6IHRydWUgfSk7XHJcblx0XHR0aGlzLmJhY2tncm91bmQgPSBvcHRpb25zLmJhY2tncm91bmQ7XHJcblx0fVxyXG5cdHByaXZhdGUgYXN5bmMgaW5pdCgpIHtcclxuXHRcdGF3YWl0IHRoaXMuY29udGV4dC5pbml0KHRoaXMucmVxdWVzdEFkYXB0ZXIsIHRoaXMuZGV2aWNlRGVzY3JpcHRvciwgdGhpcy5wcmVzZW50YXRpb25Db250ZXh0RGVzY3JpcHRvcik7XHJcblx0XHR0aGlzLmN1cnJlbnRSZW5kZXJQaXBlbGluZSA9IG5ldyBGb3J3YXJkUmVuZGVyTGluZSh0aGlzLmNvbnRleHQpO1xyXG5cdFx0dGhpcy5mcmFtZVN0YXRlID0gbmV3IEZyYW1lU3RhdGUodGhpcy5jb250ZXh0LCB0aGlzLmxpZ2h0TWFuZ2VyLCBGcmFtZVN0YXRlLmdldEZyYW1lU3RhdGVPcHRpb25zQnlTY2VuZSh0aGlzKSk7XHJcblx0XHR0aGlzLnZpZXdwb3J0ID0gbmV3IFZpZXdQb3J0KDAsIDAsIHRoaXMuY29udGV4dC5wcmVzZW50YXRpb25TaXplLndpZHRoLCB0aGlzLmNvbnRleHQucHJlc2VudGF0aW9uU2l6ZS5oZWlnaHQpO1xyXG5cdFx0dGhpcy5yZWFkeSA9IHRydWU7XHJcblx0fVxyXG5cdGFkZChpbnN0YW5jZTogSW5zdGFuY2UpIHtcclxuXHRcdGlmIChcclxuXHRcdFx0W1JlbmRlck9iamVjdFR5cGUuTm9kZSwgUmVuZGVyT2JqZWN0VHlwZS5Ta3lib3gsIFJlbmRlck9iamVjdFR5cGUuTWVzaCwgUmVuZGVyT2JqZWN0VHlwZS5EZWJ1Z10uaW5jbHVkZXMoXHJcblx0XHRcdFx0aW5zdGFuY2UudHlwZVxyXG5cdFx0XHQpXHJcblx0XHQpIHtcclxuXHRcdFx0dGhpcy5tZXNoTWFuZ2VyLmFkZCg8TWVzaD5pbnN0YW5jZSk7XHJcblx0XHR9IGVsc2UgaWYgKGluc3RhbmNlLnR5cGUgPT0gUmVuZGVyT2JqZWN0VHlwZS5MaWdodCkge1xyXG5cdFx0XHR0aGlzLmxpZ2h0TWFuZ2VyLmFkZCg8TGlnaHQ+aW5zdGFuY2UpO1xyXG5cdFx0fSBlbHNlIGlmIChpbnN0YW5jZS50eXBlID09IFJlbmRlck9iamVjdFR5cGUuUG9zdEVmZmVjdCkge1xyXG5cdFx0XHR0aGlzLnBvc3RFZmZlY3RDb2xsZWN0aW9uLmFkZCg8UG9zdEVmZmVjdD5pbnN0YW5jZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJlbW92ZShpbnN0YW5jZTogSW5zdGFuY2UpIHtcclxuXHRcdGlmIChbUmVuZGVyT2JqZWN0VHlwZS5Ob2RlLCBSZW5kZXJPYmplY3RUeXBlLlNreWJveCwgUmVuZGVyT2JqZWN0VHlwZS5NZXNoXS5pbmNsdWRlcyhpbnN0YW5jZS50eXBlKSkge1xyXG5cdFx0XHR0aGlzLm1lc2hNYW5nZXIucmVtb3ZlKDxNZXNoPmluc3RhbmNlKTtcclxuXHRcdH0gZWxzZSBpZiAoaW5zdGFuY2UudHlwZSA9PSBSZW5kZXJPYmplY3RUeXBlLkxpZ2h0KSB7XHJcblx0XHRcdHRoaXMubGlnaHRNYW5nZXIucmVtb3ZlKDxMaWdodD5pbnN0YW5jZSk7XHJcblx0XHR9IGVsc2UgaWYgKGluc3RhbmNlLnR5cGUgPT0gUmVuZGVyT2JqZWN0VHlwZS5Qb3N0RWZmZWN0KSB7XHJcblx0XHRcdHRoaXMucG9zdEVmZmVjdENvbGxlY3Rpb24ucmVtb3ZlKDxQb3N0RWZmZWN0Pmluc3RhbmNlKTtcclxuXHRcdH1cclxuXHR9XHJcblx0c2V0Q2FtZXJhKGNhbWVyYSkge1xyXG5cdFx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XHJcblx0fVxyXG5cdHJlc2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG5cdFx0dGhpcy5jb250ZXh0LnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHRcdHRoaXM/LmN1cnJlbnRSZW5kZXJQaXBlbGluZT8uc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHRcdHRoaXM/LnBvc3RFZmZlY3RDb2xsZWN0aW9uPy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cdH1cclxuXHRhc3luYyByZW5kZXIobm9kZT86IE5vZGUsIGNhbWVyYT86IENhbWVyYSkge1xyXG5cdFx0aWYgKCF0aGlzLmluaXRlZCkge1xyXG5cdFx0XHR0aGlzLmluaXRlZCA9IHRydWU7XHJcblx0XHRcdGF3YWl0IHRoaXMuaW5pdCgpO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZShub2RlLCBjYW1lcmEpO1xyXG5cdFx0XHR0aGlzLmFmdGVyUmVuZGVyKCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnVwZGF0ZShub2RlLCBjYW1lcmEpO1xyXG5cdFx0XHR0aGlzLmFmdGVyUmVuZGVyKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhZnRlclJlbmRlcigpIHtcclxuXHRcdC8vIFRPRE9cclxuXHR9XHJcblxyXG5cdHB1YmxpYyBzZXRWaWV3UG9ydCh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBib29sZWFuIHtcclxuXHRcdGlmICghdGhpcy5yZWFkeSkgcmV0dXJuIGZhbHNlO1xyXG5cdFx0dGhpcy5jb250ZXh0LnNldFZpZXdQb3J0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cdHB1YmxpYyBzZXRTY2lzc29yVGVzdCh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBib29sZWFuIHtcclxuXHRcdGlmICghdGhpcy5yZWFkeSkgcmV0dXJuIGZhbHNlO1xyXG5cdFx0dGhpcy5jb250ZXh0LnNldFNjaXNzb3JUZXN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cdHByaXZhdGUgdXBkYXRlKG5vZGU/OiBOb2RlLCBjYW1lcmE/OiBDYW1lcmEpIHtcclxuXHRcdGlmICghdGhpcy5yZWFkeSkgcmV0dXJuO1xyXG5cdFx0Ly8g6YeK5pS+57q555CGXHJcblx0XHR0ZXh0dXJlQ2FjaGUucmVsZWFzZWRUZXh0dXJlcygpO1xyXG5cdFx0Ly8g5pu05pawRnJhbWVTdGF0ZVxyXG5cdFx0dGhpcy5mcmFtZVN0YXRlLnVwZGF0ZShjYW1lcmEgPz8gdGhpcy5jYW1lcmEsIEZyYW1lU3RhdGUuZ2V0RnJhbWVTdGF0ZU9wdGlvbnNCeVNjZW5lKHRoaXMpKTtcclxuXHRcdC8vIHVwZGF0ZSBwcmltaXRpdmUgYW5kIHNlbGVjdFxyXG5cdFx0KG5vZGUgPz8gdGhpcy5tZXNoTWFuZ2VyKS51cGRhdGUodGhpcy5mcmFtZVN0YXRlLCBjYW1lcmEgPz8gdGhpcy5jYW1lcmEpO1xyXG5cdFx0Ly8gc2VsY3QgcmVuZGVyUGlwZWxpbmVcclxuXHRcdHRoaXMuY3VycmVudFJlbmRlclBpcGVsaW5lLnJlbmRlcih0aGlzLmZyYW1lU3RhdGUsIGNhbWVyYSA/PyB0aGlzLmNhbWVyYSk7XHJcblx0XHQvLyDlkI7lpITnkIZcclxuXHRcdHRoaXMucG9zdEVmZmVjdENvbGxlY3Rpb24ucmVuZGVyKHRoaXMuY29udGV4dCwgdGhpcy5jdXJyZW50UmVuZGVyUGlwZWxpbmUuZ2V0T3V0cHV0VGV4dHVyZSgpKTtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IElDbG9uZSBmcm9tIFwiLi4vY29yZS9JQ2xvbmVcIjtcclxuaW1wb3J0IHsgUmVuZGVyT2JqZWN0VHlwZSB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVVR5cGVzXCI7XHJcbmltcG9ydCBHZW9tZXRyeSBmcm9tIFwiLi4vZ2VvbWV0cnkvR2VvbWV0cnlcIjtcclxuaW1wb3J0IHsgTWVzaCB9IGZyb20gXCIuLi9tZXNoL01lc2hcIjtcclxuaW1wb3J0IHsgRmxvYXQzMkF0dHJpYnV0ZSB9IGZyb20gXCIuLi9yZW5kZXIvQXR0cmlidXRlXCI7XHJcbmltcG9ydCBDb250ZXh0IGZyb20gXCIuLi9yZW5kZXIvQ29udGV4dFwiO1xyXG5pbXBvcnQgeyBQcmltaXRpdmUsIFJlbmRlclN0YXRlLCBUYXJnZXQgfSBmcm9tIFwiLi4vcmVuZGVyL1JlbmRlclN0YXRlXCI7XHJcbmltcG9ydCBSZW5kZXJUYXJnZXQgZnJvbSBcIi4uL3JlbmRlci9SZW5kZXJUYXJnZXRcIjtcclxuaW1wb3J0IFNhbXBsZXIgZnJvbSBcIi4uL3JlbmRlci9TYW1wbGVyXCI7XHJcbmltcG9ydCBUZXh0dXJlIGZyb20gXCIuLi9yZW5kZXIvVGV4dHVyZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9zdEVmZmVjdCBpbXBsZW1lbnRzIElDbG9uZSB7XHJcblx0d2lkdGg6IG51bWJlcjtcclxuXHJcblx0aGVpZ2h0OiBudW1iZXI7XHJcblxyXG5cdGRlZmF1bHRTYW1wbGVyOiBTYW1wbGVyO1xyXG5cclxuXHRyZXNvbHZlVG9DYW52YXM6IGJvb2xlYW47XHJcblxyXG5cdGN1cnJlbnRSZW5kZXJUYXJnZXQ6IFJlbmRlclRhcmdldDtcclxuXHJcblx0ZnVsbFNjcmVlblF1YWQ6IE1lc2g7XHJcblxyXG5cdHJlbmRlclN0YXRlOiBSZW5kZXJTdGF0ZTtcclxuXHJcblx0aWQ6IHN0cmluZztcclxuXHJcblx0cHJpb3JpdHk6IG51bWJlcjtcclxuXHJcblx0aXNQb3N0RWZmZWN0OiBib29sZWFuO1xyXG5cclxuXHR0eXBlOiBSZW5kZXJPYmplY3RUeXBlO1xyXG5cclxuXHRjb25zdHJ1Y3Rvcih3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgaWQ6IHN0cmluZykge1xyXG5cdFx0dGhpcy53aWR0aCA9IHdpZHRoO1xyXG5cdFx0dGhpcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblx0XHR0aGlzLmluaXREZWZhdWx0UGFybXMoKTtcclxuXHRcdHRoaXMuaWQgPSBpZDtcclxuXHRcdHRoaXMucHJpb3JpdHkgPSAwO1xyXG5cdFx0dGhpcy5pc1Bvc3RFZmZlY3QgPSB0cnVlO1xyXG5cdFx0dGhpcy50eXBlID0gUmVuZGVyT2JqZWN0VHlwZS5Qb3N0RWZmZWN0O1xyXG5cdH1cclxuXHRyZW5kZXIoY29udGV4dDogQ29udGV4dCwgY29sb3JUZXh0dXJlOiBUZXh0dXJlKTogVGV4dHVyZSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0c2V0U2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG5cdFx0Ly8gdG9kbyA7XHJcblx0fVxyXG5cdGRlc3Ryb3koKSB7XHJcblx0XHR0aGlzPy5jdXJyZW50UmVuZGVyVGFyZ2V0Py5kZXN0cm95KCk7XHJcblx0fVxyXG5cdHByb3RlY3RlZCByZW5kZXJNZXNoKGNvbnRleHQ6IENvbnRleHQpIHtcclxuXHRcdHRoaXMuZnVsbFNjcmVlblF1YWQubWF0ZXJpYWwuZGlydHkgPSB0cnVlO1xyXG5cdFx0dGhpcy5mdWxsU2NyZWVuUXVhZC5tYXRlcmlhbC51cGRhdGUoKTtcclxuXHRcdGNvbnN0IGRyYXdDb21hbmQgPSB0aGlzLmZ1bGxTY3JlZW5RdWFkLmdldERyYXdDb21tYW5kKCk7XHJcblx0XHRjb25zdCBjdXJyZW50UmVuZGVyUGFzc0VuY29kZXIgPSB0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQuYmVnaW5SZW5kZXJQYXNzKGNvbnRleHQuZGV2aWNlKTtcclxuXHRcdGRyYXdDb21hbmQucmVuZGVyKHsgZGV2aWNlOiBjb250ZXh0LmRldmljZSwgcGFzc0VuY29kZXI6IGN1cnJlbnRSZW5kZXJQYXNzRW5jb2RlciB9KTtcclxuXHRcdHRoaXMuY3VycmVudFJlbmRlclRhcmdldC5lbmRSZW5kZXJQYXNzKCk7XHJcblx0fVxyXG5cdHByaXZhdGUgaW5pdERlZmF1bHRQYXJtcygpIHtcclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEdlb21ldHJ5KHt9KTtcclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZShcclxuXHRcdFx0bmV3IEZsb2F0MzJBdHRyaWJ1dGUoXCJwb3NpdGlvblwiLCBbLTEuMCwgMS4wLCAtMS4wLCAtMS4wLCAxLjAsIC0xLjAsIDEuMCwgLTEuMCwgMS4wLCAxLjAsIC0xLjAsIDEuMF0sIDIpXHJcblx0XHQpO1xyXG5cdFx0Z2VvbWV0cnkuY291bnQgPSA2O1xyXG5cdFx0Ly8gcnNcclxuXHRcdGNvbnN0IHByaW1pdGl2ZSA9IG5ldyBQcmltaXRpdmUoKTtcclxuXHRcdGNvbnN0IHRhcmdldCA9IG5ldyBUYXJnZXQoKTtcclxuXHRcdC8vIHRhcmdldC5mb3JtYXQ9VGV4dHVyZUZvcm1hdC5SR0JBOFVub3JtXHJcblx0XHRjb25zdCByZW5kZXJTdGF0ZSA9IG5ldyBSZW5kZXJTdGF0ZSgpO1xyXG5cdFx0cmVuZGVyU3RhdGUucHJpbWl0aXZlID0gcHJpbWl0aXZlO1xyXG5cdFx0cmVuZGVyU3RhdGUudGFyZ2V0cyA9IFt0YXJnZXRdO1xyXG5cdFx0dGhpcy5yZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlO1xyXG5cdFx0dGhpcy5mdWxsU2NyZWVuUXVhZCA9IG5ldyBNZXNoKGdlb21ldHJ5KTtcclxuXHJcblx0XHR0aGlzLmRlZmF1bHRTYW1wbGVyID0gbmV3IFNhbXBsZXIoKTtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IHsgVGV4dHVyZUZvcm1hdCwgVGV4dHVyZVVzYWdlIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVQ29uc3RhbnRcIjtcbmltcG9ydCB7IFVuaWZvcm1CdWZmZXJQcm9wLCBVbmlmb3JtcyB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVVR5cGVzXCI7XG5pbXBvcnQgU2hhZGVyTWF0ZXJpYWwgZnJvbSBcIi4uL21hdGVyaWFsL1NoYWRlck1hdGVyaWFsXCI7XG5pbXBvcnQgQ29sb3IgZnJvbSBcIi4uL21hdGgvQ29sb3JcIjtcbmltcG9ydCBWZWN0b3IyIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJcIjtcbmltcG9ydCBWZWN0b3IzIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjNcIjtcbmltcG9ydCBBdHRhY2htZW50IGZyb20gXCIuLi9yZW5kZXIvQXR0YWNobWVudFwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcIi4uL3JlbmRlci9Db250ZXh0XCI7XG5pbXBvcnQgUmVuZGVyVGFyZ2V0IGZyb20gXCIuLi9yZW5kZXIvUmVuZGVyVGFyZ2V0XCI7XG5pbXBvcnQgVGV4dHVyZSBmcm9tIFwiLi4vcmVuZGVyL1RleHR1cmVcIjtcbmltcG9ydCBnZXRWZXJ0RnJhZyBmcm9tIFwiLi4vc2hhZGVyL1NoYWRlcnNcIjtcbmltcG9ydCBQb3N0RWZmZWN0IGZyb20gXCIuL1Bvc3RFZmZlY3RcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmxvb21Qb3N0RWZmZWN0IGV4dGVuZHMgUG9zdEVmZmVjdCB7XG5cdHN0YXRpYyBCbHVyRGlyZWN0aW9uWCA9IG5ldyBWZWN0b3IyKDEuMCwgMC4wKTtcblx0c3RhdGljIEJsdXJEaXJlY3Rpb25ZID0gbmV3IFZlY3RvcjIoMC4wLCAxLjApO1xuXHRzdHJlbmd0aDogbnVtYmVyO1xuXHRyYWRpdXM6IG51bWJlcjtcblx0dGhyZXNob2xkOiBudW1iZXI7XG5cdHJlbmRlclRhcmdldHNIb3Jpem9udGFsOiBSZW5kZXJUYXJnZXRbXTtcblx0cmVuZGVyVGFyZ2V0c1ZlcnRpY2FsOiBSZW5kZXJUYXJnZXRbXTtcblx0bk1pcHM6IG51bWJlcjtcblx0cmVuZGVyVGFyZ2V0QnJpZ2h0OiBSZW5kZXJUYXJnZXQ7XG5cdG1hdGVyaWFsSGlnaFBhc3NGaWx0ZXI6IFNoYWRlck1hdGVyaWFsO1xuXHRoaWdoUGFzc1VuaWZvcm1CdWZmZXI6IFVuaWZvcm1CdWZmZXJQcm9wO1xuXHRoaWdoUGFzc1VuaWZvcm1UZXh0dXJlQW5kU2FtcGxlcjogVW5pZm9ybXM7XG5cdGNvbXBvc2l0ZU1hdGVyaWFsOiBTaGFkZXJNYXRlcmlhbDtcblx0c2VwYXJhYmxlQmx1ck1hdGVyaWFsczogU2hhZGVyTWF0ZXJpYWxbXTtcblx0c2VwYXJhYmxlQmx1cllNYXRlcmlhbHM6IFNoYWRlck1hdGVyaWFsW107XG5cdGJsZW5kVW5pZm9ybVRleHR1cmVBbmRTYW1wbGVyOiBVbmlmb3Jtcztcblx0YmxlbmRNYXRlcmlhbDogU2hhZGVyTWF0ZXJpYWw7XG5cdGJsZW5kVGFyZ2V0OiBSZW5kZXJUYXJnZXQ7XG5cblx0Y29uc3RydWN0b3Iob3B0aW9uczogQmxvb21Qb3N0RWZmZWN0UHJvcHMpIHtcblx0XHRzdXBlcihvcHRpb25zLndpZHRoLCBvcHRpb25zLmhlaWdodCwgXCJibG9vbVwiKTtcblx0XHR0aGlzLnN0cmVuZ3RoID0gb3B0aW9ucy5zdHJlbmd0aDtcblx0XHR0aGlzLnJhZGl1cyA9IG9wdGlvbnMucmFkaXVzO1xuXHRcdHRoaXMudGhyZXNob2xkID0gb3B0aW9ucy50aHJlc2hvbGQ7XG5cdFx0dGhpcy5pbml0KCk7XG5cdH1cblx0ZGVzdHJveSgpIHtcblx0XHR0aGlzLnJlbmRlclRhcmdldEJyaWdodC5kZXN0cm95KCk7XG5cdH1cblx0cmVuZGVyKGNvbnRleHQ6IENvbnRleHQsIGNvbG9yVGV4dHVyZTogVGV4dHVyZSk6IFRleHR1cmUge1xuXHRcdC8vIDEuIEV4dHJhY3QgQnJpZ2h0IEFyZWFzXG5cdFx0dGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUYXJnZXRCcmlnaHQ7XG5cdFx0dGhpcy5oaWdoUGFzc1VuaWZvcm1UZXh0dXJlQW5kU2FtcGxlci50RGlmZnVzZS52YWx1ZSA9IGNvbG9yVGV4dHVyZTtcblx0XHR0aGlzLmZ1bGxTY3JlZW5RdWFkLm1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbEhpZ2hQYXNzRmlsdGVyO1xuXHRcdHRoaXMucmVuZGVyTWVzaChjb250ZXh0KTtcblx0XHQvLyAyLiBCbHVyIEFsbCB0aGUgbWlwcyBwcm9ncmVzc2l2ZWx5XG5cdFx0bGV0IGlucHV0UmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUYXJnZXRCcmlnaHQ7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5NaXBzOyBpKyspIHtcblx0XHRcdHRoaXMuZnVsbFNjcmVlblF1YWQubWF0ZXJpYWwgPSB0aGlzLnNlcGFyYWJsZUJsdXJNYXRlcmlhbHNbaV07XG5cblx0XHRcdHRoaXMuc2VwYXJhYmxlQmx1ck1hdGVyaWFsc1tpXS51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0UmVuZGVyVGFyZ2V0LmdldENvbG9yVGV4dHVyZSgpO1xuXHRcdFx0dGhpcy5zZXBhcmFibGVCbHVyTWF0ZXJpYWxzW2ldLnVuaWZvcm1zLmRpcmVjdGlvbi52YWx1ZSA9IEJsb29tUG9zdEVmZmVjdC5CbHVyRGlyZWN0aW9uWDtcblx0XHRcdHRoaXMuY3VycmVudFJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0c0hvcml6b250YWxbaV07XG5cblx0XHRcdHRoaXMucmVuZGVyTWVzaChjb250ZXh0KTtcblx0XHRcdHRoaXMuZnVsbFNjcmVlblF1YWQubWF0ZXJpYWwgPSB0aGlzLnNlcGFyYWJsZUJsdXJZTWF0ZXJpYWxzW2ldO1xuXHRcdFx0dGhpcy5zZXBhcmFibGVCbHVyWU1hdGVyaWFsc1tpXS51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IHRoaXMucmVuZGVyVGFyZ2V0c0hvcml6b250YWxbaV0uZ2V0Q29sb3JUZXh0dXJlKCk7XG5cdFx0XHR0aGlzLnNlcGFyYWJsZUJsdXJZTWF0ZXJpYWxzW2ldLnVuaWZvcm1zLmRpcmVjdGlvbi52YWx1ZSA9IEJsb29tUG9zdEVmZmVjdC5CbHVyRGlyZWN0aW9uWTtcblx0XHRcdHRoaXMuY3VycmVudFJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0c1ZlcnRpY2FsW2ldO1xuXG5cdFx0XHR0aGlzLnJlbmRlck1lc2goY29udGV4dCk7XG5cblx0XHRcdGlucHV0UmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUYXJnZXRzVmVydGljYWxbaV07XG5cdFx0fVxuXHRcdC8vIENvbXBvc2l0ZSBBbGwgdGhlIG1pcHNcblx0XHR0aGlzLmZ1bGxTY3JlZW5RdWFkLm1hdGVyaWFsID0gdGhpcy5jb21wb3NpdGVNYXRlcmlhbDtcblx0XHR0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQgPSB0aGlzLnJlbmRlclRhcmdldHNIb3Jpem9udGFsWzBdO1xuXHRcdHRoaXMucmVuZGVyTWVzaChjb250ZXh0KTtcblx0XHQvLyBibGVuZFxuXHRcdHRoaXMuYmxlbmRVbmlmb3JtVGV4dHVyZUFuZFNhbXBsZXIuYmFzZUNvbG9yVGV4dHVyZS52YWx1ZSA9IGNvbG9yVGV4dHVyZTtcblx0XHR0aGlzLmZ1bGxTY3JlZW5RdWFkLm1hdGVyaWFsID0gdGhpcy5ibGVuZE1hdGVyaWFsO1xuXHRcdHRoaXMuY3VycmVudFJlbmRlclRhcmdldCA9IHRoaXMuYmxlbmRUYXJnZXQ7XG5cdFx0dGhpcy5yZW5kZXJNZXNoKGNvbnRleHQpO1xuXHRcdHJldHVybiB0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQuZ2V0Q29sb3JUZXh0dXJlKCk7XG5cdH1cblx0c2V0U2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuXHRcdHRoaXM/LnJlbmRlclRhcmdldHNIb3Jpem9udGFsPy5mb3JFYWNoKChyZW5kZXJUYXJnZXQpID0+IHJlbmRlclRhcmdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQsIDEpKTtcblx0XHR0aGlzPy5yZW5kZXJUYXJnZXRzVmVydGljYWw/LmZvckVhY2goKHJlbmRlclRhcmdldCkgPT4gcmVuZGVyVGFyZ2V0LnNldFNpemUod2lkdGgsIGhlaWdodCwgMSkpO1xuXHRcdHRoaXM/LnJlbmRlclRhcmdldEJyaWdodD8uc2V0U2l6ZT8uKHdpZHRoLCBoZWlnaHQsIDEpO1xuXHRcdHRoaXM/LmJsZW5kVGFyZ2V0Py5zZXRTaXplPy4od2lkdGgsIGhlaWdodCwgMSk7XG5cdH1cblx0cHJpdmF0ZSBpbml0KCkge1xuXHRcdHRoaXMucmVuZGVyVGFyZ2V0c0hvcml6b250YWwgPSBbXTtcblx0XHR0aGlzLnJlbmRlclRhcmdldHNWZXJ0aWNhbCA9IFtdO1xuXHRcdHRoaXMubk1pcHMgPSA1O1xuXHRcdGxldCByZXN4ID0gTWF0aC5yb3VuZCh0aGlzLndpZHRoIC8gMik7XG5cdFx0bGV0IHJlc3kgPSBNYXRoLnJvdW5kKHRoaXMuaGVpZ2h0IC8gMik7XG5cblx0XHR0aGlzLnJlbmRlclRhcmdldEJyaWdodCA9IG5ldyBSZW5kZXJUYXJnZXQoXCJyZW5kZXJcIiwgW3RoaXMuY3JlYXRlQ29sb3JBdHRhY2htZW50KHJlc3gsIHJlc3kpXSk7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubk1pcHM7IGkrKykge1xuXHRcdFx0Y29uc3QgcmVuZGVyVGFyZ2V0SG9yaXpvbmFsID0gbmV3IFJlbmRlclRhcmdldChcInJlbmRlclwiLCBbdGhpcy5jcmVhdGVDb2xvckF0dGFjaG1lbnQocmVzeCwgcmVzeSldKTtcblx0XHRcdHRoaXMucmVuZGVyVGFyZ2V0c0hvcml6b250YWwucHVzaChyZW5kZXJUYXJnZXRIb3Jpem9uYWwpO1xuXHRcdFx0Y29uc3QgcmVuZGVyVGFyZ2V0VmVydGljYWwgPSBuZXcgUmVuZGVyVGFyZ2V0KFwicmVuZGVyXCIsIFt0aGlzLmNyZWF0ZUNvbG9yQXR0YWNobWVudChyZXN4LCByZXN5KV0pO1xuXHRcdFx0dGhpcy5yZW5kZXJUYXJnZXRzVmVydGljYWwucHVzaChyZW5kZXJUYXJnZXRWZXJ0aWNhbCk7XG5cdFx0XHRyZXN4ID0gTWF0aC5yb3VuZChyZXN4IC8gMik7XG5cdFx0XHRyZXN5ID0gTWF0aC5yb3VuZChyZXN5IC8gMik7XG5cdFx0fVxuXHRcdC8vIGx1bWlub3NpdHkgaGlnaCBwYXNzIG1hdGVyaWFsXG5cdFx0dGhpcy5oaWdoUGFzc1VuaWZvcm1CdWZmZXIgPSB7XG5cdFx0XHR1bmlmb3Jtczoge1xuXHRcdFx0XHRsdW1pbm9zaXR5VGhyZXNob2w6IHsgdHlwZTogXCJmbG9hdFwiLCB2YWx1ZTogdGhpcy50aHJlc2hvbGQgfSxcblx0XHRcdFx0c21vb3RoV2lkdGg6IHsgdHlwZTogXCJmbG9hdFwiLCB2YWx1ZTogMC4wMSB9LFxuXHRcdFx0XHRkZWZhdWx0Q29sb3I6IHsgdHlwZTogXCJjb2xvclwiLCB2YWx1ZTogbmV3IENvbG9yKDAuMCwgMCwgMCkgfSxcblx0XHRcdFx0ZGVmYXVsdE9wYWNpdHk6IHsgdHlwZTogXCJmbG9hdFwiLCB2YWx1ZTogMS4wIH1cblx0XHRcdH1cblx0XHR9O1xuXHRcdHRoaXMuaGlnaFBhc3NVbmlmb3JtVGV4dHVyZUFuZFNhbXBsZXIgPSB7XG5cdFx0XHR0RGlmZnVzZTogeyB0eXBlOiBcInRleHR1cmVcIiwgdmFsdWU6IG51bGwgfSxcblx0XHRcdHRTYW1wbGVyOiB7XG5cdFx0XHRcdHR5cGU6IFwic2FtcGxlclwiLFxuXHRcdFx0XHR2YWx1ZTogdGhpcy5kZWZhdWx0U2FtcGxlclxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29uc3Qgc2hhZGVyID0gZ2V0VmVydEZyYWcoXCJsdW1pbm9zaXR5SGlnaFwiLCB7IHBvc2l0aW9uTG9jYXRpb246IDAgfSk7XG5cdFx0dGhpcy5tYXRlcmlhbEhpZ2hQYXNzRmlsdGVyID0gbmV3IFNoYWRlck1hdGVyaWFsKHtcblx0XHRcdHNoYWRlcklkOiBcImJsb29tXCIsXG5cdFx0XHR1bmlmb3JtQnVmZmVyczogW3RoaXMuaGlnaFBhc3NVbmlmb3JtQnVmZmVyXSxcblx0XHRcdHVuaWZvcm1UZXh0dXJlQW5kU2FtcGxlcjogdGhpcy5oaWdoUGFzc1VuaWZvcm1UZXh0dXJlQW5kU2FtcGxlcixcblx0XHRcdHZlcnQ6IHNoYWRlci52ZXJ0LFxuXHRcdFx0ZnJhZzogc2hhZGVyLmZyYWdcblx0XHR9KTtcblx0XHQvLyBHYXVzc2lhbiBCbHVyIE1hdGVyaWFsc1xuXHRcdHRoaXMubWF0ZXJpYWxIaWdoUGFzc0ZpbHRlci5yZW5kZXJTdGF0ZSA9IHRoaXMucmVuZGVyU3RhdGU7XG5cdFx0dGhpcy5zZXBhcmFibGVCbHVyTWF0ZXJpYWxzID0gW107XG5cdFx0dGhpcy5zZXBhcmFibGVCbHVyWU1hdGVyaWFscyA9IFtdO1xuXHRcdGNvbnN0IGtlcm5lbFNpemVBcnJheSA9IFszLCA1LCA3LCA5LCAxMV07XG5cdFx0cmVzeCA9IE1hdGgucm91bmQodGhpcy53aWR0aCAvIDIpO1xuXHRcdHJlc3kgPSBNYXRoLnJvdW5kKHRoaXMuaGVpZ2h0IC8gMik7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubk1pcHM7IGkrKykge1xuXHRcdFx0dGhpcy5zZXBhcmFibGVCbHVyTWF0ZXJpYWxzLnB1c2godGhpcy5nZXRTZXBlcmFibGVCbHVyTWF0ZXJpYWwoa2VybmVsU2l6ZUFycmF5W2ldLCBcIkJsdXJNYXRlcmlhbFwiICsgaSkpO1xuXHRcdFx0dGhpcy5zZXBhcmFibGVCbHVyWU1hdGVyaWFscy5wdXNoKHRoaXMuZ2V0U2VwZXJhYmxlQmx1ck1hdGVyaWFsKGtlcm5lbFNpemVBcnJheVtpXSwgXCJCbHVyTWF0ZXJpYWxZXCIgKyBpKSk7XG5cdFx0XHRyZXN4ID0gTWF0aC5yb3VuZChyZXN4IC8gMik7XG5cblx0XHRcdHJlc3kgPSBNYXRoLnJvdW5kKHJlc3kgLyAyKTtcblx0XHR9XG5cdFx0Ly8gQ29tcG9zaXRlIG1hdGVyaWFsXG5cdFx0dGhpcy5jb21wb3NpdGVNYXRlcmlhbCA9IHRoaXMuZ2V0Q29tcG9zaXRlTWF0ZXJpYWwodGhpcy5uTWlwcywgXCJjb21wb3NpdGVNYXRlcmlhbFwiKTtcblx0XHR0aGlzLmNvbXBvc2l0ZU1hdGVyaWFsLnJlbmRlclN0YXRlID0gdGhpcy5yZW5kZXJTdGF0ZTtcblx0XHR0aGlzLmJsZW5kVW5pZm9ybVRleHR1cmVBbmRTYW1wbGVyID0ge1xuXHRcdFx0dERpZmZ1c2U6IHsgdHlwZTogXCJ0ZXh0dXJlXCIsIHZhbHVlOiB0aGlzLnJlbmRlclRhcmdldHNIb3Jpem9udGFsWzBdLmdldENvbG9yVGV4dHVyZSgpIH0sXG5cdFx0XHRiYXNlQ29sb3JUZXh0dXJlOiB7IHR5cGU6IFwidGV4dHVyZVwiLCB2YWx1ZTogbnVsbCB9LFxuXHRcdFx0dFNhbXBsZXI6IHtcblx0XHRcdFx0dHlwZTogXCJzYW1wbGVyXCIsXG5cdFx0XHRcdHZhbHVlOiB0aGlzLmRlZmF1bHRTYW1wbGVyXG5cdFx0XHR9XG5cdFx0fTtcblx0XHRjb25zdCBibGVuZFNoYWRlciA9IGdldFZlcnRGcmFnKFwiYmxlbmRcIiwgeyBwb3NpdGlvbkxvY2F0aW9uOiAwIH0pO1xuXHRcdHRoaXMuYmxlbmRNYXRlcmlhbCA9IG5ldyBTaGFkZXJNYXRlcmlhbCh7XG5cdFx0XHRzaGFkZXJJZDogXCJwb3N0QmxlbmRcIixcblx0XHRcdHVuaWZvcm1UZXh0dXJlQW5kU2FtcGxlcjogdGhpcy5ibGVuZFVuaWZvcm1UZXh0dXJlQW5kU2FtcGxlcixcblx0XHRcdHZlcnQ6IGJsZW5kU2hhZGVyLnZlcnQsXG5cdFx0XHRmcmFnOiBibGVuZFNoYWRlci5mcmFnXG5cdFx0fSk7XG5cdFx0dGhpcy5ibGVuZE1hdGVyaWFsLnJlbmRlclN0YXRlID0gdGhpcy5yZW5kZXJTdGF0ZTtcblx0XHR0aGlzLmJsZW5kVGFyZ2V0ID0gbmV3IFJlbmRlclRhcmdldChcInJlbmRlclwiLCBbdGhpcy5jcmVhdGVDb2xvckF0dGFjaG1lbnQodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpXSk7XG5cdH1cblx0cHJpdmF0ZSBjcmVhdGVDb2xvckF0dGFjaG1lbnQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBBdHRhY2htZW50IHtcblx0XHRjb25zdCBjb2xvclRleHR1cmUgPSBuZXcgVGV4dHVyZSh7XG5cdFx0XHRzaXplOiB7IHdpZHRoLCBoZWlnaHQsIGRlcHRoOiAxIH0sXG5cdFx0XHRmb3JtYXQ6IFRleHR1cmVGb3JtYXQuQkdSQThVbm9ybSxcblx0XHRcdHVzYWdlOiBUZXh0dXJlVXNhZ2UuUmVuZGVyQXR0YWNobWVudCB8IFRleHR1cmVVc2FnZS5UZXh0dXJlQmluZGluZ1xuXHRcdH0pO1xuXHRcdGNvbnN0IGNvbG9yQXR0YWNobWVudCA9IG5ldyBBdHRhY2htZW50KHsgcjogMC4wLCBnOiAwLjAsIGI6IDAuMCwgYTogMC4wIH0sIHsgdGV4dHVyZTogY29sb3JUZXh0dXJlIH0pO1xuXHRcdHJldHVybiBjb2xvckF0dGFjaG1lbnQ7XG5cdH1cblx0cHJpdmF0ZSBnZXRDb21wb3NpdGVNYXRlcmlhbChuTWlwczogbnVtYmVyLCB0eXBlKTogU2hhZGVyTWF0ZXJpYWwge1xuXHRcdHJldHVybiBuZXcgU2hhZGVyTWF0ZXJpYWwoe1xuXHRcdFx0c2hhZGVySWQ6IHR5cGUsXG5cdFx0XHR1bmlmb3JtVGV4dHVyZUFuZFNhbXBsZXI6IHtcblx0XHRcdFx0Ymx1clRleHR1cmUxOiB7IHR5cGU6IFwidGV4dHVyZVwiLCB2YWx1ZTogdGhpcy5yZW5kZXJUYXJnZXRzVmVydGljYWxbMF0uZ2V0Q29sb3JUZXh0dXJlKCkgfSxcblx0XHRcdFx0Ymx1clRleHR1cmUyOiB7IHR5cGU6IFwidGV4dHVyZVwiLCB2YWx1ZTogdGhpcy5yZW5kZXJUYXJnZXRzVmVydGljYWxbMV0uZ2V0Q29sb3JUZXh0dXJlKCkgfSxcblx0XHRcdFx0Ymx1clRleHR1cmUzOiB7IHR5cGU6IFwidGV4dHVyZVwiLCB2YWx1ZTogdGhpcy5yZW5kZXJUYXJnZXRzVmVydGljYWxbMl0uZ2V0Q29sb3JUZXh0dXJlKCkgfSxcblx0XHRcdFx0Ymx1clRleHR1cmU0OiB7IHR5cGU6IFwidGV4dHVyZVwiLCB2YWx1ZTogdGhpcy5yZW5kZXJUYXJnZXRzVmVydGljYWxbM10uZ2V0Q29sb3JUZXh0dXJlKCkgfSxcblx0XHRcdFx0Ymx1clRleHR1cmU1OiB7IHR5cGU6IFwidGV4dHVyZVwiLCB2YWx1ZTogdGhpcy5yZW5kZXJUYXJnZXRzVmVydGljYWxbNF0uZ2V0Q29sb3JUZXh0dXJlKCkgfSxcblx0XHRcdFx0dFNhbXBsZXI6IHtcblx0XHRcdFx0XHR0eXBlOiBcInNhbXBsZXJcIixcblx0XHRcdFx0XHR2YWx1ZTogdGhpcy5kZWZhdWx0U2FtcGxlclxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0dW5pZm9ybUJ1ZmZlcnM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHVpZDogdHlwZSxcblx0XHRcdFx0XHR1bmlmb3Jtczoge1xuXHRcdFx0XHRcdFx0Ymxvb21TdHJlbmd0aDogeyB0eXBlOiBcImYzMlwiLCB2YWx1ZTogdGhpcy5zdHJlbmd0aCB9LFxuXHRcdFx0XHRcdFx0Ymxvb21SYWRpdXM6IHsgdHlwZTogXCJmMzJcIiwgdmFsdWU6IHRoaXMucmFkaXVzIH0sXG5cdFx0XHRcdFx0XHRibG9vbUZhY3RvcnM6IHsgdHlwZTogXCJhcnJheTxmMzI+XCIsIHZhbHVlOiBbMS4wLCAwLjgsIDAuNiwgMC40LCAwLjJdIH0sXG5cdFx0XHRcdFx0XHRibG9vbVRpbnRDb2xvcnM6IHtcblx0XHRcdFx0XHRcdFx0dHlwZTogXCJhcnJheTxmMzI+XCIsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdFx0XHRcdFx0bmV3IFZlY3RvcjMoMSwgMSwgMSksXG5cdFx0XHRcdFx0XHRcdFx0bmV3IFZlY3RvcjMoMSwgMSwgMSksXG5cdFx0XHRcdFx0XHRcdFx0bmV3IFZlY3RvcjMoMSwgMSwgMSksXG5cdFx0XHRcdFx0XHRcdFx0bmV3IFZlY3RvcjMoMSwgMSwgMSksXG5cdFx0XHRcdFx0XHRcdFx0bmV3IFZlY3RvcjMoMSwgMSwgMSlcblx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XSxcblxuXHRcdFx0dmVydDogKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYFxuICAgICAgICAgICAgICBzdHJ1Y3QgVmVydGV4SW5wdXQge1xuICAgICAgICAgICAgICAgICAgICBAbG9jYXRpb24oMCkgcG9zaXRpb246IHZlYzI8ZjMyPiwgICAgICAgXG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICBzdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgICAgICAgICAgICAgICAgICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uOiB2ZWM0PGYzMj4sXG4gICAgICAgICAgICAgICAgICAgIEBsb2NhdGlvbigwKSB1djogdmVjMjxmMzI+LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICBAdmVydGV4XG4gICAgICAgICAgICAgICBmbiBtYWluKGlucHV0OiBWZXJ0ZXhJbnB1dCkgLT4gVmVydGV4T3V0cHV0IHtcbiAgICAgICAgICAgICAgICB2YXIgb3V0cHV0OlZlcnRleE91dHB1dDtcbiAgICAgICAgICAgICAgICBvdXRwdXQudXYgPSBpbnB1dC5wb3NpdGlvbiAqIDAuNSArIDAuNTtcbiAgICAgICAgICAgICAgICBvdXRwdXQucG9zaXRpb24gPSB2ZWM0PGYzMj4oaW5wdXQucG9zaXRpb24sIDAuMCwgMS4wKTs7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBgO1xuXHRcdFx0fSxcblxuXHRcdFx0ZnJhZzogKGRlZmluZXMpID0+IHtcblx0XHRcdFx0cmV0dXJuIGBcbiAgICAgICAgICAgICAgICBzdHJ1Y3QgRnJhZ0lucHV0IHtcbiAgICAgICAgICAgICAgICAgICAgQGxvY2F0aW9uKDApIHV2OiB2ZWMyPGYzMj4sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBzdHJ1Y3QgQmxvb21Vbmlmb3Jtc3tcbiAgICAgICAgICAgICAgICAgICAgYmxvb21TdHJlbmd0aDpmMzIsXG4gICAgICAgICAgICAgICAgICAgIGJsb29tUmFkaXVzOmYzMixcbiAgICAgICAgICAgICAgICAgICAgYmxvb21GYWN0b3JzIDogYXJyYXk8ZjMyLDU+LFxuICAgICAgICAgICAgICAgICAgICBibG9vbVRpbnRDb2xvcnMgOiBhcnJheTx2ZWMzPGYzMj4sNT5cbiAgICAgICAgICAgICAgICB9ICBcbiAgICAgICAgICAgICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoMCkgIHZhcjxzdG9yYWdlLCByZWFkPiBibG9vbVVuaWZvcm1zIDogQmxvb21Vbmlmb3JtcztcblxuICAgICAgICAgICAgICAgIEBncm91cCgwKSBAYmluZGluZyhibHVyVGV4dHVyZTFCaW5kaW5nKSB2YXIgYmx1clRleHR1cmUxOiB0ZXh0dXJlXzJkPGYzMj47XG4gICAgICAgICAgICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKGJsdXJUZXh0dXJlMkJpbmRpbmcpIHZhciBibHVyVGV4dHVyZTI6IHRleHR1cmVfMmQ8ZjMyPjtcbiAgICAgICAgICAgICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoYmx1clRleHR1cmUzQmluZGluZykgdmFyIGJsdXJUZXh0dXJlMzogdGV4dHVyZV8yZDxmMzI+O1xuICAgICAgICAgICAgICAgIEBncm91cCgwKSBAYmluZGluZyhibHVyVGV4dHVyZTRCaW5kaW5nKSB2YXIgYmx1clRleHR1cmU0OiB0ZXh0dXJlXzJkPGYzMj47XG4gICAgICAgICAgICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKGJsdXJUZXh0dXJlNUJpbmRpbmcpIHZhciBibHVyVGV4dHVyZTU6IHRleHR1cmVfMmQ8ZjMyPjtcbiAgICAgICAgICAgICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcodFNhbXBsZXJCaW5kaW5nKSB2YXIgdFNhbXBsZXI6IHNhbXBsZXI7XG5cblx0XHRcdFx0Zm4gbGVycEJsb29tRmFjdG9yKGZhY3RvcjpmMzIpLT5mMzIge1xuXHRcdFx0XHRcdGxldCBtaXJyb3JGYWN0b3I6ZjMyID0gMS4yIC0gZmFjdG9yO1xuXHRcdFx0XHRcdHJldHVybiBtaXgoZmFjdG9yLCBtaXJyb3JGYWN0b3IsIGJsb29tVW5pZm9ybXMuYmxvb21SYWRpdXMpO1xuXHRcdFx0XHR9XG4gICAgICAgICAgICAgICAgQGZyYWdtZW50XG5cdFx0XHRcdGZuIG1haW4oaW5wdXQ6RnJhZ0lucHV0KS0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4gIHtcblx0XHRcdFx0XHRyZXR1cm4gYmxvb21Vbmlmb3Jtcy5ibG9vbVN0cmVuZ3RoICogKCBsZXJwQmxvb21GYWN0b3IoYmxvb21Vbmlmb3Jtcy5ibG9vbUZhY3RvcnNbMF0pICogdmVjNChibG9vbVVuaWZvcm1zLmJsb29tVGludENvbG9yc1swXSwgMS4wKSAqIHRleHR1cmVTYW1wbGUoYmx1clRleHR1cmUxLCB0U2FtcGxlciwgaW5wdXQudXYpICtcblx0XHRcdFx0XHRcdGxlcnBCbG9vbUZhY3RvcihibG9vbVVuaWZvcm1zLmJsb29tRmFjdG9yc1sxXSkgKiB2ZWM0PGYzMj4oYmxvb21Vbmlmb3Jtcy5ibG9vbVRpbnRDb2xvcnNbMV0sIDEuMCkgKiB0ZXh0dXJlU2FtcGxlKGJsdXJUZXh0dXJlMiwgdFNhbXBsZXIsIGlucHV0LnV2KSArXG5cdFx0XHRcdFx0XHRsZXJwQmxvb21GYWN0b3IoYmxvb21Vbmlmb3Jtcy5ibG9vbUZhY3RvcnNbMl0pICogdmVjNDxmMzI+KGJsb29tVW5pZm9ybXMuYmxvb21UaW50Q29sb3JzWzJdLCAxLjApICogdGV4dHVyZVNhbXBsZShibHVyVGV4dHVyZTMsIHRTYW1wbGVyLCBpbnB1dC51dikgK1xuXHRcdFx0XHRcdFx0bGVycEJsb29tRmFjdG9yKGJsb29tVW5pZm9ybXMuYmxvb21GYWN0b3JzWzNdKSAqIHZlYzQ8ZjMyPihibG9vbVVuaWZvcm1zLmJsb29tVGludENvbG9yc1szXSwgMS4wKSAqIHRleHR1cmVTYW1wbGUoYmx1clRleHR1cmU0LCB0U2FtcGxlciwgaW5wdXQudXYpICtcblx0XHRcdFx0XHRcdGxlcnBCbG9vbUZhY3RvcihibG9vbVVuaWZvcm1zLmJsb29tRmFjdG9yc1s0XSkgKiB2ZWM0PGYzMj4oYmxvb21Vbmlmb3Jtcy5ibG9vbVRpbnRDb2xvcnNbNF0sIDEuMCkgKiB0ZXh0dXJlU2FtcGxlKGJsdXJUZXh0dXJlNSwgdFNhbXBsZXIsIGlucHV0LnV2KSApO1xuXHRcdFx0XHR9YDtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRwcml2YXRlIGdldFNlcGVyYWJsZUJsdXJNYXRlcmlhbChrZXJuZWxSYWRpdXMsIHR5cGUpIHtcblx0XHRjb25zdCBzaGFkZXIgPSBnZXRWZXJ0RnJhZyhcImJsdXJcIiwge1xuXHRcdFx0a2VybmVsUmFkaXVzOiBrZXJuZWxSYWRpdXMsXG5cdFx0XHRzaWdtYUNvbnN0OiBrZXJuZWxSYWRpdXMsXG5cdFx0XHRwb3NpdGlvbkxvY2F0aW9uOiAwXG5cdFx0fSk7XG5cdFx0Y29uc3QgbWF0ID0gbmV3IFNoYWRlck1hdGVyaWFsKHtcblx0XHRcdHNoYWRlcklkOiB0eXBlLFxuXHRcdFx0dW5pZm9ybUJ1ZmZlcnM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHVpZDogdHlwZSxcblx0XHRcdFx0XHR1bmlmb3Jtczoge1xuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiB7IHR5cGU6IFwidmVjMjxmMzI+XCIsIHZhbHVlOiBuZXcgVmVjdG9yMigwLjAsIDAuMCkgfVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XSxcblx0XHRcdHVuaWZvcm1UZXh0dXJlQW5kU2FtcGxlcjoge1xuXHRcdFx0XHR0RGlmZnVzZTogeyB0eXBlOiBcInRleHR1cmVcIiwgdmFsdWU6IG51bGwgfSxcblx0XHRcdFx0dFNhbXBsZXI6IHtcblx0XHRcdFx0XHR0eXBlOiBcInNhbXBsZXJcIixcblx0XHRcdFx0XHR2YWx1ZTogdGhpcy5kZWZhdWx0U2FtcGxlclxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0dmVydDogc2hhZGVyLnZlcnQsXG5cdFx0XHRmcmFnOiBzaGFkZXIuZnJhZ1xuXHRcdH0pO1xuXHRcdG1hdC5yZW5kZXJTdGF0ZSA9IHRoaXMucmVuZGVyU3RhdGU7XG5cdFx0cmV0dXJuIG1hdDtcblx0fVxufVxuXG50eXBlIEJsb29tUG9zdEVmZmVjdFByb3BzID0ge1xuXHR3aWR0aDogbnVtYmVyO1xuXHRoZWlnaHQ6IG51bWJlcjtcblx0c3RyZW5ndGg6IG51bWJlcjtcblx0cmFkaXVzOiBudW1iZXI7XG5cdHRocmVzaG9sZDogbnVtYmVyO1xufTtcbiIsImltcG9ydCBNYXRyaXg0IGZyb20gXCIuLi9tYXRoL01hdHJpeDRcIjtcclxuaW1wb3J0IENhbWVyYSBmcm9tIFwiLi9DYW1lcmFcIjtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT3J0aG9ncmFwaGljQ2FtZXJhIGV4dGVuZHMgQ2FtZXJhIHtcclxuXHRyaWdodDogbnVtYmVyO1xyXG5cdGlzT3J0aG9ncmFwaGljQ2FtZXJhOiBib29sZWFuO1xyXG5cdGJvdHRvbTogbnVtYmVyO1xyXG5cdGxlZnQ6IG51bWJlcjtcclxuXHRuZWFyOiBudW1iZXI7XHJcblx0ZmFyOiBudW1iZXI7XHJcblx0dG9wOiBudW1iZXI7XHJcblx0Y29uc3RydWN0b3IobGVmdCA9IC0xLCByaWdodCA9IDEsIHRvcCA9IDEsIGJvdHRvbSA9IC0xLCBuZWFyID0gMC4xLCBmYXIgPSAyMDAwKSB7XHJcblx0XHRzdXBlcigpO1xyXG5cdFx0dGhpcy5uZWFyID0gbmVhcjtcclxuXHRcdHRoaXMuZmFyID0gZmFyO1xyXG5cdFx0dGhpcy5sZWZ0ID0gbGVmdDtcclxuXHRcdHRoaXMudG9wID0gdG9wO1xyXG5cdFx0dGhpcy5ib3R0b20gPSBib3R0b207XHJcblx0XHR0aGlzLnJpZ2h0ID0gcmlnaHQ7XHJcblx0XHR0aGlzLmlzT3J0aG9ncmFwaGljQ2FtZXJhID0gdHJ1ZTtcclxuXHR9XHJcblx0cHJpdmF0ZSB1cGRhdGVDYW1lcmFQYXJtcygpIHtcclxuXHRcdGNvbnN0IGR4ID0gKHRoaXMucmlnaHQgLSB0aGlzLmxlZnQpIC8gMjtcclxuXHRcdGNvbnN0IGR5ID0gKHRoaXMudG9wIC0gdGhpcy5ib3R0b20pIC8gMjtcclxuXHRcdGNvbnN0IGN4ID0gKHRoaXMucmlnaHQgKyB0aGlzLmxlZnQpIC8gMjtcclxuXHRcdGNvbnN0IGN5ID0gKHRoaXMudG9wICsgdGhpcy5ib3R0b20pIC8gMjtcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdGxlZnQ6IGN4IC0gZHgsXHJcblx0XHRcdHJpZ2h0OiBjeCArIGR4LFxyXG5cdFx0XHR0b3A6IGN5ICsgZHksXHJcblx0XHRcdGJvdHRvbTogY3kgLSBkeVxyXG5cdFx0fTtcclxuXHR9XHJcblx0cHVibGljIHVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSB7XHJcblx0XHRpZiAodGhpcy5wcm9qZWN0TWF0cml4RGlydHkpIHtcclxuXHRcdFx0Y29uc3QgeyBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20gfSA9IHRoaXMudXBkYXRlQ2FtZXJhUGFybXMoKTtcclxuXHRcdFx0dGhpcy5fcHJvamVjdGlvbk1hdHJpeCA9IE1hdHJpeDQubWFrZU9ydGhvZ3JhcGhpYyhsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHRoaXMubmVhciwgdGhpcy5mYXIpO1xyXG5cdFx0XHR0aGlzLnByb2plY3RNYXRyaXhEaXJ0eSA9IGZhbHNlO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iLCJpbXBvcnQgUGVyc3BlY3RpdmVDYW1lcmEgZnJvbSBcIi4uLy4uL2NhbWVyYS9QZXJzcGVjdGl2ZUNhbWVyYVwiO1xuaW1wb3J0IFZlY3RvcjIgZnJvbSBcIi4uLy4uL21hdGgvVmVjdG9yMlwiO1xuaW1wb3J0IHsgU3BvdExpZ2h0IH0gZnJvbSBcIi4uL1Nwb3RMaWdodFwiO1xuaW1wb3J0IHsgQmFzZVNoYWRvdyB9IGZyb20gXCIuL0Jhc2VTaGFkb3dcIjtcblxuZXhwb3J0IGNsYXNzIFNwb3RMaWdodFNoYWRvdyBleHRlbmRzIEJhc2VTaGFkb3cge1xuXHRwdWJsaWMgdHlwZTogc3RyaW5nO1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRjb25zdCBjYW1lcmEgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoNjAsIDEsIDAuMSwgNTAwKTtcblx0XHRzdXBlcihuZXcgVmVjdG9yMigxMDI0LCAxMDI0KSwgY2FtZXJhKTtcblx0XHR0aGlzLnR5cGUgPSBcInNwb3RMaWdodFNoYWRvd1wiO1xuXHR9XG5cblx0cHVibGljIHVwZGF0ZShsaWdodDogU3BvdExpZ2h0KSB7XG5cdFx0dGhpcy51cGRhdGVNYXRyaWNlcyhsaWdodCk7XG5cdH1cblxuXHR1cGRhdGVNYXRyaWNlcyhsaWdodDogU3BvdExpZ2h0KSB7XG5cdFx0dGhpcy5jYW1lcmEucG9zaXRpb24uY29weShsaWdodC5wb3NpdGlvbik7XG5cdFx0Y29uc3QgeyB4LCB5LCB6IH0gPSBsaWdodC50YXJnZXQ7XG5cdFx0dGhpcy5jYW1lcmEubG9va0F0KHgsIHksIHopO1xuXHRcdHRoaXMuY2FtZXJhLnVwZGF0ZU1hdHJpeCgpO1xuXHRcdHRoaXMudnBNYXRyaXhEaXJ0eSA9IHRydWU7XG5cdH1cbn1cbiIsImltcG9ydCB7IExpZ2h0VHlwZSB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVVR5cGVzXCI7XHJcbmltcG9ydCBWZWN0b3IzIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjNcIjtcclxuaW1wb3J0IHsgTGlnaHQgfSBmcm9tIFwiLi9MaWdodFwiO1xyXG5pbXBvcnQgeyBTcG90TGlnaHRTaGFkb3cgfSBmcm9tIFwiLi9zaGFkb3dzL1Nwb3RMaWdodFNoYWRvd1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNwb3RMaWdodCBleHRlbmRzIExpZ2h0IHtcclxuXHRwcml2YXRlIF9kaXN0YW5jZTogbnVtYmVyO1xyXG5cdHByaXZhdGUgX2FuZ2xlOiBudW1iZXI7XHJcblx0cHJpdmF0ZSBfcGVudW1icmE6IG51bWJlcjtcclxuXHRwcml2YXRlIF9kZWNheTogbnVtYmVyO1xyXG5cdGRlY2F5RGlydHk6IGJvb2xlYW47XHJcblx0ZGlzdGFuY2VEaXJ0eTogYm9vbGVhbjtcclxuXHRwcml2YXRlIF9jb25lQ29zOiBudW1iZXI7XHJcblx0cHJpdmF0ZSBfcGVudW1icmFDb3M6IG51bWJlcjtcclxuXHRjb25lQ29zRGlydHk6IGJvb2xlYW47XHJcblx0cGVudW1icmFEaXJ0eTogYm9vbGVhbjtcclxuXHRhbmdsZURpcnR5OiBib29sZWFuO1xyXG5cdHBlbnVtYnJhQ29zRGlydHk6IGJvb2xlYW47XHJcblx0Y29uc3RydWN0b3IoY29sb3IsIGludGVuc2l0eSwgZGlzdGFuY2UgPSAwLCBhbmdsZSA9IDYwLCBwZW51bWJyYSA9IDYwLCBkZWNheSA9IDQsIG9wZW5TaGFkb3cgPSB0cnVlKSB7XHJcblx0XHRzdXBlcihjb2xvciwgaW50ZW5zaXR5KTtcclxuXHRcdHRoaXMuX2Rpc3RhbmNlID0gZGlzdGFuY2U7XHJcblx0XHR0aGlzLl9hbmdsZSA9IChhbmdsZSAvIDE4MCkgKiBNYXRoLlBJO1xyXG5cdFx0dGhpcy5fcGVudW1icmEgPSAocGVudW1icmEgLyAxODApICogTWF0aC5QSTtcclxuXHRcdHRoaXMuX2RlY2F5ID0gZGVjYXk7XHJcblx0XHR0aGlzLmxpZ2h0VHlwZSA9IExpZ2h0VHlwZS5TcG90TGlnaHQ7XHJcblx0XHR0aGlzLmFuZ2xlRGlydHkgPSB0cnVlO1xyXG5cdFx0dGhpcy5wZW51bWJyYURpcnR5ID0gdHJ1ZTtcclxuXHRcdHRoaXMuZGlzdGFuY2VEaXJ0eSA9IHRydWU7XHJcblx0XHR0aGlzLmRlY2F5RGlydHkgPSB0cnVlO1xyXG5cdFx0dGhpcy5jb25lQ29zRGlydHkgPSB0cnVlO1xyXG5cdFx0dGhpcy5wZW51bWJyYUNvc0RpcnR5ID0gdHJ1ZTtcclxuXHRcdGlmIChvcGVuU2hhZG93KSB0aGlzLnNoYWRvdyA9IG5ldyBTcG90TGlnaHRTaGFkb3coKTtcclxuXHRcdHRoaXMudXBkYXRlQ29uZUNvc09yUGVudW1icmFDb3MoKTtcclxuXHR9XHJcblxyXG5cdGdldCBkaXJ0ZWN0RGlydHkoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5wb3NpdGlvbkRpcnR5IHx8IHRoaXMudGFyZ2V0RGlydHk7XHJcblx0fVxyXG5cclxuXHRzZXQgZGlydGVjdERpcnR5KHZhbHVlKSB7XHJcblx0XHR0aGlzLnBvc2l0aW9uRGlydHkgPSB2YWx1ZTtcclxuXHRcdHRoaXMudGFyZ2V0RGlydHkgPSB2YWx1ZTtcclxuXHR9XHJcblxyXG5cdGdldCBkaXJlY3Rpb25hbCgpIHtcclxuXHRcdGNvbnN0IHJlc3VsdCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRWZWN0b3IzLnN1YnRyYWN0KHRoaXMucG9zaXRpb24sIHRoaXMudGFyZ2V0LCByZXN1bHQpO1xyXG5cdFx0cmV0dXJuIFZlY3RvcjMubm9ybWFsaXplKHJlc3VsdCwgbmV3IFZlY3RvcjMoKSk7XHJcblx0fVxyXG5cdGdldCBhbmdsZSgpIHtcclxuXHRcdHJldHVybiB0aGlzLl9hbmdsZTtcclxuXHR9XHJcblx0c2V0IGFuZ2xlKHZhbHVlKSB7XHJcblx0XHR0aGlzLmFuZ2xlRGlydHkgPSB0cnVlO1xyXG5cdFx0dGhpcy5fYW5nbGUgPSAodmFsdWUgLyAxODApICogTWF0aC5QSTtcclxuXHRcdHRoaXMudXBkYXRlQ29uZUNvc09yUGVudW1icmFDb3MoKTtcclxuXHR9XHJcblx0Z2V0IHBlbnVtYnJhKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3BlbnVtYnJhO1xyXG5cdH1cclxuXHRzZXQgcGVudW1icmEodmFsdWUpIHtcclxuXHRcdHRoaXMucGVudW1icmFEaXJ0eSA9IHRydWU7XHJcblx0XHR0aGlzLl9wZW51bWJyYSA9ICh2YWx1ZSAvIDE4MCkgKiBNYXRoLlBJO1xyXG5cdFx0dGhpcy51cGRhdGVDb25lQ29zT3JQZW51bWJyYUNvcygpO1xyXG5cdH1cclxuXHRzZXQgZGlzdGFuY2UodmFsdWUpIHtcclxuXHRcdHRoaXMuZGlzdGFuY2VEaXJ0eSA9IHRydWU7XHJcblx0XHR0aGlzLl9kaXN0YW5jZSA9IHZhbHVlO1xyXG5cdH1cclxuXHRnZXQgZGlzdGFuY2UoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fZGlzdGFuY2U7XHJcblx0fVxyXG5cdHNldCBkZWNheSh2YWx1ZSkge1xyXG5cdFx0dGhpcy5kZWNheURpcnR5ID0gdHJ1ZTtcclxuXHRcdHRoaXMuX2RlY2F5ID0gdmFsdWU7XHJcblx0fVxyXG5cdGdldCBkZWNheSgpIHtcclxuXHRcdHJldHVybiB0aGlzLl9kZWNheTtcclxuXHR9XHJcblx0c2V0IGNvbmVDb3ModmFsdWUpIHtcclxuXHRcdHRoaXMuY29uZUNvc0RpcnR5ID0gdHJ1ZTtcclxuXHRcdHRoaXMuX2NvbmVDb3MgPSB2YWx1ZTtcclxuXHR9XHJcblx0Z2V0IGNvbmVDb3MoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fY29uZUNvcztcclxuXHR9XHJcblx0c2V0IHBlbnVtYnJhQ29zKHZhbHVlKSB7XHJcblx0XHR0aGlzLnBlbnVtYnJhQ29zRGlydHkgPSB0cnVlO1xyXG5cdFx0dGhpcy5fcGVudW1icmFDb3MgPSB2YWx1ZTtcclxuXHR9XHJcblx0Z2V0IHBlbnVtYnJhQ29zKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3BlbnVtYnJhQ29zO1xyXG5cdH1cclxuXHRwcml2YXRlIHVwZGF0ZUNvbmVDb3NPclBlbnVtYnJhQ29zKCkge1xyXG5cdFx0dGhpcy5fY29uZUNvcyA9IE1hdGguY29zKHRoaXMuYW5nbGUpO1xyXG5cdFx0dGhpcy5fcGVudW1icmFDb3MgPSBNYXRoLmNvcyh0aGlzLmFuZ2xlICsgdGhpcy5wZW51bWJyYSk7XHJcblx0fVxyXG59XHJcbi8vIHVuaWZvcm1cclxuLy8gY29sb3I6IHt9LFxyXG4vLyBwb3NpdGlvbjoge30sXHJcbi8vIGRpcmVjdGlvbjoge30sXHJcbi8vIGRpc3RhbmNlOiB7fSxcclxuLy8gY29uZUNvczoge30sXHJcbi8vIHBlbnVtYnJhQ29zOiB7fSxcclxuLy8gZGVjYXk6IHt9XHJcbiIsImltcG9ydCBPcnRob2dyYXBoaWNDYW1lcmEgZnJvbSBcIi4uLy4uL2NhbWVyYS9PcnRob2dyYXBoaWNDYW1lcmFcIjtcbmltcG9ydCBWZWN0b3IyIGZyb20gXCIuLi8uLi9tYXRoL1ZlY3RvcjJcIjtcbmltcG9ydCB7IERpcmVjdGlvbmFsTGlnaHQgfSBmcm9tIFwiLi4vRGlyZWN0aW9uYWxMaWdodFwiO1xuaW1wb3J0IHsgQmFzZVNoYWRvdyB9IGZyb20gXCIuL0Jhc2VTaGFkb3dcIjtcblxuZXhwb3J0IGNsYXNzIERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZXh0ZW5kcyBCYXNlU2hhZG93IHtcblx0cHVibGljIHR5cGU6IHN0cmluZztcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0Y29uc3QgY2FtZXJhID0gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSgtNTAsIDUwLCA1MCwgLTUwLCAwLCAxMDApO1xuXHRcdHN1cGVyKG5ldyBWZWN0b3IyKDEwMjQsIDEwMjQpLCBjYW1lcmEpO1xuXHRcdHRoaXMudHlwZSA9IFwiZGlyZWN0aW9uYWxMaWdodFNoYWRvd1wiO1xuXHR9XG5cblx0cHVibGljIHVwZGF0ZShsaWdodDogRGlyZWN0aW9uYWxMaWdodCkge1xuXHRcdHRoaXMudXBkYXRlTWF0cmljZXMobGlnaHQpO1xuXHR9XG5cblx0dXBkYXRlTWF0cmljZXMobGlnaHQ6IERpcmVjdGlvbmFsTGlnaHQpIHtcblx0XHR0aGlzLmNhbWVyYS5wb3NpdGlvbi5jb3B5KGxpZ2h0LnBvc2l0aW9uKTtcblx0XHRjb25zdCB7IHgsIHksIHogfSA9IGxpZ2h0LnRhcmdldDtcblx0XHR0aGlzLmNhbWVyYS5sb29rQXQoeCwgeSwgeik7XG5cdFx0dGhpcy5jYW1lcmEudXBkYXRlTWF0cml4KCk7XG5cdFx0dGhpcy52cE1hdHJpeERpcnR5ID0gdHJ1ZTtcblx0fVxufVxuIiwiaW1wb3J0IHsgTGlnaHRUeXBlIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVVHlwZXNcIjtcbmltcG9ydCBWZWN0b3IzIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjNcIjtcbmltcG9ydCB7IExpZ2h0IH0gZnJvbSBcIi4vTGlnaHRcIjtcbmltcG9ydCB7IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgfSBmcm9tIFwiLi9zaGFkb3dzL0RpcmVjdGlvbmFsTGlnaHRTaGFkb3dcIjtcblxuZXhwb3J0IGNsYXNzIERpcmVjdGlvbmFsTGlnaHQgZXh0ZW5kcyBMaWdodCB7XG5cdGNvbnN0cnVjdG9yKGNvbG9yOiBWZWN0b3IzLCBpbnRlbnNpdHk6IG51bWJlciwgb3BlblNoYWRvdyA9IHRydWUpIHtcblx0XHRzdXBlcihjb2xvciwgaW50ZW5zaXR5KTtcblx0XHR0aGlzLmxpZ2h0VHlwZSA9IExpZ2h0VHlwZS5EaXJlY3Rpb25hbExpZ2h0O1xuXHRcdGlmIChvcGVuU2hhZG93KSB0aGlzLnNoYWRvdyA9IG5ldyBEaXJlY3Rpb25hbExpZ2h0U2hhZG93KCk7XG5cdH1cblxuXHRnZXQgZGlydGVjdERpcnR5KCkge1xuXHRcdHJldHVybiB0aGlzLnBvc2l0aW9uRGlydHkgfHwgdGhpcy50YXJnZXREaXJ0eTtcblx0fVxuXG5cdHNldCBkaXJ0ZWN0RGlydHkodmFsdWUpIHtcblx0XHR0aGlzLnBvc2l0aW9uRGlydHkgPSB2YWx1ZTtcblx0XHR0aGlzLnRhcmdldERpcnR5ID0gdmFsdWU7XG5cdH1cblxuXHRnZXQgZGlyZWN0aW9uYWwoKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRWZWN0b3IzLnN1YnRyYWN0KHRoaXMudGFyZ2V0LCB0aGlzLnBvc2l0aW9uLCByZXN1bHQpO1xuXHRcdHJldHVybiByZXN1bHQubm9ybWFsaXplKCk7XG5cdH1cbn1cbi8vIHVuaWZvcm1cbi8vIGRpcmVjdGlvbjoge30sXG4vLyBjb2xvcjoge31cbiIsImltcG9ydCBDYW1lcmEgZnJvbSBcIi4uL2NhbWVyYS9DYW1lcmFcIjtcclxuaW1wb3J0IHsgRnJhbWVTdGF0ZSB9IGZyb20gXCIuLi9jb3JlL0ZyYW1lU3RhdGVcIjtcclxuaW1wb3J0IFJlbmRlck9iamVjdCBmcm9tIFwiLi4vY29yZS9SZW5kZXJPYmplY3RcIjtcclxuaW1wb3J0IHsgUmVuZGVyT2JqZWN0VHlwZSB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVVR5cGVzXCI7XHJcbmltcG9ydCBjcmVhdGVHdWlkIGZyb20gXCIuLi91dGlscy9jcmVhdGVHdWlkXCI7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tIFwiLi9NZXNoXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOb2RlIGV4dGVuZHMgUmVuZGVyT2JqZWN0IHtcclxuXHR1aWQ6IHN0cmluZztcclxuXHRjaGlsZHJlbjogTWFwPHN0cmluZywgTm9kZSB8IE1lc2g+O1xyXG5cdG5hbWU6IHN0cmluZztcclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHRcdHN1cGVyKCk7XHJcblx0XHR0aGlzLnR5cGUgPSBSZW5kZXJPYmplY3RUeXBlLk5vZGU7XHJcblx0XHR0aGlzLmNoaWxkcmVuID0gbmV3IE1hcCgpO1xyXG5cdFx0dGhpcy5wYXJlbnQgPSBudWxsO1xyXG5cdFx0dGhpcy51aWQgPSBjcmVhdGVHdWlkKCk7XHJcblx0fVxyXG5cdGFkZChub2RlOiBOb2RlIHwgTWVzaCkge1xyXG5cdFx0bm9kZS5wYXJlbnQgPSB0aGlzO1xyXG5cdFx0dGhpcy5jaGlsZHJlbi5zZXQobm9kZS51aWQsIG5vZGUpO1xyXG5cdH1cclxuXHRyZW1vdmUobm9kZTogTm9kZSB8IE1lc2gpIHtcclxuXHRcdHRoaXMuY2hpbGRyZW4uZGVsZXRlKG5vZGUudWlkKTtcclxuXHR9XHJcblx0dXBkYXRlKGZyYW1lU3RhdGU6IEZyYW1lU3RhdGUsIGNhbWVyYT86IENhbWVyYSkge1xyXG5cdFx0dGhpcy51cGRhdGVNYXRyaXgodGhpcz8ucGFyZW50Py5tb2RlbE1hdHJpeD8uY2xvbmUoKSk7XHJcblx0XHR0aGlzPy5jaGlsZHJlbj8uZm9yRWFjaD8uKChub2RlKSA9PiB7XHJcblx0XHRcdG5vZGUudXBkYXRlKGZyYW1lU3RhdGUsIGNhbWVyYSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblx0ZGVzdHJveSgpIHtcclxuXHRcdHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgobm9kZSkgPT4ge1xyXG5cdFx0XHRub2RlLmRlc3Ryb3koKTtcclxuXHRcdH0pO1xyXG5cdFx0dGhpcz8uY2hpbGRyZW4/LmNsZWFyKCk7XHJcblx0fVxyXG5cdHRyYXZlcnNlKHRyYXZlcnNlRnVuY3Rpb246IEZ1bmN0aW9uLCBwYXJhbTogeyBbcHJvcDogc3RyaW5nXTogYW55IH0pOiB2b2lkIHtcclxuXHRcdGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmNoaWxkcmVuLnNpemU7IGkgPCBsZW47IGkrKykge1xyXG5cdFx0XHR0aGlzLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcblx0XHRcdFx0Y2hpbGQudHJhdmVyc2UodHJhdmVyc2VGdW5jdGlvbiwgcGFyYW0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IENhbWVyYSBmcm9tIFwiLi4vY2FtZXJhL0NhbWVyYVwiO1xyXG5pbXBvcnQgeyBGcmFtZVN0YXRlIH0gZnJvbSBcIi4uL2NvcmUvRnJhbWVTdGF0ZVwiO1xyXG5pbXBvcnQgeyBCdWZmZXJCaW5kaW5nVHlwZSwgQnVmZmVyVXNhZ2UgfSBmcm9tIFwiLi4vY29yZS9XZWJHUFVDb25zdGFudFwiO1xyXG5pbXBvcnQgeyBSZW5kZXJPYmplY3RUeXBlLCBVbmlmb3JtRW51bSB9IGZyb20gXCIuLi9jb3JlL1dlYkdQVVR5cGVzXCI7XHJcbmltcG9ydCBHZW9tZXRyeSBmcm9tIFwiLi4vZ2VvbWV0cnkvR2VvbWV0cnlcIjtcclxuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tIFwiLi4vbWF0ZXJpYWwvTWF0ZXJpYWxcIjtcclxuaW1wb3J0IE1hdHJpeDQgZnJvbSBcIi4uL21hdGgvTWF0cml4NFwiO1xyXG5pbXBvcnQgVW5pZm9ybUJ1ZmZlciBmcm9tIFwiLi4vcmVuZGVyL1VuaWZvcm1CdWZmZXJcIjtcclxuaW1wb3J0IHsgTWVzaCB9IGZyb20gXCIuL01lc2hcIjtcclxuaW1wb3J0IE5vZGUgZnJvbSBcIi4vTm9kZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNLaW5NZXNoIGV4dGVuZHMgTWVzaCB7XHJcblx0aW52ZXJzZUJpbmRNYXRyaWNlczogQXJyYXk8TWF0cml4ND47XHJcblx0dW5pZm9ybU1hdHJpeHM6IEFycmF5PE1hdHJpeDQ+O1xyXG5cdGpvaW50czogQXJyYXk8Tm9kZT47XHJcblx0cHJpdmF0ZSBoYXNBZGRKb2ludHM6IGJvb2xlYW47XHJcblx0Y29uc3RydWN0b3IoZ2VvbWV0cnk/OiBHZW9tZXRyeSwgbWF0ZXJpYWw/OiBNYXRlcmlhbCkge1xyXG5cdFx0c3VwZXIoZ2VvbWV0cnksIG1hdGVyaWFsKTtcclxuXHRcdHRoaXMudHlwZSA9IFJlbmRlck9iamVjdFR5cGUuU2tpbk1lc2g7XHJcblx0XHR0aGlzLnVuaWZvcm1NYXRyaXhzID0gW107XHJcblx0XHR0aGlzLmhhc0FkZEpvaW50cyA9IGZhbHNlO1xyXG5cdH1cclxuXHRzZXRTa2luRGF0YShkYXRhOiBTa2luRGF0YVR5cGUpIHtcclxuXHRcdHRoaXMuaW52ZXJzZUJpbmRNYXRyaWNlcyA9IGRhdGEuaW52ZXJzZUJpbmRNYXRyaWNlcztcclxuXHRcdHRoaXMuam9pbnRzID0gZGF0YS5qb2ludHM7XHJcblx0fVxyXG5cdHVwZGF0ZShmcmFtZVN0YXRlOiBGcmFtZVN0YXRlLCBjYW1lcmE/OiBDYW1lcmEpIHtcclxuXHRcdHRoaXMudW5pZm9ybU1hdHJpeHMgPSB0aGlzLmpvaW50cy5tYXAoKGpvaW50KSA9PiAoam9pbnQgYXMgTm9kZSkubW9kZWxNYXRyaXgpO1xyXG5cdFx0c3VwZXIudXBkYXRlKGZyYW1lU3RhdGUsIGNhbWVyYSk7XHJcblx0XHRpZiAoIXRoaXMuaGFzQWRkSm9pbnRzKSB0aGlzLmFkZFVuaWZvcm1zVG9NYXRlcmlhbCgpO1xyXG5cdH1cclxuXHRwcml2YXRlIGFkZFVuaWZvcm1zVG9NYXRlcmlhbCgpIHtcclxuXHRcdGlmICghdGhpcy5tYXRlcmlhbC5zaGFkZXJEYXRhKSByZXR1cm47XHJcblx0XHR0aGlzLmhhc0FkZEpvaW50cyA9IHRydWU7XHJcblx0XHRpZiAodGhpcy5qb2ludHMpIHtcclxuXHRcdFx0Y29uc3Qgc2tpbkpvaW50c0J1ZmZlciA9IG5ldyBVbmlmb3JtQnVmZmVyKHtcclxuXHRcdFx0XHRsYWJlbDogXCJza2luSm9pbnRzQnVmZmVyXCIsXHJcblx0XHRcdFx0dHlwZTogQnVmZmVyQmluZGluZ1R5cGUuUmVhZE9ubHlTdG9yYWdlLFxyXG5cdFx0XHRcdHVzYWdlOiBCdWZmZXJVc2FnZS5TdG9yYWdlIHwgQnVmZmVyVXNhZ2UuQ29weURzdCxcclxuXHRcdFx0XHRzaXplOiAzMDAwXHJcblx0XHRcdH0pO1xyXG5cdFx0XHRjb25zdCBpbnZzQnVmZmVyID0gbmV3IFVuaWZvcm1CdWZmZXIoe1xyXG5cdFx0XHRcdGxhYmVsOiBcImludnNCdWZmZXJcIixcclxuXHRcdFx0XHR0eXBlOiBCdWZmZXJCaW5kaW5nVHlwZS5SZWFkT25seVN0b3JhZ2UsXHJcblx0XHRcdFx0dXNhZ2U6IEJ1ZmZlclVzYWdlLlN0b3JhZ2UgfCBCdWZmZXJVc2FnZS5Db3B5RHN0LFxyXG5cdFx0XHRcdHNpemU6IDMwMDBcclxuXHRcdFx0fSk7XHJcblx0XHRcdHNraW5Kb2ludHNCdWZmZXIuc2V0VW5pZm9ybShcclxuXHRcdFx0XHRcImpvaW50c1wiLFxyXG5cdFx0XHRcdCgpID0+IHtcclxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnVuaWZvcm1NYXRyaXhzO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0VW5pZm9ybUVudW0uTWF0NEFycmF5LFxyXG5cdFx0XHRcdHRoaXMudW5pZm9ybU1hdHJpeHMubGVuZ3RoXHJcblx0XHRcdCk7XHJcblx0XHRcdGludnNCdWZmZXIuc2V0VW5pZm9ybShcclxuXHRcdFx0XHRcImpvaW50c0ludlwiLFxyXG5cdFx0XHRcdCgpID0+IHtcclxuXHRcdFx0XHRcdHJldHVybiB0aGlzLmludmVyc2VCaW5kTWF0cmljZXM7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRVbmlmb3JtRW51bS5NYXQ0QXJyYXksXHJcblx0XHRcdFx0dGhpcy5pbnZlcnNlQmluZE1hdHJpY2VzLmxlbmd0aFxyXG5cdFx0XHQpO1xyXG5cdFx0XHR0aGlzLm1hdGVyaWFsLnNoYWRlckRhdGEuc2V0VW5pZm9ybUJ1ZmZlcihcInNraW5Kb2ludHNCdWZmZXJcIiwgc2tpbkpvaW50c0J1ZmZlcik7XHJcblx0XHRcdHRoaXMubWF0ZXJpYWwuc2hhZGVyRGF0YS5zZXRVbmlmb3JtQnVmZmVyKFwiaW52c0J1ZmZlclwiLCBpbnZzQnVmZmVyKTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuZXhwb3J0IHR5cGUgU2tpbkRhdGFUeXBlID0ge1xyXG5cdGludmVyc2VCaW5kTWF0cmljZXM/OiBBcnJheTxNYXRyaXg0PjtcclxuXHRqb2ludHM/OiBBcnJheTxOb2RlPjtcclxufTtcclxuIiwiaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gXCIuLi9tYXRoL1F1YXRlcm5pb25cIjtcclxuaW1wb3J0IFZlY3RvcjIgZnJvbSBcIi4uL21hdGgvVmVjdG9yMlwiO1xyXG5pbXBvcnQgVmVjdG9yMyBmcm9tIFwiLi4vbWF0aC9WZWN0b3IzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2xhbXAobnVtOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikge1xyXG5cdHJldHVybiBNYXRoLm1pbihNYXRoLm1heChudW0sIG1pbiksIG1heCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0b0Zsb2F0KG51bTogbnVtYmVyIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWUgPSAxKSB7XHJcblx0Y29uc3QgbiA9IG51bSAhPT0gdW5kZWZpbmVkID8gbnVtIDogZGVmYXVsdFZhbHVlO1xyXG5cdGlmIChOdW1iZXIuaXNJbnRlZ2VyKG4pKSB7XHJcblx0XHRyZXR1cm4gYCR7bn0uMGA7XHJcblx0fVxyXG5cdHJldHVybiBuO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBUeXBlZEFycmF5ID0gSW50OEFycmF5IHwgVWludDhBcnJheSB8IEludDE2QXJyYXkgfCBVaW50MTZBcnJheSB8IFVpbnQzMkFycmF5IHwgRmxvYXQzMkFycmF5O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG5ld1R5cGVkQXJyYXkodHlwZTogbnVtYmVyLCBidWZmZXI6IEFycmF5QnVmZmVyLCBieXRlT2Zmc2V0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKSB7XHJcblx0c3dpdGNoICh0eXBlKSB7XHJcblx0XHRjYXNlIDUxMjA6XHJcblx0XHRcdHJldHVybiBuZXcgSW50OEFycmF5KGJ1ZmZlciwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcclxuXHRcdGNhc2UgNTEyMTpcclxuXHRcdFx0cmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1ZmZlciwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcclxuXHRcdGNhc2UgNTEyMjpcclxuXHRcdFx0cmV0dXJuIG5ldyBJbnQxNkFycmF5KGJ1ZmZlciwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcclxuXHRcdGNhc2UgNTEyMzpcclxuXHRcdFx0cmV0dXJuIG5ldyBVaW50MTZBcnJheShidWZmZXIsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XHJcblx0XHRjYXNlIDUxMjQ6XHJcblx0XHRcdHJldHVybiBuZXcgSW50MzJBcnJheShidWZmZXIsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XHJcblx0XHRjYXNlIDUxMjU6XHJcblx0XHRcdHJldHVybiBuZXcgVWludDMyQXJyYXkoYnVmZmVyLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xyXG5cdFx0Y2FzZSA1MTI2OlxyXG5cdFx0XHRyZXR1cm4gbmV3IEZsb2F0MzJBcnJheShidWZmZXIsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XHJcblx0XHRkZWZhdWx0OlxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGNvbXBvbmVudCB0eXBlXCIpO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHRvSW5kaWNlcyhhcnJheTogVHlwZWRBcnJheSk6IFVpbnQxNkFycmF5IHwgVWludDMyQXJyYXkge1xyXG5cdGlmIChhcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5IHx8IGFycmF5IGluc3RhbmNlb2YgVWludDMyQXJyYXkpIHtcclxuXHRcdHJldHVybiBhcnJheTtcclxuXHR9XHJcblx0bGV0IHRvQXJyYXk7XHJcblx0aWYgKGFycmF5IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KSB7XHJcblx0XHR0b0FycmF5ID0gbmV3IFVpbnQzMkFycmF5KGFycmF5Lmxlbmd0aCk7XHJcblx0fSBlbHNlIHtcclxuXHRcdGxldCBtYXggPSAwO1xyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRtYXggPSBtYXggPCBhcnJheVtpXSA/IGFycmF5W2ldIDogbWF4O1xyXG5cdFx0fVxyXG5cdFx0aWYgKG1heCA8IDY1NTM2KSB7XHJcblx0XHRcdHRvQXJyYXkgPSBuZXcgVWludDE2QXJyYXkoYXJyYXkubGVuZ3RoKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRvQXJyYXkgPSBuZXcgVWludDMyQXJyYXkoYXJyYXkubGVuZ3RoKTtcclxuXHRcdH1cclxuXHR9XHJcblx0YXJyYXkuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcclxuXHRcdHRvQXJyYXlbaW5kZXhdID0gZWxlbWVudDtcclxuXHR9KTtcclxuXHRyZXR1cm4gdG9BcnJheTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGpvaW5BcnJheShhcnJheXM6IEFycmF5PEZsb2F0MzJBcnJheT4pIHtcclxuXHRsZXQgbGVuZ3RoID0gMDtcclxuXHRhcnJheXMuZm9yRWFjaCgoYXJyYXkpID0+IHtcclxuXHRcdGxlbmd0aCArPSBhcnJheS5sZW5ndGg7XHJcblx0fSk7XHJcblx0Y29uc3Qgam9pbmVkID0gbmV3IEZsb2F0MzJBcnJheShsZW5ndGgpO1xyXG5cdGxlbmd0aCA9IDA7XHJcblx0YXJyYXlzLmZvckVhY2goKGFycmF5KSA9PiB7XHJcblx0XHRqb2luZWQuc2V0KGFycmF5LCBsZW5ndGgpO1xyXG5cdFx0bGVuZ3RoICs9IGFycmF5Lmxlbmd0aDtcclxuXHR9KTtcclxuXHRyZXR1cm4gam9pbmVkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR1BVQnVmZmVyKGFycmF5OiBUeXBlZEFycmF5LCB1c2FnZTogbnVtYmVyLCBkZXZpY2U6IEdQVURldmljZSkge1xyXG5cdGNvbnN0IGJ1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoe1xyXG5cdFx0c2l6ZTogKGFycmF5LmJ5dGVMZW5ndGggKyAzKSAmIH4zLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWJpdHdpc2VcclxuXHRcdHVzYWdlLFxyXG5cdFx0bWFwcGVkQXRDcmVhdGlvbjogdHJ1ZVxyXG5cdH0pO1xyXG5cdGxldCB3cml0ZUFyYXJ5O1xyXG5cdGlmIChhcnJheSBpbnN0YW5jZW9mIEludDhBcnJheSkge1xyXG5cdFx0d3JpdGVBcmFyeSA9IG5ldyBJbnQ4QXJyYXkoYnVmZmVyLmdldE1hcHBlZFJhbmdlKCkpO1xyXG5cdH0gZWxzZSBpZiAoYXJyYXkgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XHJcblx0XHR3cml0ZUFyYXJ5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmdldE1hcHBlZFJhbmdlKCkpO1xyXG5cdH0gZWxzZSBpZiAoYXJyYXkgaW5zdGFuY2VvZiBJbnQxNkFycmF5KSB7XHJcblx0XHR3cml0ZUFyYXJ5ID0gbmV3IEludDE2QXJyYXkoYnVmZmVyLmdldE1hcHBlZFJhbmdlKCkpO1xyXG5cdH0gZWxzZSBpZiAoYXJyYXkgaW5zdGFuY2VvZiBVaW50MTZBcnJheSkge1xyXG5cdFx0d3JpdGVBcmFyeSA9IG5ldyBVaW50MTZBcnJheShidWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKSk7XHJcblx0fSBlbHNlIGlmIChhcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KSB7XHJcblx0XHR3cml0ZUFyYXJ5ID0gbmV3IFVpbnQzMkFycmF5KGJ1ZmZlci5nZXRNYXBwZWRSYW5nZSgpKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0d3JpdGVBcmFyeSA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyLmdldE1hcHBlZFJhbmdlKCkpO1xyXG5cdH1cclxuXHR3cml0ZUFyYXJ5LnNldChhcnJheSk7XHJcblx0YnVmZmVyLnVubWFwKCk7XHJcblx0cmV0dXJuIGJ1ZmZlcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTm9ybWFscyhpbmRpY2VzOiBUeXBlZEFycmF5IHwgbnVsbCwgcG9zaXRpb25zOiBUeXBlZEFycmF5KSB7XHJcblx0Y29uc3Qgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkocG9zaXRpb25zLmxlbmd0aCk7XHJcblx0Y29uc3QgdmVydGV4Q291bnQgPSBpbmRpY2VzID8gaW5kaWNlcy5sZW5ndGggOiBwb3NpdGlvbnMubGVuZ3RoO1xyXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkgKz0gMykge1xyXG5cdFx0Y29uc3QgdHJpSW5kaWNlcyA9IFtdO1xyXG5cdFx0Zm9yIChsZXQgbiA9IDA7IG4gPCAzOyBuICs9IDEpIHtcclxuXHRcdFx0aWYgKGluZGljZXMpIHtcclxuXHRcdFx0XHR0cmlJbmRpY2VzLnB1c2goaW5kaWNlc1tpICsgbl0pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRyaUluZGljZXMucHVzaChpICsgbik7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGNvbnN0IHRyaWFuZ2xlID0gdHJpSW5kaWNlcy5tYXAoKHZlcnRleEluZGV4KSA9PiB7XHJcblx0XHRcdGNvbnN0IGluZGV4ID0gdmVydGV4SW5kZXggKiAzO1xyXG5cdFx0XHRyZXR1cm4gbmV3IFZlY3RvcjMocG9zaXRpb25zW2luZGV4XSwgcG9zaXRpb25zW2luZGV4ICsgMV0sIHBvc2l0aW9uc1tpbmRleCArIDJdKTtcclxuXHRcdH0pO1xyXG5cdFx0Y29uc3QgZHYxID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFZlY3RvcjMuc3VidHJhY3QodHJpYW5nbGVbMV0sIHRyaWFuZ2xlWzBdLCBkdjEpO1xyXG5cdFx0Y29uc3QgZHYyID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFZlY3RvcjMuc3VidHJhY3QodHJpYW5nbGVbMl0sIHRyaWFuZ2xlWzBdLCBkdjIpO1xyXG5cdFx0Y29uc3Qgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFZlY3RvcjMuY3Jvc3MoZHYxLm5vcm1hbGl6ZSgpLCBkdjIubm9ybWFsaXplKCksIG5vcm1hbCk7XHJcblx0XHRmb3IgKGxldCBuID0gMDsgbiA8IDM7IG4gKz0gMSkge1xyXG5cdFx0XHRjb25zdCBpbmRleCA9IChpICsgbikgKiAzO1xyXG5cdFx0XHRub3JtYWxzW2luZGV4ICsgMF0gKz0gbm9ybWFsLng7XHJcblx0XHRcdG5vcm1hbHNbaW5kZXggKyAxXSArPSBub3JtYWwueTtcclxuXHRcdFx0bm9ybWFsc1tpbmRleCArIDJdICs9IG5vcm1hbC56O1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbm9ybWFscztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVGFuZ2VudHMoXHJcblx0aW5kaWNlczogVHlwZWRBcnJheSB8IG51bGwsXHJcblx0cG9zaXRpb25zOiBUeXBlZEFycmF5LFxyXG5cdG5vcm1hbHM6IFR5cGVkQXJyYXksXHJcblx0dXZzOiBUeXBlZEFycmF5XHJcbikge1xyXG5cdGNvbnN0IHRhbmdlbnRzID0gbmV3IEZsb2F0MzJBcnJheSgobm9ybWFscy5sZW5ndGggLyAzKSAqIDQpO1xyXG5cdGNvbnN0IHZlcnRleENvdW50ID0gaW5kaWNlcyA/IGluZGljZXMubGVuZ3RoIDogcG9zaXRpb25zLmxlbmd0aDtcclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpICs9IDMpIHtcclxuXHRcdGNvbnN0IHRyaUluZGljZXMgPSBbXTtcclxuXHRcdGZvciAobGV0IG4gPSAwOyBuIDwgMzsgbiArPSAxKSB7XHJcblx0XHRcdGlmIChpbmRpY2VzKSB7XHJcblx0XHRcdFx0dHJpSW5kaWNlcy5wdXNoKGluZGljZXNbaSArIG5dKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0cmlJbmRpY2VzLnB1c2goaSArIG4pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRjb25zdCBwb3MgPSB0cmlJbmRpY2VzLm1hcCgodmVydGV4SW5kZXgpID0+IHtcclxuXHRcdFx0Y29uc3QgaW5kZXggPSB2ZXJ0ZXhJbmRleCAqIDM7XHJcblx0XHRcdHJldHVybiBuZXcgVmVjdG9yMyhwb3NpdGlvbnNbaW5kZXhdLCBwb3NpdGlvbnNbaW5kZXggKyAxXSwgcG9zaXRpb25zW2luZGV4ICsgMl0pO1xyXG5cdFx0fSk7XHJcblx0XHRjb25zdCB1diA9IHRyaUluZGljZXMubWFwKCh2ZXJ0ZXhJbmRleCkgPT4ge1xyXG5cdFx0XHRjb25zdCBpbmRleCA9IHZlcnRleEluZGV4ICogMjtcclxuXHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IyKHV2cz8uW2luZGV4XSwgdXZzPy5baW5kZXggKyAxXSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRjb25zdCBkdjEgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0VmVjdG9yMy5zdWJ0cmFjdChwb3NbMV0sIHBvc1swXSwgZHYxKTtcclxuXHRcdGNvbnN0IGR2MiA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRWZWN0b3IzLnN1YnRyYWN0KHBvc1syXSwgcG9zWzBdLCBkdjIpO1xyXG5cdFx0Y29uc3QgZHV2MSA9IG5ldyBWZWN0b3IyKCk7XHJcblx0XHRWZWN0b3IyLnN1YnRyYWN0KHV2WzFdLCB1dlswXSwgZHV2MSk7XHJcblx0XHRjb25zdCBkdXYyID0gbmV3IFZlY3RvcjIoKTtcclxuXHRcdFZlY3RvcjIuc3VidHJhY3QodXZbMl0sIHV2WzBdLCBkdXYyKTtcclxuXHJcblx0XHRjb25zdCB0YW5nZW50ID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFZlY3RvcjMubXVsdGlwbHlCeVNjYWxhcihkdjEsIGR1djEueSwgZHYxKTtcclxuXHRcdFZlY3RvcjMubXVsdGlwbHlCeVNjYWxhcihkdjIsIGR1djIueSwgZHYyKTtcclxuXHRcdFZlY3RvcjMuc3VidHJhY3QoZHYxLCBkdjIsIHRhbmdlbnQpO1xyXG5cclxuXHRcdFZlY3RvcjMubXVsdGlwbHlCeVNjYWxhcih0YW5nZW50LCBkdXYyLnkgKiBkdXYxLnggLSBkdXYxLnkgKiBkdXYyLngsIHRhbmdlbnQpO1xyXG5cclxuXHRcdHRhbmdlbnQubm9ybWFsaXplKCk7XHJcblx0XHRmb3IgKGxldCBuID0gMDsgbiA8IDM7IG4gKz0gMSkge1xyXG5cdFx0XHRjb25zdCBpbmRleCA9IChpICsgbikgKiA0O1xyXG5cclxuXHRcdFx0dGFuZ2VudHNbaW5kZXggKyAwXSArPSB0YW5nZW50Lng7XHJcblx0XHRcdHRhbmdlbnRzW2luZGV4ICsgMV0gKz0gdGFuZ2VudC55O1xyXG5cdFx0XHR0YW5nZW50c1tpbmRleCArIDJdICs9IHRhbmdlbnQuejtcclxuXHRcdFx0dGFuZ2VudHNbaW5kZXggKyAzXSA9IDE7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiB0YW5nZW50cztcclxufVxyXG5cclxuZnVuY3Rpb24gbGVycChhOiBudW1iZXIsIGI6IG51bWJlciwgeDogbnVtYmVyKSB7XHJcblx0aWYgKHggPCBhKSB7XHJcblx0XHRyZXR1cm4gMDtcclxuXHR9XHJcblx0aWYgKHggPiBiKSB7XHJcblx0XHRyZXR1cm4gMTtcclxuXHR9XHJcblx0cmV0dXJuICh4IC0gYSkgLyAoYiAtIGEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJwUXVhdChpbnB1dDogVHlwZWRBcnJheSwgbzogVHlwZWRBcnJheSwgdGltZTogbnVtYmVyLCBtZXRob2Q6IHN0cmluZykge1xyXG5cdGxldCBpbmRleCA9IDE7XHJcblx0d2hpbGUgKGluZGV4IDwgaW5wdXQubGVuZ3RoIC0gMSAmJiB0aW1lID49IGlucHV0W2luZGV4XSkge1xyXG5cdFx0aW5kZXggKz0gMTtcclxuXHR9XHJcblx0Y29uc3QgdCA9IGxlcnAoaW5wdXRbaW5kZXggLSAxXSwgaW5wdXRbaW5kZXhdLCB0aW1lKTtcclxuXHJcblx0aWYgKG1ldGhvZCA9PT0gXCJDVUJJQ1NQTElORVwiKSB7XHJcblx0XHRjb25zdCB0ZCA9IGlucHV0W2luZGV4XSAtIGlucHV0W2luZGV4IC0gMV07XHJcblx0XHRjb25zdCB0MiA9IHQgKiB0O1xyXG5cdFx0Y29uc3QgdDMgPSB0MiAqIHQ7XHJcblx0XHRjb25zdCBpID0gMTIgKiBpbmRleDtcclxuXHJcblx0XHRjb25zdCB2MCA9IG5ldyBRdWF0ZXJuaW9uKG9baSAtIDhdLCBvW2kgLSA3XSwgb1tpIC0gNl0sIG9baSAtIDVdKTtcclxuXHRcdGNvbnN0IGIwID0gbmV3IFF1YXRlcm5pb24ob1tpIC0gNF0sIG9baSAtIDNdLCBvW2kgLSAyXSwgb1tpIC0gMV0pO1xyXG5cdFx0Y29uc3QgdjEgPSBuZXcgUXVhdGVybmlvbihvW2kgKyA0XSwgb1tpICsgNV0sIG9baSArIDZdLCBvW2kgKyA3XSk7XHJcblx0XHRjb25zdCBhMSA9IG5ldyBRdWF0ZXJuaW9uKG9baV0sIG9baSArIDFdLCBvW2kgKyAyXSwgb1tpICsgM10pO1xyXG5cdFx0UXVhdGVybmlvbi5tdWx0aXBseUJ5U2NhbGFyKHYwLCAyICogdDMgLSAzICogdDIgKyAxLCB2MCk7XHJcblx0XHRRdWF0ZXJuaW9uLm11bHRpcGx5QnlTY2FsYXIoYjAsIHRkICogKHQzIC0gMiAqIHQyICsgdCksIGIwKTtcclxuXHRcdFF1YXRlcm5pb24ubXVsdGlwbHlCeVNjYWxhcih2MSwgLTIgKiB0MyArIDMgKiB0MiwgdjEpO1xyXG5cdFx0UXVhdGVybmlvbi5tdWx0aXBseUJ5U2NhbGFyKGExLCB0ZCAqICh0MyAtIHQyKSwgYTEpO1xyXG5cclxuXHRcdGNvbnN0IHJlc3VsdCA9IG5ldyBRdWF0ZXJuaW9uKCk7XHJcblx0XHRRdWF0ZXJuaW9uLmFkZChyZXN1bHQsIHYwLCByZXN1bHQpO1xyXG5cdFx0UXVhdGVybmlvbi5hZGQocmVzdWx0LCBiMCwgcmVzdWx0KTtcclxuXHRcdFF1YXRlcm5pb24uYWRkKHJlc3VsdCwgdjEsIHJlc3VsdCk7XHJcblx0XHRRdWF0ZXJuaW9uLmFkZChyZXN1bHQsIGExLCByZXN1bHQpO1xyXG5cdFx0UXVhdGVybmlvbi5ub3JtYWxpemUocmVzdWx0LCByZXN1bHQpO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdGNvbnN0IHEgPSBbXTtcclxuXHRmb3IgKGxldCBuID0gLTE7IG4gPCAxOyBuICs9IDEpIHtcclxuXHRcdGNvbnN0IGkgPSA0ICogKGluZGV4ICsgbik7XHJcblx0XHRxLnB1c2gobmV3IFF1YXRlcm5pb24ob1tpXSwgb1tpICsgMV0sIG9baSArIDJdLCBvW2kgKyAzXSkpO1xyXG5cdH1cclxuXHJcblx0aWYgKG1ldGhvZCA9PT0gXCJTVEVQXCIpIHtcclxuXHRcdHJldHVybiB0IDwgMSA/IHFbMF0gOiBxWzFdO1xyXG5cdH1cclxuXHRjb25zdCByZXN1bHQgPSBuZXcgUXVhdGVybmlvbigpO1xyXG5cdFF1YXRlcm5pb24uc2xlcnAocVswXSwgcVsxXSwgdCwgcmVzdWx0KTtcclxuXHRyZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJwVmVjMyhpbnB1dDogVHlwZWRBcnJheSwgb3V0cHV0OiBUeXBlZEFycmF5LCB0aW1lOiBudW1iZXIsIG1ldGhvZDogc3RyaW5nKSB7XHJcblx0bGV0IGluZGV4ID0gMTtcclxuXHR3aGlsZSAoaW5kZXggPCBpbnB1dC5sZW5ndGggLSAxICYmIHRpbWUgPj0gaW5wdXRbaW5kZXhdKSB7XHJcblx0XHRpbmRleCArPSAxO1xyXG5cdH1cclxuXHRjb25zdCB0ID0gbGVycChpbnB1dFtpbmRleCAtIDFdLCBpbnB1dFtpbmRleF0sIHRpbWUpO1xyXG5cclxuXHRpZiAobWV0aG9kID09PSBcIkNVQklDU1BMSU5FXCIpIHtcclxuXHRcdGNvbnN0IHRkID0gaW5wdXRbaW5kZXhdIC0gaW5wdXRbaW5kZXggLSAxXTtcclxuXHRcdGNvbnN0IHQyID0gdCAqIHQ7XHJcblx0XHRjb25zdCB0MyA9IHQyICogdDtcclxuXHRcdGNvbnN0IGkgPSA5ICogaW5kZXg7XHJcblx0XHRjb25zdCB2MCA9IG5ldyBWZWN0b3IzKG91dHB1dFtpIC0gNl0sIG91dHB1dFtpIC0gNV0sIG91dHB1dFtpIC0gNF0pO1xyXG5cdFx0Y29uc3QgYjAgPSBuZXcgVmVjdG9yMyhvdXRwdXRbaSAtIDNdLCBvdXRwdXRbaSAtIDJdLCBvdXRwdXRbaSAtIDFdKTtcclxuXHRcdGNvbnN0IHYxID0gbmV3IFZlY3RvcjMob3V0cHV0W2kgKyAzXSwgb3V0cHV0W2kgKyA0XSwgb3V0cHV0W2kgKyA1XSk7XHJcblx0XHRjb25zdCBhMSA9IG5ldyBWZWN0b3IzKG91dHB1dFtpXSwgb3V0cHV0W2kgKyAxXSwgb3V0cHV0W2kgKyAyXSk7XHJcblx0XHRWZWN0b3IzLm11bHRpcGx5QnlTY2FsYXIodjAsIDIgKiB0MyAtIDMgKiB0MiArIDEsIHYwKTtcclxuXHRcdFZlY3RvcjMubXVsdGlwbHlCeVNjYWxhcihiMCwgdGQgKiAodDMgLSAyICogdDIgKyB0KSwgYjApO1xyXG5cdFx0VmVjdG9yMy5tdWx0aXBseUJ5U2NhbGFyKHYxLCAtMiAqIHQzICsgMyAqIHQyLCB2MSk7XHJcblx0XHRWZWN0b3IzLm11bHRpcGx5QnlTY2FsYXIoYTEsIHRkICogKHQzIC0gdDIpLCBhMSk7XHJcblx0XHRjb25zdCByZXN1bHQgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0VmVjdG9yMy5hZGQocmVzdWx0LCB2MCwgcmVzdWx0KTtcclxuXHRcdFZlY3RvcjMuYWRkKHJlc3VsdCwgYjAsIHJlc3VsdCk7XHJcblx0XHRWZWN0b3IzLmFkZChyZXN1bHQsIHYxLCByZXN1bHQpO1xyXG5cdFx0VmVjdG9yMy5hZGQocmVzdWx0LCBhMSwgcmVzdWx0KTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRjb25zdCB2ID0gW107XHJcblx0Zm9yIChsZXQgbiA9IC0xOyBuIDwgMTsgbiArPSAxKSB7XHJcblx0XHRjb25zdCBpID0gMyAqIChpbmRleCArIG4pO1xyXG5cdFx0di5wdXNoKG5ldyBWZWN0b3IzKG91dHB1dFtpXSwgb3V0cHV0W2kgKyAxXSwgb3V0cHV0W2kgKyAyXSkpO1xyXG5cdH1cclxuXHJcblx0aWYgKG1ldGhvZCA9PT0gXCJTVEVQXCIpIHtcclxuXHRcdHJldHVybiB0IDwgMSA/IHZbMF0gOiB2WzFdO1xyXG5cdH1cclxuXHRjb25zdCByZXN1bHQgPSBuZXcgVmVjdG9yMygpO1xyXG5cdHJldHVybiBWZWN0b3IzLmxlcnAodlswXSwgdlsxXSwgdCwgcmVzdWx0KTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdsdGZFbnVtOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9ID0ge1xyXG5cdFNDQUxBUjogMSxcclxuXHRWRUMyOiAyLFxyXG5cdFZFQzM6IDMsXHJcblx0VkVDNDogNCxcclxuXHRNQVQyOiA0LFxyXG5cdE1BVDM6IDksXHJcblx0TUFUNDogMTYsXHJcblx0NTEyMDogMSxcclxuXHQ1MTIxOiAxLFxyXG5cdDUxMjI6IDIsXHJcblx0NTEyMzogMixcclxuXHQ1MTI1OiA0LFxyXG5cdDUxMjY6IDQsXHJcblx0OTcyODogXCJuZWFyZXN0XCIsXHJcblx0OTcyOTogXCJsaW5lYXJcIixcclxuXHQ5OTg0OiBcImxpbmVhclwiLFxyXG5cdDk5ODU6IFwibGluZWFyXCIsXHJcblx0OTk4NjogXCJsaW5lYXJcIixcclxuXHQ5OTg3OiBcImxpbmVhclwiLFxyXG5cdDMzMDcxOiBcImNsYW1wLXRvLWVkZ2VcIixcclxuXHQzMzY0ODogXCJtaXJyb3ItcmVwZWF0XCIsXHJcblx0MTA0OTc6IFwicmVwZWF0XCJcclxufTtcclxuIiwiaW1wb3J0IE1hdHJpeDQgZnJvbSBcIi4uLy4uLy4uL21hdGgvTWF0cml4NFwiO1xyXG5pbXBvcnQgVmVjdG9yNCBmcm9tIFwiLi4vLi4vLi4vbWF0aC9WZWN0b3I0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQWNjZXNzb3Ige1xyXG5cdHZhbHVlczogYW55O1xyXG5cdGlkOiBudW1iZXI7XHJcblx0Y291bnQ6IG51bWJlcjtcclxuXHRjb21wb25lbnRUeXBlOiBudW1iZXI7XHJcblx0dHlwZTogbnVtYmVyO1xyXG5cdG1pbjogbnVtYmVyW107XHJcblx0bWF4OiBudW1iZXJbXTtcclxuXHRjb25zdHJ1Y3RvcihvcHRpb25zOiBBY2Nlc3NvclBhcm1zKSB7XHJcblx0XHR0aGlzLnZhbHVlcyA9IG9wdGlvbnMudmFsdWVzID8/IFtdO1xyXG5cdFx0dGhpcy5pZCA9IG9wdGlvbnMuaWQ7XHJcblx0XHR0aGlzLmNvdW50ID0gb3B0aW9ucy5jb3VudDtcclxuXHRcdHRoaXMuY29tcG9uZW50VHlwZSA9IG9wdGlvbnMuY29tcG9uZW50VHlwZTtcclxuXHRcdHRoaXMudHlwZSA9IG9wdGlvbnMudHlwZTtcclxuXHRcdHRoaXMubWluID0gb3B0aW9ucy5taW47XHJcblx0XHR0aGlzLm1heCA9IG9wdGlvbnMubWF4O1xyXG5cdH1cclxuXHRnZXRBcnJheSgpOiBudW1iZXJbXSB7XHJcblx0XHRyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnZhbHVlcyk7XHJcblx0fVxyXG5cdGdldFZlYzRBcnJheSgpOiBWZWN0b3I0W10ge1xyXG5cdFx0Y29uc3QgcmVzdWx0ID0gW107XHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWVzLmxlbmd0aDsgaSArPSA0KSB7XHJcblx0XHRcdHJlc3VsdC5wdXNoKG5ldyBWZWN0b3I0KHRoaXMudmFsdWVzW2ldLCB0aGlzLnZhbHVlc1tpICsgMV0sIHRoaXMudmFsdWVzW2kgKyAyXSwgdGhpcy52YWx1ZXNbaSArIDNdKSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHRnZXRNYXQ0QXJyYXkoKTogTWF0cml4NFtdIHtcclxuXHRcdGNvbnN0IHJlc3VsdCA9IFtdO1xyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlcy5sZW5ndGg7IGkgKz0gMTYpIHtcclxuXHRcdFx0Y29uc3QgbWF0NCA9IG5ldyBNYXRyaXg0KCk7XHJcblx0XHRcdE1hdHJpeDQuZnJvbUNvbHVtbk1ham9yQXJyYXkodGhpcy52YWx1ZXMuc2xpY2UoaSwgaSArIDE2KSwgbWF0NCk7XHJcblx0XHRcdHJlc3VsdC5wdXNoKG1hdDQpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcbn1cclxuZXhwb3J0IHR5cGUgQWNjZXNzb3JQYXJtcyA9IFBhcnRpYWw8QWNjZXNzb3I+O1xyXG4iLCJpbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSBcIi4uLy4uLy4uL21hdGgvUXVhdGVybmlvblwiO1xuaW1wb3J0IFZlY3RvcjQgZnJvbSBcIi4uLy4uLy4uL21hdGgvVmVjdG9yNFwiO1xuaW1wb3J0IHsgQW5pbWF0aW9uQ2hhbm5lbCB9IGZyb20gXCIuL0FuaW1hdGlvbkNoYW5uZWxcIjtcbmltcG9ydCB7IEFuaW1hdGlvblNhbXBsZXIgfSBmcm9tIFwiLi9BbmltYXRpb25TYW1wbGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBBbmltYXRpb24ge1xuXHRjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgc2FtcGxlcnM6IEFuaW1hdGlvblNhbXBsZXJbXSwgcHVibGljIGNoYW5uZWxzOiBBbmltYXRpb25DaGFubmVsW10pIHt9XG5cdHBsYXkodGltZTogbnVtYmVyKSB7XG5cdFx0bGV0IG5vZGUsIGFuaW1hdGlvblNhbXBsZXIsIHRhcmdldDtcblx0XHR0aGlzPy5jaGFubmVscz8ubWFwKChjaGFubmVsKSA9PiB7XG5cdFx0XHRhbmltYXRpb25TYW1wbGVyID0gY2hhbm5lbC5zYW1wbGVyO1xuXHRcdFx0YW5pbWF0aW9uU2FtcGxlci5nZXRWYWx1ZSh0aW1lKTtcblx0XHRcdHRhcmdldCA9IGNoYW5uZWwudGFyZ2V0O1xuXHRcdFx0bm9kZSA9IHRhcmdldC5ub2RlO1xuXHRcdFx0c3dpdGNoICh0YXJnZXQucGF0aCkge1xuXHRcdFx0XHRjYXNlIFwicm90YXRpb25cIjpcblx0XHRcdFx0XHRRdWF0ZXJuaW9uLmNsb25lKGFuaW1hdGlvblNhbXBsZXIuY3VycmVudFZhbHVlLCBub2RlLnF1YXRlcm5pb24pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwidHJhbnNsYXRpb25cIjpcblx0XHRcdFx0XHRWZWN0b3I0LmNsb25lKGFuaW1hdGlvblNhbXBsZXIuY3VycmVudFZhbHVlLCBub2RlLnBvc2l0aW9uKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcInNjYWxlXCI6XG5cdFx0XHRcdFx0VmVjdG9yNC5jbG9uZShhbmltYXRpb25TYW1wbGVyLmN1cnJlbnRWYWx1ZSwgbm9kZS5zY2FsZSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFuaW1hdGlvbkNoYW5uZWxUYXJnZXQgfSBmcm9tIFwiLi9BbmltYXRpb25DaGFubmVsVGFyZ2V0XCI7XG5pbXBvcnQgeyBBbmltYXRpb25TYW1wbGVyIH0gZnJvbSBcIi4vQW5pbWF0aW9uU2FtcGxlclwiO1xuXG5leHBvcnQgY2xhc3MgQW5pbWF0aW9uQ2hhbm5lbCB7XG5cdHNhbXBsZXI6IEFuaW1hdGlvblNhbXBsZXI7XG5cdHRhcmdldDogQW5pbWF0aW9uQ2hhbm5lbFRhcmdldDtcblx0Y29uc3RydWN0b3IoKSB7fVxufVxuIiwiaW1wb3J0IE5vZGUgZnJvbSBcIi4uLy4uLy4uL21lc2gvTm9kZVwiO1xuXG5leHBvcnQgY2xhc3MgQW5pbWF0aW9uQ2hhbm5lbFRhcmdldCB7XG5cdG5vZGU6IE5vZGU7XG5cdHBhdGg6IFwidHJhbnNsYXRpb25cIiB8IFwicm90YXRpb25cIiB8IFwic2NhbGVcIiB8IFwid2VpZ2h0c1wiO1xuXHRjb25zdHJ1Y3Rvcihub2RlLCBwYXRoKSB7XG5cdFx0dGhpcy5ub2RlID0gbm9kZTtcblx0XHR0aGlzLnBhdGggPSBwYXRoO1xuXHR9XG59XG4iLCJleHBvcnQgZW51bSBUeXBlMk51bU9mQ29tcG9uZW50IHtcclxuXHRcIlNDQUxBUlwiID0gMSxcclxuXHRcIlZFQzJcIiA9IDIsXHJcblx0XCJWRUMzXCIgPSAzLFxyXG5cdFwiVkVDNFwiID0gNCxcclxuXHRcIk1BVDJcIiA9IDQsXHJcblx0XCJNQVQzXCIgPSA5LFxyXG5cdFwiTUFUNFwiID0gMTZcclxufVxyXG4iLCJpbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSBcIi4uLy4uLy4uL21hdGgvUXVhdGVybmlvblwiO1xyXG5pbXBvcnQgVmVjdG9yNCBmcm9tIFwiLi4vLi4vLi4vbWF0aC9WZWN0b3I0XCI7XHJcbmltcG9ydCB7IFR5cGUyTnVtT2ZDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXMvZ2x0ZlR5cGVcIjtcclxuZXhwb3J0IGNsYXNzIEFuaW1hdGlvblNhbXBsZXIge1xyXG5cdGlucHV0OiBhbnk7XHJcblx0aW50ZXJwb2xhdGlvbjogXCJMSU5FQVJcIiB8IFwiU1RFUFwiIHwgXCJDVUJJQ1NQTElORVwiO1xyXG5cdG91dHB1dDogYW55O1xyXG5cdGN1cnJlbnRJbmRleDogbnVtYmVyO1xyXG5cdHN0YXJ0VGltZTogbnVtYmVyO1xyXG5cdGVuZFRpbWU6IG51bWJlcjtcclxuXHRjdXJyZW50VmFsdWU6IFZlY3RvcjQgfCBRdWF0ZXJuaW9uO1xyXG5cdGR1cmF0aW9uOiBudW1iZXI7XHJcblx0aW5wdXRNYXg6IG51bWJlcjtcclxuXHRwcml2YXRlIGlucHV0VHlwZTogc3RyaW5nO1xyXG5cdHByaXZhdGUgb3V0cHV0VHlwZTogc3RyaW5nO1xyXG5cdGNvbnN0cnVjdG9yKCkge31cclxuXHRmb3JtR2x0ZihnbHRmLCBzYW1wbGVyKSB7XHJcblx0XHR0aGlzLmlucHV0ID0gZ2x0Zi5hY2Nlc3NvcnNbc2FtcGxlci5pbnB1dF0udmFsdWVzOyAvL3JlcXVpcmVkLCBhY2Nlc3NvciBvYmplY3RcclxuXHRcdHRoaXMub3V0cHV0ID0gZ2x0Zi5hY2Nlc3NvcnNbc2FtcGxlci5vdXRwdXRdLnZhbHVlczsgLy9yZXF1aXJlZCwgYWNjZXNzb3Igb2JqZWN0XHJcblx0XHR0aGlzLmludGVycG9sYXRpb24gPSBzYW1wbGVyLmludGVycG9sYXRpb24gIT09IHVuZGVmaW5lZCA/IHNhbXBsZXIuaW50ZXJwb2xhdGlvbiA6IFwiTElORUFSXCI7XHJcblx0XHR0aGlzLmN1cnJlbnRJbmRleCA9IDA7XHJcblx0XHQvLyB0aGlzLmN1cnJlbnRWYWx1ZT1uZXcgVmVjdG9yNCgpO1xyXG5cdFx0dGhpcy5lbmRUaW1lID0gdGhpcy5pbnB1dFt0aGlzLmlucHV0Lmxlbmd0aCAtIDFdO1xyXG5cdFx0dGhpcy5pbnB1dE1heCA9IHRoaXMuZW5kVGltZSAtIHRoaXMuaW5wdXRbMF07XHJcblx0XHR0aGlzLmlucHV0VHlwZSA9IGdsdGY/Lmpzb24/LmFjY2Vzc29yc1tzYW1wbGVyLmlucHV0XT8udHlwZTtcclxuXHRcdHRoaXMub3V0cHV0VHlwZSA9IGdsdGY/Lmpzb24/LmFjY2Vzc29yc1tzYW1wbGVyLm91dHB1dF0/LnR5cGU7XHJcblx0fVxyXG5cdGdldFZhbHVlKHRpbWU6IG51bWJlcik6IHZvaWQge1xyXG5cdFx0aWYgKHRpbWUgPiB0aGlzLmVuZFRpbWUpIHtcclxuXHRcdFx0dGltZSAtPSB0aGlzLmlucHV0TWF4ICogTWF0aC5jZWlsKCh0aW1lIC0gdGhpcy5lbmRUaW1lKSAvIHRoaXMuaW5wdXRNYXgpO1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRJbmRleCA9IDA7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbGVuID0gdGhpcy5pbnB1dC5sZW5ndGg7XHJcblx0XHR3aGlsZSAodGhpcy5jdXJyZW50SW5kZXggPD0gbGVuIC0gMiAmJiB0aW1lID49IHRoaXMuaW5wdXRbdGhpcy5jdXJyZW50SW5kZXggKyAxXSkge1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRJbmRleCsrO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLmN1cnJlbnRJbmRleCA+PSBsZW4gLSAxKSB7XHJcblx0XHRcdC8vIGxvb3BcclxuXHRcdFx0dGltZSAtPSB0aGlzLmlucHV0TWF4O1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRJbmRleCA9IDA7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQHRtcDogYXNzdW1lIG5vIHN0cmlkZVxyXG5cdFx0Y29uc3QgY291bnQgPSBUeXBlMk51bU9mQ29tcG9uZW50W3RoaXMub3V0cHV0VHlwZV07XHJcblxyXG5cdFx0Y29uc3QgYW5pbWF0aW9uT3V0cHV0VmFsdWVWZWM0YSA9IGNvdW50ID09PSA0ID8gbmV3IFF1YXRlcm5pb24oKSA6IG5ldyBWZWN0b3I0KCk7XHJcblx0XHRjb25zdCBhbmltYXRpb25PdXRwdXRWYWx1ZVZlYzRiID0gY291bnQgPT09IDQgPyBuZXcgUXVhdGVybmlvbigpIDogbmV3IFZlY3RvcjQoKTtcclxuXHRcdGlmICghdGhpcy5jdXJyZW50VmFsdWUpIHRoaXMuY3VycmVudFZhbHVlID0gY291bnQgPT09IDQgPyBuZXcgUXVhdGVybmlvbigpIDogbmV3IFZlY3RvcjQoKTtcclxuXHRcdGNvbnN0IGkgPSB0aGlzLmN1cnJlbnRJbmRleDtcclxuXHRcdGNvbnN0IG8gPSBpICogY291bnQ7XHJcblx0XHRjb25zdCBvbiA9IG8gKyBjb3VudDtcclxuXHJcblx0XHRjb25zdCB1ID0gTWF0aC5tYXgoMCwgdGltZSAtIHRoaXMuaW5wdXRbaV0pIC8gKHRoaXMuaW5wdXRbaSArIDFdIC0gdGhpcy5pbnB1dFtpXSk7XHJcblx0XHRhbmltYXRpb25PdXRwdXRWYWx1ZVZlYzRhLnNldCh0aGlzLm91dHB1dFtvICsgMF0sIHRoaXMub3V0cHV0W28gKyAxXSwgdGhpcy5vdXRwdXRbbyArIDJdLCB0aGlzLm91dHB1dFtvICsgM10pO1xyXG5cdFx0YW5pbWF0aW9uT3V0cHV0VmFsdWVWZWM0Yi5zZXQoXHJcblx0XHRcdHRoaXMub3V0cHV0W29uICsgMF0sXHJcblx0XHRcdHRoaXMub3V0cHV0W29uICsgMV0sXHJcblx0XHRcdHRoaXMub3V0cHV0W29uICsgMl0sXHJcblx0XHRcdHRoaXMub3V0cHV0W29uICsgM11cclxuXHRcdCk7XHJcblx0XHRzd2l0Y2ggKHRoaXMuaW50ZXJwb2xhdGlvbikge1xyXG5cdFx0XHRjYXNlIFwiTElORUFSXCI6XHJcblx0XHRcdFx0Y291bnQgPT09IDRcclxuXHRcdFx0XHRcdD8gUXVhdGVybmlvbi5zbGVycChcclxuXHRcdFx0XHRcdFx0XHQ8UXVhdGVybmlvbj5hbmltYXRpb25PdXRwdXRWYWx1ZVZlYzRhLFxyXG5cdFx0XHRcdFx0XHRcdDxRdWF0ZXJuaW9uPmFuaW1hdGlvbk91dHB1dFZhbHVlVmVjNGIsXHJcblx0XHRcdFx0XHRcdFx0dSxcclxuXHRcdFx0XHRcdFx0XHQ8UXVhdGVybmlvbj50aGlzLmN1cnJlbnRWYWx1ZVxyXG5cdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHQ6IFZlY3RvcjQubGVycChcclxuXHRcdFx0XHRcdFx0XHQ8VmVjdG9yND5hbmltYXRpb25PdXRwdXRWYWx1ZVZlYzRhLFxyXG5cdFx0XHRcdFx0XHRcdDxWZWN0b3I0PmFuaW1hdGlvbk91dHB1dFZhbHVlVmVjNGIsXHJcblx0XHRcdFx0XHRcdFx0dSxcclxuXHRcdFx0XHRcdFx0XHQ8VmVjdG9yND50aGlzLmN1cnJlbnRWYWx1ZVxyXG5cdFx0XHRcdFx0ICApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iLCJpbXBvcnQgeyBSZW5kZXJPYmplY3RUeXBlIH0gZnJvbSBcIi4uL2NvcmUvV2ViR1BVVHlwZXNcIjtcclxuaW1wb3J0IEdlb21ldHJ5IGZyb20gXCIuLi9nZW9tZXRyeS9HZW9tZXRyeVwiO1xyXG5pbXBvcnQgUGJyTWF0ZXJpYWwgZnJvbSBcIi4uL21hdGVyaWFsL1Bick1hdGVyaWFsXCI7XHJcbmltcG9ydCBDb2xvciBmcm9tIFwiLi4vbWF0aC9Db2xvclwiO1xyXG5pbXBvcnQgTWF0cml4NCBmcm9tIFwiLi4vbWF0aC9NYXRyaXg0XCI7XHJcbmltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tIFwiLi4vbWF0aC9RdWF0ZXJuaW9uXCI7XHJcbmltcG9ydCBWZWN0b3IzIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjNcIjtcclxuaW1wb3J0IHsgTWVzaCB9IGZyb20gXCIuLi9tZXNoL01lc2hcIjtcclxuaW1wb3J0IE5vZGUgZnJvbSBcIi4uL21lc2gvTm9kZVwiO1xyXG5pbXBvcnQgeyBTS2luTWVzaCB9IGZyb20gXCIuLi9tZXNoL1NLaW5NZXNoXCI7XHJcbmltcG9ydCB7IEZsb2F0MzJBdHRyaWJ1dGUgfSBmcm9tIFwiLi4vcmVuZGVyL0F0dHJpYnV0ZVwiO1xyXG5pbXBvcnQgU2FtcGxlciBmcm9tIFwiLi4vcmVuZGVyL1NhbXBsZXJcIjtcclxuaW1wb3J0IFRleHR1cmUgZnJvbSBcIi4uL3JlbmRlci9UZXh0dXJlXCI7XHJcbmltcG9ydCB7IGdlbmVyYXRlTm9ybWFscywgZ2x0ZkVudW0sIG5ld1R5cGVkQXJyYXksIHRvSW5kaWNlcywgVHlwZWRBcnJheSB9IGZyb20gXCIuLi91dGlscy9nbHRmVXRpbHNcIjtcclxuaW1wb3J0IHsgQWNjZXNzb3IgfSBmcm9tIFwiLi9nbHRmL2xpYnMvQWNjZXNzb3JcIjtcclxuaW1wb3J0IHsgQW5pbWF0aW9uIH0gZnJvbSBcIi4vZ2x0Zi9saWJzL0FuaW1hdGlvblwiO1xyXG5pbXBvcnQgeyBBbmltYXRpb25DaGFubmVsIH0gZnJvbSBcIi4vZ2x0Zi9saWJzL0FuaW1hdGlvbkNoYW5uZWxcIjtcclxuaW1wb3J0IHsgQW5pbWF0aW9uQ2hhbm5lbFRhcmdldCB9IGZyb20gXCIuL2dsdGYvbGlicy9BbmltYXRpb25DaGFubmVsVGFyZ2V0XCI7XHJcbmltcG9ydCB7IEFuaW1hdGlvblNhbXBsZXIgfSBmcm9tIFwiLi9nbHRmL2xpYnMvQW5pbWF0aW9uU2FtcGxlclwiO1xyXG5cclxuZXhwb3J0IHR5cGUgR0xURlByaW1pdGl2ZSA9IHtcclxuXHR2ZXJ0ZXhDb3VudDogbnVtYmVyO1xyXG5cdGluZGljZXM6IFVpbnQxNkFycmF5IHwgVWludDMyQXJyYXkgfCBudWxsO1xyXG5cdHBvc2l0aW9uczogVHlwZWRBcnJheTtcclxuXHRub3JtYWxzOiBUeXBlZEFycmF5O1xyXG5cdHV2czogVHlwZWRBcnJheSB8IG51bGw7XHJcblx0dXYxczogVHlwZWRBcnJheSB8IG51bGw7XHJcblx0dGFuZ2VudHM6IFR5cGVkQXJyYXkgfCBudWxsO1xyXG5cdGNvbG9yczogVHlwZWRBcnJheSB8IG51bGw7XHJcblx0bWF0ZXJpYWw6IGFueTtcclxuXHRib3VuZGluZ0JveDoge1xyXG5cdFx0bWF4OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XHJcblx0XHRtaW46IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcclxuXHR9O1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgR0xURk1lc2ggPSBBcnJheTxHTFRGUHJpbWl0aXZlPjtcclxuXHJcbmV4cG9ydCB0eXBlIEdMVEZBbmltYXRpb24gPSB7XHJcblx0Y2hhbm5lbHM6IEFycmF5PHtcclxuXHRcdGlucHV0OiBUeXBlZEFycmF5O1xyXG5cdFx0b3V0cHV0OiBUeXBlZEFycmF5O1xyXG5cdFx0aW50ZXJwb2xhdGlvbjogc3RyaW5nO1xyXG5cdFx0bm9kZTogbnVtYmVyO1xyXG5cdFx0cGF0aDogc3RyaW5nO1xyXG5cdH0+O1xyXG5cdGxlbmd0aDogbnVtYmVyO1xyXG59O1xyXG5cclxuZXhwb3J0IGNsYXNzIEdMVEYge1xyXG5cdHNjZW5lczogQXJyYXk8Tm9kZT47XHJcblxyXG5cdG5vZGVzOiBBcnJheTxhbnk+O1xyXG5cclxuXHRjYW1lcmFzOiBBcnJheTxhbnk+O1xyXG5cclxuXHRtZXNoZXM6IEFycmF5PGFueT47XHJcblxyXG5cdGltYWdlczogQXJyYXk8SW1hZ2VCaXRtYXA+O1xyXG5cclxuXHRhbmltYXRpb25zOiBBcnJheTxHTFRGQW5pbWF0aW9uPjtcclxuXHJcblx0cHJpdmF0ZSBnbGJPZmZzZXQ6IG51bWJlcjtcclxuXHJcblx0cHJpdmF0ZSBidWZmZXJzOiBBcnJheUJ1ZmZlcltdO1xyXG5cclxuXHRwcml2YXRlIGJ1ZmZlclZpZXdzOiBhbnk7XHJcblxyXG5cdGFjY2Vzc29yczogYW55O1xyXG5cclxuXHRqc29uOiBhbnk7XHJcblxyXG5cdHByaXZhdGUgbWF0ZXJpYWxzOiBhbnk7XHJcblxyXG5cdHByaXZhdGUgZ2xiQmluPzogQXJyYXlCdWZmZXI7XHJcblxyXG5cdHByaXZhdGUgcm9vdFVybDogc3RyaW5nO1xyXG5cclxuXHR0ZXh0dXJlczogYW55W107XHJcblxyXG5cdHNhbXBsZXJzOiBTYW1wbGVyW107XHJcblxyXG5cdGNvbnN0cnVjdG9yKGpzb246IGFueSwgcm9vdFVybDogc3RyaW5nLCBnbGJPZmZzZXQgPSAwLCBnbGJCaW4/OiBBcnJheUJ1ZmZlcikge1xyXG5cdFx0dGhpcy5qc29uID0ganNvbjtcclxuXHRcdHRoaXMuYnVmZmVyVmlld3MgPSBqc29uLmJ1ZmZlclZpZXdzO1xyXG5cdFx0dGhpcy5nbGJPZmZzZXQgPSBnbGJPZmZzZXQ7XHJcblx0XHR0aGlzLnJvb3RVcmwgPSByb290VXJsO1xyXG5cdFx0dGhpcy5zY2VuZXMgPSBqc29uLnNjZW5lcztcclxuXHRcdHRoaXMuY2FtZXJhcyA9IGpzb24uY2FtZXJhcyB8fCBbXTtcclxuXHRcdHRoaXMuZ2xiQmluID0gZ2xiQmluO1xyXG5cdFx0dGhpcy5tZXNoZXMgPSBbXTtcclxuXHR9XHJcblx0YXN5bmMgcGFyc2VEYXRhKCkge1xyXG5cdFx0dGhpcy5idWZmZXJzID0gYXdhaXQgdGhpcy5sb2FkQnVmZmVzKCk7XHJcblx0XHR0aGlzLmltYWdlcyA9IGF3YWl0IHRoaXMubG9hZEltYWdlcygpO1xyXG5cdFx0dGhpcy5wYXJzZVNhbXBsZXJzKCk7XHJcblx0XHR0aGlzLnBhcnNlVGV4dHVyZXMoKTtcclxuXHRcdHRoaXMucGFyc2VNYXRlcmlhbHMoKTtcclxuXHRcdHRoaXMucGFyc2VBY2Nlc3NvcnMoKTtcclxuXHRcdHRoaXMucGFyc2VNZXNocygpO1xyXG5cdFx0dGhpcy5wYXJzZU5vZGVzKCk7XHJcblx0XHR0aGlzLm5vcm1hbGl6ZURhdGEoKTtcclxuXHRcdHRoaXMucGFyc2VTY2VuZXMoKTtcclxuXHRcdHRoaXMucGFyc2VBbmltYXRpb25zKCk7XHJcblx0fVxyXG5cdHByaXZhdGUgZ2V0QWNjZXNzb3IoaW5kZXg6IG51bWJlcikge1xyXG5cdFx0cmV0dXJuIHRoaXMuYWNjZXNzb3JzW2luZGV4XTtcclxuXHR9XHJcblx0cHJpdmF0ZSBwYXJzZVNhbXBsZXJzKCkge1xyXG5cdFx0dGhpcy5zYW1wbGVycyA9IHRoaXMuanNvbi5zYW1wbGVyc1xyXG5cdFx0XHQ/ICh0aGlzLmpzb24uc2FtcGxlcnMgYXMgQXJyYXk8YW55PikubWFwKChzYW1wbGVyKSA9PiB0aGlzLmdldFNhbXBsZXIoc2FtcGxlcikpXHJcblx0XHRcdDogW107XHJcblx0fVxyXG5cdHByaXZhdGUgcGFyc2VTY2VuZXMoKSB7XHJcblx0XHR0aGlzLnNjZW5lcyA9IHRoaXMuanNvbi5zY2VuZXMubWFwKChzY2VuZSkgPT4ge1xyXG5cdFx0XHRjb25zdCBub2RlcyA9IHNjZW5lPy5ub2Rlcz8ubWFwKChub2RlSWQpID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5ub2Rlc1tub2RlSWRdO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0cmV0dXJuIG5vZGVzO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdHByaXZhdGUgcGFyc2VUZXh0dXJlcygpIHtcclxuXHRcdHRoaXMudGV4dHVyZXMgPSB0aGlzLmpzb24udGV4dHVyZXNcclxuXHRcdFx0PyAodGhpcy5qc29uLnRleHR1cmVzIGFzIEFycmF5PGFueT4pLm1hcCgodGV4dHVyZSkgPT4ge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0c2FtcGxlcjogdGV4dHVyZS5zYW1wbGVyICE9PSB1bmRlZmluZWQgPyB0aGlzLnNhbXBsZXJzW3RleHR1cmUuc2FtcGxlcl0gOiB0aGlzLmdldFNhbXBsZXIoe30pLFxyXG5cdFx0XHRcdFx0XHR0ZXh0dXJlOiB0aGlzLmNyZWF0ZVRleHR1cmUodGV4dHVyZS5zb3VyY2UpXHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHQgIH0pXHJcblx0XHRcdDogW107XHJcblx0fVxyXG5cdHByaXZhdGUgcGFyc2VNYXRlcmlhbHMoKSB7XHJcblx0XHR0aGlzLm1hdGVyaWFscyA9IHRoaXMuanNvbi5tYXRlcmlhbHNcclxuXHRcdFx0PyAodGhpcy5qc29uLm1hdGVyaWFscyBhcyBBcnJheTxhbnk+KS5tYXAoKG1hdGVyaWFsKSA9PiB7XHJcblx0XHRcdFx0XHRjb25zdCBtYXQgPSBuZXcgUGJyTWF0ZXJpYWwoKTtcclxuXHRcdFx0XHRcdGNvbnN0IHtcclxuXHRcdFx0XHRcdFx0YmFzZUNvbG9yRmFjdG9yLFxyXG5cdFx0XHRcdFx0XHRtZXRhbGxpY0ZhY3RvcixcclxuXHRcdFx0XHRcdFx0bWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlLFxyXG5cdFx0XHRcdFx0XHRiYXNlQ29sb3JUZXh0dXJlLFxyXG5cdFx0XHRcdFx0XHRyb3VnaG5lc3NGYWN0b3JcclxuXHRcdFx0XHRcdH0gPSBtYXRlcmlhbC5wYnJNZXRhbGxpY1JvdWdobmVzcztcclxuXHRcdFx0XHRcdGlmIChtYXRlcmlhbC5ub3JtYWxUZXh0dXJlKSBtYXQubm9ybWFsVGV4dHVyZSA9IHRoaXMudGV4dHVyZXNbbWF0ZXJpYWwubm9ybWFsVGV4dHVyZS5pbmRleF0udGV4dHVyZTtcclxuXHRcdFx0XHRcdGlmIChtYXRlcmlhbC5vY2NsdXNpb25UZXh0dXJlKVxyXG5cdFx0XHRcdFx0XHRtYXQuYW9UZXh0dXJlID0gdGhpcy50ZXh0dXJlc1ttYXRlcmlhbC5vY2NsdXNpb25UZXh0dXJlLmluZGV4XS50ZXh0dXJlO1xyXG5cdFx0XHRcdFx0aWYgKG1hdGVyaWFsLmVtaXNzaXZlVGV4dHVyZSlcclxuXHRcdFx0XHRcdFx0bWF0LmVtaXNzaXZlVGV4dHVyZSA9IHRoaXMudGV4dHVyZXNbbWF0ZXJpYWwuZW1pc3NpdmVUZXh0dXJlLmluZGV4XS50ZXh0dXJlO1xyXG5cdFx0XHRcdFx0aWYgKGJhc2VDb2xvclRleHR1cmUpIG1hdC5iYXNlVGV4dHVyZSA9IHRoaXMudGV4dHVyZXNbYmFzZUNvbG9yVGV4dHVyZS5pbmRleF0udGV4dHVyZTtcclxuXHRcdFx0XHRcdGlmIChtZXRhbGxpY1JvdWdobmVzc1RleHR1cmUpXHJcblx0XHRcdFx0XHRcdG1hdC5tZXRhbG5lc3NSb3VnaG5lc3NUZXh0dXJlID0gdGhpcy50ZXh0dXJlc1ttZXRhbGxpY1JvdWdobmVzc1RleHR1cmUuaW5kZXhdLnRleHR1cmU7XHJcblx0XHRcdFx0XHRpZiAoYmFzZUNvbG9yRmFjdG9yKVxyXG5cdFx0XHRcdFx0XHRtYXQuY29sb3IgPSBuZXcgQ29sb3IoYmFzZUNvbG9yRmFjdG9yWzBdLCBiYXNlQ29sb3JGYWN0b3JbMV0sIGJhc2VDb2xvckZhY3RvclsyXSk7XHJcblx0XHRcdFx0XHRtYXQubWV0YWxuZXNzID0gbWV0YWxsaWNGYWN0b3IgPz8gMS4wO1xyXG5cdFx0XHRcdFx0bWF0LnJvdWdobmVzcyA9IHJvdWdobmVzc0ZhY3RvciA/PyAwLjA7XHJcblx0XHRcdFx0XHRtYXQuYmFzZVNhbXBsZXIgPSBuZXcgU2FtcGxlcih7XHJcblx0XHRcdFx0XHRcdG1hZ0ZpbHRlcjogXCJsaW5lYXJcIixcclxuXHRcdFx0XHRcdFx0bWluRmlsdGVyOiBcImxpbmVhclwiLFxyXG5cdFx0XHRcdFx0XHRhZGRyZXNzTW9kZVU6IFwicmVwZWF0XCIsXHJcblx0XHRcdFx0XHRcdGFkZHJlc3NNb2RlVjogXCJyZXBlYXRcIlxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRyZXR1cm4gbWF0O1xyXG5cdFx0XHQgIH0pXHJcblx0XHRcdDogW107XHJcblx0fVxyXG5cdHByaXZhdGUgcGFyc2VBY2Nlc3NvcnMoKSB7XHJcblx0XHR0aGlzLmFjY2Vzc29ycyA9ICh0aGlzLmpzb24uYWNjZXNzb3JzIGFzIEFycmF5PGFueT4pLm1hcCgoYWNjZXNzb3IsIGluZGV4KSA9PiB7XHJcblx0XHRcdGNvbnN0IG4gPSBnbHRmRW51bVthY2Nlc3Nvci50eXBlXSBhcyBudW1iZXI7XHJcblx0XHRcdGxldCBhcnJheTtcclxuXHRcdFx0aWYgKGFjY2Vzc29yLmJ1ZmZlclZpZXcgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdGFycmF5ID0gbmV3VHlwZWRBcnJheShcclxuXHRcdFx0XHRcdGFjY2Vzc29yLmNvbXBvbmVudFR5cGUsXHJcblx0XHRcdFx0XHRuZXcgQXJyYXlCdWZmZXIobiAqIGFjY2Vzc29yLmNvdW50ICogKGdsdGZFbnVtW2FjY2Vzc29yLmNvbXBvbmVudFR5cGVdIGFzIG51bWJlcikpLFxyXG5cdFx0XHRcdFx0MCxcclxuXHRcdFx0XHRcdGFjY2Vzc29yLmNvdW50ICogblxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0YXJyYXkgPSB0aGlzLmdldEJ1ZmZlclZpZXcoYWNjZXNzb3IsIG4pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoYWNjZXNzb3Iuc3BhcnNlKSB7XHJcblx0XHRcdFx0YWNjZXNzb3Iuc3BhcnNlLmluZGljZXMuY291bnQgPSBhY2Nlc3Nvci5zcGFyc2UuY291bnQ7XHJcblx0XHRcdFx0YWNjZXNzb3Iuc3BhcnNlLnZhbHVlcy5jb3VudCA9IGFjY2Vzc29yLnNwYXJzZS5jb3VudDtcclxuXHRcdFx0XHRhY2Nlc3Nvci5zcGFyc2UudmFsdWVzLmNvbXBvbmVudFR5cGUgPSBhY2Nlc3Nvci5jb21wb25lbnRUeXBlO1xyXG5cdFx0XHRcdGNvbnN0IGluZGljZXMgPSB0aGlzLmdldEJ1ZmZlclZpZXcoYWNjZXNzb3Iuc3BhcnNlLmluZGljZXMsIDEpO1xyXG5cdFx0XHRcdGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0QnVmZmVyVmlldyhhY2Nlc3Nvci5zcGFyc2UudmFsdWVzLCBuKTtcclxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFjY2Vzc29yLnNwYXJzZS5jb3VudDsgaSArPSAxKSB7XHJcblx0XHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IG47IGogKz0gMSkge1xyXG5cdFx0XHRcdFx0XHRhcnJheVtpbmRpY2VzW2ldICogbiArIGpdID0gdmFsdWVzW2kgKiBuICsgal07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBuZXcgQWNjZXNzb3Ioe1xyXG5cdFx0XHRcdGNvbXBvbmVudFR5cGU6IDxudW1iZXI+Z2x0ZkVudW1bYWNjZXNzb3IuY29tcG9uZW50VHlwZV0sXHJcblx0XHRcdFx0Y291bnQ6IGFjY2Vzc29yLmNvdW50LFxyXG5cdFx0XHRcdHR5cGU6IG4sXHJcblx0XHRcdFx0dmFsdWVzOiBhcnJheSxcclxuXHRcdFx0XHRpZDogaW5kZXgsXHJcblx0XHRcdFx0bWluOiBhY2Nlc3Nvcj8ubWluLFxyXG5cdFx0XHRcdG1heDogYWNjZXNzb3I/Lm1heFxyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHRwcml2YXRlIHBhcnNlQW5pbWF0aW9ucygpIHtcclxuXHRcdHRoaXMuYW5pbWF0aW9ucyA9IHRoaXM/Lmpzb24/LmFuaW1hdGlvbnM/Lm1hcCgoZ2x0ZkFuaW1hdGlvbiwgaW5kZXgpID0+IHtcclxuXHRcdFx0Y29uc3Qgc2FtcGxlcnMgPSBnbHRmQW5pbWF0aW9uPy5zYW1wbGVycz8ubWFwKChnbHRmU2FtcGxlcikgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHNhbXBsZXIgPSBuZXcgQW5pbWF0aW9uU2FtcGxlcigpO1xyXG5cdFx0XHRcdHNhbXBsZXIuZm9ybUdsdGYodGhpcywgZ2x0ZlNhbXBsZXIpO1xyXG5cdFx0XHRcdHJldHVybiBzYW1wbGVyO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0Y29uc3QgY2hhbm5lbHMgPSBnbHRmQW5pbWF0aW9uPy5jaGFubmVscz8ubWFwKChnbHRmQ2hhbm5lbCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGFuaW1hdGlvbkNoYW5uZWwgPSBuZXcgQW5pbWF0aW9uQ2hhbm5lbCgpO1xyXG5cdFx0XHRcdGFuaW1hdGlvbkNoYW5uZWwuc2FtcGxlciA9IHNhbXBsZXJzW2dsdGZDaGFubmVsLnNhbXBsZXJdO1xyXG5cdFx0XHRcdGFuaW1hdGlvbkNoYW5uZWwudGFyZ2V0ID0gbmV3IEFuaW1hdGlvbkNoYW5uZWxUYXJnZXQoXHJcblx0XHRcdFx0XHR0aGlzLm5vZGVzW2dsdGZDaGFubmVsLnRhcmdldC5ub2RlXSxcclxuXHRcdFx0XHRcdGdsdGZDaGFubmVsLnRhcmdldC5wYXRoXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRyZXR1cm4gYW5pbWF0aW9uQ2hhbm5lbDtcclxuXHRcdFx0fSk7XHJcblx0XHRcdGNvbnN0IGFuaW1hdGlvbiA9IG5ldyBBbmltYXRpb24oaW5kZXgudG9TdHJpbmcoKSwgc2FtcGxlcnMsIGNoYW5uZWxzKTtcclxuXHRcdFx0cmV0dXJuIGFuaW1hdGlvbjtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHRwcml2YXRlIHBhcnNlTWVzaHMoKSB7XHJcblx0XHR0aGlzLm1lc2hlcyA9IHRoaXM/Lmpzb24/Lm1lc2hlcz8ubWFwPy4oKGdsdGZtZXNoKSA9PiB7XHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0bmFtZTogZ2x0Zm1lc2gubmFtZSxcclxuXHRcdFx0XHRwcmltaXRpdmVzOiBnbHRmbWVzaD8ucHJpbWl0aXZlcz8ubWFwPy4oKHByaW1pdGl2ZSkgPT4ge1xyXG5cdFx0XHRcdFx0Y29uc3QgbWF0ZXJpYWwgPVxyXG5cdFx0XHRcdFx0XHRwcmltaXRpdmUubWF0ZXJpYWwgIT09IHVuZGVmaW5lZFxyXG5cdFx0XHRcdFx0XHRcdD8gdGhpcy5tYXRlcmlhbHNbcHJpbWl0aXZlLm1hdGVyaWFsXVxyXG5cdFx0XHRcdFx0XHRcdDogeyBwYnJNZXRhbGxpY1JvdWdobmVzczoge30gfTtcclxuXHRcdFx0XHRcdGNvbnN0IGdlbyA9IHRoaXMuY3JlYXRlR2VvbWV0cnkocHJpbWl0aXZlLCBtYXRlcmlhbCk7XHJcblx0XHRcdFx0XHRjb25zdCBtZXNoID0gbmV3IE1lc2goZ2VvLCBtYXRlcmlhbCk7XHJcblx0XHRcdFx0XHRtZXNoLm5hbWUgPSBnbHRmbWVzaC5uYW1lO1xyXG5cdFx0XHRcdFx0cmV0dXJuIG1lc2g7XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0fTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHRwcml2YXRlIGdldFNhbXBsZXIoc2FtcGxlckpzb246IGFueSkge1xyXG5cdFx0cmV0dXJuIG5ldyBTYW1wbGVyKHtcclxuXHRcdFx0bWFnRmlsdGVyOiBnbHRmRW51bVtzYW1wbGVySnNvbi5tYWdGaWx0ZXIgfHwgOTcyOV0gYXMgR1BVRmlsdGVyTW9kZSxcclxuXHRcdFx0bWluRmlsdGVyOiBnbHRmRW51bVtzYW1wbGVySnNvbi5taW5GaWx0ZXIgfHwgOTcyOV0gYXMgR1BVRmlsdGVyTW9kZSxcclxuXHRcdFx0YWRkcmVzc01vZGVVOiBnbHRmRW51bVtzYW1wbGVySnNvbi53cmFwUyB8fCAxMDQ5N10gYXMgR1BVQWRkcmVzc01vZGUsXHJcblx0XHRcdGFkZHJlc3NNb2RlVjogZ2x0ZkVudW1bc2FtcGxlckpzb24ud3JhcFQgfHwgMTA0OTddIGFzIEdQVUFkZHJlc3NNb2RlXHJcblx0XHR9KTtcclxuXHR9XHJcblx0cHJpdmF0ZSBnZXRCdWZmZXJWaWV3KGFjY2Vzc29yOiBhbnksIG46IG51bWJlcikge1xyXG5cdFx0Y29uc3QgYnVmZmVyVmlldyA9IHRoaXMuYnVmZmVyVmlld3NbYWNjZXNzb3IuYnVmZmVyVmlld107XHJcblx0XHRjb25zdCBvZmZzZXQgPSAoYnVmZmVyVmlldy5ieXRlT2Zmc2V0IHx8IDApICsgKGFjY2Vzc29yLmJ5dGVPZmZzZXQgfHwgMCk7XHJcblx0XHRjb25zdCBzdHJpZGUgPSBNYXRoLm1heChidWZmZXJWaWV3LmJ5dGVTdHJpZGUgLyA0IHx8IDAsIG4pO1xyXG5cdFx0bGV0IGFycmF5ID0gbmV3VHlwZWRBcnJheShcclxuXHRcdFx0YWNjZXNzb3IuY29tcG9uZW50VHlwZSxcclxuXHRcdFx0dGhpcy5idWZmZXJzW2J1ZmZlclZpZXcuYnVmZmVyXSxcclxuXHRcdFx0YnVmZmVyVmlldy5idWZmZXIgPT09IDAgPyBvZmZzZXQgKyB0aGlzLmdsYk9mZnNldCA6IG9mZnNldCxcclxuXHRcdFx0KGFjY2Vzc29yLmNvdW50IC0gMSkgKiBzdHJpZGUgKyBuXHJcblx0XHQpO1xyXG5cdFx0aWYgKHN0cmlkZSA+IG4pIHtcclxuXHRcdFx0Y29uc3QgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gYXJyYXkuY29uc3RydWN0b3IgYXMge1xyXG5cdFx0XHRcdG5ldyAoLi4uYXJnczogYW55KTogVHlwZWRBcnJheTtcclxuXHRcdFx0fTtcclxuXHRcdFx0Y29uc3Qgc3RyaWRlZCA9IG5ldyBUeXBlZEFycmF5Q29uc3RydWN0b3IoYWNjZXNzb3IuY291bnQgKiBuKTtcclxuXHRcdFx0Zm9yIChsZXQgaSA9IDAsIGogPSAwOyBpIDwgc3RyaWRlZC5sZW5ndGg7IGkgKz0gbiwgaiArPSBzdHJpZGUpIHtcclxuXHRcdFx0XHRmb3IgKGxldCBrID0gMDsgayA8IG47IGsgKz0gMSkge1xyXG5cdFx0XHRcdFx0c3RyaWRlZFtpICsga10gPSBhcnJheVtqICsga107XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGFycmF5ID0gc3RyaWRlZDtcclxuXHRcdH1cclxuXHRcdHJldHVybiBhcnJheTtcclxuXHR9XHJcblx0cHJpdmF0ZSBjcmVhdGVHZW9tZXRyeShwcmltaXRpdmUsIG1hdGVyaWFsKSB7XHJcblx0XHRsZXQgaW5kaWNlcyA9IG51bGw7XHJcblx0XHRsZXQgYWNjZXNzb3IgPSBudWxsO1xyXG5cdFx0Y29uc3QgZGVmaW5lczogeyBbcHJvcDogc3RyaW5nXTogYm9vbGVhbiB8IG51bWJlciB9ID0geyBIQVNfTk9STUFMOiB0cnVlIH07XHJcblx0XHRsZXQgdmVydGV4Q291bnQ7XHJcblx0XHRhY2Nlc3NvciA9IHRoaXMuZ2V0QWNjZXNzb3IocHJpbWl0aXZlLmF0dHJpYnV0ZXMuUE9TSVRJT04pO1xyXG5cdFx0Y29uc3QgcG9zaXRpb25zID0gYWNjZXNzb3IuZ2V0QXJyYXkoKTtcclxuXHRcdHZlcnRleENvdW50ID0gYWNjZXNzb3IuY291bnQ7XHJcblx0XHQvLyBjb25zdCB7IG1heCwgbWluIH0gPSBhY2Nlc3NvcjtcclxuXHRcdC8vIGNvbnN0IGJvdW5kaW5nQm94ID0geyBtYXgsIG1pbiB9O1xyXG5cdFx0aWYgKHByaW1pdGl2ZS5pbmRpY2VzICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0YWNjZXNzb3IgPSB0aGlzLmdldEFjY2Vzc29yKHByaW1pdGl2ZS5pbmRpY2VzKTtcclxuXHRcdFx0aW5kaWNlcyA9IHRvSW5kaWNlcyhhY2Nlc3Nvci5nZXRBcnJheSgpKTtcclxuXHRcdFx0dmVydGV4Q291bnQgPSBhY2Nlc3Nvci5jb3VudDtcclxuXHRcdH1cclxuXHRcdGxldCBub3JtYWxzO1xyXG5cclxuXHRcdGlmIChwcmltaXRpdmUuYXR0cmlidXRlcy5OT1JNQUwgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRhY2Nlc3NvciA9IHRoaXMuZ2V0QWNjZXNzb3IocHJpbWl0aXZlLmF0dHJpYnV0ZXMuTk9STUFMKTtcclxuXHRcdFx0bm9ybWFscyA9IGFjY2Vzc29yLmdldEFycmF5KCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRub3JtYWxzID0gZ2VuZXJhdGVOb3JtYWxzKGluZGljZXMsIHBvc2l0aW9ucyk7XHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IHV2cyA9IG51bGw7XHJcblx0XHRpZiAocHJpbWl0aXZlLmF0dHJpYnV0ZXMuVEVYQ09PUkRfMCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGFjY2Vzc29yID0gdGhpcy5nZXRBY2Nlc3NvcihwcmltaXRpdmUuYXR0cmlidXRlcy5URVhDT09SRF8wKTtcclxuXHRcdFx0dXZzID0gYWNjZXNzb3IuZ2V0QXJyYXkoKTtcclxuXHRcdFx0ZGVmaW5lcy5IQVNfVVYgPSB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0bGV0IHV2MXMgPSBudWxsO1xyXG5cdFx0aWYgKHByaW1pdGl2ZS5hdHRyaWJ1dGVzLlRFWENPT1JEXzEgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRhY2Nlc3NvciA9IHRoaXMuZ2V0QWNjZXNzb3IocHJpbWl0aXZlLmF0dHJpYnV0ZXMuVEVYQ09PUkRfMSk7XHJcblx0XHRcdHV2MXMgPSBhY2Nlc3Nvci5nZXRBcnJheSgpO1xyXG5cdFx0XHRkZWZpbmVzLkhBU19VVjEgPSB0cnVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGxldCB0YW5nZW50cyA9IG51bGw7XHJcblx0XHRpZiAocHJpbWl0aXZlLmF0dHJpYnV0ZXMuVEFOR0VOVCAhPT0gdW5kZWZpbmVkICYmIHByaW1pdGl2ZS5hdHRyaWJ1dGVzLk5PUk1BTCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGFjY2Vzc29yID0gdGhpcy5nZXRBY2Nlc3NvcihwcmltaXRpdmUuYXR0cmlidXRlcy5UQU5HRU5UKTtcclxuXHRcdFx0dGFuZ2VudHMgPSBhY2Nlc3Nvci5nZXRBcnJheSgpO1xyXG5cdFx0XHQvLyBkZWZpbmVzLkhBU19UQU5HRU5UID0gdHJ1ZTtcclxuXHRcdH0gZWxzZSBpZiAobWF0ZXJpYWwubm9ybWFsVGV4dHVyZSkge1xyXG5cdFx0XHQvLyB0YW5nZW50cyA9IGdlbmVyYXRlVGFuZ2VudHMoaW5kaWNlcywgcG9zaXRpb25zLCBub3JtYWxzLCB1dnMhKTtcclxuXHRcdH1cclxuXHRcdGxldCBjb2xvcnMgPSBudWxsLFxyXG5cdFx0XHRjb2xvclNpemUgPSAzO1xyXG5cdFx0aWYgKHByaW1pdGl2ZS5hdHRyaWJ1dGVzLkNPTE9SXzAgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRhY2Nlc3NvciA9IHRoaXMuYWNjZXNzb3JzW3ByaW1pdGl2ZS5hdHRyaWJ1dGVzLkNPTE9SXzBdO1xyXG5cdFx0XHRjb2xvcnMgPSBhY2Nlc3Nvci5nZXRBcnJheSgpO1xyXG5cdFx0XHRjb2xvclNpemUgPSBhY2Nlc3Nvci50eXBlO1xyXG5cdFx0XHRkZWZpbmVzLkhBU19DT0xPUiA9IHRydWU7XHJcblx0XHR9XHJcblx0XHRsZXQgam9pbnRzID0gbnVsbDtcclxuXHRcdGlmIChwcmltaXRpdmUuYXR0cmlidXRlcy5KT0lOVFNfMCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGFjY2Vzc29yID0gdGhpcy5nZXRBY2Nlc3NvcihwcmltaXRpdmUuYXR0cmlidXRlcy5KT0lOVFNfMCk7XHJcblx0XHRcdGpvaW50cyA9IGFjY2Vzc29yLmdldEFycmF5KCk7XHJcblx0XHRcdGRlZmluZXMuSEFTX1NLSU4gPSB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0bGV0IHdlaWdodHMgPSBudWxsO1xyXG5cdFx0aWYgKHByaW1pdGl2ZS5hdHRyaWJ1dGVzLldFSUdIVFNfMCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGFjY2Vzc29yID0gdGhpcy5nZXRBY2Nlc3NvcihwcmltaXRpdmUuYXR0cmlidXRlcy5XRUlHSFRTXzApO1xyXG5cdFx0XHR3ZWlnaHRzID0gYWNjZXNzb3IuZ2V0QXJyYXkoKTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGdlbyA9IG5ldyBHZW9tZXRyeSh7IHR5cGU6IFwicGJyR2VvbXRyeVwiIH0pO1xyXG5cdFx0aWYgKGluZGljZXMpIGdlby5zZXRJbmRpY2UoaW5kaWNlcyk7XHJcblx0XHRpZiAocG9zaXRpb25zKSBnZW8uc2V0QXR0cmlidXRlKG5ldyBGbG9hdDMyQXR0cmlidXRlKFwicG9zaXRpb25cIiwgQXJyYXkuZnJvbShwb3NpdGlvbnMpLCAzKSk7XHJcblx0XHRpZiAobm9ybWFscykgZ2VvLnNldEF0dHJpYnV0ZShuZXcgRmxvYXQzMkF0dHJpYnV0ZShcIm5vcm1hbFwiLCBBcnJheS5mcm9tKG5vcm1hbHMpLCAzKSk7XHJcblx0XHRpZiAoY29sb3JzKSBnZW8uc2V0QXR0cmlidXRlKG5ldyBGbG9hdDMyQXR0cmlidXRlKFwiY29sb3JcIiwgQXJyYXkuZnJvbShjb2xvcnMpLCBjb2xvclNpemUpKTtcclxuXHRcdGlmICh1dnMpIGdlby5zZXRBdHRyaWJ1dGUobmV3IEZsb2F0MzJBdHRyaWJ1dGUoXCJ1dlwiLCBBcnJheS5mcm9tKHV2cyksIDIpKTtcclxuXHRcdGlmIChqb2ludHMpIGdlby5zZXRBdHRyaWJ1dGUobmV3IEZsb2F0MzJBdHRyaWJ1dGUoXCJqb2ludDBcIiwgQXJyYXkuZnJvbShqb2ludHMpLCA0KSk7XHJcblx0XHRpZiAod2VpZ2h0cykgZ2VvLnNldEF0dHJpYnV0ZShuZXcgRmxvYXQzMkF0dHJpYnV0ZShcIndlaWdodDBcIiwgQXJyYXkuZnJvbSh3ZWlnaHRzKSwgNCkpO1xyXG5cdFx0Z2VvLmRlZmluZXMgPSBkZWZpbmVzO1xyXG5cdFx0Z2VvLmNvbXB1dGVCb3VuZGluZ1NwaGVyZShBcnJheS5mcm9tKHBvc2l0aW9ucykpO1xyXG5cdFx0Z2VvLmNvdW50ID0gdmVydGV4Q291bnQ7XHJcblx0XHRyZXR1cm4gZ2VvO1xyXG5cdH1cclxuXHRwcml2YXRlIGNyZWF0ZVRleHR1cmUoc291cmNlOiBudW1iZXIpIHtcclxuXHRcdHJldHVybiBuZXcgVGV4dHVyZSh7XHJcblx0XHRcdHNpemU6IHtcclxuXHRcdFx0XHR3aWR0aDogdGhpcy5pbWFnZXNbc291cmNlXS53aWR0aCxcclxuXHRcdFx0XHRoZWlnaHQ6IHRoaXMuaW1hZ2VzW3NvdXJjZV0uaGVpZ2h0LFxyXG5cdFx0XHRcdGRlcHRoOiAxXHJcblx0XHRcdH0sXHJcblx0XHRcdGRhdGE6IHtcclxuXHRcdFx0XHRzb3VyY2U6IHRoaXMuaW1hZ2VzW3NvdXJjZV1cclxuXHRcdFx0fSxcclxuXHRcdFx0Zm9ybWF0OiBcInJnYmE4dW5vcm1cIixcclxuXHRcdFx0dXNhZ2U6IEdQVVRleHR1cmVVc2FnZS5URVhUVVJFX0JJTkRJTkcgfCBHUFVUZXh0dXJlVXNhZ2UuQ09QWV9EU1QgfCBHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlRcclxuXHRcdH0pO1xyXG5cdH1cclxuXHRwcml2YXRlIGFzeW5jIGxvYWRJbWFnZXMoKSB7XHJcblx0XHRjb25zdCBpbWFnZXM6IEFycmF5PEltYWdlQml0bWFwPiA9IFtdO1xyXG5cdFx0bGV0IGxvYWRFeHRlcm5hbEltYWdlczogUHJvbWlzZTxhbnk+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcblx0XHRpZiAodGhpcy5qc29uLmltYWdlcykge1xyXG5cdFx0XHRsb2FkRXh0ZXJuYWxJbWFnZXMgPSBQcm9taXNlLmFsbChcclxuXHRcdFx0XHR0aGlzLmpzb24uaW1hZ2VzLm1hcChhc3luYyAoaW1hZ2U6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKGltYWdlLnVyaSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBpbWFnZVVybCA9IGltYWdlLnVyaS5zbGljZSgwLCA1KSA9PT0gXCJkYXRhOlwiID8gaW1hZ2UudXJpIDogYCR7dGhpcy5yb290VXJsfS8ke2ltYWdlLnVyaX1gO1xyXG5cdFx0XHRcdFx0XHRpbWFnZXNbaW5kZXhdID0gYXdhaXQgZmV0Y2goaW1hZ2VVcmwpXHJcblx0XHRcdFx0XHRcdFx0LnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ibG9iKCkpXHJcblx0XHRcdFx0XHRcdFx0LnRoZW4oKGJsb2IpID0+XHJcblx0XHRcdFx0XHRcdFx0XHRjcmVhdGVJbWFnZUJpdG1hcChibG9iLCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbG9yU3BhY2VDb252ZXJzaW9uOiBcIm5vbmVcIlxyXG5cdFx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblx0XHRsZXQgbG9hZEludGVybmFsSW1hZ2VzOiBQcm9taXNlPGFueT4gPSBQcm9taXNlLnJlc29sdmUoKTtcclxuXHRcdGlmICh0aGlzLmpzb24uaW1hZ2VzKSB7XHJcblx0XHRcdGxvYWRJbnRlcm5hbEltYWdlcyA9IFByb21pc2UuYWxsKFxyXG5cdFx0XHRcdHRoaXMuanNvbi5pbWFnZXMubWFwKGFzeW5jIChpbWFnZTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAoaW1hZ2UuYnVmZmVyVmlldyAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHsgYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoIH0gPSB0aGlzLmpzb24uYnVmZmVyVmlld3NbaW1hZ2UuYnVmZmVyVmlld107XHJcblx0XHRcdFx0XHRcdGNvbnN0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5idWZmZXJzW2J1ZmZlcl0sXHJcblx0XHRcdFx0XHRcdFx0YnVmZmVyID09PSAwID8gYnl0ZU9mZnNldCArIHRoaXMuZ2xiT2Zmc2V0IDogYnl0ZU9mZnNldCxcclxuXHRcdFx0XHRcdFx0XHRieXRlTGVuZ3RoXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdGxldCB0eXBlO1xyXG5cdFx0XHRcdFx0XHRpZiAoaW1hZ2UubWltZVR5cGUpIHtcclxuXHRcdFx0XHRcdFx0XHR0eXBlID0gaW1hZ2UubWltZVR5cGU7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0dHlwZSA9IGFycmF5WzBdID09PSAweGZmID8gXCJpbWFnZS9qcGVnXCIgOiBcImltYWdlL3BuZ1wiO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYXJyYXldLCB7IHR5cGUgfSk7XHJcblx0XHRcdFx0XHRcdGltYWdlc1tpbmRleF0gPSBhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChibG9iLCB7XHJcblx0XHRcdFx0XHRcdFx0Y29sb3JTcGFjZUNvbnZlcnNpb246IFwibm9uZVwiXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblxyXG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoW2xvYWRFeHRlcm5hbEltYWdlcywgbG9hZEludGVybmFsSW1hZ2VzXSk7XHJcblx0XHRyZXR1cm4gaW1hZ2VzO1xyXG5cdH1cclxuXHRwcml2YXRlIGFzeW5jIGxvYWRCdWZmZXMoKSB7XHJcblx0XHRjb25zdCBidWZmZXJzOiBBcnJheTxBcnJheUJ1ZmZlcj4gPSBbXTtcclxuXHRcdGF3YWl0IFByb21pc2UuYWxsKFxyXG5cdFx0XHR0aGlzLmpzb24uYnVmZmVycy5tYXAoKGJ1ZmZlcjogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcblx0XHRcdFx0aWYgKCFidWZmZXIudXJpKSB7XHJcblx0XHRcdFx0XHRpZiAoaW5kZXggIT09IDApIHtcclxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiYnVmZmVyIHVyaSB1bmRlZmluZWRcIik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRidWZmZXJzW2luZGV4XSA9IHRoaXMuZ2xiQmluITtcclxuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyVXJsID0gYnVmZmVyLnVyaS5zbGljZSgwLCA1KSA9PT0gXCJkYXRhOlwiID8gYnVmZmVyLnVyaSA6IGAke3RoaXMucm9vdFVybH0vJHtidWZmZXIudXJpfWA7XHJcblx0XHRcdFx0cmV0dXJuIGZldGNoKGJ1ZmZlclVybClcclxuXHRcdFx0XHRcdC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSlcclxuXHRcdFx0XHRcdC50aGVuKChhcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXIpID0+IHtcclxuXHRcdFx0XHRcdFx0YnVmZmVyc1tpbmRleF0gPSBhcnJheUJ1ZmZlcjtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHRcdHJldHVybiBidWZmZXJzO1xyXG5cdH1cclxuXHRwcml2YXRlIHBhcnNlTm9kZXMoKSB7XHJcblx0XHR0aGlzLm5vZGVzID0gdGhpcz8uanNvbj8ubm9kZXM/Lm1hcCgoZ2x0Zk5vZGUpID0+IHtcclxuXHRcdFx0Y29uc3Qgbm9kZSA9IG5ldyBOb2RlKCk7XHJcblx0XHRcdHRoaXMucGFyc2VOb2RlVFJTKG5vZGUsIGdsdGZOb2RlKTtcclxuXHRcdFx0aWYgKGdsdGZOb2RlLm5hbWUpIG5vZGUubmFtZSA9IGdsdGZOb2RlLm5hbWU7XHJcblx0XHRcdGlmIChnbHRmTm9kZS5tZXNoICE9IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdGxldCBnbHRmU2tpbiA9IHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdGlzU2tpbk1lc2ggPSBmYWxzZTtcclxuXHRcdFx0XHRpZiAoZ2x0Zk5vZGUuc2tpbiAhPSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdGdsdGZTa2luID0gdGhpcy5qc29uLnNraW5zW2dsdGZOb2RlLnNraW5dO1xyXG5cdFx0XHRcdFx0aXNTa2luTWVzaCA9IHRydWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMubWVzaGVzW2dsdGZOb2RlLm1lc2hdLnByaW1pdGl2ZXMuZm9yRWFjaCgocHJpbWl0aXZlOiBNZXNoLCBpbmRleDogbnVtYmVyLCBzb3VyY2U6IEFycmF5PE1lc2g+KSA9PiB7XHJcblx0XHRcdFx0XHRjb25zdCB0ZW1wUHJpbWl0aXZlID1cclxuXHRcdFx0XHRcdFx0aXNTa2luTWVzaCAmJiBwcmltaXRpdmUudHlwZSA9PSBSZW5kZXJPYmplY3RUeXBlLk1lc2hcclxuXHRcdFx0XHRcdFx0XHQ/IG5ldyBTS2luTWVzaChwcmltaXRpdmUuZ2VvbWV0cnksIHByaW1pdGl2ZS5tYXRlcmlhbClcclxuXHRcdFx0XHRcdFx0XHQ6IHByaW1pdGl2ZTtcclxuXHRcdFx0XHRcdGlmIChpc1NraW5NZXNoICYmIHByaW1pdGl2ZS50eXBlID09IFJlbmRlck9iamVjdFR5cGUuTWVzaCkge1xyXG5cdFx0XHRcdFx0XHRzb3VyY2VbaW5kZXhdID0gdGVtcFByaW1pdGl2ZTtcclxuXHRcdFx0XHRcdFx0dGVtcFByaW1pdGl2ZS5zZXRTa2luRGF0YSh7XHJcblx0XHRcdFx0XHRcdFx0aW52ZXJzZUJpbmRNYXRyaWNlczogdGhpcy5nZXRBY2Nlc3NvcihnbHRmU2tpbi5pbnZlcnNlQmluZE1hdHJpY2VzKS5nZXRNYXQ0QXJyYXkoKSxcclxuXHRcdFx0XHRcdFx0XHRqb2ludHM6IGdsdGZTa2luLmpvaW50c1xyXG5cdFx0XHRcdFx0XHRcdC8vIG5hbWU6IGdsdGZTa2luLm5hbWUsXHJcblx0XHRcdFx0XHRcdFx0Ly8gc2tlbGV0b246IGdsdGZTa2luLnNrZWxldG9uXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0bm9kZS5hZGQodGVtcFByaW1pdGl2ZSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIG5vZGU7XHJcblx0XHR9KTtcclxuXHR9XHJcblx0cHJpdmF0ZSBwYXJzZU5vZGVUUlMobm9kZTogTm9kZSwgZ2x0Zk5vZGU6IEdMVEZOb2RlUGFybXMpOiBOb2RlIHtcclxuXHRcdGxldCB7IG1hdHJpeCwgcm90YXRpb24sIHRyYW5zbGF0aW9uLCBzY2FsZSB9ID0gZ2x0Zk5vZGU7XHJcblx0XHRpZiAobWF0cml4KSB7XHJcblx0XHRcdGNvbnN0IHRlbXBNYXRyaXg0ID0gbmV3IE1hdHJpeDQoKSxcclxuXHRcdFx0XHR0ZW1wU2NhbGUgPSBuZXcgVmVjdG9yMygpLFxyXG5cdFx0XHRcdHRlbXBUcmFuc2xhdGlvbiA9IG5ldyBWZWN0b3IzKCksXHJcblx0XHRcdFx0dGVtcFJvdGF0aW9uID0gbmV3IFF1YXRlcm5pb24oKTtcclxuXHRcdFx0TWF0cml4NC5mcm9tQ29sdW1uTWFqb3JBcnJheShtYXRyaXgsIHRlbXBNYXRyaXg0KTtcclxuXHRcdFx0TWF0cml4NC5nZXRTY2FsZSh0ZW1wTWF0cml4NCwgdGVtcFNjYWxlKTtcclxuXHRcdFx0TWF0cml4NC5nZXRUcmFuc2xhdGlvbih0ZW1wTWF0cml4NCwgdGVtcFRyYW5zbGF0aW9uKTtcclxuXHRcdFx0TWF0cml4NC5nZXRSb3RhdGlvbih0ZW1wTWF0cml4NCwgdGVtcFJvdGF0aW9uKTtcclxuXHRcdFx0cm90YXRpb24gPSB0ZW1wUm90YXRpb24udG9BcnJheSgpO1xyXG5cdFx0XHR0cmFuc2xhdGlvbiA9IHRlbXBUcmFuc2xhdGlvbi50b0FycmF5KCk7XHJcblx0XHRcdHNjYWxlID0gdGVtcFNjYWxlLnRvQXJyYXkoKTtcclxuXHRcdH1cclxuXHRcdGlmIChyb3RhdGlvbikgbm9kZS5xdWF0ZXJuaW9uLnNldChyb3RhdGlvblswXSwgcm90YXRpb25bMV0sIHJvdGF0aW9uWzJdLCByb3RhdGlvblszXSk7XHJcblx0XHRpZiAodHJhbnNsYXRpb24pIG5vZGUucG9zaXRpb24uc2V0KHRyYW5zbGF0aW9uWzBdLCB0cmFuc2xhdGlvblsxXSwgdHJhbnNsYXRpb25bMl0pO1xyXG5cdFx0aWYgKHNjYWxlKSBub2RlLnNjYWxlLnNldChzY2FsZVswXSwgc2NhbGVbMV0sIHNjYWxlWzJdKTtcclxuXHRcdHJldHVybiBub2RlO1xyXG5cdH1cclxuXHRwcml2YXRlIG5vcm1hbGl6ZURhdGEoKSB7XHJcblx0XHR0aGlzPy5ub2Rlcz8ubWFwPy4oKG5vZGU6IE5vZGUsIGluZGV4KSA9PiB7XHJcblx0XHRcdHRoaXMuanNvbj8ubm9kZXNbaW5kZXhdPy5jaGlsZHJlbj8ubWFwKChub2RlSWQ6IG51bWJlcikgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGNoaWxkTm9kZSA9IHRoaXMubm9kZXNbbm9kZUlkXTtcclxuXHRcdFx0XHRub2RlLmFkZChjaGlsZE5vZGUpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdFx0dGhpcy5tZXNoZXMubWFwKChtZXNoKSA9PiB7XHJcblx0XHRcdG1lc2gucHJpbWl0aXZlcy5tYXAoKHByaW1pdGl2ZSkgPT4ge1xyXG5cdFx0XHRcdGlmIChwcmltaXRpdmUudHlwZSA9PSBSZW5kZXJPYmplY3RUeXBlLlNraW5NZXNoKVxyXG5cdFx0XHRcdFx0cHJpbWl0aXZlLmpvaW50cyA9IHByaW1pdGl2ZS5qb2ludHMubWFwKChqb2ludCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5ub2Rlc1s8bnVtYmVyPmpvaW50XTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxufVxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEdMVEYodXJsOiBzdHJpbmcpIHtcclxuXHRsZXQgZ2x0ZjtcclxuXHRjb25zdCBleHQgPSB1cmwuc3BsaXQoXCIuXCIpLnBvcCgpO1xyXG5cdGNvbnN0IHJvb3RVcmwgPSB1cmwuc3Vic3RyaW5nKDAsIHVybC5sYXN0SW5kZXhPZihcIi9cIikpO1xyXG5cdGlmIChleHQgPT09IFwiZ2x0ZlwiKSB7XHJcblx0XHRjb25zdCBqc29uID0gYXdhaXQgZmV0Y2godXJsKS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuanNvbigpKTtcclxuXHRcdGdsdGYgPSBuZXcgR0xURihqc29uLCByb290VXJsLCAwKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0Y29uc3QgZ2xiID0gYXdhaXQgZmV0Y2godXJsKS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XHJcblx0XHRjb25zdCBqc29uTGVuZ3RoID0gbmV3IFVpbnQzMkFycmF5KGdsYiwgMTIsIDEpWzBdO1xyXG5cdFx0Y29uc3QganNvbkNodW5rID0gbmV3IFVpbnQ4QXJyYXkoZ2xiLCAyMCwganNvbkxlbmd0aCk7XHJcblx0XHRjb25zdCBqc29uID0gSlNPTi5wYXJzZShuZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiKS5kZWNvZGUoanNvbkNodW5rKSk7XHJcblx0XHRnbHRmID0gbmV3IEdMVEYoanNvbiwgcm9vdFVybCwgMjggKyBqc29uTGVuZ3RoLCBnbGIpO1xyXG5cdH1cclxuXHRhd2FpdCBnbHRmLnBhcnNlRGF0YSgpO1xyXG5cdHJldHVybiBnbHRmO1xyXG59XHJcbnR5cGUgR0xURk5vZGVQYXJtcyA9IHtcclxuXHRjaGlsZHJlbj86IG51bWJlcltdO1xyXG5cdG1hdHJpeD86IG51bWJlcltdO1xyXG5cdHNjYWxlPzogbnVtYmVyW107XHJcblx0cm90YXRpb24/OiBudW1iZXJbXTtcclxuXHR0cmFuc2xhdGlvbj86IG51bWJlcltdO1xyXG59O1xyXG4iLCJpbXBvcnQgVGV4dHVyZSBmcm9tIFwiLi4vcmVuZGVyL1RleHR1cmVcIjtcclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRQYnJUZXh0dXJlKGJyZGYsIGRpZmZ1c2UsIHNwZWN1bGFyKSB7XHJcblx0aWYgKCFicmRmKSByZXR1cm47XHJcblx0Y29uc3QgYnJkZlRleHR1cmUgPSBhd2FpdCBsb2FkVGV4dHVyZShicmRmKTtcclxuXHRjb25zdCBkaWZmdXNlVGV4dHVyZSA9IGF3YWl0IGxvYWRDdWJlVGV4dHVyZShkaWZmdXNlKTtcclxuXHRjb25zdCBzcGVjdWxhclRleHR1cmUgPSBhd2FpdCBsb2FkQ3ViZVRleHR1cmUoc3BlY3VsYXIpO1xyXG5cdHJldHVybiB7XHJcblx0XHRicmRmVGV4dHVyZSxcclxuXHRcdGRpZmZ1c2VUZXh0dXJlLFxyXG5cdFx0c3BlY3VsYXJUZXh0dXJlXHJcblx0fTtcclxufVxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEN1YmVUZXh0dXJlKHVybHMpIHtcclxuXHRjb25zdCBwcm9taXNlcyA9IHVybHMubWFwKChzcmMpID0+IHtcclxuXHRcdGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XHJcblx0XHRpbWcuc3JjID0gc3JjO1xyXG5cdFx0cmV0dXJuIGltZy5kZWNvZGUoKS50aGVuKCgpID0+IGNyZWF0ZUltYWdlQml0bWFwKGltZykpO1xyXG5cdH0pO1xyXG5cdGNvbnN0IGltYWdlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcclxuXHRhd2FpdCBQcm9taXNlLmFsbChpbWFnZXMpO1xyXG5cdGNvbnN0IGRhdGEgPSBpbWFnZXMubWFwKChpbWFnZSwgaSkgPT4ge1xyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0c291cmNlOiBpbWFnZSxcclxuXHRcdFx0d2lkdGg6IGltYWdlLndpZHRoLFxyXG5cdFx0XHRoZWlnaHQ6IGltYWdlLmhlaWdodCxcclxuXHRcdFx0ZGVwdGg6IDEsXHJcblx0XHRcdHg6IDAsXHJcblx0XHRcdHk6IDAsXHJcblx0XHRcdHo6IGlcclxuXHRcdH07XHJcblx0fSk7XHJcblx0cmV0dXJuIG5ldyBUZXh0dXJlKHtcclxuXHRcdHNpemU6IHtcclxuXHRcdFx0d2lkdGg6IGltYWdlc1swXS53aWR0aCxcclxuXHRcdFx0aGVpZ2h0OiBpbWFnZXNbMF0uaGVpZ2h0LFxyXG5cdFx0XHRkZXB0aDogNlxyXG5cdFx0fSxcclxuXHRcdGZvcm1hdDogXCJyZ2JhOHVub3JtXCIsXHJcblx0XHR1c2FnZTogR1BVVGV4dHVyZVVzYWdlLlRFWFRVUkVfQklORElORyB8IEdQVVRleHR1cmVVc2FnZS5DT1BZX0RTVCB8IEdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVCxcclxuXHRcdGRhdGEsXHJcblx0XHR2aWV3Rm9ybWF0czogXCJjdWJlXCIsXHJcblx0XHRtaXBMZXZlbENvdW50OiA2LFxyXG5cdFx0bmVlZE1pcE1hcDogdHJ1ZVxyXG5cdH0pO1xyXG59XHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkVGV4dHVyZSh1cmwpIHtcclxuXHRjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xyXG5cdGltZy5zcmMgPSB1cmw7XHJcblx0YXdhaXQgaW1nLmRlY29kZSgpO1xyXG5cdGNvbnN0IGltYWdlQml0bWFwID0gYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoaW1nKTtcclxuXHRjb25zdCBiYXNlVGV4dHVyZSA9IG5ldyBUZXh0dXJlKHtcclxuXHRcdHNpemU6IHsgd2lkdGg6IGltYWdlQml0bWFwLndpZHRoLCBoZWlnaHQ6IGltYWdlQml0bWFwLmhlaWdodCwgZGVwdGg6IDEgfSxcclxuXHRcdGRhdGE6IHtcclxuXHRcdFx0c291cmNlOiBpbWFnZUJpdG1hcFxyXG5cdFx0fSxcclxuXHRcdGZvcm1hdDogXCJyZ2JhOHVub3JtXCJcclxuXHR9KTtcclxuXHRyZXR1cm4gYmFzZVRleHR1cmU7XHJcbn1cclxuIiwiaW1wb3J0IEdNYXRoIGZyb20gXCIuL01hdGguanNcIjtcbmltcG9ydCBWZWN0b3IzIGZyb20gXCIuL1ZlY3RvcjMuanNcIjtcbi8vIGZyb20gdGhyZWUuanNcbmNsYXNzIFNwaGVyaWNhbCB7XG5cdHJhZGl1czogbnVtYmVyO1xuXHRwaGk6IG51bWJlcjtcblx0dGhldGE6IG51bWJlcjtcblxuXHRjb25zdHJ1Y3RvcihyYWRpdXMgPSAxLCBwaGkgPSAwLCB0aGV0YSA9IDApIHtcblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcblx0XHR0aGlzLnBoaSA9IHBoaTsgLy8gcG9sYXIgYW5nbGVcblx0XHR0aGlzLnRoZXRhID0gdGhldGE7IC8vIGF6aW11dGhhbCBhbmdsZVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0c2V0KHJhZGl1czogbnVtYmVyLCBwaGk6IG51bWJlciwgdGhldGE6IG51bWJlcik6IFNwaGVyaWNhbCB7XG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XG5cdFx0dGhpcy5waGkgPSBwaGk7XG5cdFx0dGhpcy50aGV0YSA9IHRoZXRhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0Y29weShvdGhlcjogU3BoZXJpY2FsKTogU3BoZXJpY2FsIHtcblx0XHR0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1cztcblx0XHR0aGlzLnBoaSA9IG90aGVyLnBoaTtcblx0XHR0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvLyByZXN0cmljdCBwaGkgdG8gYmUgYmV0d2VlbiBFUFMgYW5kIFBJLUVQU1xuXHRtYWtlU2FmZSgpOiBTcGhlcmljYWwge1xuXHRcdGNvbnN0IEVQUyA9IDAuMDAwMDAxO1xuXHRcdHRoaXMucGhpID0gTWF0aC5tYXgoRVBTLCBNYXRoLm1pbihNYXRoLlBJIC0gRVBTLCB0aGlzLnBoaSkpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRzZXRGcm9tVmVjdG9yMyh2OiBWZWN0b3IzKTogU3BoZXJpY2FsIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKHYueCwgdi55LCB2LnopO1xuXHR9XG5cdHNldEZyb21DYXJ0ZXNpYW5Db29yZHMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcik6IFNwaGVyaWNhbCB7XG5cdFx0dGhpcy5yYWRpdXMgPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSArIHogKiB6KTtcblxuXHRcdGlmICh0aGlzLnJhZGl1cyA9PT0gMCkge1xuXHRcdFx0dGhpcy50aGV0YSA9IDA7XG5cdFx0XHR0aGlzLnBoaSA9IDA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudGhldGEgPSBNYXRoLmF0YW4yKHgsIHopO1xuXHRcdFx0dGhpcy5waGkgPSBNYXRoLmFjb3MoR01hdGguY2xhbXAoeSAvIHRoaXMucmFkaXVzLCAtMSwgMSkpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0Y2xvbmUoKTogU3BoZXJpY2FsIHtcblx0XHRyZXR1cm4gbmV3IFNwaGVyaWNhbCh0aGlzLnJhZGl1cywgdGhpcy5waGksIHRoaXMudGhldGEpO1xuXHR9XG59XG5cbmV4cG9ydCB7IFNwaGVyaWNhbCB9O1xuIiwiaW1wb3J0IHsgRXZlbnREaXNwYXRjaGVyIH0gZnJvbSBcIi4uL2NvcmUvRXZlbnREaXNwYXRjaGVyXCI7XHJcbmltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tIFwiLi4vbWF0aC9RdWF0ZXJuaW9uXCI7XHJcbmltcG9ydCB7IFNwaGVyaWNhbCB9IGZyb20gXCIuLi9tYXRoL1NwaGVyaWNhbFwiO1xyXG5pbXBvcnQgVmVjdG9yMiBmcm9tIFwiLi4vbWF0aC9WZWN0b3IyXCI7XHJcbmltcG9ydCBWZWN0b3IzIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjNcIjtcclxuLy9mcm9tIHRocmVlLmpzXHJcblxyXG5jb25zdCBfY2hhbmdlRXZlbnQgPSB7IHR5cGU6IFwiY2hhbmdlXCIgfTtcclxuY29uc3QgX3N0YXJ0RXZlbnQgPSB7IHR5cGU6IFwic3RhcnRcIiB9O1xyXG5jb25zdCBfZW5kRXZlbnQgPSB7IHR5cGU6IFwiZW5kXCIgfTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9yYml0Q29udHJvbCBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7XHJcbiAgZG9tRWxlbWVudDogYW55O1xyXG4gIG9iamVjdDogYW55O1xyXG4gIGVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgdGFyZ2V0OiBhbnk7XHJcbiAgbWluRGlzdGFuY2U6IG51bWJlcjtcclxuICBtYXhEaXN0YW5jZTogbnVtYmVyO1xyXG4gIG1pblpvb206IG51bWJlcjtcclxuICBtYXhab29tOiBudW1iZXI7XHJcbiAgbWluUG9sYXJBbmdsZTogbnVtYmVyO1xyXG4gIG1heFBvbGFyQW5nbGU6IG51bWJlcjtcclxuICBtaW5BemltdXRoQW5nbGU6IG51bWJlcjtcclxuICBtYXhBemltdXRoQW5nbGU6IG51bWJlcjtcclxuICBlbmFibGVEYW1waW5nOiBib29sZWFuO1xyXG4gIGRhbXBpbmdGYWN0b3I6IG51bWJlcjtcclxuICBlbmFibGVab29tOiBib29sZWFuO1xyXG4gIHpvb21TcGVlZDogbnVtYmVyO1xyXG4gIGVuYWJsZVJvdGF0ZTogYm9vbGVhbjtcclxuICByb3RhdGVTcGVlZDogbnVtYmVyO1xyXG4gIGVuYWJsZVBhbjogYm9vbGVhbjtcclxuICBwYW5TcGVlZDogbnVtYmVyO1xyXG4gIHNjcmVlblNwYWNlUGFubmluZzogYm9vbGVhbjtcclxuICBrZXlQYW5TcGVlZDogbnVtYmVyO1xyXG4gIGF1dG9Sb3RhdGU6IGJvb2xlYW47XHJcbiAgYXV0b1JvdGF0ZVNwZWVkOiBudW1iZXI7XHJcbiAga2V5czogeyBMRUZUOiBzdHJpbmc7IFVQOiBzdHJpbmc7IFJJR0hUOiBzdHJpbmc7IEJPVFRPTTogc3RyaW5nIH07XHJcbiAgbW91c2VCdXR0b25zOiB7IExFRlQ6IGFueTsgTUlERExFOiBhbnk7IFJJR0hUOiBhbnkgfTtcclxuICB0b3VjaGVzOiB7IE9ORTogYW55OyBUV086IGFueSB9O1xyXG4gIHRhcmdldDA6IGFueTtcclxuICBwb3NpdGlvbjA6IGFueTtcclxuICB6b29tMDogYW55O1xyXG4gIHByaXZhdGUgX2RvbUVsZW1lbnRLZXlFdmVudHM6IGFueTtcclxuICBzcGhlcmljYWw6IGFueTtcclxuICBvblBvaW50ZXJNb3ZlOiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcclxuICBvblBvaW50ZXJVcDogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XHJcbiAgb25Db250ZXh0TWVudTogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XHJcbiAgb25Qb2ludGVyRG93bjogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XHJcbiAgb25Nb3VzZVdoZWVsOiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcclxuICBvbktleURvd246IChldmVudDogYW55KSA9PiB2b2lkO1xyXG4gIGdldEF1dG9Sb3RhdGlvbkFuZ2xlOiAoKSA9PiBudW1iZXI7XHJcbiAgdXBkYXRlOiAoKSA9PiBib29sZWFuO1xyXG4gIGNvbnN0cnVjdG9yKG9iamVjdCwgZG9tRWxlbWVudCkge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgICBpZiAoZG9tRWxlbWVudCA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgJ09yYml0Q29udHJvbHM6IFRoZSBzZWNvbmQgcGFyYW1ldGVyIFwiZG9tRWxlbWVudFwiIGlzIG5vdyBtYW5kYXRvcnkuJ1xyXG4gICAgICApO1xyXG4gICAgaWYgKGRvbUVsZW1lbnQgPT09IGRvY3VtZW50KVxyXG4gICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICdPcmJpdENvbnRyb2xzOiBcImRvY3VtZW50XCIgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIHRoZSB0YXJnZXQgXCJkb21FbGVtZW50XCIuIFBsZWFzZSB1c2UgXCJyZW5kZXJlci5kb21FbGVtZW50XCIgaW5zdGVhZC4nXHJcbiAgICAgICk7XHJcblxyXG4gICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XHJcbiAgICB0aGlzLmRvbUVsZW1lbnQgPSBkb21FbGVtZW50O1xyXG4gICAgdGhpcy5kb21FbGVtZW50LnN0eWxlLnRvdWNoQWN0aW9uID0gXCJub25lXCI7IC8vIGRpc2FibGUgdG91Y2ggc2Nyb2xsXHJcblxyXG4gICAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgdGhpcyBjb250cm9sXHJcbiAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgIC8vIFwidGFyZ2V0XCIgc2V0cyB0aGUgbG9jYXRpb24gb2YgZm9jdXMsIHdoZXJlIHRoZSBvYmplY3Qgb3JiaXRzIGFyb3VuZFxyXG4gICAgdGhpcy50YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuICAgIC8vIEhvdyBmYXIgeW91IGNhbiBkb2xseSBpbiBhbmQgb3V0ICggUGVyc3BlY3RpdmVDYW1lcmEgb25seSApXHJcbiAgICB0aGlzLm1pbkRpc3RhbmNlID0gMDtcclxuICAgIHRoaXMubWF4RGlzdGFuY2UgPSBJbmZpbml0eTtcclxuXHJcbiAgICAvLyBIb3cgZmFyIHlvdSBjYW4gem9vbSBpbiBhbmQgb3V0ICggT3J0aG9ncmFwaGljQ2FtZXJhIG9ubHkgKVxyXG4gICAgdGhpcy5taW5ab29tID0gMDtcclxuICAgIHRoaXMubWF4Wm9vbSA9IEluZmluaXR5O1xyXG5cclxuICAgIC8vIEhvdyBmYXIgeW91IGNhbiBvcmJpdCB2ZXJ0aWNhbGx5LCB1cHBlciBhbmQgbG93ZXIgbGltaXRzLlxyXG4gICAgLy8gUmFuZ2UgaXMgMCB0byBNYXRoLlBJIHJhZGlhbnMuXHJcbiAgICB0aGlzLm1pblBvbGFyQW5nbGUgPSAwOyAvLyByYWRpYW5zXHJcbiAgICB0aGlzLm1heFBvbGFyQW5nbGUgPSBNYXRoLlBJOyAvLyByYWRpYW5zXHJcblxyXG4gICAgLy8gSG93IGZhciB5b3UgY2FuIG9yYml0IGhvcml6b250YWxseSwgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cy5cclxuICAgIC8vIElmIHNldCwgdGhlIGludGVydmFsIFsgbWluLCBtYXggXSBtdXN0IGJlIGEgc3ViLWludGVydmFsIG9mIFsgLSAyIFBJLCAyIFBJIF0sIHdpdGggKCBtYXggLSBtaW4gPCAyIFBJIClcclxuICAgIHRoaXMubWluQXppbXV0aEFuZ2xlID0gLUluZmluaXR5OyAvLyByYWRpYW5zXHJcbiAgICB0aGlzLm1heEF6aW11dGhBbmdsZSA9IEluZmluaXR5OyAvLyByYWRpYW5zXHJcblxyXG4gICAgLy8gU2V0IHRvIHRydWUgdG8gZW5hYmxlIGRhbXBpbmcgKGluZXJ0aWEpXHJcbiAgICAvLyBJZiBkYW1waW5nIGlzIGVuYWJsZWQsIHlvdSBtdXN0IGNhbGwgY29udHJvbHMudXBkYXRlKCkgaW4geW91ciBhbmltYXRpb24gbG9vcFxyXG4gICAgdGhpcy5lbmFibGVEYW1waW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmRhbXBpbmdGYWN0b3IgPSAwLjA1O1xyXG5cclxuICAgIC8vIFRoaXMgb3B0aW9uIGFjdHVhbGx5IGVuYWJsZXMgZG9sbHlpbmcgaW4gYW5kIG91dDsgbGVmdCBhcyBcInpvb21cIiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXHJcbiAgICAvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSB6b29taW5nXHJcbiAgICB0aGlzLmVuYWJsZVpvb20gPSB0cnVlO1xyXG4gICAgdGhpcy56b29tU3BlZWQgPSAxLjA7XHJcblxyXG4gICAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgcm90YXRpbmdcclxuICAgIHRoaXMuZW5hYmxlUm90YXRlID0gdHJ1ZTtcclxuICAgIHRoaXMucm90YXRlU3BlZWQgPSAxLjA7XHJcblxyXG4gICAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgcGFubmluZ1xyXG4gICAgdGhpcy5lbmFibGVQYW4gPSB0cnVlO1xyXG4gICAgdGhpcy5wYW5TcGVlZCA9IDEuMDtcclxuICAgIHRoaXMuc2NyZWVuU3BhY2VQYW5uaW5nID0gZmFsc2U7IC8vIGlmIGZhbHNlLCBwYW4gb3J0aG9nb25hbCB0byB3b3JsZC1zcGFjZSBkaXJlY3Rpb24gY2FtZXJhLnVwXHJcbiAgICB0aGlzLmtleVBhblNwZWVkID0gNy4wOyAvLyBwaXhlbHMgbW92ZWQgcGVyIGFycm93IGtleSBwdXNoXHJcblxyXG4gICAgLy8gU2V0IHRvIHRydWUgdG8gYXV0b21hdGljYWxseSByb3RhdGUgYXJvdW5kIHRoZSB0YXJnZXRcclxuICAgIC8vIElmIGF1dG8tcm90YXRlIGlzIGVuYWJsZWQsIHlvdSBtdXN0IGNhbGwgY29udHJvbHMudXBkYXRlKCkgaW4geW91ciBhbmltYXRpb24gbG9vcFxyXG4gICAgdGhpcy5hdXRvUm90YXRlID0gZmFsc2U7XHJcbiAgICB0aGlzLmF1dG9Sb3RhdGVTcGVlZCA9IDIuMDsgLy8gMzAgc2Vjb25kcyBwZXIgb3JiaXQgd2hlbiBmcHMgaXMgNjBcclxuXHJcbiAgICAvLyBUaGUgZm91ciBhcnJvdyBrZXlzXHJcbiAgICB0aGlzLmtleXMgPSB7XHJcbiAgICAgIExFRlQ6IFwiQXJyb3dMZWZ0XCIsXHJcbiAgICAgIFVQOiBcIkFycm93VXBcIixcclxuICAgICAgUklHSFQ6IFwiQXJyb3dSaWdodFwiLFxyXG4gICAgICBCT1RUT006IFwiQXJyb3dEb3duXCIsXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIE1vdXNlIGJ1dHRvbnNcclxuICAgIHRoaXMubW91c2VCdXR0b25zID0ge1xyXG4gICAgICBMRUZUOiBNT1VTRS5ST1RBVEUsXHJcbiAgICAgIE1JRERMRTogTU9VU0UuRE9MTFksXHJcbiAgICAgIFJJR0hUOiBNT1VTRS5QQU4sXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIFRvdWNoIGZpbmdlcnNcclxuICAgIHRoaXMudG91Y2hlcyA9IHsgT05FOiBUT1VDSC5ST1RBVEUsIFRXTzogVE9VQ0guRE9MTFlfUEFOIH07XHJcblxyXG4gICAgLy8gZm9yIHJlc2V0XHJcbiAgICB0aGlzLnRhcmdldDAgPSB0aGlzLnRhcmdldC5jbG9uZSgpO1xyXG4gICAgdGhpcy5wb3NpdGlvbjAgPSB0aGlzLm9iamVjdC5wb3NpdGlvbi5jbG9uZSgpO1xyXG4gICAgdGhpcy56b29tMCA9IHRoaXMub2JqZWN0Lnpvb207XHJcblxyXG4gICAgLy8gdGhlIHRhcmdldCBET00gZWxlbWVudCBmb3Iga2V5IGV2ZW50c1xyXG4gICAgdGhpcy5fZG9tRWxlbWVudEtleUV2ZW50cyA9IG51bGw7XHJcblxyXG4gICAgLy9cclxuICAgIC8vIHB1YmxpYyBtZXRob2RzXHJcbiAgICAvL1xyXG4gICAgLy8gdGhpcyBtZXRob2QgaXMgZXhwb3NlZCwgYnV0IHBlcmhhcHMgaXQgd291bGQgYmUgYmV0dGVyIGlmIHdlIGNhbiBtYWtlIGl0IHByaXZhdGUuLi5cclxuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xyXG4gICAgdGhpcy51cGRhdGUgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgICBjb25zdCBvZmZzZXQgPSBuZXcgVmVjdG9yMygpO1xyXG4gICAgICAvLyBzbyBjYW1lcmEudXAgaXMgdGhlIG9yYml0IGF4aXNcclxuICAgICAgY29uc3QgcXVhdCA9IG5ldyBRdWF0ZXJuaW9uKCkuc2V0RnJvbVVuaXRWZWN0b3JzKFxyXG4gICAgICAgIHRoYXQub2JqZWN0LnVwLFxyXG4gICAgICAgIG5ldyBWZWN0b3IzKDAsIDEsIDApXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHF1YXRJbnZlcnNlID0gcXVhdC5jbG9uZSgpLmludmVydCgpO1xyXG5cclxuICAgICAgY29uc3QgbGFzdFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcclxuICAgICAgY29uc3QgbGFzdFF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xyXG5cclxuICAgICAgY29uc3QgdHdvUEkgPSAyICogTWF0aC5QSTtcclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoYXQub2JqZWN0LnBvc2l0aW9uO1xyXG5cclxuICAgICAgICBvZmZzZXQuY29weShwb3NpdGlvbikuc3VidHJhY3QodGhhdC50YXJnZXQpO1xyXG5cclxuICAgICAgICAvLyByb3RhdGUgb2Zmc2V0IHRvIFwieS1heGlzLWlzLXVwXCIgc3BhY2VcclxuICAgICAgICBvZmZzZXQuYXBwbHlRdWF0ZXJuaW9uKHF1YXQpO1xyXG5cclxuICAgICAgICAvLyBhbmdsZSBmcm9tIHotYXhpcyBhcm91bmQgeS1heGlzXHJcbiAgICAgICAgc3BoZXJpY2FsLnNldEZyb21WZWN0b3IzKG9mZnNldCk7XHJcblxyXG4gICAgICAgIGlmICh0aGF0LmF1dG9Sb3RhdGUgJiYgc3RhdGUgPT09IFNUQVRFLk5PTkUpIHtcclxuICAgICAgICAgIHJvdGF0ZUxlZnQodGhhdC5nZXRBdXRvUm90YXRpb25BbmdsZSgpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGF0LmVuYWJsZURhbXBpbmcpIHtcclxuICAgICAgICAgIHNwaGVyaWNhbC50aGV0YSArPSBzcGhlcmljYWxEZWx0YS50aGV0YSAqIHRoYXQuZGFtcGluZ0ZhY3RvcjtcclxuICAgICAgICAgIHNwaGVyaWNhbC5waGkgKz0gc3BoZXJpY2FsRGVsdGEucGhpICogdGhhdC5kYW1waW5nRmFjdG9yO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzcGhlcmljYWwudGhldGEgKz0gc3BoZXJpY2FsRGVsdGEudGhldGE7XHJcbiAgICAgICAgICBzcGhlcmljYWwucGhpICs9IHNwaGVyaWNhbERlbHRhLnBoaTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHJlc3RyaWN0IHRoZXRhIHRvIGJlIGJldHdlZW4gZGVzaXJlZCBsaW1pdHNcclxuXHJcbiAgICAgICAgbGV0IG1pbiA9IHRoYXQubWluQXppbXV0aEFuZ2xlO1xyXG4gICAgICAgIGxldCBtYXggPSB0aGF0Lm1heEF6aW11dGhBbmdsZTtcclxuXHJcbiAgICAgICAgaWYgKGlzRmluaXRlKG1pbikgJiYgaXNGaW5pdGUobWF4KSkge1xyXG4gICAgICAgICAgaWYgKG1pbiA8IC1NYXRoLlBJKSBtaW4gKz0gdHdvUEk7XHJcbiAgICAgICAgICBlbHNlIGlmIChtaW4gPiBNYXRoLlBJKSBtaW4gLT0gdHdvUEk7XHJcblxyXG4gICAgICAgICAgaWYgKG1heCA8IC1NYXRoLlBJKSBtYXggKz0gdHdvUEk7XHJcbiAgICAgICAgICBlbHNlIGlmIChtYXggPiBNYXRoLlBJKSBtYXggLT0gdHdvUEk7XHJcblxyXG4gICAgICAgICAgaWYgKG1pbiA8PSBtYXgpIHtcclxuICAgICAgICAgICAgc3BoZXJpY2FsLnRoZXRhID0gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHNwaGVyaWNhbC50aGV0YSkpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc3BoZXJpY2FsLnRoZXRhID1cclxuICAgICAgICAgICAgICBzcGhlcmljYWwudGhldGEgPiAobWluICsgbWF4KSAvIDJcclxuICAgICAgICAgICAgICAgID8gTWF0aC5tYXgobWluLCBzcGhlcmljYWwudGhldGEpXHJcbiAgICAgICAgICAgICAgICA6IE1hdGgubWluKG1heCwgc3BoZXJpY2FsLnRoZXRhKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHJlc3RyaWN0IHBoaSB0byBiZSBiZXR3ZWVuIGRlc2lyZWQgbGltaXRzXHJcbiAgICAgICAgc3BoZXJpY2FsLnBoaSA9IE1hdGgubWF4KFxyXG4gICAgICAgICAgdGhhdC5taW5Qb2xhckFuZ2xlLFxyXG4gICAgICAgICAgTWF0aC5taW4odGhhdC5tYXhQb2xhckFuZ2xlLCBzcGhlcmljYWwucGhpKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHNwaGVyaWNhbC5tYWtlU2FmZSgpO1xyXG5cclxuICAgICAgICBzcGhlcmljYWwucmFkaXVzICo9IHNjYWxlO1xyXG5cclxuICAgICAgICAvLyByZXN0cmljdCByYWRpdXMgdG8gYmUgYmV0d2VlbiBkZXNpcmVkIGxpbWl0c1xyXG4gICAgICAgIHNwaGVyaWNhbC5yYWRpdXMgPSBNYXRoLm1heChcclxuICAgICAgICAgIHRoYXQubWluRGlzdGFuY2UsXHJcbiAgICAgICAgICBNYXRoLm1pbih0aGF0Lm1heERpc3RhbmNlLCBzcGhlcmljYWwucmFkaXVzKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIG1vdmUgdGFyZ2V0IHRvIHBhbm5lZCBsb2NhdGlvblxyXG5cclxuICAgICAgICBpZiAodGhhdC5lbmFibGVEYW1waW5nID09PSB0cnVlKSB7XHJcbiAgICAgICAgICB0aGF0LnRhcmdldC5hZGRTY2FsZWRWZWN0b3IocGFuT2Zmc2V0LCB0aGF0LmRhbXBpbmdGYWN0b3IpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGF0LnRhcmdldC5hZGQocGFuT2Zmc2V0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgVmVjdG9yMy5mcm9tU3BoZXJpY2FsKHNwaGVyaWNhbCwgb2Zmc2V0KTtcclxuICAgICAgICAvLyByb3RhdGUgb2Zmc2V0IGJhY2sgdG8gXCJjYW1lcmEtdXAtdmVjdG9yLWlzLXVwXCIgc3BhY2VcclxuICAgICAgICBvZmZzZXQuYXBwbHlRdWF0ZXJuaW9uKHF1YXRJbnZlcnNlKTtcclxuXHJcbiAgICAgICAgcG9zaXRpb24uY29weSh0aGF0LnRhcmdldCkuYWRkKG9mZnNldCk7XHJcblxyXG4gICAgICAgIHRoYXQub2JqZWN0Lmxvb2tBdCh0aGF0LnRhcmdldC54LCB0aGF0LnRhcmdldC55LCB0aGF0LnRhcmdldC56KTtcclxuXHJcbiAgICAgICAgaWYgKHRoYXQuZW5hYmxlRGFtcGluZyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgc3BoZXJpY2FsRGVsdGEudGhldGEgKj0gMSAtIHRoYXQuZGFtcGluZ0ZhY3RvcjtcclxuICAgICAgICAgIHNwaGVyaWNhbERlbHRhLnBoaSAqPSAxIC0gdGhhdC5kYW1waW5nRmFjdG9yO1xyXG5cclxuICAgICAgICAgIFZlY3RvcjMubXVsdGlwbHlCeVNjYWxhcihcclxuICAgICAgICAgICAgcGFuT2Zmc2V0LFxyXG4gICAgICAgICAgICAxIC0gdGhhdC5kYW1waW5nRmFjdG9yLFxyXG4gICAgICAgICAgICBwYW5PZmZzZXRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICAvLyBwYW5PZmZzZXQubXVsdGlwbHlTY2FsYXIoIDEgLSB0aGlzLmRhbXBpbmdGYWN0b3IgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc3BoZXJpY2FsRGVsdGEuc2V0KDAsIDAsIDApO1xyXG5cclxuICAgICAgICAgIHBhbk9mZnNldC5zZXQoMCwgMCwgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzY2FsZSA9IDE7XHJcblxyXG4gICAgICAgIC8vIHVwZGF0ZSBjb25kaXRpb24gaXM6XHJcbiAgICAgICAgLy8gbWluKGNhbWVyYSBkaXNwbGFjZW1lbnQsIGNhbWVyYSByb3RhdGlvbiBpbiByYWRpYW5zKV4yID4gRVBTXHJcbiAgICAgICAgLy8gdXNpbmcgc21hbGwtYW5nbGUgYXBwcm94aW1hdGlvbiBjb3MoeC8yKSA9IDEgLSB4XjIgLyA4XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHpvb21DaGFuZ2VkIHx8XHJcbiAgICAgICAgICBWZWN0b3IzLmRpc3RhbmNlU3F1YXJlZChsYXN0UG9zaXRpb24sIHRoYXQub2JqZWN0LnBvc2l0aW9uKSA+IEVQUyB8fFxyXG4gICAgICAgICAgOCAqICgxIC0gbGFzdFF1YXRlcm5pb24uZG90KHRoYXQub2JqZWN0LnF1YXRlcm5pb24pKSA+IEVQU1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhhdC5kaXNwYXRjaEV2ZW50KF9jaGFuZ2VFdmVudCk7XHJcblxyXG4gICAgICAgICAgLy9sYXN0UG9zaXRpb24uY29weSggdGhpcy5vYmplY3QucG9zaXRpb24gKTtcclxuICAgICAgICAgIFZlY3RvcjMuY2xvbmUodGhhdC5vYmplY3QucG9zaXRpb24sIGxhc3RQb3NpdGlvbik7XHJcbiAgICAgICAgICBRdWF0ZXJuaW9uLmNsb25lKHRoYXQub2JqZWN0LnF1YXRlcm5pb24sIGxhc3RRdWF0ZXJuaW9uKTtcclxuICAgICAgICAgIC8vbGFzdFF1YXRlcm5pb24uY29weSggdGhpcy5vYmplY3QucXVhdGVybmlvbiApO1xyXG4gICAgICAgICAgem9vbUNoYW5nZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfTtcclxuICAgIH0pKCk7XHJcbiAgICB0aGlzLmluaXQoKTtcclxuICB9XHJcbiAgZ2V0UG9sYXJBbmdsZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnNwaGVyaWNhbC5waGk7XHJcbiAgfVxyXG4gIGdldEF6aW11dGhhbEFuZ2xlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3BoZXJpY2FsLnRoZXRhO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGlzdGFuY2UoKSB7XHJcbiAgICByZXR1cm4gVmVjdG9yMy5kaXN0YW5jZSh0aGlzLm9iamVjdC5wb3NpdGlvbiwgdGhpcy50YXJnZXQpO1xyXG4gIH1cclxuXHJcbiAgbGlzdGVuVG9LZXlFdmVudHMoZG9tRWxlbWVudCkge1xyXG4gICAgZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLm9uS2V5RG93bik7XHJcbiAgICB0aGlzLl9kb21FbGVtZW50S2V5RXZlbnRzID0gZG9tRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHNhdmVTdGF0ZSgpIHtcclxuICAgIFZlY3RvcjMuY2xvbmUodGhpcy50YXJnZXQsIHRoaXMudGFyZ2V0MCk7XHJcbiAgICAvL3RoaXMudGFyZ2V0MC5jb3B5KCB0aGlzLnRhcmdldCApO1xyXG4gICAgVmVjdG9yMy5jbG9uZSh0aGlzLm9iamVjdC5wb3NpdGlvbiwgdGhpcy5wb3NpdGlvbjApO1xyXG4gICAgLy90aGlzLnBvc2l0aW9uMC5jb3B5KCB0aGlzLm9iamVjdC5wb3NpdGlvbiApO1xyXG4gICAgdGhpcy56b29tMCA9IHRoaXMub2JqZWN0Lnpvb207XHJcbiAgfVxyXG5cclxuICByZXNldCgpIHtcclxuICAgIFZlY3RvcjMuY2xvbmUodGhpcy50YXJnZXQwLCB0aGlzLnRhcmdldCk7XHJcbiAgICAvL3RoaXMudGFyZ2V0LmNvcHkoIHRoaXMudGFyZ2V0MCApO1xyXG4gICAgVmVjdG9yMy5jbG9uZSh0aGlzLnBvc2l0aW9uMCwgdGhpcy5vYmplY3QucG9zaXRpb24pO1xyXG4gICAgLy90aGlzLm9iamVjdC5wb3NpdGlvbi5jb3B5KCB0aGlzLnBvc2l0aW9uMCApO1xyXG4gICAgdGhpcy5vYmplY3Quem9vbSA9IHRoaXMuem9vbTA7XHJcblxyXG4gICAgdGhpcy5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KF9jaGFuZ2VFdmVudCk7XHJcblxyXG4gICAgdGhpcy51cGRhdGUoKTtcclxuXHJcbiAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXQoKSB7XHJcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcclxuICAgIGNvbnN0IHBhbkxlZnQgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgICBjb25zdCB2ID0gbmV3IFZlY3RvcjMoKTtcclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHBhbkxlZnQoZGlzdGFuY2UsIG9iamVjdE1hdHJpeCkge1xyXG4gICAgICAgIHYuc2V0RnJvbU1hdHJpeENvbHVtbihvYmplY3RNYXRyaXgsIDApOyAvLyBnZXQgWCBjb2x1bW4gb2Ygb2JqZWN0TWF0cml4XHJcbiAgICAgICAgdi5tdWx0aXBseUJ5U2NhbGFyKC1kaXN0YW5jZSk7XHJcbiAgICAgICAgcGFuT2Zmc2V0LmFkZCh2KTtcclxuICAgICAgfTtcclxuICAgIH0pKCk7XHJcbiAgICBjb25zdCBwYW5VcCA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIGNvbnN0IHBhblVwViA9IG5ldyBWZWN0b3IzKCk7XHJcbiAgICAgIHJldHVybiBmdW5jdGlvbiBwYW5VcChkaXN0YW5jZSwgb2JqZWN0TWF0cml4KSB7XHJcbiAgICAgICAgaWYgKHRoYXQuc2NyZWVuU3BhY2VQYW5uaW5nID09PSB0cnVlKSB7XHJcbiAgICAgICAgICBwYW5VcFYuc2V0RnJvbU1hdHJpeENvbHVtbihvYmplY3RNYXRyaXgsIDEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwYW5VcFYuc2V0RnJvbU1hdHJpeENvbHVtbihvYmplY3RNYXRyaXgsIDApO1xyXG4gICAgICAgICAgLy9wYW5VcFYuY3Jvc3NWZWN0b3JzKCB0aGlzLm9iamVjdC51cCwgcGFuVXBWICk7XHJcbiAgICAgICAgICBWZWN0b3IzLmNyb3NzKHRoYXQub2JqZWN0LnVwLCBwYW5VcFYsIHBhblVwVik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwYW5VcFYubXVsdGlwbHlCeVNjYWxhcihkaXN0YW5jZSk7XHJcblxyXG4gICAgICAgIHBhbk9mZnNldC5hZGQocGFuVXBWKTtcclxuICAgICAgfTtcclxuICAgIH0pKCk7XHJcbiAgICAvLyBkZWx0YVggYW5kIGRlbHRhWSBhcmUgaW4gcGl4ZWxzOyByaWdodCBhbmQgZG93biBhcmUgcG9zaXRpdmVcclxuICAgIGNvbnN0IHBhbiA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIGNvbnN0IG9mZnNldCA9IG5ldyBWZWN0b3IzKCk7XHJcbiAgICAgIHJldHVybiBmdW5jdGlvbiBwYW4oZGVsdGFYLCBkZWx0YVkpIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhhdC5kb21FbGVtZW50O1xyXG4gICAgICAgIGlmICh0aGF0Lm9iamVjdC5pc1BlcnNwZWN0aXZlQ2FtZXJhKSB7XHJcbiAgICAgICAgICAvLyBwZXJzcGVjdGl2ZVxyXG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGF0Lm9iamVjdC5wb3NpdGlvbjtcclxuICAgICAgICAgIG9mZnNldC5jb3B5KHBvc2l0aW9uKS5zdWJ0cmFjdCh0aGF0LnRhcmdldCk7XHJcbiAgICAgICAgICBsZXQgdGFyZ2V0RGlzdGFuY2UgPSBvZmZzZXQubGVuZ3RoKCk7XHJcblxyXG4gICAgICAgICAgLy8gaGFsZiBvZiB0aGUgZm92IGlzIGNlbnRlciB0byB0b3Agb2Ygc2NyZWVuXHJcbiAgICAgICAgICB0YXJnZXREaXN0YW5jZSAqPSBNYXRoLnRhbigoKHRoYXQub2JqZWN0LmZvdiAvIDIpICogTWF0aC5QSSkgLyAxODAuMCk7XHJcblxyXG4gICAgICAgICAgLy8gd2UgdXNlIG9ubHkgY2xpZW50SGVpZ2h0IGhlcmUgc28gYXNwZWN0IHJhdGlvIGRvZXMgbm90IGRpc3RvcnQgc3BlZWRcclxuICAgICAgICAgIHBhbkxlZnQoXHJcbiAgICAgICAgICAgICgyICogZGVsdGFYICogdGFyZ2V0RGlzdGFuY2UpIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsXHJcbiAgICAgICAgICAgIHRoYXQub2JqZWN0Lm1vZGVsTWF0cml4XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcGFuVXAoXHJcbiAgICAgICAgICAgICgyICogZGVsdGFZICogdGFyZ2V0RGlzdGFuY2UpIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsXHJcbiAgICAgICAgICAgIHRoYXQub2JqZWN0Lm1vZGVsTWF0cml4XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhhdC5vYmplY3QuaXNPcnRob2dyYXBoaWNDYW1lcmEpIHtcclxuICAgICAgICAgIC8vIG9ydGhvZ3JhcGhpY1xyXG4gICAgICAgICAgcGFuTGVmdChcclxuICAgICAgICAgICAgKGRlbHRhWCAqICh0aGF0Lm9iamVjdC5yaWdodCAtIHRoYXQub2JqZWN0LmxlZnQpKSAvXHJcbiAgICAgICAgICAgICAgdGhhdC5vYmplY3Quem9vbSAvXHJcbiAgICAgICAgICAgICAgZWxlbWVudC5jbGllbnRXaWR0aCxcclxuICAgICAgICAgICAgdGhhdC5vYmplY3QubW9kZWxNYXRyaXhcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBwYW5VcChcclxuICAgICAgICAgICAgKGRlbHRhWSAqICh0aGF0Lm9iamVjdC50b3AgLSB0aGF0Lm9iamVjdC5ib3R0b20pKSAvXHJcbiAgICAgICAgICAgICAgdGhhdC5vYmplY3Quem9vbSAvXHJcbiAgICAgICAgICAgICAgZWxlbWVudC5jbGllbnRIZWlnaHQsXHJcbiAgICAgICAgICAgIHRoYXQub2JqZWN0Lm1vZGVsTWF0cml4XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBjYW1lcmEgbmVpdGhlciBvcnRob2dyYXBoaWMgbm9yIHBlcnNwZWN0aXZlXHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICAgIFwiV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gcGFuIGRpc2FibGVkLlwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhhdC5lbmFibGVQYW4gPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9KSgpO1xyXG4gICAgY29uc3QgZG9sbHlPdXQgPSAoZG9sbHlTY2FsZSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYSkge1xyXG4gICAgICAgIHNjYWxlIC89IGRvbGx5U2NhbGU7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vYmplY3QuaXNPcnRob2dyYXBoaWNDYW1lcmEpIHtcclxuICAgICAgICB0aGlzLm9iamVjdC56b29tID0gTWF0aC5tYXgoXHJcbiAgICAgICAgICB0aGlzLm1pblpvb20sXHJcbiAgICAgICAgICBNYXRoLm1pbih0aGlzLm1heFpvb20sIHRoaXMub2JqZWN0Lnpvb20gKiBkb2xseVNjYWxlKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG4gICAgICAgIHpvb21DaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICBcIldBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIGRvbGx5L3pvb20gZGlzYWJsZWQuXCJcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZW5hYmxlWm9vbSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGRvbGx5SW4gPSAoZG9sbHlTY2FsZSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYSkge1xyXG4gICAgICAgIHNjYWxlICo9IGRvbGx5U2NhbGU7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vYmplY3QuaXNPcnRob2dyYXBoaWNDYW1lcmEpIHtcclxuICAgICAgICB0aGlzLm9iamVjdC56b29tID0gTWF0aC5tYXgoXHJcbiAgICAgICAgICB0aGlzLm1pblpvb20sXHJcbiAgICAgICAgICBNYXRoLm1pbih0aGlzLm1heFpvb20sIHRoaXMub2JqZWN0Lnpvb20gLyBkb2xseVNjYWxlKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG4gICAgICAgIHpvb21DaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICBcIldBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIGRvbGx5L3pvb20gZGlzYWJsZWQuXCJcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZW5hYmxlWm9vbSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgY29uc3QgaGFuZGxlTW91c2VNb3ZlUm90YXRlID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIHJvdGF0ZUVuZC5zZXQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XHJcblxyXG4gICAgICBWZWN0b3IyLnN1YnRyYWN0KHJvdGF0ZUVuZCwgcm90YXRlU3RhcnQsIHJvdGF0ZURlbHRhKTtcclxuICAgICAgVmVjdG9yMi5tdWx0aXBseUJ5U2NhbGFyKHJvdGF0ZURlbHRhLCB0aGlzLnJvdGF0ZVNwZWVkLCByb3RhdGVEZWx0YSk7XHJcbiAgICAgIC8vcm90YXRlRGVsdGEuc3ViVmVjdG9ycyggcm90YXRlRW5kLCByb3RhdGVTdGFydCApLm11bHRpcGx5U2NhbGFyKCB0aGlzLnJvdGF0ZVNwZWVkICk7XHJcblxyXG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5kb21FbGVtZW50O1xyXG5cclxuICAgICAgcm90YXRlTGVmdCgoMiAqIE1hdGguUEkgKiByb3RhdGVEZWx0YS54KSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0KTsgLy8geWVzLCBoZWlnaHRcclxuXHJcbiAgICAgIHJvdGF0ZVVwKCgyICogTWF0aC5QSSAqIHJvdGF0ZURlbHRhLnkpIC8gZWxlbWVudC5jbGllbnRIZWlnaHQpO1xyXG5cclxuICAgICAgVmVjdG9yMi5jbG9uZShyb3RhdGVFbmQsIHJvdGF0ZVN0YXJ0KTtcclxuICAgICAgLy9yb3RhdGVTdGFydC5jb3B5KCByb3RhdGVFbmQgKTtcclxuXHJcbiAgICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGhhbmRsZU1vdXNlTW92ZURvbGx5ID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIGRvbGx5RW5kLnNldChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcclxuXHJcbiAgICAgIFZlY3RvcjIuc3VidHJhY3QoZG9sbHlFbmQsIGRvbGx5U3RhcnQsIGRvbGx5RGVsdGEpO1xyXG4gICAgICAvLyBkb2xseURlbHRhLnN1YlZlY3RvcnMoIGRvbGx5RW5kLCBkb2xseVN0YXJ0ICk7XHJcblxyXG4gICAgICBpZiAoZG9sbHlEZWx0YS55ID4gMCkge1xyXG4gICAgICAgIGRvbGx5T3V0KGdldFpvb21TY2FsZSgpKTtcclxuICAgICAgfSBlbHNlIGlmIChkb2xseURlbHRhLnkgPCAwKSB7XHJcbiAgICAgICAgZG9sbHlJbihnZXRab29tU2NhbGUoKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIFZlY3RvcjIuY2xvbmUoZG9sbHlFbmQsIGRvbGx5U3RhcnQpO1xyXG4gICAgICAvLyBkb2xseVN0YXJ0LmNvcHkoIGRvbGx5RW5kICk7XHJcblxyXG4gICAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmVQYW4gPSAoZXZlbnQpID0+IHtcclxuICAgICAgcGFuRW5kLnNldChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcclxuXHJcbiAgICAgIFZlY3RvcjIuc3VidHJhY3QocGFuRW5kLCBwYW5TdGFydCwgcGFuRGVsdGEpO1xyXG4gICAgICBWZWN0b3IyLm11bHRpcGx5QnlTY2FsYXIocGFuRGVsdGEsIHRoaXMucGFuU3BlZWQsIHBhbkRlbHRhKTtcclxuICAgICAgLy9wYW5EZWx0YS5zdWJWZWN0b3JzKCBwYW5FbmQsIHBhblN0YXJ0ICkubXVsdGlwbHlTY2FsYXIoIHRoaXMucGFuU3BlZWQgKTtcclxuXHJcbiAgICAgIHBhbihwYW5EZWx0YS54LCBwYW5EZWx0YS55KTtcclxuXHJcbiAgICAgIFZlY3RvcjIuY2xvbmUocGFuRW5kLCBwYW5TdGFydCk7XHJcbiAgICAgIC8vcGFuU3RhcnQuY29weSggcGFuRW5kICk7XHJcblxyXG4gICAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBoYW5kbGVNb3VzZVdoZWVsID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudC5kZWx0YVkgPCAwKSB7XHJcbiAgICAgICAgZG9sbHlJbihnZXRab29tU2NhbGUoKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZGVsdGFZID4gMCkge1xyXG4gICAgICAgIGRvbGx5T3V0KGdldFpvb21TY2FsZSgpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy51cGRhdGUoKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgaGFuZGxlS2V5RG93biA9IChldmVudCkgPT4ge1xyXG4gICAgICBsZXQgbmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcbiAgICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xyXG4gICAgICAgIGNhc2UgdGhpcy5rZXlzLlVQOlxyXG4gICAgICAgICAgcGFuKDAsIHRoaXMua2V5UGFuU3BlZWQpO1xyXG4gICAgICAgICAgbmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgdGhpcy5rZXlzLkJPVFRPTTpcclxuICAgICAgICAgIHBhbigwLCAtdGhpcy5rZXlQYW5TcGVlZCk7XHJcbiAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSB0aGlzLmtleXMuTEVGVDpcclxuICAgICAgICAgIHBhbih0aGlzLmtleVBhblNwZWVkLCAwKTtcclxuICAgICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIHRoaXMua2V5cy5SSUdIVDpcclxuICAgICAgICAgIHBhbigtdGhpcy5rZXlQYW5TcGVlZCwgMCk7XHJcbiAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG5lZWRzVXBkYXRlKSB7XHJcbiAgICAgICAgLy8gcHJldmVudCB0aGUgYnJvd3NlciBmcm9tIHNjcm9sbGluZyBvbiBjdXJzb3Iga2V5c1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgaGFuZGxlVG91Y2hTdGFydERvbGx5UGFuID0gKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5lbmFibGVab29tKSBoYW5kbGVUb3VjaFN0YXJ0RG9sbHkoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmVuYWJsZVBhbikgaGFuZGxlVG91Y2hTdGFydFBhbigpO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IGhhbmRsZVRvdWNoU3RhcnREb2xseVJvdGF0ZSA9ICgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuZW5hYmxlWm9vbSkgaGFuZGxlVG91Y2hTdGFydERvbGx5KCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5lbmFibGVSb3RhdGUpIGhhbmRsZVRvdWNoU3RhcnRSb3RhdGUoKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlUm90YXRlID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChwb2ludGVycy5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgIHJvdGF0ZUVuZC5zZXQoZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdldFNlY29uZFBvaW50ZXJQb3NpdGlvbihldmVudCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHggPSAwLjUgKiAoZXZlbnQucGFnZVggKyBwb3NpdGlvbi54KTtcclxuICAgICAgICBjb25zdCB5ID0gMC41ICogKGV2ZW50LnBhZ2VZICsgcG9zaXRpb24ueSk7XHJcblxyXG4gICAgICAgIHJvdGF0ZUVuZC5zZXQoeCwgeSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIFZlY3RvcjIuc3VidHJhY3Qocm90YXRlRW5kLCByb3RhdGVTdGFydCwgcm90YXRlRGVsdGEpO1xyXG4gICAgICBWZWN0b3IyLm11bHRpcGx5QnlTY2FsYXIocm90YXRlRGVsdGEsIHRoaXMucm90YXRlU3BlZWQsIHJvdGF0ZURlbHRhKTtcclxuICAgICAgLy9yb3RhdGVEZWx0YS5zdWJWZWN0b3JzKCByb3RhdGVFbmQsIHJvdGF0ZVN0YXJ0ICkubXVsdGlwbHlTY2FsYXIoIHRoaXMucm90YXRlU3BlZWQgKTtcclxuXHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmRvbUVsZW1lbnQ7XHJcblxyXG4gICAgICByb3RhdGVMZWZ0KCgyICogTWF0aC5QSSAqIHJvdGF0ZURlbHRhLngpIC8gZWxlbWVudC5jbGllbnRIZWlnaHQpOyAvLyB5ZXMsIGhlaWdodFxyXG5cclxuICAgICAgcm90YXRlVXAoKDIgKiBNYXRoLlBJICogcm90YXRlRGVsdGEueSkgLyBlbGVtZW50LmNsaWVudEhlaWdodCk7XHJcbiAgICAgIFZlY3RvcjIuY2xvbmUocm90YXRlRW5kLCByb3RhdGVTdGFydCk7XHJcbiAgICAgIC8vcm90YXRlU3RhcnQuY29weSggcm90YXRlRW5kICk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGhhbmRsZVRvdWNoTW92ZVBhbiA9IChldmVudCkgPT4ge1xyXG4gICAgICBpZiAocG9pbnRlcnMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgcGFuRW5kLnNldChldmVudC5wYWdlWCwgZXZlbnQucGFnZVkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2V0U2Vjb25kUG9pbnRlclBvc2l0aW9uKGV2ZW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgeCA9IDAuNSAqIChldmVudC5wYWdlWCArIHBvc2l0aW9uLngpO1xyXG4gICAgICAgIGNvbnN0IHkgPSAwLjUgKiAoZXZlbnQucGFnZVkgKyBwb3NpdGlvbi55KTtcclxuXHJcbiAgICAgICAgcGFuRW5kLnNldCh4LCB5KTtcclxuICAgICAgfVxyXG4gICAgICBWZWN0b3IyLnN1YnRyYWN0KHBhbkVuZCwgcGFuU3RhcnQsIHBhbkRlbHRhKTtcclxuICAgICAgVmVjdG9yMi5tdWx0aXBseUJ5U2NhbGFyKHBhbkRlbHRhLCB0aGlzLnBhblNwZWVkLCBwYW5EZWx0YSk7XHJcblxyXG4gICAgICAvL3BhbkRlbHRhLnN1YlZlY3RvcnMoIHBhbkVuZCwgcGFuU3RhcnQgKS5tdWx0aXBseVNjYWxhciggdGhpcy5wYW5TcGVlZCApO1xyXG5cclxuICAgICAgcGFuKHBhbkRlbHRhLngsIHBhbkRlbHRhLnkpO1xyXG5cclxuICAgICAgVmVjdG9yMi5jbG9uZShwYW5FbmQsIHBhblN0YXJ0KTtcclxuICAgICAgLy8gcGFuU3RhcnQuY29weSggcGFuRW5kICk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGhhbmRsZVRvdWNoTW92ZURvbGx5ID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2V0U2Vjb25kUG9pbnRlclBvc2l0aW9uKGV2ZW50KTtcclxuXHJcbiAgICAgIGNvbnN0IGR4ID0gZXZlbnQucGFnZVggLSBwb3NpdGlvbi54O1xyXG4gICAgICBjb25zdCBkeSA9IGV2ZW50LnBhZ2VZIC0gcG9zaXRpb24ueTtcclxuXHJcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcclxuXHJcbiAgICAgIGRvbGx5RW5kLnNldCgwLCBkaXN0YW5jZSk7XHJcblxyXG4gICAgICBkb2xseURlbHRhLnNldCgwLCBNYXRoLnBvdyhkb2xseUVuZC55IC8gZG9sbHlTdGFydC55LCB0aGlzLnpvb21TcGVlZCkpO1xyXG5cclxuICAgICAgZG9sbHlPdXQoZG9sbHlEZWx0YS55KTtcclxuXHJcbiAgICAgIFZlY3RvcjIuY2xvbmUoZG9sbHlFbmQsIGRvbGx5U3RhcnQpO1xyXG4gICAgICAvL2RvbGx5U3RhcnQuY29weSggZG9sbHlFbmQgKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlRG9sbHlQYW4gPSAoZXZlbnQpID0+IHtcclxuICAgICAgaWYgKHRoaXMuZW5hYmxlWm9vbSkgaGFuZGxlVG91Y2hNb3ZlRG9sbHkoZXZlbnQpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZW5hYmxlUGFuKSBoYW5kbGVUb3VjaE1vdmVQYW4oZXZlbnQpO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBoYW5kbGVUb3VjaE1vdmVEb2xseVJvdGF0ZSA9IChldmVudCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5lbmFibGVab29tKSBoYW5kbGVUb3VjaE1vdmVEb2xseShldmVudCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5lbmFibGVSb3RhdGUpIGhhbmRsZVRvdWNoTW92ZVJvdGF0ZShldmVudCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vXHJcbiAgICAvLyBldmVudCBoYW5kbGVycyAtIEZTTTogbGlzdGVuIGZvciBldmVudHMgYW5kIHJlc2V0IHN0YXRlXHJcbiAgICAvL1xyXG5cclxuICAgIHRoaXMub25Qb2ludGVyRG93biA9IChldmVudCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5lbmFibGVkID09PSBmYWxzZSkgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKHBvaW50ZXJzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHRoaXMuZG9tRWxlbWVudC5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xyXG5cclxuICAgICAgICB0aGlzLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIHRoaXMub25Qb2ludGVyTW92ZSk7XHJcbiAgICAgICAgdGhpcy5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgdGhpcy5vblBvaW50ZXJVcCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vXHJcblxyXG4gICAgICBhZGRQb2ludGVyKGV2ZW50KTtcclxuXHJcbiAgICAgIGlmIChldmVudC5wb2ludGVyVHlwZSA9PT0gXCJ0b3VjaFwiKSB7XHJcbiAgICAgICAgb25Ub3VjaFN0YXJ0KGV2ZW50KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBvbk1vdXNlRG93bihldmVudCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5vblBvaW50ZXJNb3ZlID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XHJcblxyXG4gICAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIikge1xyXG4gICAgICAgIG9uVG91Y2hNb3ZlKGV2ZW50KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBvbk1vdXNlTW92ZShldmVudCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5vblBvaW50ZXJVcCA9IChldmVudCkgPT4ge1xyXG4gICAgICByZW1vdmVQb2ludGVyKGV2ZW50KTtcclxuXHJcbiAgICAgIGlmIChwb2ludGVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICB0aGlzLmRvbUVsZW1lbnQucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XHJcblxyXG4gICAgICAgIHRoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgdGhpcy5vblBvaW50ZXJNb3ZlKTtcclxuICAgICAgICB0aGlzLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCB0aGlzLm9uUG9pbnRlclVwKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KF9lbmRFdmVudCk7XHJcblxyXG4gICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IG9uTW91c2VEb3duID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIGxldCBtb3VzZUFjdGlvbjtcclxuXHJcbiAgICAgIHN3aXRjaCAoZXZlbnQuYnV0dG9uKSB7XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgbW91c2VBY3Rpb24gPSB0aGlzLm1vdXNlQnV0dG9ucy5MRUZUO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgIG1vdXNlQWN0aW9uID0gdGhpcy5tb3VzZUJ1dHRvbnMuTUlERExFO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgIG1vdXNlQWN0aW9uID0gdGhpcy5tb3VzZUJ1dHRvbnMuUklHSFQ7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIG1vdXNlQWN0aW9uID0gLTE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN3aXRjaCAobW91c2VBY3Rpb24pIHtcclxuICAgICAgICBjYXNlIE1PVVNFLkRPTExZOlxyXG4gICAgICAgICAgaWYgKHRoaXMuZW5hYmxlWm9vbSA9PT0gZmFsc2UpIHJldHVybjtcclxuXHJcbiAgICAgICAgICBoYW5kbGVNb3VzZURvd25Eb2xseShldmVudCk7XHJcblxyXG4gICAgICAgICAgc3RhdGUgPSBTVEFURS5ET0xMWTtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBNT1VTRS5ST1RBVEU6XHJcbiAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGhhbmRsZU1vdXNlRG93blBhbihldmVudCk7XHJcblxyXG4gICAgICAgICAgICBzdGF0ZSA9IFNUQVRFLlBBTjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGhhbmRsZU1vdXNlRG93blJvdGF0ZShldmVudCk7XHJcblxyXG4gICAgICAgICAgICBzdGF0ZSA9IFNUQVRFLlJPVEFURTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBNT1VTRS5QQU46XHJcbiAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGhhbmRsZU1vdXNlRG93blJvdGF0ZShldmVudCk7XHJcblxyXG4gICAgICAgICAgICBzdGF0ZSA9IFNUQVRFLlJPVEFURTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGhhbmRsZU1vdXNlRG93blBhbihldmVudCk7XHJcblxyXG4gICAgICAgICAgICBzdGF0ZSA9IFNUQVRFLlBBTjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHN0YXRlID0gU1RBVEUuTk9ORTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHN0YXRlICE9PSBTVEFURS5OT05FKSB7XHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KF9zdGFydEV2ZW50KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBvbk1vdXNlTW92ZSA9IChldmVudCkgPT4ge1xyXG4gICAgICBzd2l0Y2ggKHN0YXRlKSB7XHJcbiAgICAgICAgY2FzZSBTVEFURS5ST1RBVEU6XHJcbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVSb3RhdGUgPT09IGZhbHNlKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgaGFuZGxlTW91c2VNb3ZlUm90YXRlKGV2ZW50KTtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBTVEFURS5ET0xMWTpcclxuICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVpvb20gPT09IGZhbHNlKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgaGFuZGxlTW91c2VNb3ZlRG9sbHkoZXZlbnQpO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFNUQVRFLlBBTjpcclxuICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcclxuXHJcbiAgICAgICAgICBoYW5kbGVNb3VzZU1vdmVQYW4oZXZlbnQpO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub25Nb3VzZVdoZWVsID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLmVuYWJsZWQgPT09IGZhbHNlIHx8XHJcbiAgICAgICAgdGhpcy5lbmFibGVab29tID09PSBmYWxzZSB8fFxyXG4gICAgICAgIHN0YXRlICE9PSBTVEFURS5OT05FXHJcbiAgICAgIClcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KF9zdGFydEV2ZW50KTtcclxuXHJcbiAgICAgIGhhbmRsZU1vdXNlV2hlZWwoZXZlbnQpO1xyXG5cclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KF9lbmRFdmVudCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub25LZXlEb3duID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlIHx8IHRoaXMuZW5hYmxlUGFuID09PSBmYWxzZSkgcmV0dXJuO1xyXG5cclxuICAgICAgaGFuZGxlS2V5RG93bihldmVudCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IG9uVG91Y2hTdGFydCA9IChldmVudCkgPT4ge1xyXG4gICAgICB0cmFja1BvaW50ZXIoZXZlbnQpO1xyXG5cclxuICAgICAgc3dpdGNoIChwb2ludGVycy5sZW5ndGgpIHtcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBzd2l0Y2ggKHRoaXMudG91Y2hlcy5PTkUpIHtcclxuICAgICAgICAgICAgY2FzZSBUT1VDSC5ST1RBVEU6XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZW5hYmxlUm90YXRlID09PSBmYWxzZSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICBoYW5kbGVUb3VjaFN0YXJ0Um90YXRlKCk7XHJcblxyXG4gICAgICAgICAgICAgIHN0YXRlID0gU1RBVEUuVE9VQ0hfUk9UQVRFO1xyXG5cclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgVE9VQ0guUEFOOlxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgaGFuZGxlVG91Y2hTdGFydFBhbigpO1xyXG5cclxuICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFLlRPVUNIX1BBTjtcclxuXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIHN0YXRlID0gU1RBVEUuTk9ORTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgc3dpdGNoICh0aGlzLnRvdWNoZXMuVFdPKSB7XHJcbiAgICAgICAgICAgIGNhc2UgVE9VQ0guRE9MTFlfUEFOOlxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVpvb20gPT09IGZhbHNlICYmIHRoaXMuZW5hYmxlUGFuID09PSBmYWxzZSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICBoYW5kbGVUb3VjaFN0YXJ0RG9sbHlQYW4oKTtcclxuXHJcbiAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURS5UT1VDSF9ET0xMWV9QQU47XHJcblxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBUT1VDSC5ET0xMWV9ST1RBVEU6XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZW5hYmxlWm9vbSA9PT0gZmFsc2UgJiYgdGhpcy5lbmFibGVSb3RhdGUgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICBoYW5kbGVUb3VjaFN0YXJ0RG9sbHlSb3RhdGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURS5UT1VDSF9ET0xMWV9ST1RBVEU7XHJcblxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzdGF0ZSAhPT0gU1RBVEUuTk9ORSkge1xyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChfc3RhcnRFdmVudCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3Qgb25Ub3VjaE1vdmUgPSAoZXZlbnQpID0+IHtcclxuICAgICAgdHJhY2tQb2ludGVyKGV2ZW50KTtcclxuXHJcbiAgICAgIHN3aXRjaCAoc3RhdGUpIHtcclxuICAgICAgICBjYXNlIFNUQVRFLlRPVUNIX1JPVEFURTpcclxuICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UpIHJldHVybjtcclxuXHJcbiAgICAgICAgICBoYW5kbGVUb3VjaE1vdmVSb3RhdGUoZXZlbnQpO1xyXG5cclxuICAgICAgICAgIHRoaXMudXBkYXRlKCk7XHJcblxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgU1RBVEUuVE9VQ0hfUEFOOlxyXG4gICAgICAgICAgaWYgKHRoaXMuZW5hYmxlUGFuID09PSBmYWxzZSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgIGhhbmRsZVRvdWNoTW92ZVBhbihldmVudCk7XHJcblxyXG4gICAgICAgICAgdGhpcy51cGRhdGUoKTtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBTVEFURS5UT1VDSF9ET0xMWV9QQU46XHJcbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVab29tID09PSBmYWxzZSAmJiB0aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcclxuXHJcbiAgICAgICAgICBoYW5kbGVUb3VjaE1vdmVEb2xseVBhbihldmVudCk7XHJcblxyXG4gICAgICAgICAgdGhpcy51cGRhdGUoKTtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBTVEFURS5UT1VDSF9ET0xMWV9ST1RBVEU6XHJcbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVab29tID09PSBmYWxzZSAmJiB0aGlzLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UpIHJldHVybjtcclxuXHJcbiAgICAgICAgICBoYW5kbGVUb3VjaE1vdmVEb2xseVJvdGF0ZShldmVudCk7XHJcblxyXG4gICAgICAgICAgdGhpcy51cGRhdGUoKTtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHN0YXRlID0gU1RBVEUuTk9ORTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLm9uQ29udGV4dE1lbnUgPSAoZXZlbnQpID0+IHtcclxuICAgICAgaWYgKHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UpIHJldHVybjtcclxuXHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5nZXRBdXRvUm90YXRpb25BbmdsZSA9ICgpID0+IHtcclxuICAgICAgcmV0dXJuICgoMiAqIE1hdGguUEkpIC8gNjAgLyA2MCkgKiB0aGlzLmF1dG9Sb3RhdGVTcGVlZDtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZ2V0Wm9vbVNjYWxlID0gKCkgPT4ge1xyXG4gICAgICByZXR1cm4gTWF0aC5wb3coMC45NSwgdGhpcy56b29tU3BlZWQpO1xyXG4gICAgfTtcclxuICAgIHRoaXMuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgdGhpcy5vbkNvbnRleHRNZW51KTtcclxuXHJcbiAgICB0aGlzLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMub25Qb2ludGVyRG93bik7XHJcbiAgICB0aGlzLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJjYW5jZWxcIiwgb25Qb2ludGVyQ2FuY2VsKTtcclxuICAgIHRoaXMuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwid2hlZWxcIiwgdGhpcy5vbk1vdXNlV2hlZWwsIHtcclxuICAgICAgcGFzc2l2ZTogZmFsc2UsXHJcbiAgICB9KTtcclxuICB9XHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgdGhpcy5vbkNvbnRleHRNZW51KTtcclxuXHJcbiAgICB0aGlzLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMub25Qb2ludGVyRG93bik7XHJcbiAgICB0aGlzLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJjYW5jZWxcIiwgb25Qb2ludGVyQ2FuY2VsKTtcclxuICAgIHRoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwid2hlZWxcIiwgdGhpcy5vbk1vdXNlV2hlZWwpO1xyXG5cclxuICAgIHRoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgdGhpcy5vblBvaW50ZXJNb3ZlKTtcclxuICAgIHRoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHRoaXMub25Qb2ludGVyVXApO1xyXG5cclxuICAgIGlmICh0aGlzLl9kb21FbGVtZW50S2V5RXZlbnRzICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2RvbUVsZW1lbnRLZXlFdmVudHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5vbktleURvd24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vdGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7IC8vIHNob3VsZCB0aGlzIGJlIGFkZGVkIGhlcmU/XHJcbiAgfVxyXG59XHJcbmNvbnN0IFNUQVRFID0ge1xyXG4gIE5PTkU6IC0xLFxyXG4gIFJPVEFURTogMCxcclxuICBET0xMWTogMSxcclxuICBQQU46IDIsXHJcbiAgVE9VQ0hfUk9UQVRFOiAzLFxyXG4gIFRPVUNIX1BBTjogNCxcclxuICBUT1VDSF9ET0xMWV9QQU46IDUsXHJcbiAgVE9VQ0hfRE9MTFlfUk9UQVRFOiA2LFxyXG59O1xyXG5cclxubGV0IHN0YXRlID0gU1RBVEUuTk9ORTtcclxuXHJcbmNvbnN0IEVQUyA9IDAuMDAwMDAxO1xyXG5cclxuLy8gY3VycmVudCBwb3NpdGlvbiBpbiBzcGhlcmljYWwgY29vcmRpbmF0ZXNcclxuY29uc3Qgc3BoZXJpY2FsID0gbmV3IFNwaGVyaWNhbCgpO1xyXG5jb25zdCBzcGhlcmljYWxEZWx0YSA9IG5ldyBTcGhlcmljYWwoKTtcclxuXHJcbmxldCBzY2FsZSA9IDE7XHJcbmNvbnN0IHBhbk9mZnNldCA9IG5ldyBWZWN0b3IzKCk7XHJcbmxldCB6b29tQ2hhbmdlZCA9IGZhbHNlO1xyXG5cclxuY29uc3Qgcm90YXRlU3RhcnQgPSBuZXcgVmVjdG9yMigpO1xyXG5jb25zdCByb3RhdGVFbmQgPSBuZXcgVmVjdG9yMigpO1xyXG5jb25zdCByb3RhdGVEZWx0YSA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG5jb25zdCBwYW5TdGFydCA9IG5ldyBWZWN0b3IyKCk7XHJcbmNvbnN0IHBhbkVuZCA9IG5ldyBWZWN0b3IyKCk7XHJcbmNvbnN0IHBhbkRlbHRhID0gbmV3IFZlY3RvcjIoKTtcclxuXHJcbmNvbnN0IGRvbGx5U3RhcnQgPSBuZXcgVmVjdG9yMigpO1xyXG5jb25zdCBkb2xseUVuZCA9IG5ldyBWZWN0b3IyKCk7XHJcbmNvbnN0IGRvbGx5RGVsdGEgPSBuZXcgVmVjdG9yMigpO1xyXG5cclxuY29uc3QgcG9pbnRlcnMgPSBbXTtcclxuY29uc3QgcG9pbnRlclBvc2l0aW9ucyA9IHt9O1xyXG5leHBvcnQgZW51bSBNT1VTRSB7XHJcbiAgTEVGVCA9IDAsXHJcbiAgTUlERExFID0gMSxcclxuICBSSUdIVCA9IDIsXHJcbiAgUk9UQVRFID0gMCxcclxuICBET0xMWSA9IDEsXHJcbiAgUEFOID0gMixcclxufVxyXG5cclxuZXhwb3J0IGVudW0gVE9VQ0gge1xyXG4gIFJPVEFURSxcclxuICBQQU4sXHJcbiAgRE9MTFlfUEFOLFxyXG4gIERPTExZX1JPVEFURSxcclxufVxyXG5mdW5jdGlvbiByb3RhdGVMZWZ0KGFuZ2xlKSB7XHJcbiAgc3BoZXJpY2FsRGVsdGEudGhldGEgLT0gYW5nbGU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJvdGF0ZVVwKGFuZ2xlKSB7XHJcbiAgc3BoZXJpY2FsRGVsdGEucGhpIC09IGFuZ2xlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRQb2ludGVyKGV2ZW50KSB7XHJcbiAgcG9pbnRlcnMucHVzaChldmVudCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbW92ZVBvaW50ZXIoZXZlbnQpIHtcclxuICBkZWxldGUgcG9pbnRlclBvc2l0aW9uc1tldmVudC5wb2ludGVySWRdO1xyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBpZiAocG9pbnRlcnNbaV0ucG9pbnRlcklkID09IGV2ZW50LnBvaW50ZXJJZCkge1xyXG4gICAgICBwb2ludGVycy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRyYWNrUG9pbnRlcihldmVudCkge1xyXG4gIGxldCBwb3NpdGlvbiA9IHBvaW50ZXJQb3NpdGlvbnNbZXZlbnQucG9pbnRlcklkXTtcclxuXHJcbiAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgIHBvc2l0aW9uID0gbmV3IFZlY3RvcjIoKTtcclxuICAgIHBvaW50ZXJQb3NpdGlvbnNbZXZlbnQucG9pbnRlcklkXSA9IHBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgcG9zaXRpb24uc2V0KGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFNlY29uZFBvaW50ZXJQb3NpdGlvbihldmVudCkge1xyXG4gIGNvbnN0IHBvaW50ZXIgPVxyXG4gICAgZXZlbnQucG9pbnRlcklkID09PSBwb2ludGVyc1swXS5wb2ludGVySWQgPyBwb2ludGVyc1sxXSA6IHBvaW50ZXJzWzBdO1xyXG5cclxuICByZXR1cm4gcG9pbnRlclBvc2l0aW9uc1twb2ludGVyLnBvaW50ZXJJZF07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93blJvdGF0ZShldmVudCkge1xyXG4gIHJvdGF0ZVN0YXJ0LnNldChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duRG9sbHkoZXZlbnQpIHtcclxuICBkb2xseVN0YXJ0LnNldChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duUGFuKGV2ZW50KSB7XHJcbiAgcGFuU3RhcnQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xyXG59XHJcbmZ1bmN0aW9uIG9uUG9pbnRlckNhbmNlbChldmVudCkge1xyXG4gIHJlbW92ZVBvaW50ZXIoZXZlbnQpO1xyXG59XHJcbmZ1bmN0aW9uIGhhbmRsZVRvdWNoU3RhcnRSb3RhdGUoKSB7XHJcbiAgaWYgKHBvaW50ZXJzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgcm90YXRlU3RhcnQuc2V0KHBvaW50ZXJzWzBdLnBhZ2VYLCBwb2ludGVyc1swXS5wYWdlWSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IHggPSAwLjUgKiAocG9pbnRlcnNbMF0ucGFnZVggKyBwb2ludGVyc1sxXS5wYWdlWCk7XHJcbiAgICBjb25zdCB5ID0gMC41ICogKHBvaW50ZXJzWzBdLnBhZ2VZICsgcG9pbnRlcnNbMV0ucGFnZVkpO1xyXG5cclxuICAgIHJvdGF0ZVN0YXJ0LnNldCh4LCB5KTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhbmRsZVRvdWNoU3RhcnRQYW4oKSB7XHJcbiAgaWYgKHBvaW50ZXJzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgcGFuU3RhcnQuc2V0KHBvaW50ZXJzWzBdLnBhZ2VYLCBwb2ludGVyc1swXS5wYWdlWSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IHggPSAwLjUgKiAocG9pbnRlcnNbMF0ucGFnZVggKyBwb2ludGVyc1sxXS5wYWdlWCk7XHJcbiAgICBjb25zdCB5ID0gMC41ICogKHBvaW50ZXJzWzBdLnBhZ2VZICsgcG9pbnRlcnNbMV0ucGFnZVkpO1xyXG5cclxuICAgIHBhblN0YXJ0LnNldCh4LCB5KTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhbmRsZVRvdWNoU3RhcnREb2xseSgpIHtcclxuICBjb25zdCBkeCA9IHBvaW50ZXJzWzBdLnBhZ2VYIC0gcG9pbnRlcnNbMV0ucGFnZVg7XHJcbiAgY29uc3QgZHkgPSBwb2ludGVyc1swXS5wYWdlWSAtIHBvaW50ZXJzWzFdLnBhZ2VZO1xyXG5cclxuICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XHJcblxyXG4gIGRvbGx5U3RhcnQuc2V0KDAsIGRpc3RhbmNlKTtcclxufVxyXG4iXSwibmFtZXMiOlsicHJlcHJvY2Vzc29yU3ltYm9scyIsIk1lcnNlbm5lVHdpc3RlciIsImRpc3RhbmNlU2NyYXRjaCIsImxlcnBTY3JhdGNoIiwiYW5nbGVCZXR3ZWVuU2NyYXRjaCIsImFuZ2xlQmV0d2VlblNjcmF0Y2gyIiwibW9zdE9ydGhvZ29uYWxBeGlzU2NyYXRjaCIsInNjYWxlU2NyYXRjaDEiLCJzY3JhdGNoQ29sdW1uIiwic2NhbGVTY3JhdGNoMyIsInNjYWxlU2NyYXRjaDQiLCJzY2FsZVNjcmF0Y2g1Iiwic2NyYXRjaFRyYW5zcG9zZU1hdHJpeCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxJQUFZLG9CQUVYLENBQUE7QUFGRCxDQUFBLFVBQVksb0JBQW9CLEVBQUE7QUFDL0IsSUFBQSxvQkFBQSxDQUFBLE1BQUEsQ0FBQSxHQUFBLE1BQWEsQ0FBQTtBQUNkLENBQUMsRUFGVyxvQkFBb0IsS0FBcEIsb0JBQW9CLEdBRS9CLEVBQUEsQ0FBQSxDQUFBLENBQUE7QUFFRDtBQUNBLElBQVksZUFHWCxDQUFBO0FBSEQsQ0FBQSxVQUFZLGVBQWUsRUFBQTtBQUMxQixJQUFBLGVBQUEsQ0FBQSxVQUFBLENBQUEsR0FBQSxXQUFzQixDQUFBO0FBQ3RCLElBQUEsZUFBQSxDQUFBLGlCQUFBLENBQUEsR0FBQSxrQkFBb0MsQ0FBQTtBQUNyQyxDQUFDLEVBSFcsZUFBZSxL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Q3JCLElBQUEsWUFBQSxDQUFBLFVBQUEsQ0FBQSxHQUFBLFVBQXFCLENBQUE7QUFDckIsSUFBQSxZQUFBLENBQUEsVUFBQSxDQUFBLEdBQUEsVUFBcUIsQ0FBQTtBQUNyQixJQUFBLFlBQUEsQ0FBQSxVQUFBLENBQUEsR0FBQSxVQUFxQixDQUFBO0FBQ3JCLElBQUEsWUFBQSxDQUFBLFVBQUEsQ0FBQSxHQUFBLFVBQXFCLENBQUE7QUFDckIsSUFBQSxZQUFBLENBQUEsVUFBQSxDQUFBLEdBQUEsVUFBcUIsQ0FBQTtBQUNyQixJQUFBLFlBQUEsQ0FBQSxVQUFBLENBQUEsR0FBQSxVQUFxQixDQUFBO0FBQ3JCLElBQUEsWUFBQSxDQUFBLFVBQUEsQ0FBQSxHQUFBLFVBQXFCLENBQUE7QUFDckIsSUFBQSxZQUFBLENBQUEsV0FBQSxDQUFBLEdBQUEsV0FBdUIsQ0FBQTtBQUN2QixJQUFBLFlBQUEsQ0FBQSxXQUFBLENBQUEsR0FBQSxXQUF1QixDQUFBO0FBQ3ZCLElBQUEsWUFBQSxDQUFBLFdBQUEsQ0FBQSxHQUFBLFdBQXVCLENBQUE7QUFDdkIsSUFBQSxZQUFBLENBQUEsV0FBQSxDQUFBLEdBQUEsV0FBdUIsQ0FBQTtBQUN2QixJQUFBLFlBQUEsQ0FBQSxXQUFBLENBQUEsR0FBQSxXQUF1QixDQUFBO0FBQ3ZCLElBQUEsWUFBQSxDQUFBLFdBQUEsQ0FBQSxHQUFBLFdBQXVCLENBQUE7QUFDdkIsSUFBQSxZQUFBLENBQUEsU0FBQSxDQUFBLEdBQUEsU0FBbUIsQ0FBQTtBQUNuQixJQUFBLFlBQUEsQ0FBQSxXQUFBLENBQUEsR0FBQSxXQUF1QixDQUFBO0FBQ3ZCLElBQUEsWUFBQSxDQUFBLFdBQUEsQ0FBQSxHQUFBLFdBQXVCLENBQUE7QUFDdkIsSUFBQSxZQUFBLENBQUEsV0FBQSxDQUFBLEdBQUEsV0FBdUIsQ0FBQTtBQUN2QixJQUFBLFlBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxRQUFpQixDQUFBO0FBQ2pCLElBQUEsWUFBQSxDQUFBLFVBQUEsQ0FBQSxHQUFBLFVBQXFCLENBQUE7QUFDckIsSUFB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QUMsQ0FBQztBQUM3RCxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxNQUFNLEVBQUUsSUFBSSxVQUFVLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLFVBQVUsSUFBSSxVQUFVO0FBQ3ZHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDM0I7QUFDQSxFQUFFO0FBQ0YsRUFBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxTQUFTLFFBQVEsRUFBRSxVQUFVLEVBQUU7QUFDekUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDVixDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO0FBQy9DLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDaEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUM7QUFDOUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFD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QUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDckUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNqRSxHQUFHO0FBQ0gsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtBQUMxQixHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDckUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDMUUsR0FBRztBQUNILEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDdkUsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxD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QUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4RCxRQUFBLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RELFFBQUEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEQsUUFBQSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2RCxRQUFBLE9BQU8sSUFBSSxDQUFDO0tBQ1o7QUFDRCxJQUFBLFlBQVksQ0FBQyxNQUFlLEVBQUE7QUFDM0IsUUFBQSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUNmLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUNWLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ1osSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxN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TSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLE9BQU8sTUFBTSxDQUFDO0tBQ2Q7QUFFRCxJQUFBLE9BQU8sY0FBYyxDQUFDLFVBQXNCLEVBQUUsTUFBZ0IsRUFBQTtRQUM3RCxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDdkMsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUN2QyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDdkMsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUN2QyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDdkMsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUN2QyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFFdkMsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQzlCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUU1QixNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQy9CLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFNUIsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1QixNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRS9CLFFBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNyQixPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDaEUsU0FBQTtBQUNELFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxD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V0FBVyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBRXBDLFFBQUEsT0FBTyxNQUFNLENBQUM7S0FDZDtBQUVELElBQUEsT0FBTyxRQUFRLENBQUMsTUFBZSxFQUFFLE1BQWUsRUFBQTtBQUMvQyxRQUFBLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFQyxlQUFhLENBQUMsQ0FBQyxDQUFDO0FBQ25HLFFBQUEsTUFBTSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVBLGVBQWEsQ0FBQyxDQUFDLENBQUM7QUFDbkcsUUFBQSxNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRUEsZUFBYSxDQUFDLENBQUMsQ0FBQztBQUNuRyxRQUFBLE9BQU8sTUFBTSxDQUFDO0tBQ2Q7SUFFRCxPQUFPLGVBQWUsQ0FBQyxNQUFlLEVBQUE7QUFDckMsUUFBQSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRUMsZUFBYSxDQUFDLENBQUM7QUFDeEMsUUFBQSxPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQ0EsZUFBYSxDQUFDLENBQUM7S0FDL0M7QUFFRCxJQUFBLE9BQU8sV0FBVyxDQUFDLE1BQWUsRUFBRSxRQUFpQixFQUFFLE1BQWUsRUFBQTtRQUNyRSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRUMsZUFBYSxDQUFDLENBQUM7QUFFdEQsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDbEMsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDbEMsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDbEMsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDbEMsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDbEMsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDbEMsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDbEMsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDbEMsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFFbEMsUUFBQSxPQUFPLE1BQU0sQ0FBQztLQUNkO0FBRUQsSUFBQSxPQUFPLFdBQVcsQ0FBQyxNQUFlLEVBQUUsTUFBZSxFQUFBO1FBQ2xELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFQyxlQUFhLENBQUMsQ0FBQztBQUV0RCxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNoQyxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNoQyxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNoQyxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNoQyxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNoQyxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNoQyxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNoQyxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNoQyxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUVoQyxRQUFBLE9BQU8sTUFBTSxDQUFDO0tBQ2Q7QUFFRCxJQUFBLE9BQU8sUUFBUSxDQUFDLElBQWEsRUFBRSxLQUFjLEVBQUUsTUFBZSxFQUFBO0FBQzdELFFBQUEsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakYsUUFBQSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRixRQUFBLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRWpGLFFBQUEsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakYsUUFBQSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRixRQUFBLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRWpGLFFBQUEsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakYsUUFBQSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRixRQUFBLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRWpGLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDeEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDeEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDeEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3hCLFFBQUEsT0FBTyxNQUFNLENBQUM7S0FDZDtBQUVELElBQUEsT0FBTyxHQUFHLENBQUMsSUFBYSxFQUFFLEtBQWMsRUFBRSxNQUFlLEVBQUE7QUFDeEQsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsUUFBQSxPQUFPLE1BQU0sQ0FBQztLQUNkO0FBRUQsSUFBQSxPQUFPLFFBQVEsQ0FBQyxJQUFhLEVBQUUsS0FBYyxFQUFFLE1BQWUsRUFBQTtBQUM3RCxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQixRQUFBLE9BQU8sTUFBTSxDQUFDO0tBQ2Q7QUFFRCxJQUFBLE9BQU8sZ0JBQWdCLENBQUMsTUFBZSxFQUFFLFNBQWtCLEVBQUUsTUFBZSxFQUFBO0FBQzNFLFFBQUEsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUN2QixRQUFBLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsUUFBQSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRXZCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzNELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzNELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBRTNELFFBQUEsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixRQUFBLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsUUFBQSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLFFBQUEsT0FBTyxNQUFNLENBQUM7S0FDZDtBQUVELElBQUEsT0FBTyxnQkFBZ0IsQ0FBQyxNQUFlLEVBQUUsTUFBYyxFQUFFLE1BQWUsRUFBQTtRQUN2RSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUMvQixRQUFBLE9BQU8sTUFBTSxDQUFDO0tBQ2Q7QUFFRCxJQUFBLE9BQU8sZUFBZSxDQUFDLE1BQWUsRUFBRSxLQUFjLEVBQUUsTUFBZSxFQUFBO0FBQ3RFLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBRWhDLFFBQUEsT0FBTyxNQUFNLENBQUM7S0FDZDtBQUVELElBQUEsT0FBTyxNQUFNLENBQUMsTUFBZSxFQUFFLE1BQWUsRUFBQTtRQUM3QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixRQUFBLE9BQU8sTUFBTSxDQUFDO0tBQ2Q7QUFFRCxJQUFBLE9BQU8sU0FBUyxDQUFDLE1BQWUsRUFBRSxNQUFlLEVBQUE7QUFDaEQsUUFBQSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsUUFBQSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsUUFBQSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsUUFBQSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsUUFBQSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsUUFBQSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsUUFBQSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsUUFBQSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsUUFBQSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFOUIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDeEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDeEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDeEIsUUFBQSxPQUFPLE1BQU0sQ0FBQztLQUNkO0FBRUQsSUFBQSxPQUFPLEdBQUcsQ0FBQyxNQUFlLEVBQUUsTUFBZSxFQUFBO0FBQzFDLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRWhDLFFBQUEsT0FBTyxNQUFNLENBQUM7S0FDZDtJQUVELE9BQU8sV0FBVyxDQUFDLE1BQWUsRUFBQTtBQUNqQyxRQUFBLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV0QixRQUFBLE9BQU8sR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7S0FDckc7QUFFRCxJQUFBLE9BQU8sT0FBTyxDQUFDLE1BQWUsRUFBRSxNQUFlLEVBQUE7QUFDOUMsUUFBQSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEIsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7UUFHaEQsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUU7QUFDN0MsWUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFDNUMsU0FBQTs7UUFHRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDbEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDbEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDbEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUVsQyxRQUFBLE1BQU0sS0FBSyxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUM7UUFDaEMsT0FBTyxPQUFPLENBQUMs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Q0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxRQUFBLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxRQUFBLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV2QyxRQUFBLE9BQU8sTUFBTSxDQUFDO0tBQ2Q7SUFFRCxPQUFPLEtBQUssQ0FBQyxLQUFjLEVBQUUsR0FBWSxFQUFFLEdBQVksRUFBRSxNQUFlLEVBQUE7QUFDdkUsUUFBQSxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0MsUUFBQSxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0MsUUFBQSxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0MsUUFBQSxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFN0MsUUFBQSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLFFBQUEsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixRQUFBLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsUUFBQSxNQUFNLENBQUMsQ0FBQyxHQUFHLENB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Q0FBQyxFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7QUFDdEUsZ0JBQUEsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQztBQUN0RSxnQkFBQSxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDLENBQUMsRUFDdkU7S0FDRjs7QUE1UWEsT0FBQSxDQUFBLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFdEQsT0FBQSxDQUFBLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFckQsT0FBQSxDQUFBLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFeEQsT0FBQSxDQUFBLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFeEQsT0FBQSxDQUFBLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFeEQsT0FBQSxDQUFBLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFxUXZFO0FBQ0EsTUFBTSxlQUFlLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRTtBQUU5RCxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDOUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLO0FBQ3hDLE1BQU0sZUFBZSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7QUFDdEMsTUFBTUEsYUFBVyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7QUFDQSxJQUFJLE9BQU87O0FDdFI3QyxNQUFNLE9BQU8sQ0FBQTtBQU9aOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkc7QUFDSCxJQUFBLFdBQUEsQ0FDQyxXQUFXLEdBQUcsQ0FBQyxFQUNmLFdBQVcsR0FBRyxDQUFDLEVBQ2YsV0FBVyxHQUFHLENBQUMsRUFDZixXQUFXLEdBQUcsQ0FBQyxFQUNmLFdBQVcsR0FBRyxDQUFDLEVBQ2YsV0FBVyxHQUFHLENBQUMsRUFDZixXQUFXLEdBQUcsQ0FBQyxFQUNmLFdBQVcsR0FBRyxDQUFDLEVBQ2YsV0FBVyxHQUFHLENBQUMsRUFDZixXQUFXLEdBQUcsQ0FBQyxFQUNmLFdBQVcsR0FBRyxDQUFDLEVBQ2YsV0FBVyxHQUFHLENBQUMsRUFDZixXQUFXLEdBQUcsQ0FBQyxFQUNmLFdBQVcsR0FBRyxDQUFDLEVBQ2YsV0FBVyxHQUFHLENBQUMsRUFDZixXQUFXLEdBQUcsQ0FBQyxFQUFBO0FBRWYsUUFBQSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3RCLFFBQUEsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN0QixRQUFBLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDdEIsUUFBQSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3RCLFFBQUEsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN0QixRQUFBLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDdEIsUUFBQSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3RCLFFBQUEsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN0QixRQUFBLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDdEIsUUFBQSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3RCLFFBQUEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN2QixRQUFBLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDdkIsUUFBQSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3ZCLFFBQUEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN2QixRQUFBLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDdkIsUUFBQSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDO0tBQ3ZCOztBQUVELElBQUEsS0FBSyxDQUFDLE1BQUEsR0FBa0IsSUFBSSxPQUFPLEVBQUUsRUFBQTtRQUNwQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ25DO0FBQ0QsSUFBQSxHQUFHLENBQUMsSUFBYSxFQUFBO0FBQ2hCLFFBQUEsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDMUIsUUFBQSxPQUFPLElBQUksQ0FBQztLQUNaO0FBQ0QsSUFBQSxNQUFNLENBQUMsS0FBYyxFQUFBO1FBQ3BCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDbkM7QUFDRCxJQUFBLE9BQU8sQ0FBQyxRQUFpQixFQUFFLFVBQXNCLEVBQUUsS0FBYyxFQUFBO1FBQ2hFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQztRQUVoQixNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxFQUNyQixDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsRUFDaEIsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLEVBQ2hCLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLFFBQUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFDZixFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFDVixFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNaLFFBQUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFDaEIsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQ1gsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYixRQUFBLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQ2hCLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUNYLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2IsUUFBQSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUNoQixFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUViLFFBQUEsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFDakIsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQ1osRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFFZCxRQUFBLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3ZCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3ZCLFFBQUEsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVWLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3ZCLFFBQUEsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDdkIsUUFBQSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRVYsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDdkIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDdkIsUUFBQSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUM5QixRQUFBLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFWCxRQUFBLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLFFBQUEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDcEIsUUFBQSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUNwQixRQUFBLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFWCxRQUFBLE9BQU8sSUFBSSxDQUFDO0tBQ1o7QUFDRCxJQUFBLGFBQWEsQ0FBQyxLQUFjLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBQTtRQUN4QyxPQUFPLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztLQUNuRDtBQUNELElBQUEsTUFBTSxDQUFDLEdBQVksRUFBRSxNQUFlLEVBQUUsRUFBVyxFQUFBO1FBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQztRQUNwQixPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDakMsUUFBQSxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUU7O0FBRXJCLFlBQUEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDUixTQUFBO1FBQ0QsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLFFBQUEsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFOztZQUdyQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUN6QixnQkFBQSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQztBQUNkLGFBQUE7QUFBTSxpQkFBQTtBQUNOLGdCQUFBLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDO0FBQ2QsYUFBQTtZQUNELENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4QixTQUFBO1FBQ0QsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixRQUFBLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRWpCLFFBQUEsT0FBTyxJQUFJLENBQUM7S0FDWjtJQUNELFFBQVEsR0FBQTtRQUNQLFFBQ0MsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsRUFBQSxFQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBSyxFQUFBLEVBQUEsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBSyxHQUFBLENBQUE7QUFDckQsWUFBQSxDQUFBLENBQUEsRUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUssRUFBQSxFQUFBLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsRUFBQSxFQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBSyxHQUFBLENBQUE7QUFDckQsWUFBQSxDQUFBLENBQUEsRUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUssRUFBQSxFQUFBLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUEsRUFBQSxFQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBSyxHQUFBLENBQUE7WUFDdEQsQ0FBSSxDQUFBLEVBQUEsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxFQUFBLEVBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFLLEVBQUEsRUFBQSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUcsQ0FBQSxDQUFBLEVBQ25EO0tBQ0Y7QUFDRCxJQUFBLE9BQU8sS0FBSyxDQUFDLE1BQTBCLEVBQUUsTUFBZSxFQUFBO0FBQ3ZELFFBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNyQixZQUFBLE9BQU8sU0FBUyxDQUFDO0FBQ2pCLFNBQUE7QUFDRCxRQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDckIsWUFBQSxPQUFPLElBQUksT0FBTyxDQUNqQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQ1QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUNULE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFDVCxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQ1YsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUNULE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFDVCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQ1QsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUNWLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFDVCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQ1QsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUNWLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFDVixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQ1QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUNULE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFDVixNQUFNLENBQUMsRUFBRSxDQUFDLENBQ1YsQ0FBQztBQUNGLFNBQUE7UUFDRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hCLFFBQUEsT0FBTyxNQUFNLENBQUM7S0FDZDtBQUVELElBQUEsT0FBTyxvQkFB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QUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUVuQyxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDOUIsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1QixNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRTVCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDL0IsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUU1QixNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFL0IsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztBQUN6QixRQUFBLE1BQU0sQ0FBQyxD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QUFDO0FBQzFDLFFBQUEsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxLQUFLLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUMxQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDOUIsUUFBQSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksS0FBSyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFFdkMsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENB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LENBQUM7Z0JBQ1QsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDVCxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNULE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDVixNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNWLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDVixNQUFNLENBQUMsRUFBRSxDQUFDO2FBQ1YsQ0FBQztBQUNGLFNBQUE7UUFDRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMs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QUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDcEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDcEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDcEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztRQUNwQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztRQUNwQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQztRQUN0QyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXhCLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFeEIsUUFBQSxPQUFPLE1BQU0sQ0FBQztLQUNkO0FBRUQsSUFBQSxPQUFPLFFBQVEsQ0FBQyxNQUFlLEVBQUUsTUFBZSxFQUFBO0FBQy9DLFFBQUEsTUFBTSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVDLGVBQWEsQ0FBQyxDQUFDLENBQUM7QUFDbkcsUUFBQSxNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRUEsZUFBYSxDQUFDLENBQUMsQ0FBQztBQUNuRyxRQUFBLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFQSxlQUFhLENBQUMsQ0FBQyxDQUFDO0FBQ3BHLFFBQUEsT0FBTyxNQUFNLENBQUM7S0FDZDtJQUVELE9BQU8sZUFBZSxDQUFDLE1BQWUsRUFBQTtBQUNyQyxRQUFBLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFQyxlQUFhLENBQUMsQ0FBQztBQUN4QyxRQUFBLE9BQU8sT0FBTyxDQUFDLGdCQUFnQixDQUFDQSxlQUFhLENBQUMsQ0FBQztLQUMvQztBQUVELElBQUEsT0FBTyxXQUFXLENBQUMsTUFBZSxFQUFFLFFBQWlCLEVBQUUsTUFBZSxFQUFBO1FBQ3JFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFQyxlQUFhLENBQUMsQ0FBQztBQUV0RCxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNsQyxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNsQyxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRXRCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFdEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDbEMsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDbEMsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV4QixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRXhCLFFBQUEsT0FBTyxNQUFNLENBQUM7S0FDZDtBQUVELElBQUEsT0FBTyxXQUFXLENBQUMsTUFBZSxFQUFFLE1BQWtCLEVBQUE7UUFDckQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUVDLGVBQWEsQ0FBQyxDQUFDO0FBRXRELFFBQUEsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRXhCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDN0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzdCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDN0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzdCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDN0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBRTlCLFFBQUEsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRVYsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQ2QsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQixZQUFBLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNwQixNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7WUFDN0IsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUM3QixTQUFBO0FBQU0sYUFBQSxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksRUFBRTtBQUN0QyxZQUFBLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDN0IsWUFBQSxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7WUFDcEIsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUM3QixTQUFBO2FBQU0sSUFBSSxJQUFJLEdBQUcsSUFBSSxFQUFFO0FBQ3ZCLFlBQUEsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUM3QixNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDN0IsWUFBQSxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7WUFDcEIsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQzdCLFNBQUE7QUFBTSxhQUFBO0FBQ04sWUFBQSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUM3QixNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDN0IsWUFBQSxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDcEIsU0FBQTtBQUNELFFBQUEsT0FBTyxNQUFNLENBQUM7S0FDZDtBQUVELElBQUEsT0FBTyxRQUFRLENBQUMsSUFBYSxFQUFFLEtBQWMsRUFBRSxNQUFlLEVBQUE7QUFDN0QsUUFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFeEIsUUFBQSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsUUFBQSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsUUFBQSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsUUFBQSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsUUFBQSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsUUFBQSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFMUIsUUFBQSxNQUFNLFdBQVcsR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3ZGLFFBQUEsTUFBTSxXQUFXLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUN2RixRQUFBLE1BQU0sV0FBVyxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDeEYsUUFBQSxNQUFNLFdBQVcsR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBRXhGLFFBQUEsTUFBTSxXQUFXLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUN2RixRQUFBLE1BQU0sV0FBVyxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDdkYsUUFBQSxNQUFNLFdBQVcsR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3hGLFFBQUEsTUFBTSxXQUFXLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUV4RixRQUFBLE1BQU0sV0FBVyxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsT0FBTyxHQUFHLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFDekYsUUFBQSxNQUFNLFdBQVcsR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLE9BQU8sR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBQ3pGLFFBQUEsTUFBTSxXQUFXLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxPQUFPLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQztBQUMxRixRQUFBLE1BQU0sV0FBVyxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsT0FBTyxHQUFHLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFFMUYsUUFBQSxNQUFNLFdBQVcsR0FBRyxLQUFLLEdBQUcsT0FBTyxHQUFHLEtBQUssR0FBRyxPQUFPLEdBQUcsS0FBSyxHQUFHLE9BQU8sR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBQzNGLFFBQUEsTUFBTSxXQUFXLEdBQUcsS0FBSyxHQUFHLE9BQU8sR0FBRyxLQUFLLEdBQUcsT0FBTyxHQUFHLEtBQUssR0FBRyxPQUFPLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQztBQUMzRixRQUFBLE1BQU0sV0FBVyxHQUFHLEtBQUssR0FBRyxPQUFPLEdBQUcsS0FBSyxHQUFHLE9BQU8sR0FBRyxNQUFNLEdBQUcsT0FBTyxHQUFHLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFDNUYsUUFBQSxNQUFNLFdBQVcsR0FBRyxLQUFLLEdBQUcsT0FBTyxHQUFHLEtBQUssR0FBRyxPQUFPLEdBQUcsTUFBTSxHQUFHLE9BQU8sR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBRTVGLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDeEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDeEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDeEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDekIsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3pCLFFBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN6QixRQUFBLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDekIsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3pCLFFBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN6QixRQUFBLE9BQU8sTUFBTSxDQUFDO0tBQ2Q7QUFFRCxJQUFBLE9BQU8sR0FBRyxDQUFDLElBQWEsRUFBRSxLQUFjLEVBQUUsTUFBZSxFQUFBO0FBQ3hELFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQyxRQUFBLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xDLFFBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEMsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQyxRQUFBLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xDLFFBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEMsUUFBQSxPQUFPLE1BQU0sQ0FBQztLQUNkO0FBRUQsSUFBQSxPQUFPLFFBQVEsQ0FBQyxJQUFhLEVBQUUsS0FBYyxFQUFFLE1BQWUsRUFBQTtBQUM3RCxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFFBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEMsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQyxRQUFBLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xDLFFBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEMsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQyxRQUFBLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xDLFFBQUEsT0FBTyxNQUFNLENBQUM7S0FDZDtBQUVELElBQUEsT0FBTyxzQkFBc0IsQ0FBQyxJQUFhLEVBQUUsS0FBYyxFQUFFLE1BQWUsRUFBQTtBQUMzRSxRQUFBLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFBLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUV4QixRQUFBLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixRQUFBLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixRQUFBLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixRQUFBLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUUxQixRQUFBLE1BQU0sV0FBVyxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO0FBQ3JFLFFBQUEsTUFBTSxXQUFXLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUM7QUFDckUsUUFBQSxNQUFNLFdBQVcsR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUV0RSxRQUFBLE1BQU0sV0FBVyxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO0FBQ3JFLFFBQUEsTUFBTSxXQUFXLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUM7QUFDckUsUUFBQSxNQUFNLFdBQVcsR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUV0RSxRQUFBLE1BQU0sV0FBVyxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsT0FBTyxDQUFDO0FBQ3RFLFFBQUEsTUFBTSxXQUFXLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxPQUFPLENBQUM7QUFDdEUsUUFBQSxNQUFNLFdBQVcsR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQztBQUV2RSxRQUFBLE1BQU0sV0FBVyxHQUFHLEtBQUssR0FBRyxPQUFPLEdBQUcsS0FBSyxHQUFHLE9BQU8sR0FBRyxLQUFLLEdBQUcsT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUNqRixRQUFBLE1BQU0sV0FBVyxHQUFHLEtBQUssR0FBRyxPQUFPLEdBQUcsS0FBSyxHQUFHLE9BQU8sR0FBRyxLQUFLLEdBQUcsT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUNqRixRQUFBLE1BQU0sV0FBVyxHQUFHLEtBQUssR0FBRyxPQUFPLEdBQUcsS0FBSyxHQUFHLE9BQU8sR0FBRyxNQUFNLEdBQUcsT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUVsRixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDeEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDeEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDeEIsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3pCLFFBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixRQUFBLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDekIsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3pCLFFBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN6QixRQUFBLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsUUFBQSxPQUFPLE1BQU0sQ0FBQztLQUNkO0FBRUQsSUFBQSxPQUFPLGlCQUFpQixDQUFDLE1BQWUsRUFBRSxRQUFpQixFQUFFLE1BQWUsRUFBQTtBQUMzRSxRQUFBLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUUxQixRQUFBLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixRQUFBLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixRQUFBLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixRQUFBLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixRQUFBLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixRQUFBLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixRQUFBLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixRQUFBLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixRQUFBLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUU1QixRQUFBLE1BQU0sV0FBVyxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO0FBQ3JFLFFBQUEsTUFBTSxXQUFXLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUM7QUFDckUsUUFBQSxNQUFNLFdBQVcsR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUV0RSxRQUFBLE1BQU0sV0FBVyxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO0FBQ3JFLFFBQUEsTUFBTSxXQUFXLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUM7QUFDckUsUUFBQSxNQUFNLFdBQVcsR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUV0RSxRQUFBLE1BQU0sV0FBVyxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsT0FBTyxDQUFDO0FBQ3RFLFFBQUEsTUFBTSxXQUFXLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxPQUFPLENBQUM7QUFDdEUsUUFBQSxNQUFNLFdBQVcsR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQztBQUV2RSxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDeEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDeEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDeEIsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3pCLFFBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNqQixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hCLFFBQUEsT0FBTyxNQUFNLENBQUM7S0FDZDtBQUVELElBQUEsT0FBTyxxQkFBcUIsQ0FBQyxNQUFlLEVBQUUsV0FBb0IsRUFBRSxNQUFlLEVBQUE7QUFDbEYsUUFBQSxNQUFNLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFeEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0RSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdkUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEIsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLFFBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQixRQUFBLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDaEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4QixRQUFBLE9BQU8sTUFBTSxDQUFDO0tBQ2Q7QUFFRCxJQUFBLE9BQU8sZUFBZSxDQUFDLE1BQWUsRUFBRSxLQUFjLEVBQUUsTUFBZSxFQUFBO0FBQ3RFLFFBQUEsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN2QixRQUFBLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdkIsUUFBQSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDOztRQUd2QixJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDckMsU0FBQTtRQUVELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXhCLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFeEIsUUFBQSxPQUFPLE1BQU0sQ0FBQztLQUNkO0FBRUQsSUFBQSxPQUFPLHNCQUFzQixDQUFDLE1BQWUsRUFBRSxLQUFhLEVBQUUsTUFBZSxFQUFBO1FBQzVFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDOUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDOUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDOUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUM5QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUM5QixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxD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R0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzNELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBRTVELFFBQUEsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixRQUFBLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsUUFBQSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLFFBQUEsT0FBTyxNQUFNLENBQUM7S0FDZDtBQUVELElBQUEsT0FBTyxlQUFlLENBQUMsTUFBZSxFQUFFLFNBQWtCLEVBQUUsTUFBZSxFQUFBO0FBQzFFLFFBQUEsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUN2QixRQUFBLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsUUFBQSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRXZCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4RSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEUsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRXpFLFFBQUEsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixRQUFBLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsUUFBQSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLFFBQUEsT0FBTyxNQUFNLENBQUM7S0FDZDtBQUVELElBQUEsT0FBTyxnQkFBZ0IsQ0FBQyxNQUFlLEVBQUUsTUFBYyxFQUFFLE1BQWUsRUFBQTtRQUN2RSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUNqQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUNqQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUNqQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUNqQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUNqQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNqQyxRQUFBLE9BQU8sTUFBTSxDQUFDO0tBQ2Q7QUFFRCxJQUFBLE9BQU8sTUFBTSxDQUFDLE1BQWUsRUFBRSxNQUFlLEVBQUE7UUFDN0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3pCLFFBQUEsT0FBTyxNQUFNLENBQUM7S0FDZDtBQUVELElBQUEsT0FBTyxTQUFTLENBQUMsTUFBZSxFQUFFLE1BQWUsRUFBQTtBQUNoRCxRQUFBLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQixRQUFBLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQixRQUFBLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQixRQUFBLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQixRQUFBLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQixRQUFBLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUU1QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUNwQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN2QixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDcEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4QixRQUFBLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDckIsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQ3JCLFFBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUN0QixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hCLFFBQUEsT0FBTyxNQUFNLENBQUM7S0FDZDtBQUVELElBQUEsT0FBTyxHQUFHLENBQUMsTUFBZSxFQUFFLE1BQWUsRUFBQTtBQUMxQyxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxR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QUFJLEtBQUssS0FBSzthQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUNkLGdCQUFBLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU87QUFDdkMsZ0JBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTztBQUN2QyxnQkFBQSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPO0FBQ3ZDLGdCQUFBLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU87QUFDdkMsZ0JBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTztBQUN2QyxnQkFBQSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPO0FBQ3ZDLGdCQUFBLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU87QUFDdkMsZ0JBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTztBQUN2QyxnQkFBQSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPO0FBQ3ZDLGdCQUFBLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU87QUFDdkMsZ0JBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksT0FBTztBQUN6QyxnQkFBQSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxPQUFPO0FBQ3pDLGdCQUFBLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE9BQU87QUFDekMsZ0JBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksT0FBTztBQUN6QyxnQkFBQSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxPQUFPO0FBQ3pDLGdCQUFBLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxFQUMxQztLQUNGO0FBRUQsSUFBQSxPQUFPLGNBQWMsQ0FBQyxNQUFlLEVBQUUsTUFBZSxFQUFBO0FBQ3JELFFBQUEsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN0QixRQUFBLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RCLFFBQUEsT0FBTyxNQUFNLENBQUM7S0FDZDtBQUVELElBQUEsT0FBTyxVQUFVLENBQUMsTUFBZSxFQUFFLE1BQWUsRUFBQTtRQUNqRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN2QixRQUFBLE9BQU8sTUFBTSxDQUFDO0tBQ2Q7QUFFRCxJQUFBLE9BQU8sT0FBTyxDQUFDLE1BQWUsRUFBRSxNQUFlLEVBQUE7Ozs7O0FBSzlDLFFBQUEsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLFFBQUEsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLFFBQUEsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLFFBQUEsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLFFBQUEsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLFFBQUEsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLFFBQUEsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLFFBQUEsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLFFBQUEsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3pCLFFBQUEsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3pCLFFBQUEsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLFFBQUEsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3pCLFFBQUEsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDOztBQUd6QixRQUFBLElBQUksSUFBSSxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDekIsUUFBQSxJQUFJLElBQUksR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3pCLFFBQUEsSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQztBQUN4QixRQUFBLElBQUksSUFBSSxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDekIsUUFBQSxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQ3hCLFFBQUEsSUFBSSxJQUFJLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN6QixRQUFBLElBQUksSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUM7QUFDeEIsUUFBQSxJQUFJLElBQUksR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3pCLFFBQUEsSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQztBQUN4QixRQUFBLElBQUksSUFBSSxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDekIsUUFBQSxJQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQ3pCLFFBQUEsSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQzs7UUFHekIsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNqRyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ2pHLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDbkcsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNuRyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ2pHLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDakcsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNuRyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDOztBQUduRyxRQUFBLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ25CLFFBQUEsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDbkIsUUFBQSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNuQixRQUFBLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ25CLFFBQUEsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDbkIsUUFBQSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNuQixRQUFBLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ25CLFFBQUEsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDbkIsUUFBQSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNuQixRQUFBLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ25CLFFBQUEsS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDcEIsUUFBQSxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQzs7UUFHcEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQztRQUN2RyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQ3ZHLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDMUcsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQztRQUMxRyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQ3RHLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtB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TSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLFFBQUEsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLFFBQUEsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLFFBQUEsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLFFBQUEsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLFFBQUEsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLFFBQUEsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLFFBQUEsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRTVCLFFBQUEsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RCLFFBQUEsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RCLFFBQUEsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRXRCLFFBQUEsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsRUFBRSxHQUFHLE9BQU8sR0FBRyxFQUFFLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUN0RCxRQUFBLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLEVBQUUsR0FBRyxPQUFPLEdBQUcsRUFBRSxHQUFHLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDdEQsUUFBQSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxFQUFFLEdBQUcsT0FBTyxHQUFHLEVBQUUsR0FBRyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBRXZELFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUNwQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDcEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQ3BCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDcEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQ3BCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUNwQixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQ3BCLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUNwQixRQUFBLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUM7QUFDdEIsUUFBQSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLFFBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNmLFFBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNmLFFBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNmLFFBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixRQUFBLE9BQU8sTUFBTSxDQUFDO0tBQ2Q7QUFFRCxJQUFBLE9BQU8sZ0JBQWdCLENBQUMsTUFBZSxFQUFFLE1BQWUsRUFBQTtBQUN2RCxRQUFBLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ2xGO0FBQ0Q7O0FBRUc7QUFDSCxJQUFBLE9BQU8sV0FBVyxDQUFDLE1BQWUsRUFBRSxLQUFvQixFQUFFLE1BQWMsRUFBQTtRQUN2RSxRQUNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDL0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDL0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDL0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNqQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDakMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNqQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxDQUFDLE1BQU0sR0FB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LEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RSxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxZQUFBLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxZQUFBLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxZQUFBLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU3QyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkIsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2QixZQUFBLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFB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QUFtQixDQUFBLENBQUEsR0FBWSxDQUFDLEVBQVMsQ0FBWSxHQUFBLENBQUMsRUFBUyxDQUFZLEdBQUEsQ0FBQyxFQUFTLENBQUEsR0FBWSxDQUFDLEVBQUE7UUFBL0UsSUFBQyxDQUFBLENBQUEsR0FBRCxDQUFDLENBQVk7UUFBUyxJQUFDLENBQUEsQ0FBQSxHQUFELENBQUMsQ0FBWTtRQUFTLElBQUMsQ0FBQSxDQUFBLEdBQUQsQ0FBQyxDQUFZO1FBQVMsSUFBQyxDQUFBLENBQUEsR0FBRCxDQUFDLENBQVk7S0FBSTtBQUN0RyxJQUFBLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUE7QUFDYixRQUFBLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1gsUUFBQSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNYLFFBQUEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDWCxRQUFBLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ1g7SUFDRCxTQUFTLEdBQUE7UUFDUixNQUFNLGdCQUFnQixHQUFHLEdBQUcsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFELFFBQUEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztBQUNwQyxRQUFBLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7QUFDcEMsUUFBQSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDO0FBQ3BDLFFBQUEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztBQUVwQyxRQUFBLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1gsUUFBQSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNYLFFBQUEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFD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Q3JCLFFBQUEsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNyQixRQUFBLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDckIsUUFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBRXJCLFFBQUEsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN2QixRQUFBLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdkIsUUFBQSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLFFBQUEsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUV2QixRQUFBLE1BQU0sQ0FBQyxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUM7QUFDNUUsUUFBQSxNQUFNLENBQUMsR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO0FBQzVFLFFBQUEsTUFBTSxDQUFDLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUM1RSxRQUFBLE1BQU0sQ0FBQyxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUM7QUFFNUUsUUFBQSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLFFBQUEsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixRQUFBLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsUUFBQSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMs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QyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2xHLElBQUEsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLElBQUEsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLElBQUEsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLElBQUEsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLElBQUEsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLElBQUEsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRTVCLElBQUEsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQztBQUN6QyxJQUFBLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDO0FBQ2pELElBQUEsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUM7SUFDbEQsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDO0FBQzFELElBQUEsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ2pDLElBQUEsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUN6QyxJQUFBLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDMUMsSUFBQSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUVsRCxJQUFBLE1BQU0sU0FBUyxHQUFHOztBQUVqQixRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7O0FBR0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDOztBQUdMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQzs7QUFHTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7O0FBR0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDOztBQUdMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQUEsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFBLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBQSxHQUFHLENBQUMsQ0FBQztLQUNMLENBQUM7QUFFRixJQUFBLE1BQU0sR0FBRyxHQUFHOztRQUVYLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7UUFHbEMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztRQUdsQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O1FBR2xDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7UUFHbEMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztRQUdsQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7S0FDbEMsQ0FBQztBQUVGLElBQUEsTUFBTSxPQUFPLEdBQUc7O0FBRWYsUUFBQSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0FBR3BELFFBQUEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztBQUdwRCxRQUFBLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7QUFHMUQsUUFBQSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENB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QSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QixFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLENBQUM7UUFDcEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDL0IsWUFBQSxVQUFVLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUMzQixZQUFBLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDaEQsWUFBQSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQztBQUM1RCxZQUFBLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzNELFlBQUEsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZFLFlBQUEsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNoRCxZQUFBLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0FBQzVELFlBQUEsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFB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R0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNsRixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDbEYsUUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ2xGLFFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRXRCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNsRixRQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV0QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxJQUFJLENB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 diff --git a/package-lock.json b/package-lock.json index 8a85035..0939035 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5151 +1,5155 @@ { - "name": "GEngine", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "GEngine", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@rollup/plugin-commonjs": "^23.0.2", - "@types/gl-matrix": "^2.4.5", - "@typescript-eslint/eslint-plugin": "^5.59.5", - "@typescript-eslint/parser": "^5.59.5", - "@webgpu/glslang": "0.0.15", - "@webgpu/types": "0.1.20", - "cross-env": "^7.0.3", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-unused-imports": "^2.0.0", - "glob": "^8.0.3", - "mersenne-twister": "^1.1.0", - "prettier-eslint": "^15.0.1", - "primitive-geometry": "^2.9.0" - }, - "devDependencies": { - "@rollup/plugin-terser": "^0.4.2", - "commitizen": "^4.3.0", - "cz-conventional-changelog": "^3.3.0", - "cz-conventional-changelog-zh": "0.0.2", - "eslint": "^8.40.0", - "husky": "^8.0.3", - "prettier": "^2.8.3", - "pretty-quick": "^3.1.3", - "rollup": "3.10.0", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-replace": "^2.2.0", - "rollup-plugin-typescript2": "^0.31.1", - "typescript": "^4.8.4" - }, - "engines": { - "node": ">=14.19.3" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "optional": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "optional": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@commitlint/config-validator": { - "version": "17.4.0", - "resolved": "https://registry.npmmirror.com/@commitlint/config-validator/-/config-validator-17.4.0.tgz", - "integrity": "sha512-Sa/+8KNpDXz4zT4bVbz2fpFjvgkPO6u2V2fP4TKgt6FjmOw2z3eEX859vtfeaTav/ukBw0/0jr+5ZTZp9zCBhA==", - "dev": true, - "optional": true, - "dependencies": { - "@commitlint/types": "^17.4.0", - "ajv": "^8.11.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/execute-rule": { - "version": "17.4.0", - "resolved": "https://registry.npmmirror.com/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", - "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/load": { - "version": "17.4.2", - "resolved": "https://registry.npmmirror.com/@commitlint/load/-/load-17.4.2.tgz", - "integrity": "sha512-Si++F85rJ9t4hw6JcOw1i2h0fdpdFQt0YKwjuK4bk9KhFjyFkRxvR3SB2dPaMs+EwWlDrDBGL+ygip1QD6gmPw==", - "dev": true, - "optional": true, - "dependencies": { - "@commitlint/config-validator": "^17.4.0", - "@commitlint/execute-rule": "^17.4.0", - "@commitlint/resolve-extends": "^17.4.0", - "@commitlint/types": "^17.4.0", - "@types/node": "*", - "chalk": "^4.1.0", - "cosmiconfig": "^8.0.0", - "cosmiconfig-typescript-loader": "^4.0.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0", - "resolve-from": "^5.0.0", - "ts-node": "^10.8.1", - "typescript": "^4.6.4" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/load/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/load/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@commitlint/load/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@commitlint/load/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, - "node_modules/@commitlint/load/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/load/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "optional": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/resolve-extends": { - "version": "17.4.0", - "resolved": "https://registry.npmmirror.com/@commitlint/resolve-extends/-/resolve-extends-17.4.0.tgz", - "integrity": "sha512-3JsmwkrCzoK8sO22AzLBvNEvC1Pmdn/65RKXzEtQMy6oYMl0Snrq97a5bQQEFETF0VsvbtUuKttLqqgn99OXRQ==", - "dev": true, - "optional": true, - "dependencies": { - "@commitlint/config-validator": "^17.4.0", - "@commitlint/types": "^17.4.0", - "import-fresh": "^3.0.0", - "lodash.mergewith": "^4.6.2", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/types": { - "version": "17.4.0", - "resolved": "https://registry.npmmirror.com/@commitlint/types/-/types-17.4.0.tgz", - "integrity": "sha512-2NjAnq5IcxY9kXtUeO2Ac0aPpvkuOmwbH/BxIm36XXK5LtWFObWJWjXOA+kcaABMrthjWu6la+FUpyYFMHRvbA==", - "dev": true, - "optional": true, - "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@commitlint/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@commitlint/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, - "node_modules/@commitlint/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "optional": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "optional": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "optional": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.2", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "8.40.0", - "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.40.0.tgz", - "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "engines": { - "node": ">=12.22" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rollup/plugin-commonjs": { - "version": "23.0.7", - "resolved": "https://registry.npmmirror.com/@rollup/plugin-commonjs/-/plugin-commonjs-23.0.7.tgz", - "integrity": "sha512-hsSD5Qzyuat/swzrExGG5l7EuIlPhwTsT7KwKbSCQzIcJWjRxiimi/0tyMYY2bByitNb3i1p+6JWEDGa0NvT0Q==", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "glob": "^8.0.3", - "is-reference": "1.2.1", - "magic-string": "^0.27.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.68.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-terser": { - "version": "0.4.2", - "resolved": "https://registry.npmmirror.com/@rollup/plugin-terser/-/plugin-terser-0.4.2.tgz", - "integrity": "sha512-jfUVQ4MxzIB0mz8QhDA1xiLT+pTF3WEWXeIqcwhoF84WhLWscPpxjJgjYMyAq0Po4UXqw2D9C64tD0gRDzJzfA==", - "dev": true, - "dependencies": { - "serialize-javascript": "^6.0.0", - "smob": "^0.0.6", - "terser": "^5.15.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.x || ^3.x" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-terser/node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.0.2", - "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", - "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true, - "optional": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "optional": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "optional": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true, - "optional": true - }, - "node_modules/@types/eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" - }, - "node_modules/@types/gl-matrix": { - "version": "2.4.5", - "resolved": "https://registry.npmmirror.com/@types/gl-matrix/-/gl-matrix-2.4.5.tgz", - "integrity": "sha512-0L8Mq1+oaIW0oVzGUDbSW+HnTjCNb4CmoIQE5BkoHt/A7x20z0MJ1PnwfH3atty/vbWLGgvJwVu2Mz3SKFiEFw==" - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmmirror.com/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmmirror.com/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmmirror.com/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==" - }, - "node_modules/@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmmirror.com/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.6", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz", - "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/type-utils": "5.59.6", - "@typescript-eslint/utils": "5.59.6", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.59.6", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.59.6.tgz", - "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", - "dependencies": { - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.6", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", - "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", - "dependencies": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.6", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz", - "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", - "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.6", - "@typescript-eslint/utils": "5.59.6", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.59.6", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.59.6.tgz", - "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.6", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", - "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", - "dependencies": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.59.6", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.59.6.tgz", - "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.6", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", - "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", - "dependencies": { - "@typescript-eslint/types": "5.59.6", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@webgpu/glslang": { - "version": "0.0.15", - "resolved": "https://registry.npmmirror.com/@webgpu/glslang/-/glslang-0.0.15.tgz", - "integrity": "sha512-niT+Prh3Aff8Uf1MVBVUsaNjFj9rJAKDXuoHIKiQbB+6IUP/3J3JIhBNyZ7lDhytvXxw6ppgnwKZdDJ08UMj4Q==" - }, - "node_modules/@webgpu/types": { - "version": "0.1.20", - "resolved": "https://registry.npmmirror.com/@webgpu/types/-/types-0.1.20.tgz", - "integrity": "sha512-MFb5oyxX+A7PWQNjcY3kSCSG2FAHaBo7IJBWtxWFgsS20FtY3D9UY7lYqLZ6avS8fSkdSylIS4qiHzFlQUdXag==" - }, - "node_modules/@yarn-tool/resolve-package": { - "version": "1.0.47", - "resolved": "https://registry.npmmirror.com/@yarn-tool/resolve-package/-/resolve-package-1.0.47.tgz", - "integrity": "sha512-Zaw58gQxjQceJqhqybJi1oUDaORT8i2GTgwICPs8v/X/Pkx35FXQba69ldHVg5pQZ6YLKpROXgyHvBaCJOFXiA==", - "dev": true, - "dependencies": { - "pkg-dir": "< 6 >= 5", - "tslib": "^2", - "upath2": "^3.1.13" - } - }, - "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "optional": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - } - }, - "node_modules/array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmmirror.com/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/commitizen": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/commitizen/-/commitizen-4.3.0.tgz", - "integrity": "sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==", - "dev": true, - "dependencies": { - "cachedir": "2.3.0", - "cz-conventional-changelog": "3.3.0", - "dedent": "0.7.0", - "detect-indent": "6.1.0", - "find-node-modules": "^2.1.2", - "find-root": "1.1.0", - "fs-extra": "9.1.0", - "glob": "7.2.3", - "inquirer": "8.2.5", - "is-utf8": "^0.2.1", - "lodash": "4.17.21", - "minimist": "1.2.7", - "strip-bom": "4.0.0", - "strip-json-comments": "3.1.1" - }, - "bin": { - "commitizen": "bin/commitizen", - "cz": "bin/git-cz", - "git-cz": "bin/git-cz" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/commitizen/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/commitizen/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/commitizen/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/commitizen/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmmirror.com/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/conventional-commit-types": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", - "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-8.0.0.tgz", - "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", - "dev": true, - "optional": true, - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz", - "integrity": "sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==", - "dev": true, - "optional": true, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=7", - "ts-node": ">=10", - "typescript": ">=3" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "optional": true - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cz-conventional-changelog": { - "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", - "integrity": "sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "commitizen": "^4.0.3", - "conventional-commit-types": "^3.0.0", - "lodash.map": "^4.5.1", - "longest": "^2.0.1", - "word-wrap": "^1.0.3" - }, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@commitlint/load": ">6.1.1" - } - }, - "node_modules/cz-conventional-changelog-zh": { - "version": "0.0.2", - "resolved": "https://registry.npmmirror.com/cz-conventional-changelog-zh/-/cz-conventional-changelog-zh-0.0.2.tgz", - "integrity": "sha512-rXy2HiG/0M7xChuodAN1L9qHDWTBInGTljaE59AlyqrXQAv0srg147vjep5CO7mGtxVYJQJi9TVP5KVZMWxDqQ==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "commitizen": "^4.0.3", - "conventional-commit-types": "^3.0.0", - "lodash.assign": "^4.2.0", - "lodash.map": "^4.5.1", - "longest": "^2.0.1", - "word-wrap": "^1.0.3" - }, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@commitlint/load": ">6.1.1" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "optional": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.40.0", - "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.40.0.tgz", - "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.40.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmmirror.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmmirror.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmmirror.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-unused-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", - "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", - "dependencies": { - "eslint-rule-composer": "^0.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "eslint": "^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - } - } - }, - "node_modules/eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmmirror.com/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-node-modules": { - "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/find-node-modules/-/find-node-modules-2.1.3.tgz", - "integrity": "sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==", - "dev": true, - "dependencies": { - "findup-sync": "^4.0.0", - "merge": "^2.1.1" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/findup-sync": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/findup-sync/-/findup-sync-4.0.0.tgz", - "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", - "dev": true, - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^4.0.2", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmmirror.com/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmmirror.com/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", - "dev": true, - "optional": true, - "dependencies": { - "ini": "^1.3.4" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/globals/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dependencies": { - "get-intrinsic": "^1.1.1" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/husky": { - "version": "8.0.3", - "resolved": "https://registry.npmmirror.com/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", - "dev": true, - "bin": { - "husky": "lib/bin.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/inquirer": { - "version": "8.2.5", - "resolved": "https://registry.npmmirror.com/inquirer/-/inquirer-8.2.5.tgz", - "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "optional": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dependencies": { - "has-bigints": "^1.0.1" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dependencies": { - "call-bind": "^1.0.2" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmmirror.com/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "dev": true - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmmirror.com/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "optional": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "optional": true - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "optional": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "optional": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", - "dev": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "optional": true - }, - "node_modules/lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmmirror.com/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmmirror.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true, - "optional": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true, - "optional": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/loglevel": { - "version": "1.8.1", - "resolved": "https://registry.npmmirror.com/loglevel/-/loglevel-1.8.1.tgz", - "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/loglevel-colored-level-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", - "integrity": "sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==", - "dependencies": { - "chalk": "^1.1.3", - "loglevel": "^1.4.1" - } - }, - "node_modules/loglevel-colored-level-prefix/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loglevel-colored-level-prefix/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loglevel-colored-level-prefix/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loglevel-colored-level-prefix/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loglevel-colored-level-prefix/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/longest": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/longest/-/longest-2.0.1.tgz", - "integrity": "sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "optional": true - }, - "node_modules/merge": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/merge/-/merge-2.1.1.tgz", - "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", - "dev": true - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/mersenne-twister": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/mersenne-twister/-/mersenne-twister-1.1.0.tgz", - "integrity": "sha512-mUYWsMKNrm4lfygPkL3OfGzOPTR2DBlTkBNHM//F6hGp8cLThY897crAlk3/Jo17LEOOjQUrNAx6DvgO77QJkA==" - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "5.1.4", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.4.tgz", - "integrity": "sha512-U0iNYXt9wALljzfnGkhFSy5sAC6/SCR3JrHrlsdJz4kF8MvhTRQNiC59iUi1iqsitV7abrNAJWElVL9pdnoUgw==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multimatch": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/multimatch/-/multimatch-4.0.0.tgz", - "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", - "dev": true, - "dependencies": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/multimatch/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/multimatch/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmmirror.com/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmmirror.com/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/ora/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "optional": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-network-drive": { - "version": "1.0.20", - "resolved": "https://registry.npmmirror.com/path-is-network-drive/-/path-is-network-drive-1.0.20.tgz", - "integrity": "sha512-p5wCWlRB4+ggzxWshqHH9aF3kAuVu295NaENXmVhThbZPJQBeJdxZTP6CIoUR+kWHDUW56S9YcaO1gXnc/BOxw==", - "dev": true, - "dependencies": { - "tslib": "^2" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-strip-sep": { - "version": "1.0.17", - "resolved": "https://registry.npmmirror.com/path-strip-sep/-/path-strip-sep-1.0.17.tgz", - "integrity": "sha512-+2zIC2fNgdilgV7pTrktY6oOxxZUo9x5zJYfTzxsGze5kSGDDwhA5/0WlBn+sUyv/WuuyYn3OfM+Ue5nhdQUgA==", - "dev": true, - "dependencies": { - "tslib": "^2" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - } - }, - "node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.3", - "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.3.tgz", - "integrity": "sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/prettier-eslint": { - "version": "15.0.1", - "resolved": "https://registry.npmmirror.com/prettier-eslint/-/prettier-eslint-15.0.1.tgz", - "integrity": "sha512-mGOWVHixSvpZWARqSDXbdtTL54mMBxc5oQYQ6RAqy8jecuNJBgN3t9E5a81G66F8x8fsKNiR1HWaBV66MJDOpg==", - "dependencies": { - "@types/eslint": "^8.4.2", - "@types/prettier": "^2.6.0", - "@typescript-eslint/parser": "^5.10.0", - "common-tags": "^1.4.0", - "dlv": "^1.1.0", - "eslint": "^8.7.0", - "indent-string": "^4.0.0", - "lodash.merge": "^4.6.0", - "loglevel-colored-level-prefix": "^1.0.0", - "prettier": "^2.5.1", - "pretty-format": "^23.0.1", - "require-relative": "^0.8.7", - "typescript": "^4.5.4", - "vue-eslint-parser": "^8.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dependencies": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/pretty-quick": { - "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/pretty-quick/-/pretty-quick-3.1.3.tgz", - "integrity": "sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA==", - "dev": true, - "dependencies": { - "chalk": "^3.0.0", - "execa": "^4.0.0", - "find-up": "^4.1.0", - "ignore": "^5.1.4", - "mri": "^1.1.5", - "multimatch": "^4.0.0" - }, - "bin": { - "pretty-quick": "bin/pretty-quick.js" - }, - "engines": { - "node": ">=10.13" - }, - "peerDependencies": { - "prettier": ">=2.0.0" - } - }, - "node_modules/pretty-quick/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-quick/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-quick/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/pretty-quick/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/pretty-quick/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-quick/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-quick/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-quick/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pretty-quick/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-quick/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/primitive-geometry": { - "version": "2.9.1", - "resolved": "https://registry.npmmirror.com/primitive-geometry/-/primitive-geometry-2.9.1.tgz", - "integrity": "sha512-qImUPQPio/CwQX6w52q11T31Z3G0TDJUbiOwt/h8JL3OSqhwHCFPurT/fTwLrCjiFMmxnhjxT+EA5NGIUaKJRA==", - "engines": { - "node": ">=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-relative": { - "version": "0.8.7", - "resolved": "https://registry.npmmirror.com/require-relative/-/require-relative-0.8.7.tgz", - "integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==" - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, - "optional": true, - "dependencies": { - "global-dirs": "^0.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/rollup": { - "version": "3.10.0", - "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.10.0.tgz", - "integrity": "sha512-JmRYz44NjC1MjVF2VKxc0M1a97vn+cDxeqWmnwyAF4FvpjK8YFdHpaqvQB+3IxCvX05vJxKZkoMDU8TShhmJVA==", - "devOptional": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-node-resolve": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", - "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-node-resolve.", - "dev": true, - "dependencies": { - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.11.1", - "rollup-pluginutils": "^2.8.1" - }, - "peerDependencies": { - "rollup": ">=1.11.0" - } - }, - "node_modules/rollup-plugin-replace": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz", - "integrity": "sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA==", - "deprecated": "This module has moved and is now available at @rollup/plugin-replace. Please update your dependencies. This version is no longer maintained.", - "dev": true, - "dependencies": { - "magic-string": "^0.25.2", - "rollup-pluginutils": "^2.6.0" - } - }, - "node_modules/rollup-plugin-replace/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/rollup-plugin-typescript2": { - "version": "0.31.2", - "resolved": "https://registry.npmmirror.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.31.2.tgz", - "integrity": "sha512-hRwEYR1C8xDGVVMFJQdEVnNAeWRvpaY97g5mp3IeLnzhNXzSVq78Ye/BJ9PAaUfN4DXa/uDnqerifMOaMFY54Q==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^4.1.2", - "@yarn-tool/resolve-package": "^1.0.40", - "find-cache-dir": "^3.3.2", - "fs-extra": "^10.0.0", - "resolve": "^1.20.0", - "tslib": "^2.3.1" - }, - "peerDependencies": { - "rollup": ">=1.26.3", - "typescript": ">=2.4.0" - } - }, - "node_modules/rollup-plugin-typescript2/node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmmirror.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "dependencies": { - "estree-walker": "^0.6.1" - } - }, - "node_modules/rollup-pluginutils/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmmirror.com/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/smob": { - "version": "0.0.6", - "resolved": "https://registry.npmmirror.com/smob/-/smob-0.0.6.tgz", - "integrity": "sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/terser": { - "version": "5.16.1", - "resolved": "https://registry.npmmirror.com/terser/-/terser-5.16.1.tgz", - "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "optional": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmmirror.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, - "node_modules/typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/upath2": { - "version": "3.1.19", - "resolved": "https://registry.npmmirror.com/upath2/-/upath2-3.1.19.tgz", - "integrity": "sha512-d23dQLi8nDWSRTIQwXtaYqMrHuca0As53fNiTLLFDmsGBbepsZepISaB2H1x45bDFN/n3Qw9bydvyZEacTrEWQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "path-is-network-drive": "^1.0.20", - "path-strip-sep": "^1.0.17", - "tslib": "^2" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "optional": true - }, - "node_modules/vue-eslint-parser": { - "version": "8.3.0", - "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", - "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==", - "dependencies": { - "debug": "^4.3.2", - "eslint-scope": "^7.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.0.0", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/vue-eslint-parser/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/vue-eslint-parser/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/vue-eslint-parser/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - } - } - } + "name": "@gengine-js/gengine", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@gengine-js/gengine", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@rollup/plugin-commonjs": "^23.0.2", + "@types/gl-matrix": "^2.4.5", + "@typescript-eslint/eslint-plugin": "^5.59.5", + "@typescript-eslint/parser": "^5.59.5", + "@webgpu/glslang": "0.0.15", + "@webgpu/types": "0.1.20", + "cross-env": "^7.0.3", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-unused-imports": "^2.0.0", + "glob": "^8.0.3", + "mersenne-twister": "^1.1.0", + "prettier-eslint": "^15.0.1", + "primitive-geometry": "^2.9.0" + }, + "devDependencies": { + "@rollup/plugin-terser": "^0.4.2", + "commitizen": "^4.3.0", + "cz-conventional-changelog": "^3.3.0", + "cz-conventional-changelog-zh": "0.0.2", + "eslint": "^8.40.0", + "husky": "^8.0.3", + "prettier": "^2.8.3", + "pretty-quick": "^3.1.3", + "rollup": "3.10.0", + "rollup-plugin-node-resolve": "^5.2.0", + "rollup-plugin-replace": "^2.2.0", + "rollup-plugin-typescript2": "^0.31.1", + "rollup-plugin-wgsl": "^1.0.1", + "typescript": "^4.8.4" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "optional": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "optional": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "17.4.0", + "resolved": "https://registry.npmmirror.com/@commitlint/config-validator/-/config-validator-17.4.0.tgz", + "integrity": "sha512-Sa/+8KNpDXz4zT4bVbz2fpFjvgkPO6u2V2fP4TKgt6FjmOw2z3eEX859vtfeaTav/ukBw0/0jr+5ZTZp9zCBhA==", + "dev": true, + "optional": true, + "dependencies": { + "@commitlint/types": "^17.4.0", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "17.4.0", + "resolved": "https://registry.npmmirror.com/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", + "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/load": { + "version": "17.4.2", + "resolved": "https://registry.npmmirror.com/@commitlint/load/-/load-17.4.2.tgz", + "integrity": "sha512-Si++F85rJ9t4hw6JcOw1i2h0fdpdFQt0YKwjuK4bk9KhFjyFkRxvR3SB2dPaMs+EwWlDrDBGL+ygip1QD6gmPw==", + "dev": true, + "optional": true, + "dependencies": { + "@commitlint/config-validator": "^17.4.0", + "@commitlint/execute-rule": "^17.4.0", + "@commitlint/resolve-extends": "^17.4.0", + "@commitlint/types": "^17.4.0", + "@types/node": "*", + "chalk": "^4.1.0", + "cosmiconfig": "^8.0.0", + "cosmiconfig-typescript-loader": "^4.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0", + "resolve-from": "^5.0.0", + "ts-node": "^10.8.1", + "typescript": "^4.6.4" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/load/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/load/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/load/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@commitlint/load/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true + }, + "node_modules/@commitlint/load/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/load/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "17.4.0", + "resolved": "https://registry.npmmirror.com/@commitlint/resolve-extends/-/resolve-extends-17.4.0.tgz", + "integrity": "sha512-3JsmwkrCzoK8sO22AzLBvNEvC1Pmdn/65RKXzEtQMy6oYMl0Snrq97a5bQQEFETF0VsvbtUuKttLqqgn99OXRQ==", + "dev": true, + "optional": true, + "dependencies": { + "@commitlint/config-validator": "^17.4.0", + "@commitlint/types": "^17.4.0", + "import-fresh": "^3.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/types": { + "version": "17.4.0", + "resolved": "https://registry.npmmirror.com/@commitlint/types/-/types-17.4.0.tgz", + "integrity": "sha512-2NjAnq5IcxY9kXtUeO2Ac0aPpvkuOmwbH/BxIm36XXK5LtWFObWJWjXOA+kcaABMrthjWu6la+FUpyYFMHRvbA==", + "dev": true, + "optional": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@commitlint/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true + }, + "node_modules/@commitlint/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "optional": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "optional": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.40.0.tgz", + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "23.0.7", + "resolved": "https://registry.npmmirror.com/@rollup/plugin-commonjs/-/plugin-commonjs-23.0.7.tgz", + "integrity": "sha512-hsSD5Qzyuat/swzrExGG5l7EuIlPhwTsT7KwKbSCQzIcJWjRxiimi/0tyMYY2bByitNb3i1p+6JWEDGa0NvT0Q==", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.27.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.2", + "resolved": "https://registry.npmmirror.com/@rollup/plugin-terser/-/plugin-terser-0.4.2.tgz", + "integrity": "sha512-jfUVQ4MxzIB0mz8QhDA1xiLT+pTF3WEWXeIqcwhoF84WhLWscPpxjJgjYMyAq0Po4UXqw2D9C64tD0gRDzJzfA==", + "dev": true, + "dependencies": { + "serialize-javascript": "^6.0.0", + "smob": "^0.0.6", + "terser": "^5.15.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.x || ^3.x" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser/node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true, + "optional": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "optional": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "optional": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true, + "optional": true + }, + "node_modules/@types/eslint": { + "version": "8.37.0", + "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-8.37.0.tgz", + "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + }, + "node_modules/@types/gl-matrix": { + "version": "2.4.5", + "resolved": "https://registry.npmmirror.com/@types/gl-matrix/-/gl-matrix-2.4.5.tgz", + "integrity": "sha512-0L8Mq1+oaIW0oVzGUDbSW+HnTjCNb4CmoIQE5BkoHt/A7x20z0MJ1PnwfH3atty/vbWLGgvJwVu2Mz3SKFiEFw==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmmirror.com/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmmirror.com/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==" + }, + "node_modules/@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmmirror.com/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.59.6", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz", + "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/type-utils": "5.59.6", + "@typescript-eslint/utils": "5.59.6", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.59.6", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.59.6.tgz", + "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", + "dependencies": { + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.6", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", + "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", + "dependencies": { + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.59.6", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz", + "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/utils": "5.59.6", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.59.6", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.59.6.tgz", + "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.6", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", + "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", + "dependencies": { + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.59.6", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.59.6.tgz", + "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.6", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", + "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", + "dependencies": { + "@typescript-eslint/types": "5.59.6", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@webgpu/glslang": { + "version": "0.0.15", + "resolved": "https://registry.npmmirror.com/@webgpu/glslang/-/glslang-0.0.15.tgz", + "integrity": "sha512-niT+Prh3Aff8Uf1MVBVUsaNjFj9rJAKDXuoHIKiQbB+6IUP/3J3JIhBNyZ7lDhytvXxw6ppgnwKZdDJ08UMj4Q==" + }, + "node_modules/@webgpu/types": { + "version": "0.1.20", + "resolved": "https://registry.npmmirror.com/@webgpu/types/-/types-0.1.20.tgz", + "integrity": "sha512-MFb5oyxX+A7PWQNjcY3kSCSG2FAHaBo7IJBWtxWFgsS20FtY3D9UY7lYqLZ6avS8fSkdSylIS4qiHzFlQUdXag==" + }, + "node_modules/@yarn-tool/resolve-package": { + "version": "1.0.47", + "resolved": "https://registry.npmmirror.com/@yarn-tool/resolve-package/-/resolve-package-1.0.47.tgz", + "integrity": "sha512-Zaw58gQxjQceJqhqybJi1oUDaORT8i2GTgwICPs8v/X/Pkx35FXQba69ldHVg5pQZ6YLKpROXgyHvBaCJOFXiA==", + "dev": true, + "dependencies": { + "pkg-dir": "< 6 >= 5", + "tslib": "^2", + "upath2": "^3.1.13" + } + }, + "node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "optional": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "optional": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmmirror.com/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.7.0.tgz", + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/commitizen": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/commitizen/-/commitizen-4.3.0.tgz", + "integrity": "sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==", + "dev": true, + "dependencies": { + "cachedir": "2.3.0", + "cz-conventional-changelog": "3.3.0", + "dedent": "0.7.0", + "detect-indent": "6.1.0", + "find-node-modules": "^2.1.2", + "find-root": "1.1.0", + "fs-extra": "9.1.0", + "glob": "7.2.3", + "inquirer": "8.2.5", + "is-utf8": "^0.2.1", + "lodash": "4.17.21", + "minimist": "1.2.7", + "strip-bom": "4.0.0", + "strip-json-comments": "3.1.1" + }, + "bin": { + "commitizen": "bin/commitizen", + "cz": "bin/git-cz", + "git-cz": "bin/git-cz" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/commitizen/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/commitizen/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/commitizen/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/commitizen/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/conventional-commit-types": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", + "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-8.0.0.tgz", + "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", + "dev": true, + "optional": true, + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz", + "integrity": "sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==", + "dev": true, + "optional": true, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=7", + "ts-node": ">=10", + "typescript": ">=3" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "optional": true + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cz-conventional-changelog": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", + "integrity": "sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "commitizen": "^4.0.3", + "conventional-commit-types": "^3.0.0", + "lodash.map": "^4.5.1", + "longest": "^2.0.1", + "word-wrap": "^1.0.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@commitlint/load": ">6.1.1" + } + }, + "node_modules/cz-conventional-changelog-zh": { + "version": "0.0.2", + "resolved": "https://registry.npmmirror.com/cz-conventional-changelog-zh/-/cz-conventional-changelog-zh-0.0.2.tgz", + "integrity": "sha512-rXy2HiG/0M7xChuodAN1L9qHDWTBInGTljaE59AlyqrXQAv0srg147vjep5CO7mGtxVYJQJi9TVP5KVZMWxDqQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "commitizen": "^4.0.3", + "conventional-commit-types": "^3.0.0", + "lodash.assign": "^4.2.0", + "lodash.map": "^4.5.1", + "longest": "^2.0.1", + "word-wrap": "^1.0.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@commitlint/load": ">6.1.1" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "optional": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.40.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.8.0", + "resolved": "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmmirror.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmmirror.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-unused-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", + "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.5.2", + "resolved": "https://registry.npmmirror.com/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-node-modules": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/find-node-modules/-/find-node-modules-2.1.3.tgz", + "integrity": "sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==", + "dev": true, + "dependencies": { + "findup-sync": "^4.0.0", + "merge": "^2.1.1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "optional": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/inquirer": { + "version": "8.2.5", + "resolved": "https://registry.npmmirror.com/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "optional": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "^1.0.2" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "optional": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "optional": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "optional": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "optional": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "optional": true + }, + "node_modules/lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmmirror.com/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true, + "optional": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true, + "optional": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loglevel": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/loglevel-colored-level-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", + "integrity": "sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==", + "dependencies": { + "chalk": "^1.1.3", + "loglevel": "^1.4.1" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/longest": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/longest/-/longest-2.0.1.tgz", + "integrity": "sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "optional": true + }, + "node_modules/merge": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/merge/-/merge-2.1.1.tgz", + "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mersenne-twister": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/mersenne-twister/-/mersenne-twister-1.1.0.tgz", + "integrity": "sha512-mUYWsMKNrm4lfygPkL3OfGzOPTR2DBlTkBNHM//F6hGp8cLThY897crAlk3/Jo17LEOOjQUrNAx6DvgO77QJkA==" + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "5.1.4", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.4.tgz", + "integrity": "sha512-U0iNYXt9wALljzfnGkhFSy5sAC6/SCR3JrHrlsdJz4kF8MvhTRQNiC59iUi1iqsitV7abrNAJWElVL9pdnoUgw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multimatch": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", + "dev": true, + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/multimatch/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/multimatch/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmmirror.com/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "optional": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-network-drive": { + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/path-is-network-drive/-/path-is-network-drive-1.0.20.tgz", + "integrity": "sha512-p5wCWlRB4+ggzxWshqHH9aF3kAuVu295NaENXmVhThbZPJQBeJdxZTP6CIoUR+kWHDUW56S9YcaO1gXnc/BOxw==", + "dev": true, + "dependencies": { + "tslib": "^2" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-strip-sep": { + "version": "1.0.17", + "resolved": "https://registry.npmmirror.com/path-strip-sep/-/path-strip-sep-1.0.17.tgz", + "integrity": "sha512-+2zIC2fNgdilgV7pTrktY6oOxxZUo9x5zJYfTzxsGze5kSGDDwhA5/0WlBn+sUyv/WuuyYn3OfM+Ue5nhdQUgA==", + "dev": true, + "dependencies": { + "tslib": "^2" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.3", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.3.tgz", + "integrity": "sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-eslint": { + "version": "15.0.1", + "resolved": "https://registry.npmmirror.com/prettier-eslint/-/prettier-eslint-15.0.1.tgz", + "integrity": "sha512-mGOWVHixSvpZWARqSDXbdtTL54mMBxc5oQYQ6RAqy8jecuNJBgN3t9E5a81G66F8x8fsKNiR1HWaBV66MJDOpg==", + "dependencies": { + "@types/eslint": "^8.4.2", + "@types/prettier": "^2.6.0", + "@typescript-eslint/parser": "^5.10.0", + "common-tags": "^1.4.0", + "dlv": "^1.1.0", + "eslint": "^8.7.0", + "indent-string": "^4.0.0", + "lodash.merge": "^4.6.0", + "loglevel-colored-level-prefix": "^1.0.0", + "prettier": "^2.5.1", + "pretty-format": "^23.0.1", + "require-relative": "^0.8.7", + "typescript": "^4.5.4", + "vue-eslint-parser": "^8.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dependencies": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-quick": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/pretty-quick/-/pretty-quick-3.1.3.tgz", + "integrity": "sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "execa": "^4.0.0", + "find-up": "^4.1.0", + "ignore": "^5.1.4", + "mri": "^1.1.5", + "multimatch": "^4.0.0" + }, + "bin": { + "pretty-quick": "bin/pretty-quick.js" + }, + "engines": { + "node": ">=10.13" + }, + "peerDependencies": { + "prettier": ">=2.0.0" + } + }, + "node_modules/pretty-quick/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-quick/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-quick/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/pretty-quick/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/pretty-quick/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-quick/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-quick/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-quick/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pretty-quick/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-quick/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/primitive-geometry": { + "version": "2.9.1", + "resolved": "https://registry.npmmirror.com/primitive-geometry/-/primitive-geometry-2.9.1.tgz", + "integrity": "sha512-qImUPQPio/CwQX6w52q11T31Z3G0TDJUbiOwt/h8JL3OSqhwHCFPurT/fTwLrCjiFMmxnhjxT+EA5NGIUaKJRA==", + "engines": { + "node": ">=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmmirror.com/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==" + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "optional": true, + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/rollup": { + "version": "3.10.0", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.10.0.tgz", + "integrity": "sha512-JmRYz44NjC1MjVF2VKxc0M1a97vn+cDxeqWmnwyAF4FvpjK8YFdHpaqvQB+3IxCvX05vJxKZkoMDU8TShhmJVA==", + "devOptional": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-node-resolve": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", + "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-node-resolve.", + "dev": true, + "dependencies": { + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.11.1", + "rollup-pluginutils": "^2.8.1" + }, + "peerDependencies": { + "rollup": ">=1.11.0" + } + }, + "node_modules/rollup-plugin-replace": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz", + "integrity": "sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA==", + "deprecated": "This module has moved and is now available at @rollup/plugin-replace. Please update your dependencies. This version is no longer maintained.", + "dev": true, + "dependencies": { + "magic-string": "^0.25.2", + "rollup-pluginutils": "^2.6.0" + } + }, + "node_modules/rollup-plugin-replace/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/rollup-plugin-typescript2": { + "version": "0.31.2", + "resolved": "https://registry.npmmirror.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.31.2.tgz", + "integrity": "sha512-hRwEYR1C8xDGVVMFJQdEVnNAeWRvpaY97g5mp3IeLnzhNXzSVq78Ye/BJ9PAaUfN4DXa/uDnqerifMOaMFY54Q==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^4.1.2", + "@yarn-tool/resolve-package": "^1.0.40", + "find-cache-dir": "^3.3.2", + "fs-extra": "^10.0.0", + "resolve": "^1.20.0", + "tslib": "^2.3.1" + }, + "peerDependencies": { + "rollup": ">=1.26.3", + "typescript": ">=2.4.0" + } + }, + "node_modules/rollup-plugin-typescript2/node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/rollup-plugin-wgsl": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/rollup-plugin-wgsl/-/rollup-plugin-wgsl-1.0.1.tgz", + "integrity": "sha512-i5arjFLdYzKcguG3Ajm4DpOm2L069BMLNzZv19u9RIB2nGGuzA2DnLbJbDO7lhhY+AgdNEMDTalhhU67GJUN3Q==", + "dev": true + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmmirror.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/smob": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/smob/-/smob-0.0.6.tgz", + "integrity": "sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/terser": { + "version": "5.16.1", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.16.1.tgz", + "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "optional": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmmirror.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "node_modules/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/upath2": { + "version": "3.1.19", + "resolved": "https://registry.npmmirror.com/upath2/-/upath2-3.1.19.tgz", + "integrity": "sha512-d23dQLi8nDWSRTIQwXtaYqMrHuca0As53fNiTLLFDmsGBbepsZepISaB2H1x45bDFN/n3Qw9bydvyZEacTrEWQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "path-is-network-drive": "^1.0.20", + "path-strip-sep": "^1.0.17", + "tslib": "^2" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "optional": true + }, + "node_modules/vue-eslint-parser": { + "version": "8.3.0", + "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", + "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==", + "dependencies": { + "debug": "^4.3.2", + "eslint-scope": "^7.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + } + } + } } diff --git a/package.json b/package.json index 848f74b..d82267e 100644 --- a/package.json +++ b/package.json @@ -1,93 +1,105 @@ { - "name": "@gengine-js/gengine", - "version": "1.0.0", - "description": "", - "type": "module", - "main": "dist/index.js", - "keywords": ["webgpu", "gpu", "webgl2", "webgl"], - "source": "src/index.ts", - "scripts": { - "check-keyword": "bash ./hooks/check-keyword.sh", - "commit": "git cz", - "prepare": "husky install", - "pretty-quick": "pretty-quick --staged --pattern \"**/*.*(js|md|html|ts)\"", - "pre-build": "node hooks/checkDependency.js", - "install:npm": "npm install --registry=https://registry.npmmirror.com", - "install:yarn": "yarn install --registry=https://registry.npmmirror.com", - "build": "npm run pre-build && cross-env BUILD=production rollup -c", - "dev": "npm run pre-build && cross-env BUILD=development rollup -c -w", - "lint": "eslint --ext .js,.jsx,.ts,.tsx ./src" - }, - "devDependencies": { - "@rollup/plugin-terser": "^0.4.2", - "commitizen": "^4.3.0", - "cz-conventional-changelog": "^3.3.0", - "cz-conventional-changelog-zh": "0.0.2", - "eslint": "^8.40.0", - "husky": "^8.0.3", - "prettier": "^2.8.3", - "pretty-quick": "^3.1.3", - "rollup": "3.10.0", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-replace": "^2.2.0", - "rollup-plugin-typescript2": "^0.31.1", - "typescript": "^4.8.4" - }, - "dependencies": { - "@rollup/plugin-commonjs": "^23.0.2", - "@types/gl-matrix": "^2.4.5", - "@typescript-eslint/eslint-plugin": "^5.59.5", - "@typescript-eslint/parser": "^5.59.5", - "@webgpu/glslang": "0.0.15", - "@webgpu/types": "0.1.20", - "cross-env": "^7.0.3", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-unused-imports": "^2.0.0", - "glob": "^8.0.3", - "mersenne-twister": "^1.1.0", - "prettier-eslint": "^15.0.1", - "primitive-geometry": "^2.9.0" - }, - "repository": { - "type": "git", - "url": "https://github.com/hpugis/GEngine.git" - }, - "author": "", - "license": "ISC", - "bugs": { - "url": "https://github.com/hpugis/GEngine/issues" - }, - "homepage": "https://github.com/hpugis/GEngine/blob/main/README.md", - "engines": { - "node": ">=14.19.3" - }, - - "publishConfig": { - "access": "public" - }, - "config": { - "commitizen": { - "path": "node_modules/cz-conventional-changelog-zh", - "types": { - "merge": { - "description": "合并分支", - "title": "Merge" - }, - "demo": { - "description": "新增演示demo,或修改", - "title": "Demo" - }, - "release": { - "description": "发布版本", - "title": "Release" - }, - "WIP": { - "description": "进行中的功能, 属于未完成的情况", - "title": "WIP" - } - } - } - } + "name": "@gengine-js/gengine", + "version": "1.0.0", + "description": "A rendering engine based on webgpu", + "type": "module", + "source": "src/index.ts", + "main": "dist/index.js", + "keywords": [ + "webgpu", + "gpu", + "webgl2", + "webgl" + ], + "files": [ + "dist", + "package.json", + "README.md" + ], + "homepage": "https://github.com/hpugis/GEngine/blob/main/README.md", + "repository": { + "type": "git", + "url": "https://github.com/hpugis/GEngine.git" + }, + "bugs": { + "url": "https://github.com/hpugis/GEngine/issues" + }, + "publishConfig": { + "access": "public" + }, + "browserslist": [ + "last 1 version", + "> 1%", + "not dead" + ], + "author": "", + "scripts": { + "check-keyword": "bash ./hooks/check-keyword.sh", + "commit": "git cz", + "prepare": "husky install", + "pretty-quick": "pretty-quick --staged --pattern \"**/*.*(js|md|html|ts)\"", + "pre-build": "node hooks/checkDependency.js", + "install:npm": "npm install --registry=https://registry.npmmirror.com", + "install:yarn": "yarn install --registry=https://registry.npmmirror.com", + "build": "npm run pre-build && cross-env BUILD=production rollup -c", + "dev": "npm run pre-build && cross-env BUILD=development rollup -c -w", + "lint": "eslint --ext .js,.jsx,.ts,.tsx ./src" + }, + "devDependencies": { + "@rollup/plugin-terser": "^0.4.2", + "commitizen": "^4.3.0", + "cz-conventional-changelog": "^3.3.0", + "cz-conventional-changelog-zh": "0.0.2", + "eslint": "^8.40.0", + "husky": "^8.0.3", + "prettier": "^2.8.3", + "pretty-quick": "^3.1.3", + "rollup": "3.10.0", + "rollup-plugin-node-resolve": "^5.2.0", + "rollup-plugin-replace": "^2.2.0", + "rollup-plugin-typescript2": "^0.31.1", + "rollup-plugin-wgsl": "^1.0.1", + "typescript": "^4.8.4" + }, + "dependencies": { + "@rollup/plugin-commonjs": "^23.0.2", + "@types/gl-matrix": "^2.4.5", + "@typescript-eslint/eslint-plugin": "^5.59.5", + "@typescript-eslint/parser": "^5.59.5", + "@webgpu/glslang": "0.0.15", + "@webgpu/types": "0.1.20", + "cross-env": "^7.0.3", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-unused-imports": "^2.0.0", + "glob": "^8.0.3", + "mersenne-twister": "^1.1.0", + "prettier-eslint": "^15.0.1", + "primitive-geometry": "^2.9.0" + }, + "config": { + "commitizen": { + "path": "node_modules/cz-conventional-changelog-zh", + "types": { + "merge": { + "description": "合并分支", + "title": "Merge" + }, + "demo": { + "description": "新增演示demo,或修改", + "title": "Demo" + }, + "release": { + "description": "发布版本", + "title": "Release" + }, + "WIP": { + "description": "进行中的功能, 属于未完成的情况", + "title": "WIP" + } + } + } + }, + "license": "ISC" } diff --git a/rollup.config.js b/rollup.config.js index dbc685d..c24b30f 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -3,6 +3,7 @@ import terser from "@rollup/plugin-terser"; import ts from "rollup-plugin-typescript2"; import commonjs from "@rollup/plugin-commonjs"; import { fileURLToPath } from "url"; +import wgsl from "./build/@rollup/plugin-wgsl/index.js"; const { BUILD, BABEL } = process.env; const production = BUILD === "production"; @@ -21,5 +22,5 @@ export default { : { exclude: "node_modules/**" }, - plugins: [ts(), commonjs(), production ? terser() : null] + plugins: [ts(), wgsl(), commonjs({ ignoreGlobal: true }), production ? terser() : null] }; diff --git a/src/shader/Shaders.ts b/src/shader/Shaders.ts index c98c15a..f76b4e7 100644 --- a/src/shader/Shaders.ts +++ b/src/shader/Shaders.ts @@ -1,4 +1,5 @@ -import colorFrag from "./material/colorFrag"; +// import colorFrag from "./material/colorFrag"; +import colorFrag from "./material/colorFrag.wgsl"; import colorVert from "./material/colorVert"; import pbr_fs from "./material/pbr_fs"; import pbr_vs from "./material/pbr_vs"; diff --git a/src/shader/material/colorFrag.wgsl b/src/shader/material/colorFrag.wgsl new file mode 100644 index 0000000..62a43b5 --- /dev/null +++ b/src/shader/material/colorFrag.wgsl @@ -0,0 +1,9 @@ +struct VertexOutput { + @builtin(position) position: vec4, + @location(0) color: vec4, +}; + +@fragment +fn main(input:VertexOutput) -> @location(0) vec4 { + return input.color; +} \ No newline at end of file diff --git a/src/wgsl.d.ts b/src/wgsl.d.ts new file mode 100644 index 0000000..35c0a48 --- /dev/null +++ b/src/wgsl.d.ts @@ -0,0 +1,4 @@ +declare module "*.wgsl" { + const value: string; + export default value; +} diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..8286503 --- /dev/null +++ b/tests/README.md @@ -0,0 +1 @@ +# 待补充测试内容 diff --git a/tsconfig.json b/tsconfig.json index 750dc98..246b7e3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,7 @@ "allowJs": true, "allowSyntheticDefaultImports": true, "declaration": false, - "declarationDir": "types", + // "declarationDir": "types", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "importHelpers": true, @@ -23,7 +23,7 @@ , "src/shader/material/pbrFrag.ts" ], "exclude": [ "node_modules", - "pblic", + "public", "dist", "example", "**/*.spec.ts" diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..faa562d --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3082 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/helper-validator-identifier@^7.18.6": + version "7.19.1" + resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@commitlint/config-validator@^17.4.0": + version "17.4.0" + resolved "https://registry.npmmirror.com/@commitlint/config-validator/-/config-validator-17.4.0.tgz" + integrity sha512-Sa/+8KNpDXz4zT4bVbz2fpFjvgkPO6u2V2fP4TKgt6FjmOw2z3eEX859vtfeaTav/ukBw0/0jr+5ZTZp9zCBhA== + dependencies: + "@commitlint/types" "^17.4.0" + ajv "^8.11.0" + +"@commitlint/execute-rule@^17.4.0": + version "17.4.0" + resolved "https://registry.npmmirror.com/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz" + integrity sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA== + +"@commitlint/load@>6.1.1": + version "17.4.2" + resolved "https://registry.npmmirror.com/@commitlint/load/-/load-17.4.2.tgz" + integrity sha512-Si++F85rJ9t4hw6JcOw1i2h0fdpdFQt0YKwjuK4bk9KhFjyFkRxvR3SB2dPaMs+EwWlDrDBGL+ygip1QD6gmPw== + dependencies: + "@commitlint/config-validator" "^17.4.0" + "@commitlint/execute-rule" "^17.4.0" + "@commitlint/resolve-extends" "^17.4.0" + "@commitlint/types" "^17.4.0" + "@types/node" "*" + chalk "^4.1.0" + cosmiconfig "^8.0.0" + cosmiconfig-typescript-loader "^4.0.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + lodash.uniq "^4.5.0" + resolve-from "^5.0.0" + ts-node "^10.8.1" + typescript "^4.6.4" + +"@commitlint/resolve-extends@^17.4.0": + version "17.4.0" + resolved "https://registry.npmmirror.com/@commitlint/resolve-extends/-/resolve-extends-17.4.0.tgz" + integrity sha512-3JsmwkrCzoK8sO22AzLBvNEvC1Pmdn/65RKXzEtQMy6oYMl0Snrq97a5bQQEFETF0VsvbtUuKttLqqgn99OXRQ== + dependencies: + "@commitlint/config-validator" "^17.4.0" + "@commitlint/types" "^17.4.0" + import-fresh "^3.0.0" + lodash.mergewith "^4.6.2" + resolve-from "^5.0.0" + resolve-global "^1.0.0" + +"@commitlint/types@^17.4.0": + version "17.4.0" + resolved "https://registry.npmmirror.com/@commitlint/types/-/types-17.4.0.tgz" + integrity sha512-2NjAnq5IcxY9kXtUeO2Ac0aPpvkuOmwbH/BxIm36XXK5LtWFObWJWjXOA+kcaABMrthjWu6la+FUpyYFMHRvbA== + dependencies: + chalk "^4.1.0" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.1" + resolved "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== + +"@eslint/eslintrc@^2.0.3": + version "2.0.3" + resolved "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz" + integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.5.2" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.40.0": + version "8.40.0" + resolved "https://registry.npmmirror.com/@eslint/js/-/js-8.40.0.tgz" + integrity sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA== + +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.2" + resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@rollup/plugin-commonjs@^23.0.2": + version "23.0.7" + resolved "https://registry.npmmirror.com/@rollup/plugin-commonjs/-/plugin-commonjs-23.0.7.tgz" + integrity sha512-hsSD5Qzyuat/swzrExGG5l7EuIlPhwTsT7KwKbSCQzIcJWjRxiimi/0tyMYY2bByitNb3i1p+6JWEDGa0NvT0Q== + dependencies: + "@rollup/pluginutils" "^5.0.1" + commondir "^1.0.1" + estree-walker "^2.0.2" + glob "^8.0.3" + is-reference "1.2.1" + magic-string "^0.27.0" + +"@rollup/plugin-terser@^0.4.2": + version "0.4.2" + resolved "https://registry.npmmirror.com/@rollup/plugin-terser/-/plugin-terser-0.4.2.tgz" + integrity sha512-jfUVQ4MxzIB0mz8QhDA1xiLT+pTF3WEWXeIqcwhoF84WhLWscPpxjJgjYMyAq0Po4UXqw2D9C64tD0gRDzJzfA== + dependencies: + serialize-javascript "^6.0.0" + smob "^0.0.6" + terser "^5.15.1" + +"@rollup/pluginutils@^4.1.2": + version "4.2.1" + resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz" + integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + +"@rollup/pluginutils@^5.0.1": + version "5.0.2" + resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz" + integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.9.tgz" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.3.tgz" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + +"@types/eslint@^8.4.2": + version "8.37.0" + resolved "https://registry.npmmirror.com/@types/eslint/-/eslint-8.37.0.tgz" + integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.0.tgz" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + +"@types/gl-matrix@^2.4.5": + version "2.4.5" + resolved "https://registry.npmmirror.com/@types/gl-matrix/-/gl-matrix-2.4.5.tgz" + integrity sha512-0L8Mq1+oaIW0oVzGUDbSW+HnTjCNb4CmoIQE5BkoHt/A7x20z0MJ1PnwfH3atty/vbWLGgvJwVu2Mz3SKFiEFw== + +"@types/json-schema@*", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.11.tgz" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.npmmirror.com/@types/json5/-/json5-0.0.29.tgz" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/minimatch@^3.0.3": + version "3.0.5" + resolved "https://registry.npmmirror.com/@types/minimatch/-/minimatch-3.0.5.tgz" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/node@*": + version "18.11.18" + resolved "https://registry.npmmirror.com/@types/node/-/node-18.11.18.tgz" + integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== + +"@types/prettier@^2.6.0": + version "2.7.2" + resolved "https://registry.npmmirror.com/@types/prettier/-/prettier-2.7.2.tgz" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== + +"@types/resolve@0.0.8": + version "0.0.8" + resolved "https://registry.npmmirror.com/@types/resolve/-/resolve-0.0.8.tgz" + integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== + dependencies: + "@types/node" "*" + +"@types/semver@^7.3.12": + version "7.5.0" + resolved "https://registry.npmmirror.com/@types/semver/-/semver-7.5.0.tgz" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + +"@typescript-eslint/eslint-plugin@^5.0.0", "@typescript-eslint/eslint-plugin@^5.59.5": + version "5.59.6" + resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz" + integrity sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.59.6" + "@typescript-eslint/type-utils" "5.59.6" + "@typescript-eslint/utils" "5.59.6" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.10.0", "@typescript-eslint/parser@^5.59.5": + version "5.59.6" + resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.59.6.tgz" + integrity sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA== + dependencies: + "@typescript-eslint/scope-manager" "5.59.6" + "@typescript-eslint/types" "5.59.6" + "@typescript-eslint/typescript-estree" "5.59.6" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.59.6": + version "5.59.6" + resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz" + integrity sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ== + dependencies: + "@typescript-eslint/types" "5.59.6" + "@typescript-eslint/visitor-keys" "5.59.6" + +"@typescript-eslint/type-utils@5.59.6": + version "5.59.6" + resolved "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz" + integrity sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ== + dependencies: + "@typescript-eslint/typescript-estree" "5.59.6" + "@typescript-eslint/utils" "5.59.6" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.59.6": + version "5.59.6" + resolved "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.59.6.tgz" + integrity sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA== + +"@typescript-eslint/typescript-estree@5.59.6": + version "5.59.6" + resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz" + integrity sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA== + dependencies: + "@typescript-eslint/types" "5.59.6" + "@typescript-eslint/visitor-keys" "5.59.6" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.59.6": + version "5.59.6" + resolved "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.59.6.tgz" + integrity sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.59.6" + "@typescript-eslint/types" "5.59.6" + "@typescript-eslint/typescript-estree" "5.59.6" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.59.6": + version "5.59.6" + resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz" + integrity sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q== + dependencies: + "@typescript-eslint/types" "5.59.6" + eslint-visitor-keys "^3.3.0" + +"@webgpu/glslang@0.0.15": + version "0.0.15" + resolved "https://registry.npmmirror.com/@webgpu/glslang/-/glslang-0.0.15.tgz" + integrity sha512-niT+Prh3Aff8Uf1MVBVUsaNjFj9rJAKDXuoHIKiQbB+6IUP/3J3JIhBNyZ7lDhytvXxw6ppgnwKZdDJ08UMj4Q== + +"@webgpu/types@0.1.20": + version "0.1.20" + resolved "https://registry.npmmirror.com/@webgpu/types/-/types-0.1.20.tgz" + integrity sha512-MFb5oyxX+A7PWQNjcY3kSCSG2FAHaBo7IJBWtxWFgsS20FtY3D9UY7lYqLZ6avS8fSkdSylIS4qiHzFlQUdXag== + +"@yarn-tool/resolve-package@^1.0.40": + version "1.0.47" + resolved "https://registry.npmmirror.com/@yarn-tool/resolve-package/-/resolve-package-1.0.47.tgz" + integrity sha512-Zaw58gQxjQceJqhqybJi1oUDaORT8i2GTgwICPs8v/X/Pkx35FXQba69ldHVg5pQZ6YLKpROXgyHvBaCJOFXiA== + dependencies: + pkg-dir "< 6 >= 5" + tslib "^2" + upath2 "^3.1.13" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.4.1, acorn@^8.5.0, acorn@^8.8.0: + version "8.8.1" + resolved "https://registry.npmmirror.com/acorn/-/acorn-8.8.1.tgz" + integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== + +ajv@^6.10.0: + version "6.12.6" + resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.11.0: + version "8.12.0" + resolved "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-3.0.1.tgz" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz" + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-differ@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/array-differ/-/array-differ-3.0.0.tgz" + integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== + +array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.npmmirror.com/array-includes/-/array-includes-3.1.6.tgz" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.npmmirror.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.npmmirror.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/arrify/-/arrify-2.0.1.tgz" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtin-modules@^3.1.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/builtin-modules/-/builtin-modules-3.3.0.tgz" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +cachedir@2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/cachedir/-/cachedir-2.3.0.tgz" + integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz" + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.7.0" + resolved "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.7.0.tgz" + integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/cli-width/-/cli-width-3.0.0.tgz" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commitizen@^4.0.3, commitizen@^4.3.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/commitizen/-/commitizen-4.3.0.tgz" + integrity sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw== + dependencies: + cachedir "2.3.0" + cz-conventional-changelog "3.3.0" + dedent "0.7.0" + detect-indent "6.1.0" + find-node-modules "^2.1.2" + find-root "1.1.0" + fs-extra "9.1.0" + glob "7.2.3" + inquirer "8.2.5" + is-utf8 "^0.2.1" + lodash "4.17.21" + minimist "1.2.7" + strip-bom "4.0.0" + strip-json-comments "3.1.1" + +common-tags@^1.4.0: + version "1.8.2" + resolved "https://registry.npmmirror.com/common-tags/-/common-tags-1.8.2.tgz" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +conventional-commit-types@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz" + integrity sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg== + +cosmiconfig-typescript-loader@^4.0.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz" + integrity sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q== + +cosmiconfig@^8.0.0, cosmiconfig@>=7: + version "8.0.0" + resolved "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-8.0.0.tgz" + integrity sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ== + dependencies: + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cz-conventional-changelog-zh@0.0.2: + version "0.0.2" + resolved "https://registry.npmmirror.com/cz-conventional-changelog-zh/-/cz-conventional-changelog-zh-0.0.2.tgz" + integrity sha512-rXy2HiG/0M7xChuodAN1L9qHDWTBInGTljaE59AlyqrXQAv0srg147vjep5CO7mGtxVYJQJi9TVP5KVZMWxDqQ== + dependencies: + chalk "^2.4.1" + commitizen "^4.0.3" + conventional-commit-types "^3.0.0" + lodash.assign "^4.2.0" + lodash.map "^4.5.1" + longest "^2.0.1" + word-wrap "^1.0.3" + optionalDependencies: + "@commitlint/load" ">6.1.1" + +cz-conventional-changelog@^3.3.0, cz-conventional-changelog@3.3.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz" + integrity sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw== + dependencies: + chalk "^2.4.1" + commitizen "^4.0.3" + conventional-commit-types "^3.0.0" + lodash.map "^4.5.1" + longest "^2.0.1" + word-wrap "^1.0.3" + optionalDependencies: + "@commitlint/load" ">6.1.1" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +dedent@0.7.0: + version "0.7.0" + resolved "https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/detect-file/-/detect-file-1.0.0.tgz" + integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== + +detect-indent@6.1.0: + version "6.1.0" + resolved "https://registry.npmmirror.com/detect-indent/-/detect-indent-6.1.0.tgz" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.0: + version "1.1.3" + resolved "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/doctrine/-/doctrine-2.1.0.tgz" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.2" + resolved "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.21.2.tgz" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== + dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.0" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.8.0: + version "8.8.0" + resolved "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz" + integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== + +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.npmmirror.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + dependencies: + debug "^3.2.7" + is-core-module "^2.11.0" + resolve "^1.22.1" + +eslint-module-utils@^2.7.4: + version "2.8.0" + resolved "https://registry.npmmirror.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.27.5: + version "2.27.5" + resolved "https://registry.npmmirror.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" + has "^1.0.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-unused-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz" + integrity sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A== + dependencies: + eslint-rule-composer "^0.3.0" + +eslint-rule-composer@^0.3.0: + version "0.3.0" + resolved "https://registry.npmmirror.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz" + integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.0.0: + version "7.2.0" + resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.0.tgz" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-scope@^7.2.0: + version "7.2.0" + resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.0.tgz" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^8.0.0, eslint@^8.40.0, eslint@^8.7.0, eslint@>=6.0.0, eslint@>=7.0.0, eslint@>=7.28.0: + version "8.40.0" + resolved "https://registry.npmmirror.com/eslint/-/eslint-8.40.0.tgz" + integrity sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.3" + "@eslint/js" "8.40.0" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.5.2" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.0.0, espree@^9.5.2: + version "9.5.2" + resolved "https://registry.npmmirror.com/espree/-/espree-9.5.2.tgz" + integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.0, esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0: + version "5.3.0" + resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-0.6.1.tgz" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + +estree-walker@^2.0.1, estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +execa@^4.0.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/expand-tilde/-/expand-tilde-2.0.2.tgz" + integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== + dependencies: + homedir-polyfill "^1.0.1" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.2.0.tgz" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-cache-dir@^3.3.2: + version "3.3.2" + resolved "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-node-modules@^2.1.2: + version "2.1.3" + resolved "https://registry.npmmirror.com/find-node-modules/-/find-node-modules-2.1.3.tgz" + integrity sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg== + dependencies: + findup-sync "^4.0.0" + merge "^2.1.1" + +find-root@1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/find-root/-/find-root-1.1.0.tgz" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +findup-sync@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/findup-sync/-/findup-sync-4.0.0.tgz" + integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^4.0.2" + resolve-dir "^1.0.1" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@9.1.0: + version "9.1.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2, functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.1" + resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.npmmirror.com/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +glob@7.2.3: + version "7.2.3" + resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^0.1.1: + version "0.1.1" + resolved "https://registry.npmmirror.com/global-dirs/-/global-dirs-0.1.1.tgz" + integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== + dependencies: + ini "^1.3.4" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/global-modules/-/global-modules-1.0.0.tgz" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/global-prefix/-/global-prefix-1.0.2.tgz" + integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.npmmirror.com/globals/-/globals-13.20.0.tgz" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.10" + resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz" + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== + dependencies: + ansi-regex "^2.0.0" + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.npmmirror.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +husky@^8.0.3: + version "8.0.3" + resolved "https://registry.npmmirror.com/husky/-/husky-8.0.3.tgz" + integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.1.4, ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.3, inherits@^2.0.4, inherits@2: + version "2.0.4" + resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inquirer@8.2.5: + version "8.2.5" + resolved "https://registry.npmmirror.com/inquirer/-/inquirer-8.2.5.tgz" + integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + +internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-module/-/is-module-1.0.0.tgz" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-reference@1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/is-reference/-/is-reference-1.2.1.tgz" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.10.tgz" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-utf8@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/is-utf8/-/is-utf8-0.2.1.tgz" + integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-windows@^1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +js-sdsl@^4.1.4: + version "4.4.0" + resolved "https://registry.npmmirror.com/js-sdsl/-/js-sdsl-4.4.0.tgz" + integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/lodash.assign/-/lodash.assign-4.2.0.tgz" + integrity sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.map@^4.5.1: + version "4.6.0" + resolved "https://registry.npmmirror.com/lodash.map/-/lodash.map-4.6.0.tgz" + integrity sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q== + +lodash.merge@^4.6.0, lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.mergewith@^4.6.2: + version "4.6.2" + resolved "https://registry.npmmirror.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" + integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.21, lodash@4.17.21: + version "4.17.21" + resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +loglevel-colored-level-prefix@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz" + integrity sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA== + dependencies: + chalk "^1.1.3" + loglevel "^1.4.1" + +loglevel@^1.4.1: + version "1.8.1" + resolved "https://registry.npmmirror.com/loglevel/-/loglevel-1.8.1.tgz" + integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== + +longest@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/longest/-/longest-2.0.1.tgz" + integrity sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.25.2: + version "0.25.9" + resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +magic-string@^0.27.0: + version "0.27.0" + resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.27.0.tgz" + integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + +make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/merge/-/merge-2.1.1.tgz" + integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +mersenne-twister@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/mersenne-twister/-/mersenne-twister-1.1.0.tgz" + integrity sha512-mUYWsMKNrm4lfygPkL3OfGzOPTR2DBlTkBNHM//F6hGp8cLThY897crAlk3/Jo17LEOOjQUrNAx6DvgO77QJkA== + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.5: + version "3.1.2" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.4" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.4.tgz" + integrity sha512-U0iNYXt9wALljzfnGkhFSy5sAC6/SCR3JrHrlsdJz4kF8MvhTRQNiC59iUi1iqsitV7abrNAJWElVL9pdnoUgw== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6, minimist@1.2.7: + version "1.2.7" + resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.7.tgz" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + +mri@^1.1.5: + version "1.2.0" + resolved "https://registry.npmmirror.com/mri/-/mri-1.2.0.tgz" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + +ms@^2.1.1, ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +multimatch@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/multimatch/-/multimatch-4.0.0.tgz" + integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ== + dependencies: + "@types/minimatch" "^3.0.3" + array-differ "^3.0.0" + array-union "^2.1.0" + arrify "^2.0.1" + minimatch "^3.0.4" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.npmmirror.com/mute-stream/-/mute-stream-0.0.8.tgz" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.npmmirror.com/object.values/-/object.values-1.1.6.tgz" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/parse-passwd/-/parse-passwd-1.0.0.tgz" + integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-is-network-drive@^1.0.20: + version "1.0.20" + resolved "https://registry.npmmirror.com/path-is-network-drive/-/path-is-network-drive-1.0.20.tgz" + integrity sha512-p5wCWlRB4+ggzxWshqHH9aF3kAuVu295NaENXmVhThbZPJQBeJdxZTP6CIoUR+kWHDUW56S9YcaO1gXnc/BOxw== + dependencies: + tslib "^2" + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-strip-sep@^1.0.17: + version "1.0.17" + resolved "https://registry.npmmirror.com/path-strip-sep/-/path-strip-sep-1.0.17.tgz" + integrity sha512-+2zIC2fNgdilgV7pTrktY6oOxxZUo9x5zJYfTzxsGze5kSGDDwhA5/0WlBn+sUyv/WuuyYn3OfM+Ue5nhdQUgA== + dependencies: + tslib "^2" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picomatch@^2.2.2, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +"pkg-dir@< 6 >= 5": + version "5.0.0" + resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-5.0.0.tgz" + integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== + dependencies: + find-up "^5.0.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-eslint@^15.0.1: + version "15.0.1" + resolved "https://registry.npmmirror.com/prettier-eslint/-/prettier-eslint-15.0.1.tgz" + integrity sha512-mGOWVHixSvpZWARqSDXbdtTL54mMBxc5oQYQ6RAqy8jecuNJBgN3t9E5a81G66F8x8fsKNiR1HWaBV66MJDOpg== + dependencies: + "@types/eslint" "^8.4.2" + "@types/prettier" "^2.6.0" + "@typescript-eslint/parser" "^5.10.0" + common-tags "^1.4.0" + dlv "^1.1.0" + eslint "^8.7.0" + indent-string "^4.0.0" + lodash.merge "^4.6.0" + loglevel-colored-level-prefix "^1.0.0" + prettier "^2.5.1" + pretty-format "^23.0.1" + require-relative "^0.8.7" + typescript "^4.5.4" + vue-eslint-parser "^8.0.1" + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.5.1, prettier@^2.8.3, prettier@>=2.0.0: + version "2.8.3" + resolved "https://registry.npmmirror.com/prettier/-/prettier-2.8.3.tgz" + integrity sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw== + +pretty-format@^23.0.1: + version "23.6.0" + resolved "https://registry.npmmirror.com/pretty-format/-/pretty-format-23.6.0.tgz" + integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + +pretty-quick@^3.1.3: + version "3.1.3" + resolved "https://registry.npmmirror.com/pretty-quick/-/pretty-quick-3.1.3.tgz" + integrity sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA== + dependencies: + chalk "^3.0.0" + execa "^4.0.0" + find-up "^4.1.0" + ignore "^5.1.4" + mri "^1.1.5" + multimatch "^4.0.0" + +primitive-geometry@^2.9.0: + version "2.9.1" + resolved "https://registry.npmmirror.com/primitive-geometry/-/primitive-geometry-2.9.1.tgz" + integrity sha512-qImUPQPio/CwQX6w52q11T31Z3G0TDJUbiOwt/h8JL3OSqhwHCFPurT/fTwLrCjiFMmxnhjxT+EA5NGIUaKJRA== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +regexp.prototype.flags@^1.4.3: + version "1.5.0" + resolved "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-relative@^0.8.7: + version "0.8.7" + resolved "https://registry.npmmirror.com/require-relative/-/require-relative-0.8.7.tgz" + integrity sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg== + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/resolve-dir/-/resolve-dir-1.0.1.tgz" + integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-global@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/resolve-global/-/resolve-global-1.0.0.tgz" + integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== + dependencies: + global-dirs "^0.1.1" + +resolve@^1.11.1, resolve@^1.20.0, resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup-plugin-node-resolve@^5.2.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz" + integrity sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw== + dependencies: + "@types/resolve" "0.0.8" + builtin-modules "^3.1.0" + is-module "^1.0.0" + resolve "^1.11.1" + rollup-pluginutils "^2.8.1" + +rollup-plugin-replace@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz" + integrity sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA== + dependencies: + magic-string "^0.25.2" + rollup-pluginutils "^2.6.0" + +rollup-plugin-typescript2@^0.31.1: + version "0.31.2" + resolved "https://registry.npmmirror.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.31.2.tgz" + integrity sha512-hRwEYR1C8xDGVVMFJQdEVnNAeWRvpaY97g5mp3IeLnzhNXzSVq78Ye/BJ9PAaUfN4DXa/uDnqerifMOaMFY54Q== + dependencies: + "@rollup/pluginutils" "^4.1.2" + "@yarn-tool/resolve-package" "^1.0.40" + find-cache-dir "^3.3.2" + fs-extra "^10.0.0" + resolve "^1.20.0" + tslib "^2.3.1" + +rollup-plugin-wgsl@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/rollup-plugin-wgsl/-/rollup-plugin-wgsl-1.0.1.tgz" + integrity sha512-i5arjFLdYzKcguG3Ajm4DpOm2L069BMLNzZv19u9RIB2nGGuzA2DnLbJbDO7lhhY+AgdNEMDTalhhU67GJUN3Q== + +rollup-pluginutils@^2.6.0, rollup-pluginutils@^2.8.1: + version "2.8.2" + resolved "https://registry.npmmirror.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + +rollup@^1.20.0||^2.0.0||^3.0.0, rollup@^2.68.0||^3.0.0, "rollup@^2.x || ^3.x", rollup@>=1.11.0, rollup@>=1.26.3, rollup@3.10.0: + version "3.10.0" + resolved "https://registry.npmmirror.com/rollup/-/rollup-3.10.0.tgz" + integrity sha512-JmRYz44NjC1MjVF2VKxc0M1a97vn+cDxeqWmnwyAF4FvpjK8YFdHpaqvQB+3IxCvX05vJxKZkoMDU8TShhmJVA== + optionalDependencies: + fsevents "~2.3.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.npmmirror.com/run-async/-/run-async-2.4.1.tgz" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.5.5: + version "7.8.0" + resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.0.tgz" + integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.5: + version "7.5.1" + resolved "https://registry.npmmirror.com/semver/-/semver-7.5.1.tgz" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.7: + version "7.5.1" + resolved "https://registry.npmmirror.com/semver/-/semver-7.5.1.tgz" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + dependencies: + lru-cache "^6.0.0" + +serialize-javascript@^6.0.0: + version "6.0.1" + resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +smob@^0.0.6: + version "0.0.6" + resolved "https://registry.npmmirror.com/smob/-/smob-0.0.6.tgz" + integrity sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1, strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz" + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +terser@^5.15.1: + version "5.16.1" + resolved "https://registry.npmmirror.com/terser/-/terser-5.16.1.tgz" + integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.npmmirror.com/through/-/through-2.3.8.tgz" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-node@^10.8.1, ts-node@>=10: + version "10.9.1" + resolved "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsconfig-paths@^3.14.1: + version "3.14.2" + resolved "https://registry.npmmirror.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2, tslib@^2.1.0, tslib@^2.3.1: + version "2.4.1" + resolved "https://registry.npmmirror.com/tslib/-/tslib-2.4.1.tgz" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.4.tgz" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typescript@^4.5.4, typescript@^4.6.4, typescript@^4.8.4, typescript@>=2.4.0, typescript@>=2.7, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=3: + version "4.9.4" + resolved "https://registry.npmmirror.com/typescript/-/typescript-4.9.4.tgz" + integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +upath2@^3.1.13: + version "3.1.19" + resolved "https://registry.npmmirror.com/upath2/-/upath2-3.1.19.tgz" + integrity sha512-d23dQLi8nDWSRTIQwXtaYqMrHuca0As53fNiTLLFDmsGBbepsZepISaB2H1x45bDFN/n3Qw9bydvyZEacTrEWQ== + dependencies: + "@types/node" "*" + path-is-network-drive "^1.0.20" + path-strip-sep "^1.0.17" + tslib "^2" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +vue-eslint-parser@^8.0.1: + version "8.3.0" + resolved "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz" + integrity sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g== + dependencies: + debug "^4.3.2" + eslint-scope "^7.0.0" + eslint-visitor-keys "^3.1.0" + espree "^9.0.0" + esquery "^1.4.0" + lodash "^4.17.21" + semver "^7.3.5" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.9.tgz" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@^1.2.14: + version "1.3.1" + resolved "https://registry.npmmirror.com/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.0.3, word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From f8b4eeac8a8407f957c7dccd54622e4c69a98f71 Mon Sep 17 00:00:00 2001 From: "junwei.gu" Date: Wed, 26 Jul 2023 18:24:18 +0800 Subject: [PATCH 2/2] refactor(mesh): refactor model and renderstate --- example/material/shaderMaterial.html | 24 +++--- example/native/cube1.html | 6 +- example/native/model.html | 6 +- example/native/particles.html | 6 +- example/native/textureCube.html | 12 ++- src/core/WebGPUTypes.ts | 111 +++++++++------------------ src/mesh/Mesh.ts | 6 +- src/mesh/Model.ts | 41 ++++------ src/render/DrawCommand.ts | 37 +++++---- src/render/RenderState.ts | 66 ++++++---------- 10 files changed, 129 insertions(+), 186 deletions(-) diff --git a/example/material/shaderMaterial.html b/example/material/shaderMaterial.html index 0acdb5c..73f57b9 100644 --- a/example/material/shaderMaterial.html +++ b/example/material/shaderMaterial.html @@ -77,17 +77,16 @@ } } ], - vert: (defines) => { - return ` + vert: ` struct MaterialUniform { modelMatrix: mat4x4, color:vec3, } struct VertexInput { //auto Fill - @location(${defines.positionLocation}) position: vec3, - @location(${defines.normalLocation}) normal: vec3, - @location(${defines.uvLocation}) uv: vec2, + @location(positionLocation) position: vec3, + @location(normalLocation) normal: vec3, + @location(uvLocation) uv: vec2, } struct VertexOutput { @builtin(position) position : vec4, @@ -100,8 +99,8 @@ cameraPosition: vec3, }; // Guaranteed to be consistent with the ShaderMaterial type - @binding(${defines.customBinding}) @group(0) var matUniform : MaterialUniform; - @binding(${defines.cameraBinding}) @group(1) var cameraUniform : CameraUniform; + @binding(customBinding) @group(0) var matUniform : MaterialUniform; + @binding(cameraBinding) @group(1) var cameraUniform : CameraUniform; @vertex fn main(input:VertexInput) -> VertexOutput { var output : VertexOutput; @@ -109,10 +108,8 @@ output.fragPosition = vec4(input.uv,input.uv.x,1.0); return output; } - `; - }, - frag: (defines) => { - return ` + `, + frag: ` struct VertexOutput { @builtin(position) position : vec4, @location(0) fragPosition: vec4, @@ -121,13 +118,12 @@ modelMatrix: mat4x4, color:vec3, } - @binding(${defines.customBinding}) @group(0) var matUniform : MaterialUniform; + @binding(customBinding) @group(0) var matUniform : MaterialUniform; @fragment fn main(input:VertexOutput) -> @location(0) vec4 { return vec4(input.fragPosition.xyz*matUniform.color,1.0); } - `; - } + ` }); const boxPrimitive = new Mesh(boxGeometry, boxMaterial); scene.add(boxPrimitive); diff --git a/example/native/cube1.html b/example/native/cube1.html index c34582c..b82d398 100644 --- a/example/native/cube1.html +++ b/example/native/cube1.html @@ -174,8 +174,10 @@ format: "depth24plus" } }, - count: 36, - instances: 1 + draw: { + count: 36, + instanceCount: 1 + } }); function animate() { diff --git a/example/native/model.html b/example/native/model.html index a8f6a4f..d513f54 100644 --- a/example/native/model.html +++ b/example/native/model.html @@ -187,8 +187,10 @@ format: "depth24plus" } }, - count: 36, - instances: 1 + draw: { + count: 36, + instanceCount: 1 + } }); function animate() { diff --git a/example/native/particles.html b/example/native/particles.html index 6a3e1cf..a6e8e77 100644 --- a/example/native/particles.html +++ b/example/native/particles.html @@ -208,8 +208,10 @@ format: "depth24plus" } }, - count: 6, - instances: numParticles + draw: { + count: 6, + instanceCount: numParticles + } }); const simulateModel = new Model({ shaderId: "simulate", diff --git a/example/native/textureCube.html b/example/native/textureCube.html index ededcfa..5c7ee7d 100644 --- a/example/native/textureCube.html +++ b/example/native/textureCube.html @@ -190,8 +190,10 @@ format: "depth24plus" } }, - count: 36, - instances: 1 + draw: { + count: 36, + instanceCount: 1 + } }); const model1 = new Model({ shaderId: "model", @@ -289,8 +291,10 @@ format: "depth24plus" } }, - count: 36, - instances: 1 + draw: { + count: 36, + instanceCount: 1 + } }); function animate() { diff --git a/src/core/WebGPUTypes.ts b/src/core/WebGPUTypes.ts index 390e0d9..2f8c256 100644 --- a/src/core/WebGPUTypes.ts +++ b/src/core/WebGPUTypes.ts @@ -5,6 +5,7 @@ import BindGroupEntity from "../render/BindGroupEntity"; import BindGroupLayout from "../render/BindGroupLayout"; import Buffer from "../render/Buffer"; import IndexBuffer from "../render/IndexBuffer"; +import QuerySet from "../render/QuerySet"; import { RenderState } from "../render/RenderState"; import RenderTarget from "../render/RenderTarget"; import Sampler from "../render/Sampler"; @@ -187,7 +188,7 @@ export type bufferLayoutType = { minBindingSize?: number; }; // renderstate -export type DepthStencil = { +export type DepthStencilProps = { format: TextureFormat; depthWriteEnabled: boolean; depthCompare: CompareFunction; @@ -209,19 +210,19 @@ export type DepthStencil = { depthBiasSlopeScale?: number; depthBiasClamp?: number; }; -export type PrimitiveState = { +export type PrimitiveStateProps = { frontFace?: FrontFace; cullMode?: CullMode; unclippedDepth?: boolean; topology?: PrimitiveTopology; stripIndexFormat?: IndexFormat; }; -export type MultiSample = { +export type MultiSampleProps = { count?: number; mask?: number; alphaToCoverageEnabled?: boolean; }; -export type Target = { +export type TargetProps = { format: TextureFormat; blend?: { color: { @@ -237,36 +238,38 @@ export type Target = { }; writeMask: ColorWriteFlags; }; -export type BlendConstant = { +export type BlendConstantProp = { r: number; g: number; b: number; a: number; }; export type RenderStateProps = { - depthStencil?: DepthStencil; - primitive?: PrimitiveState; - multisample?: MultiSample; + depthStencil?: DepthStencilProps; + primitive?: PrimitiveStateProps; + multisample?: MultiSampleProps; stencilReference?: number; - targets?: Array; - viewport?: { x: number; y: number; width: number; height: number }; - blendConstant?: BlendConstant; + targets?: Array; + viewport?: ViewPortProps; + blendConstant?: BlendConstantProp; scissorTestEnabled?: boolean; stencilEnabled?: boolean; }; -export type ViewPort = { +export type ViewPortProps = { x?: number; y?: number; width?: number; height?: number; minDepth?: number; maxDepth?: number; + variable?: boolean; }; -export type ScissorTest = { +export type ScissorTestProps = { x: number; y: number; width: number; height: number; + variable?: boolean; }; export type ShaderMaterialParms = { type?: string; @@ -368,6 +371,8 @@ export type DrawCommandParams = { lightShaderData?: ShaderData; useLight?: boolean; + + drawParams?: DrawParmas; }; export type ModelParams = { @@ -381,8 +386,6 @@ export type ModelParams = { }; uniformBuffers?: Array; renderState?: RenderStateProp; - count?: number; - instances?: number; indices?: Array; draw?: DrawParmas; dispatch?: { x?: number; y?: number; z?: number }; @@ -413,66 +416,13 @@ export type AttributeProp = { }; export type RenderStateProp = { stencilReference: number; - blendConstant?: { - r: number; - g: number; - b: number; - a: number; - }; - multiSample?: { - count: number; - mask: number; - alphaToCoverageEnabled: boolean; - }; - scissorTest?: { - x: number; - y: number; - width: number; - height: number; - }; - viewPort?: { - x: number; - y: number; - width: number; - height: number; - minDepth: number; - maxDepth: number; - }; - primitive?: { - frontFace: string; - cullMode: string; - unclippedDepth: boolean; - topology: string; - }; - depthStencil?: { - format: string; - depthWriteEnabled: boolean; - depthCompare: string; - stencilReadMask: number; - stencilWriteMask: number; - stencilFrontCompare: string; - stencilFrontFailOp: string; - stencilFrontDepthFailOp: string; - stencilFrontPassOp: string; - - stencilBackCompare: string; - stencilBackFailOp: string; - stencilBackDepthFailOp: string; - stencilBackPassOp: string; - depthBias: number; - depthBiasSlopeScale: number; - depthBiasClamp: number; - }; - targets?: Array<{ - format?: string; - blendColorOperation?: string; - blendColorSrcFactor?: string; - blendColorDstFactor?: string; - blendAlphaOperation?: string; - blendAlphaSrcFactor?: string; - blendAlphaDstFactor?: string; - writeMask: GPUColorWrite; - }>; + blendConstant?: BlendConstantProp; + multiSample?: MultiSampleProps; + scissorTest?: ScissorTestProps; + viewPort?: ViewPortProps; + primitive?: PrimitiveStateProps; + depthStencil?: DepthStencilProps; + targets?: Array; }; export type DrawParmas = { count?: number; // The number of indices to draw./The number of vertices to draw. @@ -524,3 +474,14 @@ export enum ShaderMainStage { FRAG = "fragment", COMPUTE = "compute" } +export type RenderModelParams = { + device: GPUDevice; + passEncoder: GPURenderPassEncoder; + querySet?: QuerySet; + viewPort?: ViewPortProps; + scissorTest?: ScissorTestProps; +}; +export type ComputeModelParams = { + device: GPUDevice; + passEncoder: GPUComputePassEncoder; +}; diff --git a/src/mesh/Mesh.ts b/src/mesh/Mesh.ts index 5b75a58..bbfff4c 100644 --- a/src/mesh/Mesh.ts +++ b/src/mesh/Mesh.ts @@ -71,8 +71,10 @@ export class Mesh extends RenderObject { vertexBuffers: this.geometry.vertexBuffers, indexBuffer: this.geometry.indexBuffer, shaderData: this.material.shaderData, - instances: this.instanceCount, - count: this.geometry.count, + drawParams: { + count: this.geometry.count, + instanceCount: this.instanceCount + }, renderState: this.material.renderState, shaderSource: this.material.shaderSource, lightShaderData: this.material.light ? lightManger?.lightShaderData : undefined, diff --git a/src/mesh/Model.ts b/src/mesh/Model.ts index 885d587..8756501 100644 --- a/src/mesh/Model.ts +++ b/src/mesh/Model.ts @@ -6,7 +6,7 @@ import { InputStepMode, PrimitiveTopology } from "../core/WebGPUConstant"; -import { ModelParams } from "../core/WebGPUTypes"; +import { ComputeModelParams, ModelParams, RenderModelParams } from "../core/WebGPUTypes"; import { BufferFloat32Attribute, Float32Attribute, InterleavedFloat32Attribute } from "../render/Attribute"; import { ComputeCommand } from "../render/ComputeCommand"; import DrawCommand from "../render/DrawCommand"; @@ -14,7 +14,6 @@ import IndexBuffer from "../render/IndexBuffer"; import { BlendConstant, DepthStencil, - DepthStencilProps, MultiSample, Primitive, RenderState, @@ -40,15 +39,17 @@ export class Model { this.renderType = this.modelParams.compute != undefined ? "compute" : "render"; this.vertexBuffers = new Map(); } - render(params: RenderModelParams) { - const { device, passEncoder } = params; + public render(params: RenderModelParams) { + const { device, passEncoder, viewPort, scissorTest } = params; if (!this.command) this.command = this.createDrawCommand(); (this.command as DrawCommand).render({ device, - passEncoder: passEncoder + passEncoder: passEncoder, + viewPort: viewPort ? ViewPort.fromViewPortProps(viewPort) : undefined, + scissorTest: scissorTest ? ScissorTest.fromScissorTestProps(scissorTest) : undefined }); } - compute(params: ComputeModelParams) { + public compute(params: ComputeModelParams) { const { device, passEncoder } = params; if (!this.command) this.command = this.createComputeCommand(); (this.command as ComputeCommand).render({ @@ -75,7 +76,7 @@ export class Model { this.modelParams = null; } private createDrawCommand() { - const { count, instances } = this.modelParams; + const { draw } = this.modelParams; const vertexBuffers = this.createVertexBuffer(); this.shaderData = this.createShaderData(); const indexBuffer = this.createIndexBuffer(); @@ -87,8 +88,7 @@ export class Model { indexBuffer, shaderSource, renderState, - count, - instances + drawParams: draw }); } private createComputeCommand() { @@ -149,7 +149,7 @@ export class Model { const { shaderId, uniformBuffers, uniformTextureAndSampler } = this.modelParams; const shaderData = new ShaderData(shaderId); // fill uniformBuffer - uniformBuffers.forEach((uniformBuffer) => this.createUniformBuffer(uniformBuffer, shaderData, shaderId)); + uniformBuffers.forEach((uniformBuffer) => this.createUniformBuffer(uniformBuffer, shaderData)); // fill texture and sampler this.addUniformToShaderData(uniformTextureAndSampler, shaderData, undefined); return shaderData; @@ -166,14 +166,12 @@ export class Model { stencilReference } = this.modelParams.renderState; return new RenderState({ - scissorTest: scissorTest - ? new ScissorTest(scissorTest.x, scissorTest.y, scissorTest.width, scissorTest.height) - : undefined, - viewport: viewPort ? new ViewPort(viewPort.x, viewPort.y, viewPort.width, viewPort.height) : undefined, + scissorTest: scissorTest ? ScissorTest.fromScissorTestProps(scissorTest) : undefined, + viewport: viewPort ? ViewPort.fromViewPortProps(viewPort) : undefined, targets: targets?.map((target) => { - return new Target(target as any); + return new Target(target); }), - depthStencil: depthStencil ? new DepthStencil(depthStencil) : undefined, + depthStencil: depthStencil ? new DepthStencil(depthStencil) : undefined, blendConstant: blendConstant ? new BlendConstant(blendConstant.r, blendConstant.g, blendConstant.b, blendConstant.a) : undefined, @@ -203,7 +201,7 @@ export class Model { return indexBuffer; } - private createUniformBuffer(uniformBufferParams, shaderData: ShaderData, shaderId: string) { + private createUniformBuffer(uniformBufferParams, shaderData: ShaderData) { const { type = "uniform", usage = BufferUsage.Uniform | BufferUsage.CopyDst, @@ -234,12 +232,3 @@ export class Model { }); } } - -export type RenderModelParams = { - device: GPUDevice; - passEncoder: GPURenderPassEncoder; -}; -export type ComputeModelParams = { - device: GPUDevice; - passEncoder: GPUComputePassEncoder; -}; diff --git a/src/render/DrawCommand.ts b/src/render/DrawCommand.ts index 77b358b..80232e6 100644 --- a/src/render/DrawCommand.ts +++ b/src/render/DrawCommand.ts @@ -1,5 +1,5 @@ import Camera from "../camera/Camera"; -import { DrawCommandParams } from "../core/WebGPUTypes"; +import { DrawCommandParams, DrawParmas } from "../core/WebGPUTypes"; import { Material } from "../material/Material"; import { ShaderSource } from "../shader/ShaderSource"; import Buffer from "./Buffer"; @@ -26,10 +26,6 @@ class DrawCommand implements Command { public queryIndex?: number; - public count?: number; - - public instances?: number; - public shaderSource?: ShaderSource; public dirty?: boolean; @@ -42,6 +38,8 @@ class DrawCommand implements Command { public useLight?: boolean; + public drawParams: DrawParmas; + constructor(options: DrawCommandParams) { this.shaderData = options.shaderData; @@ -57,15 +55,13 @@ class DrawCommand implements Command { this.queryIndex = options.queryIndex; - this.count = options.count; - - this.instances = options.instances; - this.shaderSource = options.shaderSource; this.dirty = options.dirty; this.lightShaderData = options.lightShaderData; + + this.drawParams = options.drawParams; } public shallowClone(material?: Material) { if (!material) return; @@ -73,8 +69,7 @@ class DrawCommand implements Command { vertexBuffers: this.vertexBuffers, indexBuffer: this.indexBuffer, shaderData: material.shaderData, - instances: this.instances, - count: this.count, + drawParams: this.drawParams, renderState: material.renderState, shaderSource: material.shaderSource, lightShaderData: material.light ? this.lightShaderData : undefined, @@ -90,15 +85,25 @@ class DrawCommand implements Command { indexBuffer, lightShaderData, shaderSource, - count, - instances, renderTarget, useLight, indirectOffset, indirectBuffer, - queryIndex + queryIndex, + drawParams } = this; + + const { + count, + baseVertex, + instanceCount = 1, + firstIndex, + firstInstance = 0, + firstVertex = 0 + } = drawParams ?? {}; + const currentPassEncoder = renderTarget?.beginRenderPass?.(device) ?? passEncoder; + const defines = Object.assign({}, lightShaderData?.defines ?? {}, camera?.shaderData?.defines ?? {}); shaderData?.bind?.(device, currentPassEncoder); @@ -130,13 +135,13 @@ class DrawCommand implements Command { if (indirectBuffer) { currentPassEncoder.drawIndexedIndirect(indirectBuffer.gpuBuffer, indirectOffset || 0); } else { - currentPassEncoder.drawIndexed(count || 0, instances || 1, 0, 0, 0); + currentPassEncoder.drawIndexed(count, instanceCount, firstIndex, baseVertex, firstInstance); } } else if (count) { if (indirectBuffer) { currentPassEncoder.drawIndirect(indirectBuffer.gpuBuffer, indirectOffset); } else { - currentPassEncoder.draw(count, instances || 1, 0, 0); + currentPassEncoder.draw(count, instanceCount, firstVertex, firstInstance); } } if (queryIndex != undefined) querySet?.endQuery(currentPassEncoder); diff --git a/src/render/RenderState.ts b/src/render/RenderState.ts index d526268..13fd490 100644 --- a/src/render/RenderState.ts +++ b/src/render/RenderState.ts @@ -9,6 +9,7 @@ import { CullMode, PrimitiveTopology } from "../core/WebGPUConstant"; +import { DepthStencilProps, ScissorTestProps, TargetProps, ViewPortProps } from "../core/WebGPUTypes"; // import { BindRenderState } from "../core/WebGPUTypes"; import defaultValue from "../utils/defaultValue"; @@ -110,6 +111,10 @@ export class ScissorTest { this.width = width; this.height = height; } + static fromScissorTestProps(scissorTest: ScissorTestProps) { + const { x = 0, y = 0, width = 0, height = 0, variable = true } = scissorTest; + return new ScissorTest(x, y, width, height, variable); + } equalsAndUpdateCache(scissorTest: ScissorTest): boolean { const { x, y, width, height } = scissorTest; if (this.x != x || this.y != y || this.width != width || this.height != height) { @@ -145,6 +150,10 @@ export class ViewPort { this.minDepth = minDepth; this.maxDepth = maxDepth; } + static fromViewPortProps(viewPort: ViewPortProps) { + const { x = 0, y = 0, width = 0, height = 0, minDepth = 0, maxDepth = 1, variable = true } = viewPort; + return new ViewPort(x, y, width, height, minDepth, maxDepth, variable); + } equalsAndUpdateCache(viewPort: ViewPort): boolean { const { x, y, width, height, minDepth, maxDepth } = viewPort; if ( @@ -205,14 +214,14 @@ export class DepthStencil { this.depthCompare = defaultValue(options?.depthCompare, CompareFunction.Less); this.stencilReadMask = defaultValue(options?.stencilReadMask, 0xffffffff); this.stencilWriteMask = defaultValue(options?.stencilWriteMask, 0xffffffff); - this.stencilFrontCompare = defaultValue(options?.stencilFrontCompare, CompareFunction.Always); - this.stencilFrontFailOp = defaultValue(options?.stencilFrontFailOp, StencilOperation.Keep); - this.stencilFrontDepthFailOp = defaultValue(options?.stencilFrontDepthFailOp, StencilOperation.Keep); - this.stencilFrontPassOp = defaultValue(options?.stencilFrontPassOp, StencilOperation.Keep); - this.stencilBackCompare = defaultValue(options?.stencilBackCompare, CompareFunction.Always); - this.stencilBackFailOp = defaultValue(options?.stencilBackFailOp, StencilOperation.Keep); - this.stencilBackDepthFailOp = defaultValue(options?.stencilBackDepthFailOp, StencilOperation.Keep); - this.stencilBackPassOp = defaultValue(options?.stencilBackPassOp, StencilOperation.Keep); + this.stencilFrontCompare = defaultValue(options?.stencilFront?.compare, CompareFunction.Always); + this.stencilFrontFailOp = defaultValue(options?.stencilFront?.failOp, StencilOperation.Keep); + this.stencilFrontDepthFailOp = defaultValue(options?.stencilFront?.depthFailOp, StencilOperation.Keep); + this.stencilFrontPassOp = defaultValue(options?.stencilFront?.passOp, StencilOperation.Keep); + this.stencilBackCompare = defaultValue(options?.stencilBack?.compare, CompareFunction.Always); + this.stencilBackFailOp = defaultValue(options?.stencilBack?.failOp, StencilOperation.Keep); + this.stencilBackDepthFailOp = defaultValue(options?.stencilBack?.depthFailOp, StencilOperation.Keep); + this.stencilBackPassOp = defaultValue(options?.stencilBack?.passOp, StencilOperation.Keep); this.depthBias = defaultValue(options?.depthBias, 0); this.depthBiasSlopeScale = defaultValue(options?.depthBiasSlopeScale, 0); this.depthBiasClamp = defaultValue(options?.depthBiasClamp, 0); @@ -253,12 +262,12 @@ export class Target { writeMask: GPUColorWrite; constructor(options?: TargetProps) { this.format = defaultValue(options?.format, TextureFormat.BGRA8Unorm); - this.blendColorOperation = defaultValue(options?.blendColorOperation, BlendOperation.Add); - this.blendColorSrcFactor = defaultValue(options?.blendColorSrcFactor, BlendFactor?.SrcAlpha); - this.blendColorDstFactor = defaultValue(options?.blendColorDstFactor, BlendFactor.OneMinusSrcAlpha); - this.blendAlphaOperation = defaultValue(options?.blendAlphaOperation, BlendOperation.Add); - this.blendAlphaSrcFactor = defaultValue(options?.blendAlphaSrcFactor, BlendFactor.One); - this.blendAlphaDstFactor = defaultValue(options?.blendAlphaDstFactor, BlendFactor.One); + this.blendColorOperation = defaultValue(options?.blend?.color?.operation, BlendOperation.Add); + this.blendColorSrcFactor = defaultValue(options?.blend?.color?.srcFactor, BlendFactor?.SrcAlpha); + this.blendColorDstFactor = defaultValue(options?.blend?.color?.dstFactor, BlendFactor.OneMinusSrcAlpha); + this.blendAlphaOperation = defaultValue(options?.blend?.alpha?.operation, BlendOperation.Add); + this.blendAlphaSrcFactor = defaultValue(options?.blend?.alpha?.srcFactor, BlendFactor.One); + this.blendAlphaDstFactor = defaultValue(options?.blend?.alpha?.dstFactor, BlendFactor.One); this.writeMask = defaultValue(options?.writeMask, GPUColorWrite.All); } getGPUTargetDec() { @@ -282,35 +291,6 @@ export class Target { } const cacheViewPort = new ViewPort(); const cacheScissorTest = new ScissorTest(); -export type DepthStencilProps = { - format?: TextureFormat; - depthWriteEnabled?: boolean; - depthCompare?: CompareFunction; - stencilReadMask?: number; - stencilWriteMask?: number; - stencilFrontCompare?: CompareFunction; - stencilFrontFailOp?: StencilOperation; - stencilFrontDepthFailOp?: StencilOperation; - stencilFrontPassOp?: StencilOperation; - - stencilBackCompare?: CompareFunction; - stencilBackFailOp?: StencilOperation; - stencilBackDepthFailOp?: StencilOperation; - stencilBackPassOp?: StencilOperation; - depthBias?: number; - depthBiasSlopeScale?: number; - depthBiasClamp?: number; -}; -export type TargetProps = { - format?: TextureFormat; - blendColorOperation?: BlendOperation; - blendColorSrcFactor?: BlendFactor; - blendColorDstFactor?: BlendFactor; - blendAlphaOperation?: BlendOperation; - blendAlphaSrcFactor?: BlendFactor; - blendAlphaDstFactor?: BlendFactor; - writeMask?: GPUColorWrite; -}; export type RenderStateParams = { scissorTest?: ScissorTest; viewport?: ViewPort;