angular-three-soba 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/abstractions/lib/catmull-rom-line.d.ts +148 -148
- package/abstractions/lib/edges.d.ts +166 -166
- package/abstractions/lib/grid.d.ts +30 -30
- package/abstractions/lib/line.d.ts +10 -9
- package/abstractions/lib/prism-geometry.d.ts +4 -4
- package/abstractions/lib/rounded-box.d.ts +3 -3
- package/abstractions/lib/text-3d.d.ts +38 -38
- package/abstractions/lib/text.d.ts +2 -3
- package/cameras/lib/cube-camera.d.ts +2 -2
- package/cameras/lib/orthographic-camera.d.ts +7 -8
- package/cameras/lib/perspective-camera.d.ts +2 -3
- package/controls/lib/camera-controls.d.ts +1 -1
- package/controls/lib/orbit-controls.d.ts +1 -1
- package/esm2022/abstractions/lib/billboard.mjs +3 -3
- package/esm2022/abstractions/lib/catmull-rom-line.mjs +3 -3
- package/esm2022/abstractions/lib/cubic-bezier-line.mjs +3 -3
- package/esm2022/abstractions/lib/edges.mjs +30 -34
- package/esm2022/abstractions/lib/gradient-texture.mjs +3 -3
- package/esm2022/abstractions/lib/grid.mjs +3 -3
- package/esm2022/abstractions/lib/helper.mjs +18 -20
- package/esm2022/abstractions/lib/line.mjs +25 -28
- package/esm2022/abstractions/lib/prism-geometry.mjs +3 -3
- package/esm2022/abstractions/lib/quadratic-bezier-line.mjs +3 -3
- package/esm2022/abstractions/lib/rounded-box.mjs +11 -17
- package/esm2022/abstractions/lib/text-3d.mjs +14 -17
- package/esm2022/abstractions/lib/text.mjs +11 -16
- package/esm2022/cameras/lib/camera-content.mjs +3 -3
- package/esm2022/cameras/lib/cube-camera.mjs +18 -27
- package/esm2022/cameras/lib/orthographic-camera.mjs +20 -20
- package/esm2022/cameras/lib/perspective-camera.mjs +21 -21
- package/esm2022/controls/lib/camera-controls.mjs +3 -3
- package/esm2022/controls/lib/orbit-controls.mjs +3 -3
- package/esm2022/controls/lib/scroll-controls.mjs +124 -130
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-helper.mjs +6 -6
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewcube.mjs +12 -12
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewport.mjs +9 -9
- package/esm2022/gizmos/lib/pivot-controls/axis-arrow.mjs +6 -4
- package/esm2022/gizmos/lib/pivot-controls/axis-rotator.mjs +3 -3
- package/esm2022/gizmos/lib/pivot-controls/pivot-controls.mjs +44 -47
- package/esm2022/gizmos/lib/pivot-controls/plane-slider.mjs +3 -3
- package/esm2022/gizmos/lib/pivot-controls/scaling-sphere.mjs +3 -3
- package/esm2022/gizmos/lib/transform-controls.mjs +3 -3
- package/esm2022/loaders/lib/loader.mjs +3 -3
- package/esm2022/materials/lib/custom-shader-material.mjs +8 -12
- package/esm2022/materials/lib/mesh-distort-material.mjs +3 -3
- package/esm2022/materials/lib/mesh-reflector-material.mjs +11 -15
- package/esm2022/materials/lib/mesh-refraction-material.mjs +26 -30
- package/esm2022/materials/lib/mesh-transmission-material.mjs +3 -3
- package/esm2022/materials/lib/mesh-wobble-material.mjs +3 -3
- package/esm2022/materials/lib/point-material.mjs +3 -3
- package/esm2022/misc/lib/bake-shadows.mjs +8 -10
- package/esm2022/misc/lib/computed-attribute.mjs +15 -19
- package/esm2022/misc/lib/decal.mjs +56 -53
- package/esm2022/misc/lib/fbo.mjs +10 -10
- package/esm2022/misc/lib/html/html-content.mjs +62 -67
- package/esm2022/misc/lib/html/html.mjs +3 -3
- package/esm2022/misc/lib/intersect.mjs +6 -9
- package/esm2022/misc/lib/sampler.mjs +42 -42
- package/esm2022/performances/lib/adaptive-dpr.mjs +29 -35
- package/esm2022/performances/lib/adaptive-events.mjs +12 -16
- package/esm2022/performances/lib/detailed.mjs +14 -18
- package/esm2022/performances/lib/instances/instances.mjs +16 -22
- package/esm2022/performances/lib/points/points.mjs +19 -25
- package/esm2022/performances/lib/segments/segments.mjs +11 -14
- package/esm2022/shaders/lib/mesh-refraction-material.mjs +1 -1
- package/esm2022/staging/index.mjs +3 -2
- package/esm2022/staging/lib/accumulative-shadows.mjs +19 -21
- package/esm2022/staging/lib/backdrop.mjs +19 -23
- package/esm2022/staging/lib/bb-anchor.mjs +3 -3
- package/esm2022/staging/lib/bounds.mjs +39 -43
- package/esm2022/staging/lib/camera-shake.mjs +14 -18
- package/esm2022/staging/lib/caustics.mjs +24 -28
- package/esm2022/staging/lib/center.mjs +28 -32
- package/esm2022/staging/lib/contact-shadows.mjs +3 -3
- package/esm2022/staging/lib/environment/environment.mjs +338 -0
- package/esm2022/staging/lib/environment/inject-environment.mjs +184 -0
- package/esm2022/staging/lib/float.mjs +3 -3
- package/esm2022/staging/lib/lightformer.mjs +18 -22
- package/esm2022/staging/lib/mask.mjs +8 -12
- package/esm2022/staging/lib/matcap-texture.mjs +9 -11
- package/esm2022/staging/lib/normal-texture.mjs +9 -11
- package/esm2022/staging/lib/randomized-lights.mjs +9 -13
- package/esm2022/staging/lib/render-texture.mjs +19 -20
- package/esm2022/staging/lib/sky.mjs +3 -3
- package/esm2022/staging/lib/spot-light.mjs +32 -40
- package/esm2022/staging/lib/stage.mjs +13 -17
- package/esm2022/stats/lib/stats.mjs +21 -27
- package/fesm2022/angular-three-soba-abstractions.mjs +119 -138
- package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2022/angular-three-soba-cameras.mjs +57 -64
- package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2022/angular-three-soba-controls.mjs +129 -135
- package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
- package/fesm2022/angular-three-soba-gizmos.mjs +87 -88
- package/fesm2022/angular-three-soba-gizmos.mjs.map +1 -1
- package/fesm2022/angular-three-soba-loaders.mjs +3 -3
- package/fesm2022/angular-three-soba-materials.mjs +52 -62
- package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2022/angular-three-soba-misc.mjs +188 -195
- package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2022/angular-three-soba-performances.mjs +90 -114
- package/fesm2022/angular-three-soba-performances.mjs.map +1 -1
- package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-staging.mjs +427 -430
- package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
- package/fesm2022/angular-three-soba-stats.mjs +20 -26
- package/fesm2022/angular-three-soba-stats.mjs.map +1 -1
- package/materials/lib/custom-shader-material.d.ts +3 -3
- package/materials/lib/mesh-refraction-material.d.ts +3 -3
- package/materials/lib/mesh-transmission-material.d.ts +1 -1
- package/misc/lib/computed-attribute.d.ts +5 -5
- package/misc/lib/decal.d.ts +5 -5
- package/misc/lib/html/html-content.d.ts +6 -6
- package/misc/lib/html/html.d.ts +1 -1
- package/misc/lib/sampler.d.ts +2 -4
- package/package.json +12 -12
- package/performances/lib/instances/instances.d.ts +11 -11
- package/performances/lib/points/points.d.ts +20 -20
- package/performances/lib/segments/segments.d.ts +4 -4
- package/shaders/lib/mesh-refraction-material.d.ts +2 -5
- package/staging/index.d.ts +2 -1
- package/staging/lib/camera-shake.d.ts +0 -1
- package/staging/lib/caustics.d.ts +1 -1
- package/staging/lib/center.d.ts +2 -2
- package/staging/lib/contact-shadows.d.ts +1 -1
- package/staging/lib/{environment.d.ts → environment/environment.d.ts} +20 -49
- package/staging/lib/environment/inject-environment.d.ts +33 -0
- package/staging/lib/lightformer.d.ts +1 -1
- package/staging/lib/mask.d.ts +1 -1
- package/staging/lib/matcap-texture.d.ts +0 -1
- package/staging/lib/normal-texture.d.ts +0 -1
- package/staging/lib/render-texture.d.ts +1 -1
- package/staging/lib/sky.d.ts +1 -1
- package/staging/lib/spot-light.d.ts +2 -2
- package/staging/lib/stage.d.ts +7 -6
- package/esm2022/staging/lib/environment.mjs +0 -481
|
@@ -1,481 +0,0 @@
|
|
|
1
|
-
import { NgTemplateOutlet } from '@angular/common';
|
|
2
|
-
import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, Directive, Injector, TemplateRef, afterNextRender, computed, contentChild, effect, inject, input, output, signal, untracked, viewChild, } from '@angular/core';
|
|
3
|
-
import { GainMapLoader, HDRJPGLoader } from '@monogrid/gainmap-js';
|
|
4
|
-
import { NgtArgs, NgtPortal, NgtPortalContent, applyProps, extend, injectBeforeRender, injectLoader, injectStore, is, pick, prepare, } from 'angular-three';
|
|
5
|
-
import { LinearEncoding, sRGBEncoding } from 'angular-three-soba/misc';
|
|
6
|
-
import { assertInjector } from 'ngxtension/assert-injector';
|
|
7
|
-
import { injectAutoEffect } from 'ngxtension/auto-effect';
|
|
8
|
-
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
9
|
-
import { CubeCamera, CubeReflectionMapping, CubeTexture, CubeTextureLoader, EquirectangularReflectionMapping, HalfFloatType, Scene, WebGLCubeRenderTarget, } from 'three';
|
|
10
|
-
import { EXRLoader, GroundProjectedEnv, RGBELoader } from 'three-stdlib';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
const CUBEMAP_ROOT = 'https://raw.githack.com/pmndrs/drei-assets/456060a26bbeb8fdf79326f224b6d99b8bcce736/hdri/';
|
|
13
|
-
export const ENVIRONMENT_PRESETS = {
|
|
14
|
-
apartment: 'lebombo_1k.hdr',
|
|
15
|
-
city: 'potsdamer_platz_1k.hdr',
|
|
16
|
-
dawn: 'kiara_1_dawn_1k.hdr',
|
|
17
|
-
forest: 'forest_slope_1k.hdr',
|
|
18
|
-
lobby: 'st_fagans_interior_1k.hdr',
|
|
19
|
-
night: 'dikhololo_night_1k.hdr',
|
|
20
|
-
park: 'rooitou_park_1k.hdr',
|
|
21
|
-
studio: 'studio_small_03_1k.hdr',
|
|
22
|
-
sunset: 'venice_sunset_1k.hdr',
|
|
23
|
-
warehouse: 'empty_warehouse_01_1k.hdr',
|
|
24
|
-
};
|
|
25
|
-
function resolveScene(scene) {
|
|
26
|
-
return is.ref(scene) ? scene.nativeElement : scene;
|
|
27
|
-
}
|
|
28
|
-
function setEnvProps(background, scene, defaultScene, texture, sceneProps = {}) {
|
|
29
|
-
sceneProps.backgroundBlurriness ??= sceneProps.blur ?? 0;
|
|
30
|
-
sceneProps.backgroundIntensity ??= 1;
|
|
31
|
-
// @ts-expect-error - it's ok, we're sending through applyProps
|
|
32
|
-
sceneProps.backgroundRotation ??= [0, 0, 0];
|
|
33
|
-
sceneProps.environmentIntensity ??= 1;
|
|
34
|
-
// @ts-expect-error - it's ok, we're sending through applyProps
|
|
35
|
-
sceneProps.environmentRotation ??= [0, 0, 0];
|
|
36
|
-
const target = resolveScene(scene || defaultScene);
|
|
37
|
-
const oldbg = target.background;
|
|
38
|
-
const oldenv = target.environment;
|
|
39
|
-
const oldSceneProps = {
|
|
40
|
-
backgroundBlurriness: target.backgroundBlurriness,
|
|
41
|
-
backgroundIntensity: target.backgroundIntensity,
|
|
42
|
-
backgroundRotation: target.backgroundRotation?.clone?.() ?? [0, 0, 0],
|
|
43
|
-
environmentIntensity: target.environmentIntensity,
|
|
44
|
-
environmentRotation: target.environmentRotation?.clone?.() ?? [0, 0, 0],
|
|
45
|
-
};
|
|
46
|
-
if (background !== 'only')
|
|
47
|
-
target.environment = texture;
|
|
48
|
-
if (background)
|
|
49
|
-
target.background = texture;
|
|
50
|
-
applyProps(target, sceneProps);
|
|
51
|
-
return () => {
|
|
52
|
-
if (background !== 'only')
|
|
53
|
-
target.environment = oldenv;
|
|
54
|
-
if (background)
|
|
55
|
-
target.background = oldbg;
|
|
56
|
-
applyProps(target, oldSceneProps);
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
export function injectEnvironment(options = () => ({}), { injector } = {}) {
|
|
60
|
-
return assertInjector(injectEnvironment, injector, () => {
|
|
61
|
-
const adjustedOptions = computed(() => {
|
|
62
|
-
const { preset, extensions, encoding, ...rest } = options();
|
|
63
|
-
let { files, path } = rest;
|
|
64
|
-
if (files == null) {
|
|
65
|
-
files = ['/px.png', '/nx.png', '/py.png', '/ny.png', '/pz.png', '/nz.png'];
|
|
66
|
-
}
|
|
67
|
-
if (path == null) {
|
|
68
|
-
path = '';
|
|
69
|
-
}
|
|
70
|
-
if (preset) {
|
|
71
|
-
if (!(preset in ENVIRONMENT_PRESETS))
|
|
72
|
-
throw new Error('Preset must be one of: ' + Object.keys(ENVIRONMENT_PRESETS).join(', '));
|
|
73
|
-
files = ENVIRONMENT_PRESETS[preset];
|
|
74
|
-
path = CUBEMAP_ROOT;
|
|
75
|
-
}
|
|
76
|
-
return { files, preset, encoding, path, extensions };
|
|
77
|
-
});
|
|
78
|
-
const files = pick(adjustedOptions, 'files');
|
|
79
|
-
const resultOptions = computed(() => {
|
|
80
|
-
const { files } = adjustedOptions();
|
|
81
|
-
const multiFile = Array.isArray(files);
|
|
82
|
-
const isCubeMap = multiFile && files.length === 6;
|
|
83
|
-
const isGainmain = multiFile && files.length === 3 && files.some((file) => file.endsWith('json'));
|
|
84
|
-
const firstEntry = multiFile ? files[0] : files;
|
|
85
|
-
const extension = isCubeMap
|
|
86
|
-
? 'cube'
|
|
87
|
-
: isGainmain
|
|
88
|
-
? 'webp'
|
|
89
|
-
: firstEntry.startsWith('data:application/exr')
|
|
90
|
-
? 'exr'
|
|
91
|
-
: firstEntry.startsWith('data:application/hdr')
|
|
92
|
-
? 'hdr'
|
|
93
|
-
: firstEntry.startsWith('data:image/jpeg')
|
|
94
|
-
? 'jpg'
|
|
95
|
-
: firstEntry.split('.').pop()?.split('?')?.shift()?.toLowerCase();
|
|
96
|
-
return { multiFile, extension, isCubeMap };
|
|
97
|
-
});
|
|
98
|
-
const loader = computed(() => {
|
|
99
|
-
const { extension } = resultOptions();
|
|
100
|
-
const loader = extension === 'cube'
|
|
101
|
-
? CubeTextureLoader
|
|
102
|
-
: extension === 'hdr'
|
|
103
|
-
? RGBELoader
|
|
104
|
-
: extension === 'exr'
|
|
105
|
-
? EXRLoader
|
|
106
|
-
: extension === 'jpg' || extension === 'jpeg'
|
|
107
|
-
? HDRJPGLoader
|
|
108
|
-
: extension === 'webp'
|
|
109
|
-
? GainMapLoader
|
|
110
|
-
: null;
|
|
111
|
-
if (!loader) {
|
|
112
|
-
throw new Error('injectEnvironment: Unrecognized file extension: ' + extension);
|
|
113
|
-
}
|
|
114
|
-
return loader;
|
|
115
|
-
});
|
|
116
|
-
const store = injectStore();
|
|
117
|
-
const gl = store.select('gl');
|
|
118
|
-
const texture = signal(null);
|
|
119
|
-
effect(() => {
|
|
120
|
-
const [{ extension, multiFile }, _files] = [untracked(resultOptions), files()];
|
|
121
|
-
if (extension !== 'webp' && extension !== 'jpg' && extension !== 'jpeg')
|
|
122
|
-
return;
|
|
123
|
-
gl().domElement.addEventListener('webglcontextlost', () => {
|
|
124
|
-
// @ts-expect-error - files is correctly passed
|
|
125
|
-
injectLoader.clear(multiFile ? [_files] : _files);
|
|
126
|
-
}, { once: true });
|
|
127
|
-
});
|
|
128
|
-
const result = injectLoader(loader,
|
|
129
|
-
// @ts-expect-error - ensure the files is an array
|
|
130
|
-
() => {
|
|
131
|
-
const { files } = adjustedOptions();
|
|
132
|
-
return Array.isArray(files) ? [files] : files;
|
|
133
|
-
}, {
|
|
134
|
-
extensions: (loader) => {
|
|
135
|
-
const { extensions, path } = adjustedOptions();
|
|
136
|
-
const { extension } = resultOptions();
|
|
137
|
-
if (extension === 'webp' || extension === 'jpg' || extension === 'jpeg') {
|
|
138
|
-
// @ts-expect-error - Gainmap requires a renderer
|
|
139
|
-
loader.setRenderer(gl());
|
|
140
|
-
}
|
|
141
|
-
loader.setPath?.(path);
|
|
142
|
-
if (extensions)
|
|
143
|
-
extensions(loader);
|
|
144
|
-
},
|
|
145
|
-
});
|
|
146
|
-
effect(() => {
|
|
147
|
-
const loaderResult = result();
|
|
148
|
-
if (!loaderResult)
|
|
149
|
-
return;
|
|
150
|
-
untracked(() => {
|
|
151
|
-
const { multiFile, extension, isCubeMap } = resultOptions();
|
|
152
|
-
const { encoding } = adjustedOptions();
|
|
153
|
-
// @ts-expect-error - ensure textureResult is a Texture or CubeTexture
|
|
154
|
-
let textureResult = (multiFile ? loaderResult[0] : loaderResult);
|
|
155
|
-
// NOTE: racing condition, we can skip this
|
|
156
|
-
// we just said above that if multiFile is false, it is a single Texture
|
|
157
|
-
if (!multiFile && Array.isArray(textureResult) && textureResult[0] instanceof CubeTexture) {
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
if (!(textureResult instanceof CubeTexture) &&
|
|
161
|
-
(extension === 'jpg' || extension === 'jpeg' || extension === 'webp')) {
|
|
162
|
-
textureResult = textureResult.renderTarget?.texture;
|
|
163
|
-
}
|
|
164
|
-
textureResult.mapping = isCubeMap ? CubeReflectionMapping : EquirectangularReflectionMapping;
|
|
165
|
-
if ('colorSpace' in textureResult)
|
|
166
|
-
textureResult.colorSpace = encoding ?? (isCubeMap ? 'srgb' : 'srgb-linear');
|
|
167
|
-
else
|
|
168
|
-
textureResult.encoding = encoding ?? (isCubeMap ? sRGBEncoding : LinearEncoding);
|
|
169
|
-
texture.set(textureResult);
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
return texture.asReadonly();
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
const defaultBackground = {
|
|
176
|
-
background: false,
|
|
177
|
-
};
|
|
178
|
-
export class NgtsEnvironmentMap {
|
|
179
|
-
constructor() {
|
|
180
|
-
this.options = input(defaultBackground, { transform: mergeInputs(defaultBackground) });
|
|
181
|
-
this.envSet = output();
|
|
182
|
-
this.autoEffect = injectAutoEffect();
|
|
183
|
-
this.store = injectStore();
|
|
184
|
-
this.defaultScene = this.store.select('scene');
|
|
185
|
-
this.envConfig = computed(() => {
|
|
186
|
-
const { background = false, scene, blur, backgroundBlurriness, backgroundIntensity, backgroundRotation, environmentIntensity, environmentRotation, } = this.options();
|
|
187
|
-
return {
|
|
188
|
-
background,
|
|
189
|
-
scene,
|
|
190
|
-
blur,
|
|
191
|
-
backgroundBlurriness,
|
|
192
|
-
backgroundIntensity,
|
|
193
|
-
backgroundRotation,
|
|
194
|
-
environmentIntensity,
|
|
195
|
-
environmentRotation,
|
|
196
|
-
};
|
|
197
|
-
});
|
|
198
|
-
this.map = pick(this.options, 'map');
|
|
199
|
-
afterNextRender(() => {
|
|
200
|
-
this.autoEffect(() => {
|
|
201
|
-
const map = this.map();
|
|
202
|
-
if (!map)
|
|
203
|
-
return;
|
|
204
|
-
const { background = false, scene, ...config } = this.envConfig();
|
|
205
|
-
const cleanup = setEnvProps(background, scene, this.defaultScene(), map, config);
|
|
206
|
-
this.envSet.emit();
|
|
207
|
-
return () => cleanup();
|
|
208
|
-
});
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsEnvironmentMap, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
212
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.0", type: NgtsEnvironmentMap, isStandalone: true, selector: "ngts-environment-map", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { envSet: "envSet" }, ngImport: i0 }); }
|
|
213
|
-
}
|
|
214
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsEnvironmentMap, decorators: [{
|
|
215
|
-
type: Directive,
|
|
216
|
-
args: [{ standalone: true, selector: 'ngts-environment-map' }]
|
|
217
|
-
}], ctorParameters: () => [] });
|
|
218
|
-
export class NgtsEnvironmentCube {
|
|
219
|
-
constructor() {
|
|
220
|
-
this.options = input(defaultBackground, { transform: mergeInputs(defaultBackground) });
|
|
221
|
-
this.envSet = output();
|
|
222
|
-
this.autoEffect = injectAutoEffect();
|
|
223
|
-
this.store = injectStore();
|
|
224
|
-
this.defaultScene = this.store.select('scene');
|
|
225
|
-
this.injector = inject(Injector);
|
|
226
|
-
this.envConfig = computed(() => {
|
|
227
|
-
const { background = false, scene, blur, backgroundBlurriness, backgroundIntensity, backgroundRotation, environmentIntensity, environmentRotation, } = this.options();
|
|
228
|
-
return {
|
|
229
|
-
background,
|
|
230
|
-
scene,
|
|
231
|
-
blur,
|
|
232
|
-
backgroundBlurriness,
|
|
233
|
-
backgroundIntensity,
|
|
234
|
-
backgroundRotation,
|
|
235
|
-
environmentIntensity,
|
|
236
|
-
environmentRotation,
|
|
237
|
-
};
|
|
238
|
-
});
|
|
239
|
-
afterNextRender(() => {
|
|
240
|
-
const _texture = injectEnvironment(this.options, { injector: this.injector });
|
|
241
|
-
this.autoEffect(() => {
|
|
242
|
-
const texture = _texture();
|
|
243
|
-
if (!texture)
|
|
244
|
-
return;
|
|
245
|
-
const { background = false, scene, ...config } = this.envConfig();
|
|
246
|
-
const cleanup = setEnvProps(background, scene, this.defaultScene(), texture, config);
|
|
247
|
-
this.envSet.emit();
|
|
248
|
-
return () => cleanup();
|
|
249
|
-
});
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsEnvironmentCube, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
253
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.0", type: NgtsEnvironmentCube, isStandalone: true, selector: "ngts-environment-cube", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { envSet: "envSet" }, ngImport: i0 }); }
|
|
254
|
-
}
|
|
255
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsEnvironmentCube, decorators: [{
|
|
256
|
-
type: Directive,
|
|
257
|
-
args: [{ standalone: true, selector: 'ngts-environment-cube' }]
|
|
258
|
-
}], ctorParameters: () => [] });
|
|
259
|
-
export class NgtsEnvironmentPortal {
|
|
260
|
-
constructor() {
|
|
261
|
-
this.defaultOptions = {
|
|
262
|
-
near: 1,
|
|
263
|
-
far: 1000,
|
|
264
|
-
resolution: 256,
|
|
265
|
-
frames: 1,
|
|
266
|
-
background: false,
|
|
267
|
-
};
|
|
268
|
-
this.options = input(this.defaultOptions, { transform: mergeInputs(this.defaultOptions) });
|
|
269
|
-
this.content = input.required();
|
|
270
|
-
this.envSet = output();
|
|
271
|
-
this.autoEffect = injectAutoEffect();
|
|
272
|
-
this.store = injectStore();
|
|
273
|
-
this.defaultScene = this.store.select('scene');
|
|
274
|
-
this.gl = this.store.select('gl');
|
|
275
|
-
this.cameraRef = viewChild('cubeCamera');
|
|
276
|
-
this.map = pick(this.options, 'map');
|
|
277
|
-
this.files = pick(this.options, 'files');
|
|
278
|
-
this.preset = pick(this.options, 'preset');
|
|
279
|
-
this.extensions = pick(this.options, 'extensions');
|
|
280
|
-
this.path = pick(this.options, 'path');
|
|
281
|
-
this.envMapOptions = computed(() => ({ background: true, map: this.map(), extensions: this.extensions() }));
|
|
282
|
-
this.envCubeOptions = computed(() => ({
|
|
283
|
-
background: true,
|
|
284
|
-
files: this.files(),
|
|
285
|
-
preset: this.preset(),
|
|
286
|
-
extensions: this.extensions(),
|
|
287
|
-
path: this.path(),
|
|
288
|
-
}));
|
|
289
|
-
this.near = pick(this.options, 'near');
|
|
290
|
-
this.far = pick(this.options, 'far');
|
|
291
|
-
this.resolution = pick(this.options, 'resolution');
|
|
292
|
-
this.fbo = computed(() => {
|
|
293
|
-
const fbo = new WebGLCubeRenderTarget(this.resolution());
|
|
294
|
-
fbo.texture.type = HalfFloatType;
|
|
295
|
-
return fbo;
|
|
296
|
-
});
|
|
297
|
-
this.cameraArgs = computed(() => [this.near(), this.far(), this.fbo()]);
|
|
298
|
-
this.virtualScene = prepare(new Scene());
|
|
299
|
-
extend({ CubeCamera });
|
|
300
|
-
afterNextRender(() => {
|
|
301
|
-
this.autoEffect(() => {
|
|
302
|
-
const [files, preset, map] = [this.files(), this.preset(), this.map()];
|
|
303
|
-
// NOTE: when there's none of this, we don't render cube or map so we need to setEnv here
|
|
304
|
-
if (!!files || !!preset || !!map)
|
|
305
|
-
return;
|
|
306
|
-
return this.setPortalEnv();
|
|
307
|
-
});
|
|
308
|
-
});
|
|
309
|
-
let count = 1;
|
|
310
|
-
injectBeforeRender(() => {
|
|
311
|
-
const frames = this.options().frames;
|
|
312
|
-
if (frames === Infinity || (frames != null && count < frames)) {
|
|
313
|
-
const camera = this.cameraRef()?.nativeElement;
|
|
314
|
-
if (camera) {
|
|
315
|
-
camera.update(this.gl(), this.virtualScene);
|
|
316
|
-
count++;
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
});
|
|
320
|
-
}
|
|
321
|
-
// NOTE: we use onEnvSet here to ensure that EnvironmentCube or EnvironmentMap sets the env before the portal
|
|
322
|
-
onEnvSet() {
|
|
323
|
-
if (this.setEnvEffectRef)
|
|
324
|
-
this.setEnvEffectRef.destroy();
|
|
325
|
-
this.setEnvEffectRef = this.autoEffect(() => {
|
|
326
|
-
return this.setPortalEnv();
|
|
327
|
-
}, { manualCleanup: true });
|
|
328
|
-
}
|
|
329
|
-
setPortalEnv() {
|
|
330
|
-
const camera = this.cameraRef();
|
|
331
|
-
if (!camera?.nativeElement)
|
|
332
|
-
return;
|
|
333
|
-
const [{ frames, background = false, scene, blur, backgroundBlurriness, backgroundIntensity, backgroundRotation, environmentIntensity, environmentRotation, }, gl, fbo, defaultScene,] = [this.options(), this.gl(), this.fbo(), this.defaultScene()];
|
|
334
|
-
if (frames === 1)
|
|
335
|
-
camera.nativeElement.update(gl, this.virtualScene);
|
|
336
|
-
const cleanup = setEnvProps(background, scene, defaultScene, fbo.texture, {
|
|
337
|
-
blur,
|
|
338
|
-
backgroundBlurriness,
|
|
339
|
-
backgroundIntensity,
|
|
340
|
-
backgroundRotation,
|
|
341
|
-
environmentIntensity,
|
|
342
|
-
environmentRotation,
|
|
343
|
-
});
|
|
344
|
-
this.envSet.emit();
|
|
345
|
-
return cleanup;
|
|
346
|
-
}
|
|
347
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsEnvironmentPortal, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
348
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: NgtsEnvironmentPortal, isStandalone: true, selector: "ngts-environment-portal", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { envSet: "envSet" }, viewQueries: [{ propertyName: "cameraRef", first: true, predicate: ["cubeCamera"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
349
|
-
<ngt-portal [container]="virtualScene">
|
|
350
|
-
<ng-template portalContent let-injector="injector" let-container="container">
|
|
351
|
-
<ng-container
|
|
352
|
-
[ngTemplateOutlet]="content()"
|
|
353
|
-
[ngTemplateOutletInjector]="injector"
|
|
354
|
-
[ngTemplateOutletContext]="{ injector, container }"
|
|
355
|
-
/>
|
|
356
|
-
|
|
357
|
-
<ngt-cube-camera #cubeCamera *args="cameraArgs()" />
|
|
358
|
-
|
|
359
|
-
@if (files() || preset()) {
|
|
360
|
-
<ngts-environment-cube [options]="envCubeOptions()" (envSet)="onEnvSet()" />
|
|
361
|
-
} @else if (map()) {
|
|
362
|
-
<ngts-environment-map [options]="envMapOptions()" (envSet)="onEnvSet()" />
|
|
363
|
-
}
|
|
364
|
-
</ng-template>
|
|
365
|
-
</ngt-portal>
|
|
366
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgtsEnvironmentCube, selector: "ngts-environment-cube", inputs: ["options"], outputs: ["envSet"] }, { kind: "directive", type: NgtsEnvironmentMap, selector: "ngts-environment-map", inputs: ["options"], outputs: ["envSet"] }, { kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtPortal, selector: "ngt-portal", inputs: ["container", "state", "autoRender", "autoRenderPriority"] }, { kind: "directive", type: NgtPortalContent, selector: "ng-template[portalContent]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
367
|
-
}
|
|
368
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsEnvironmentPortal, decorators: [{
|
|
369
|
-
type: Component,
|
|
370
|
-
args: [{
|
|
371
|
-
selector: 'ngts-environment-portal',
|
|
372
|
-
standalone: true,
|
|
373
|
-
template: `
|
|
374
|
-
<ngt-portal [container]="virtualScene">
|
|
375
|
-
<ng-template portalContent let-injector="injector" let-container="container">
|
|
376
|
-
<ng-container
|
|
377
|
-
[ngTemplateOutlet]="content()"
|
|
378
|
-
[ngTemplateOutletInjector]="injector"
|
|
379
|
-
[ngTemplateOutletContext]="{ injector, container }"
|
|
380
|
-
/>
|
|
381
|
-
|
|
382
|
-
<ngt-cube-camera #cubeCamera *args="cameraArgs()" />
|
|
383
|
-
|
|
384
|
-
@if (files() || preset()) {
|
|
385
|
-
<ngts-environment-cube [options]="envCubeOptions()" (envSet)="onEnvSet()" />
|
|
386
|
-
} @else if (map()) {
|
|
387
|
-
<ngts-environment-map [options]="envMapOptions()" (envSet)="onEnvSet()" />
|
|
388
|
-
}
|
|
389
|
-
</ng-template>
|
|
390
|
-
</ngt-portal>
|
|
391
|
-
`,
|
|
392
|
-
imports: [NgtsEnvironmentCube, NgtsEnvironmentMap, NgtArgs, NgtPortal, NgtPortalContent, NgTemplateOutlet],
|
|
393
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
394
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
395
|
-
}]
|
|
396
|
-
}], ctorParameters: () => [] });
|
|
397
|
-
export class NgtsEnvironmentGround {
|
|
398
|
-
constructor() {
|
|
399
|
-
this.options = input({});
|
|
400
|
-
this.envSet = output();
|
|
401
|
-
this.args = signal([null]);
|
|
402
|
-
this.height = computed(() => this.options().ground?.height);
|
|
403
|
-
this.radius = computed(() => this.options().ground?.radius);
|
|
404
|
-
this.scale = computed(() => this.options().ground?.scale ?? 1000);
|
|
405
|
-
this.envMapOptions = computed(() => {
|
|
406
|
-
const { map: _, ...options } = this.options();
|
|
407
|
-
const [map] = this.args();
|
|
408
|
-
return Object.assign(options, { map });
|
|
409
|
-
});
|
|
410
|
-
extend({ GroundProjectedEnv });
|
|
411
|
-
const injector = inject(Injector);
|
|
412
|
-
const autoEffect = injectAutoEffect();
|
|
413
|
-
afterNextRender(() => {
|
|
414
|
-
const defaultTexture = injectEnvironment(this.options, { injector });
|
|
415
|
-
const texture = computed(() => this.options().map || defaultTexture());
|
|
416
|
-
autoEffect(() => {
|
|
417
|
-
this.args.set([texture()]);
|
|
418
|
-
}, { allowSignalWrites: true });
|
|
419
|
-
});
|
|
420
|
-
}
|
|
421
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsEnvironmentGround, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
422
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.0", type: NgtsEnvironmentGround, isStandalone: true, selector: "ngts-environment-ground", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { envSet: "envSet" }, ngImport: i0, template: `
|
|
423
|
-
<ngts-environment-map [options]="envMapOptions()" (envSet)="envSet.emit()" />
|
|
424
|
-
<ngt-ground-projected-env *args="args()" [scale]="scale()" [height]="height()" [radius]="radius()" />
|
|
425
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgtsEnvironmentMap, selector: "ngts-environment-map", inputs: ["options"], outputs: ["envSet"] }, { kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
426
|
-
}
|
|
427
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsEnvironmentGround, decorators: [{
|
|
428
|
-
type: Component,
|
|
429
|
-
args: [{
|
|
430
|
-
selector: 'ngts-environment-ground',
|
|
431
|
-
standalone: true,
|
|
432
|
-
template: `
|
|
433
|
-
<ngts-environment-map [options]="envMapOptions()" (envSet)="envSet.emit()" />
|
|
434
|
-
<ngt-ground-projected-env *args="args()" [scale]="scale()" [height]="height()" [radius]="radius()" />
|
|
435
|
-
`,
|
|
436
|
-
imports: [NgtsEnvironmentMap, NgtArgs],
|
|
437
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
438
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
439
|
-
}]
|
|
440
|
-
}], ctorParameters: () => [] });
|
|
441
|
-
export class NgtsEnvironment {
|
|
442
|
-
constructor() {
|
|
443
|
-
this.options = input({});
|
|
444
|
-
this.content = contentChild(TemplateRef);
|
|
445
|
-
this.envSet = output();
|
|
446
|
-
}
|
|
447
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsEnvironment, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
448
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: NgtsEnvironment, isStandalone: true, selector: "ngts-environment", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { envSet: "envSet" }, queries: [{ propertyName: "content", first: true, predicate: TemplateRef, descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
449
|
-
@if (options().ground) {
|
|
450
|
-
<ngts-environment-ground [options]="options()" (envSet)="envSet.emit()" />
|
|
451
|
-
} @else if (options().map) {
|
|
452
|
-
<ngts-environment-map [options]="options()" (envSet)="envSet.emit()" />
|
|
453
|
-
} @else if (content()) {
|
|
454
|
-
<ngts-environment-portal [options]="options()" [content]="$any(content())" (envSet)="envSet.emit()" />
|
|
455
|
-
} @else {
|
|
456
|
-
<ngts-environment-cube [options]="options()" (envSet)="envSet.emit()" />
|
|
457
|
-
}
|
|
458
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgtsEnvironmentCube, selector: "ngts-environment-cube", inputs: ["options"], outputs: ["envSet"] }, { kind: "directive", type: NgtsEnvironmentMap, selector: "ngts-environment-map", inputs: ["options"], outputs: ["envSet"] }, { kind: "component", type: NgtsEnvironmentPortal, selector: "ngts-environment-portal", inputs: ["options", "content"], outputs: ["envSet"] }, { kind: "component", type: NgtsEnvironmentGround, selector: "ngts-environment-ground", inputs: ["options"], outputs: ["envSet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
459
|
-
}
|
|
460
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsEnvironment, decorators: [{
|
|
461
|
-
type: Component,
|
|
462
|
-
args: [{
|
|
463
|
-
selector: 'ngts-environment',
|
|
464
|
-
standalone: true,
|
|
465
|
-
template: `
|
|
466
|
-
@if (options().ground) {
|
|
467
|
-
<ngts-environment-ground [options]="options()" (envSet)="envSet.emit()" />
|
|
468
|
-
} @else if (options().map) {
|
|
469
|
-
<ngts-environment-map [options]="options()" (envSet)="envSet.emit()" />
|
|
470
|
-
} @else if (content()) {
|
|
471
|
-
<ngts-environment-portal [options]="options()" [content]="$any(content())" (envSet)="envSet.emit()" />
|
|
472
|
-
} @else {
|
|
473
|
-
<ngts-environment-cube [options]="options()" (envSet)="envSet.emit()" />
|
|
474
|
-
}
|
|
475
|
-
`,
|
|
476
|
-
imports: [NgtsEnvironmentCube, NgtsEnvironmentMap, NgtsEnvironmentPortal, NgtsEnvironmentGround],
|
|
477
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
478
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
479
|
-
}]
|
|
480
|
-
}] });
|
|
481
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvc3RhZ2luZy9zcmMvbGliL2Vudmlyb25tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFDTixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxTQUFTLEVBR1QsUUFBUSxFQUNSLFdBQVcsRUFDWCxlQUFlLEVBQ2YsUUFBUSxFQUNSLFlBQVksRUFDWixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRSxPQUFPLEVBQ04sT0FBTyxFQUNQLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLE1BQU0sRUFDTixrQkFBa0IsRUFDbEIsWUFBWSxFQUNaLFdBQVcsRUFDWCxFQUFFLEVBQ0YsSUFBSSxFQUNKLE9BQU8sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsY0FBYyxFQUFtQixZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFDTixVQUFVLEVBQ1YscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsZ0NBQWdDLEVBRWhDLGFBQWEsRUFFYixLQUFLLEVBRUwscUJBQXFCLEdBQ3JCLE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBRXpFLE1BQU0sWUFBWSxHQUFHLDJGQUEyRixDQUFDO0FBRWpILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2xDLFNBQVMsRUFBRSxnQkFBZ0I7SUFDM0IsSUFBSSxFQUFFLHdCQUF3QjtJQUM5QixJQUFJLEVBQUUscUJBQXFCO0lBQzNCLE1BQU0sRUFBRSxxQkFBcUI7SUFDN0IsS0FBSyxFQUFFLDJCQUEyQjtJQUNsQyxLQUFLLEVBQUUsd0JBQXdCO0lBQy9CLElBQUksRUFBRSxxQkFBcUI7SUFDM0IsTUFBTSxFQUFFLHdCQUF3QjtJQUNoQyxNQUFNLEVBQUUsc0JBQXNCO0lBQzlCLFNBQVMsRUFBRSwyQkFBMkI7Q0FDdEMsQ0FBQztBQUlGLFNBQVMsWUFBWSxDQUFDLEtBQWdDO0lBQ3JELE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3BELENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FDbkIsVUFBNEIsRUFDNUIsS0FBNEMsRUFDNUMsWUFBbUIsRUFDbkIsT0FBZ0IsRUFDaEIsYUFBOEMsRUFBRTtJQUVoRCxVQUFVLENBQUMsb0JBQW9CLEtBQUssVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7SUFDekQsVUFBVSxDQUFDLG1CQUFtQixLQUFLLENBQUMsQ0FBQztJQUNyQywrREFBK0Q7SUFDL0QsVUFBVSxDQUFDLGtCQUFrQixLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1QyxVQUFVLENBQUMsb0JBQW9CLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLCtEQUErRDtJQUMvRCxVQUFVLENBQUMsbUJBQW1CLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTdDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLElBQUksWUFBWSxDQUFDLENBQUM7SUFDbkQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUNoQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQ2xDLE1BQU0sYUFBYSxHQUFHO1FBQ3JCLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxvQkFBb0I7UUFDakQsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLG1CQUFtQjtRQUMvQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxvQkFBb0I7UUFDakQsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUN2RSxDQUFDO0lBRUYsSUFBSSxVQUFVLEtBQUssTUFBTTtRQUFFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO0lBQ3hELElBQUksVUFBVTtRQUFFLE1BQU0sQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDO0lBQzVDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFL0IsT0FBTyxHQUFHLEVBQUU7UUFDWCxJQUFJLFVBQVUsS0FBSyxNQUFNO1lBQUUsTUFBTSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7UUFDdkQsSUFBSSxVQUFVO1lBQUUsTUFBTSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDMUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUM7QUFDSCxDQUFDO0FBVUQsTUFBTSxVQUFVLGlCQUFpQixDQUNoQyxVQUF1RCxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUNqRSxFQUFFLFFBQVEsS0FBOEIsRUFBRTtJQUUxQyxPQUFPLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO1FBQ3ZELE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDckMsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7WUFDNUQsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFFM0IsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ25CLEtBQUssR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDNUUsQ0FBQztZQUVELElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNsQixJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ1gsQ0FBQztZQUVELElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1osSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLG1CQUFtQixDQUFDO29CQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDMUYsS0FBSyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLEdBQUcsWUFBWSxDQUFDO1lBQ3JCLENBQUM7WUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUU3QyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ25DLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxlQUFlLEVBQUUsQ0FBQztZQUNwQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXZDLE1BQU0sU0FBUyxHQUFHLFNBQVMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUNsRCxNQUFNLFVBQVUsR0FBRyxTQUFTLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2xHLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFFaEQsTUFBTSxTQUFTLEdBQUcsU0FBUztnQkFDMUIsQ0FBQyxDQUFDLE1BQU07Z0JBQ1IsQ0FBQyxDQUFDLFVBQVU7b0JBQ1gsQ0FBQyxDQUFDLE1BQU07b0JBQ1IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUM7d0JBQzlDLENBQUMsQ0FBQyxLQUFLO3dCQUNQLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDOzRCQUM5QyxDQUFDLENBQUMsS0FBSzs0QkFDUCxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQztnQ0FDekMsQ0FBQyxDQUFDLEtBQUs7Z0NBQ1AsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBRXZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUM1QixNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsYUFBYSxFQUFFLENBQUM7WUFDdEMsTUFBTSxNQUFNLEdBQ1gsU0FBUyxLQUFLLE1BQU07Z0JBQ25CLENBQUMsQ0FBQyxpQkFBaUI7Z0JBQ25CLENBQUMsQ0FBQyxTQUFTLEtBQUssS0FBSztvQkFDcEIsQ0FBQyxDQUFDLFVBQVU7b0JBQ1osQ0FBQyxDQUFDLFNBQVMsS0FBSyxLQUFLO3dCQUNwQixDQUFDLENBQUMsU0FBUzt3QkFDWCxDQUFDLENBQUMsU0FBUyxLQUFLLEtBQUssSUFBSSxTQUFTLEtBQUssTUFBTTs0QkFDNUMsQ0FBQyxDQUFFLFlBQXlDOzRCQUM1QyxDQUFDLENBQUMsU0FBUyxLQUFLLE1BQU07Z0NBQ3JCLENBQUMsQ0FBRSxhQUEwQztnQ0FDN0MsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUViLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDYixNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQ2pGLENBQUM7WUFFRCxPQUFPLE1BQXVCLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLEtBQUssR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUM1QixNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTlCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBK0IsSUFBSSxDQUFDLENBQUM7UUFFM0QsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNYLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBRS9FLElBQUksU0FBUyxLQUFLLE1BQU0sSUFBSSxTQUFTLEtBQUssS0FBSyxJQUFJLFNBQVMsS0FBSyxNQUFNO2dCQUFFLE9BQU87WUFFaEYsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUMvQixrQkFBa0IsRUFDbEIsR0FBRyxFQUFFO2dCQUNKLCtDQUErQztnQkFDL0MsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25ELENBQUMsRUFDRCxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FDZCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQzFCLE1BQU07UUFDTixrREFBa0Q7UUFDbEQsR0FBRyxFQUFFO1lBQ0osTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLGVBQWUsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQy9DLENBQUMsRUFDRDtZQUNDLFVBQVUsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUN0QixNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLGVBQWUsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsYUFBYSxFQUFFLENBQUM7Z0JBQ3RDLElBQUksU0FBUyxLQUFLLE1BQU0sSUFBSSxTQUFTLEtBQUssS0FBSyxJQUFJLFNBQVMsS0FBSyxNQUFNLEVBQUUsQ0FBQztvQkFDekUsaURBQWlEO29CQUNqRCxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzFCLENBQUM7Z0JBRUQsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN2QixJQUFJLFVBQVU7b0JBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BDLENBQUM7U0FDRCxDQUNELENBQUM7UUFFRixNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1gsTUFBTSxZQUFZLEdBQUcsTUFBTSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLFlBQVk7Z0JBQUUsT0FBTztZQUUxQixTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNkLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDO2dCQUM1RCxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUM7Z0JBRXZDLHNFQUFzRTtnQkFDdEUsSUFBSSxhQUFhLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUEwQixDQUFDO2dCQUUxRiwyQ0FBMkM7Z0JBQzNDLHlFQUF5RTtnQkFDekUsSUFBSSxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsWUFBWSxXQUFXLEVBQUUsQ0FBQztvQkFDM0YsT0FBTztnQkFDUixDQUFDO2dCQUVELElBQ0MsQ0FBQyxDQUFDLGFBQWEsWUFBWSxXQUFXLENBQUM7b0JBQ3ZDLENBQUMsU0FBUyxLQUFLLEtBQUssSUFBSSxTQUFTLEtBQUssTUFBTSxJQUFJLFNBQVMsS0FBSyxNQUFNLENBQUMsRUFDcEUsQ0FBQztvQkFDRixhQUFhLEdBQUksYUFBcUIsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDO2dCQUM5RCxDQUFDO2dCQUVELGFBQWEsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsZ0NBQWdDLENBQUM7Z0JBRTdGLElBQUksWUFBWSxJQUFJLGFBQWE7b0JBQy9CLGFBQXFCLENBQUMsVUFBVSxHQUFHLFFBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQzs7b0JBQ2hGLGFBQXFCLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFFL0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM1QixDQUFDLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDN0IsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBdUJELE1BQU0saUJBQWlCLEdBQTJCO0lBQ2pELFVBQVUsRUFBRSxLQUFLO0NBQ2pCLENBQUM7QUFHRixNQUFNLE9BQU8sa0JBQWtCO0lBa0M5QjtRQWpDQSxZQUFPLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsRixXQUFNLEdBQUcsTUFBTSxFQUFRLENBQUM7UUFFaEIsZUFBVSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDaEMsVUFBSyxHQUFHLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLGlCQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFMUMsY0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDakMsTUFBTSxFQUNMLFVBQVUsR0FBRyxLQUFLLEVBQ2xCLEtBQUssRUFDTCxJQUFJLEVBQ0osb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLG1CQUFtQixHQUNuQixHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUVuQixPQUFPO2dCQUNOLFVBQVU7Z0JBQ1YsS0FBSztnQkFDTCxJQUFJO2dCQUNKLG9CQUFvQjtnQkFDcEIsbUJBQW1CO2dCQUNuQixrQkFBa0I7Z0JBQ2xCLG9CQUFvQjtnQkFDcEIsbUJBQW1CO2FBQ25CLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVLLFFBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUd2QyxlQUFlLENBQUMsR0FBRyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNwQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxHQUFHO29CQUFFLE9BQU87Z0JBQ2pCLE1BQU0sRUFBRSxVQUFVLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbEUsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDakYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QixDQUFDLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs4R0E3Q1csa0JBQWtCO2tHQUFsQixrQkFBa0I7OzJGQUFsQixrQkFBa0I7a0JBRDlCLFNBQVM7bUJBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxzQkFBc0IsRUFBRTs7QUFrRGpFLE1BQU0sT0FBTyxtQkFBbUI7SUFpQy9CO1FBaENBLFlBQU8sR0FBRyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLFdBQU0sR0FBRyxNQUFNLEVBQVEsQ0FBQztRQUVoQixlQUFVLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUNoQyxVQUFLLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFDdEIsaUJBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxhQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTVCLGNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ2pDLE1BQU0sRUFDTCxVQUFVLEdBQUcsS0FBSyxFQUNsQixLQUFLLEVBQ0wsSUFBSSxFQUNKLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixtQkFBbUIsR0FDbkIsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFbkIsT0FBTztnQkFDTixVQUFVO2dCQUNWLEtBQUs7Z0JBQ0wsSUFBSTtnQkFDSixvQkFBb0I7Z0JBQ3BCLG1CQUFtQjtnQkFDbkIsa0JBQWtCO2dCQUNsQixvQkFBb0I7Z0JBQ3BCLG1CQUFtQjthQUNuQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFHRixlQUFlLENBQUMsR0FBRyxFQUFFO1lBQ3BCLE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFFOUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3BCLE1BQU0sT0FBTyxHQUFHLFFBQVEsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsT0FBTztvQkFBRSxPQUFPO2dCQUNyQixNQUFNLEVBQUUsVUFBVSxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2xFLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3JGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7OEdBOUNXLG1CQUFtQjtrR0FBbkIsbUJBQW1COzsyRkFBbkIsbUJBQW1CO2tCQUQvQixTQUFTO21CQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsdUJBQXVCLEVBQUU7O0FBNEVsRSxNQUFNLE9BQU8scUJBQXFCO0lBaURqQztRQWhEUSxtQkFBYyxHQUEyQjtZQUNoRCxJQUFJLEVBQUUsQ0FBQztZQUNQLEdBQUcsRUFBRSxJQUFJO1lBQ1QsVUFBVSxFQUFFLEdBQUc7WUFDZixNQUFNLEVBQUUsQ0FBQztZQUNULFVBQVUsRUFBRSxLQUFLO1NBQ2pCLENBQUM7UUFDRixZQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEYsWUFBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQXdCLENBQUM7UUFDakQsV0FBTSxHQUFHLE1BQU0sRUFBUSxDQUFDO1FBRWhCLGVBQVUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2hDLFVBQUssR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUN0QixpQkFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLE9BQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyQyxjQUFTLEdBQUcsU0FBUyxDQUF5QixZQUFZLENBQUMsQ0FBQztRQUU1RCxRQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEMsVUFBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLFdBQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5QixlQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDOUMsU0FBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTFDLGtCQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RyxtQkFBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ25CLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3JCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQzdCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFO1NBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBRUksU0FBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLFFBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoQyxlQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDOUMsUUFBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDM0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUN6RCxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7WUFDakMsT0FBTyxHQUFHLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQztRQUVILGVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbkUsaUJBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBS25DLE1BQU0sQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFdkIsZUFBZSxDQUFDLEdBQUcsRUFBRTtZQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDcEIsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RSx5RkFBeUY7Z0JBQ3pGLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHO29CQUFFLE9BQU87Z0JBQ3pDLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxrQkFBa0IsQ0FBQyxHQUFHLEVBQUU7WUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNyQyxJQUFJLE1BQU0sS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUMvRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsYUFBYSxDQUFDO2dCQUMvQyxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUNaLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDNUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1QsQ0FBQztZQUNGLENBQUM7UUFDRixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCw2R0FBNkc7SUFDN0csUUFBUTtRQUNQLElBQUksSUFBSSxDQUFDLGVBQWU7WUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FDckMsR0FBRyxFQUFFO1lBQ0osT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDNUIsQ0FBQyxFQUNELEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVPLFlBQVk7UUFDbkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYTtZQUFFLE9BQU87UUFFbkMsTUFBTSxDQUNMLEVBQ0MsTUFBTSxFQUNOLFVBQVUsR0FBRyxLQUFLLEVBQ2xCLEtBQUssRUFDTCxJQUFJLEVBQ0osb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLG1CQUFtQixHQUNuQixFQUNELEVBQUUsRUFDRixHQUFHLEVBQ0gsWUFBWSxFQUNaLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUVqRSxJQUFJLE1BQU0sS0FBSyxDQUFDO1lBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyRSxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRTtZQUN6RSxJQUFJO1lBQ0osb0JBQW9CO1lBQ3BCLG1CQUFtQjtZQUNuQixrQkFBa0I7WUFDbEIsb0JBQW9CO1lBQ3BCLG1CQUFtQjtTQUNuQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25CLE9BQU8sT0FBTyxDQUFDO0lBQ2hCLENBQUM7OEdBckhXLHFCQUFxQjtrR0FBckIscUJBQXFCLGtmQXZCdkI7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWtCVCw0REF0RVcsbUJBQW1CLDRHQWpEbkIsa0JBQWtCLDJHQXdIcUIsT0FBTyxnRkFBRSxTQUFTLDJIQUFFLGdCQUFnQix1RUFBRSxnQkFBZ0I7OzJGQUk3RixxQkFBcUI7a0JBMUJqQyxTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSx5QkFBeUI7b0JBQ25DLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWtCVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDO29CQUMxRyxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDakMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQy9DOztBQW9JRCxNQUFNLE9BQU8scUJBQXFCO0lBZ0JqQztRQWZBLFlBQU8sR0FBRyxLQUFLLENBQUMsRUFBNEIsQ0FBQyxDQUFDO1FBQzlDLFdBQU0sR0FBRyxNQUFNLEVBQVEsQ0FBQztRQUV4QixTQUFJLEdBQUcsTUFBTSxDQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFeEMsV0FBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2hFLFdBQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRSxVQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFjLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBRXRFLGtCQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUM3QixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5QyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzFCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBMkIsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQztRQUdGLE1BQU0sQ0FBQyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUUvQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEMsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUV0QyxlQUFlLENBQUMsR0FBRyxFQUFFO1lBQ3BCLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFFdkUsVUFBVSxDQUNULEdBQUcsRUFBRTtnQkFDSixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM1QixDQUFDLEVBQ0QsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FDM0IsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs4R0FqQ1cscUJBQXFCO2tHQUFyQixxQkFBcUIsNFBBUnZCOzs7RUFHVCw0REExUFcsa0JBQWtCLDJHQTJQQSxPQUFPOzsyRkFJekIscUJBQXFCO2tCQVhqQyxTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSx5QkFBeUI7b0JBQ25DLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7OztFQUdUO29CQUNELE9BQU8sRUFBRSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sQ0FBQztvQkFDdEMsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUMvQzs7QUF1REQsTUFBTSxPQUFPLGVBQWU7SUFsQjVCO1FBbUJDLFlBQU8sR0FBRyxLQUFLLENBQUMsRUFBNEIsQ0FBQyxDQUFDO1FBQzlDLFlBQU8sR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEMsV0FBTSxHQUFHLE1BQU0sRUFBUSxDQUFDO0tBQ3hCOzhHQUpZLGVBQWU7a0dBQWYsZUFBZSwwUkFFSixXQUFXLGdFQWpCeEI7Ozs7Ozs7Ozs7RUFVVCw0REEvUFcsbUJBQW1CLDRHQWpEbkIsa0JBQWtCLDJHQTRIbEIscUJBQXFCLHlIQW1JckIscUJBQXFCOzsyRkFzRHJCLGVBQWU7a0JBbEIzQixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7RUFVVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsQ0FBQztvQkFDaEcsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUMvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0RGlyZWN0aXZlLFxuXHRFZmZlY3RSZWYsXG5cdEVsZW1lbnRSZWYsXG5cdEluamVjdG9yLFxuXHRUZW1wbGF0ZVJlZixcblx0YWZ0ZXJOZXh0UmVuZGVyLFxuXHRjb21wdXRlZCxcblx0Y29udGVudENoaWxkLFxuXHRlZmZlY3QsXG5cdGluamVjdCxcblx0aW5wdXQsXG5cdG91dHB1dCxcblx0c2lnbmFsLFxuXHR1bnRyYWNrZWQsXG5cdHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHYWluTWFwTG9hZGVyLCBIRFJKUEdMb2FkZXIgfSBmcm9tICdAbW9ub2dyaWQvZ2Fpbm1hcC1qcyc7XG5pbXBvcnQge1xuXHROZ3RBcmdzLFxuXHROZ3RQb3J0YWwsXG5cdE5ndFBvcnRhbENvbnRlbnQsXG5cdGFwcGx5UHJvcHMsXG5cdGV4dGVuZCxcblx0aW5qZWN0QmVmb3JlUmVuZGVyLFxuXHRpbmplY3RMb2FkZXIsXG5cdGluamVjdFN0b3JlLFxuXHRpcyxcblx0cGljayxcblx0cHJlcGFyZSxcbn0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBMaW5lYXJFbmNvZGluZywgVGV4dHVyZUVuY29kaW5nLCBzUkdCRW5jb2RpbmcgfSBmcm9tICdhbmd1bGFyLXRocmVlLXNvYmEvbWlzYyc7XG5pbXBvcnQgeyBhc3NlcnRJbmplY3RvciB9IGZyb20gJ25neHRlbnNpb24vYXNzZXJ0LWluamVjdG9yJztcbmltcG9ydCB7IGluamVjdEF1dG9FZmZlY3QgfSBmcm9tICduZ3h0ZW5zaW9uL2F1dG8tZWZmZWN0JztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7XG5cdEN1YmVDYW1lcmEsXG5cdEN1YmVSZWZsZWN0aW9uTWFwcGluZyxcblx0Q3ViZVRleHR1cmUsXG5cdEN1YmVUZXh0dXJlTG9hZGVyLFxuXHRFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyxcblx0RXVsZXIsXG5cdEhhbGZGbG9hdFR5cGUsXG5cdExvYWRlcixcblx0U2NlbmUsXG5cdFRleHR1cmUsXG5cdFdlYkdMQ3ViZVJlbmRlclRhcmdldCxcbn0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgRVhSTG9hZGVyLCBHcm91bmRQcm9qZWN0ZWRFbnYsIFJHQkVMb2FkZXIgfSBmcm9tICd0aHJlZS1zdGRsaWInO1xuXG5jb25zdCBDVUJFTUFQX1JPT1QgPSAnaHR0cHM6Ly9yYXcuZ2l0aGFjay5jb20vcG1uZHJzL2RyZWktYXNzZXRzLzQ1NjA2MGEyNmJiZWI4ZmRmNzkzMjZmMjI0YjZkOTliOGJjY2U3MzYvaGRyaS8nO1xuXG5leHBvcnQgY29uc3QgRU5WSVJPTk1FTlRfUFJFU0VUUyA9IHtcblx0YXBhcnRtZW50OiAnbGVib21ib18xay5oZHInLFxuXHRjaXR5OiAncG90c2RhbWVyX3BsYXR6XzFrLmhkcicsXG5cdGRhd246ICdraWFyYV8xX2Rhd25fMWsuaGRyJyxcblx0Zm9yZXN0OiAnZm9yZXN0X3Nsb3BlXzFrLmhkcicsXG5cdGxvYmJ5OiAnc3RfZmFnYW5zX2ludGVyaW9yXzFrLmhkcicsXG5cdG5pZ2h0OiAnZGlraG9sb2xvX25pZ2h0XzFrLmhkcicsXG5cdHBhcms6ICdyb29pdG91X3BhcmtfMWsuaGRyJyxcblx0c3R1ZGlvOiAnc3R1ZGlvX3NtYWxsXzAzXzFrLmhkcicsXG5cdHN1bnNldDogJ3ZlbmljZV9zdW5zZXRfMWsuaGRyJyxcblx0d2FyZWhvdXNlOiAnZW1wdHlfd2FyZWhvdXNlXzAxXzFrLmhkcicsXG59O1xuXG5leHBvcnQgdHlwZSBOZ3RzRW52aXJvbm1lbnRQcmVzZXRzID0ga2V5b2YgdHlwZW9mIEVOVklST05NRU5UX1BSRVNFVFM7XG5cbmZ1bmN0aW9uIHJlc29sdmVTY2VuZShzY2VuZTogU2NlbmUgfCBFbGVtZW50UmVmPFNjZW5lPikge1xuXHRyZXR1cm4gaXMucmVmKHNjZW5lKSA/IHNjZW5lLm5hdGl2ZUVsZW1lbnQgOiBzY2VuZTtcbn1cblxuZnVuY3Rpb24gc2V0RW52UHJvcHMoXG5cdGJhY2tncm91bmQ6IGJvb2xlYW4gfCAnb25seScsXG5cdHNjZW5lOiBTY2VuZSB8IEVsZW1lbnRSZWY8U2NlbmU+IHwgdW5kZWZpbmVkLFxuXHRkZWZhdWx0U2NlbmU6IFNjZW5lLFxuXHR0ZXh0dXJlOiBUZXh0dXJlLFxuXHRzY2VuZVByb3BzOiBQYXJ0aWFsPE5ndHNFbnZpcm9ubWVudE9wdGlvbnM+ID0ge30sXG4pIHtcblx0c2NlbmVQcm9wcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcyA/Pz0gc2NlbmVQcm9wcy5ibHVyID8/IDA7XG5cdHNjZW5lUHJvcHMuYmFja2dyb3VuZEludGVuc2l0eSA/Pz0gMTtcblx0Ly8gQHRzLWV4cGVjdC1lcnJvciAtIGl0J3Mgb2ssIHdlJ3JlIHNlbmRpbmcgdGhyb3VnaCBhcHBseVByb3BzXG5cdHNjZW5lUHJvcHMuYmFja2dyb3VuZFJvdGF0aW9uID8/PSBbMCwgMCwgMF07XG5cdHNjZW5lUHJvcHMuZW52aXJvbm1lbnRJbnRlbnNpdHkgPz89IDE7XG5cdC8vIEB0cy1leHBlY3QtZXJyb3IgLSBpdCdzIG9rLCB3ZSdyZSBzZW5kaW5nIHRocm91Z2ggYXBwbHlQcm9wc1xuXHRzY2VuZVByb3BzLmVudmlyb25tZW50Um90YXRpb24gPz89IFswLCAwLCAwXTtcblxuXHRjb25zdCB0YXJnZXQgPSByZXNvbHZlU2NlbmUoc2NlbmUgfHwgZGVmYXVsdFNjZW5lKTtcblx0Y29uc3Qgb2xkYmcgPSB0YXJnZXQuYmFja2dyb3VuZDtcblx0Y29uc3Qgb2xkZW52ID0gdGFyZ2V0LmVudmlyb25tZW50O1xuXHRjb25zdCBvbGRTY2VuZVByb3BzID0ge1xuXHRcdGJhY2tncm91bmRCbHVycmluZXNzOiB0YXJnZXQuYmFja2dyb3VuZEJsdXJyaW5lc3MsXG5cdFx0YmFja2dyb3VuZEludGVuc2l0eTogdGFyZ2V0LmJhY2tncm91bmRJbnRlbnNpdHksXG5cdFx0YmFja2dyb3VuZFJvdGF0aW9uOiB0YXJnZXQuYmFja2dyb3VuZFJvdGF0aW9uPy5jbG9uZT8uKCkgPz8gWzAsIDAsIDBdLFxuXHRcdGVudmlyb25tZW50SW50ZW5zaXR5OiB0YXJnZXQuZW52aXJvbm1lbnRJbnRlbnNpdHksXG5cdFx0ZW52aXJvbm1lbnRSb3RhdGlvbjogdGFyZ2V0LmVudmlyb25tZW50Um90YXRpb24/LmNsb25lPy4oKSA/PyBbMCwgMCwgMF0sXG5cdH07XG5cblx0aWYgKGJhY2tncm91bmQgIT09ICdvbmx5JykgdGFyZ2V0LmVudmlyb25tZW50ID0gdGV4dHVyZTtcblx0aWYgKGJhY2tncm91bmQpIHRhcmdldC5iYWNrZ3JvdW5kID0gdGV4dHVyZTtcblx0YXBwbHlQcm9wcyh0YXJnZXQsIHNjZW5lUHJvcHMpO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKGJhY2tncm91bmQgIT09ICdvbmx5JykgdGFyZ2V0LmVudmlyb25tZW50ID0gb2xkZW52O1xuXHRcdGlmIChiYWNrZ3JvdW5kKSB0YXJnZXQuYmFja2dyb3VuZCA9IG9sZGJnO1xuXHRcdGFwcGx5UHJvcHModGFyZ2V0LCBvbGRTY2VuZVByb3BzKTtcblx0fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ3RzSW5qZWN0RW52aXJvbm1lbnRPcHRpb25zIHtcblx0ZmlsZXM6IHN0cmluZyB8IHN0cmluZ1tdO1xuXHRwYXRoOiBzdHJpbmc7XG5cdHByZXNldD86IE5ndHNFbnZpcm9ubWVudFByZXNldHM7XG5cdGV4dGVuc2lvbnM/OiAobG9hZGVyOiBMb2FkZXIpID0+IHZvaWQ7XG5cdGVuY29kaW5nPzogVGV4dHVyZUVuY29kaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0RW52aXJvbm1lbnQoXG5cdG9wdGlvbnM6ICgpID0+IFBhcnRpYWw8Tmd0c0luamVjdEVudmlyb25tZW50T3B0aW9ucz4gPSAoKSA9PiAoe30pLFxuXHR7IGluamVjdG9yIH06IHsgaW5qZWN0b3I/OiBJbmplY3RvciB9ID0ge30sXG4pIHtcblx0cmV0dXJuIGFzc2VydEluamVjdG9yKGluamVjdEVudmlyb25tZW50LCBpbmplY3RvciwgKCkgPT4ge1xuXHRcdGNvbnN0IGFkanVzdGVkT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRcdGNvbnN0IHsgcHJlc2V0LCBleHRlbnNpb25zLCBlbmNvZGluZywgLi4ucmVzdCB9ID0gb3B0aW9ucygpO1xuXHRcdFx0bGV0IHsgZmlsZXMsIHBhdGggfSA9IHJlc3Q7XG5cblx0XHRcdGlmIChmaWxlcyA9PSBudWxsKSB7XG5cdFx0XHRcdGZpbGVzID0gWycvcHgucG5nJywgJy9ueC5wbmcnLCAnL3B5LnBuZycsICcvbnkucG5nJywgJy9wei5wbmcnLCAnL256LnBuZyddO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocGF0aCA9PSBudWxsKSB7XG5cdFx0XHRcdHBhdGggPSAnJztcblx0XHRcdH1cblxuXHRcdFx0aWYgKHByZXNldCkge1xuXHRcdFx0XHRpZiAoIShwcmVzZXQgaW4gRU5WSVJPTk1FTlRfUFJFU0VUUykpXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdQcmVzZXQgbXVzdCBiZSBvbmUgb2Y6ICcgKyBPYmplY3Qua2V5cyhFTlZJUk9OTUVOVF9QUkVTRVRTKS5qb2luKCcsICcpKTtcblx0XHRcdFx0ZmlsZXMgPSBFTlZJUk9OTUVOVF9QUkVTRVRTW3ByZXNldF07XG5cdFx0XHRcdHBhdGggPSBDVUJFTUFQX1JPT1Q7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB7IGZpbGVzLCBwcmVzZXQsIGVuY29kaW5nLCBwYXRoLCBleHRlbnNpb25zIH07XG5cdFx0fSk7XG5cblx0XHRjb25zdCBmaWxlcyA9IHBpY2soYWRqdXN0ZWRPcHRpb25zLCAnZmlsZXMnKTtcblxuXHRcdGNvbnN0IHJlc3VsdE9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0XHRjb25zdCB7IGZpbGVzIH0gPSBhZGp1c3RlZE9wdGlvbnMoKTtcblx0XHRcdGNvbnN0IG11bHRpRmlsZSA9IEFycmF5LmlzQXJyYXkoZmlsZXMpO1xuXG5cdFx0XHRjb25zdCBpc0N1YmVNYXAgPSBtdWx0aUZpbGUgJiYgZmlsZXMubGVuZ3RoID09PSA2O1xuXHRcdFx0Y29uc3QgaXNHYWlubWFpbiA9IG11bHRpRmlsZSAmJiBmaWxlcy5sZW5ndGggPT09IDMgJiYgZmlsZXMuc29tZSgoZmlsZSkgPT4gZmlsZS5lbmRzV2l0aCgnanNvbicpKTtcblx0XHRcdGNvbnN0IGZpcnN0RW50cnkgPSBtdWx0aUZpbGUgPyBmaWxlc1swXSA6IGZpbGVzO1xuXG5cdFx0XHRjb25zdCBleHRlbnNpb24gPSBpc0N1YmVNYXBcblx0XHRcdFx0PyAnY3ViZSdcblx0XHRcdFx0OiBpc0dhaW5tYWluXG5cdFx0XHRcdFx0PyAnd2VicCdcblx0XHRcdFx0XHQ6IGZpcnN0RW50cnkuc3RhcnRzV2l0aCgnZGF0YTphcHBsaWNhdGlvbi9leHInKVxuXHRcdFx0XHRcdFx0PyAnZXhyJ1xuXHRcdFx0XHRcdFx0OiBmaXJzdEVudHJ5LnN0YXJ0c1dpdGgoJ2RhdGE6YXBwbGljYXRpb24vaGRyJylcblx0XHRcdFx0XHRcdFx0PyAnaGRyJ1xuXHRcdFx0XHRcdFx0XHQ6IGZpcnN0RW50cnkuc3RhcnRzV2l0aCgnZGF0YTppbWFnZS9qcGVnJylcblx0XHRcdFx0XHRcdFx0XHQ/ICdqcGcnXG5cdFx0XHRcdFx0XHRcdFx0OiBmaXJzdEVudHJ5LnNwbGl0KCcuJykucG9wKCk/LnNwbGl0KCc/Jyk/LnNoaWZ0KCk/LnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdHJldHVybiB7IG11bHRpRmlsZSwgZXh0ZW5zaW9uLCBpc0N1YmVNYXAgfTtcblx0XHR9KTtcblxuXHRcdGNvbnN0IGxvYWRlciA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRcdGNvbnN0IHsgZXh0ZW5zaW9uIH0gPSByZXN1bHRPcHRpb25zKCk7XG5cdFx0XHRjb25zdCBsb2FkZXIgPVxuXHRcdFx0XHRleHRlbnNpb24gPT09ICdjdWJlJ1xuXHRcdFx0XHRcdD8gQ3ViZVRleHR1cmVMb2FkZXJcblx0XHRcdFx0XHQ6IGV4dGVuc2lvbiA9PT0gJ2hkcidcblx0XHRcdFx0XHRcdD8gUkdCRUxvYWRlclxuXHRcdFx0XHRcdFx0OiBleHRlbnNpb24gPT09ICdleHInXG5cdFx0XHRcdFx0XHRcdD8gRVhSTG9hZGVyXG5cdFx0XHRcdFx0XHRcdDogZXh0ZW5zaW9uID09PSAnanBnJyB8fCBleHRlbnNpb24gPT09ICdqcGVnJ1xuXHRcdFx0XHRcdFx0XHRcdD8gKEhEUkpQR0xvYWRlciBhcyB1bmtub3duIGFzIHR5cGVvZiBMb2FkZXIpXG5cdFx0XHRcdFx0XHRcdFx0OiBleHRlbnNpb24gPT09ICd3ZWJwJ1xuXHRcdFx0XHRcdFx0XHRcdFx0PyAoR2Fpbk1hcExvYWRlciBhcyB1bmtub3duIGFzIHR5cGVvZiBMb2FkZXIpXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IG51bGw7XG5cblx0XHRcdGlmICghbG9hZGVyKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignaW5qZWN0RW52aXJvbm1lbnQ6IFVucmVjb2duaXplZCBmaWxlIGV4dGVuc2lvbjogJyArIGV4dGVuc2lvbik7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBsb2FkZXIgYXMgdHlwZW9mIExvYWRlcjtcblx0XHR9KTtcblxuXHRcdGNvbnN0IHN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0XHRjb25zdCBnbCA9IHN0b3JlLnNlbGVjdCgnZ2wnKTtcblxuXHRcdGNvbnN0IHRleHR1cmUgPSBzaWduYWw8VGV4dHVyZSB8IEN1YmVUZXh0dXJlIHwgbnVsbD4obnVsbCk7XG5cblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0Y29uc3QgW3sgZXh0ZW5zaW9uLCBtdWx0aUZpbGUgfSwgX2ZpbGVzXSA9IFt1bnRyYWNrZWQocmVzdWx0T3B0aW9ucyksIGZpbGVzKCldO1xuXG5cdFx0XHRpZiAoZXh0ZW5zaW9uICE9PSAnd2VicCcgJiYgZXh0ZW5zaW9uICE9PSAnanBnJyAmJiBleHRlbnNpb24gIT09ICdqcGVnJykgcmV0dXJuO1xuXG5cdFx0XHRnbCgpLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcblx0XHRcdFx0J3dlYmdsY29udGV4dGxvc3QnLFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciAtIGZpbGVzIGlzIGNvcnJlY3RseSBwYXNzZWRcblx0XHRcdFx0XHRpbmplY3RMb2FkZXIuY2xlYXIobXVsdGlGaWxlID8gW19maWxlc10gOiBfZmlsZXMpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7IG9uY2U6IHRydWUgfSxcblx0XHRcdCk7XG5cdFx0fSk7XG5cblx0XHRjb25zdCByZXN1bHQgPSBpbmplY3RMb2FkZXIoXG5cdFx0XHRsb2FkZXIsXG5cdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gZW5zdXJlIHRoZSBmaWxlcyBpcyBhbiBhcnJheVxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRjb25zdCB7IGZpbGVzIH0gPSBhZGp1c3RlZE9wdGlvbnMoKTtcblx0XHRcdFx0cmV0dXJuIEFycmF5LmlzQXJyYXkoZmlsZXMpID8gW2ZpbGVzXSA6IGZpbGVzO1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZXh0ZW5zaW9uczogKGxvYWRlcikgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHsgZXh0ZW5zaW9ucywgcGF0aCB9ID0gYWRqdXN0ZWRPcHRpb25zKCk7XG5cdFx0XHRcdFx0Y29uc3QgeyBleHRlbnNpb24gfSA9IHJlc3VsdE9wdGlvbnMoKTtcblx0XHRcdFx0XHRpZiAoZXh0ZW5zaW9uID09PSAnd2VicCcgfHwgZXh0ZW5zaW9uID09PSAnanBnJyB8fCBleHRlbnNpb24gPT09ICdqcGVnJykge1xuXHRcdFx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciAtIEdhaW5tYXAgcmVxdWlyZXMgYSByZW5kZXJlclxuXHRcdFx0XHRcdFx0bG9hZGVyLnNldFJlbmRlcmVyKGdsKCkpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGxvYWRlci5zZXRQYXRoPy4ocGF0aCk7XG5cdFx0XHRcdFx0aWYgKGV4dGVuc2lvbnMpIGV4dGVuc2lvbnMobG9hZGVyKTtcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0KTtcblxuXHRcdGVmZmVjdCgoKSA9PiB7XG5cdFx0XHRjb25zdCBsb2FkZXJSZXN1bHQgPSByZXN1bHQoKTtcblx0XHRcdGlmICghbG9hZGVyUmVzdWx0KSByZXR1cm47XG5cblx0XHRcdHVudHJhY2tlZCgoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHsgbXVsdGlGaWxlLCBleHRlbnNpb24sIGlzQ3ViZU1hcCB9ID0gcmVzdWx0T3B0aW9ucygpO1xuXHRcdFx0XHRjb25zdCB7IGVuY29kaW5nIH0gPSBhZGp1c3RlZE9wdGlvbnMoKTtcblxuXHRcdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gZW5zdXJlIHRleHR1cmVSZXN1bHQgaXMgYSBUZXh0dXJlIG9yIEN1YmVUZXh0dXJlXG5cdFx0XHRcdGxldCB0ZXh0dXJlUmVzdWx0ID0gKG11bHRpRmlsZSA/IGxvYWRlclJlc3VsdFswXSA6IGxvYWRlclJlc3VsdCkgYXMgVGV4dHVyZSB8IEN1YmVUZXh0dXJlO1xuXG5cdFx0XHRcdC8vIE5PVEU6IHJhY2luZyBjb25kaXRpb24sIHdlIGNhbiBza2lwIHRoaXNcblx0XHRcdFx0Ly8gIHdlIGp1c3Qgc2FpZCBhYm92ZSB0aGF0IGlmIG11bHRpRmlsZSBpcyBmYWxzZSwgaXQgaXMgYSBzaW5nbGUgVGV4dHVyZVxuXHRcdFx0XHRpZiAoIW11bHRpRmlsZSAmJiBBcnJheS5pc0FycmF5KHRleHR1cmVSZXN1bHQpICYmIHRleHR1cmVSZXN1bHRbMF0gaW5zdGFuY2VvZiBDdWJlVGV4dHVyZSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQhKHRleHR1cmVSZXN1bHQgaW5zdGFuY2VvZiBDdWJlVGV4dHVyZSkgJiZcblx0XHRcdFx0XHQoZXh0ZW5zaW9uID09PSAnanBnJyB8fCBleHRlbnNpb24gPT09ICdqcGVnJyB8fCBleHRlbnNpb24gPT09ICd3ZWJwJylcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0dGV4dHVyZVJlc3VsdCA9ICh0ZXh0dXJlUmVzdWx0IGFzIGFueSkucmVuZGVyVGFyZ2V0Py50ZXh0dXJlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZVJlc3VsdC5tYXBwaW5nID0gaXNDdWJlTWFwID8gQ3ViZVJlZmxlY3Rpb25NYXBwaW5nIDogRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc7XG5cblx0XHRcdFx0aWYgKCdjb2xvclNwYWNlJyBpbiB0ZXh0dXJlUmVzdWx0KVxuXHRcdFx0XHRcdCh0ZXh0dXJlUmVzdWx0IGFzIGFueSkuY29sb3JTcGFjZSA9IGVuY29kaW5nID8/IChpc0N1YmVNYXAgPyAnc3JnYicgOiAnc3JnYi1saW5lYXInKTtcblx0XHRcdFx0ZWxzZSAodGV4dHVyZVJlc3VsdCBhcyBhbnkpLmVuY29kaW5nID0gZW5jb2RpbmcgPz8gKGlzQ3ViZU1hcCA/IHNSR0JFbmNvZGluZyA6IExpbmVhckVuY29kaW5nKTtcblxuXHRcdFx0XHR0ZXh0dXJlLnNldCh0ZXh0dXJlUmVzdWx0KTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHRleHR1cmUuYXNSZWFkb25seSgpO1xuXHR9KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ3RzRW52aXJvbm1lbnRPcHRpb25zIGV4dGVuZHMgUGFydGlhbDxOZ3RzSW5qZWN0RW52aXJvbm1lbnRPcHRpb25zPiB7XG5cdGZyYW1lcz86IG51bWJlcjtcblx0bmVhcj86IG51bWJlcjtcblx0ZmFyPzogbnVtYmVyO1xuXHRyZXNvbHV0aW9uPzogbnVtYmVyO1xuXHRiYWNrZ3JvdW5kPzogYm9vbGVhbiB8ICdvbmx5JztcblxuXHQvKiogZGVwcmVjYXRlZCwgdXNlIGJhY2tncm91bmRCbHVycmluZXNzICovXG5cdGJsdXI/OiBudW1iZXI7XG5cdGJhY2tncm91bmRCbHVycmluZXNzPzogbnVtYmVyO1xuXHRiYWNrZ3JvdW5kSW50ZW5zaXR5PzogbnVtYmVyO1xuXHRiYWNrZ3JvdW5kUm90YXRpb24/OiBFdWxlcjtcblx0ZW52aXJvbm1lbnRJbnRlbnNpdHk/OiBudW1iZXI7XG5cdGVudmlyb25tZW50Um90YXRpb24/OiBFdWxlcjtcblxuXHRtYXA/OiBUZXh0dXJlO1xuXHRwcmVzZXQ/OiBOZ3RzRW52aXJvbm1lbnRQcmVzZXRzO1xuXHRzY2VuZT86IFNjZW5lIHwgRWxlbWVudFJlZjxTY2VuZT47XG5cdGdyb3VuZD86IGJvb2xlYW4gfCB7IHJhZGl1cz86IG51bWJlcjsgaGVpZ2h0PzogbnVtYmVyOyBzY2FsZT86IG51bWJlciB9O1xufVxuXG5jb25zdCBkZWZhdWx0QmFja2dyb3VuZDogTmd0c0Vudmlyb25tZW50T3B0aW9ucyA9IHtcblx0YmFja2dyb3VuZDogZmFsc2UsXG59O1xuXG5ARGlyZWN0aXZlKHsgc3RhbmRhbG9uZTogdHJ1ZSwgc2VsZWN0b3I6ICduZ3RzLWVudmlyb25tZW50LW1hcCcgfSlcbmV4cG9ydCBjbGFzcyBOZ3RzRW52aXJvbm1lbnRNYXAge1xuXHRvcHRpb25zID0gaW5wdXQoZGVmYXVsdEJhY2tncm91bmQsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0QmFja2dyb3VuZCkgfSk7XG5cdGVudlNldCA9IG91dHB1dDx2b2lkPigpO1xuXG5cdHByaXZhdGUgYXV0b0VmZmVjdCA9IGluamVjdEF1dG9FZmZlY3QoKTtcblx0cHJpdmF0ZSBzdG9yZSA9IGluamVjdFN0b3JlKCk7XG5cdHByaXZhdGUgZGVmYXVsdFNjZW5lID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3NjZW5lJyk7XG5cblx0cHJpdmF0ZSBlbnZDb25maWcgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3Qge1xuXHRcdFx0YmFja2dyb3VuZCA9IGZhbHNlLFxuXHRcdFx0c2NlbmUsXG5cdFx0XHRibHVyLFxuXHRcdFx0YmFja2dyb3VuZEJsdXJyaW5lc3MsXG5cdFx0XHRiYWNrZ3JvdW5kSW50ZW5zaXR5LFxuXHRcdFx0YmFja2dyb3VuZFJvdGF0aW9uLFxuXHRcdFx0ZW52aXJvbm1lbnRJbnRlbnNpdHksXG5cdFx0XHRlbnZpcm9ubWVudFJvdGF0aW9uLFxuXHRcdH0gPSB0aGlzLm9wdGlvbnMoKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRiYWNrZ3JvdW5kLFxuXHRcdFx0c2NlbmUsXG5cdFx0XHRibHVyLFxuXHRcdFx0YmFja2dyb3VuZEJsdXJyaW5lc3MsXG5cdFx0XHRiYWNrZ3JvdW5kSW50ZW5zaXR5LFxuXHRcdFx0YmFja2dyb3VuZFJvdGF0aW9uLFxuXHRcdFx0ZW52aXJvbm1lbnRJbnRlbnNpdHksXG5cdFx0XHRlbnZpcm9ubWVudFJvdGF0aW9uLFxuXHRcdH07XG5cdH0pO1xuXG5cdHByaXZhdGUgbWFwID0gcGljayh0aGlzLm9wdGlvbnMsICdtYXAnKTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuXHRcdFx0dGhpcy5hdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdFx0Y29uc3QgbWFwID0gdGhpcy5tYXAoKTtcblx0XHRcdFx0aWYgKCFtYXApIHJldHVybjtcblx0XHRcdFx0Y29uc3QgeyBiYWNrZ3JvdW5kID0gZmFsc2UsIHNjZW5lLCAuLi5jb25maWcgfSA9IHRoaXMuZW52Q29uZmlnKCk7XG5cdFx0XHRcdGNvbnN0IGNsZWFudXAgPSBzZXRFbnZQcm9wcyhiYWNrZ3JvdW5kLCBzY2VuZSwgdGhpcy5kZWZhdWx0U2NlbmUoKSwgbWFwLCBjb25maWcpO1xuXHRcdFx0XHR0aGlzLmVudlNldC5lbWl0KCk7XG5cdFx0XHRcdHJldHVybiAoKSA9PiBjbGVhbnVwKCk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxufVxuXG5ARGlyZWN0aXZlKHsgc3RhbmRhbG9uZTogdHJ1ZSwgc2VsZWN0b3I6ICduZ3RzLWVudmlyb25tZW50LWN1YmUnIH0pXG5leHBvcnQgY2xhc3MgTmd0c0Vudmlyb25tZW50Q3ViZSB7XG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0QmFja2dyb3VuZCwgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRCYWNrZ3JvdW5kKSB9KTtcblx0ZW52U2V0ID0gb3V0cHV0PHZvaWQ+KCk7XG5cblx0cHJpdmF0ZSBhdXRvRWZmZWN0ID0gaW5qZWN0QXV0b0VmZmVjdCgpO1xuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0cHJpdmF0ZSBkZWZhdWx0U2NlbmUgPSB0aGlzLnN0b3JlLnNlbGVjdCgnc2NlbmUnKTtcblx0cHJpdmF0ZSBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cblx0cHJpdmF0ZSBlbnZDb25maWcgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3Qge1xuXHRcdFx0YmFja2dyb3VuZCA9IGZhbHNlLFxuXHRcdFx0c2NlbmUsXG5cdFx0XHRibHVyLFxuXHRcdFx0YmFja2dyb3VuZEJsdXJyaW5lc3MsXG5cdFx0XHRiYWNrZ3JvdW5kSW50ZW5zaXR5LFxuXHRcdFx0YmFja2dyb3VuZFJvdGF0aW9uLFxuXHRcdFx0ZW52aXJvbm1lbnRJbnRlbnNpdHksXG5cdFx0XHRlbnZpcm9ubWVudFJvdGF0aW9uLFxuXHRcdH0gPSB0aGlzLm9wdGlvbnMoKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRiYWNrZ3JvdW5kLFxuXHRcdFx0c2NlbmUsXG5cdFx0XHRibHVyLFxuXHRcdFx0YmFja2dyb3VuZEJsdXJyaW5lc3MsXG5cdFx0XHRiYWNrZ3JvdW5kSW50ZW5zaXR5LFxuXHRcdFx0YmFja2dyb3VuZFJvdGF0aW9uLFxuXHRcdFx0ZW52aXJvbm1lbnRJbnRlbnNpdHksXG5cdFx0XHRlbnZpcm9ubWVudFJvdGF0aW9uLFxuXHRcdH07XG5cdH0pO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHRjb25zdCBfdGV4dHVyZSA9IGluamVjdEVudmlyb25tZW50KHRoaXMub3B0aW9ucywgeyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9KTtcblxuXHRcdFx0dGhpcy5hdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdFx0Y29uc3QgdGV4dHVyZSA9IF90ZXh0dXJlKCk7XG5cdFx0XHRcdGlmICghdGV4dHVyZSkgcmV0dXJuO1xuXHRcdFx0XHRjb25zdCB7IGJhY2tncm91bmQgPSBmYWxzZSwgc2NlbmUsIC4uLmNvbmZpZyB9ID0gdGhpcy5lbnZDb25maWcoKTtcblx0XHRcdFx0Y29uc3QgY2xlYW51cCA9IHNldEVudlByb3BzKGJhY2tncm91bmQsIHNjZW5lLCB0aGlzLmRlZmF1bHRTY2VuZSgpLCB0ZXh0dXJlLCBjb25maWcpO1xuXHRcdFx0XHR0aGlzLmVudlNldC5lbWl0KCk7XG5cdFx0XHRcdHJldHVybiAoKSA9PiBjbGVhbnVwKCk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxufVxuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RzLWVudmlyb25tZW50LXBvcnRhbCcsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1wb3J0YWwgW2NvbnRhaW5lcl09XCJ2aXJ0dWFsU2NlbmVcIj5cblx0XHRcdDxuZy10ZW1wbGF0ZSBwb3J0YWxDb250ZW50IGxldC1pbmplY3Rvcj1cImluamVjdG9yXCIgbGV0LWNvbnRhaW5lcj1cImNvbnRhaW5lclwiPlxuXHRcdFx0XHQ8bmctY29udGFpbmVyXG5cdFx0XHRcdFx0W25nVGVtcGxhdGVPdXRsZXRdPVwiY29udGVudCgpXCJcblx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldEluamVjdG9yXT1cImluamVjdG9yXCJcblx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBpbmplY3RvciwgY29udGFpbmVyIH1cIlxuXHRcdFx0XHQvPlxuXG5cdFx0XHRcdDxuZ3QtY3ViZS1jYW1lcmEgI2N1YmVDYW1lcmEgKmFyZ3M9XCJjYW1lcmFBcmdzKClcIiAvPlxuXG5cdFx0XHRcdEBpZiAoZmlsZXMoKSB8fCBwcmVzZXQoKSkge1xuXHRcdFx0XHRcdDxuZ3RzLWVudmlyb25tZW50LWN1YmUgW29wdGlvbnNdPVwiZW52Q3ViZU9wdGlvbnMoKVwiIChlbnZTZXQpPVwib25FbnZTZXQoKVwiIC8+XG5cdFx0XHRcdH0gQGVsc2UgaWYgKG1hcCgpKSB7XG5cdFx0XHRcdFx0PG5ndHMtZW52aXJvbm1lbnQtbWFwIFtvcHRpb25zXT1cImVudk1hcE9wdGlvbnMoKVwiIChlbnZTZXQpPVwib25FbnZTZXQoKVwiIC8+XG5cdFx0XHRcdH1cblx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0PC9uZ3QtcG9ydGFsPlxuXHRgLFxuXHRpbXBvcnRzOiBbTmd0c0Vudmlyb25tZW50Q3ViZSwgTmd0c0Vudmlyb25tZW50TWFwLCBOZ3RBcmdzLCBOZ3RQb3J0YWwsIE5ndFBvcnRhbENvbnRlbnQsIE5nVGVtcGxhdGVPdXRsZXRdLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzRW52aXJvbm1lbnRQb3J0YWwge1xuXHRwcml2YXRlIGRlZmF1bHRPcHRpb25zOiBOZ3RzRW52aXJvbm1lbnRPcHRpb25zID0ge1xuXHRcdG5lYXI6IDEsXG5cdFx0ZmFyOiAxMDAwLFxuXHRcdHJlc29sdXRpb246IDI1Nixcblx0XHRmcmFtZXM6IDEsXG5cdFx0YmFja2dyb3VuZDogZmFsc2UsXG5cdH07XG5cdG9wdGlvbnMgPSBpbnB1dCh0aGlzLmRlZmF1bHRPcHRpb25zLCB7IHRyYW5zZm9ybTogbWVyZ2VJbnB1dHModGhpcy5kZWZhdWx0T3B0aW9ucykgfSk7XG5cdGNvbnRlbnQgPSBpbnB1dC5yZXF1aXJlZDxUZW1wbGF0ZVJlZjx1bmtub3duPj4oKTtcblx0ZW52U2V0ID0gb3V0cHV0PHZvaWQ+KCk7XG5cblx0cHJpdmF0ZSBhdXRvRWZmZWN0ID0gaW5qZWN0QXV0b0VmZmVjdCgpO1xuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0cHJpdmF0ZSBkZWZhdWx0U2NlbmUgPSB0aGlzLnN0b3JlLnNlbGVjdCgnc2NlbmUnKTtcblx0cHJpdmF0ZSBnbCA9IHRoaXMuc3RvcmUuc2VsZWN0KCdnbCcpO1xuXG5cdGNhbWVyYVJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEN1YmVDYW1lcmE+PignY3ViZUNhbWVyYScpO1xuXG5cdG1hcCA9IHBpY2sodGhpcy5vcHRpb25zLCAnbWFwJyk7XG5cdGZpbGVzID0gcGljayh0aGlzLm9wdGlvbnMsICdmaWxlcycpO1xuXHRwcmVzZXQgPSBwaWNrKHRoaXMub3B0aW9ucywgJ3ByZXNldCcpO1xuXHRwcml2YXRlIGV4dGVuc2lvbnMgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2V4dGVuc2lvbnMnKTtcblx0cHJpdmF0ZSBwYXRoID0gcGljayh0aGlzLm9wdGlvbnMsICdwYXRoJyk7XG5cblx0ZW52TWFwT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+ICh7IGJhY2tncm91bmQ6IHRydWUsIG1hcDogdGhpcy5tYXAoKSwgZXh0ZW5zaW9uczogdGhpcy5leHRlbnNpb25zKCkgfSkpO1xuXHRlbnZDdWJlT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+ICh7XG5cdFx0YmFja2dyb3VuZDogdHJ1ZSxcblx0XHRmaWxlczogdGhpcy5maWxlcygpLFxuXHRcdHByZXNldDogdGhpcy5wcmVzZXQoKSxcblx0XHRleHRlbnNpb25zOiB0aGlzLmV4dGVuc2lvbnMoKSxcblx0XHRwYXRoOiB0aGlzLnBhdGgoKSxcblx0fSkpO1xuXG5cdHByaXZhdGUgbmVhciA9IHBpY2sodGhpcy5vcHRpb25zLCAnbmVhcicpO1xuXHRwcml2YXRlIGZhciA9IHBpY2sodGhpcy5vcHRpb25zLCAnZmFyJyk7XG5cdHByaXZhdGUgcmVzb2x1dGlvbiA9IHBpY2sodGhpcy5vcHRpb25zLCAncmVzb2x1dGlvbicpO1xuXHRwcml2YXRlIGZibyA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBmYm8gPSBuZXcgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KHRoaXMucmVzb2x1dGlvbigpKTtcblx0XHRmYm8udGV4dHVyZS50eXBlID0gSGFsZkZsb2F0VHlwZTtcblx0XHRyZXR1cm4gZmJvO1xuXHR9KTtcblxuXHRjYW1lcmFBcmdzID0gY29tcHV0ZWQoKCkgPT4gW3RoaXMubmVhcigpLCB0aGlzLmZhcigpLCB0aGlzLmZibygpXSk7XG5cblx0dmlydHVhbFNjZW5lID0gcHJlcGFyZShuZXcgU2NlbmUoKSk7XG5cblx0cHJpdmF0ZSBzZXRFbnZFZmZlY3RSZWY/OiBFZmZlY3RSZWY7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZXh0ZW5kKHsgQ3ViZUNhbWVyYSB9KTtcblxuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHR0aGlzLmF1dG9FZmZlY3QoKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBbZmlsZXMsIHByZXNldCwgbWFwXSA9IFt0aGlzLmZpbGVzKCksIHRoaXMucHJlc2V0KCksIHRoaXMubWFwKCldO1xuXHRcdFx0XHQvLyBOT1RFOiB3aGVuIHRoZXJlJ3Mgbm9uZSBvZiB0aGlzLCB3ZSBkb24ndCByZW5kZXIgY3ViZSBvciBtYXAgc28gd2UgbmVlZCB0byBzZXRFbnYgaGVyZVxuXHRcdFx0XHRpZiAoISFmaWxlcyB8fCAhIXByZXNldCB8fCAhIW1hcCkgcmV0dXJuO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRQb3J0YWxFbnYoKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0bGV0IGNvdW50ID0gMTtcblx0XHRpbmplY3RCZWZvcmVSZW5kZXIoKCkgPT4ge1xuXHRcdFx0Y29uc3QgZnJhbWVzID0gdGhpcy5vcHRpb25zKCkuZnJhbWVzO1xuXHRcdFx0aWYgKGZyYW1lcyA9PT0gSW5maW5pdHkgfHwgKGZyYW1lcyAhPSBudWxsICYmIGNvdW50IDwgZnJhbWVzKSkge1xuXHRcdFx0XHRjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYVJlZigpPy5uYXRpdmVFbGVtZW50O1xuXHRcdFx0XHRpZiAoY2FtZXJhKSB7XG5cdFx0XHRcdFx0Y2FtZXJhLnVwZGF0ZSh0aGlzLmdsKCksIHRoaXMudmlydHVhbFNjZW5lKTtcblx0XHRcdFx0XHRjb3VudCsrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvLyBOT1RFOiB3ZSB1c2Ugb25FbnZTZXQgaGVyZSB0byBlbnN1cmUgdGhhdCBFbnZpcm9ubWVudEN1YmUgb3IgRW52aXJvbm1lbnRNYXAgc2V0cyB0aGUgZW52IGJlZm9yZSB0aGUgcG9ydGFsXG5cdG9uRW52U2V0KCkge1xuXHRcdGlmICh0aGlzLnNldEVudkVmZmVjdFJlZikgdGhpcy5zZXRFbnZFZmZlY3RSZWYuZGVzdHJveSgpO1xuXHRcdHRoaXMuc2V0RW52RWZmZWN0UmVmID0gdGhpcy5hdXRvRWZmZWN0KFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRQb3J0YWxFbnYoKTtcblx0XHRcdH0sXG5cdFx0XHR7IG1hbnVhbENsZWFudXA6IHRydWUgfSxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBzZXRQb3J0YWxFbnYoKSB7XG5cdFx0Y29uc3QgY2FtZXJhID0gdGhpcy5jYW1lcmFSZWYoKTtcblx0XHRpZiAoIWNhbWVyYT8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgW1xuXHRcdFx0e1xuXHRcdFx0XHRmcmFtZXMsXG5cdFx0XHRcdGJhY2tncm91bmQgPSBmYWxzZSxcblx0XHRcdFx0c2NlbmUsXG5cdFx0XHRcdGJsdXIsXG5cdFx0XHRcdGJhY2tncm91bmRCbHVycmluZXNzLFxuXHRcdFx0XHRiYWNrZ3JvdW5kSW50ZW5zaXR5LFxuXHRcdFx0XHRiYWNrZ3JvdW5kUm90YXRpb24sXG5cdFx0XHRcdGVudmlyb25tZW50SW50ZW5zaXR5LFxuXHRcdFx0XHRlbnZpcm9ubWVudFJvdGF0aW9uLFxuXHRcdFx0fSxcblx0XHRcdGdsLFxuXHRcdFx0ZmJvLFxuXHRcdFx0ZGVmYXVsdFNjZW5lLFxuXHRcdF0gPSBbdGhpcy5vcHRpb25zKCksIHRoaXMuZ2woKSwgdGhpcy5mYm8oKSwgdGhpcy5kZWZhdWx0U2NlbmUoKV07XG5cblx0XHRpZiAoZnJhbWVzID09PSAxKSBjYW1lcmEubmF0aXZlRWxlbWVudC51cGRhdGUoZ2wsIHRoaXMudmlydHVhbFNjZW5lKTtcblx0XHRjb25zdCBjbGVhbnVwID0gc2V0RW52UHJvcHMoYmFja2dyb3VuZCwgc2NlbmUsIGRlZmF1bHRTY2VuZSwgZmJvLnRleHR1cmUsIHtcblx0XHRcdGJsdXIsXG5cdFx0XHRiYWNrZ3JvdW5kQmx1cnJpbmVzcyxcblx0XHRcdGJhY2tncm91bmRJbnRlbnNpdHksXG5cdFx0XHRiYWNrZ3JvdW5kUm90YXRpb24sXG5cdFx0XHRlbnZpcm9ubWVudEludGVuc2l0eSxcblx0XHRcdGVudmlyb25tZW50Um90YXRpb24sXG5cdFx0fSk7XG5cdFx0dGhpcy5lbnZTZXQuZW1pdCgpO1xuXHRcdHJldHVybiBjbGVhbnVwO1xuXHR9XG59XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtZW52aXJvbm1lbnQtZ3JvdW5kJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0cy1lbnZpcm9ubWVudC1tYXAgW29wdGlvbnNdPVwiZW52TWFwT3B0aW9ucygpXCIgKGVudlNldCk9XCJlbnZTZXQuZW1pdCgpXCIgLz5cblx0XHQ8bmd0LWdyb3VuZC1wcm9qZWN0ZWQtZW52ICphcmdzPVwiYXJncygpXCIgW3NjYWxlXT1cInNjYWxlKClcIiBbaGVpZ2h0XT1cImhlaWdodCgpXCIgW3JhZGl1c109XCJyYWRpdXMoKVwiIC8+XG5cdGAsXG5cdGltcG9ydHM6IFtOZ3RzRW52aXJvbm1lbnRNYXAsIE5ndEFyZ3NdLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzRW52aXJvbm1lbnRHcm91bmQge1xuXHRvcHRpb25zID0gaW5wdXQoe30gYXMgTmd0c0Vudmlyb25tZW50T3B0aW9ucyk7XG5cdGVudlNldCA9IG91dHB1dDx2b2lkPigpO1xuXG5cdGFyZ3MgPSBzaWduYWw8W1RleHR1cmUgfCBudWxsXT4oW251bGxdKTtcblxuXHRoZWlnaHQgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5vcHRpb25zKCkuZ3JvdW5kIGFzIGFueSk/LmhlaWdodCk7XG5cdHJhZGl1cyA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLm9wdGlvbnMoKS5ncm91bmQgYXMgYW55KT8ucmFkaXVzKTtcblx0c2NhbGUgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5vcHRpb25zKCkuZ3JvdW5kIGFzIGFueSk/LnNjYWxlID8/IDEwMDApO1xuXG5cdGVudk1hcE9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgeyBtYXA6IF8sIC4uLm9wdGlvbnMgfSA9IHRoaXMub3B0aW9ucygpO1xuXHRcdGNvbnN0IFttYXBdID0gdGhpcy5hcmdzKCk7XG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24ob3B0aW9ucywgeyBtYXAgfSkgYXMgTmd0c0Vudmlyb25tZW50T3B0aW9ucztcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZXh0ZW5kKHsgR3JvdW5kUHJvamVjdGVkRW52IH0pO1xuXG5cdFx0Y29uc3QgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXHRcdGNvbnN0IGF1dG9FZmZlY3QgPSBpbmplY3RBdXRvRWZmZWN0KCk7XG5cblx0XHRhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuXHRcdFx0Y29uc3QgZGVmYXVsdFRleHR1cmUgPSBpbmplY3RFbnZpcm9ubWVudCh0aGlzLm9wdGlvbnMsIHsgaW5qZWN0b3IgfSk7XG5cdFx0XHRjb25zdCB0ZXh0dXJlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcHRpb25zKCkubWFwIHx8IGRlZmF1bHRUZXh0dXJlKCkpO1xuXG5cdFx0XHRhdXRvRWZmZWN0KFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5hcmdzLnNldChbdGV4dHVyZSgpXSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSxcblx0XHRcdCk7XG5cdFx0fSk7XG5cdH1cbn1cblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cy1lbnZpcm9ubWVudCcsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0QGlmIChvcHRpb25zKCkuZ3JvdW5kKSB7XG5cdFx0XHQ8bmd0cy1lbnZpcm9ubWVudC1ncm91bmQgW29wdGlvbnNdPVwib3B0aW9ucygpXCIgKGVudlNldCk9XCJlbnZTZXQuZW1pdCgpXCIgLz5cblx0XHR9IEBlbHNlIGlmIChvcHRpb25zKCkubWFwKSB7XG5cdFx0XHQ8bmd0cy1lbnZpcm9ubWVudC1tYXAgW29wdGlvbnNdPVwib3B0aW9ucygpXCIgKGVudlNldCk9XCJlbnZTZXQuZW1pdCgpXCIgLz5cblx0XHR9IEBlbHNlIGlmIChjb250ZW50KCkpIHtcblx0XHRcdDxuZ3RzLWVudmlyb25tZW50LXBvcnRhbCBbb3B0aW9uc109XCJvcHRpb25zKClcIiBbY29udGVudF09XCIkYW55KGNvbnRlbnQoKSlcIiAoZW52U2V0KT1cImVudlNldC5lbWl0KClcIiAvPlxuXHRcdH0gQGVsc2Uge1xuXHRcdFx0PG5ndHMtZW52aXJvbm1lbnQtY3ViZSBbb3B0aW9uc109XCJvcHRpb25zKClcIiAoZW52U2V0KT1cImVudlNldC5lbWl0KClcIiAvPlxuXHRcdH1cblx0YCxcblx0aW1wb3J0czogW05ndHNFbnZpcm9ubWVudEN1YmUsIE5ndHNFbnZpcm9ubWVudE1hcCwgTmd0c0Vudmlyb25tZW50UG9ydGFsLCBOZ3RzRW52aXJvbm1lbnRHcm91bmRdLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzRW52aXJvbm1lbnQge1xuXHRvcHRpb25zID0gaW5wdXQoe30gYXMgTmd0c0Vudmlyb25tZW50T3B0aW9ucyk7XG5cdGNvbnRlbnQgPSBjb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYpO1xuXHRlbnZTZXQgPSBvdXRwdXQ8dm9pZD4oKTtcbn1cbiJdfQ==
|